commit faf1d0cf2c248f38c6ba14cc12a644bdd0df5a66 Author: jfmartel Date: Sat Feb 15 11:05:28 2025 -0500 Premier commit diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/12dca7b21b643f1dfbdef6c54303a09619673750 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/12dca7b21b643f1dfbdef6c54303a09619673750 new file mode 100644 index 0000000..d33301a --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/12dca7b21b643f1dfbdef6c54303a09619673750 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\spi_flash\source\spi_flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/155eb6acafee7b16d4a84f7fa101fd44ca9797a8 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/155eb6acafee7b16d4a84f7fa101fd44ca9797a8 new file mode 100644 index 0000000..3d9f7e7 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/155eb6acafee7b16d4a84f7fa101fd44ca9797a8 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\ChaletduinoV2Board.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1602d4e921e51e062b51f2ee2b7753f49115b306 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1602d4e921e51e062b51f2ee2b7753f49115b306 new file mode 100644 index 0000000..9301ec9 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1602d4e921e51e062b51f2ee2b7753f49115b306 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\socket.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/16efc202dae433d3856688ab0b42b9b42ce27a7 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/16efc202dae433d3856688ab0b42b9b42ce27a7 new file mode 100644 index 0000000..e724afa --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/16efc202dae433d3856688ab0b42b9b42ce27a7 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_wifi.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1ccbdca9f4ec115548bfcddfd19c12338f629e5e b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1ccbdca9f4ec115548bfcddfd19c12338f629e5e new file mode 100644 index 0000000..35d4161 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/1ccbdca9f4ec115548bfcddfd19c12338f629e5e @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\BootloaderProtocol.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/22694ae7e3a2c8a3850dc4db8bcb96698d7177b b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/22694ae7e3a2c8a3850dc4db8bcb96698d7177b new file mode 100644 index 0000000..ea6d307 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/22694ae7e3a2c8a3850dc4db8bcb96698d7177b @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\BootloaderInterface.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/265d6e0b48fd001909238010b00ed95bfe8e905f b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/265d6e0b48fd001909238010b00ed95bfe8e905f new file mode 100644 index 0000000..36ba4f1 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/265d6e0b48fd001909238010b00ed95bfe8e905f @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmspi.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b75790a87ea16476a3c6bb90638a6b669a8ca45 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b75790a87ea16476a3c6bb90638a6b669a8ca45 new file mode 100644 index 0000000..0866f1f --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b75790a87ea16476a3c6bb90638a6b669a8ca45 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\DigitalIO.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9bc2d49b42ce7279eb340a8a3b474bcea430f0 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9bc2d49b42ce7279eb340a8a3b474bcea430f0 new file mode 100644 index 0000000..d10e6d9 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9bc2d49b42ce7279eb340a8a3b474bcea430f0 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\BootloaderInterface.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9e3461898372f45c52171b9d0cc541608aa693 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9e3461898372f45c52171b9d0cc541608aa693 new file mode 100644 index 0000000..21df18d --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2b9e3461898372f45c52171b9d0cc541608aa693 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2e363ec71dd36f823eca952d1317df8f04f213e6 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2e363ec71dd36f823eca952d1317df8f04f213e6 new file mode 100644 index 0000000..7b233d2 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/2e363ec71dd36f823eca952d1317df8f04f213e6 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_ssl.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3915cb001f0eb54d43f7d5b3369565f31fe392c3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3915cb001f0eb54d43f7d5b3369565f31fe392c3 new file mode 100644 index 0000000..7cfbd49 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3915cb001f0eb54d43f7d5b3369565f31fe392c3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmasic.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3cb45db0d440dd071e30800a01a075a6e0f1d8d1 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3cb45db0d440dd071e30800a01a075a6e0f1d8d1 new file mode 100644 index 0000000..5e827c9 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/3cb45db0d440dd071e30800a01a075a6e0f1d8d1 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\exceptions.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/40552fb7a32385b66fd527135f71b22173a9c507 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/40552fb7a32385b66fd527135f71b22173a9c507 new file mode 100644 index 0000000..a86d8da --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/40552fb7a32385b66fd527135f71b22173a9c507 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\system.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/43f35d29d9017868f211756417a5b631e37df3c9 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/43f35d29d9017868f211756417a5b631e37df3c9 new file mode 100644 index 0000000..949bc45 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/43f35d29d9017868f211756417a5b631e37df3c9 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_wifi.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/45645d405d43d7701268167ed952ffd038a0e8e2 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/45645d405d43d7701268167ed952ffd038a0e8e2 new file mode 100644 index 0000000..5dfd7a0 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/45645d405d43d7701268167ed952ffd038a0e8e2 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\interrupts.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48a610fb11bd8350ba66be20f98c8b534a9cd061 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48a610fb11bd8350ba66be20f98c8b534a9cd061 new file mode 100644 index 0000000..943d37a --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48a610fb11bd8350ba66be20f98c8b534a9cd061 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\exceptions.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48ef6f4fd644ef835942be1592d1bcd7d8f2fcf9 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48ef6f4fd644ef835942be1592d1bcd7d8f2fcf9 new file mode 100644 index 0000000..4b2c383 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/48ef6f4fd644ef835942be1592d1bcd7d8f2fcf9 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Syslog.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4db21999b3de567ac118f1373648603a9fc03ae8 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4db21999b3de567ac118f1373648603a9fc03ae8 new file mode 100644 index 0000000..8c3e55b --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4db21999b3de567ac118f1373648603a9fc03ae8 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\interrupts.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4f4031b973563807c0ba0cc9e18c395671b92003 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4f4031b973563807c0ba0cc9e18c395671b92003 new file mode 100644 index 0000000..f51acc3 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/4f4031b973563807c0ba0cc9e18c395671b92003 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\socket.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/58efaad0a9a8d1c4cb7f36e9559122026a24d5db b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/58efaad0a9a8d1c4cb7f36e9559122026a24d5db new file mode 100644 index 0000000..1ba438e --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/58efaad0a9a8d1c4cb7f36e9559122026a24d5db @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c2bc86b9dc75abf2e85e46dec8636c6460cf085 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c2bc86b9dc75abf2e85e46dec8636c6460cf085 new file mode 100644 index 0000000..f99ee8c --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c2bc86b9dc75abf2e85e46dec8636c6460cf085 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\SPI_Flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c9e25251ad015689682a37a36b0509de776461c b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c9e25251ad015689682a37a36b0509de776461c new file mode 100644 index 0000000..0ebc378 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5c9e25251ad015689682a37a36b0509de776461c @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\template.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cb0996a1cecdbf405ccea2a075b7989280e6a93 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cb0996a1cecdbf405ccea2a075b7989280e6a93 new file mode 100644 index 0000000..8ce5b64 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cb0996a1cecdbf405ccea2a075b7989280e6a93 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\SPI.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cf706b396545e3c793f30152a8634b78131ceb3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cf706b396545e3c793f30152a8634b78131ceb3 new file mode 100644 index 0000000..03f303a --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/5cf706b396545e3c793f30152a8634b78131ceb3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\BootloaderProtocol.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/62181e4909a098d0db91ed7eca6d5944e50ab7b5 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/62181e4909a098d0db91ed7eca6d5944e50ab7b5 new file mode 100644 index 0000000..881afee --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/62181e4909a098d0db91ed7eca6d5944e50ab7b5 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\VolumeTransducer.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6382d60d7109d6bebde4262114baa99951d5a66 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6382d60d7109d6bebde4262114baa99951d5a66 new file mode 100644 index 0000000..a81af86 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6382d60d7109d6bebde4262114baa99951d5a66 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmspi.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/64df684859a369e5eccabee1d5bab099d5fbf8e2 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/64df684859a369e5eccabee1d5bab099d5fbf8e2 new file mode 100644 index 0000000..5902848 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/64df684859a369e5eccabee1d5bab099d5fbf8e2 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\inet_addr.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/674eba27877297e3ffea5ca4f365497f809617dd b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/674eba27877297e3ffea5ca4f365497f809617dd new file mode 100644 index 0000000..6328e88 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/674eba27877297e3ffea5ca4f365497f809617dd @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\inet_ntop.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/69c9bfebb7824873fd4b6c8dedb310bb59c7091c b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/69c9bfebb7824873fd4b6c8dedb310bb59c7091c new file mode 100644 index 0000000..e4dd56b --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/69c9bfebb7824873fd4b6c8dedb310bb59c7091c @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_ota.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6fd7f06d3a414f57693c34fde4fa83ddfa942ef1 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6fd7f06d3a414f57693c34fde4fa83ddfa942ef1 new file mode 100644 index 0000000..e6b790f --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/6fd7f06d3a414f57693c34fde4fa83ddfa942ef1 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmdrv.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7206c2cf8a703af5bb50395f85460f0dfe1adbb3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7206c2cf8a703af5bb50395f85460f0dfe1adbb3 new file mode 100644 index 0000000..c98d5a3 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7206c2cf8a703af5bb50395f85460f0dfe1adbb3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Watchdog.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/742bca3c0d5d96e464958d16049e9c860f8d4db6 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/742bca3c0d5d96e464958d16049e9c860f8d4db6 new file mode 100644 index 0000000..f2eb095 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/742bca3c0d5d96e464958d16049e9c860f8d4db6 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Util.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75d67935f12e10a82d5a9a3f931b66a6f24208d3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75d67935f12e10a82d5a9a3f931b66a6f24208d3 new file mode 100644 index 0000000..d590543 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75d67935f12e10a82d5a9a3f931b66a6f24208d3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\timer.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75f49f62adf1bc879f508d1e6760ef1d38f42ea9 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75f49f62adf1bc879f508d1e6760ef1d38f42ea9 new file mode 100644 index 0000000..712453a --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/75f49f62adf1bc879f508d1e6760ef1d38f42ea9 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\common\source\nm_common.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/76612b6229b7b2d11559f99850017c359d93b40b b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/76612b6229b7b2d11559f99850017c359d93b40b new file mode 100644 index 0000000..97be8d4 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/76612b6229b7b2d11559f99850017c359d93b40b @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\template.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/79b8e1a7f418feb5e9751c7c5950abe6291ed80e b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/79b8e1a7f418feb5e9751c7c5950abe6291ed80e new file mode 100644 index 0000000..2744315 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/79b8e1a7f418feb5e9751c7c5950abe6291ed80e @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_periph.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7fb74e74f031e8c57148387f8da89ab63c421fff b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7fb74e74f031e8c57148387f8da89ab63c421fff new file mode 100644 index 0000000..988c162 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/7fb74e74f031e8c57148387f8da89ab63c421fff @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmasic.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8607df3a7ee3db91e625f18639b9c67243b0ca97 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8607df3a7ee3db91e625f18639b9c67243b0ca97 new file mode 100644 index 0000000..db08ca9 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8607df3a7ee3db91e625f18639b9c67243b0ca97 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\WiFiCtrl.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/869c1970a51216000efcbbbf20d73509d90dd6c4 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/869c1970a51216000efcbbbf20d73509d90dd6c4 new file mode 100644 index 0000000..6a95b30 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/869c1970a51216000efcbbbf20d73509d90dd6c4 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmdrv.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/86d1fd3989ddb34dc7033cae17fb576f46abcf1c b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/86d1fd3989ddb34dc7033cae17fb576f46abcf1c new file mode 100644 index 0000000..9be2f5a --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/86d1fd3989ddb34dc7033cae17fb576f46abcf1c @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Terminal.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8e29483e572e869218b97e67cb5a9f2ebb167b12 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8e29483e572e869218b97e67cb5a9f2ebb167b12 new file mode 100644 index 0000000..fb92886 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/8e29483e572e869218b97e67cb5a9f2ebb167b12 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Syslog.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/90a743e31936b21f07bebb71ca9ab613d312000a b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/90a743e31936b21f07bebb71ca9ab613d312000a new file mode 100644 index 0000000..d74a635 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/90a743e31936b21f07bebb71ca9ab613d312000a @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\crc32.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/94ad646e053ba7000799ad26eceb009933d79e25 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/94ad646e053ba7000799ad26eceb009933d79e25 new file mode 100644 index 0000000..d287c50 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/94ad646e053ba7000799ad26eceb009933d79e25 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmbus.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/97f6f7adb5d6edf4a6f048cf0b88138ec387e360 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/97f6f7adb5d6edf4a6f048cf0b88138ec387e360 new file mode 100644 index 0000000..ffe6d8b --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/97f6f7adb5d6edf4a6f048cf0b88138ec387e360 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Watchdog.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9940dffc919eca065999520d9c3ec65d9e6da115 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9940dffc919eca065999520d9c3ec65d9e6da115 new file mode 100644 index 0000000..e815ab6 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9940dffc919eca065999520d9c3ec65d9e6da115 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\NetworkProtocol.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/99a713d37289d4360b5fc4e2aaa27a2ac23ca732 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/99a713d37289d4360b5fc4e2aaa27a2ac23ca732 new file mode 100644 index 0000000..832820e --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/99a713d37289d4360b5fc4e2aaa27a2ac23ca732 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\spi_flash\source\spi_flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9a8afe855b71b0a0b5425fe01c098b3d006d4853 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9a8afe855b71b0a0b5425fe01c098b3d006d4853 new file mode 100644 index 0000000..77ca9f3 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9a8afe855b71b0a0b5425fe01c098b3d006d4853 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\DigitalIO.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9c4a3ad6685403a01952d5f764417b823c88a209 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9c4a3ad6685403a01952d5f764417b823c88a209 new file mode 100644 index 0000000..3d1fece --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/9c4a3ad6685403a01952d5f764417b823c88a209 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\nmbus.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a7fa11fb515fb4290ab75afe9df86b6d273ecace b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a7fa11fb515fb4290ab75afe9df86b6d273ecace new file mode 100644 index 0000000..de925a3 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a7fa11fb515fb4290ab75afe9df86b6d273ecace @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\SPI_Flash.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a9f871d0189d8e6f3709d9cb137f772b9f05927e b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a9f871d0189d8e6f3709d9cb137f772b9f05927e new file mode 100644 index 0000000..da943af --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/a9f871d0189d8e6f3709d9cb137f772b9f05927e @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_periph.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b4bfc2a7214329529e9aa47e9597ac7722caa4b b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b4bfc2a7214329529e9aa47e9597ac7722caa4b new file mode 100644 index 0000000..567e6b6 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b4bfc2a7214329529e9aa47e9597ac7722caa4b @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\main.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b94e0b5cf9d023126f26304ce2e15ab3e7058c44 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b94e0b5cf9d023126f26304ce2e15ab3e7058c44 new file mode 100644 index 0000000..8105301 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/b94e0b5cf9d023126f26304ce2e15ab3e7058c44 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\inet_addr.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c387ea70b73cd042994093e4955dd7f44720c3c0 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c387ea70b73cd042994093e4955dd7f44720c3c0 new file mode 100644 index 0000000..46abfec --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c387ea70b73cd042994093e4955dd7f44720c3c0 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_ota.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c3da9ce09cca3e132490f7a89a1f6a009e5aab4b b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c3da9ce09cca3e132490f7a89a1f6a009e5aab4b new file mode 100644 index 0000000..b9da5ac --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c3da9ce09cca3e132490f7a89a1f6a009e5aab4b @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_hif.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6c4e18499dd38482896ce4989420e161475ff81 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6c4e18499dd38482896ce4989420e161475ff81 new file mode 100644 index 0000000..2217079 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6c4e18499dd38482896ce4989420e161475ff81 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\SPI.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6d90cdceff6f8a0f40792a5045b16a6e686a3d4 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6d90cdceff6f8a0f40792a5045b16a6e686a3d4 new file mode 100644 index 0000000..8843bf0 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c6d90cdceff6f8a0f40792a5045b16a6e686a3d4 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\crc32.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c7a9c6ebc29355283c13b74a4aa9249d5a25c56e b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c7a9c6ebc29355283c13b74a4aa9249d5a25c56e new file mode 100644 index 0000000..bb9768d --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/c7a9c6ebc29355283c13b74a4aa9249d5a25c56e @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Util.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/cc2832952091c3b73c75e713b1dbcc45240d2a5f b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/cc2832952091c3b73c75e713b1dbcc45240d2a5f new file mode 100644 index 0000000..c83938d --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/cc2832952091c3b73c75e713b1dbcc45240d2a5f @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\WiFiCtrl.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d38bf4b642ae25a0c50dc439ca34c55e678b92e8 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d38bf4b642ae25a0c50dc439ca34c55e678b92e8 new file mode 100644 index 0000000..e67551f --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d38bf4b642ae25a0c50dc439ca34c55e678b92e8 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\main.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d96fb68049ac3e8d78c8f36ecb63847d376f7f38 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d96fb68049ac3e8d78c8f36ecb63847d376f7f38 new file mode 100644 index 0000000..8a4f2c4 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/d96fb68049ac3e8d78c8f36ecb63847d376f7f38 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_hif.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 new file mode 100644 index 0000000..e69de29 diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dbc42104fb043babfd0e129c23f1f36c728794d b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dbc42104fb043babfd0e129c23f1f36c728794d new file mode 100644 index 0000000..fbb6d4f --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dbc42104fb043babfd0e129c23f1f36c728794d @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\common\source\nm_common.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc29332267b820c9892bf737817b789cfffa28e3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc29332267b820c9892bf737817b789cfffa28e3 new file mode 100644 index 0000000..2bb4617 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc29332267b820c9892bf737817b789cfffa28e3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\system.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc752be1ffe54a93a8f6bf4fa1c4fe02a13348c3 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc752be1ffe54a93a8f6bf4fa1c4fe02a13348c3 new file mode 100644 index 0000000..158f5dd --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/dc752be1ffe54a93a8f6bf4fa1c4fe02a13348c3 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\Terminal.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/df38d20c6f69367b05a1f9ba6aba43236260d722 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/df38d20c6f69367b05a1f9ba6aba43236260d722 new file mode 100644 index 0000000..0af9763 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/df38d20c6f69367b05a1f9ba6aba43236260d722 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\socket\source\inet_ntop.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/e2335418dbd424c155e30ce9b6ea87f607856e22 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/e2335418dbd424c155e30ce9b6ea87f607856e22 new file mode 100644 index 0000000..35b8b61 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/e2335418dbd424c155e30ce9b6ea87f607856e22 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\timer.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ea0177c03d652f90f36aebfb54891e31a43aff4e b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ea0177c03d652f90f36aebfb54891e31a43aff4e new file mode 100644 index 0000000..fec2f56 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ea0177c03d652f90f36aebfb54891e31a43aff4e @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\ChaletduinoV2Board.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/eddf72a1c6099783f295bce79f8461e408130691 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/eddf72a1c6099783f295bce79f8461e408130691 new file mode 100644 index 0000000..ebe9272 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/eddf72a1c6099783f295bce79f8461e408130691 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\NetworkProtocol.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ee06be021bd0b70b3ff15d21c8544b78829d2cc9 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ee06be021bd0b70b3ff15d21c8544b78829d2cc9 new file mode 100644 index 0000000..f1fa718 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/ee06be021bd0b70b3ff15d21c8544b78829d2cc9 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\VolumeTransducer.c \ No newline at end of file diff --git a/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/f9d0d497d04cbfd967a06629ad890450ee9e9a07 b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/f9d0d497d04cbfd967a06629ad890450ee9e9a07 new file mode 100644 index 0000000..138bc20 --- /dev/null +++ b/AudioConsole.X/.generated_files/flags/ChaletDuinoV2_795F512H_/f9d0d497d04cbfd967a06629ad890450ee9e9a07 @@ -0,0 +1 @@ + $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) D:\Main\PicDev\Projets\AudioConsole\AudioConsole.X\Source\winc3400_142\driver\source\m2m_ssl.c \ No newline at end of file diff --git a/AudioConsole.X/ATCmdInterpreter.h b/AudioConsole.X/ATCmdInterpreter.h new file mode 100644 index 0000000..a35da76 --- /dev/null +++ b/AudioConsole.X/ATCmdInterpreter.h @@ -0,0 +1,23 @@ +/* + * File: ATCmdInterpreter.h + * Author: JF + * + * Created on December 28, 2024, 8:08 AM + */ + +#ifndef ATCMDINTERPRETER_H +#define ATCMDINTERPRETER_H + +#ifdef __cplusplus +extern "C" { +#endif + + + + +#ifdef __cplusplus +} +#endif + +#endif /* ATCMDINTERPRETER_H */ + diff --git a/AudioConsole.X/Makefile b/AudioConsole.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/AudioConsole.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/AudioConsole.X/Source/ADC.c b/AudioConsole.X/Source/ADC.c new file mode 100644 index 0000000..5d18bac --- /dev/null +++ b/AudioConsole.X/Source/ADC.c @@ -0,0 +1,265 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120521 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "ADC.h" +#include "HallAcquisition.h" +#include "digitalio.h" +#include "PAStatus.h" + +/* Globals */ +unsigned int guiADCMode; +unsigned short egADCMotPhaseA; +unsigned short egADCMotPhaseB; +unsigned short egADCMotPhaseC; + +/* Implementation */ + + +//---------------------------------------------------------------------------- +void InitADC(void) +{ + //At boot, init ADC in normal mode... + guiADCMode = ADC_NORMAL_MODE; + + //configure input pins as analog inputs. + TRISBbits.TRISB3 = 1; + AD1PCFGbits.PCFG3 = 0; + TRISBbits.TRISB4 = 1; + AD1PCFGbits.PCFG4 = 0; + TRISBbits.TRISB5 = 1; + AD1PCFGbits.PCFG5 = 0; + TRISBbits.TRISB8 = 1; + AD1PCFGbits.PCFG8 = 0; + TRISBbits.TRISB9 = 1; + AD1PCFGbits.PCFG9 = 0; + TRISBbits.TRISB11 = 1; + AD1PCFGbits.PCFG11 = 0; + TRISBbits.TRISB12 = 1; + AD1PCFGbits.PCFG12 = 0; + TRISBbits.TRISB13 = 1; + AD1PCFGbits.PCFG13 = 0; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + //configure output format (unsigned int 16 bits) + AD1CON1bits.FORM = 0b000; + //configure clock source and prescaling + AD1CON3bits.ADRC = 0; //Use Peripheral clock + AD1CON3bits.ADCS = 4; //Acording to datasheet TAD must be min 83.33ns --> minimal prescaler applied to TPBclk = 8 --> Conversion time ~= 100ns + //AD1CON3bits.SAMC = 1; //Used in automatic sampling mode (scan mode). Shall be augmented if results are not accurate. See datasheet. + AD1CON3bits.SAMC = 30; //Used in automatic sampling mode (scan mode). Shall be augmented if results are not accurate. See datasheet. + +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCEnterHallACQMode(void) +{ + //configure ADC module + AD1CON1bits.ON = 0; //stop ADC to reconfigure. + IEC1bits.AD1IE = 0; //disable ADC interrupt for now + + AD1CHS = 0; //Reset channel source since input source is controlled by hardware in scan mode. + AD1CON2 = 0; + AD1CSSL = 0; + + AD1CON1bits.SSRC = 0b111; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. +// AD1CON1bits.SSRC = 0b000; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. + AD1CON1bits.CLRASAM = 1; + AD1CON1bits.ASAM = 1; + + //configure scan mode + AD1CON2bits.CSCNA = 1; //enable scan mode + AD1CON2bits.SMPI = 2; //Generate interrupt after the 3rd conversion. + + AD1CSSLbits.CSSL11= 1; //select Phase A input in scan sequence + AD1CSSLbits.CSSL12= 1; //select Phase B input in scan sequence + AD1CSSLbits.CSSL13= 1; //select Phase C input in scan sequence + AD1CON1bits.SAMP = 1 ; + + + IPC6bits.AD1IP = 5; + IPC6bits.AD1IS = 3; + IFS1bits.AD1IF = 0; + IEC1bits.AD1IE = 1; //enable ADC interrupt + + AD1CON1bits.ON = 1; //enable ADC. + + guiADCMode = ADC_HALL_ACQ_MODE; + + + return 1; +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCEnterTracesMode(void) +{ + //trick to reuse code but force the good mode :) + ADCEnterHallACQMode(); + guiADCMode = ADC_TRACE_MODE; + return 1; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCEnterCBITMode(void) +{ + //configure ADC module + AD1CON1bits.ON = 0; //stop ADC to reconfigure. + IEC1bits.AD1IE = 0; //disable ADC interrupt for now + + AD1CHS = 0; //Reset channel source since input source is controlled by hardware in scan mode. + AD1CON2 = 0; + AD1CSSL = 0; + + AD1CON1bits.SSRC = 0b111; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. +// AD1CON1bits.SSRC = 0b000; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. + AD1CON1bits.CLRASAM = 1; + AD1CON1bits.ASAM = 1; + + //configure scan mode + AD1CON2bits.CSCNA = 1; //enable scan mode + AD1CON2bits.SMPI = 4; //Generate interrupt after the 5th conversion. + + AD1CSSLbits.CSSL3= 1; //select Vref input in scan sequence + AD1CSSLbits.CSSL4= 1; //select 5V input in scan sequence + AD1CSSLbits.CSSL5= 1; //select 3.3V input in scan sequence + AD1CSSLbits.CSSL8= 1; //select Motor Thermistor input in scan sequence + AD1CSSLbits.CSSL9= 1; //select Drive Thermistor input in scan sequence + AD1CON1bits.SAMP = 1; + + + IPC6bits.AD1IP = 5; + IPC6bits.AD1IS = 3; + IFS1bits.AD1IF = 0; + IEC1bits.AD1IE = 1; //enable ADC interrupt + + AD1CON1bits.ON = 1; //enable ADC. + + guiADCMode = ADC_CBIT_MODE; + + + return 1; +} +//---------------------------------------------------------------------------- + + +//---------------------------------------------------------------------------- +// Starts acquistion and conversion of the 3 phases. The 3 inputs are scanned +// automatically by hardware and an interrupt is triggered when finished. +// +int ADCStartHallACQConversion(void) +{ + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCStartTracesConversion(void) +{ + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCStartCBITConversion(void) +{ + if(guiADCMode == ADC_CBIT_MODE) + { + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; + } + return 0; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCStopConversion(void) +{ + return 1; +} +//---------------------------------------------------------------------------- + +int ADCGetMode(void) +{ + return guiADCMode; +} + + + +//---------------------------------------------------------------------------- +void __ISR(_ADC_VECTOR, ipl5) ADCInterrupt(void) +{ + switch(guiADCMode) + { + case ADC_NORMAL_MODE: + { + break; + } + case ADC_CBIT_MODE: + { + estPAStatus.gusVoltageVref = ADC1BUF0; + estPAStatus.gusVoltage5V = ADC1BUF1; + estPAStatus.gusVoltage33V = ADC1BUF2; + estPAStatus.gusVoltageThermMot = ADC1BUF3; + estPAStatus.gusVoltageThermDrv = ADC1BUF4; + + estPAStatus.IsDataReady = 1; + break; + } + case ADC_TRACE_MODE: + { + egADCMotPhaseA = ADC1BUF0; + egADCMotPhaseB = ADC1BUF1; + egADCMotPhaseC = ADC1BUF2; + break; + } + case ADC_HALL_ACQ_MODE: + { + //Update data structure. + if(gpstHallAcqDataPtr != 0 && gpstHallAcqDataPtr <= gpstHallAcqDataPtrEND) + { + gpstHallAcqDataPtr->MotPhaseA = ADC1BUF0; + gpstHallAcqDataPtr->MotPhaseB = ADC1BUF1; + gpstHallAcqDataPtr->MotPhaseC = ADC1BUF2; + gpstHallAcqDataPtr->AnalogDataUpToDate = 1; + } + break; + } + } + IFS1bits.AD1IF = 0; +} +//---------------------------------------------------------------------------- + +//EOF + diff --git a/AudioConsole.X/Source/ADC.h b/AudioConsole.X/Source/ADC.h new file mode 100644 index 0000000..10c9e45 --- /dev/null +++ b/AudioConsole.X/Source/ADC.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20120516 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef ADC_H +#define ADC_H + +/* ************************************************************************** */ +/* Externs */ + +extern unsigned short egADCMotPhaseA; +extern unsigned short egADCMotPhaseB; +extern unsigned short egADCMotPhaseC; +/* ************************************************************************** */ +/* Defines */ +#define ADC_VOLT_PER_BIT (float)0.003222656 +/* ************************************************************************** */ +/* Type definitions */ +enum eADCModes +{ + ADC_NORMAL_MODE, + ADC_CBIT_MODE, + ADC_TRACE_MODE, + ADC_HALL_ACQ_MODE, + ADC_MAX_MODE +}; + +/* ************************************************************************** */ +/* Prototypes */ +void InitADC(void); + +int ADCStopConversion(void); +//Hall Acquisition Mode +int ADCEnterHallACQMode(void); +int ADCStartHallACQConversion(void); + +//Traces Mode +int ADCEnterTracesMode(void); +int ADCStartTracesConversion(void); + +//CBIT Mode +int ADCEnterCBITMode(void); +int ADCStartCBITConversion(void); + + +int ADCGetMode(void); + + + +#endif //#define ADC_H +//EOF + diff --git a/AudioConsole.X/Source/ATCmdInterpreter.c b/AudioConsole.X/Source/ATCmdInterpreter.c new file mode 100644 index 0000000..24c8f01 --- /dev/null +++ b/AudioConsole.X/Source/ATCmdInterpreter.c @@ -0,0 +1,221 @@ +#include "ATCmdInterpreter.h" +#include "SIM7080GInterface.h" +#include "define.h" +#include +#include +#include +#include "SIM7080GInterface.h" + +bool mCAStateReceived; +char mMasterData[100]; +int mMasterDataSize; +char mInputString[100]; + +void InitATCmdInterpreter() +{ + mCAStateReceived = false; +} + +int AnalyzeNewATString(char* Str, int StrLen, int CurCmd) +{ + memset(mInputString,0,100); + memcpy(mInputString,Str,StrLen); + switch(CurCmd) + { + case LTE_MODULE_CONNECT_APN_CMD: //AT+CNACT=0,1 + { + if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_DISCONNECT_APN_CMD: + { + if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_CHECK_APN_CONNECTION_CMD: + { + if(strncmp("+CNACT:",mInputString,strlen("+CNACT:")) == 0) //+CNACT: 0,1,"10.177.232.192","2605:8D80:5C0:3EED:D90E:5B72:BC1B:281" + { + if(mInputString[8] == '0') //Only consider port 0 + { + if(mInputString[10] == '1' || mInputString[10] == '2') + { + LTEModuleAPNConnectionStatus(LTE_MODULE_APN_CONNECTED); + } + else + { + LTEModuleAPNConnectionStatus(LTE_MODULE_APN_DISCONNECTED); + } + } + } + else if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_CONNECT_TO_MASTER_CMD: + { + if(strncmp("+CAOPEN:",mInputString,strlen("+CAOPEN:")) == 0) + { + int result = atoi(&mInputString[11]); + if(StrLen == 12 && mInputString[11] == '0') //The connection on port 0 is established + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_CONNECTED); + } + else if(result == 1) //socket error, probably caused by APN not connected.. + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_SOCKET_ERROR); + } + else + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_DISCONNECTED); + } + } + else if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD: + { + if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD: + { + if(strncmp("+CASTATE:",mInputString,strlen("+CASTATE:")) == 0) //+CASTATE: 0,0 + { + mCAStateReceived = true; + if(mInputString[12] == '1') //The connection is established + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_CONNECTED); + } + else + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_DISCONNECTED); + } + } + else if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + if(mCAStateReceived == false) + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_DISCONNECTED); + } + mCAStateReceived = false; + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + mCAStateReceived = false; + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_RX_DATA_CMD: + { + if(strncmp("+CARECV:",mInputString,strlen("+CARECV:")) == 0) //+CARECV: 4,test + { + memset(mMasterData,0,100); + mMasterDataSize = 0; + char *token; + // sscanf("%d,%s",&mInputString[9],&DataSize,Data); + token = strtok(&mInputString[9],","); + if(token != NULL) + { + mMasterDataSize = atoi(token); + if(mMasterDataSize < 100) + { + token = strtok(NULL, ","); + if(token != NULL) + { + memcpy(mMasterData,token,mMasterDataSize); + } + } + } + + } + if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + + LTEModuleDataReceived(mMasterData,mMasterDataSize); +// LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + case LTE_MODULE_TX_DATA_CMD: + { + if(strncmp(mInputString,"OK",2) == 0) //The command was executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_OK); + } + else if(strncmp(mInputString,"ERROR",5) == 0) //The command was not executed + { + LTECmdResponseReceived(CurCmd,LTE_MODULE_RESULT_ERROR); + } + break; + } + + + case LTE_MODULE_NO_CMD: //+CADATAIND: + default: + { + if(strncmp("+CADATAIND:",mInputString,strlen("+CADATAIND:")) == 0) + { + LTEModuleNewDataReady(); + } + if(strncmp("+APP PDP:",mInputString,strlen("+APP PDP:")) == 0) + { + // LTEModuleNewDataReady(); + } + if(strncmp("+CASTATE:",mInputString,strlen("+CASTATE:")) == 0) //+CASTATE: 0,0 + { + if(mInputString[12] == '1') //The connection is established + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_CONNECTED); + } + else + { + LTEModuleMasterConnectionStatus(LTE_MODULE_MASTER_DISCONNECTED); + } + } + break; + } + + } +} \ No newline at end of file diff --git a/AudioConsole.X/Source/ATCmdInterpreter.h b/AudioConsole.X/Source/ATCmdInterpreter.h new file mode 100644 index 0000000..7aafa3d --- /dev/null +++ b/AudioConsole.X/Source/ATCmdInterpreter.h @@ -0,0 +1,15 @@ +/* + * File: ATCmdInterpreter.h + * Author: JF + * + * Created on December 28, 2024, 8:08 AM + */ + +#ifndef ATCMDINTERPRETER_H +#define ATCMDINTERPRETER_H + +void InitATCmdInterpreter(); +int AnalyzeNewATString(char* Str, int StrLen, int CurCmd); + +#endif /* ATCMDINTERPRETER_H */ + diff --git a/AudioConsole.X/Source/BatteryMonitor.c b/AudioConsole.X/Source/BatteryMonitor.c new file mode 100644 index 0000000..5a14771 --- /dev/null +++ b/AudioConsole.X/Source/BatteryMonitor.c @@ -0,0 +1,196 @@ +//#include + +#include "BatteryMonitor.h" +#include "BoardCfg.h" +#include "timer.h" +#include "ina219.h" +#include "WiFiCtrl.h" +#include "I2C.h" + +float mBatteryVoltage; +int mBatteryCurrent; +int mBatterySOC; + +float mVoltageMeanSum; +int mVoltageMeanCount; +unsigned int mCurrentMeanSum; +int mCurrentMeanCount; +bool mCurrentModuleOK; + +void InitBatteryMonitor() +{ + mBatteryVoltage = 0; + mBatteryCurrent = 0; + mBatterySOC = 0; + mVoltageMeanCount = 0; + mCurrentMeanCount = 0; + mCurrentModuleOK = true; + + TimerStart(BATTERY_MONITOR_TIMER,100); + + + //experimental stuff! + mVoltageMeanSum = 0.0; + mVoltageMeanCount = 0; + +// if(ina219Init() == RET_ERROR) +// { +// mCurrentModuleOK = false; +// } + //ina219SetCalibration_16V_500mA(); + // ina219SetCalibration_16V_200mA(); + +} + +void BatteryMonitorTick() +{ + static int NetworkSendCounter; //Every second (10 counts) we want to send the battery data. + if(IsTimerExpired(BATTERY_MONITOR_TIMER)) + { + unsigned int adc; + double conv, raw; + + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + adc = ADC1BUF0; + AD1CON1bits.SAMP = 1; + // adc &= 0xFFFE; + conv = (float)adc / 1023; + conv *= 3.36; + raw = conv; + conv *= 11; + + //avoid rollovers in case the LORA network gets disconnected. + //This could go for a long time but 5000 samples is too much anyways. + if(mVoltageMeanCount >= 5000) + { + mVoltageMeanCount = 0; + mVoltageMeanSum = conv; + } + else + { + mVoltageMeanCount++; + mVoltageMeanSum += conv; + } + + + + mBatteryVoltage = conv; + + TimerStart(BATTERY_MONITOR_TIMER,100); + + if(mCurrentModuleOK == true) + { +// mBatteryCurrent = ina219GetCurrent_mA(); +// if(I2CWasLastTransactionOK() == 0 ) +// { +// mCurrentModuleOK = false; +// } + } + else + { + unsigned int Ref = 0; + AD1CHSbits.CH0SA = 0; //AN0 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + Ref = ADC1BUF0; + AD1CON1bits.SAMP = 1; + + + + + AD1CHSbits.CH0SA = 2; //AN2 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + adc = ADC1BUF0; + AD1CON1bits.SAMP = 1; + // adc &= 0xFFFE; + + adc -= Ref; + + conv = (double)adc * 1.0; + conv /= 1023; + conv *= 3.3; //Volts + conv /= 0.05; //Amps (50mV/A) + + raw = conv; + + //avoid rollovers in case the LORA network gets disconnected. + //This could go for a long time but 5000 samples is too much anyways. + if(mCurrentMeanCount >= 500) + { + mCurrentMeanCount = 1; + mCurrentMeanSum = adc; + } + else + { + mCurrentMeanCount++; + mCurrentMeanSum += adc; + } + + + + mBatteryCurrent = adc; + //mBatteryCurrent = mCurrentMeanSum / mCurrentMeanCount; + } + + } +} + +float GetBatteryVoltage(int Reset) +{ + if(Reset == 1) + { + mBatteryVoltage = (mVoltageMeanSum/mVoltageMeanCount); + mVoltageMeanSum = 0.0; + mVoltageMeanCount = 0; + } + + + return mBatteryVoltage; + +} + +int GetSolarPanelCurrent() +{ + //mBatteryCurrent = (mCurrentMeanSum/mCurrentMeanCount); + //mVoltageMeanCount = 0; + mCurrentMeanSum = 0.0; + + return mBatteryCurrent; +} +float GetConvertedSolarPanelCurrent() +{ + float Cur = (mBatteryCurrent - 2) * (3.3/1023); + return Cur; +} + +int GetBatterySOC() +{ + return mBatterySOC; +} + +int SendNetworkBatteryData() +{ +// int VoltageMilliVolts = (int)(mBatteryVoltage * 1000); +// int BattCurrent = mBatteryCurrent; +// +// char BatData[10]; +// BatData[0] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 1 +// VoltageMilliVolts >>= 8; +// BatData[1] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 2 +// BatData[2] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 1 +// BattCurrent >>= 8; +// BatData[3] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 2 +// +// SendNetworkData(BatData,4); + + printf("Battery voltage: %f\n",mBatteryVoltage); + +} + +bool GetCurrentModuleOK() +{ + return mCurrentModuleOK; +} diff --git a/AudioConsole.X/Source/BatteryMonitor.h b/AudioConsole.X/Source/BatteryMonitor.h new file mode 100644 index 0000000..a8dd7bb --- /dev/null +++ b/AudioConsole.X/Source/BatteryMonitor.h @@ -0,0 +1,27 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef BATTERYMONITOR_H +#define BATTERYMONITOR_H +#include "define.h" + + + + +void InitBatteryMonitor(); + +void BatteryMonitorTick(); +float GetBatteryVoltage(int Reset); +int GetSolarPanelCurrent(); +int GetBatterySOC(); +int SendNetworkBatteryData(); +bool GetCurrentModuleOK(); +float GetConvertedSolarPanelCurrent(); + + +#endif /* BATTERYMONITOR_H */ + diff --git a/AudioConsole.X/Source/BoardCfg.h b/AudioConsole.X/Source/BoardCfg.h new file mode 100644 index 0000000..32cceb6 --- /dev/null +++ b/AudioConsole.X/Source/BoardCfg.h @@ -0,0 +1,49 @@ +/* + * File: BoardCfg.h + * Author: JF + * + * Created on November 26, 2018, 4:50 PM + */ + +#ifndef BOARDCFG_H +#define BOARDCFG_H + +#include "define.h" + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk) +{ + unsigned int brg; + + brg = pb_clk / (2 * spi_clk); + + if(pb_clk % (2 * spi_clk)) + brg++; + + if(brg > 0x100) + brg = 0x100; + + if(brg) + brg--; + + return (unsigned char) brg; +} +// +#ifdef FUBARINO_BRD +#include "BoardCfg_Fubarino.h" +#endif + +//#ifdef PINGUINO_BRD +//#include "BoardCfg_Pinguino.h" +//#endif + +#ifdef CHALETDUINO_BRD +#include "BoardCfg_Chaletduino.h" +#endif + +#ifdef CHALETDUINO_V2_BRD +#include "BoardCfg_ChaletduinoV2.h" +#endif +int InitBoard(); + +#endif /* BOARDCFG_H */ + diff --git a/AudioConsole.X/Source/BoardCfg_Chaletduino.h b/AudioConsole.X/Source/BoardCfg_Chaletduino.h new file mode 100644 index 0000000..893ae7d --- /dev/null +++ b/AudioConsole.X/Source/BoardCfg_Chaletduino.h @@ -0,0 +1,120 @@ +/* + * File: DigitalIO_Chaletduino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_CHALETDUINO_H +#define DIGITALIO_CHALETDUINO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ************************************************************************** */ + /* Includes */ +#include "define.h" + /* ************************************************************************** */ + /* Defines */ + //#include +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + + //Output pins hardware definitions + // +#define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 +#define HEARTBEAT_LED_2_PIN LATEbits.LATE6 +#define HEARTBEAT_LED_2_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_2_SET_REG LATESET +#define HEARTBEAT_LED_2_CLEAR_REG LATECLR +#define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATE6_MASK + +#define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 +#define HEARTBEAT_LED_1_PIN LATEbits.LATE5 +#define HEARTBEAT_LED_1_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_1_SET_REG LATESET +#define HEARTBEAT_LED_1_CLEAR_REG LATECLR +#define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + +#define LORA_ACTIVITY_LED_PIN_DIR TRISFbits.TRISF1 +#define LORA_ACTIVITY_LED_PIN LATFbits.LATF1 +#define LORA_ACTIVITY_LED_TOGGLE_REG LATFINV +#define LORA_ACTIVITY_LED_SET_REG LATFSET +#define LORA_ACTIVITY_LED_CLEAR_REG LATFCLR +#define LORA_ACTIVITY_LED_TOGGLE_MASK _LATE_LATF1_MASK + + // #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + // #define GP_DEBUG_1_PIN LATEbits.LATE5 + // #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + // #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + // #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 + // #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs +#define SPI_SDO_PIN_DIR TRISGbits.TRISG8 +#define SPI_SDI_PIN_DIR TRISGbits.TRISG7 +#define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + //SD Card +#define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 +#define SD_SPI_SS_PIN LATBbits.LATB13 + + //SPI Flash +#define FLASH_SS_PIN_DIR TRISEbits.TRISE3 +#define FLASH_SS_PIN LATEbits.LATE3 + + + //Wifi (WINC3400 module) +#define WIFI_SPI_SS_PIN_DIR TRISEbits.TRISE0 +#define WIFI_SPI_SS_PIN LATEbits.LATE0 +#define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 +#define WIFI_IRQ_PIN PORTDbits.RD0 + + // #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + // #define WIFI_SPI_CFG_PIN LATEbits.LATE1 +#define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 +#define WIFI_CHP_EN_PIN LATEbits.LATE2 +#define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE4 +#define WIFI_CHP_RST_PIN LATEbits.LATE4 + + //Chalet power relay +#define POWER_RELAY_ON_PIN_DIR TRISEbits.TRISE7 +#define POWER_RELAY_ON_PIN LATEbits.LATE7 //X2-3 +#define POWER_RELAY_OFF_PIN_DIR TRISGbits.TRISG9 +#define POWER_RELAY_OFF_PIN LATGbits.LATG9 //X3-5 + + //Harakiri relay +#define HARAKIRI_RELAY_ON_PIN_DIR TRISBbits.TRISB0 +#define HARAKIRI_RELAY_ON_PIN LATBbits.LATB0 //X2-3 + + //12V presence detection input +#define CHALET_12V_PRESENCE_PIN_DIR TRISBbits.TRISB15 +#define CHALET_12V_PRESENCE_PIN PORTBbits.RB15 //X2-3 + + //Battery voltage measurement (analog input) +#define BATTERY_VOLTAGE_ANALOG_PIN_DIR TRISBbits.TRISB1 + + //Current sensor. Those pins tristate is controlled by the I2C module +#define CURRENT_MODULE_I2C_SCL_PIN_DIR TRISDbits.TRISD3 +#define CURRENT_MODULE_I2C_SDA_PIN_DIR TRISDbits.TRISD2 + + + + /* ************************************************************************** */ + /* Prototypes */ + void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/AudioConsole.X/Source/BoardCfg_ChaletduinoV2.h b/AudioConsole.X/Source/BoardCfg_ChaletduinoV2.h new file mode 100644 index 0000000..ec13f17 --- /dev/null +++ b/AudioConsole.X/Source/BoardCfg_ChaletduinoV2.h @@ -0,0 +1,159 @@ +/* + * File: DigitalIO_Chaletduino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_CHALETDUINO_H +#define DIGITALIO_CHALETDUINO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ************************************************************************** */ + /* Includes */ +#include "define.h" + /* ************************************************************************** */ + /* Defines */ + //#include +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + + //Output pins hardware definitions + // +#define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 +#define HEARTBEAT_LED_2_PIN LATEbits.LATE6 +#define HEARTBEAT_LED_2_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_2_SET_REG LATESET +#define HEARTBEAT_LED_2_CLEAR_REG LATECLR +#define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATE6_MASK + +#define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 +#define HEARTBEAT_LED_1_PIN LATEbits.LATE5 +#define HEARTBEAT_LED_1_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_1_SET_REG LATESET +#define HEARTBEAT_LED_1_CLEAR_REG LATECLR +#define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + + + + // #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + // #define GP_DEBUG_1_PIN LATEbits.LATE5 + // #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + // #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + // #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 + // #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs +#define SPI_SDO_PIN_DIR TRISGbits.TRISG8 +#define SPI_SDI_PIN_DIR TRISGbits.TRISG7 +#define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + + + + //SD Card +#define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 +#define SD_SPI_SS_PIN LATBbits.LATB13 + + //SPI Flash +#define FLASH_SS_PIN_DIR TRISEbits.TRISE3 +#define FLASH_SS_PIN LATEbits.LATE3 + + + //Wifi (WINC3400 module) +#define WIFI_SPI_SS_PIN_DIR TRISEbits.TRISE0 +#define WIFI_SPI_SS_PIN LATEbits.LATE0 +#define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 +#define WIFI_IRQ_PIN PORTDbits.RD0 + + // #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + // #define WIFI_SPI_CFG_PIN LATEbits.LATE1 +#define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 +#define WIFI_CHP_EN_PIN LATEbits.LATE2 +#define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE4 +#define WIFI_CHP_RST_PIN LATEbits.LATE4 + + + +#define ONBOARD_LED1_PIN_DIR TRISGbits.TRISG9 +#define ONBOARD_LED1_PIN LATGbits.LATG9 +#define ONBOARD_LED2_PIN_DIR TRISDbits.TRISD3 +#define ONBOARD_LED2_PIN LATDbits.LATD3 +#define ONBOARD_LED3_PIN_DIR TRISFbits.TRISF0 +#define ONBOARD_LED3_PIN LATFbits.LATF0 +#define ONBOARD_LED7_PIN_DIR TRISBbits.TRISB14 +#define ONBOARD_LED7_PIN LATBbits.LATB14 + + +#define PUSH_BUTTON_LED1_PIN_DIR TRISBbits.TRISB8 +#define PUSH_BUTTON_LED1_PIN LATBbits.LATB8 +#define PUSH_BUTTON_LED2_PIN_DIR TRISBbits.TRISB9 +#define PUSH_BUTTON_LED2_PIN LATBbits.LATB9 +#define PUSH_BUTTON_LED3_PIN_DIR TRISBbits.TRISB10 +#define PUSH_BUTTON_LED3_PIN LATBbits.LATB10 +#define PUSH_BUTTON_LED4_PIN_DIR TRISBbits.TRISB11 +#define PUSH_BUTTON_LED4_PIN LATBbits.LATB11 +#define PUSH_BUTTON_LED5_PIN_DIR TRISBbits.TRISB12 +#define PUSH_BUTTON_LED5_PIN LATBbits.LATB12 +#define PUSH_BUTTON_LED6_PIN_DIR TRISBbits.TRISB13 +#define PUSH_BUTTON_LED6_PIN LATBbits.LATB13 +#define PUSH_BUTTON_LED7_PIN_DIR TRISBbits.TRISB1 +#define PUSH_BUTTON_LED7_PIN LATBbits.LATB1 + +#define PUSH_BUTTON_INPUT1_PIN_DIR TRISDbits.TRISD4 +#define PUSH_BUTTON_INPUT1_PIN PORTDbits.RD4 +#define PUSH_BUTTON_INPUT2_PIN_DIR TRISDbits.TRISD5 +#define PUSH_BUTTON_INPUT2_PIN PORTDbits.RD5 +#define PUSH_BUTTON_INPUT3_PIN_DIR TRISDbits.TRISD6 +#define PUSH_BUTTON_INPUT3_PIN PORTDbits.RD6 +#define PUSH_BUTTON_INPUT4_PIN_DIR TRISDbits.TRISD7 +#define PUSH_BUTTON_INPUT4_PIN PORTDbits.RD7 +#define PUSH_BUTTON_INPUT5_PIN_DIR TRISCbits.TRISC13 +#define PUSH_BUTTON_INPUT5_PIN PORTCbits.RC13 +#define PUSH_BUTTON_INPUT6_PIN_DIR TRISCbits.TRISC14 +#define PUSH_BUTTON_INPUT6_PIN PORTCbits.RC14 +#define PUSH_BUTTON_INPUT7_PIN_DIR TRISBbits.TRISB15 +#define PUSH_BUTTON_INPUT7_PIN PORTBbits.RB15 + + +#define VU1_DAC_SYNC_PIN_DIR TRISGbits.TRISG2 +#define VU1_DAC_SYNC_PIN LATGbits.LATG2 +#define VU1_BACKLIGHT_PIN_DIR TRISDbits.TRISD2 +#define VU1_BACKLIGHT_PIN LATDbits.LATD2 + +#define VU2_DAC_SYNC_PIN_DIR TRISGbits.TRISG3 +#define VU2_DAC_SYNC_PIN LATGbits.LATG3 +#define VU2_BACKLIGHT_PIN_DIR TRISDbits.TRISD1 +#define VU2_BACKLIGHT_PIN LATDbits.LATD1 + + +#define BUREAU_VOL_POT_CW_PIN_DIR TRISDbits.TRISD9 +#define BUREAU_VOL_POT_CW_PIN PORTDbits.RD9 //INT2 +#define BUREAU_VOL_POT_CCW_PIN_DIR TRISDbits.TRISD8 +#define BUREAU_VOL_POT_CCW_PIN PORTDbits.RD8 //INT1 + +#define CUISINE_VOL_POT_CW_PIN_DIR TRISDbits.TRISD11 +#define CUISINE_VOL_POT_CW_PIN PORTDbits.RD11 //INT4 +#define CUISINE_VOL_POT_CCW_PIN_DIR TRISDbits.TRISD10 +#define CUISINE_VOL_POT_CCW_PIN PORTDbits.RD10 //INT3 + + /* ************************************************************************** */ + /* Prototypes */ + void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/AudioConsole.X/Source/BoardCfg_Fubarino.h b/AudioConsole.X/Source/BoardCfg_Fubarino.h new file mode 100644 index 0000000..ef129eb --- /dev/null +++ b/AudioConsole.X/Source/BoardCfg_Fubarino.h @@ -0,0 +1,58 @@ +/* + * File: DigitalIO_Fubarino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_FUBARINO_H +#define DIGITALIO_FUBARINO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +/* ************************************************************************** */ +/* Defines */ + +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + +//Output pins hardware definitions +// + #define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 + #define HEARTBEAT_LED_1_PIN LATEbits.LATE5 + #define HEARTBEAT_LED_1_TOGGLE_REG LATEINV + #define HEARTBEAT_LED_1_SET_REG LATESET + #define HEARTBEAT_LED_1_CLEAR_REG LATECLR + #define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + + #define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE2 + #define HEARTBEAT_LED_2_PIN LATEbits.LATE2 + #define HEARTBEAT_LED_2_TOGGLE_REG LATEINV + #define HEARTBEAT_LED_2_SET_REG LATESET + #define HEARTBEAT_LED_2_CLEAR_REG LATECLR + #define HEARTBEAT_LED_2_TOGGLE_MASK _LATE_LATE2_MASK + + #define SD_SPI_SDO_PIN_DIR TRISGbits.TRISG8 + #define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 + #define SD_SPI_CS_PIN LATGbits.LATG9 + #define SD_SPI_SDI_PIN_DIR TRISGbits.TRISG7 + #define SD_SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + +/* ************************************************************************** */ +/* Prototypes */ +void InitDigitalIO(void); + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_FUBARINO_H */ + diff --git a/AudioConsole.X/Source/BoardCfg_Pinguino.h b/AudioConsole.X/Source/BoardCfg_Pinguino.h new file mode 100644 index 0000000..041115e --- /dev/null +++ b/AudioConsole.X/Source/BoardCfg_Pinguino.h @@ -0,0 +1,104 @@ +/* + * File: DigitalIO_Pinguino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_PINGUINO_H +#define DIGITALIO_PINGUINO_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +/* ************************************************************************** */ +/* Defines */ + +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + +//Output pins hardware definitions +// +// #define HEARTBEAT_LED_2_PIN_DIR TRISGbits.TRISG6 +// #define HEARTBEAT_LED_2_PIN LATGbits.LATG6 +// #define HEARTBEAT_LED_2_TOGGLE_REG LATGINV +// #define HEARTBEAT_LED_2_SET_REG LATGSET +// #define HEARTBEAT_LED_2_CLEAR_REG LATGCLR +// #define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATG6_MASK + + #define HEARTBEAT_LED_1_PIN_DIR TRISDbits.TRISD1 + #define HEARTBEAT_LED_1_PIN LATDbits.LATD1 + #define HEARTBEAT_LED_1_TOGGLE_REG LATDINV + #define HEARTBEAT_LED_1_SET_REG LATDSET + #define HEARTBEAT_LED_1_CLEAR_REG LATDCLR + #define HEARTBEAT_LED_1_TOGGLE_MASK _LATD_LATD1_MASK + + +// #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 +// #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs + #define SPI_SDO_PIN_DIR TRISGbits.TRISG8 + #define SPI_SDI_PIN_DIR TRISGbits.TRISG7 + #define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + //SD Card + #define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 + #define SD_SPI_SS_PIN LATBbits.LATB13 + + //Wifi (WINC3400 module) + #define WIFI_SPI_SS_PIN_DIR TRISFbits.TRISF1 + #define WIFI_SPI_SS_PIN LATFbits.LATF1 + #define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 + #define WIFI_IRQ_PIN PORTDbits.RD0 + #define WIFI_WAKE_PIN_DIR TRISEbits.TRISE0 + #define WIFI_WAKE_PIN LATEbits.LATE0 + #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + #define WIFI_SPI_CFG_PIN LATEbits.LATE1 + #define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 + #define WIFI_CHP_EN_PIN LATEbits.LATE2 + #define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE3 + #define WIFI_CHP_RST_PIN LATEbits.LATE3 + + //Control knob encoder + #define KNOB_PH_A_PIN_DIR TRISDbits.TRISD8 + #define KNOB_PH_A_PIN PORTDbits.RD8 + #define KNOB_PH_B_PIN_DIR TRISDbits.TRISD7 + #define KNOB_PH_B_PIN PORTDbits.RD7 + #define KNOB_TGLE_BTN_PIN_DIR TRISDbits.TRISD11 + #define KNOB_TGLE_BTN_PIN PORTDbits.RD11 + + //Led controller PWM + #define LED_PWM_PIN_DIR TRISDbits.TRISD2 + #define LED_PWM_PIN LATDbits.LATD2 + #define LED_PWM_VAL_REG OC3RS + + + //Misc CPU or board related defines + #define PWM_RANGE_MAX 16000 + + #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + #define GP_DEBUG_1_PIN LATEbits.LATE5 + #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + +/* ************************************************************************** */ +/* Prototypes */ +void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/AudioConsole.X/Source/BootloaderInterface.c b/AudioConsole.X/Source/BootloaderInterface.c new file mode 100644 index 0000000..f92298f --- /dev/null +++ b/AudioConsole.X/Source/BootloaderInterface.c @@ -0,0 +1,985 @@ +//#include + +#include "BootloaderInterface.h" +#include "BootloaderProtocol.h" +#include "ProtocolDefs.h" +#include "BoardCfg.h" +#include "timer.h" +#include "WiFiCtrl.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" +#include "NetworkProtocol.h" +#include "Syslog.h" +#include "checksum.h" +#include "FlashMapping.h" + + +#define BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... +#define BOOTLOADER_FLASH_WRITE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_WRITE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... + + +unsigned char BootloaderBuffer[300]; +int BootloaderInterfaceState; + + +int DataChunkWritten; +int CurDataChunkIndex; +int FirmwareUploaded; +int CurDataChunkSize; + +int BooloaderFlashEraseState; +int BootloaderFlashErased; +unsigned int BootloaderCurFlashEraseAddress; +int BooloaderFlashErasePollCount; + +int BootloaderFlashWriteState; +unsigned int BootloaderCurFlashWriteAddress; +int BootloaderFlashWritePollCount; +int BootloaderFirmwareChunkWriteCount; +char* BootloaderFlashWriteDataPtr; + + +int BootloaderInterfaceInit() +{ + BootloaderProtocolInit(); + BootloaderResetStateMachine(); + BootloaderCheckFlashBootloaderData(); + update_crc_32(0,0); //Force to populate the CRC32 table... + return 1; +} + +void BootloaderInterfaceTick() +{ + BootloaderInterfaceStateMachine(BOOTLOADER_TICK_EVENT,0); +} + +void BootloaderExecuteCmd(char Cmd,bool CRCValid) +{ + unsigned char *DataBufPtr = BootloaderProtocolGetDataBufferPtr(); + if(CRCValid == 0) + { + printf("Bootloader received a frame with invalid CRC\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD); + return; + } + switch(Cmd) + { + case BOOTLOADER_HEARTBEAT_REQUEST: + { + printf("Bootloader Heartbeat Request\n"); + *DataBufPtr = 1; + BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1); + break; + } + case BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST: + { + printf("BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ERASE_FLASH_CMD); + break; + } + case BOOTLOADER_INIT_UPLOAD_REQUEST: + { + printf("BOOTLOADER_INIT_UPLOAD_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INIT_UPLOAD_CMD); + break; + } + case BOOTLOADER_GET_STATE_REQUEST: + { + printf("BOOTLOADER_GET_STATE_REQUEST\n"); + BootloaderProtocolSendBootloaderState((char)BootloaderInterfaceState); + break; + } + case BOOTLOADER_SEND_DATA_CHUNK_REQUEST: + { + // printf("BOOTLOADER_SEND_DATA_CHUNK_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_NEW_DATA_CHUNK_CMD); + break; + } + case BOOTLOADER_UPLOAD_FINISHED_REQUEST: + { + printf("BOOTLOADER_UPLOAD_FINISHED_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_UPLOAD_FINISHED_CMD); + break; + } + case BOOTLOADER_EXECUTE_UPGRAGE_REQUEST: + { + printf("BOOTLOADER_EXECUTE_UPGRAGE_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD); + break; + } + case BOOTLOADER_ABORT_OPERATION_REQUEST: + { + printf("BOOTLOADER_ABORT_OPERATION_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ABORT_CMD); + } + case BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST: + { + printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_CHECK_FLASH_CMD); + break; + } + case BOOTLOADER_GET_STORED_FIRMWARE_INFO_REQUEST: + { + printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD); + break; + } + default: + { + break; + } + } +} + +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC) +{ + printf("BootloaderProtocol detected a CRC error. Cmd: %d, RxCRC:0x%x, Expected:[0x%x]\n",Cmd,RxCRC,ExpectedCRC); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD); +} + +void BootloaderInterfaceStateMachine(int Event, int Param) +{ + + switch(BootloaderInterfaceState) + { + case BOOTLOADER_STANDBY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + if(Param == BOOTLOADER_SM_ACTIVATE_CMD) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + printf("Bootloader Interface going into active state\n"); + + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ACTIVE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ERASE_FLASH_CMD: + { + ResetBootloaderFlashEraseStateMachine(); //Setup the state machine + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE); + BootloaderInterfaceState = BOOTLOADER_ERASE_FLASH_STATE; + printf("Bootloader Interface going into Erase Flash state\n"); + break; + } + case BOOTLOADER_SM_INIT_UPLOAD_CMD: + { + + if(BootloaderFlashErased == 0) + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED); + } + else + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_OK); + + //TODO: Shall we prepare something before?? + BootloaderProtocolSendACK(BOOTLOADER_READY_FOR_DATA_RESPONSE); + + BootloaderInterfaceState = BOOTLOADER_RECEIVING_FIRMWARE_STATE; + printf("Bootloader Interface going into Firmware RX state\n"); + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + case BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD: + { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderProtocolSendACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader will now upgrade and reboot!!\n"); + + char Flags[2]; + Flags[BOOTLOADER_FLAGS_ACTION_FLAG_INDEX] = BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE; + Flags[BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX] = BOOTLOADER_FLASH_FIRMWARE_VALIDATOR; + SPIFlashWriteBuffer(Flags,2,FLASH_BTLDR_FLAGS_ADDRESS); + + Sleep(100); + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + + } + else + { + BootloaderProtocolSendNACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader upgrade request denied: Firmware not uploaded\n"); + } + break; + } + case BOOTLOADER_SM_CHECK_FLASH_CMD: + { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_SUCCESS); + } + else + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_FAILED); + } + break; + } + case BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD: + { + char Response[21]; + memset(Response,0xFF,sizeof(Response)); + + if(BootloaderCheckFlashBootloaderData() != RET_OK) + { + Response[0] = 0; + } + else + { + Response[0] = 1; + BootloaderIntToBytes(&Response[1],mStoredBootloaderInfo.Firmwareflags); + BootloaderIntToBytes(&Response[5],mStoredBootloaderInfo.NbRecords); + BootloaderIntToBytes(&Response[9],mStoredBootloaderInfo.FirmwareSize); + BootloaderIntToBytes(&Response[13],mStoredBootloaderInfo.Versioncode); + BootloaderIntToBytes(&Response[17],mStoredBootloaderInfo.DataCRC32); + } + + BootloaderProtocolSendStoredFirmwareInfoResponse(Response,sizeof(Response)); + + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ERASE_FLASH_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_ERASE_RUNNING_RES: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_RES: + { + printf("Flash erase finished. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + BootloaderFlashErased = 1; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_RES: + { + printf("Flash erase error. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + case BOOTLOADER_FLASH_ERASE_ABORT_RES: + { + printf("Flash erase abort. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + } + + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO: stop erasing and reset SM. + //TODO invalidate data in Flash + BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT); + printf("Aborting Flash erase, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_RECEIVING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_WRITING_RES: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_SUCCESS,CurDataChunkIndex); + printf("Bootloader Chunk %d successfuly written to flash\n",CurDataChunkIndex); + CurDataChunkIndex++; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR,CurDataChunkIndex); + BootloaderResetStateMachine(); + printf("Bootloader Flash write error. Aborting and going into STANDBY state\n"); + break; + } + case BOOTLOADER_FLASH_WRITE_ABORT_RES: + { + break; + } + } + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_NEW_DATA_CHUNK_CMD: + { + + //TODO:Check data validity + //TODO: Write data to flash + + //Extract index from buffer + unsigned int DataChunkIndex = 0; + unsigned int DataChunkSize = 0; + DataChunkSize = 0; + + // DataChunkIndex = BootloaderBuffer[0]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[1]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[2]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[3]; + DataChunkIndex = BootloaderBytesToInt(&BootloaderBuffer[0]); + + // DataChunkSize = BootloaderBuffer[4]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[5]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[6]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[7]; + DataChunkSize = BootloaderBytesToInt(&BootloaderBuffer[4]); + + + BootloaderFlashWriteDataPtr = &BootloaderBuffer[8]; + + //Check CRC + + + + if(CurDataChunkIndex != DataChunkIndex) + { + //Error... abort. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX,CurDataChunkIndex); + printf("Bootloader Interface ABORTING UPLOAD. Received invalid chunk index. Rx: [%d] - Expected: [%d]\n", DataChunkIndex,CurDataChunkIndex); + ResetBootloaderFlashWriteStateMachine(); + + } + else + { + CurDataChunkSize = DataChunkSize; + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT); + printf("Bootloader Interface. Rx new data chunk. Writing to flash. Index: %d\n", DataChunkIndex); + } + + break; + } + case BOOTLOADER_SM_INVALID_CRC_CMD: + { + //BootloaderProtocol determined the CRC of the chunk was invalid. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND,CurDataChunkIndex); + printf("Bootloader Interface invalid chunk CRC. Requesting resend chunk index [%d]\n", CurDataChunkIndex); + break; + } + case BOOTLOADER_SM_UPLOAD_FINISHED_CMD: + { + printf("Bootloader Interface firmware upload finished. Check flash integrity.\n"); + + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + //BootloaderProtocolSendACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_SUCCESS); + FirmwareUploaded = 1; + } + else + { + printf("Firmware integrity check failed. Going back to STANDBY state.\n"); + // BootloaderProtocolSendNACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR); + BootloaderResetStateMachine(); + FirmwareUploaded = 0; + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Bootloader aborting firmware download. Going back to STANDBY state\n"); + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT); + BootloaderResetStateMachine(); + break; + } + default: + { + //WHAT TO DO??? + + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_SENDING_FIRMWARE_COPY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_PRINTING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + } + +} + +void BootloaderResetStateMachine() +{ + BootloaderInterfaceState = BOOTLOADER_STANDBY_STATE; + DataChunkWritten = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkSize = 0; + + + ResetBootloaderFlashEraseStateMachine(); + ResetBootloaderFlashWriteStateMachine(); + + CloseBootloaderServer(); +} + +void BootloaderActivateBootloader() +{ + OpenBootloaderServer(); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ACTIVATE_CMD); +} +void BootloaderDeactivateBootloader() +{ + BootloaderResetStateMachine(); + // CloseBootloaderServer(); + // BootloaderIterfaceStateMachine(BOOTLOADER_SM_ABORT_CMD,0); +} + +int BootloaderFlashEraseStateMachine(int event) +{ + if(event == BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT) + { + ResetBootloaderFlashEraseStateMachine(); + return BOOTLOADER_FLASH_ERASE_ABORT_RES; + } + + switch(BooloaderFlashEraseState) + { + case BOOTLOADER_FLASH_ERASE_SECTOR_STATE: + { + if(SPIFlashErase64KSector(BootloaderCurFlashEraseAddress,0) == RET_ERROR) + { + + printf("Bootloader Interface Erasing sector %0x%x\n", BootloaderCurFlashEraseAddress); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + BooloaderFlashErasePollCount = 0; + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE; + break; + } + case BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE: + { + if(IsTimerExpired(BOOTLOADER_FLASH_POLL_TIMER) == 1) + { + if(SPIFlashCheckBusy() == 0) //sector erased + { + if(BootloaderCurFlashEraseAddress == FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD) + { + //Whole bootloader partition is erased. + printf("Bootloader Interface: Last sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_FINISHED_STATE; + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + else + { + printf("Bootloader Interface sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BootloaderCurFlashEraseAddress += SPI_FLASH_64K_SECTOR_SIZE; + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + } + } + else + { + if(BooloaderFlashErasePollCount >= BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT) + { + printf("Bootloader Interface Flash erase error. Max poll count reached : %d!!!\n",BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + else + { + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashErasePollCount++; + } + } + } + break; + } + case BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_STATE: + { + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + break; + } + } + + return BOOTLOADER_FLASH_ERASE_RUNNING_RES; +} + +int ResetBootloaderFlashEraseStateMachine() +{ + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + BootloaderCurFlashEraseAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BooloaderFlashErasePollCount = 0; + BootloaderFlashErased = 0; +} + +int BootloaderFlashWriteStateMachine(int event) +{ + switch(BootloaderFlashWriteState) + { + case BOOTLOADER_FLASH_WRITE_STANDBY_STATE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + //TODO: timeout + // return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + else if(event == BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT) + { + // printf("Starting writing data to Flash\nFlash Address : Data\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_BUFFER_STATE; + BootloaderFirmwareChunkWriteCount = 0; + return BOOTLOADER_FLASH_WRITING_RES; + } + break; + } + case BOOTLOADER_FLASH_WRITE_BUFFER_STATE: + { + if(BootloaderFlashWriteDataPtr == 0) + { + ResetBootloaderFlashWriteStateMachine(); + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + while(BootloaderFirmwareChunkWriteCount < CurDataChunkSize) + { + + //printf("%d : 0x%x\n",(BootloaderCurFlashWriteAddress-FLASH_BTLDR_FIRMWARE_START_ADDRESS),(unsigned int)*BootloaderFlashWriteDataPtr); + if(SPIFlashWriteByte(BootloaderCurFlashWriteAddress++,*BootloaderFlashWriteDataPtr++,1) == RET_ERROR) + { + printf("Bootloader flash error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + + int cnt = 0; + while(1) + { + if(SPIFlashCheckBusy() == 0) + { + break; + } + if(cnt++ > 200) + { + printf("Bootloader flash write timeout error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + } + + BootloaderFirmwareChunkWriteCount++; + } + + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE; + return BOOTLOADER_FLASH_WRITING_RES; + + // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + // return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + + + break; + } + case BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + // if(SyslogIsBufferEmpty() == RET_OK) + // { + // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + // return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + // } + // else + // { + // return BOOTLOADER_FLASH_WRITING_RES; + // } + } + break; + } + case BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_STATE: + { + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + break; + } + + } +} + +int BootloaderPrintFlashData() +{ + +} + +int BootloaderCheckFlashBootloaderData() +{ + + unsigned char FlashData[700]; + unsigned int FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + unsigned int FileHeaderCode, FirmwareFlags, NbRecords, FirmwareSize, VersionCode, CRC32; + unsigned int ComputedCRC32 = CRC_START_32; + + //SPIFlashReadBuffer(FlashData,700,FlashAddress); + + + printf("Checking Flash bootloader data integrity... \n"); + SPIFlashReadBuffer(FlashData,FLASH_BTLDR_HEADER_SIZE,FlashAddress); + + FileHeaderCode = BootloaderBytesToInt(FlashData); + FirmwareFlags = BootloaderBytesToInt(&FlashData[4]); + NbRecords = BootloaderBytesToInt(&FlashData[8]); + FirmwareSize = BootloaderBytesToInt(&FlashData[12]); + VersionCode = BootloaderBytesToInt(&FlashData[16]); + CRC32 = BootloaderBytesToInt(&FlashData[20]); + + mStoredBootloaderInfo.Firmwareflags = FirmwareFlags; + mStoredBootloaderInfo.NbRecords = NbRecords; + mStoredBootloaderInfo.FirmwareSize = FirmwareSize; + mStoredBootloaderInfo.Versioncode = VersionCode; + mStoredBootloaderInfo.DataCRC32 = CRC32; + + //printf("File Header: Code:[0x%x] - Flags:[0x%x] - Nb Records:[%d] - Firmware Size:[%d] - Version:[0x%x] - CRC32:[0x%x]\n",FileHeaderCode,FirmwareFlags,NbRecords,FirmwareSize,VersionCode,CRC32); + + + if(FileHeaderCode != BOOTLOADER_FILE_HEADER_CODE) + { + // printf("Invalid file header code, aborting\n"); + return RET_ERROR; + } + if(NbRecords == 0) + { +// printf("No records in file (NbRecords = 0), aborting\n"); + return RET_ERROR; + } + + FlashAddress += FLASH_BTLDR_HEADER_SIZE; //point to the start of bootloader data + + int CurRecord = 0; + bool Done = false; + int RecHeader, RecSize, RecStartAddress; + + //Check the header of each sector. + while(Done == false) + { + SPIFlashReadBuffer(FlashData,12,FlashAddress); + RecHeader = BootloaderBytesToInt(FlashData); + RecSize = BootloaderBytesToInt(&FlashData[4]); + RecStartAddress = BootloaderBytesToInt(&FlashData[8]); + FlashAddress += 12; + + + if(RecHeader != BOOTLOADER_RECORD_HEADER_CODE) + { + // printf("Error in record #%d. Invalid header code : [0x%x]\n",CurRecord,RecHeader); + return RET_ERROR; + } + if(RecSize == 0) + { + // printf("Error in record #%d. Invalid record size (RecordSize = 0) \n"); + return RET_ERROR; + } + + // printf("Record #%d OK! Header:[0x%x] - Size:[%d] - Start Address:[0x%x]\n",CurRecord,RecHeader,RecSize,RecStartAddress); + // while(SyslogIsBufferEmpty() == RET_ERROR) + // { + // SyslogTick(); + // TickWiFi(); + // } + + CurRecord++; + if(CurRecord == NbRecords) + { + // Done = true; + // printf("All records checked OK! Computing CRC...\n"); + Done = true; + break; + //return RET_OK; + } + else + { + FlashAddress += RecSize; + } + } + + //Now, compute whole data CRC + FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS + FLASH_BTLDR_HEADER_SIZE; + char Byte; + int i; + for(i = 0; i < FirmwareSize; i++) + { + SPIFlashReadBuffer(&Byte,1,FlashAddress++); + ComputedCRC32 = update_crc_32(ComputedCRC32,Byte); + } + ComputedCRC32 ^= 0xffffffffL; + + if(ComputedCRC32 == CRC32) + { + // printf("CRC32 matches. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check success. Firmware is valid\n"); + return RET_OK; + } + else + { + // printf("CRC32 mismatch. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check failed.\n"); + return RET_ERROR; + } + + + + + + + + return RET_OK; + +} + +int ResetBootloaderFlashWriteStateMachine() +{ + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + BootloaderCurFlashWriteAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BootloaderFlashWritePollCount = 0; + BootloaderFirmwareChunkWriteCount = 0; + BootloaderFlashWriteDataPtr = 0; + BootloaderFirmwareChunkWriteCount = 0; + return RET_OK; +} + +int BootloaderBytesToInt(unsigned char *Bytes) +{ + if(Bytes == 0) + { + return 0; + } + + int Output = Bytes[0]; + Output <<= 8; + Output += Bytes[1]; + Output <<= 8; + Output += Bytes[2]; + Output <<= 8; + Output += Bytes[3]; + + return Output; +} + +int BootloaderIntToBytes(unsigned char *Buf, unsigned int Input) +{ + if(Buf == 0) + { + return 0; + } + + Buf[3] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[2] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[1] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[0] = (unsigned char)(Input & 0xFF); + Input >>= 8; + + return 1; + +} \ No newline at end of file diff --git a/AudioConsole.X/Source/BootloaderInterface.h b/AudioConsole.X/Source/BootloaderInterface.h new file mode 100644 index 0000000..4dc9508 --- /dev/null +++ b/AudioConsole.X/Source/BootloaderInterface.h @@ -0,0 +1,182 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef BOOTLOADERINTERFACE_H +#define BOOTLOADERINTERFACE_H +#include "define.h" + + +#define BOOTLOADER_FILE_HEADER_CODE (int)0xBAADBEEF +#define BOOTLOADER_RECORD_HEADER_CODE (int)0xDEADBEEF +#define BOOTLOADER_FLASH_FIRMWARE_VALIDATOR 0xA8 +#define BOOTLOADER_ENTER_UPLOAD_MODE_VALIDATOR 0x5A + +typedef struct +{ + unsigned char BootloaderAction; + unsigned char BootloaderActionValidator; + +}stBootloaderFlags_t; + +typedef struct +{ + unsigned int Firmwareflags; + unsigned int NbRecords; + unsigned int FirmwareSize; + unsigned int Versioncode; + unsigned int DataCRC32; +}stStoredBootloaderInfo; + +extern stBootloaderFlags_t mBootloaderFlags; +stStoredBootloaderInfo mStoredBootloaderInfo; + +enum eBootloaderFlagsIndex +{ + BOOTLOADER_FLAGS_ACTION_FLAG_INDEX = 0, + BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX, + + + BOOTLOADER_FLAGS_MAX_INDEX = 12 +}; + +enum eBootloaderActionFlagValues +{ + BOOTLOADER_ACTION_JUMP_TO_APP_VALUE = 0, + BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE = 1, + BOOTLOADER_ACTION_ENTER_UPDATE_MODE_VALUE = 2, + + BOOTLOADER_ACTION_MAX_VALUE + +}; + + +enum eBootloaderStates +{ + BOOTLOADER_STANDBY_STATE, + BOOTLOADER_ACTIVE_STATE, + BOOTLOADER_ERASE_FLASH_STATE, + BOOTLOADER_RECEIVING_FIRMWARE_STATE, + BOOTLOADER_SENDING_FIRMWARE_COPY_STATE, + BOOTLOADER_PRINTING_FIRMWARE_STATE, + + BOOTLOADER_MAX_STATE +}; + +enum eBootloaderStateMachineEvents +{ + BOOTLOADER_TICK_EVENT, + BOOTLOADER_NEW_CMD_EVENT, + BOOTLOADER_TIMEOUT_EVENT, + + BOOTLOADER_MAX_EVENT +}; + +enum eBootloaderFlashEraseStates +{ + BOOTLOADER_FLASH_ERASE_SECTOR_STATE, + BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE, + BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE, + BOOTLOADER_FLASH_ERASE_FINISHED_STATE, + BOOTLOADER_FLASH_ERASE_ERROR_STATE, + + BOOTLOADER_FLASH_ERASE_MAX_STATE +}; + +enum eBootloaderFlashEraseResults +{ + BOOTLOADER_FLASH_ERASE_RUNNING_RES, + BOOTLOADER_FLASH_ERASE_FINISHED_RES, + BOOTLOADER_FLASH_ERASE_ERROR_RES, + BOOTLOADER_FLASH_ERASE_ABORT_RES, + + BOOTLOADER_FLASH_ERASE_MAX_RES +}; + +enum eBootloaderFlahsEraseSMEvents +{ + BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT, + BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_ERASE_SM_MAX_EVENT +}; + +enum eBootloaderFlashWriteStates +{ + BOOTLOADER_FLASH_WRITE_STANDBY_STATE, + BOOTLOADER_FLASH_WRITE_BUFFER_STATE, + BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE, + BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE, + BOOTLOADER_FLASH_WRITE_FINISHED_STATE, + BOOTLOADER_FLASH_WRITE_ERROR_STATE, + + BOOTLOADER_FLASH_WRITE_MAX_STATE +}; + +enum eBootloaderFlashWriteResults +{ + BOOTLOADER_FLASH_WRITING_RES, + BOOTLOADER_FLASH_WRITE_FINISHED_RES, + BOOTLOADER_FLASH_WRITE_ERROR_RES, + BOOTLOADER_FLASH_WRITE_ABORT_RES, + + BOOTLOADER_FLASH_WRITE_MAX_RES +}; + +enum eBootloaderFlahsWriteSMEvents +{ + BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT, + BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT, + BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_WRITE_SM_MAX_EVENT +}; + + +enum eBootloaderStateMachineCmds +{ + BOOTLOADER_SM_ACTIVATE_CMD, + BOOTLOADER_SM_ABORT_CMD, + BOOTLOADER_SM_ERASE_FLASH_CMD, + BOOTLOADER_SM_INIT_UPLOAD_CMD, + BOOTLOADER_SM_NEW_DATA_CHUNK_CMD, + BOOTLOADER_SM_UPLOAD_FINISHED_CMD, + BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD, + BOOTLOADER_SM_INVALID_CRC_CMD, + BOOTLOADER_SM_CHECK_FLASH_CMD, + BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD +}; + + +extern unsigned char BootloaderBuffer[300]; + +int BootloaderInterfaceInit(); +void BootloaderExecuteCmd(char Cmd,bool CRCValid); +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC); + + +void BootloaderInterfaceTick(); +void BootloaderInterfaceStateMachine(int Event, int Param); +void BootloaderResetStateMachine(); +void BootloaderActivateBootloader(); +void BootloaderDeactivateBootloader(); + +int BootloaderFlashEraseStateMachine(int event); +int ResetBootloaderFlashEraseStateMachine(); + +int BootloaderFlashWriteStateMachine(int event); +int ResetBootloaderFlashWriteStateMachine(); + +int BootloaderCheckFlashBootloaderData(); +int BootloaderPrintFlashData(); + +int BootloaderBytesToInt(unsigned char *Bytes); +int BootloaderIntToBytes(unsigned char *Buf, unsigned int Input); + + + +#endif /* BOOTLOADERINTERFACE_H */ + diff --git a/AudioConsole.X/Source/BootloaderProtocol.c b/AudioConsole.X/Source/BootloaderProtocol.c new file mode 100644 index 0000000..164db64 --- /dev/null +++ b/AudioConsole.X/Source/BootloaderProtocol.c @@ -0,0 +1,427 @@ +/********************************************************************** + Project: Automatic cat feeder + Date: march 19 2006 + Author: Jean-Fran�ois Martel + Target: PIC 18F252 + Compiler: Microchip mcc18 + Filename: Protocol.c + + File description: Communication protocol implementation. + + + jean-francois.martel@polymtl.ca + **********************************************************************/ +#include "define.h" +#include +#include "ProtocolDefs.h" +#include "BootloaderProtocol.h" +#include "BootloaderInterface.h" +#include "WiFiCtrl.h" +#include "checksum.h" + + +//test +unsigned int BootloaderHeader = 0; +unsigned int BootloaderDataSize = 0; +unsigned int BootloaderDataCtr = 0; +unsigned int BootloaderBufPtr = 0; +unsigned int BootloaderCRC = 0; +unsigned int BtldrComputedCRC = CRC_START_32; +unsigned char *BootloaderRxPtr; +unsigned char BootloaderCommand = 0; +unsigned char BootloaderState = RxHeader1; +const unsigned char *BootloaderDataStartPtr = &BootloaderBuffer[9]; + + +static char MyDeviceID = ID_SPRINKLER_DEVICE; + +void BootloaderProtocolInit(void) +{ + BootloaderProtocolResetStateMachine(); + +} + +void BootloaderProtocolStateMachine(unsigned char Data) +{ + switch(BootloaderState) + { + case Initialization: //Reset all pointers and data... + { + BootloaderDataSize = 0; + BootloaderBufPtr = 0; + BootloaderCommand = 0; + BootloaderCRC = 0; + BootloaderState = RxHeader1; + BtldrComputedCRC = CRC_START_32; + break; + } + case RxHeader1: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xDE + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_1) + { + BootloaderState = RxHeader2; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader2: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xAD + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_2) + { + BootloaderState = RxHeader3; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader3: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xBE + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_3) + { + BootloaderState = RxHeader4; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader4: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xEF + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderHeader != BOOTLOADER_FRAME_HEADER) + { + //TODO, send NACK? + BootloaderProtocolResetStateMachine(); + break; + } + else + { + BootloaderState = RxCmd; + } + + break; + } + case RxCmd: + { + BootloaderCommand = Data; + BootloaderState = RxPayloadSize1; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + break; + } + case RxPayloadSize1: + { + BootloaderDataSize = Data; + BootloaderState = RxPayloadSize2; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + break; + } + case RxPayloadSize2: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + BootloaderState = RxPayloadSize3; + break; + } + case RxPayloadSize3: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + BootloaderState = RxPayloadSize4; + break; + } + case RxPayloadSize4: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderDataSize > MAX_BOOTLOADER_PAYLOAD_SIZE+8) //+8 bytes for the size and index data + { + //TODO, send NACK? + BootloaderProtocolResetStateMachine(); + break; + } + + if(BootloaderDataSize == 0) + { + BootloaderState = RxCRC1; + } + else + { + BootloaderState = RxPayload; + } + break; + } + case RxPayload: //Data size + { + *BootloaderRxPtr = Data; + BootloaderRxPtr++; + + BootloaderDataCtr++; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderDataCtr == BootloaderDataSize) + { + BootloaderState = RxCRC1; + break; + } + + break; + } + case RxCRC1: //Data size + { + BootloaderCRC = Data; + BootloaderState = RxCRC2; + break; + } + case RxCRC2: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + BootloaderState = RxCRC3; + break; + } + case RxCRC3: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + BootloaderState = RxCRC4; + break; + } + case RxCRC4: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + + //TODO: Compute and Compare CRC. + + BtldrComputedCRC ^= 0xffffffffL; + //if(BootloaderCRC != 0xBAADCAFE) + if(BootloaderCRC != BtldrComputedCRC) + { + BootloaderExecuteCmd(BootloaderCommand,0); + BootloaderProtocolResetStateMachine(); + return; + } + + BootloaderExecuteCmd(BootloaderCommand,1); + BootloaderProtocolResetStateMachine(); + break; + } + default: + { + BootloaderProtocolResetStateMachine(); + break; + } + } +} + +void BootloaderProtocolProtocolAnalyzeNewData(unsigned char *DataBuf, int size) +{ + int i; + for(i = 0; i < size; i++) + { + BootloaderProtocolStateMachine(*DataBuf++); + } +} + +void BootloaderProtocolResetStateMachine() +{ + BootloaderDataSize = 0; + BootloaderHeader = 0; + BootloaderBufPtr = 0; + BootloaderCommand = 0; + BootloaderCRC = 0; + BootloaderState = RxHeader1; + BootloaderDataCtr = 0; + BtldrComputedCRC = CRC_START_32; + BootloaderRxPtr = &BootloaderBuffer[0]; +} + +void BootloaderProtocolSendFrame(unsigned char Cmd, int Size) +{ + //Header + BootloaderBuffer[0] = BOOTLOADER_FRAME_HEADER_1; //Header + BootloaderBuffer[1] = BOOTLOADER_FRAME_HEADER_2; + BootloaderBuffer[2] = BOOTLOADER_FRAME_HEADER_3; + BootloaderBuffer[3] = BOOTLOADER_FRAME_HEADER_4; + + BootloaderBuffer[4] = Cmd; + + char nibble = (char)((Size >> 24) &0x000000FF); + BootloaderBuffer[5] = nibble; + + nibble = (char)((Size >> 16) &0x000000FF); + BootloaderBuffer[6] = nibble; + + nibble = (char)((Size >> 8) &0x000000FF); + BootloaderBuffer[7] = nibble; + + nibble = (char)(Size &0x000000FF); + BootloaderBuffer[8] = nibble; + + unsigned int CRC = CRC_START_32; + CRC = crc_32((const unsigned char*)BootloaderBuffer,Size+9); + + unsigned char* CRCPtr = (unsigned char*)BootloaderDataStartPtr + Size; + + nibble = (char)((CRC >> 24) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)((CRC >> 16) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)((CRC >> 8) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)(CRC &0x000000FF); + *CRCPtr++ = nibble; + + // *CRCPtr++ = 0xBA; + // *CRCPtr++ = 0xAD; + // *CRCPtr++ = 0xCA; + // *CRCPtr++ = 0xFE; + + SendBootloaderData(&BootloaderBuffer[0],Size + PROTOCOL_INFO_DATA_SIZE); +} + +unsigned char *BootloaderProtocolGetDataBufferPtr() +{ + return (unsigned char*)BootloaderDataStartPtr; +} + +void BootloaderProtocolSendHeartbeat() +{ + *BootloaderProtocolGetDataBufferPtr() = BOOTLOADER_ACK; + BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1); +} + +void BootloaderProtocolSendACK(unsigned char Cmd) +{ + *BootloaderProtocolGetDataBufferPtr() = BOOTLOADER_ACK; + BootloaderProtocolSendFrame(Cmd,1); +} + +void BootloaderProtocolSendNACK(unsigned char Cmd) +{ + *BootloaderProtocolGetDataBufferPtr() = 0; + BootloaderProtocolSendFrame(Cmd,1); +} + +void BootloaderProtocolSendInitUploadResponse(char result) +{ + int MaxSize = MAX_BOOTLOADER_PAYLOAD_SIZE; + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = result; + if(result == 1) + { + char nibble = (char)((MaxSize >> 24) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((MaxSize >> 16) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((MaxSize >> 8) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)(MaxSize &0x000000FF); + *DataPtr++ = nibble; + } + else + { + *DataPtr++ = 0; + *DataPtr++ = 0; + *DataPtr++ = 0; + *DataPtr++ = 0; + } + + BootloaderProtocolSendFrame(BOOTLOADER_INIT_UPLOAD_RESPONSE,5); +} + +void BootloaderProtocolSendDataChunkResult(char ErrorCode, int ChunkValue) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = ErrorCode; + + char nibble = (char)((ChunkValue >> 24) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((ChunkValue >> 16) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((ChunkValue >> 8) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)(ChunkValue &0x000000FF); + *DataPtr++ = nibble; + + BootloaderProtocolSendFrame(BOOTLOADER_SEND_DATA_CHUNK_RESPONSE,5); +} + +void BootloaderProtocolSendBootloaderState(char State) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = State; + + BootloaderProtocolSendFrame(BOOTLOADER_GET_STATE_RESPONSE,1); +} + +void BootloaderProtocolSendFirmwareUploadResult(char Result) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = Result; + + BootloaderProtocolSendFrame(BOOTLOADER_UPLOAD_FINISHED_RESPONSE,1); +} + +void BootloaderProtocolSendFlashCheckResult(char Result) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = Result; + + BootloaderProtocolSendFrame(BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_RESPONSE,1); +} + +void BootloaderProtocolSendStoredFirmwareInfoResponse(unsigned char* FirmwareData, int size) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + int i = 0; + for(i = 0; i < size; i++) + { + *DataPtr++ = *FirmwareData++; + } + + + BootloaderProtocolSendFrame(BOOTLOADER_GET_STORED_FIRMWARE_INFO_RESPONSE,size); +} \ No newline at end of file diff --git a/AudioConsole.X/Source/BootloaderProtocol.h b/AudioConsole.X/Source/BootloaderProtocol.h new file mode 100644 index 0000000..d8b777e --- /dev/null +++ b/AudioConsole.X/Source/BootloaderProtocol.h @@ -0,0 +1,123 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Fran�ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.h + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ + + +#ifndef BOOTLOADERPROTOCOL_H +#define BOOTLOADERPROTOCOL_H + +//Protocol buffer specific definitions + +#define MAX_BOOTLOADER_PAYLOAD_SIZE 150 +#define BOOTLOADER_FRAME_HEADER 0xDEADBEEF +#define BOOTLOADER_FRAME_HEADER_1 0xDE +#define BOOTLOADER_FRAME_HEADER_2 0xAD +#define BOOTLOADER_FRAME_HEADER_3 0xBE +#define BOOTLOADER_FRAME_HEADER_4 0xEF +#define PROTOCOL_INFO_DATA_SIZE 13 //Header + Cmd + Size + CRC = 13 bytes +//State Machine states +enum States +{ + Initialization, + RxHeader1, + RxHeader2, + RxHeader3, + RxHeader4, + RxCmd, + RxPayloadSize1, + RxPayloadSize2, + RxPayloadSize3, + RxPayloadSize4, + RxPayload, + RxCRC1, + RxCRC2, + RxCRC3, + RxCRC4 +}; + +enum eBootloaderProtocolDataTransferError +{ + BOOTLOADER_CHUNK_TRANSFER_SUCCESS = 1, + BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND = 2, + BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_FAILURE = 3, + BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX = 4, + BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR = 5, + + BOOTLOADER_CHUNK_TRANSFER_MAX_ERROR +}; + +enum eBootloaderProtocolInitTransferError +{ + BOOTLOADEDR_INIT_TRANSFER_ERROR = 0, + BOOTLOADEDR_INIT_TRANSFER_OK = 1, + BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED, + + BOOTLOADEDR_INIT_TRANSFER_MAX_ERROR +}; + +enum eBootloaderUploadResult +{ + BOOTLOADER_UPLOAD_FAILED_UNKNOWN_ERROR = 0, + BOOTLOADER_UPLOAD_SUCCESS = 1, + BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR = 2, + + BOOTLOADER_UPLOAD_MAX_ERROR +}; + +enum eFlashCheckResult +{ + FLASH_CHECK_FAILED = 0, + FLASH_CHECK_SUCCESS = 1, + + FLASH_CHECK_MAX_RESULT +}; + +//enum DEVICES_IDS +//{ +// ID_MASTER, //Master Controller +// ID_CONSOLE, //LCD Console +// ID_PC, //PC +// ID_AV_MUX, //Audio Video Multiplexer +// ID_IR_REMOTE, +// ID_DEADBOLT +//}; + +//enum MESSAGE_IDS +//{ +// TX_NETWORK_ACK = 1, +// RX_GET_STATUS, +// TX_DEADBOLT_STATUS, +// +// MAX_NETWORK_CMD +//}; + +//State machine states definition + +void BootloaderProtocolInit(void); +void BootloaderProtocolStateMachine(unsigned char STATE); +void BootloaderProtocolResetStateMachine(void); +void BootloaderProtocolProtocolAnalyzeNewData(unsigned char *DataBuf, int size); +void BootloaderProtocolSendFrame(unsigned char Cmd, int size); +unsigned char *BootloaderProtocolGetDataBufferPtr(); + +void BootloaderProtocolSendHeartbeat(); +void BootloaderProtocolSendACK(unsigned char Cmd); +void BootloaderProtocolSendNACK(unsigned char Cmd); +void BootloaderProtocolSendInitUploadResponse(char result); +void BootloaderProtocolSendDataChunkResult(char ErrorCode, int ChunkValue); +void BootloaderProtocolSendBootloaderState(char State); +void BootloaderProtocolSendFirmwareUploadResult(char Result); +void BootloaderProtocolSendFlashCheckResult(char Result); +void BootloaderProtocolSendStoredFirmwareInfoResponse(unsigned char* FirmwareData, int size); + +#endif \ No newline at end of file diff --git a/AudioConsole.X/Source/ChaletPowerRelay.c b/AudioConsole.X/Source/ChaletPowerRelay.c new file mode 100644 index 0000000..e6ba667 --- /dev/null +++ b/AudioConsole.X/Source/ChaletPowerRelay.c @@ -0,0 +1,79 @@ +//#include + +#include "ChaletPowerRelay.h" +#include "BoardCfg.h" +#include "timer.h" + +#define PIN_ACTIVE 1 +#define PIN_INACTIVE 0 + +bool PowerRelayState; + +void InitChaletPowerRelay() +{ + POWER_RELAY_ON_PIN = PIN_INACTIVE; + POWER_RELAY_OFF_PIN = PIN_INACTIVE; + PowerRelayState = CHALET_POWER_RELAY_UNKNOWN_STATE; + TimerStop(CHALET_POWER_RELAY_COIL_TIMER); +} + +void ChaletPowerRelayTick() +{ + if(CHALET_12V_PRESENCE_PIN == CHALET_12V_POWER_STATE_ON) + { + if(PowerRelayState == CHALET_POWER_RELAY_OFF_STATE) + { + printf("Inverter turned ON\n"); + } + PowerRelayState = CHALET_POWER_RELAY_ON_STATE; + } + else + { + if(PowerRelayState == CHALET_POWER_RELAY_ON_STATE) + { + printf("Inverter turned OFF\n"); + } + PowerRelayState = CHALET_POWER_RELAY_OFF_STATE; + } + + if(IsTimerRunning(CHALET_POWER_RELAY_COIL_TIMER) == true) + { + if(IsTimerExpired(CHALET_POWER_RELAY_COIL_TIMER)) + { + POWER_RELAY_ON_PIN = PIN_INACTIVE; + POWER_RELAY_OFF_PIN = PIN_INACTIVE; + TimerStop(CHALET_POWER_RELAY_COIL_TIMER); + } + } + + if(IsTimerExpired(CHALET_POWER_RELAY_AUTOTURNOFF_TIMER)) + { + ChaletPowerRelayTurnOff(); + } +} + +void ChaletPowerRelayKickTimer() +{ + TimerStartSeconds(CHALET_POWER_RELAY_AUTOTURNOFF_TIMER,CHALET_OFFLINE_POWER_RELAY_RESET_TIMEOUT); +} + +bool ChaletPowerRelayTurnOn() +{ + POWER_RELAY_ON_PIN = PIN_ACTIVE; + TimerStart(CHALET_POWER_RELAY_COIL_TIMER,CHALET_POWER_RELAY_COIL_TIMEOUT); + // PowerRelayState = CHALET_POWER_RELAY_ON_STATE; + return true; +} + +bool ChaletPowerRelayTurnOff() +{ + POWER_RELAY_OFF_PIN = PIN_ACTIVE; + TimerStart(CHALET_POWER_RELAY_COIL_TIMER,CHALET_POWER_RELAY_COIL_TIMEOUT); + // PowerRelayState = CHALET_POWER_RELAY_OFF_STATE; + return true; +} + +char GetChaletPowerRelayState() +{ + return (char)PowerRelayState; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/ChaletPowerRelay.h b/AudioConsole.X/Source/ChaletPowerRelay.h new file mode 100644 index 0000000..92a94e1 --- /dev/null +++ b/AudioConsole.X/Source/ChaletPowerRelay.h @@ -0,0 +1,37 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef CHALETPOWERRELAY_H +#define CHALETPOWERRELAY_H +#include "define.h" + +#define CHALET_OFFLINE_POWER_RELAY_RESET_TIMEOUT 43200 //43,200 = 12 hours in seconds + +enum eChaletPowerRelayState +{ + CHALET_POWER_RELAY_OFF_STATE = 0, + CHALET_POWER_RELAY_ON_STATE, + CHALET_POWER_RELAY_UNKNOWN_STATE +}; + +#define CHALET_12V_POWER_STATE_ON 0 +#define CHALET_12V_POWER_STATE_OFF 1 + +#define CHALET_POWER_RELAY_COIL_TIMEOUT 200 //ms + +void InitChaletPowerRelay(); + +void ChaletPowerRelayTick(); +bool ChaletPowerRelayTurnOn(); +bool ChaletPowerRelayTurnOff(); +char GetChaletPowerRelayState(); +void ChaletPowerRelayKickTimer(); + + + +#endif /* CHALETPOWERRELAY_H */ + diff --git a/AudioConsole.X/Source/ChaletduinoBoard.c b/AudioConsole.X/Source/ChaletduinoBoard.c new file mode 100644 index 0000000..134f061 --- /dev/null +++ b/AudioConsole.X/Source/ChaletduinoBoard.c @@ -0,0 +1,130 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; + HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + + HEARTBEAT_LED_2_PIN = LED_OFF; + HEARTBEAT_LED_1_PIN = LED_ON; + + LORA_ACTIVITY_LED_PIN_DIR = PIN_OUTPUT; + LORA_ACTIVITY_LED_PIN = LED_OFF; + +// GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; +// GP_DEBUG_1_PIN = 0; +// GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; +// GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + FLASH_SS_PIN_DIR = PIN_OUTPUT; + FLASH_SS_PIN = 1; + + + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; + // WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + // WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + // DOOR_PAD_D0_PIN_DIR = PIN_INPUT; + // DOOR_PAD_D1_PIN_DIR + // DOOR_PAD_D1_PIN + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Falling edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 1; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); +// SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 50000); + SPI2CONbits.ON = 1; + + + //Chalet inverter power relay + POWER_RELAY_ON_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_OFF_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_ON_PIN = 0; + POWER_RELAY_OFF_PIN = 0; + + //Harakiri relay + HARAKIRI_RELAY_ON_PIN_DIR = PIN_OUTPUT; + HARAKIRI_RELAY_ON_PIN= 0; + + //12V presence detection input + CHALET_12V_PRESENCE_PIN_DIR = PIN_INPUT; + + //Battery voltage measurement (analog input) + BATTERY_VOLTAGE_ANALOG_PIN_DIR = PIN_INPUT; + + IEC0bits.INT1IE = 0; + IFS0bits.INT1IF = 0; + INTCONbits.INT1EP = 1; //Rising edge + IPC1bits.INT1IP = 2; + IPC1bits.INT1IS = 1; + // IEC0bits.INT1IE = 1; + + +// OC3CON = 0; +// OC3R = 0; +// OC3RS = 2000; //50% PWM +// OC3CONbits.OCTSEL = 0; +// OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + +//#ifdef __32MX330F064H__ +// RPD2Rbits.RPD2R = 0b1011; //RD2 peripheral selection = OC3 +//#endif +// +// T2CONbits.TON = 0; // Disable Timer +// // T2CONbits.TCS = 0; // Select internal instruction cycle clock +// T2CONbits.TGATE = 0; // Disable Gated Timer mode +// T2CONbits.TCKPS = 0b011; // Select 1:1 Prescaler +// TMR2 = 0x00; // Clear timer register +// +// +// IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level +// IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag +// IEC0bits.T2IE = 0; // Disable Timer 2 interrupt +// T2CONbits.TON = 1; // Start Timer +// +// OC3CONbits.ON = 1; + + + //ADC test + + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + AD1PCFGbits.PCFG1 = 0; + TRISBbits.TRISB1 = PIN_INPUT; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + AD1CHS = 0; + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON3bits.ADCS = 0xF0; + AD1CON3bits.SAMC = 0x01; + AD1CON1bits.ON = 1; + AD1CON1bits.SAMP = 1; + + return RET_OK; +} diff --git a/AudioConsole.X/Source/ChaletduinoV2Board.c b/AudioConsole.X/Source/ChaletduinoV2Board.c new file mode 100644 index 0000000..fb01c24 --- /dev/null +++ b/AudioConsole.X/Source/ChaletduinoV2Board.c @@ -0,0 +1,172 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + + DDPCONbits.JTAGEN = 0; + + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; + HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + + HEARTBEAT_LED_2_PIN = LED_OFF; + HEARTBEAT_LED_1_PIN = LED_ON; + + // LORA_ACTIVITY_LED_PIN_DIR = PIN_OUTPUT; + // LORA_ACTIVITY_LED_PIN = LED_OFF; + + // GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_1_PIN = 0; + // GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + + //////////////// SPI FLASH ////////////////// + + FLASH_SS_PIN_DIR = PIN_OUTPUT; + FLASH_SS_PIN = 1; + + /////////////////////////// WIFI /////////////////// + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; + // WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + // WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Falling edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 1; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); + // SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 50000); + SPI2CONbits.ON = 1; + + + + + //ADC Config + + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + AD1PCFGbits.PCFG1 = 0; + AD1PCFGbits.PCFG2 = 0; + // TRISBbits.TRISB1 = PIN_INPUT; + //TRISBbits.TRISB2 = PIN_INPUT; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + // AD1CHS = 0; + // AD1CHSbits.CH0SA = 1; //AN1 + // AD1CON3bits.ADCS = 0xF0; + // AD1CON3bits.SAMC = 0x01; + // AD1CON1bits.ON = 1; + // AD1CON1bits.SAMP = 1; + + ONBOARD_LED1_PIN_DIR = PIN_OUTPUT; + ONBOARD_LED1_PIN = LED_OFF; + ONBOARD_LED2_PIN_DIR = PIN_OUTPUT; + ONBOARD_LED2_PIN = LED_OFF; + ONBOARD_LED3_PIN_DIR = PIN_OUTPUT; + ONBOARD_LED3_PIN = LED_OFF; + ONBOARD_LED7_PIN_DIR = PIN_OUTPUT; + ONBOARD_LED7_PIN = LED_OFF; + + PUSH_BUTTON_LED1_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED1_PIN = LED_OFF; + PUSH_BUTTON_LED2_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED2_PIN = LED_OFF; + PUSH_BUTTON_LED3_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED3_PIN = LED_OFF; + PUSH_BUTTON_LED4_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED4_PIN = LED_OFF; + PUSH_BUTTON_LED5_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED5_PIN = LED_OFF; + PUSH_BUTTON_LED6_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED6_PIN = LED_OFF; + PUSH_BUTTON_LED7_PIN_DIR = PIN_OUTPUT; + PUSH_BUTTON_LED7_PIN = LED_OFF; + + PUSH_BUTTON_INPUT1_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT2_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT3_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT4_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT5_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT6_PIN_DIR = PIN_INPUT; + PUSH_BUTTON_INPUT7_PIN_DIR = PIN_INPUT; + + + VU1_DAC_SYNC_PIN_DIR = PIN_OUTPUT; + VU1_DAC_SYNC_PIN = 1; + VU1_BACKLIGHT_PIN_DIR = PIN_OUTPUT; + VU1_BACKLIGHT_PIN = LED_OFF; + + VU2_DAC_SYNC_PIN_DIR = PIN_OUTPUT; + VU2_DAC_SYNC_PIN = 1; + VU2_BACKLIGHT_PIN_DIR = PIN_OUTPUT; + VU2_BACKLIGHT_PIN = LED_OFF; + + BUREAU_VOL_POT_CW_PIN_DIR = PIN_INPUT; + BUREAU_VOL_POT_CCW_PIN_DIR = PIN_INPUT; + + BUREAU_VOL_POT_CCW_PIN_DIR = PIN_INPUT; + BUREAU_VOL_POT_CCW_PIN_DIR = PIN_INPUT; + + ////// MISC UNUSED STUFF /////////// + // IEC0bits.INT1IE = 0; + // IFS0bits.INT1IF = 0; + // INTCONbits.INT1EP = 1; //Rising edge + // IPC1bits.INT1IP = 2; + // IPC1bits.INT1IS = 1; + // IEC0bits.INT1IE = 1; + + + // OC3CON = 0; + // OC3R = 0; + // OC3RS = 2000; //50% PWM + // OC3CONbits.OCTSEL = 0; + // OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + + //#ifdef __32MX330F064H__ + // RPD2Rbits.RPD2R = 0b1011; //RD2 peripheral selection = OC3 + //#endif + // + // T2CONbits.TON = 0; // Disable Timer + // // T2CONbits.TCS = 0; // Select internal instruction cycle clock + // T2CONbits.TGATE = 0; // Disable Gated Timer mode + // T2CONbits.TCKPS = 0b011; // Select 1:1 Prescaler + // TMR2 = 0x00; // Clear timer register + // + // + // IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level + // IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag + // IEC0bits.T2IE = 0; // Disable Timer 2 interrupt + // T2CONbits.TON = 1; // Start Timer + // + // OC3CONbits.ON = 1; + + + RTCCONbits.ON = 1; + + return RET_OK; +} diff --git a/AudioConsole.X/Source/CurrentSensor.c b/AudioConsole.X/Source/CurrentSensor.c new file mode 100644 index 0000000..8e059f5 --- /dev/null +++ b/AudioConsole.X/Source/CurrentSensor.c @@ -0,0 +1,15 @@ + +#include "define.h" +#include "CurrentSensor.h" +#include "ina219.h" + +int CurrentSensorInit() +{ + ina219SetCalibration_16V_200mA(); + return RET_OK; +} + +int GetSolarPanelCurrent() +{ + return ina219GetCurrent(); +} \ No newline at end of file diff --git a/AudioConsole.X/Source/CurrentSensor.h b/AudioConsole.X/Source/CurrentSensor.h new file mode 100644 index 0000000..8b79e4a --- /dev/null +++ b/AudioConsole.X/Source/CurrentSensor.h @@ -0,0 +1,16 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef CURRENTSENSOR_H +#define CURRENTSENSOR_H + +int CurrentSensorInit(); + +int GetSolarPanelCurrent(); + +#endif /* CURRENTSENSOR_H */ + diff --git a/AudioConsole.X/Source/DigitalIO.c b/AudioConsole.X/Source/DigitalIO.c new file mode 100644 index 0000000..f9ff8f8 --- /dev/null +++ b/AudioConsole.X/Source/DigitalIO.c @@ -0,0 +1,42 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "DigitalIO.h" +//#include "define.h" + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InitDigitalIO(void) +{ + + +} + + +//EOF + + diff --git a/AudioConsole.X/Source/DigitalIO.h b/AudioConsole.X/Source/DigitalIO.h new file mode 100644 index 0000000..1371b6f --- /dev/null +++ b/AudioConsole.X/Source/DigitalIO.h @@ -0,0 +1,36 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef DIGITAL_IO_H +#define DIGITAL_IO_H +#include "BoardCfg.h" + + + + +#endif +//EOF + + diff --git a/AudioConsole.X/Source/FatFS/diskio.c b/AudioConsole.X/Source/FatFS/diskio.c new file mode 100644 index 0000000..f94ac20 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/diskio.c @@ -0,0 +1,225 @@ +/*-----------------------------------------------------------------------*/ +/* 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 "diskio.h" /* FatFs lower layer API */ + +/* Definitions of physical drive number for each drive */ +#define DEV_RAM 1 /* Example: Map Ramdisk to physical drive 0 */ +#define DEV_MMC 0 /* Example: Map MMC/SD card to physical drive 1 */ +#define DEV_USB 2 /* Example: Map USB MSD to physical drive 2 */ + + +/*-----------------------------------------------------------------------*/ +/* Get Drive Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + int result; + + switch (pdrv) { + case DEV_RAM : + // result = RAM_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + // result = MMC_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + // result = USB_disk_status(); + + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + int result; + + switch (pdrv) { + case DEV_RAM : + //result = RAM_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + // result = MMC_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + // result = USB_disk_initialize(); + + // translate the reslut code here + + return stat; + } + 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; + int result; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + // result = RAM_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + // result = MMC_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + // result = USB_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + } + + 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; + int result; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + // result = RAM_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + // result = MMC_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + // result = USB_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + } + + 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; + int result; + + switch (pdrv) { + case DEV_RAM : + + // Process of the command for the RAM drive + + return res; + + case DEV_MMC : + + // Process of the command for the MMC/SD card + + return res; + + case DEV_USB : + + // Process of the command the USB drive + + return res; + } + + return RES_PARERR; +} + diff --git a/AudioConsole.X/Source/FatFS/diskio.h b/AudioConsole.X/Source/FatFS/diskio.h new file mode 100644 index 0000000..f083cc7 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/diskio.h @@ -0,0 +1,101 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" + + +#define _USE_WRITE 1 +#define _USE_IOCTL 1 + +#define _USE +/* 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); + +void disk_timerproc(void); + + +/* 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 fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _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 */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_FORMAT 5 /* Create physical format on the media */ +#define CTRL_POWER_IDLE 6 /* Put the device idle state */ +#define CTRL_POWER_OFF 7 /* Put the device off state */ +#define CTRL_LOCK 8 /* Lock media removal */ +#define CTRL_UNLOCK 9 /* Unlock media removal */ +#define CTRL_EJECT 10 /* Eject media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#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 */ +#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 */ + +/* MMC card type flags (MMC_GET_TYPE) */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ + +/* 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/AudioConsole.X/Source/FatFS/ff.c b/AudioConsole.X/Source/FatFS/ff.c new file mode 100644 index 0000000..d29601d --- /dev/null +++ b/AudioConsole.X/Source/FatFS/ff.c @@ -0,0 +1,6555 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module R0.13a / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2017, 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" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if FF_DEFINED != 89352 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* 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 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 */ + + +/* 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 */ + + +/* 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 */ + + +/* 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) */ + + +/* 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; /* File system mount ID */ + +#if FF_FS_RPATH != 0 && FF_VOLUMES >= 2 +static BYTE CurrVol; /* Current drive */ +#endif + +#if FF_FS_LOCK != 0 +static FILESEM Files[FF_FS_LOCK]; /* Open object lock semaphores */ +#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 < 12 || FF_SFN_BUF < 12 || FF_LFN_BUF < FF_SFN_BUF +#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +#endif +#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2 +#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 + +#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++; + 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 byte */ + 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 >= 0x10000) 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; + +#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, SS(fs)); + 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) { + 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->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; /* (assuming bitmap is located top of the cluster heap) */ + 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->database + clst / 8 / SS(fs); /* Sector address (assuming bitmap is located top of the cluster heap) */ + 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: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, SS(fs)); /* 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); szb > SS(fs) && !(ibuf = ff_memalloc(szb)); 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 (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 (dp->sect == 0 || ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE; /* Report EOT when offset has reached max value */ + + 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 || 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) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= FF_MAX_LFN) 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 */ + 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; + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip 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 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 upper-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 ( + BYTE dat, /* Byte to be calculated */ + DWORD sum /* Previous sum */ +) +{ + 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 = hs = 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 UTF-16 or UTF-8 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 have 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 85 entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0x85) 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 C0 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] != 0xC0) 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 C1 entries */ + i = 2 * SZDIRE; /* C1 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] != 0xC1) 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 85,C0 entry */ + mem_set(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = 0x85; /* 85 entry */ + dirb[1 * SZDIRE + XDIR_Type] = 0xC0; /* C0 entry */ + + /* Create C1 entries */ + i = SZDIRE * 2; /* Top of C1 entries */ + nlen = nc1 = 0; wc = 1; + do { + dirb[i++] = 0xC1; dirb[i++] = 0; /* Entry type C1 */ + 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 a, c; +#if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; /* Test for the entry type */ + if (c == 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 (c == 0x83) break; /* Volume label entry? */ + } else { + if (c == 0x85) { /* 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 = a = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if FF_USE_LFN /* LFN configuration */ + if (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (c == 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 (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~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 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? */ + 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 + 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 UTF-16 or UTF-8 */ + 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; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ + wc = (WCHAR)fno->altname[si]; + if (IsUpper(wc) && (dp->dir[DIR_NTres] & ((si >= 9) ? NS_EXT : NS_BODY))) 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) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + UINT i; + int vol = -1; +#if FF_STR_VOLUME_ID /* Find string drive id */ + static const char* const volid[] = {FF_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif + + + if (*path != 0) { /* If the pointer is not a null */ + for (tt = *path; (UINT)*tt >= (FF_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find a colon in the path */ + if (*tt == ':') { /* If a colon is exist in the path name */ + tp = *path; + i = *tp++; + if (IsDigit(i) && tp == tt) { /* Is there a numeric drive id + colon? */ + if ((i -= '0') < FF_VOLUMES) { /* If drive id is found, get the value and strip it */ + vol = (int)i; + *path = ++tt; + } + } +#if FF_STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ + i = 0; tt++; + do { + sp = volid[i]; tp = *path; + do { /* Compare a string drive id with path name */ + c = *sp++; tc = *tp++; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < FF_VOLUMES); /* Repeat for each id until pattern match */ + if (i < FF_VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = tt; + } + } +#endif + } else { /* No volume id and use default drive */ +#if FF_FS_RPATH != 0 && FF_VOLUMES >= 2 + vol = CurrVol; /* Current drive */ +#else + vol = 0; /* Drive 0 */ +#endif + } + } + return vol; +} + + + + +/*-----------------------------------------------------------------------*/ +/* 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 placed here even if the sector size is >512) */ + +#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: any 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 and SFD. */ + 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; + + 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); + + /* Check if bitmap location is in assumption (at the first cluster) */ + if (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR; + for (i = 0; i < SS(fs); i += SZDIRE) { + if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */ + } + if (i == SS(fs)) return FR_NO_FILESYSTEM; +#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 */ + 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, FF_MAX_SS); /* 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 all data 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 */ +/*-----------------------------------------------------------------------*/ + +#if FF_VOLUMES >= 2 +FRESULT f_chdrive ( + const TCHAR* path /* Drive number */ +) +{ + 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; +} +#endif + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + 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) { + fs->cdir = dj.obj.sclust; /* It is the start directory itself */ +#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; + } + + LEAVE_FF(fs, res); +} + + +#if FF_FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMBUF + + + *buff = 0; + /* Get logical drive */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + 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++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; + buff[--i] = '/'; + } + } + tp = buff; + if (res == FR_OK) { +#if FF_VOLUMES >= 2 + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; +#endif + if (i == len) { /* Root-directory */ + *tp++ = '/'; + } else { /* Sub-directroy */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_NAMBUF(); + } + + 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->database; /* Assuming bitmap starts at cluster 2 */ + 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; + FATFS *fs; + BYTE *dir; + DWORD dcl, pcl, tm; + 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 (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(&dj.obj, 0); /* Allocate a cluster for the new directory table */ + dj.obj.objsize = (DWORD)fs->csize * SS(fs); + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) res = sync_window(fs); /* Flush FAT */ + tm = GET_FATTIME(); + if (res == FR_OK) { /* Initialize the new directory table */ + res = dir_clear(fs, dcl); /* Clean up the new table */ + if (res == FR_OK && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT)) { /* Create dot entries (FAT only) */ + dir = fs->win; + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + st_dword(dir + DIR_ModTime, tm); + st_clust(fs, dir, dcl); + mem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create ".." entry */ + dir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + st_clust(fs, dir + SZDIRE, pcl); + fs->wflag = 1; + } + } + if (res == FR_OK) { + res = dir_register(&dj); /* Register the object to the 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)dj.obj.objsize); /* File size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + dir = dj.dir; + st_dword(dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dir, dcl); /* Table start cluster */ + dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } else { + remove_chain(&dj.obj, dcl, 0); /* Could not register, remove cluster chain */ + } + } + 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); + if (wc != 0) wc = put_utf(wc, &label[di], 4); + 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 (*label) { /* Create volume label in directory form */ + 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 (*label) { /* Create volume label in directory form */ +#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] = 0x83; /* Create 83 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)); 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 >= 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 = si = i = j = 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 += 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] = 0x83; /* 83 entry (volume label) */ + buf[SZDIRE * 1 + 0] = 0x81; /* 81 entry (allocation bitmap) */ + st_dword(buf + SZDIRE * 1 + 20, 2); + st_dword(buf + SZDIRE * 1 + 24, szb_bit); + buf[SZDIRE * 2 + 0] = 0x82; /* 82 entry (up-case table) */ + st_dword(buf + SZDIRE * 2 + 4, sum); + st_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]); + st_dword(buf + SZDIRE * 2 + 24, szb_case); + 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 = 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[2]; + UINT rc; + WCHAR wc; +#if FF_USE_LFN && ((FF_LFN_UNICODE == 1 && FF_STRF_ENCODE == 3) || (FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3)) + DWORD dc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE == 1 && FF_STRF_ENCODE == 3 + UINT ct; +#endif + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* UTF-16 output */ +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + while (nc < len - 1) { + 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]; + } + wc = ff_oem2uni(wc, CODEPAGE); + if (wc == 0) continue; +#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 /* Read a character in UTF-16LE/BE */ + while (nc < len - 1) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; +#elif FF_STRF_ENCODE == 3 /* Read a character in UTF-8 */ + while (nc < len - 2) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (dc >= 0x80) { + ct = 0; + if ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; } + if ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; } + if ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; } + if (ct == 0) continue; + do { + f_read(fp, s, 1, &rc); + if (rc != 1 || (s[0] & 0xC0) != 0x80) break; + dc = dc << 6 | (s[0] & 0x3F); + } while (--ct); + if (ct || dc < 0x80 || dc >= 0x110000) continue; + } + if (dc >= 0x10000) { + wc = (WCHAR)(0xD800 | ((dc >> 10) - 0x40)); + *p++ = wc; nc++; + wc = (WCHAR)(0xDC00 | (dc & 0x3FF)); + } else { + wc = (WCHAR)dc; + } +#endif + /* Output it in UTF-16 encoding */ + if (FF_USE_STRFUNC == 2 && wc == '\r') continue; + *p++ = wc; nc++; + if (wc == '\n') break; + } + +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3 /* UTF-8 output */ + while (nc < len - 4) { +#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; +#else /* Read a character in UTF-16LE/BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + dc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; + if (IsSurrogate(dc)) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; + if (!IsSurrogateH(dc) || !IsSurrogateL(wc)) continue; + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); + } +#endif + /* Output it in UTF-8 encoding */ + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; + if (dc < 0x80) { /* 1-byte */ + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') break; + } 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; + } + } + } + } + +#else /* Byte-by-byte without any conversion (ANSI/OEM API or UTF-8 to UTF-8) */ + while (nc < len - 1) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (FF_USE_STRFUNC == 2 && wc == '\r') continue; + *p++ = (TCHAR)wc; nc++; + if (wc == '\n') break; + } +#endif + + *p = 0; + return nc ? buff : 0; /* When no data read (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 == 1 || (FF_LFN_UNICODE == 2 && (FF_STRF_ENCODE != 3))) + WCHAR hs, wc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3 + DWORD dc; + TCHAR *tp; +#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 count */ + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* UTF-16 input */ + if (IsSurrogateH(c)) { + pb->hs = c; return; + } + wc = c; hs = pb->hs; pb->hs = 0; + if (hs != 0) { + if (!IsSurrogateL(wc)) hs = 0; + } else { + if (IsSurrogateL(wc)) return; + } +#if FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + if (hs != 0) { /* 4-byte */ + nc += 4; + 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 */ + nc++; + pb->buf[i++] = (BYTE)wc; + } else { + if (wc < 0x800) { /* 2-byte */ + nc += 2; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + } else { /* 3-byte */ + nc += 3; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } +#endif +#else /* 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 sequence? */ + return; + } + } +#if FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + pb->buf[i++] = pb->bs[0]; nc++; + if (pb->bs[0] >= 0xC0) { + pb->buf[i++] = pb->bs[1]; nc++; + } + if (pb->bs[0] >= 0xE0) { + pb->buf[i++] = pb->bs[2]; nc++; + } + if (pb->bs[0] >= 0xF0) { + pb->buf[i++] = pb->bs[3]; nc++; + } +#else /* Write it in UTF-16 or ANSI/OEM */ + tp = (TCHAR*)pb->bs; + dc = tchar2uni(&tp); /* UTF-8 ==> UTF-16 */ + if (dc == 0xFFFFFFFF) return; + wc = (WCHAR)dc; + hs = (WCHAR)(dc >> 16); +#endif +#endif +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 && FF_STRF_ENCODE != 3 +#if 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; + nc++; +#elif FF_STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + if (hs != 0) { + pb->buf[i++] = (BYTE)hs; + pb->buf[i++] = (BYTE)(hs >> 8); + nc++; + } + pb->buf[i++] = (BYTE)wc; + pb->buf[i++] = (BYTE)(wc >> 8); + nc++; +#else /* Write a character 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; nc++; +#endif +#endif + +#else /* ANSI/OEM input */ + pb->buf[i++] = (BYTE)c; + nc++; +#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; +} + + +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 */ + diff --git a/AudioConsole.X/Source/FatFS/ff.h b/AudioConsole.X/Source/FatFS/ff.h new file mode 100644 index 0000000..da57ca8 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/ff.h @@ -0,0 +1,366 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem module R0.13a / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2017, 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 89352 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if FF_DEFINED != FFCONF_DEF +#error Wrong configuration file (ffconf.h). +#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 + + + +/* 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 < 0 || FF_LFN_UNICODE > 2) +#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 +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* Filesystem object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* Filesystem type (0:N/A) */ + BYTE pdrv; /* Physical drive number */ + 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 */ + 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:flagmented 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 szf, 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 */ diff --git a/AudioConsole.X/Source/FatFS/ffconf.h b/AudioConsole.X/Source/FatFS/ffconf.h new file mode 100644 index 0000000..643a286 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/ffconf.h @@ -0,0 +1,283 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - Configuration file +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 89352 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ 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 0 +/* 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 0 +/* 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 437 +/* 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 0 +#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) +/ +/ 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 0 +/* 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 1 +/* 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 string support for volume ID. +/ When FF_STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to FF_VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#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) +/ When enable exFAT, also LFN needs to be enabled. +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2017 +/* The option FF_FS_NORTC switches timestamp functiton. 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. All objects 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. */ + + +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t HANDLE +/* 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. */ + +/* #include // O/S definitions */ + + + +/*--- End of configuration options ---*/ diff --git a/AudioConsole.X/Source/FatFS/ffsystem.c b/AudioConsole.X/Source/FatFS/ffsystem.c new file mode 100644 index 0000000..b0170a8 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/ffsystem.c @@ -0,0 +1,171 @@ +/*------------------------------------------------------------------------*/ +/* Sample Code of OS Dependent Functions for FatFs */ +/* (C)ChaN, 2017 */ +/*------------------------------------------------------------------------*/ + + +#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 on 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 for null) */ +) +{ + free(mblock); /* Free the memory block with POSIX API */ +} + +#endif + + + +#if 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]; /* CMSIS-RTOS */ + + +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/AudioConsole.X/Source/FatFS/ffunicode.c b/AudioConsole.X/Source/FatFS/ffunicode.c new file mode 100644 index 0000000..901affe --- /dev/null +++ b/AudioConsole.X/Source/FatFS/ffunicode.c @@ -0,0 +1,15586 @@ +/*------------------------------------------------------------------------*/ +/* Unicode handling functions for FatFs R0.13a */ +/*------------------------------------------------------------------------*/ +/* 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) 2017, 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 is blanked when non-LFN configuration */ + +#if FF_DEFINED != 89352 /* 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 a valid code? */ + 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, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code? */ + 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, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a 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 table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + for (c = 0; c < 0x80 && uc != p[c]; c++) ; /* Find OEM code in the table */ + c = (c + 0x80) & 0xFF; + } + } else { /* DBCS */ + switch (cp) { + 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 a 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 */ +) +{ + /* Compressed upper conversion table */ + static const WORD cvt1[] = { /* 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 + }; + static const WORD cvt2[] = { /* 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 + }; + const WORD *p; + WORD uc, bc, nc, cmd; + + + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WORD)uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || uc < bc) break; + 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) p += nc; + } + uni = uc; + } + + return uni; +} + + +#endif /* #if FF_USE_LFN */ diff --git a/AudioConsole.X/Source/FatFS/integer.h b/AudioConsole.X/Source/FatFS/integer.h new file mode 100644 index 0000000..4fcf5c4 --- /dev/null +++ b/AudioConsole.X/Source/FatFS/integer.h @@ -0,0 +1,38 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef FF_INTEGER +#define FF_INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include +#include +typedef unsigned __int64 QWORD; + + +#else /* Embedded platform */ + +/* These types MUST be 16-bit or 32-bit */ +typedef int INT; +typedef unsigned int UINT; + +/* This type MUST be 8-bit */ +typedef unsigned char BYTE; + +/* These types MUST be 16-bit */ +typedef short SHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types MUST be 32-bit */ +typedef long LONG; +typedef unsigned long DWORD; + +/* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */ +typedef unsigned long long QWORD; + +#endif + +#endif diff --git a/AudioConsole.X/Source/FatFS/mmc_drv.c b/AudioConsole.X/Source/FatFS/mmc_drv.c new file mode 100644 index 0000000..4e67eed --- /dev/null +++ b/AudioConsole.X/Source/FatFS/mmc_drv.c @@ -0,0 +1,660 @@ +/*------------------------------------------------------------------------/ +/ MMCv3/SDv1/SDv2+ (in SPI mode) control module +/-------------------------------------------------------------------------/ +/ +/ Copyright (C) 2014, 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. +/ +/-------------------------------------------------------------------------*/ + + +//#include +//#include +#include "DigitalIO.h" +#include "diskio.h" + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk); +static void set_fast_clk(void); +static void set_slow_clk(void); + + +/* Socket controls (Platform dependent) */ +#define CS_LOW() SD_SPI_CS_PIN = 0 /* MMC CS = L */ +#define CS_HIGH() SD_SPI_CS_PIN = 1 /* MMC CS = H */ +#define MMC_CD (true) /* Card detected (yes:true, no:false, default:true) */ +#define MMC_WP (false) /* Write protected (yes:true, no:false, default:false) */ + +/* SPI bit rate controls */ +#define FCLK_SLOW() set_slow_clk() /* Set slow clock for card initialization (100k-400k) */ +#define FCLK_FAST() set_fast_clk() /* Set fast clock for generic read/write */ + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +/* Definitions for MMC/SDC command */ +#define CMD0 (0) /* GO_IDLE_STATE */ +#define CMD1 (1) /* SEND_OP_COND */ +#define ACMD41 (41|0x80) /* SEND_OP_COND (SDC) */ +#define CMD8 (8) /* SEND_IF_COND */ +#define CMD9 (9) /* SEND_CSD */ +#define CMD10 (10) /* SEND_CID */ +#define CMD12 (12) /* STOP_TRANSMISSION */ +#define ACMD13 (13|0x80) /* SD_STATUS (SDC) */ +#define CMD16 (16) /* SET_BLOCKLEN */ +#define CMD17 (17) /* READ_SINGLE_BLOCK */ +#define CMD18 (18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (23) /* SET_BLOCK_COUNT */ +#define ACMD23 (23|0x80) /* SET_WR_BLK_ERASE_COUNT (SDC) */ +#define CMD24 (24) /* WRITE_BLOCK */ +#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (55) /* APP_CMD */ +#define CMD58 (58) /* READ_OCR */ + + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +UINT Timer1, Timer2; /* 1000Hz decrement timer */ + +static +UINT CardType; + + + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk) +{ + unsigned int brg; + + brg = pb_clk / (2 * spi_clk); + + if(pb_clk % (2 * spi_clk)) + brg++; + + if(brg > 0x100) + brg = 0x100; + + if(brg) + brg--; + + return (unsigned char) brg; +} + +/*-----------------------------------------------------------------------*/ +/* Interface Controls (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions. */ + +static void power_on (void) +{ + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 0; + SPI2CONbits.CKP = 1; + + FCLK_SLOW(); + + SPI2CONbits.ON = 1; + + return; +} + +static void power_off (void) +{ + SPI2CONbits.ON = 0; /* Disable SPI2 */ +} + +static void set_slow_clk(void) +{ + unsigned WasON = SPI2CONbits.ON; + + SPI2CONbits.ON = 0; + SPI2BRG = SPICalculateBRG(80000000,40000); + + SPI2CONbits.ON = WasON; +} + +static void set_fast_clk(void) +{ + unsigned WasON = SPI2CONbits.ON; + SPI2CONbits.ON = 0; + + SPI2BRG = SPICalculateBRG(80000000,20000000); + + SPI2CONbits.ON = WasON; +} + +/*-----------------------------------------------------------------------*/ +/* SPI Transactions (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +/* Single byte SPI transaction */ +static BYTE xchg_spi (BYTE dat) +{ + +#ifndef USE_PINGUINO + while( SPI2STATbits.SPITBF == 1 ) + { + } +#endif + // ---------------- + // sending data + // ---------------- + SPI2BUF = dat; + + while(SPI2STATbits.SPIRBF == 0) + { + } + + + return (BYTE)SPI2BUF; /* Get received byte */ +} + + +/* Multi-byte SPI transaction (transmit) */ +static +void xmit_spi_multi ( + const BYTE* buff, /* Data to be sent */ + UINT cnt /* Number of bytes to send */ +) +{ + do { + SPI2BUF = *buff++; /* Initiate an SPI transaction */ + while (SPI2STATbits.SPIRBF == 0) ; /* Wait for end of the SPI transaction */ + SPI2BUF; /* Discard received byte */ + SPI2BUF = *buff++; + while (SPI2STATbits.SPIRBF == 0) ; + SPI2BUF; + } while (cnt -= 2); +} + + +/* Multi-byte SPI transaction (receive) */ +static +void rcvr_spi_multi ( + BYTE* buff, /* Buffer to store received data */ + UINT cnt /* Number of bytes to receive */ +) +{ + do { + SPI2BUF = 0xFF; /* Initiate an SPI transaction */ + while (SPI2STATbits.SPIRBF == 0) ; /* Wait for end of the SPI transaction */ + *buff++ = SPI2BUF; /* Get received byte */ + SPI2BUF = 0xFF; + while (SPI2STATbits.SPIRBF == 0) ; + *buff++ = SPI2BUF; + } while (cnt -= 2); +} + + + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +int wait_ready (void) +{ + BYTE d; + + Timer2 = 500; /* Wait for ready in timeout of 500ms */ + do { + d = xchg_spi(0xFF); + } while ((d != 0xFF) && Timer2); + + return (d == 0xFF) ? 1 : 0; +} + + + +/*-----------------------------------------------------------------------*/ +/* Deselect the card and release SPI bus */ +/*-----------------------------------------------------------------------*/ + +static +void deselect (void) +{ + CS_HIGH(); /* Set CS# high */ + xchg_spi(0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Select the card and wait ready */ +/*-----------------------------------------------------------------------*/ + +static +int select (void) /* 1:Successful, 0:Timeout */ +{ + CS_LOW(); /* Set CS# low */ + xchg_spi(0xFF); /* Dummy clock (force DO enabled) */ + + if (wait_ready()) return 1; /* Wait for card ready */ + + deselect(); + return 0; /* Timeout */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +int rcvr_datablock ( /* 1:OK, 0:Failed */ + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be multiple of 4) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = xchg_spi(0xFF); + } while ((token == 0xFF) && Timer1); + + if(token != 0xFE) return 0; /* If not valid data token, retutn with error */ + + rcvr_spi_multi(buff, btr); /* Receive the data block into buffer */ + xchg_spi(0xFF); /* Discard CRC */ + xchg_spi(0xFF); + + return 1; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _USE_WRITE +static +int xmit_datablock ( /* 1:OK, 0:Failed */ + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data token */ +) +{ + BYTE resp; + + + if (!wait_ready()) return 0; + + xchg_spi(token); /* Xmit a token */ + if (token != 0xFD) { /* Not StopTran token */ + xmit_spi_multi(buff, 512); /* Xmit the data block to the MMC */ + xchg_spi(0xFF); /* CRC (Dummy) */ + xchg_spi(0xFF); + resp = xchg_spi(0xFF); /* Receive a data response */ + if ((resp & 0x1F) != 0x05) return 0; /* If not accepted, return with error */ + } + + return 1; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (cmd & 0x80) { /* ACMD is the command sequense of CMD55-CMD */ + cmd &= 0x7F; + res = send_cmd(CMD55, 0); + if (res > 1) return res; + } + + /* Select the card and wait for ready except to stop multiple block read */ + if (cmd != CMD12) { + deselect(); + if (!select()) return 0xFF; + } + + /* Send command packet */ + xchg_spi(0x40 | cmd); /* Start + Command index */ + xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xchg_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xchg_spi((BYTE)arg); /* Argument[7..0] */ + n = 0x01; /* Dummy CRC + Stop */ + if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) + Stop */ + if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) + Stop */ + xchg_spi(n); + + /* Receive command response */ + if (cmd == CMD12) xchg_spi(0xFF); /* Skip a stuff byte on stop to read */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do { + res = xchg_spi(0xFF); + } while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + + + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber (0) */ +) +{ + if (pdrv != 0) return STA_NOINIT; /* Supports only single drive */ + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber (0) */ +) +{ + BYTE n, cmd, ty, ocr[4]; + + + if (pdrv != 0) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Initialize memory card interface */ + FCLK_SLOW(); + for (n = 10; n; n--) xchg_spi(0xFF); /* 80 dummy clocks */ + + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 1000; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get trailing return value of R7 resp */ + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + while (Timer1 && send_cmd(ACMD41, 0x40000000)); /* Wait for leaving idle state (ACMD41 with HCS bit) */ + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); + ty = (ocr[0] & 0x40) ? CT_SD2|CT_BLOCK : CT_SD2; /* SDv2+ */ + } + } + } else { /* SDv1 or MMCv3 */ + if (send_cmd(ACMD41, 0) <= 1) { + ty = CT_SD1; cmd = ACMD41; /* SDv1 */ + } else { + ty = CT_MMC; cmd = CMD1; /* MMCv3 */ + } + while (Timer1 && send_cmd(cmd, 0)); /* Wait for leaving idle state */ + if (!Timer1 || send_cmd(CMD16, 512) != 0) ty = 0; /* Set read/write block length to 512 */ + } + } + CardType = ty; + deselect(); + + if (ty) { /* Function succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + FCLK_FAST(); + } else { /* Function failed */ + power_off(); /* Deinitialize interface */ + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Sector count (1..128) */ +) +{ + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) { + count = 0; + } + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _USE_WRITE +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Sector count (1..128) */ +) +{ + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) { + count = 0; + } + } + else { /* Multiple block write */ + if (CardType & CT_SDC) send_cmd(ACMD23, count); + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) count = 1; /* STOP_TRAN token */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +#if _USE_IOCTL +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive data block */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + DWORD csz; + + + if (pdrv) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + res = RES_ERROR; + switch (cmd) { + case CTRL_SYNC : /* Flush write-back cache, Wait for end of internal process */ + if (select()) res = RES_OK; + break; + + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (WORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDv2? */ + csz = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1; + *(DWORD*)buff = csz << 10; + } else { /* SDv1 or MMCv3 */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csz = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = csz << (n - 9); + } + res = RES_OK; + } + break; + + case GET_BLOCK_SIZE : /* Get erase block size in unit of sectors (DWORD) */ + if (CardType & CT_SD2) { /* SDv2+? */ + if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */ + xchg_spi(0xFF); + if (rcvr_datablock(csd, 16)) { /* Read partial block */ + for (n = 64 - 16; n; n--) xchg_spi(0xFF); /* Purge trailing data */ + *(DWORD*)buff = 16UL << (csd[10] >> 4); + res = RES_OK; + } + } + } else { /* SDv1 or MMCv3 */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */ + if (CardType & CT_SD1) { /* SDv1 */ + *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); + } else { /* MMCv3 */ + *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); + } + res = RES_OK; + } + } + break; + + case MMC_GET_TYPE : /* Get card type flags (1 byte) */ + *ptr = CardType; + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if ((send_cmd(CMD9, 0) == 0) /* READ_CSD */ + && rcvr_datablock(buff, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if ((send_cmd(CMD10, 0) == 0) /* READ_CID */ + && rcvr_datablock(buff, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *((BYTE*)buff+n) = xchg_spi(0xFF); + res = RES_OK; + } + break; + + case MMC_GET_SDSTAT : /* Receive SD statsu as a data block (64 bytes) */ + if ((CardType & CT_SD2) && send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */ + xchg_spi(0xFF); + if (rcvr_datablock(buff, 64)) res = RES_OK; + } + break; + + case CTRL_POWER_OFF : /* Power off */ + power_off(); + Stat |= STA_NOINIT; + res = RES_OK; + break; + + default: + res = RES_PARERR; + } + + deselect(); + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Driven Procedure */ +/*-----------------------------------------------------------------------*/ +/* This function must be called by timer interrupt in period of 1ms */ + +void disk_timerproc (void) +{ + BYTE s; + UINT n; + + + n = Timer1; /* 1000Hz decrement timer with zero stopped */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + + + /* Update socket status */ + + s = Stat; + if (MMC_WP) { + s |= STA_PROTECT; + } else { + s &= ~STA_PROTECT; + } + if (MMC_CD) { + s &= ~STA_NODISK; + } else { + s |= (STA_NODISK | STA_NOINIT); + } + Stat = s; +} + diff --git a/AudioConsole.X/Source/FlashMapping.h b/AudioConsole.X/Source/FlashMapping.h new file mode 100644 index 0000000..298ef57 --- /dev/null +++ b/AudioConsole.X/Source/FlashMapping.h @@ -0,0 +1,40 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef FLASHMAPPING_H +#define FLASHMAPPING_H +#include "define.h" + +/* +0x180000 Firmware flags +0x180004 Nb Records +0x180008 Firmware Size +0x18000C Version code +*/ + +#define FLASH_END_ADDRESS 180000 + +#define FLASH_BTLDR_FIRMWARE_START_ADDRESS 0x180000 +#define FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD 0x1F0000 +#define FLASH_BTLDR_FLAGS_ADDRESS 0x000000 +#define FLASH_WIFI_IP_ADDRESS 0X00000C +#define FLASH_WIFI_GATEWAY_ADDRESS 0x000010 +#define FLASH_USE_DHCP_FLAG_ADDRESS 0x000014 +#define FLASH_WIFI_ACCESS_PT_NAME_LENGTH_ADDRESS 0X000015 +#define FLASH_WIFI_ACCESS_PT_NAME_ADDRESS 0x000016 +#define FLASH_WIFI_ACCESS_PT_PASSWD_LENGTH_ADDRESS 0x000056 +#define FLASH_WIFI_ACCESS_PT_PASSWD_ADDRESS 0x000057 +#define FLASH_LAST_ADDRESS 0X000097 + + + + +#define FLASH_BTLDR_HEADER_SIZE 24 + + + +#endif /* HARAKIRIRELAY_H */ diff --git a/AudioConsole.X/Source/FubarinoBoard.c b/AudioConsole.X/Source/FubarinoBoard.c new file mode 100644 index 0000000..9ae2325 --- /dev/null +++ b/AudioConsole.X/Source/FubarinoBoard.c @@ -0,0 +1,6 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + return RET_OK; +} diff --git a/AudioConsole.X/Source/HarakiriRelay.c b/AudioConsole.X/Source/HarakiriRelay.c new file mode 100644 index 0000000..fcf1643 --- /dev/null +++ b/AudioConsole.X/Source/HarakiriRelay.c @@ -0,0 +1,21 @@ +//#include + +#include "HarakiriRelay.h" +#include "BoardCfg.h" +#include "timer.h" + +#define PIN_ACTIVE 1 +#define PIN_INACTIVE 0 + + +void InitHarakiriRelay() +{ + HARAKIRI_RELAY_ON_PIN = PIN_INACTIVE; //Very important!! +} + + +bool HarakiriRelayTurnOff() +{ + HARAKIRI_RELAY_ON_PIN = PIN_ACTIVE; //Just wait for the power to be killed... + return true; +} diff --git a/AudioConsole.X/Source/HarakiriRelay.h b/AudioConsole.X/Source/HarakiriRelay.h new file mode 100644 index 0000000..5b7f2fa --- /dev/null +++ b/AudioConsole.X/Source/HarakiriRelay.h @@ -0,0 +1,19 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef HARAKIRIRELAY_H +#define HARAKIRIRELAY_H +#include "define.h" + + +void InitHarakiriRelay(); + +bool HarakiriRelayTurnOff(); + + +#endif /* HARAKIRIRELAY_H */ + diff --git a/AudioConsole.X/Source/I2C.c b/AudioConsole.X/Source/I2C.c new file mode 100644 index 0000000..9070d16 --- /dev/null +++ b/AudioConsole.X/Source/I2C.c @@ -0,0 +1,171 @@ +#include "define.h" +#include "BoardCfg.h" +#include "I2C.h" + +int mLastTransactionOK; +int mI2CWaitCounter; + +int I2CInit() +{ + //SPI and I2C BRG work the same way. So let's reuse some code! + // int BaudRateGenerator = SPICalculateBRG(80000000,100000); //PBclk is 80MHz, I2C clk = 100KHz + int BaudRateGenerator = 398; + + I2C3CON = 0; + + I2C3CONbits.DISSLW = 1; //disable slew rate control since we are only at 100KHz + I2C3BRG = BaudRateGenerator; + + I2C3CONbits.ON = 1; + + mLastTransactionOK = 0; + mI2CWaitCounter = 0; +} + + +int I2CWrite(unsigned char* OutBuf, unsigned char length) +{ + int RET = RET_OK; + int i; + + //Emit start event + I2C3CONbits.SEN = 1; + while(I2C3CONbits.SEN == 1) + { + + } + + if(I2C3STATbits.BCL == 1) + { + mLastTransactionOK = false; + return RET_ERROR; + } + + for(i = 0; i < length; i++) + { + I2C3TRN = OutBuf[i]; + mI2CWaitCounter = 0; + while(I2C3STATbits.TRSTAT == 1) + { + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + RET = RET_ERROR; + break; + } + } + + // if(I2C3STATbits.ACKSTAT == 1) + // { + // RET = RET_ERROR; + // } + } + + //Emit stop event + I2C3CONbits.PEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.PEN == 1) + { + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + RET = RET_ERROR; + break; + } + } + + mLastTransactionOK = true; + return RET; +} + +int I2CTransmitByte(unsigned char Byte) +{ + + + return RET_ERROR; +} + +int I2CRead(unsigned char SlaveAddress,unsigned char* InputBuf,unsigned char length) +{ + int RET = RET_OK; + int i; + //Emit start event + + I2C3CONbits.SEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.SEN == 1) + + if(I2C3STATbits.BCL == 1) + { + mLastTransactionOK = false; + return RET_ERROR; + } + + //Transmit slave address and write bit + I2C3TRN = SlaveAddress; + mI2CWaitCounter = 0; + while(I2C3STATbits.TRSTAT == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + for(i = 0; i < length; i++) + { + // + I2C3CONbits.RCEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.RCEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + InputBuf[i] = I2C3RCV; + + //Acknowledge reception + I2C3CONbits.ACKDT = 1; + I2C3CONbits.ACKEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.ACKEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + } + + //Emit stop event + I2C3CONbits.PEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.PEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + + mLastTransactionOK = true; + return RET; +} + +bool I2CWasLastTransactionOK() +{ + return mLastTransactionOK; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/I2C.h b/AudioConsole.X/Source/I2C.h new file mode 100644 index 0000000..192235d --- /dev/null +++ b/AudioConsole.X/Source/I2C.h @@ -0,0 +1,21 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef I2C_H +#define I2C_H + +#define I2C_BUFSIZE 10 +#define I2C_TRANSACTION_TIMEOUT_COUNT 800000 //around 10ms + +int I2CInit(); +int I2CWrite(unsigned char* OutBuf, unsigned char length); +int I2CRead(unsigned char SlaveAddress, unsigned char* InputBuf,unsigned char length); + +bool I2CWasLastTransactionOK(); + +#endif /* SPI_H */ + diff --git a/AudioConsole.X/Source/InternalUart.c b/AudioConsole.X/Source/InternalUart.c new file mode 100644 index 0000000..399f080 --- /dev/null +++ b/AudioConsole.X/Source/InternalUart.c @@ -0,0 +1,774 @@ +/******************************************************************************* + * * + * Copyright 2010 Rheinmetall Canada Inc. * + * * + * No part of this document may be reproduced, stored in * + * a retrieval system, or transmitted, in any form or by any means, * + * electronic, mechanical, photocopying, recording, or otherwise, * + * without the prior written permission of Rheinmetall Canada Inc. * + * * + *******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + + */ + +/* ************************************************************************** */ +/* ¤Revision: + 000 20100616 JFM, + Original version. + + ### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "InternalUart.h" +#include "uart.h" +#include +//#include "Watchdog.h" +#include "digitalio.h" +#include "NetworkProtocol.h" + +/* ************************************************************************** */ +/* Local variables */ +char acIntUartRxBuff[MAX_INTERNAL_UART_PORT][INTERNAL_UART_BUFFER_DEPTH]; //Rx Buffers +stInternalUartData astInternalUartData[MAX_INTERNAL_UART_PORT]; //port management data + +unsigned int LoraData = 0; + +void process(void); +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InternalUartInit(void) +{ + //Setup port 1 + // + // U1MODEbits.ON = 0; //disable module + // U1STA = 0; + // U1STAbits.UTXEN = 0; //disable transmitter + // IPC6bits.U1IP = 7; //priority 7 + // IPC6bits.U1IS = 3; //sub-priority 3 + // U1STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted + //// U1STAbits.UTXSEL = 0b01; // //JFM 2012-08-27 + // IFS0bits.U1TXIF = 0; //clear interrupt flag + // IEC0bits.U1TXIE = 1; //enable tx interrupt + // U1STAbits.URXISEL = 0b00; //interrupt for each character received + // IFS0bits.U1RXIF = 0; + //#ifdef POLL_UART1_RX + // IEC0bits.U1RXIE = 0; //disable rx interrupts + //#else + // IEC0bits.U1RXIE = 1; //enable rx interrupts + //#endif + // U1STAbits.URXEN = 1; //enable receiver + // U1MODEbits.ON = 0; //disable module + + //Setup port 2 + // + U2MODEbits.ON = 0; //disable module + U2STA = 0; + U2STAbits.UTXEN = 0; //disable transmitter + IPC8bits.U2IP = 7; //priority 7 + IPC8bits.U2IS = 2; //sub-priority 2 + U2STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted + IFS1bits.U2TXIF = 0; //clear interrupt flag + IEC1bits.U2TXIE = 0; //enable tx interrupt + U2STAbits.URXISEL = 0b00; //interrupt for each character received + IFS1bits.U2RXIF = 0; +#ifdef POLL_UART2_RX + IEC1bits.U2RXIE = 0; //disable rx interrupts +#else + IEC1bits.U2RXIE = 1; //enable rx interrupts +#endif + U2STAbits.URXEN = 1; //enable receiver + U2STAbits.UTXEN = 1; + U2MODEbits.ON = 0; //disable module + + + //Setup port 5 + // + U5MODEbits.ON = 0; //disable module + U5STA = 0; + U5STAbits.UTXEN = 0; //disable transmitter + IPC12bits.U5IP = 7; //priority 7 + IPC12bits.U5IS = 1; //sub-priority 1 + U5STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted + IFS2bits.U5TXIF = 0; //clear interrupt flag + IEC2bits.U5TXIE = 0; //enable tx interrupt + U5STAbits.URXISEL = 0b00; //interrupt for each character received + IFS2bits.U5RXIF = 0; +#ifdef POLL_UART2_RX + IEC1bits.U2RXIE = 0; //disable rx interrupts +#else + IEC2bits.U5RXIE = 1; //enable rx interrupts +#endif + U5STAbits.URXEN = 1; //enable receiver + U5STAbits.UTXEN = 1; + U5MODEbits.ON = 0; //disable module + + int i; + for(i = 0; i < MAX_INTERNAL_UART_PORT; i++) + { + astInternalUartData[i].pcTxDataPtr = 0; + astInternalUartData[i].iNbFIFOPendingBytes = 0; + astInternalUartData[i].iTxDataSize = 0; + astInternalUartData[i].iTxDataCounter = 0; + astInternalUartData[i].iIsBusy = 0; + astInternalUartData[i].iIsOpened = 0; + astInternalUartData[i].iUartHandle = 0; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//int SetIntalUartInterrupts(int p_iUartPort, int p_iRxInterrupt,int p_iTxInterrupt) +//{ +// if(p_iUartPort > MAX_INTERNAL_UART_PORT) +// return UART_INVALID_PORT; +// +// switch(p_iUartPort) +// { +// case INTERNAL_UART_PORT_1: +// { +// if(p_iTxInterrupt) +// { +// IFS0bits.U1TXIF = 0; //clear interrupt flag +// IEC0bits.U1TXIE = 1; //enable tx interrupt +// } +// else +// { +// IEC0bits.U1TXIE = 0; //disable tx interrupt +// U1STAbits.UTXEN = 1; //This bit must be set when working without interrupts +// } +// if(p_iRxInterrupt) +// { +// IFS0bits.U1RXIF = 0; +// IEC0bits.U1RXIE = 1; //enable rx interrupt +// } +// else +// { +// IEC0bits.U1RXIE = 0; //disable rx interrupt +// } +// break; +// } +// case INTERNAL_UART_PORT_2: +// { +// if(p_iTxInterrupt) +// { +// IFS1bits.U2TXIF = 0; //clear interrupt flag +// IEC1bits.U2TXIE = 1; //enable tx interrupt +// } +// else +// { +// IEC1bits.U2TXIE = 0; //disable tx interrupt +// U2STAbits.UTXEN = 1; //This bit must be set when working without interrupts +// } +// if(p_iRxInterrupt) +// { +// IFS1bits.U2RXIF = 0; +// IEC1bits.U2RXIE = 1; //enable rx interrupt +// } +// else +// { +// IEC1bits.U2RXIE = 0; //disable rx interrupt +// } +// break; +// } +// default: +// { +// return UART_INVALID_PORT; +// } +// } +// return UART_OK; +//} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int OpenInternalPort(int p_iUartPort,int p_iUartHandle,char *p_pcHeadPtr, char *p_pcTailPtr, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable) +{ + if(p_iUartPort > MAX_INTERNAL_UART_PORT) + return UART_INVALID_PORT; + + int iBRG = (PERIPHERAL_FREQ/(4*p_iBaudRate)) - 1; + int iMask = 0; + + switch(p_iNbStopBits) + { + case INT_UART_ONE_STOP_BIT: + { + break; + } + case INT_UART_TWO_STOP_BITS: + { + iMask |= 0x00000001; + break; + } + } + + astInternalUartData[p_iUartPort].iUartHandle = p_iUartHandle; + + switch(p_iParityEnable) + { + case INT_UART_NO_PARITY: + { + break; + } + case INT_UART_EVEN_PARITY: + { + iMask |= 0x00000002; + break; + } + case INT_UART_ODD_PARITY: + { + iMask |= 0x00000004; + break; + } + } + + switch(p_iUartPort) + { + case INTERNAL_UART_PORT_1: + { + INTERNAL_UART1_TX_PIN_DIR = PIN_OUTPUT; + INTERNAL_UART1_TX_PIN = 1; + U1MODE = iMask; + U1MODEbits.BRGH = 1; + U1BRG = iBRG; + U1MODEbits.ON = 1; //enable module + break; + } + case INTERNAL_UART_PORT_2: + { + INTERNAL_UART2_TX_PIN_DIR = PIN_OUTPUT; + INTERNAL_UART2_TX_PIN = 1; + U2MODE = iMask; + U2MODEbits.BRGH = 1; + U2BRG = iBRG; + U2MODEbits.ON = 1; //enable module + break; + } + case INTERNAL_UART_PORT_5: + { + INTERNAL_UART5_TX_PIN_DIR = PIN_OUTPUT; + INTERNAL_UART5_TX_PIN = 1; + U5MODE = iMask; + U5MODEbits.BRGH = 1; + U5BRG = iBRG; + U5MODEbits.ON = 1; //enable module + break; + } + } + + astInternalUartData[p_iUartPort].iIsOpened = 1; + + return UART_OK; +} + +//----------------------------------------------------------------------------- + + + + +//----------------------------------------------------------------------------- +int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, char *p_pcSourceBufferHead, char *p_pcSourceBufferTail) +{ + int iBufSize; + int iAvailableBufSize; + char *p_cDataPointer; + int i; + stInternalUartData *p_stUartDataPtr = &astInternalUartData[p_iUartPort]; + + if(p_stUartDataPtr->iIsOpened == 0) + return UART_PORT_NOT_OPENED; + + //We use a FIFO stack that must be empty before a new transaction can occur + //if(p_stUartDataPtr->iNbFIFOPendingBytes != 0) //If FIFO not empty + if(p_stUartDataPtr->iIsBusy == 1) + return UART_PORT_BUSY; //no space is available so flag the port as BUSY... + + iBufSize = p_iDataSize; + if(iBufSize > INTERNAL_UART_BUFFER_DEPTH) + iBufSize = INTERNAL_UART_BUFFER_DEPTH; + + p_cDataPointer = p_stUartDataPtr->pcTxDataPtr = &p_stUartDataPtr->acIntUartTxFIFO[0]; + p_stUartDataPtr->iNbFIFOPendingBytes = iBufSize; + + //Fill FIFO with data; + for(i = 0; i< iBufSize; i++) + { + *p_cDataPointer++ = *p_pcDataBuf++; + + if(p_pcDataBuf > p_pcSourceBufferTail) //check for wrapping of source data circular buffer. + p_pcDataBuf = p_pcSourceBufferHead; + } + + p_stUartDataPtr->iIsBusy = 1; //informative flag to know we are TXing. + + //Begin Transmission + //A TX interrupt will be generated immediately after setting UTXEN + switch(p_iUartPort) + { + case INTERNAL_UART_PORT_1: + { + if(IEC0bits.U1TXIE) + { + //We consider at this point that the data has been sent for the upper layer. + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + U1STAbits.UTXEN = 1; + } + else + { + int i; + for(i = 0; i < iBufSize; i++) + { + // KickWatchdog(); + U1TXREG = *p_stUartDataPtr->pcTxDataPtr++; + while(U1STAbits.TRMT == 0); + } + p_stUartDataPtr->iIsBusy = 0; + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + } + break; + } + case INTERNAL_UART_PORT_2: + { + if(IEC1bits.U2TXIE) + { + //We consider at this point that the data has been sent for the upper layer. + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + U2STAbits.UTXEN = 1; + } + else + { + int i; + for(i = 0; i < iBufSize; i++) + { + // KickWatchdog(); + U2TXREG = *p_stUartDataPtr->pcTxDataPtr++; + while(U2STAbits.TRMT == 0); +// LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + } + p_stUartDataPtr->iIsBusy = 0; + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + } + + break; + } + case INTERNAL_UART_PORT_5: + { + if(IEC2bits.U5TXIE) + { + //We consider at this point that the data has been sent for the upper layer. + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + U5STAbits.UTXEN = 1; + } + else + { + int i; + for(i = 0; i < iBufSize; i++) + { + // KickWatchdog(); + U5TXREG = *p_stUartDataPtr->pcTxDataPtr++; + while(U5STAbits.TRMT == 0); +// LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN; + } + p_stUartDataPtr->iIsBusy = 0; + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + } + + break; + } + } + + return UART_OK; +} + +int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort) +{ + int i; + + switch(p_iUartPort) + { + case INTERNAL_UART_PORT_1: + { + int temp = IEC1; + IEC0bits.U1TXIE = 0; + for(i = 0; i < p_iDataSize; i++) + { + // LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + U1TXREG = *p_pcDataBuf++; + while(U1STAbits.TRMT == 0); + } + // LORA_MODULE_TX_LED_PIN = LED_OFF; + IFS0bits.U1TXIF = 0; + IEC1 = temp; + break; + } + case INTERNAL_UART_PORT_2: + { + int temp = IEC1; + IEC1bits.U2TXIE = 0; + for(i = 0; i < p_iDataSize; i++) + { +// LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + U2TXREG = *p_pcDataBuf++; + while(U2STAbits.TRMT == 0); + } + // LORA_MODULE_TX_LED_PIN = LED_OFF; + IFS1bits.U2TXIF = 0; + IEC1 = temp; + break; + } + + case INTERNAL_UART_PORT_5: + { + int temp = IEC2; + IEC2bits.U5TXIE = 0; + for(i = 0; i < p_iDataSize; i++) + { +// LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN; + U2TXREG = *p_pcDataBuf++; + while(U5STAbits.TRMT == 0); + } +// LTE_MODULE_TX_LED_PIN = LED_OFF; + IFS2bits.U5TXIF = 0; + IEC2 = temp; + break; + } + + } + return UART_OK; +} + +void TickInternalUart(void) +{ +#ifdef POLL_UART1_RX + + if(U1STAbits.URXDA == 1) + { + if(U1STAbits.OERR) //Buffer overrun error. Data is lost. + { + U1STAbits.OERR = 0; + } + + int i = 0; + while(U1STAbits.URXDA && i < INTERNAL_UART_BUFFER_DEPTH) + { + char NewByte = U1RXREG; + // DriveProtocolRxData(&NewByte,1); + acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte; + } + // UartReceiveData(UART_1,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); + // DriveProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); + } +#endif + +#ifdef POLL_UART2_RX + if(U2STAbits.URXDA == 1) + { + int i = 0; + while(U2STAbits.URXDA == 1 && i < INTERNAL_UART_BUFFER_DEPTH) + { + char NewByte = U2RXREG; + // acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte; + LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN; + ProtocolAnalyzeNewData(NewByte); + + + // LoraData <<= 8; + // unsigned int toto = NewByte; + // toto &= 0x000000FF; + // LoraData |= toto; + // + // if(LoraData == 0xDEADBEEF) + // { + // HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN; + // LORA_ACTIVITY_LED_PIN = ~LORA_ACTIVITY_LED_PIN; + // LoraData = 0; + // } + // HEARTBEAT_LED_2_PIN = ~HEARTBEAT_LED_2_PIN; + } + if(U2STAbits.OERR) //Buffer overrun error. Data is lost. + { + U2STAbits.OERR = 0; + printf("Overrun\n"); + } + // UartReceiveData(UART_2,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + // CUProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + } +#endif + +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void __ISR(_UART_1_VECTOR, ipl7) InternalUart1AInterrupt(void) +{ + stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1]; + + if(IFS0bits.U1TXIF && IEC0bits.U1TXIE) + { + IFS0bits.U1TXIF = 0; + + //Check if there is still data to send in FIFO + if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + { + U1STAbits.UTXEN = 0; //all data sent, stop transmitter + p_acUartDataPtr->iIsBusy = 0; + + } + else + { + do + { + U1TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data + p_acUartDataPtr->iNbFIFOPendingBytes--; + + } + while((U1STAbits.UTXBF == 0) && //while there is space in buffer + (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send + + // HCAM + // if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + // { + // // U1STAbits.UTXEN = 0; //all data sent, stop transmitter + // p_acUartDataPtr->iIsBusy = 0; + // } + } + + + } + if(IFS0bits.U1RXIF && IEC0bits.U1RXIE) + { + char NewByte; + int i; + + IFS0bits.U1RXIF = 0; + + if(U1STAbits.OERR) //Buffer overrun error. Data is lost. + { + U1STAbits.OERR = 0; + IFS0bits.U1RXIF = 0; + printf("UART1 OERR\n"); + return; + } + + i = 0; + while(U1STAbits.URXDA) + { + NewByte = U1RXREG; + acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte; + } + + UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); + + + } +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +void __ISR(_UART_2_VECTOR, ipl7) InternalUart2Interrupt(void) +{ + stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2]; + if(IFS1bits.U2TXIF && IEC1bits.U2TXIE) + { + IFS1bits.U2TXIF = 0; + //Check if there is still data to send in FIFO + if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + { + U2STAbits.UTXEN = 0; //all data sent, stop transmitter + p_acUartDataPtr->iIsBusy = 0; + //LORA_MODULE_TX_LED_PIN = LED_OFF; + } + else + { + do + { + U2TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data + p_acUartDataPtr->iNbFIFOPendingBytes--; +// LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + } + while((U2STAbits.UTXBF == 0) && //while there is space in buffer + (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send + } + + } + if(IFS1bits.U2RXIF && IEC1bits.U2RXIE) + { + IFS1bits.U2RXIF = 0; + char NewByte; + int i; + + if(U2STAbits.OERR) //Buffer overrun error. Data is lost. + { + U2STAbits.OERR = 0; + IFS1bits.U2RXIF = 0; + printf("UART2 OERR\n"); + return; + } + i = 0; + while(U2STAbits.URXDA) + { + NewByte = U2RXREG; + acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte; +// LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN; + } + UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + + } +} +void __ISR(_UART_5_VECTOR, ipl7) InternalUart5Interrupt(void) +{ + stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_5]; + if(IFS2bits.U5TXIF && IEC2bits.U5TXIE) + { + IFS2bits.U5TXIF = 0; + //Check if there is still data to send in FIFO + if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + { + U5STAbits.UTXEN = 0; //all data sent, stop transmitter + p_acUartDataPtr->iIsBusy = 0; + //LORA_MODULE_TX_LED_PIN = LED_OFF; + } + else + { +// LTE_MODULE_TX_LED_PIN = LED_ON; + do + { + U5TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data + p_acUartDataPtr->iNbFIFOPendingBytes--; + + } + while((U5STAbits.UTXBF == 0) && //while there is space in buffer + (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send + +// LTE_MODULE_TX_LED_PIN = LED_OFF; + } + + } + if(IFS2bits.U5RXIF && IEC2bits.U5RXIE) + { + IFS2bits.U5RXIF = 0; + char NewByte; + int i; + + if(U5STAbits.OERR) //Buffer overrun error. Data is lost. + { + U5STAbits.OERR = 0; + IFS2bits.U5RXIF = 0; + printf("UART5 OERR\n"); + return; + } + i = 0; + while(U5STAbits.URXDA) + { + NewByte = U5RXREG; + acIntUartRxBuff[INTERNAL_UART_PORT_5][i++] = NewByte; +// LTE_MODULE_RX_LED_PIN = ~LTE_MODULE_RX_LED_PIN; + } + UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_5][0], i); + + } +} + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +/// Resets UART1 without closing it. Used when comm crashes. +void ResetUart1(void) +{ + U1MODEbits.ON = 0; //disable module + + U1STAbits.UTXEN = 0; //disable transmitter + + IEC0bits.U1TXIE = 0; //disable tx interrupt + IFS0bits.U1TXIF = 0; //clear interrupt flag + IEC0bits.U1TXIE = 1; //enable tx interrupt + IEC0bits.U1RXIE = 0; //disable rx interrupts + IEC0bits.U1RXIE = 0; //disable rx interrupts + IFS0bits.U1RXIF = 0; +#ifdef POLL_UART1_RX + IEC0bits.U1RXIE = 0; //disable rx interrupts +#else + IEC0bits.U1RXIE = 1; //enable rx interrupts +#endif + U1STAbits.URXEN = 1; //enable receiver + + astInternalUartData[INTERNAL_UART_PORT_1].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1].acIntUartTxFIFO[0]; + astInternalUartData[INTERNAL_UART_PORT_1].iTxDataSize = 0; + astInternalUartData[INTERNAL_UART_PORT_1].iIsBusy = 0; + + U1MODEbits.ON = 1; //enable module +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void ResetUart2(void) +{ + //Setup port 2 + // + U2MODEbits.ON = 0; //disable module + + U2STAbits.UTXEN = 0; //disable transmitter + + IEC1bits.U2TXIE = 0; //disable tx interrupt + IFS1bits.U2TXIF = 0; //clear interrupt flag + IEC1bits.U2TXIE = 0; //enable tx interrupt + IEC1bits.U2RXIE = 0; //disable rx interrupts + IFS1bits.U2RXIF = 1; +#ifdef POLL_UART2_RX + IEC1bits.U2RXIE = 0; //disable rx interrupts +#else + IEC1bits.U2RXIE = 1; //enable rx interrupts +#endif + U2STAbits.URXEN = 1; //enable receiver + + + astInternalUartData[INTERNAL_UART_PORT_2].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2].acIntUartTxFIFO[0]; + astInternalUartData[INTERNAL_UART_PORT_2].iTxDataSize = 0; + astInternalUartData[INTERNAL_UART_PORT_2].iIsBusy = 0; + + U2MODEbits.ON = 1; //disable module + +} + +void ResetUart5(void) +{ + //Setup port 2 + // + U5MODEbits.ON = 0; //disable module + + U5STAbits.UTXEN = 0; //disable transmitter + + IEC2bits.U5TXIE = 0; //disable tx interrupt + IFS2bits.U5TXIF = 0; //clear interrupt flag + IEC2bits.U5TXIE = 0; //enable tx interrupt + IEC2bits.U5RXIE = 0; //disable rx interrupts + IFS2bits.U5RXIF = 1; +#ifdef POLL_UART2_RX + IEC2bits.U5RXIE = 0; //disable rx interrupts +#else + IEC2bits.U5RXIE = 1; //enable rx interrupts +#endif + U5STAbits.URXEN = 1; //enable receiver + + + astInternalUartData[INTERNAL_UART_PORT_5].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_5].acIntUartTxFIFO[0]; + astInternalUartData[INTERNAL_UART_PORT_5].iTxDataSize = 0; + astInternalUartData[INTERNAL_UART_PORT_5].iIsBusy = 0; + + U5MODEbits.ON = 1; //enable module + +} +//----------------------------------------------------------------------------- + +void process(void) +{ +} + + +//EOF + diff --git a/AudioConsole.X/Source/InternalUart.h b/AudioConsole.X/Source/InternalUart.h new file mode 100644 index 0000000..4fa681e --- /dev/null +++ b/AudioConsole.X/Source/InternalUart.h @@ -0,0 +1,102 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef INTERNAL_UART_H +#define INTERNAL_UART_H + +/* ************************************************************************** */ +/* Includes */ + +/* ************************************************************************** */ +/* Defines */ +#define INTERNAL_UART_BUFFER_DEPTH 1//4//16 //JFM 2012-08-27 +#define USE_TX_INTERNAL_BUFFER + +#define INTERNAL_UART1_TX_PIN_DIR TRISFbits.TRISF3 +#define INTERNAL_UART1_TX_PIN LATFbits.LATF3 + +#define INTERNAL_UART2_TX_PIN_DIR TRISFbits.TRISF5 +#define INTERNAL_UART2_TX_PIN LATFbits.LATF5 + +#define INTERNAL_UART5_TX_PIN_DIR TRISBbits.TRISB14 +#define INTERNAL_UART5_TX_PIN LATBbits.LATB14 + +/* ************************************************************************** */ +/* Type definitions */ +typedef enum +{ + INTERNAL_UART_PORT_1, + INTERNAL_UART_PORT_2, + INTERNAL_UART_PORT_5, + MAX_INTERNAL_UART_PORT +}eInternalUartPorts; + +typedef enum +{ + INT_UART_NO_PARITY, + INT_UART_EVEN_PARITY, + INT_UART_ODD_PARITY +}eIntUartParity; + +typedef enum +{ + INT_UART_ONE_STOP_BIT, + INT_UART_TWO_STOP_BITS +}eIntUartStopBits; + +typedef enum +{ + INT_UART_INTERRUPT_OFF, + INT_UART_INTERRUPT_ON +}eIntUartInterruptOnOff; + +typedef struct +{ + char *pcTxDataPtr; + char acIntUartTxFIFO[INTERNAL_UART_BUFFER_DEPTH]; + int iNbFIFOPendingBytes; + int iTxDataSize; + int iTxDataCounter; + int iIsBusy; + int iIsOpened; + int iUartHandle; + +}stInternalUartData; + +/* ************************************************************************** */ +/* Prototypes */ +void InternalUartInit(void); +int OpenInternalPort(int p_iUartPort,int p_iUartHandle,char *p_pcHeadPtr, char *p_pcTailPtr, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable); +int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, char *p_pcSourceBufferHead, char *p_pcSourceBufferTail); +int SetIntalUartInterrupts(int p_iUartPort, int p_iRxInterrupt,int p_iTxInterrupt); +int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort); +void TickInternalUart(void); +void ResetUart1(void); +void ResetUart2(void); +void ResetUart5(void); + +#endif +//EOF + diff --git a/AudioConsole.X/Source/KnobEncoderCtrl.c b/AudioConsole.X/Source/KnobEncoderCtrl.c new file mode 100644 index 0000000..a24aa01 --- /dev/null +++ b/AudioConsole.X/Source/KnobEncoderCtrl.c @@ -0,0 +1,123 @@ +//#include + +#include "KnobEncoderCtrl.h" +#include "BoardCfg.h" +#include "LedLightCtrl.h" +#include "timer.h" + +bool KnobDebounce; +int KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; +#define PIN_ACTIVE 0 +#define PIN_INACTIVE 1 + +//bool KnobDebounce; +//void __ISR(_EXTERNAL_1_VECTOR , ipl2) KnobEncoderInterrupt(void) +//{ +// if(KnobDebounce == false) +// { +// int dir = KNOB_PH_B_PIN; +// +// KnobDebounce = true; +// TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); +// IEC0bits.INT1IE = 0; +// +// if(dir == 1) +// { +// LedLightIncrease(); +// } +// else +// { +// LedLightDecrease(); +// } +// } +// +// IFS0bits.INT1IF = 0; +//} + +void KnobDebounceCtrlSM() +{ + switch(KnobReadSM) + { + case KEC_CHECK_BTN_STATE: + { + if(KNOB_TGLE_BTN_PIN == PIN_ACTIVE) + { + LedLightONOFFBtnPressed(); + KnobReadSM = KEC_DEBOUNCE_BTN_STATE; + TimerStart(KNOB_DEBOUNCE_TIMER,250); + } + else + { + KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; + } + break; + } + case KEC_DEBOUNCE_BTN_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_WAIT_FOR_BTN_RST_STATE; + } + + break; + } + case KEC_WAIT_FOR_BTN_RST_STATE: + { + if(KNOB_TGLE_BTN_PIN == PIN_INACTIVE) + { + KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; + } + break; + } + case KEC_WAIT_FOR_TRIGGER_STATE: + { + if(KNOB_PH_A_PIN == PIN_ACTIVE) + { + if(KNOB_PH_B_PIN == PIN_ACTIVE) + { + LedLightIncrease(); + } + else + { + LedLightDecrease(); + } + TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); + KnobReadSM = KEC_DEBOUNCE_STATE; + } + else + { + KnobReadSM = KEC_CHECK_BTN_STATE; + } + break; + } + case KEC_DEBOUNCE_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_WAIT_FOR_RESET_STATE; + } + break; + } + case KEC_WAIT_FOR_RESET_STATE: + { + if((KNOB_PH_A_PIN == PIN_INACTIVE)) + { + if(KNOB_PH_B_PIN == PIN_INACTIVE) + { + TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); + KnobReadSM = KEC_WAIT_A_LITTLE_MORE_STATE; + } + } + + break; + } + case KEC_WAIT_A_LITTLE_MORE_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_CHECK_BTN_STATE; + } + break; + } + } +} \ No newline at end of file diff --git a/AudioConsole.X/Source/KnobEncoderCtrl.h b/AudioConsole.X/Source/KnobEncoderCtrl.h new file mode 100644 index 0000000..9fe2d1e --- /dev/null +++ b/AudioConsole.X/Source/KnobEncoderCtrl.h @@ -0,0 +1,31 @@ +/* + * File: KnobEncoderCtrl.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef KNOBENCODERCTRL_H +#define KNOBENCODERCTRL_H +#include "define.h" + +#define KNOB_DEBOUNCE_TIMEOUT 5 //ms + + +void KnobDebounceCtrlSM(); + +enum KnobEncoderCtrlSMStates +{ + KEC_CHECK_BTN_STATE, + KEC_DEBOUNCE_BTN_STATE, + KEC_WAIT_FOR_BTN_RST_STATE, + KEC_WAIT_FOR_TRIGGER_STATE, + KEC_DEBOUNCE_STATE, + KEC_WAIT_FOR_RESET_STATE, + KEC_WAIT_A_LITTLE_MORE_STATE +}; + + + +#endif /* KNOBENCODERCTRL_H */ + diff --git a/AudioConsole.X/Source/LCDCtrl.c b/AudioConsole.X/Source/LCDCtrl.c new file mode 100644 index 0000000..9879246 --- /dev/null +++ b/AudioConsole.X/Source/LCDCtrl.c @@ -0,0 +1,108 @@ +//#include + +#include "LCDCtrl.h" +#include "BoardCfg.h" +#include "timer.h" +#include "hd44780.h" +#include "BatteryMonitor.h" + +unsigned int mIsLCDON; +unsigned int mPinStateToggle; + +void InitLCDCtrl() +{ + mIsLCDON = 0; + mPinStateToggle = 0; + + LCD_RS_PIN = 0; + LCD_RW_PIN = 0; + LCD_E_PIN = 0; + LCD_DB4_PIN = 0; + LCD_DB5_PIN = 0; + LCD_DB6_PIN = 0; + LCD_DB7_PIN = 0; +// HD44780_Init(); +// +// HD44780_DisplayClear(); +// HD44780_PositionXY(0, 0); +// // send char +// HD44780_DrawString("Le Chalet"); +// HD44780_PositionXY(0, 1); +// HD44780_DrawString("Ile aux chevres"); + + // display clear + //HD44780_DisplayOn(); + + TimerStart(LCD_CTRL_TIMER,LCD_REFRESH_TIMEOUT); +} + +void TickLCDCtrl() +{ + if(LCD_SCROLL_BTN_PIN == 0) + { + if(mPinStateToggle == 0) + { + mPinStateToggle = 1; + if(mIsLCDON == 1) + { + mIsLCDON = 0; + HD44780_DisplayClear(); + + LCD_RS_PIN = 0; + LCD_RW_PIN = 0; + LCD_E_PIN = 0; + LCD_DB4_PIN = 0; + LCD_DB5_PIN = 0; + LCD_DB6_PIN = 0; + LCD_DB7_PIN = 0; + + } + else + { + mIsLCDON = 1; + HD44780_Init(); + HD44780_DisplayClear(); + HD44780_DisplayOn(); + } + } + } + else + { + if(mPinStateToggle == 1) + { + mPinStateToggle = 0; + } + } + if(IsTimerExpired(LCD_CTRL_TIMER)) + { + if(mIsLCDON == 1) + { + float VBat = GetBatteryVoltage(0); + float ISolar = GetConvertedSolarPanelCurrent(); + + char line1[16], line2[16]; + snprintf(line1,16,"VBat: %.2fV ",VBat); + if(ISolar < (float)0.1) + { + ISolar *= 1000; + snprintf(line2,16,"ISol: %.2fmA ",ISolar); + } + else + { + snprintf(line2,16,"ISol: %.5fA ",ISolar); + } + // + // HD44780_Init(); + // HD44780_DisplayClear(); + HD44780_PositionXY(0, 0); + HD44780_DrawString(line1); + + HD44780_PositionXY(0, 1); + HD44780_DrawString(line2); + + } + + + TimerStart(LCD_CTRL_TIMER,LCD_REFRESH_TIMEOUT); + } +} \ No newline at end of file diff --git a/AudioConsole.X/Source/LCDCtrl.h b/AudioConsole.X/Source/LCDCtrl.h new file mode 100644 index 0000000..05019ea --- /dev/null +++ b/AudioConsole.X/Source/LCDCtrl.h @@ -0,0 +1,21 @@ +/* + * File: LCDCtrl.h + * Author: JF + * + * + */ + +#ifndef LCDCTRL_H +#define LCDCTRL_H +#include "define.h" + +#define LCD_REFRESH_TIMEOUT 1000 //1h Time without comm. before we reset the LoRa module + +void InitLCDCtrl(); +void TickLCDCtrl(); + + + + +#endif /* LCDCTRL_H */ + diff --git a/AudioConsole.X/Source/LTENetworkInterface.c b/AudioConsole.X/Source/LTENetworkInterface.c new file mode 100644 index 0000000..b7207a2 --- /dev/null +++ b/AudioConsole.X/Source/LTENetworkInterface.c @@ -0,0 +1,344 @@ +#include "LTENetworkInterface.h" +#include "NetworkProtocol.h" +#include "SIM7080GInterface.h" +#include "timer.h" +#include "ChaletPowerRelay.h" +#include "HarakiriRelay.h" +#include "BatteryMonitor.h" +#include "LedLightCtrl.h" +#include "TemperatureSensor.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" +#include "LoraWatchdog.h" +#include "versionbuild.h" +#include "WiFiCtrl.h" +#include "BoardCfg.h" + +int mLTENWISMState; +static const char mFirmwareVersion[15] = VERSIONNUMBER; +#define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02 +#define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01 + +unsigned int mLTETotalMasterNbRequests = 0; + +void LTENetworkInterfaceInit() +{ + ProtocolInit(NETWORK_PROTOCOL_USER_LTE); + + mLTENWISMState = LTE_NWI_INIT_STATE; +} + +void ExecuteLTEMasterCommand(int SenderID, int Command, unsigned char *Data, int DataSize) +{ + KickLoraWatchdog(); +// ChaletPowerRelayKickTimer(); + mLTETotalMasterNbRequests++; +// LTE_MODULE_RX_LED_PIN = LED_OFF; + switch(SenderID) + { + case ID_MASTER: + { + switch(Command) + { + case CHALET_INTERFACE_ACK: + { + break; + } + case CHALET_GENERAL_STATUS_REQUEST: + { +// float FloatVoltage = GetBatteryVoltage(1); +//// float FloatTemperature = TempSensorGetTemp(); +// unsigned int BattVoltage = *((int*)&FloatVoltage); +// unsigned int Temperature = *((int*)&FloatTemperature); +// int SolarPanelCurrent = GetSolarPanelCurrent(); +// int SOC = GetBatterySOC(); +// +// char GeneralStatus = 0; +// char ChaletStatus[18]; +// +// if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) +// { +// GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK; +// } +// if(GetCurrentModuleOK() == true) +// { +// GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK; +// } +// +// ChaletStatus[0] = GeneralStatus; //General Status +// ChaletStatus[1] = GetWiFiSate(); //Wifi Module state +// +// ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1 +// BattVoltage >>= 8; +// ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2 +// BattVoltage >>= 8; +// ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3 +// BattVoltage >>= 8; +// ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4 +// +// ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1 +// SolarPanelCurrent >>= 8; +// ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2 +// +// ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1 +// SolarPanelCurrent >>= 8; +// ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2 +// +// ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1 +// Temperature >>= 8; +// ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2 +// Temperature >>= 8; +// ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3 +// Temperature >>= 8; +// ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4 +// +// int tmp = mLTETotalMasterNbRequests; +// ChaletStatus[14] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1 +// mLTETotalMasterNbRequests >>= 8; +// ChaletStatus[15] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2 +// mLTETotalMasterNbRequests >>= 8; +// ChaletStatus[16] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3 +// mLTETotalMasterNbRequests >>= 8; +// ChaletStatus[17] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4 +// mLTETotalMasterNbRequests = tmp; +// +// +// SendLTENetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18); +// +// HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN; + + break; + } + case CHALET_AC_POWER_STATE_STATUS_REQUEST: + { +// char PowerStatus = GetChaletPowerRelayState(); +// SendLTENetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1); + break; + } + case CHALET_AC_POWER_SET_STATE_REQUEST: + { +// char response = CHALET_POWER_RELAY_UNKNOWN_STATE; +// if(Data[0] == CHALET_POWER_RELAY_OFF_STATE) +// { +// ChaletPowerRelayTurnOff(); +// response = CHALET_POWER_RELAY_OFF_STATE; +// } +// else if(Data[0] == CHALET_POWER_RELAY_ON_STATE) +// { +// ChaletPowerRelayTurnOn(); +// response = CHALET_POWER_RELAY_ON_STATE; +// } +// else +// { +// //invalid state requested.... don't do anything +// response = CHALET_POWER_RELAY_UNKNOWN_STATE; +// } +// +// SendLTENetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1); +// + break; + } + case CHALET_BATTERY_VOLTAGE_REQUEST: + { + + break; + } + case CHALET_WIFI_STATUS_REQUEST: + { + char response[5]; + uint32 IPAddress = GetCurIPAddress(); + + response[0] = GetWiFiSate(); //Wifi Module state + response[1] = IPV4_BYTE(IPAddress,0); + response[2] = IPV4_BYTE(IPAddress,1); + response[3] = IPV4_BYTE(IPAddress,2); + response[4] = IPV4_BYTE(IPAddress,3); + SendLTENetworkCommand(CHALET_WIFI_STATUS_RESPONSE,(unsigned char*)&response,5); + break; + } + case CHALET_WIFI_SET_STATE_REQUEST: + { + char response = WIFI_UNKNOWN_STATE; + if(Data[0] == 0) + { + TurnOFFWiFi(); + response = 0; + } + else if(Data[0] == 1) + { + if(GetWiFiSate() != WIFI_CONNECTED_STATE) + { + InitWiFi(); + response = GetWiFiSate(); + } + else + { + response = 1; + } + } + else + { + //invalid state requested.... don't do anything + response = WIFI_UNKNOWN_STATE; + } + + SendLTENetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1); + break; + } + case CHALET_DO_HARAKIRI_REQUEST: + { +// char response; +// if(Data[0] == 0xBA && +// Data[1] == 0xAD && +// Data[2] == 0xBE && +// Data[3] == 0xEF) +// { +// //Magic word is OK... let's suicide... +// response = 0x01; +// //First, send an ACK to master (this is blocking so it's OK) +// SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); +// HarakiriRelayTurnOff(); +// } +// else +// { +// response = 0x00; +// SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); +// } + break; + } + case CHALET_REBOOT_CPU_REQUEST: + { + char response; + if(Data[0] == 0xBA && + Data[1] == 0xAD && + Data[2] == 0xCA && + Data[3] == 0xFE) + { + //Magic word is OK... let's reboot... + response = 0x01; + //First, send an ACK to master (this is blocking so it's OK) + SendLTENetworkCommand(CHALET_REBOOT_CPU_RESPONSE,&response,1); + Sleep(100); + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + } + else + { + response = 0x00; + SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); + } + break; + } + case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST: + { + char response[140]; + char WifiDataSize; + SPIFlashReadBuffer(response,11,FLASH_WIFI_IP_ADDRESS); + WifiDataSize = 11 + response[9] + response[10]; + if(WifiDataSize > 140) + break; + SPIFlashReadBuffer(response,WifiDataSize,FLASH_WIFI_IP_ADDRESS); + SendLTENetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,WifiDataSize); + break; + } + case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST: + { + char response = 0; + if(SPIFlashWriteBuffer(Data,DataSize,FLASH_WIFI_IP_ADDRESS) == 1) + { + response = 1; + } + + SendLTENetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1); + break; + } + case CHALET_GET_FIRMWARE_VERSION_REQUEST: + { + SendLTENetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15); + break; + } + case CHALET_CLEAR_COMMS_STATISTICS_REQUEST: + { + char response = 1; + mLTETotalMasterNbRequests = 0; + SendLTENetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1); + break; + } + case ETH_NETWK_DEVICE_INFO_REQUEST: + { + char data[2]; + data[0] = ID_CHALET_DEVICE; + data[1] = MY_DEVICE_ADDRESS; + int PayloadSize; + unsigned char *response = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL,ETH_NETWK_DEVICE_INFO_RESPONSE, data,2,0, &PayloadSize); + LTESendDataToMaster((char*)response,PayloadSize); + + break; + } + case ETH_NETWK_SET_DEVICE_INFO_ACK: + { + LTENetworInterfaceExecSM(LTE_NWI_MASTER_CONNECTED_EVENT); + break; + } + case ETH_NETWK_CONNECTION_REFUSED: + { + //TODO: reset the TCP module to retry connection??? + break; + } + } + break; + } + default: + { + break; + } + } +} + +void TickLTENetworkInterface() +{ + LTENetworInterfaceExecSM(LTE_NWI_TICK_EVENT); +} + +void LTENetworInterfaceExecSM(int Event) +{ + switch(mLTENWISMState) + { + case LTE_NWI_INIT_STATE: + { + mLTENWISMState = LTE_NWI_CONNECT_TO_MASTER_STATE; + TimerStart(LTE_NWI_TIMER,LTE_NWI_MASTER_CONNECT_POLL_INTERVAL); + break; + } + case LTE_NWI_WAIT_FOR_LTE_STATE: + { + //Not necessary... master will init handshake on TCP connection.... + break; + } + case LTE_NWI_CONNECT_TO_MASTER_STATE: //Here we wait for the master to initiate the handshake after a TCP connection + { + if(Event == LTE_NWI_MASTER_CONNECTED_EVENT) + { + mLTENWISMState = LTE_NWI_OPERATE_STATE; + } + break; + } + case LTE_NWI_OPERATE_STATE: + { + if(Event == LTE_NWI_TICK_EVENT) + { + + } + break; + } + } +} + +void SendLTENetworkCommand(int Command, unsigned char *Data, unsigned int DataSize) +{ + unsigned char *Payload; + unsigned int PayloadSize; + Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); + LTESendDataToMaster(Payload,PayloadSize); +} \ No newline at end of file diff --git a/AudioConsole.X/Source/LTENetworkInterface.h b/AudioConsole.X/Source/LTENetworkInterface.h new file mode 100644 index 0000000..f728670 --- /dev/null +++ b/AudioConsole.X/Source/LTENetworkInterface.h @@ -0,0 +1,40 @@ +/* + * File: LTENetworkInterface.h + * Author: JF + * + * Created on December 28, 2024, 8:05 AM + */ + +#ifndef LTENETWORKINTERFACE_H +#define LTENETWORKINTERFACE_H + +#define LTE_NWI_MASTER_CONNECT_POLL_INTERVAL 5000 + +enum eLTENWISMStates +{ + LTE_NWI_INIT_STATE, + LTE_NWI_WAIT_FOR_LTE_STATE, + LTE_NWI_CONNECT_TO_MASTER_STATE, + LTE_NWI_OPERATE_STATE, + + LTE_NWI_MAX_STATE +}; + +enum eLTENWISMEvents +{ + LTE_NWI_TICK_EVENT, + LTE_NWI_MASTER_CONNECTED_EVENT, + + LTE_NWI_MAX_EVENT +}; + + +void LTENetworkInterfaceInit(); +void ExecuteLTEMasterCommand(int SenderID, int Command, unsigned char *Data, int DataSize); + +void TickLTENetworkInterface(); +void LTENetworInterfaceExecSM(int Event); +void SendLTENetworkCommand(int Command, unsigned char *Data, unsigned int DataSize); + +#endif /* LTENETWORKINTERFACE_H */ + diff --git a/AudioConsole.X/Source/LedLightCtrl.c b/AudioConsole.X/Source/LedLightCtrl.c new file mode 100644 index 0000000..00198b3 --- /dev/null +++ b/AudioConsole.X/Source/LedLightCtrl.c @@ -0,0 +1,96 @@ +#include "define.h" +#include "LedLightCtrl.h" +#include "PWMCtrl.h" + +int LedLightBrightness = 10; +int LedLightState = LED_LIGHT_ON; + + + +void LedLightDecrease() +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightDim(LED_LIGHT_TICK_STEP); +} +void LedLightDim(int Percent) +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBrightness -= Percent; + if(LedLightBrightness < LED_LIGHT_MIN_DIM_VAL) + { + LedLightBrightness = LED_LIGHT_MIN_DIM_VAL; + } + + PWMSetValue(LedLightBrightness); +} + +void LedLightBright(int Percent) +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBrightness += Percent; + if(LedLightBrightness >= 100) + { + LedLightBrightness = 100; + } + + PWMSetValue(LedLightBrightness); +} + +void LedLightIncrease() +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBright(LED_LIGHT_TICK_STEP); +} + +void LedLightSet(int Percent) +{ + if(Percent < 0) + Percent = 0; + if(Percent > 100) + Percent = 100; + + LedLightBrightness = Percent; + PWMSetValue(LedLightBrightness); +} + +void TurnLedLightON() +{ + LedLightState = LED_LIGHT_ON; + PWMSetValue(LedLightBrightness); +} + +void TurnLedLightOFF() +{ + LedLightState = LED_LIGHT_OFF; + PWMSetValue(0); +} + +void LedLightONOFFBtnPressed() +{ + if(LedLightState == LED_LIGHT_ON) + { + TurnLedLightOFF(); + } + else + { + TurnLedLightON(); + } +} + +int GetLedLightBrightness() +{ + return LedLightBrightness; +} + +int GetLedLightState() +{ + return LedLightState; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/LedLightCtrl.h b/AudioConsole.X/Source/LedLightCtrl.h new file mode 100644 index 0000000..ccaee23 --- /dev/null +++ b/AudioConsole.X/Source/LedLightCtrl.h @@ -0,0 +1,33 @@ +/* + * File: LedLightCtrl.h + * Author: JF + * + * Created on November 30, 2018, 8:09 PM + */ + +#ifndef LEDLIGHTCTRL_H +#define LEDLIGHTCTRL_H + +#define LED_LIGHT_TICK_STEP 5 //Percent +#define LED_LIGHT_MIN_DIM_VAL 10 //Percent + +#define LED_LIGHT_ON 1 +#define LED_LIGHT_OFF 0 + +extern int LedLightBrightness; + +void LedLightDim(int Percent); +void LedLightDecrease(); +void LedLightBright(int Percent); +void LedLightIncrease(); +void LedLightSet(int Percent); + +void LedLightONOFFBtnPressed(); +void TurnLedLightON(); +void TurnLedLightOFF(); + +int GetLedLightBrightness(); +int GetLedLightState(); + +#endif /* LEDLIGHTCTRL_H */ + diff --git a/AudioConsole.X/Source/LoraNetworkInterface.c b/AudioConsole.X/Source/LoraNetworkInterface.c new file mode 100644 index 0000000..b2c9d85 --- /dev/null +++ b/AudioConsole.X/Source/LoraNetworkInterface.c @@ -0,0 +1,307 @@ +#include "LoraNetworkInterface.h" +#include "ProtocolDefs.h" +#include "NetworkProtocol.h" +#include "InternalUart.h" +#include "define.h" +#include "BoardCfg.h" +#include "Uart.h" +#include "ChaletPowerRelay.h" +#include "HarakiriRelay.h" +#include "BatteryMonitor.h" +#include "LedLightCtrl.h" +#include "TemperatureSensor.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" +#include "LoraWatchdog.h" +#include "versionbuild.h" +#include "WiFiCtrl.h" + +//#include "WiFiCtrl.h" +// + +//enum eWiFiState +//{ +// WIFI_MODULE_OFF_STATE = 0, +// WIFI_CONNECTED_STATE, +// WIFI_DISCONNECTED_STATE, +// WIFI_INIT_ERROR_STATE, +// WIFI_UNKNOWN_STATE +//}; +unsigned char mLoraPreamble[3]={0x00,LORA_MASTER_ADDRESS,LORA_CHANNEL}; + +static const char mFirmwareVersion[15] = VERSIONNUMBER; +unsigned int mTotalMasterNbRequests = 0; + + +void LoraNetworkInterfaceInit() +{ + ProtocolInit(NETWORK_PROTOCOL_USER_LORA); +} + +void ExecuteLoraMasterCommand(int Command, unsigned char *Data, int DataSize) +{ + //Whatever was the command, we are online... +// LORA_MODULE_RX_LED_PIN = LED_OFF; + KickLoraWatchdog(); +// printf("EXEC\n\n"); +// ChaletPowerRelayKickTimer(); + mTotalMasterNbRequests++; + switch(Command) + { + case CHALET_INTERFACE_ACK: + { + break; + } + case CHALET_GENERAL_STATUS_REQUEST: + { +// float FloatVoltage = GetBatteryVoltage(1); +// float FloatTemperature = TempSensorGetTemp(); +// unsigned int BattVoltage = *((int*)&FloatVoltage); +// unsigned int Temperature = *((int*)&FloatTemperature); +// int SolarPanelCurrent = GetSolarPanelCurrent(); +// int SOC = GetBatterySOC(); +// +// char GeneralStatus = 0; +// char ChaletStatus[18]; +// +// if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) +// { +// GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK; +// } +// if(GetCurrentModuleOK() == true) +// { +// GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK; +// } +// +// ChaletStatus[0] = GeneralStatus; //General Status +// ChaletStatus[1] = GetWiFiSate(); //Wifi Module state +// +// ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1 +// BattVoltage >>= 8; +// ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2 +// BattVoltage >>= 8; +// ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3 +// BattVoltage >>= 8; +// ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4 +// +// ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1 +// SolarPanelCurrent >>= 8; +// ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2 +// +// ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1 +// SolarPanelCurrent >>= 8; +// ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2 +// +// ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1 +// Temperature >>= 8; +// ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2 +// Temperature >>= 8; +// ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3 +// Temperature >>= 8; +// ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4 +// +// int tmp = mTotalMasterNbRequests; +// ChaletStatus[14] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1 +// mTotalMasterNbRequests >>= 8; +// ChaletStatus[15] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2 +// mTotalMasterNbRequests >>= 8; +// ChaletStatus[16] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3 +// mTotalMasterNbRequests >>= 8; +// ChaletStatus[17] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4 +// mTotalMasterNbRequests = tmp; +// +// +// SendLoraNetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18); + + HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN; + + break; + } + case CHALET_AC_POWER_STATE_STATUS_REQUEST: + { +// char PowerStatus = GetChaletPowerRelayState(); +// SendLoraNetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1); + break; + } + case CHALET_AC_POWER_SET_STATE_REQUEST: + { +// char response = CHALET_POWER_RELAY_UNKNOWN_STATE; +// if(Data[0] == CHALET_POWER_RELAY_OFF_STATE) +// { +// ChaletPowerRelayTurnOff(); +// response = CHALET_POWER_RELAY_OFF_STATE; +// } +// else if(Data[0] == CHALET_POWER_RELAY_ON_STATE) +// { +// ChaletPowerRelayTurnOn(); +// response = CHALET_POWER_RELAY_ON_STATE; +// } +// else +// { +// //invalid state requested.... don't do anything +// response = CHALET_POWER_RELAY_UNKNOWN_STATE; +// } +// +// SendLoraNetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1); + + break; + } + case CHALET_BATTERY_VOLTAGE_REQUEST: + { + + break; + } + case CHALET_WIFI_STATUS_REQUEST: + { + char response[5]; + uint32 IPAddress = GetCurIPAddress(); + + response[0] = GetWiFiSate(); //Wifi Module state + response[1] = IPV4_BYTE(IPAddress,0); + response[2] = IPV4_BYTE(IPAddress,1); + response[3] = IPV4_BYTE(IPAddress,2); + response[4] = IPV4_BYTE(IPAddress,3); + SendLoraNetworkCommand(CHALET_WIFI_STATUS_RESPONSE,(unsigned char*)&response,5); + break; + } + case CHALET_WIFI_SET_STATE_REQUEST: + { + char response = WIFI_UNKNOWN_STATE; + if(Data[0] == 0) + { + TurnOFFWiFi(); + response = 0; + } + else if(Data[0] == 1) + { + if(GetWiFiSate() != WIFI_CONNECTED_STATE) + { + InitWiFi(); + response = GetWiFiSate(); + } + else + { + response = 1; + } + } + else + { + //invalid state requested.... don't do anything + response = WIFI_UNKNOWN_STATE; + } + + SendLoraNetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1); + break; + } + case CHALET_DO_HARAKIRI_REQUEST: + { +// char response; +// if(Data[0] == 0xBA && +// Data[1] == 0xAD && +// Data[2] == 0xBE && +// Data[3] == 0xEF) +// { +// //Magic word is OK... let's suicide... +// response = 0x01; +// //First, send an ACK to master (this is blocking so it's OK) +// SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); +// HarakiriRelayTurnOff(); +// } +// else +// { +// response = 0x00; +// SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); +// } + break; + } + case CHALET_REBOOT_CPU_REQUEST: + { + char response; + if(Data[0] == 0xBA && + Data[1] == 0xAD && + Data[2] == 0xCA && + Data[3] == 0xFE) + { + //Magic word is OK... let's reboot... + response = 0x01; + //First, send an ACK to master (this is blocking so it's OK) + SendLoraNetworkCommandBlocking(CHALET_REBOOT_CPU_RESPONSE,&response,1); + Sleep(100); + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + } + else + { + response = 0x00; + SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); + } + break; + } + case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST: + { + char response[140]; + char WifiDataSize; + SPIFlashReadBuffer(response,11,FLASH_WIFI_IP_ADDRESS); + WifiDataSize = 11 + response[9] + response[10]; + if(WifiDataSize > 140) + break; + SPIFlashReadBuffer(response,WifiDataSize,FLASH_WIFI_IP_ADDRESS); + SendLoraNetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,WifiDataSize); + break; + } + case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST: + { + char response = 0; + if(SPIFlashWriteBuffer(Data,DataSize,FLASH_WIFI_IP_ADDRESS) == 1) + { + response = 1; + } + + SendLoraNetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1); + break; + } + case CHALET_GET_FIRMWARE_VERSION_REQUEST: + { + SendLoraNetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15); + break; + } + case CHALET_CLEAR_COMMS_STATISTICS_REQUEST: + { + char response = 1; + mTotalMasterNbRequests = 0; + SendLoraNetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1); + break; + } + + } +} + +void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize) +{ + unsigned char *Payload; + unsigned int PayloadSize; + //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) + Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); + + UartTransmitData(NETWORK_UART_PORT,mLoraPreamble,3); + UartTransmitData(NETWORK_UART_PORT,Payload,PayloadSize); + +} + +void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize) +{ + unsigned char *Payload; + unsigned int PayloadSize; + //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) + Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); + + SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); + SendInternalUartDataBlocking(Payload,PayloadSize,NETWORK_UART_PORT); +} + +void TestTx() +{ + char toto = 0x03; + SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); +} \ No newline at end of file diff --git a/AudioConsole.X/Source/LoraNetworkInterface.h b/AudioConsole.X/Source/LoraNetworkInterface.h new file mode 100644 index 0000000..dca01b0 --- /dev/null +++ b/AudioConsole.X/Source/LoraNetworkInterface.h @@ -0,0 +1,20 @@ + + +#ifndef LORANEETWORKINTERFACE_H /* Guard against multiple inclusion */ +#define LORANEETWORKINTERFACE_H +//#define LORA_CHANNEL 0x04 +//#define LORA_MASTER_ADDRESS 0x05 +#define LORA_CHANNEL 65 +#define LORA_MASTER_ADDRESS 0x05 + +#define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01 +#define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02 + +void LoraNetworkInterfaceInit(); +void ExecuteLoraMasterCommand(int Command, unsigned char *Data, int DataSize); +void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize); +void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize); //USE WITH CARE + +void TestTx(); + +#endif /* LORANEETWORKINTERFACE_H */ diff --git a/AudioConsole.X/Source/LoraWatchdog.c b/AudioConsole.X/Source/LoraWatchdog.c new file mode 100644 index 0000000..4e28a73 --- /dev/null +++ b/AudioConsole.X/Source/LoraWatchdog.c @@ -0,0 +1,103 @@ +//#include + +#include "HarakiriRelay.h" +#include "BoardCfg.h" +#include "timer.h" +#include "LoraWatchdog.h" +#include "SIM7080GInterface.h" + +int mLoraSMState; + + + +void InitLoraWatchdog() +{ + mLoraSMState = LORA_WATCHDOG_OK_STATE; + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); +} + +void TickLoraWatchdog() +{ + LoraWatchdogStateMachine(LORA_SM_TICK_EVENT); +} + +void LoraWatchdogStateMachine(int Event) +{ + switch(mLoraSMState) + { + case LORA_WATCHDOG_OK_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + //We lost the comm... reset the LoRa module + LORA_MODULE_RELAY_PIN = 1; //Turn OFF the LoRa module + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_OFF_TIMEOUT); + mLoraSMState = LORA_WATCHDOG_RESET_LORA_MODULE_STATE; + } + break; + } + case LORA_SM_KICK_EVENT: + { + //All is well... + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); + break; + } + } + break; + } + case LORA_WATCHDOG_RESET_LORA_MODULE_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + case LORA_SM_KICK_EVENT://That would be very weird since the LoRa module is OFF!!! + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + //Reset is done, turn module back ON. + LORA_MODULE_RELAY_PIN = 0; //Turn ON the LoRa module + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_REBOOT_TIMEOUT); //If we don't get Comm. back after this delay... reboot the PIC + mLoraSMState = LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE; + LTEModuleReset(); + } + break; + } + } + break; + } + case LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + } + break; + } + case LORA_SM_KICK_EVENT: + { + //Communication is re-established. + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); + mLoraSMState = LORA_WATCHDOG_OK_STATE; + break; + } + } + break; + } + } +} + +void KickLoraWatchdog() +{ + LoraWatchdogStateMachine(LORA_SM_KICK_EVENT); +} diff --git a/AudioConsole.X/Source/LoraWatchdog.h b/AudioConsole.X/Source/LoraWatchdog.h new file mode 100644 index 0000000..dcfcd3e --- /dev/null +++ b/AudioConsole.X/Source/LoraWatchdog.h @@ -0,0 +1,38 @@ +/* + * File: LoraWatchdog.h + * Author: JF + * + * + */ + +#ifndef LORAWATCHDOG_H +#define LORAWATCHDOG_H +#include "define.h" + +#define LORA_WATCHDOG_MODULE_RESET_TIMEOUT 3600000 //1h Time without comm. before we reset the LoRa module +#define LORA_WATCHDOG_REBOOT_TIMEOUT 1200000 //20 minutes Time to reboot after we reset the LoRa module +#define LORA_WATCHDOG_MODULE_OFF_TIMEOUT 4000 //Keep the LoRa module off for 2 seconds when reseting it. + +enum eLoraWDSMStates +{ + LORA_WATCHDOG_OK_STATE, + LORA_WATCHDOG_RESET_LORA_MODULE_STATE, + LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE +}; + +enum eLoraWDEvents +{ + LORA_SM_TICK_EVENT, + LORA_SM_KICK_EVENT +}; + + +void InitLoraWatchdog(); +void TickLoraWatchdog(); +void LoraWatchdogStateMachine(int Event); +void KickLoraWatchdog(); + + + +#endif /* HARAKIRIRELAY_H */ + diff --git a/AudioConsole.X/Source/MasterCtrlInterface.c b/AudioConsole.X/Source/MasterCtrlInterface.c new file mode 100644 index 0000000..ee9cedd --- /dev/null +++ b/AudioConsole.X/Source/MasterCtrlInterface.c @@ -0,0 +1,282 @@ + +#include "define.h" +#include "MasterCtrlInterface.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include "NetworkProtocol.h" +#include "ProtocolDefs.h" +#include "timer.h" +#include +#include "ValveCtrl.h" +#include "FlowMeter.h" + +#ifdef USE_WINC1500 +#else +TCP_SOCKET MySocket; +static BYTE MasterIP[] = "192.168.0.100"; +DWORD MasterPort = 2182; +#endif + +int mConnectionState = MASTER_STATE_DISCONNECTED; + + +int InitMasterCtrlIF() +{ + ProtocolInit(); + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + return 1; +} + +int ConnectToMasterCtrl() +{ +#ifdef USE_WINC1500 +#else + MySocket = TCPOpen((DWORD) (PTR_BASE) & MasterIP[0], TCP_OPEN_RAM_HOST, MasterPort, TCP_PURPOSE_GENERIC_TCP_CLIENT); + + // Abort operation if no TCP socket of type TCP_PURPOSE_GENERIC_TCP_CLIENT is available + // If this ever happens, you need to go add one to TCPIPConfig.h + if (MySocket == INVALID_SOCKET) + { + printf("Could not open socket to MasterCtrl\n"); + return 0; + } + printf("MasterCtrl Socket opened\n"); +#endif + return 1; +} + +void TickMasterCtrlInterface() +{ +#ifdef USE_WINC1500 +#else + WORD Pending = TCPIsGetReady(MySocket); + if (Pending != 0) + { + // printf("Rx %d bytes\n",Pending); + int i = 0; + for(i = 0; i < Pending; i++) + { + BYTE Byte; + if(TCPGet(MySocket,&Byte) == TRUE) + { + ProtocolAnalyzeNewData(Byte); + } + } + } + +#ifdef CONNECT_DEVICE_TO_NETWORK + if(mConnectionState == MASTER_STATE_DISCONNECTED) + { + if(IsTimerExpired(MASTER_CONNECTION_TIMER)) + { + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT); + mConnectionState = MASTER_STATE_CONNECTING; + ConnectToMasterCtrl(); + } + } + else if(mConnectionState == MASTER_STATE_CONNECTING) + { +// if(IsTimerExpired(MASTER_CONNECTION_TIMER) == true) // +// { +// TCPClose(MySocket); +// TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT); +// ConnectToMasterCtrl(); +// } + } + else if(mConnectionState == MASTER_STATE_CONNECTED) + { + // if(IsTimerExpired(MASTER_CONNECTION_TIMER)) + { + if(TCPIsConnected(MySocket) == FALSE) + { + //we got disconnected... + mConnectionState = MASTER_STATE_DISCONNECTED; + TCPClose(MySocket); + + printf("Connection with MasterCtrl lost..\n"); + } + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + } + + } +#endif +#endif +} + +void NewMasterMessageReceived(char* Message) +{ + // char Sender = Message[FRAME_SENDER_DEVICE_ID_INDEX]; + char Target = Message[FRAME_DEST_DEVICE_ID_INDEX]; + unsigned char Command = Message[FRAME_COMMAND_INDEX]; + char *Data = &Message[FRAME_DATA_INDEX]; + + // printf("MasterMsgReceived %d \n",Command); + + if(Target == ID_ETHERNET_VIRTUAL) + { + switch(Command) + { + case ETH_NETWK_DEVICE_INFO_REQUEST: + { + char Data[2]; + Data[0] = ID_SPRINKLER_DEVICE; + Data[1] = MY_DEVICE_ADDRESS; //Address + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0); + printf("Rx Device info request\n"); +// int FrameSize = -1; +// unsigned char *FramePtr = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0, &FrameSize); +// +// if(FrameSize > 0) +// { +// TCPPutArray(MySocket,FramePtr,FrameSize); +// } + + break; + } + case ETH_NETWK_CONNECTION_REFUSED: + { + printf("Connection to server refused\n"); + break; + } + case ETH_NETWK_SET_DEVICE_INFO_ACK: + { + //Connected! + mConnectionState = MASTER_STATE_CONNECTED; + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + printf("Connected to server\n"); + break; + } + case ETH_NETWK_DEVICE_INFO_RESPONSE: + default: + { + //error... + break; + } + } + + } + else if(Target == ID_SPRINKLER_DEVICE) + { + switch(Command) + { + case SPRINKLER_DEVICE_ACK: + { + break; + } + case SPRINKLER_DEVICE_STATUS_REQUEST: + { + unsigned char data[6]; + data[0] = (unsigned char)GetValveState(); + GetCurrentFlowBytes(&data[1]); + data[3] = 0; + data[4] = 0; + data[5] = 0; + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_STATUS_RESPONSE, data,6,0); + // printf("Status sent\n"); + break; + } + case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST: + { + unsigned char *MsgData; + char data; + + MsgData = ProtocolMsgDataPtr(); + if(*MsgData == 1) + { + SetValve(VALVE_ON); + data = 1; + } + else if(*MsgData == 1) + { + SetValve(VALVE_OFF); + data = 1; + } + else + { + data = 0; + } + + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK,&data,1,0); + break; + } + case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST: + { + unsigned char data; + data = (unsigned char)GetValveState(); + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE,&data,1,0); + break; + } + case SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST: + { + unsigned char data[2]; + GetCurrentFlowBytes(data); + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE,data,2,0); + break; + } + case SPRINKLER_DEVICE_GET_MOISTURE_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_SET_PROGRAM_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_GET_PROGRAM_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST: + { + break; + } + + case SPRINKLER_DEVICE_STATUS_RESPONSE: + case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK: + case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE: + case SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE: + case SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE: + case SPRINKLER_DEVICE_SET_PROGRAM_ACK: + case SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE: + case SPRINKLER_DEVICE_SET_PARAMETERS_ACK: + case SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE: + default: + { + //error + break; + } + } + } + else + { + //Ignore..??? + } +} + +bool SendFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags) +{ + + int FrameSize = -1; + unsigned char *FramePtr = ProtocolGetFrame(DestDevice,DestAddress,SenderDevice, Cmd, Data,Size,Flags,&FrameSize); + + if(FrameSize > 0) + { +#ifdef USE_WINC1500 +#else + TCPPutArray(MySocket,FramePtr,FrameSize); +#endif + + } + else + { + return false; + } + + + return true; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/MasterCtrlInterface.h b/AudioConsole.X/Source/MasterCtrlInterface.h new file mode 100644 index 0000000..3a3d2b4 --- /dev/null +++ b/AudioConsole.X/Source/MasterCtrlInterface.h @@ -0,0 +1,27 @@ +/* + * File: MasterCtrlInterface.h + * Author: JF + * + * Created on March 31, 2017, 2:41 PM + */ + +#ifndef MASTERCTRLINTERFACE_H +#define MASTERCTRLINTERFACE_H + +enum eMasterConnectionStates +{ + MASTER_STATE_DISCONNECTED, + MASTER_STATE_CONNECTING, + MASTER_STATE_CONNECTED +}; + +int InitMasterCtrlIF(void); +int ConnectToMasterCtrl(void); +void TickMasterCtrlInterface(void); +void MasterCtrlSM(int Event); +void NewMasterMessageReceived(char* Message); +bool SendFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags); + + +#endif /* MASTERCTRLINTERFACE_H */ + diff --git a/AudioConsole.X/Source/NetworkProtocol.c b/AudioConsole.X/Source/NetworkProtocol.c new file mode 100644 index 0000000..6cd833f --- /dev/null +++ b/AudioConsole.X/Source/NetworkProtocol.c @@ -0,0 +1,360 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Fran�ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.c + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ +#include "define.h" +#include "NetworkProtocol.h" +#include "Uart.h" +#include + +#include "MasterCtrlInterface.h" +#include "LoraNetworkInterface.h" +#include "LTENetworkInterface.h" + + + + +static char MyDeviceID = ID_SPRINKLER_DEVICE; + +char mFrameData[MAX_MESSAGE_SIZE+10]; + +ProtocolData_t mLoraProtocolData; +ProtocolData_t mLTEProtocolData; + + +void ProtocolInit(int User) +{ + ProtocolData_t *DataStruct; + switch(User) + { + case NETWORK_PROTOCOL_USER_LORA: + { + DataStruct = &mLoraProtocolData; + break; + } + case NETWORK_PROTOCOL_USER_LTE: + { + DataStruct = &mLTEProtocolData; + break; + } + default: + return; + break; + } + ResetStateMachine(DataStruct); + +} + +void StateMachine(unsigned char Data,ProtocolData_t *ProtocolData ) +{ + switch(ProtocolData->State) + { + case Initialization: //Reset all pointers and data... + { + ProtocolData->DataSize = 0; + ProtocolData->BufPtr = 0; + ProtocolData->RxPtr = 0; + ProtocolData->Command = 0; + ProtocolData->CRC = 0; + ProtocolData->State = RxHeader; + break; + } + case RxHeader: //Wait for data header... + { + if(Data == FRAME_HEADER) + { + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxAdd; + ProtocolData->CRC ^= Data; + } + else + { + ProtocolData->DataSize = 0; + ResetStateMachine(ProtocolData); + } + + break; + } + case RxAdd: //Sender Address. + { + ProtocolData->SenderAddress = Data; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxID; + ProtocolData->CRC ^= Data; + break; + } + case RxID: //Sender ID + { + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxMyID; + ProtocolData->SenderID = Data; + ProtocolData->CRC ^= Data; + break; + } + case RxMyID: + { +// if(Data != MyDeviceID && Data != BROADCAST_VALUE) //Message is not for this type of device and it's not a broadcast +// { +// ResetStateMachine(); +// break; +// } + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxMyAddress; + ProtocolData->CRC ^= Data; + break; + } + case RxMyAddress: + { + if(Data != MY_DEVICE_ADDRESS && Data != BROADCAST_VALUE) //Message is not for this device address and it's not a broadcast + { + ResetStateMachine(ProtocolData); + break; + } + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxFlags; + ProtocolData->CRC ^= Data; + break; + } + case RxFlags: + { + ProtocolData->Flags = Data; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxCMD; + ProtocolData->CRC ^= Data; + break; + } + case RxCMD: + { + ProtocolData->Command = Data; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->State = RxSize1; + ProtocolData->CRC ^= Data; + break; + } + case RxSize1: //Data size MSB + { + ProtocolData->DataSize = 0; + ProtocolData->DataSize = (unsigned int)Data; + ProtocolData->DataSize <<= 8; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + + + ProtocolData->State = RxSize2; + ProtocolData->CRC ^= Data; + break; + } + case RxSize2: //Data size + { + ProtocolData->DataSize |= (unsigned int)Data; + ProtocolData->DataSize <<= 8; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + + + ProtocolData->State = RxSize3; + ProtocolData->CRC ^= Data; + break; + } + case RxSize3: //Data size + { + ProtocolData->DataSize |= (unsigned int)Data; + ProtocolData->DataSize <<= 8; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + + + ProtocolData->State = RxSize4; + ProtocolData->CRC ^= Data; + break; + } + + case RxSize4: //Data size LSB + { + ProtocolData->DataSize |= (unsigned int)Data; + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + + if(ProtocolData->DataSize > MAX_MESSAGE_SIZE) + ResetStateMachine(ProtocolData); + + if(ProtocolData->DataSize == 0) + ProtocolData->State = RxCRC; + else + ProtocolData->State = RxData; + + ProtocolData->CRC ^= Data; + break; + } + case RxData: + { + ProtocolData->CRC ^= Data; + + ProtocolData->mRxData[ProtocolData->BufPtr++] = Data; + ProtocolData->DataCtr++; + + if(ProtocolData->DataCtr == ProtocolData->DataSize) + { + ProtocolData->State = RxCRC; + } + + break; + } + case RxCRC: + { + if(Data != ProtocolData->CRC) + { + ResetStateMachine(ProtocolData); +// ProtocolAcknowledge(0,Command,0); + break; + } +// NewMasterMessageReceived(mRxData); + if(ProtocolData == &mLoraProtocolData) + { +// ExecuteLoraMasterCommand(ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize); + } + else if(ProtocolData == &mLTEProtocolData) + { +// ExecuteLTEMasterCommand(ProtocolData->SenderID, ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize); + } + ResetStateMachine(ProtocolData); + break; + } + default: + { + ResetStateMachine(ProtocolData); + break; + } + } +} + +void ProtocolAnalyzeNewData(unsigned char Data, int User) +{ + ProtocolData_t *DataStruct; + switch(User) + { + case NETWORK_PROTOCOL_USER_LORA: + { + DataStruct = &mLoraProtocolData; + break; + } + case NETWORK_PROTOCOL_USER_LTE: + { + DataStruct = &mLTEProtocolData; + break; + } + default: + return; + break; + } +// mRxData[RxPtr] = Data; +// printf("%X",Data); + StateMachine(Data, DataStruct); +} + +void ResetStateMachine(ProtocolData_t *ProtocolData) +{ + ProtocolData->DataSize = 0; + ProtocolData->BufPtr = 0; + ProtocolData->RxPtr = 0; + ProtocolData->Command = 0; + ProtocolData->CRC = 0; + ProtocolData->State = RxHeader; + ProtocolData->DataCtr = 0; + ProtocolData->Flags = 0; + ProtocolData->SenderAddress = 0; +} + +void ProtocolExecCmd(void) +{ +// switch(Command) +// { +// case RX_GET_STATUS: +// { +// unsigned char StatusByte =0; +//// memcpy(&StatusByte, &IRRemoteStatus, sizeof(IRRemoteStatus)); +//// ProtocolSendCmd(TX_DEADBOLT_STATUS,&StatusByte,sizeof(StatusByte),1,0); +// +// break; +// } +// } +} + +void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data) +{ + unsigned char data[2]; + if(Answer == 1) + { + data[0] = PROTOCOL_ACK; //CMD + } + else + { + data[0] = PROTOCOL_NAK; //CMD + } + data[1] = Cmd; + +// ProtocolSendCmd(TX_NETWORK_ACK,&data[0],2,1,0); +} + + + +unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size) +{ + unsigned char CRC = 0; + unsigned char i; + for(i = 0; i < size; i++) + CRC ^= Buffer[i]; + + return CRC; +} + +unsigned char ProtocolIsReceiving(void) +{ +// if(State == RxHeader) +// return 0; // Idle... +// else +// return 1; //receiving from serial port + +} + + + +unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) +{ + if(Size > MAX_MESSAGE_SIZE) + { + *FrameSize = 0; + return &mFrameData[FRAME_HEADER_INDEX]; + } + + + + mFrameData[FRAME_HEADER_INDEX] = FRAME_HEADER; //header + mFrameData[FRAME_SENDER_ADDRESS_INDEX] = MY_DEVICE_ADDRESS; //My Address + mFrameData[FRAME_SENDER_DEVICE_ID_INDEX] = SenderDevice; //My ID + mFrameData[FRAME_DEST_DEVICE_ID_INDEX] = DestDevice; //Destination ID + mFrameData[FRAME_DEST_ADDRESS_INDEX] = DestAddress ;//Address; //Destination Address + mFrameData[FRAME_FLAGS_INDEX] = Flags; //Flags + mFrameData[FRAME_COMMAND_INDEX] = Cmd; //Command to send + mFrameData[FRAME_SIZE1_INDEX] = (unsigned char)((Size >> 24) & 0xFF); + mFrameData[FRAME_SIZE2_INDEX] = (unsigned char)((Size >> 16) & 0xFF); + mFrameData[FRAME_SIZE3_INDEX] = (unsigned char)((Size >> 8) & 0xFF); + mFrameData[FRAME_SIZE4_INDEX] = (unsigned char)(Size & 0xFF); + memcpy((void*)&mFrameData[FRAME_DATA_INDEX],(void*)Data,Size); //Cmd data + mFrameData[Size+FRAME_DATA_INDEX] = ProtocolCalcCrc(mFrameData,Size + FRAME_DATA_INDEX); // CRC + + *FrameSize = Size + FRAME_INDEX_NBR; + + return &mFrameData[FRAME_HEADER_INDEX]; + +} + +unsigned char *ProtocolMsgDataPtr(ProtocolData_t *ProtocolData) +{ + return &ProtocolData->mRxData[FRAME_DATA_INDEX]; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/NetworkProtocol.h b/AudioConsole.X/Source/NetworkProtocol.h new file mode 100644 index 0000000..e7a13ab --- /dev/null +++ b/AudioConsole.X/Source/NetworkProtocol.h @@ -0,0 +1,102 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Fran�ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.h + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ + + +#ifndef BOOTLOADERINTERFACE_H +#define BOOTLOADERINTERFACE_H + +//Protocol buffer specific definitions +#include "ProtocolDefs.h" + +#define MASTER_ADDRESS 0x01 +#define MY_DEVICE_ADDRESS 0x01 + +#define ADDRESS 0x01 + +enum eProtocolUser +{ + NETWORK_PROTOCOL_USER_LORA, + NETWORK_PROTOCOL_USER_LTE +}; + +//State Machine states +enum States +{ + Initialization, + RxHeader, + RxAdd, + RxID, + RxMyID, + RxMyAddress, + RxFlags, + RxCMD, + RxSize1, + RxSize2, + RxSize3, + RxSize4, + RxData, + RxCRC +}; + +//enum DEVICES_IDS +//{ +// ID_MASTER, //Master Controller +// ID_CONSOLE, //LCD Console +// ID_PC, //PC +// ID_AV_MUX, //Audio Video Multiplexer +// ID_IR_REMOTE, +// ID_DEADBOLT +//}; + +//enum MESSAGE_IDS +//{ +// TX_NETWORK_ACK = 1, +// RX_GET_STATUS, +// TX_DEADBOLT_STATUS, +// +// MAX_NETWORK_CMD +//}; + +//State machine states definition + +typedef struct stProtocolData +{ +unsigned char mRxData[MAX_MESSAGE_SIZE+10]; +unsigned char mTxData[MAX_MESSAGE_SIZE+10]; +unsigned int DataSize; +unsigned int DataCtr; +unsigned int BufPtr; +unsigned char RxPtr; +unsigned char Command; +unsigned char State; +unsigned char CRC; +unsigned char SenderID; +unsigned char SenderAddress; +unsigned char Flags; +unsigned char IsUpdating; +unsigned char *BmpDataPtr; +}ProtocolData_t; + +void ProtocolInit(int User); +void StateMachine(unsigned char STATE, ProtocolData_t *ProtocolData); +void ProtocolAnalyzeNewData(unsigned char RxByte, int User); +void ResetStateMachine(ProtocolData_t *ProtocolData); +void ProtocolExecCmd(void); +void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data); +unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize); +unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size); +unsigned char ProtocolIsReceiving(void); +unsigned char *ProtocolMsgDataPtr(ProtocolData_t *ProtocolData); + +#endif \ No newline at end of file diff --git a/AudioConsole.X/Source/PWMCtrl.c b/AudioConsole.X/Source/PWMCtrl.c new file mode 100644 index 0000000..7545c1e --- /dev/null +++ b/AudioConsole.X/Source/PWMCtrl.c @@ -0,0 +1,31 @@ +#include "PWMCtrl.h" +#include "BoardCfg.h" + + +void PWMSetValue(unsigned int percent) +{ + if(percent > 100) + percent = 100; +#ifdef REVERSE_POLARITY + percent = 100 - percent; +#endif + + LED_PWM_VAL_REG = ((PWM_RANGE_MAX / 100) * percent); + +} + +void PWMShutDown() +{ + PWMSetValue(0); +} + +void PWMSetAbsoluteValue(unsigned int value) +{ + if(value > PWM_RANGE_MAX) + { + value = PWM_RANGE_MAX; + } + + LED_PWM_VAL_REG = value; + +} \ No newline at end of file diff --git a/AudioConsole.X/Source/PWMCtrl.h b/AudioConsole.X/Source/PWMCtrl.h new file mode 100644 index 0000000..33c52ca --- /dev/null +++ b/AudioConsole.X/Source/PWMCtrl.h @@ -0,0 +1,18 @@ +/* + * File: PWMCtrl.h + * Author: JF + * + * Created on November 29, 2018, 5:24 PM + */ + +#ifndef PWMCTRL_H +#define PWMCTRL_H + +#define REVERSE_POLARITY + +void PWMSetValue(unsigned int percent); +void PWMShutDown(); +void PWMSetAbsoluteValue(unsigned int value); + +#endif /* PWMCTRL_H */ + diff --git a/AudioConsole.X/Source/PinguinoBoard.c b/AudioConsole.X/Source/PinguinoBoard.c new file mode 100644 index 0000000..6f5e557 --- /dev/null +++ b/AudioConsole.X/Source/PinguinoBoard.c @@ -0,0 +1,97 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; +// HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + +// HEARTBEAT_LED_2_PIN = LED_ON; + HEARTBEAT_LED_1_PIN = LED_ON; + + GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; + GP_DEBUG_1_PIN = 0; + GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; + GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; +// WIFI_WAKE_PIN_DIR = PIN_OUTPUT; +// WIFI_WAKE_PIN = 1; + WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Rising edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 0; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 500000); + SPI2CONbits.ON = 1; + + + + //Control knob encoder + KNOB_PH_A_PIN_DIR = PIN_INPUT; + KNOB_PH_B_PIN_DIR = PIN_INPUT; + KNOB_TGLE_BTN_PIN_DIR = PIN_INPUT; + IEC0bits.INT1IE = 0; + IFS0bits.INT1IF = 0; + INTCONbits.INT1EP = 1; //Rising edge + IPC1bits.INT1IP = 2; + IPC1bits.INT1IS = 1; +// IEC0bits.INT1IE = 1; + + + + + + //Led controller PWM + LED_PWM_PIN_DIR = PIN_OUTPUT; + LED_PWM_PIN = 0; + + OC3CON = 0; + OC3R = 0; + OC3RS = 2000; //50% PWM + OC3CONbits.OCTSEL = 0; + OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + + T2CONbits.TON = 0; // Disable Timer + T2CONbits.TCS = 0; // Select internal instruction cycle clock + T2CONbits.TGATE = 0; // Disable Gated Timer mode + T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler + TMR2 = 0x00; // Clear timer register + + //PR2 = 256; // Load the period value + PR2 = PWM_RANGE_MAX; //10KHz @ 80MHz + + IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level + IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag + IEC0bits.T2IE = 0; // Disable Timer 2 interrupt + T2CONbits.TON = 1; // Start Timer + + OC3CONbits.ON = 1; + + + return RET_OK; +} diff --git a/AudioConsole.X/Source/PrintfServer.c b/AudioConsole.X/Source/PrintfServer.c new file mode 100644 index 0000000..418366e --- /dev/null +++ b/AudioConsole.X/Source/PrintfServer.c @@ -0,0 +1,104 @@ +#include "define.h" +#include "PrintfServer.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include + +//BYTE vTelnetSession; +WORD w, w2; +#ifdef USE_WINC1500 +#else +TCP_SOCKET MyPrintfSocket; +#endif + +char mPrintfString[1024]; //Make shure this string is at least as big as the heap +BOOL mPrintfAvailable; + +int OpenPrintfServer() +{ + memset(mPrintfString,'\0',1024); + +#ifdef USE_WINC1500 + return 0; +#else + MyPrintfSocket = TCPOpen(0, TCP_OPEN_SERVER, 6463, TCP_PURPOSE_GENERIC_TCP_SERVER); + + + if (MyPrintfSocket == INVALID_SOCKET) + { + + return 0; + } + mPrintfAvailable = FALSE; + return 1; +#endif + +} + +void TickPrintfServer() +{ + int length; + static int PrintfServerTickState = PRINTF_SERVER_INIT_STATE; + + switch(PrintfServerTickState) + { + case PRINTF_SERVER_INIT_STATE: + { + if(OpenPrintfServer() == 1) + { + PrintfServerTickState = PRINTF_SERVER_RUN_STATE; + } + break; + } + case PRINTF_SERVER_RUN_STATE: + { + +#ifdef USE_WINC1500 +#else + if(TCPIsConnected(MyPrintfSocket) == FALSE) + { + mPrintfAvailable = FALSE; + return; + } + else + { + if(mPrintfAvailable == FALSE) + { + mPrintfAvailable = TRUE; + TCPPutString(MyPrintfSocket,"Sprinkler printf console\n"); + + } + } + + + + length = (int)strlen(mPrintfString); + if(length > 0 /*&& TCPIsPutReady(MySocket) > length*/) + { + TCPPutString(MyPrintfSocket,mPrintfString); + memset(mPrintfString,'\0',1024); + } +#endif + + break; + } + } + } + +void TelnetPutPrintf(char c) +{ + if(mPrintfAvailable == FALSE) + return; + +// if(strlen(mPrintfString) >= 1000) +// return; +// +// strncat(mPrintfString,&c,1); +#ifdef USE_WINC1500 +#else + TCPPut(MyPrintfSocket,c); +#endif + // TCPFlush(MyPrintfSocket); +} diff --git a/AudioConsole.X/Source/PrintfServer.h b/AudioConsole.X/Source/PrintfServer.h new file mode 100644 index 0000000..2b10d8c --- /dev/null +++ b/AudioConsole.X/Source/PrintfServer.h @@ -0,0 +1,17 @@ + + +#ifndef PRINTFSERVER_H +#define PRINTFSERVER_H + +enum ePrintfServerTickStates +{ + PRINTF_SERVER_INIT_STATE, + PRINTF_SERVER_RUN_STATE +}; + +int OpenPrintfServer(); +void TickPrintfServer(); +void TelnetPutPrintf(char c); + + +#endif \ No newline at end of file diff --git a/AudioConsole.X/Source/ProtocolDefs.h b/AudioConsole.X/Source/ProtocolDefs.h new file mode 100644 index 0000000..c06bb08 --- /dev/null +++ b/AudioConsole.X/Source/ProtocolDefs.h @@ -0,0 +1,344 @@ +/********************************************************************** + Project: Automatic cat feeder + Date: march 19 2006 + Author: Jean-François Martel + Target: PIC 18F252 + Compiler: Microchip mcc18 + Filename: Protocol.h + + File description: Communication protocol implementation. + + + jean-francois.martel@polymtl.ca + **********************************************************************/ + +#ifndef PROTOCOLDEFS_H +#define PROTOCOLDEFS_H + +//Protocol buffer specific definitions + +#define MAX_BOOTLOADER_MESSAGE_SIZE 25 +#define MAX_MESSAGE_SIZE 300 +#define BOOTLOADER_MAX_MESSAGE_SIZE 50 + + +#define FRAME_HEADER 0x8A +#define BOOTLOADER_HEADER 0xA8 +#define DATA_START 11 +#define PROTOCOL_ACK 0xA3 +#define PROTOCOL_NAK 0x90 +#define BROADCAST_VALUE 0xFF + +#define MASTER_RECONNECTION_TIMEOUT 25000 //Try to reconnect every 5s +#define MASTER_RESPONSE_TIMEOUT 30000 //Wait max 30s for the master to respond... + +enum eFrameIndex +{ + FRAME_HEADER_INDEX = 0, + FRAME_SENDER_ADDRESS_INDEX, + FRAME_SENDER_DEVICE_ID_INDEX, + FRAME_DEST_DEVICE_ID_INDEX, + FRAME_DEST_ADDRESS_INDEX, + FRAME_FLAGS_INDEX, + FRAME_COMMAND_INDEX, + FRAME_SIZE1_INDEX, + FRAME_SIZE2_INDEX, + FRAME_SIZE3_INDEX, + FRAME_SIZE4_INDEX, + FRAME_DATA_INDEX, + + FRAME_INDEX_NBR +}; + +enum DEVICES_IDS +{ + ID_MASTER, //Master Controller + ID_CONSOLE, //LCD Console + ID_PC, //PC + ID_AV_MUX, //Audio Video Multiplexer + ID_IR_REMOTE, //Infra red transmitter + ID_DEADBOLT_DEVICE, + ID_AV_RECEIVER, + ID_SMS_CLIENT, + ID_ETHERNET_VIRTUAL, + ID_SPRINKLER_DEVICE, + ID_SPRINKLER_INTERFACE, + ID_DEADBOLT_INTERFACE, + ID_AVRECEIVER_INTERFACE, + ID_CHALET_INTERFACE, + ID_CHALET_DEVICE, + ID_BOOTLOADER_VIRTUAL, + ID_NB_DEVICE_ID + +}; + +// Commands definitions + +enum MASTER_CMD +{ + RX_MASTER_GET_STATUS, + TX_MASTER_STATUS, + TX_MASTER_ACK, + RX_MASTER_SET_NET_INFO, + RX_MASTER_GET_NET_INFO, + TX_MASTER_NET_INFO, + RX_MASTER_SEND_DEVICE_CMD, + TX_MASTER_SEND_DEVICE_CMD_ACK, + RX_MASTER_SET_WEATHER_INFO, + TX_MASTER_SET_WEATHER_INFO_ACK, + RX_MASTER_SET_MAIL_MSG, + TX_MASTER_SET_MAIL_MSG_ACK, + RX_MASTER_NEW_OUTLOOK_EMAILS, + TX_MASTER_NEW_OUTLOOK_EMAILS_ACK, + RX_MASTER_TODAYS_EVENTS, + TX_MASTER_TODAYS_EVENTS_ACK +}; + + +//CONSOLE +enum CONSOLE_CMD +{ + RX_CONSOLE_GET_STATUS, + TX_CONSOLE_STATUS, + TX_CONSOLE_ACK, + RX_START_CALIBRATION, + RX_GET_CONSOLE_EVENT_MSG, + TX_CONSOLE_EVENT_MSG, + RX_CONSOLE_SHOW_CALLER_ID, + RX_SET_TIME, + RX_SET_WEATHER, + RX_SEND_NEW_MAIL_MSG, + RX_SEND_NEW_MAIL_MSG_ACK, + RX_NEW_OUTLOOK_EMAILS, + TX_NEW_OUTLOOK_EMAILS_ACK, + RX_TODAYS_EVENTS, + TX_TODAYS_EVENTS_ACK, + LAST_CONSOLE_CMD +}; + + + +enum IR_REMOTE_CMDS +{ + TX_IR_REMOTE_ACK = 1, + RX_GET_STATUS, + TX_REMOTE_STATUS, + RX_TRANSMIT_CMD, + RX_LEARN_IR_CMD, + TX_LEARN_IR_CMD_FINISHED, + RX_GET_IR_DATA, + TX_SEND_IR_DATA, + RX_SET_IR_CMD, + RX_SET_IR_DATA, + RX_GET_IR_CMD, + TX_SEND_IR_CMD, + MAX_IR_REMOTE_CMD +}; + +//The SMS remote interface commands +enum SMS_CLIENT_CMDS +{ + SMS_CLIENT_DEVICE_ACK = 1, + SMS_CLIENT_DEVICE_STATUS_REQUEST, + SMS_CLIENT_DEVICE_STATUS_RESPONSE, + SMS_CLIENT_DEVICE_DID_INFO_REQUEST, + SMS_CLIENT_DEVICE_DID_INFO_RESPONSE, + SMS_CLIENT_DEVICE_GET_ALL_MSG_REQUEST, + SMS_CLIENT_DEVICE_GET_ALL_MSG_RESPONSE, + SMS_CLIENT_DEVICE_NEW_MSG_NOTIFICATION, + SMS_CLIENT_DEVICE_SEND_SMS_REQUEST, + SMS_CLIENT_DEVICE_SEND_SMS_ACK, + SMS_CLIENT_DEVICE_GET_CONTACTS_REQUEST, + SMS_CLIENT_DEVICE_GET_CONTACTS_RESPONSE,//12 + SMS_CLIENT_DEVICE_CONTACTS_CHANGED_NOTIFICATION, + + SMS_CLIENT_DEVICE_MAX_MSG + +}; + +//The actual deadbolt device commands +enum DEADBOLT_CMDS +{ + DEADBOLT_DEVICE_ACK = 1, + DEADBOLT_DEVICE_STATUS_REQUEST, + DEADBOLT_DEVICE_STATUS_RESPONSE, + DEADBOLT_DEVICE_GET_LOCKED_STATE_REQUEST, + DEADBOLT_DEVICE_LOCKED_STATE_RESPONSE, + DEADBOLT_DEVICE_GOTO_LOCKED_REQUEST, + DEADBOLT_DEVICE_GOTO_LOCKED_ACK, + DEADBOLT_DEVICE_GOTO_UNLOCKED_REQUEST, + DEADBOLT_DEVICE_GOTO_UNLOCKED_ACK, + DEADBOLT_DEVICE_GET_PASSWORDS_REQUEST, + DEADBOLT_DEVICE_GET_PASSWORDS_RESPONSE, + DEADBOLT_DEVICE_SET_PASSWORDS_REQUEST, + DEADBOLT_DEVICE_SET_PASSWORDS_ACK, + DEADBOLT_DEVICE_LOCK_EVENT, + + MAX_DEADBOLT_DEVICE_CMD +}; + +//The actual sprinkler module device commands +enum SPRINKLER_DEVICE_CMDS +{ + SPRINKLER_DEVICE_ACK = 1, + SPRINKLER_DEVICE_STATUS_REQUEST, + SPRINKLER_DEVICE_STATUS_RESPONSE, + SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST, + SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK, + SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST, + SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE, + SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST, + SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE, + SPRINKLER_DEVICE_GET_MOISTURE_REQUEST, + SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE, + SPRINKLER_DEVICE_SET_PROGRAM_REQUEST, + SPRINKLER_DEVICE_SET_PROGRAM_ACK, + SPRINKLER_DEVICE_GET_PROGRAM_REQUEST, + SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE, + SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST, + SPRINKLER_DEVICE_SET_PARAMETERS_ACK, + SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST, + SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE, + + + MAX_SPRINKLER_DEVICE_CMD +}; + +//The sprinkler interface commands +enum SPRINKLER_INTERFACE_CMDS +{ + SPRINKLER_INTERFACE_ACK = 1, + SPRINKLER_INTERFACE_STATUS_REQUEST, + SPRINKLER_INTERFACE_STATUS_RESPONSE, + SPRINKLER_INTERFACE_GET_SPRINKLERS_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLERS_RESPONSE, + SPRINKLER_INTERFACE_GET_SPRINKLER_DATA_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLER_DATA_RESPONSE, + SPRINKLER_INTERFACE_SET_SPRINKLER_DATA_REQUEST, + SPRINKLER_INTERFACE_SET_SPRINKLER_DATA_ACK, + SPRINKLER_INTERFACE_GET_SPRINKLER_STATE_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLER_STATE_RESPONSE, + SPRINKLER_INTERFACE_SET_SPRINKLER_STATE_REQUEST, + SPRINKLER_INTERFACE_SET_SPRINKLER_STATE_ACK, + + MAX_SPRINKLER_INTERFACE_CMD +}; + + +enum ETHERNET_NETWORK_VIRTUAL_CMDS +{ + ETH_NETWK_DEVICE_INFO_REQUEST = 0xD0, + ETH_NETWK_DEVICE_INFO_RESPONSE, + ETH_NETWK_SET_DEVICE_INFO_ACK, + ETH_NETWK_CONNECTION_REFUSED, + + MAX_ETHERNET_NETWORK_VIRTUAL_CMDS + +}; + +enum AV_RECEIVER_INTERFACE_CMDS +{ + AV_RECEIVER_INTERFACE_ACK = 1, + AV_RECEIVER_INTERFACE_GENERAL_STATUS_REQUEST, + AV_RECEIVER_INTERFACE_GENERAL_STATUS_RESPONSE, + AV_RECEIVER_INTERFACE_SET_MAIN_POWER_REQUEST, + AV_RECEIVER_INTERFACE_SET_MAIN_POWER_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERB_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERB_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERA_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERA_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERS_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERS_RESPONSE, + AV_RECEIVER_INTERFACE_SEND_DIRECT_CMD_REQUEST, + AV_RECEIVER_INTERFACE_SEND_DIRECT_CMD_RESPONSE, + + + MAX_AV_RECEIVER_INTERFACE_CMD +}; + +enum CHALET_INTERFACE_CMDS +{ + CHALET_INTERFACE_ACK = 1, + CHALET_INTERFACE_GENERAL_STATUS_REQUEST, + CHALET_INTERFACE_GENERAL_STATUS_RESPONSE, + CHALET_INTERFACE_AC_POWER_STATE_STATUS_REQUEST, + CHALET_INTERFACE_AC_POWER_STATE_STATUS_RESPONSE, + CHALET_INTERFACE_AC_POWER_SET_STATE_REQUEST, + CHALET_INTERFACE_AC_POWER_SET_STATE_RESPONSE, + CHALET_INTERFACE_BATTERY_VOLTAGE_REQUEST, + CHALET_INTERFACE_BATTERY_VOLTAGE_RESPONSE, + + MAX_CHALET_INTERFACE_CMD +}; + +enum CHALET_CMDS +{ + CHALET_ACK = 1, + CHALET_GENERAL_STATUS_REQUEST, + CHALET_GENERAL_STATUS_RESPONSE, + CHALET_AC_POWER_STATE_STATUS_REQUEST, + CHALET_AC_POWER_STATE_STATUS_RESPONSE, + CHALET_AC_POWER_SET_STATE_REQUEST, + CHALET_AC_POWER_SET_STATE_RESPONSE, + CHALET_BATTERY_VOLTAGE_REQUEST, + CHALET_BATTERY_VOLTAGE_RESPONSE, + CHALET_BATTERY_CURRENT_REQUEST, + CHALET_BATTERY_CURRENT_RESPONSE, + CHALET_WIFI_STATUS_REQUEST, + CHALET_WIFI_STATUS_RESPONSE, + CHALET_WIFI_SET_STATE_REQUEST, + CHALET_WIFI_SET_STATE_RESPONSE, + CHALET_DO_HARAKIRI_REQUEST, + CHALET_DO_HARAKIRI_CONFIRMATION, + CHALET_REBOOT_CPU_REQUEST, + CHALET_REBOOT_CPU_RESPONSE, + CHALET_GET_STORED_WIFI_SETTINGS_REQUEST, + CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE, + CHALET_SET_STORED_WIFI_SETTINGS_REQUEST, + CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE, + CHALET_GET_FIRMWARE_VERSION_REQUEST, + CHALET_GET_FIRMWARE_VERSION_RESPONSE, + CHALET_CLEAR_COMMS_STATISTICS_REQUEST, + CHALET_CLEAR_COMMS_STATISTICS_RESPONSE, + CHALET_REGISTER_FRIENDLY_DEVICE_REQUEST, + CHALET_REGISTER_FRIENDLY_DEVICE_RESPONSE, + CHALET_FWD_DEVICE_MESSAGE_REQUEST, + CHALET_FWD_DEVICE_MESSAGE_RESPONSE, + + + MAX_CHALET_CMD +}; + +enum BOOTLOADER_CMDS +{ + BOOTLOADER_ACK = 1, + BOOTLOADER_HEARTBEAT_REQUEST, + BOOTLOADER_HEARTBEAT_RESPONSE, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE, + BOOTLOADER_INIT_UPLOAD_REQUEST, + BOOTLOADER_INIT_UPLOAD_RESPONSE, + BOOTLOADER_GET_STATE_REQUEST, + BOOTLOADER_GET_STATE_RESPONSE, + BOOTLOADER_READY_FOR_DATA_RESPONSE, + BOOTLOADER_SEND_DATA_CHUNK_REQUEST, + BOOTLOADER_SEND_DATA_CHUNK_RESPONSE, + BOOTLOADER_UPLOAD_FINISHED_REQUEST, + BOOTLOADER_UPLOAD_FINISHED_RESPONSE, + BOOTLOADER_EXECUTE_UPGRAGE_REQUEST, + BOOTLOADER_EXECUTE_UPGRADE_RESPONSE, + BOOTLOADER_ABORT_OPERATION_REQUEST, + BOOTLOADER_ABORT_OPERATION_RESPONSE, + BOOTLOADER_SEND_FLASH_DATA_REQUEST, + BOOTLOADER_SEND_FLASH_DATA_RESPONSE, + BOOTLOADER_SEND_FLASH_DATA_CHUNK, + BOOTLOADER_SEND_FLASH_DATA_CHUNK_RESPONSE, + BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST, + BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_RESPONSE, + BOOTLOADER_GET_STORED_FIRMWARE_INFO_REQUEST, + BOOTLOADER_GET_STORED_FIRMWARE_INFO_RESPONSE, + + MAX_BOOTLOADER_CMD +}; +#endif diff --git a/AudioConsole.X/Source/SDCardMgr.c b/AudioConsole.X/Source/SDCardMgr.c new file mode 100644 index 0000000..af20d88 --- /dev/null +++ b/AudioConsole.X/Source/SDCardMgr.c @@ -0,0 +1,212 @@ +#include "SDCardMgr.h" + +#ifdef USE_FATFS +#include "FatFS/diskio.h" +#include "FatFS/ff.h" + +FATFS FatFs; /* File system object */ +FIL File[2]; /* File objects */ +BYTE Buff[4096]; /* Working buffer */ + +#else +#include "sd_hw_ctl.h" +#include "FileSystem/fileio_lfn.h" +#endif + +#include +#include "timer.h" + +int mSDCardState; +int mCardDetected; +int mCardMounted; + +#ifdef USE_FATFS +#else +uint16_t mDriveLetter; +#endif + + +#ifdef USE_FATFS + +int InitSDCard() +{ + + + mSDCardState = SD_CARD_INIT_STATE; + mCardDetected = 0; + mCardMounted = 0; + + return MountDrive(); + + +} +int TickSDCard() +{ + return 1; +} + +int MountDrive() +{ + FRESULT res; + res = f_mount(&FatFs, "", 0); /* Give a work area to the default drive */ + if(!res) + { + printf("Could not mount SD card\n"); + return 1; + } + else + { + printf("SD Card mounted successfuly"); + } + + return 0; +} + +int IsDriveDetected() +{ + return mCardDetected; +} + +int IsDriveMounted() +{ + return mCardMounted; +} + +int ListRootDir() +{ + FRESULT res; + DIR dir; + UINT i; + static FILINFO fno; + char path[] = "/"; + + + + res = f_opendir(&dir, path); /* Open the directory */ + if (res == FR_OK) { + for (;;) { + res = f_readdir(&dir, &fno); /* Read a directory item */ + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ +// if (fno.fattrib & AM_DIR) { /* It is a directory */ +// i = strlen(path); +// sprintf(&path[i], "/%s", fno.fname); +// res = scan_files(path); /* Enter the directory */ +// if (res != FR_OK) break; +// path[i] = 0; +// } else { /* It is a file. */ + printf("%s/%s\n", path, fno.fname); + //} + } + f_closedir(&dir); + } + + + return 1; +} + +#else +void FILEIO_GetTimestamp (FILEIO_TIMESTAMP * timeStamp) +{ + timeStamp->date.bitfield.day = 6; + timeStamp->date.bitfield.month = 5; + timeStamp->date.bitfield.year = (2017 - 1980); + + timeStamp->time.bitfield.hours = 9; + timeStamp->time.bitfield.minutes = 5; + timeStamp->time.bitfield.secondsDiv2 = 0; + + timeStamp->timeMs = 0; + +} + +int InitSDCard() +{ + SD_SPIConfigurePins(); + FILEIO_Initialize(); + mSDCardState = SD_CARD_INIT_STATE; + + mCardDetected = 0; + mCardMounted = 0; + + mDriveLetter = 'D'; + TimerStart(SD_CARD_DETECT_TIMER,5000); + + return 1; +} + +int TickSDCard() +{ + switch(mSDCardState) + { + case SD_CARD_INIT_STATE: + { + if(IsTimerExpired(SD_CARD_DETECT_TIMER)) + { + if(FILEIO_MediaDetect(0, 0) == true) + { + mCardDetected = 1; + mSDCardState = SD_CARD_MOUNT_DRIVE_STATE; + printf("SD Card detected\n"); + } + else + { + TimerStart(SD_CARD_DETECT_TIMER,999); + } + } + break; + } + case SD_CARD_MOUNT_DRIVE_STATE: + { + if(FILEIO_DriveMount(mDriveLetter, 0, 0) == FILEIO_ERROR_NONE) + { + mCardMounted = 1; + mSDCardState = SD_CARD_READY_STATE; + printf("SD Card mounted on drive %c\n",(unsigned char)mDriveLetter); + } + else + { + mSDCardState = SD_CARD_ERROR_MOUNTING_STATE; + printf("Error mounting SD card.\n"); + } + break; + } + case SD_CARD_READY_STATE: + { +// if(FILEIO_MediaDetect(0, 0) == false) +// { +// mCardDetected = 0; +// mSDCardState = SD_CARD_INIT_STATE; +// } + break; + } + case SD_CARD_ERROR_MOUNTING_STATE: + { + //wait for removal of the sd card... +// if(FILEIO_MediaDetect(0, 0) == false) +// { +// mCardDetected = 0; +// mSDCardState = SD_CARD_INIT_STATE; +// printf("SD Card removed"); +// } + break; + } + } + +} + + +int MountDrive() +{ + +} + +int IsDriveDetected() +{ + return mCardDetected; +} + +int IsDriveMounted() +{ + return mCardMounted; +} +#endif diff --git a/AudioConsole.X/Source/SDCardMgr.h b/AudioConsole.X/Source/SDCardMgr.h new file mode 100644 index 0000000..8cf5d36 --- /dev/null +++ b/AudioConsole.X/Source/SDCardMgr.h @@ -0,0 +1,45 @@ +/* + * File: SDCardMgr.h + * Author: JF + * + * Created on May 18, 2017, 8:20 PM + */ + +#ifndef SDCARDMGR_H +#define SDCARDMGR_H +#ifdef USE_FATFS +//#include "FatFS/diskio.h" +#else +#include "FileSystem/fileio_lfn.h" +#endif + +enum eSDCardStates +{ + SD_CARD_INIT_STATE, + SD_CARD_MOUNT_DRIVE_STATE, + SD_CARD_READY_STATE, + SD_CARD_ERROR_MOUNTING_STATE +}; + +#ifdef USE_FATFS + +#else +void FILEIO_GetTimestamp(FILEIO_TIMESTAMP * timeStamp); +//void FILEIO_SETUP_HW(); +#endif + +int InitSDCard(); +int MountDrive(); +int IsDriveDetected(); +int IsDriveMounted(); +int TickSDCard(); + +int ListRootDir(); + + + +//void FILEIO_ + + +#endif /* SDCARDMGR_H */ + diff --git a/AudioConsole.X/Source/SIM7080GInterface.c b/AudioConsole.X/Source/SIM7080GInterface.c new file mode 100644 index 0000000..514b1e5 --- /dev/null +++ b/AudioConsole.X/Source/SIM7080GInterface.c @@ -0,0 +1,816 @@ +#include "SIM7080GInterface.h" +#include "BoardCfg.h" +#include "timer.h" +#include "Uart.h" +#include "Syslog.h" +#include "WiFiCtrl.h" +#include "ATCmdInterpreter.h" +#include "ProtocolDefs.h" +#include "NetworkProtocol.h" + +static BYTE mActivateNetworkCmd[] = "AT+CNACT=0,1\r"; +static BYTE mDisconnectNetworkCmd[] = "AT+CNACT=0,0\r"; +static BYTE mCheckAPNConnectionCmd[] = "AT+CNACT?\r"; +static BYTE mConnectToMasterCmd[] = "AT+CAOPEN=0,0,\"TCP\",\"grosgin.myftp.org\",2182\r"; +static BYTE mDisconnectFromMasterCmd[] = "AT+CACLOSE=0\r"; +static BYTE mReceiveDataCmd[] = "AT+CARECV=0,100\r"; + +char mMasterTxBuffer[MAX_MESSAGE_SIZE]; +int mMasterTxSize; + +int mLTEModuleSMState; +int mLTEModuleOperationSMState; +int mLTEModuleOperationSMSubState; +int mNbCmdCharsReceived; +char mATCmd[LTE_MODULE_MAX_CMD_LENGTH]; +bool mIsPassthroughEnabled; +bool mModuleSerialDebugEnabled; +bool mPICSerialDebugEnabled; +int mCurrentCmd; +bool mIsInitializing; +int mNbMasterReconnectCount; + +bool mMasterConnected; +bool mMasterSocketError; +bool mAPNConnected; + +void InitLTEModule() +{ + mLTEModuleSMState = LTE_MODULE_SM_INIT_STATE; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_INIT_STATE; + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; + mNbCmdCharsReceived = 0; + mIsPassthroughEnabled = false; + mModuleSerialDebugEnabled = false; + mPICSerialDebugEnabled = false; + mCurrentCmd = LTE_MODULE_NO_CMD; + mIsInitializing = true; + mNbMasterReconnectCount = 0; + mMasterSocketError = false; + + mMasterConnected = false; + mAPNConnected = false; +} +int LTEModuleReset() +{ + InitLTEModule(); + return RET_OK; +} + +void LTEModuleSM(int SMEvent) +{ + switch(mLTEModuleSMState) + { + case LTE_MODULE_SM_INIT_STATE: + { +// LORA_MODULE_RELAY_PIN = 1; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); + mLTEModuleSMState = LTE_MODULE_SM_RESET_STATE; + break; + } + case LTE_MODULE_SM_RESET_STATE: + { + if(IsTimerExpired(LTE_MODULE_TIMER) == true) + { +// LORA_MODULE_RELAY_PIN = 0; +// LTE_MODULE_PWR_PIN = 0; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); + mLTEModuleSMState = LTE_MODULE_SM_POWERUP_STATE; + } + break; + } + case LTE_MODULE_SM_POWERUP_STATE: + { + if(IsTimerExpired(LTE_MODULE_TIMER) == true) + { +// LTE_MODULE_PWR_PIN = 1; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_WAIT_INIT_TIMEOUT); + mLTEModuleSMState = LTE_MODULE_SM_WAIT_RDY_STATE; + TimerStart(LTE_COMM_TIMER, LTE_MODULE_MAX_COMM_TIMEOUT); + } + break; + } + case LTE_MODULE_SM_WAIT_RDY_STATE: + { + if(SMEvent == LTE_MODULE_RX_RDY_EVENT) + { + mLTEModuleSMState = LTE_MODULE_SM_SETECHOOFF_STATE; + } + else if(SMEvent == LTE_MODULE_SM_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + break; + } + case LTE_MODULE_SM_SETECHOOFF_STATE: + { + char Cmd[5] = {'A','T','E','0','\r'}; + //UartTransmitData(LTE_IF_UART_PORT,Cmd,5); + SendDataToLteModule(Cmd,5); + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); + mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE; + break; + } + case LTE_MODULE_SM_SETAPN_STATE: + { + char Cmd[10] = {'A','T','+','C','G','N','A','P','N','\r'}; + //UartTransmitData(LTE_IF_UART_PORT,Cmd,10); + SendDataToLteModule(Cmd,10); + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); + mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE; + break; + } + case LTE_MODULE_SM_DELAY_STATE: + { + if(IsTimerExpired(LTE_MODULE_TIMER) == true) + { + mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE; + } + break; + } + case LTE_MODULE_SM_RUN_STATE: + { + if(SMEvent == LTE_MODULE_ENTER_PASSTHROUGH_EVENT) + { + mLTEModuleSMState = LTE_MODULE_SM_PASSTHROUGH_STATE; + SyslogNewString("LTE Module entering passthrough mode..."); + } + if(SMEvent == LTE_MODULE_SM_TICK_EVENT) + { + LTEModuleOperationSM(LTE_MODULE_OP_TICK_EVENT); + } + + break; + } + case LTE_MODULE_SM_PASSTHROUGH_STATE: + { + if(SMEvent == LTE_MODULE_EXIT_PASSTHROUGH_EVENT) + { + SyslogNewString("LTE Module exiting passthrough mode..."); + mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE; + } + break; + } + } +} + +void TickLTEModule() +{ + LTEModuleSM(LTE_MODULE_SM_TICK_EVENT); +} + + +void LTEModuleNewData(unsigned char Data) +{ + if(mIsPassthroughEnabled == true) + { + SyslogNewByte(Data); + // SendSyslogByte(Data); + return; + } + + if(mModuleSerialDebugEnabled == true) + { + SyslogNewByte(Data); + } + + if(Data == '\n') //ignore line feeds + return; + + if(Data != '\r') + { + if(mLTEModuleOperationSMState == LTE_MODULE_OPERATION_SENDING_DATA_STATE && Data == '>') + { + LTESendMasterBufferToModule(); + } + else if(mNbCmdCharsReceived < LTE_MODULE_MAX_CMD_LENGTH) + { + mATCmd[mNbCmdCharsReceived] = Data; + mNbCmdCharsReceived++; + } + else + { + //error... + mNbCmdCharsReceived = 0; + } + } + else + { + if(mNbCmdCharsReceived != 0) //New Command received + { + + if(mLTEModuleSMState == LTE_MODULE_SM_WAIT_RDY_STATE) + { + if(mATCmd[0] == 'R' && mATCmd[1] == 'D' && mATCmd[2] == 'Y') + { + LTEModuleSM(LTE_MODULE_RX_RDY_EVENT); + } + } + else if(mLTEModuleSMState == LTE_MODULE_SM_RUN_STATE) + { + AnalyzeNewATString(mATCmd,mNbCmdCharsReceived,mCurrentCmd); + mNbCmdCharsReceived = mNbCmdCharsReceived; + } + + mNbCmdCharsReceived = 0; + } + + } +} + +void LTEEnterSerialPassthrough() +{ + LTEModuleSM(LTE_MODULE_ENTER_PASSTHROUGH_EVENT); + mIsPassthroughEnabled = true; + SyslogSetLTEPassthrough(true); + mPICSerialDebugEnabled = false; + mModuleSerialDebugEnabled = false; +} +void LTEExitSerialPassthrough() +{ + LTEModuleSM(LTE_MODULE_EXIT_PASSTHROUGH_EVENT); + mIsPassthroughEnabled = false; + SyslogSetLTEPassthrough(false); +} + +void LTEFwdPassthroughData(char Data) +{ + if(mIsPassthroughEnabled == true) + { + UartTransmitData(LTE_IF_UART_PORT,&Data,1); + } + +} + +int LTEEnableSerialDebug(bool EnModule, bool EnPic) +{ + if(EnModule == true) + { + if(mIsPassthroughEnabled == true) + { + return RET_ERROR; + } + mModuleSerialDebugEnabled = true; + } + else + { + mModuleSerialDebugEnabled = false; + } + + if(EnPic == true) + { + if(mIsPassthroughEnabled == true) + { + return RET_ERROR; + } + + mPICSerialDebugEnabled = true; + } + else + { + mPICSerialDebugEnabled = false; + } + + return RET_OK; +} + +void SendDataToLteModule(char *Data, int Size) +{ + + if(mPICSerialDebugEnabled) + { + char *ptr = Data; + int i; + for(i = 0; i < Size; i++) + { + SyslogNewByte(*ptr++); + } + } + UartTransmitData(LTE_IF_UART_PORT,Data,Size); +} + +void LTECmdResponseReceived(int Cmd, int Result) +{ + switch(Cmd) + { + case LTE_MODULE_NO_CMD: + { + break; + } + case LTE_MODULE_CONNECT_APN_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_OK_EVENT); + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT); + } + break; + } + case LTE_MODULE_DISCONNECT_APN_CMD: + { + + break; + } + case LTE_MODULE_CHECK_APN_CONNECTION_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + if(mAPNConnected == true) + { + LTEModuleOperationSM(LTE_MODULE_OP_APN_CONNECTED_EVENT); + } + else + { + LTEModuleOperationSM(LTE_MODULE_OP_APN_DISCONNECTED_EVENT); + } + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT); + } + break; + } + case LTE_MODULE_CONNECT_TO_MASTER_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + if(mMasterConnected == true) + { + LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONNECTED_EVENT); + } + else + { + LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); + } + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT); + } + + break; + } + case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); + } + break; + } + case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + + } + break; + } + case LTE_MODULE_RX_DATA_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + //This case is managed by LTEModuleDataReceived() + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT); + } + break; + } + case LTE_MODULE_TX_DATA_CMD: + { + if(Result == LTE_MODULE_RESULT_OK) + { + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT); + } + else if(Result == LTE_MODULE_RESULT_ERROR) + { + //TODO: Manage a TX error... + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT); + } + break; + } + } +} +void LTEModuleAPNConnectionStatus(int Status) +{ + if(Status == LTE_MODULE_APN_CONNECTED) + { + mAPNConnected = true; + // SyslogNewString("APN connected\n"); + } + else + { + mAPNConnected = false; + // SyslogNewString("APN disconnected\n"); + } +} +void LTEModuleMasterConnectionStatus(int Status) +{ + if(Status == LTE_MODULE_MASTER_CONNECTED) + { + mMasterConnected = true; + // SyslogNewString("Master connected\n"); + } + else if(Status == LTE_MODULE_MASTER_SOCKET_ERROR) + { + mMasterConnected = false; + mMasterSocketError = true; + // SyslogNewString("Master socket error\n"); + } + else + { + mMasterConnected = false; + // SyslogNewString("Master disconnected\n"); + } +} + + +void LTEModuleOperationSM(int OperationEvent) +{ + switch(mLTEModuleOperationSMState) + { + case LTE_MODULE_OPERATION_INIT_STATE: + { + mIsInitializing = true; + //Send the request to connect module APN + LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD); + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE; + + break; + } + case LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE: + { + if(OperationEvent == LTE_MODULE_OP_APN_CONN_OK_EVENT) + { + //Send the request to confirm the state of the connection + + LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD); + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE; + } + else if(OperationEvent == LTE_MODULE_OP_APN_CONN_FAILED_EVENT) + { + //TODO: What do we do?? + LTEModuleReset(); //Something's wrong... reset the module. + } + else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + + break; + } + case LTE_MODULE_OPERATION_CHECK_APN_STATE: + { + if(OperationEvent == LTE_MODULE_OP_APN_CONNECTED_EVENT) + { + if(mIsInitializing == true) //The first time, try to connect the server immediately + { + mIsInitializing = false; + //Send the request to connect to Mastercontroller + LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD); + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE; + } + else + { + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + } + } + else if(OperationEvent == LTE_MODULE_OP_APN_DISCONNECTED_EVENT) + { + //Let the main loop retry later... + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + } + else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + break; + } + case LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE: + { + if(OperationEvent == LTE_MODULE_OP_SERVER_CONNECTED_EVENT) + { + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); + } + else if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT) + { + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); + + } + else if(OperationEvent == LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT) + { + //TODO: Should we reset the module instead? + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); + } + else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + break; + } + case LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE: + { + if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT) + { + //Always reconnect after a forced disconnection.. + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE; + LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD); + } + else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + break; + } + case LTE_MODULE_OPERATION_STANDBY_STATE: + { + if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerRunning(LTE_COMM_TIMER) == true) + { + TimerStop(LTE_COMM_TIMER); + } + switch(mLTEModuleOperationSMSubState) + { + case LTE_MODULE_OPERATION_NOMINAL_SUBSTATE: + { + if(IsTimerExpired(LTE_MODULE_TIMER) == true) + { + if(mMasterConnected == true) //All is good for now... + { + char tmp[] = "Ca marche\n\r"; + mNbMasterReconnectCount = 0; + TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); + } + else + { + //Master connection is lost... try to reconnect. + if(mNbMasterReconnectCount < LTE_MODULE_MAX_MASTER_CONNECT_RETRY) + { + mNbMasterReconnectCount++; + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE; + LTESendCommandToModule(LTE_MODULE_DISCONNECT_FROM_MASTER_CMD); //Always disconnect before reconnecting... + // SyslogNewString("Master reconnection attempt\n"); + } + else //We tried 10 times, check the APN + { + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE; + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE; + LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD); + mNbMasterReconnectCount = 0; + // SyslogNewString("Master reconnection attempt count reached.. checking APN\n"); + } + } + } + break; + } + case LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE: + { + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; + //TODO: check for SOCKET ERROR result code and reset APN directly here? + // if(mMasterSocketError == true) + // { + // mMasterSocketError = false; + // mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE; + // mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE; + // LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD); + // mNbMasterReconnectCount = 0; + // } + break; + } + case LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE: + { + if(mAPNConnected == true) + { + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; + } + else //APN is disconnected.. try reconnecting. + { + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE; + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE; + LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD); + } + break; + } + case LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE: + { + mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; + break; + } + default: + { + break; + } + } + } + else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_READY_EVENT) + { + LTESendCommandToModule(LTE_MODULE_RX_DATA_CMD); + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE; + } + else if(OperationEvent == LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT) + { + if(mMasterConnected == true) + { + LTESendCommandToModule(LTE_MODULE_TX_DATA_CMD); + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_SENDING_DATA_STATE; + } + } + break; + } + case LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE: + { + if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT) + { + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + } + else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + + break; + } + case LTE_MODULE_OPERATION_SENDING_DATA_STATE: + { + if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) + { + if(IsTimerExpired(LTE_COMM_TIMER) == true) + { + LTEModuleReset(); + } + } + else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_SENT_EVENT) + { + mCurrentCmd = LTE_MODULE_NO_CMD; + mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; + } + break; + } + } +} + + +void LTEModuleNewDataReady() +{ + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_READY_EVENT); +} +void LTEModuleDataReceived(char *Data, int Size) +{ + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT); + int i; + for(i = 0; i < Size; i++) + { + ProtocolAnalyzeNewData(Data[i], NETWORK_PROTOCOL_USER_LTE); + } +} + +int LTESendCommandToModule(int Cmd) +{ + switch(Cmd) + { + + TimerStart(LTE_COMM_TIMER,LTE_MODULE_MAX_COMM_TIMEOUT); + case LTE_MODULE_CONNECT_APN_CMD: + { + mCurrentCmd = LTE_MODULE_CONNECT_APN_CMD; + SendDataToLteModule(mActivateNetworkCmd,strlen(mActivateNetworkCmd)); + break; + } + case LTE_MODULE_DISCONNECT_APN_CMD: + { + mCurrentCmd = LTE_MODULE_DISCONNECT_APN_CMD; + SendDataToLteModule(mDisconnectNetworkCmd,strlen(mDisconnectNetworkCmd)); + break; + } + case LTE_MODULE_CONNECT_TO_MASTER_CMD: + { + mCurrentCmd = LTE_MODULE_CONNECT_TO_MASTER_CMD; + SendDataToLteModule(mConnectToMasterCmd,strlen(mConnectToMasterCmd)); + break; + } + case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD: + { + mCurrentCmd = LTE_MODULE_DISCONNECT_FROM_MASTER_CMD; + SendDataToLteModule(mDisconnectFromMasterCmd,strlen(mDisconnectFromMasterCmd)); + break; + } + case LTE_MODULE_RX_DATA_CMD: + { + mCurrentCmd = LTE_MODULE_RX_DATA_CMD; + SendDataToLteModule(mReceiveDataCmd,strlen(mReceiveDataCmd)); + break; + } + case LTE_MODULE_TX_DATA_CMD: + { + char Cmd[25]; + sprintf(Cmd,"AT+CASEND=0,%d\r",mMasterTxSize); + mCurrentCmd = LTE_MODULE_TX_DATA_CMD; + SendDataToLteModule(Cmd,strlen(Cmd)); + break; + } + case LTE_MODULE_CHECK_APN_CONNECTION_CMD: + { + mCurrentCmd = LTE_MODULE_CHECK_APN_CONNECTION_CMD; + SendDataToLteModule(mCheckAPNConnectionCmd,strlen(mCheckAPNConnectionCmd)); + break; + } + case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD: + { + break; + } + case LTE_MODULE_NO_CMD: + default: + { + TimerStop(LTE_COMM_TIMER); + mCurrentCmd = LTE_MODULE_NO_CMD; + return RET_ERROR; + break; + } + + } + return RET_OK; +} + +void LTEModuleMasterCtrlCommStatus(bool Offline) +{ + if(Offline == true) + { + mMasterConnected = false; + } + // else + // mMasterConnected = true; +} + +//This is the function to call from outside to send data to the server +int LTESendDataToMaster(char *Buffer, int Size) +{ +// LTE_MODULE_TX_LED_PIN = LED_ON; + if(Size > MAX_MESSAGE_SIZE) + { + return RET_ERROR; + } + if(mMasterConnected == false) + { + return RET_ERROR; + } + + memcpy(mMasterTxBuffer,Buffer,Size); + mMasterTxSize = Size; + LTEModuleOperationSM(LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT); + return RET_OK; +} + +//The module is ready... send the payload so it can transmit it to the master +int LTESendMasterBufferToModule() +{ + SendDataToLteModule(mMasterTxBuffer,mMasterTxSize); +// LTE_MODULE_TX_LED_PIN = LED_OFF; + return RET_OK; +} + +bool LTEModuleIsMasterConnected() +{ + return mMasterConnected; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/SIM7080GInterface.h b/AudioConsole.X/Source/SIM7080GInterface.h new file mode 100644 index 0000000..78944f6 --- /dev/null +++ b/AudioConsole.X/Source/SIM7080GInterface.h @@ -0,0 +1,153 @@ +/* + * File: SIM7080GInterface.h + * Author: JF + * + * Created on August 13, 2024, 1:43 PM + */ + +#ifndef SIM7080GINTERFACE_H +#define SIM7080GINTERFACE_H + +#include "define.h" + +#define LTE_MODULE_POWERUP_TIMEOUT 2000 +#define LTE_MODULE_WAIT_INIT_TIMEOUT 5000 +#define LTE_MODULE_CONNECTION_CHECK_TIMEOUT 5000 +#define LTE_MODULE_MAX_CMD_LENGTH 128 +#define LTE_MODULE_MAX_MASTER_CONNECT_RETRY 5 +#define LTE_MODULE_MAX_COMM_TIMEOUT 10000 + +enum eLTEModuleCommands +{ + LTE_MODULE_NO_CMD = 0, + LTE_MODULE_CONNECT_APN_CMD, + LTE_MODULE_DISCONNECT_APN_CMD, + LTE_MODULE_CONNECT_TO_MASTER_CMD, + LTE_MODULE_DISCONNECT_FROM_MASTER_CMD, + LTE_MODULE_RX_DATA_CMD, + LTE_MODULE_TX_DATA_CMD, + LTE_MODULE_CHECK_APN_CONNECTION_CMD, + LTE_MODULE_CHECK_MASTER_CONNECTION_CMD, + + LTE_MODULE_MAX_CMD +}; + +enum eLTEModuleCmdResult +{ + LTE_MODULE_RESULT_OK, + LTE_MODULE_RESULT_ERROR +}; + +enum eLTEModuleAPNConnectionStatus +{ + LTE_MODULE_APN_DISCONNECTED, + LTE_MODULE_APN_CONNECTED +}; + +enum eLTEModuleMasterConnectionStatus +{ + LTE_MODULE_MASTER_DISCONNECTED, + LTE_MODULE_MASTER_CONNECTED, + LTE_MODULE_MASTER_SOCKET_ERROR +}; + + +enum eLTEModuleStates +{ + LTE_MODULE_SM_INIT_STATE, + LTE_MODULE_SM_RESET_STATE, + LTE_MODULE_SM_POWERUP_STATE, + LTE_MODULE_SM_WAIT_RDY_STATE, + LTE_MODULE_SM_SETECHOOFF_STATE, + LTE_MODULE_SM_SETAPN_STATE, + LTE_MODULE_SM_DELAY_STATE, + LTE_MODULE_SM_RUN_STATE, + LTE_MODULE_SM_PASSTHROUGH_STATE, + + LTE_MODULE_SM_MAX_STATE + +}; + +enum eLTEModuleEvents +{ + LTE_MODULE_SM_TICK_EVENT, + LTE_MODULE_RX_DATA_EVENT, + LTE_MODULE_RX_RDY_EVENT, + LTE_MODULE_ENTER_PASSTHROUGH_EVENT, + LTE_MODULE_EXIT_PASSTHROUGH_EVENT, + + LTE_MODULE_MAX_EVENT + +}; + +enum eLTEModuleOperationStates +{ + LTE_MODULE_OPERATION_INIT_STATE, + LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE, + LTE_MODULE_OPERATION_CHECK_APN_STATE, + LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE, + LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE, + LTE_MODULE_OPERATION_STANDBY_STATE, + LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE, + LTE_MODULE_OPERATION_SENDING_DATA_STATE, + + LTE_MODULE_OPERATION_MAX_STATE +}; + +enum eLTEModuleOperationSubStates +{ + LTE_MODULE_OPERATION_NOMINAL_SUBSTATE, + LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE, + LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE, + LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE, + + LTE_MODULE_OPERATION_MAX_SUBSTATE +}; + +enum eLTEModuleOperationSMEvents +{ + LTE_MODULE_OP_TICK_EVENT, + LTE_MODULE_OP_APN_CONNECTED_EVENT, + LTE_MODULE_OP_APN_DISCONNECTED_EVENT, + LTE_MODULE_OP_APN_CONN_FAILED_EVENT, + LTE_MODULE_OP_APN_CONN_OK_EVENT, + LTE_MODULE_OP_SERVER_CONNECTED_EVENT, + LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT, + LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT, + LTE_MODULE_OP_CMD_RESP_RECEIVED_EVENT, + LTE_MODULE_OP_MASTER_DATA_READY_EVENT, + LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT, + LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT, + LTE_MODULE_OP_MASTER_DATA_SENT_EVENT, + + LTE_MODULE_OP_MAX_EVENT +}; + + + +void InitLTEModule(); +void LTEModuleSM(int SMEvent); +void TickLTEModule(); +void LTEModuleOperationSM(int OperationEvent); +void LTEModuleNewData(unsigned char Data); +void LTEEnterSerialPassthrough(); +void LTEExitSerialPassthrough(); +void LTEFwdPassthroughData(char Data); +int LTEEnableSerialDebug(bool EnModule, bool EnPic); +int LTESendCommandToModule(int Command); +void SendDataToLteModule(char *Data, int Size); +int LTEModuleReset(); +int LTESendDataToMaster(char *Buffer, int Size); +int LTESendMasterBufferToModule(); + +void LTECmdResponseReceived(int Cmd, int Result); +void LTEModuleAPNConnectionStatus(int Status); +void LTEModuleMasterConnectionStatus(int Status); +void LTEModuleNewDataReady(); +void LTEModuleDataReceived(char *Data, int Size); +void LTEModuleMasterCtrlCommStatus(bool Offline); + +bool LTEModuleIsMasterConnected(); + +#endif /* SIM7080GINTERFACE_H */ + diff --git a/AudioConsole.X/Source/SPI.c b/AudioConsole.X/Source/SPI.c new file mode 100644 index 0000000..2eb6892 --- /dev/null +++ b/AudioConsole.X/Source/SPI.c @@ -0,0 +1,20 @@ +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" + +unsigned char SPITransaction(unsigned char OutBuf, unsigned char BaudRate) +{ + + SPI2BRG = BaudRate; + + // WIFI_SPI_SS_PIN = 0; + + SPI2BUF = OutBuf; + while(!SPI2STATbits.SPIRBF); + + OutBuf = SPI2BUF; + + // WIFI_SPI_SS_PIN = 1; + + return OutBuf; +} diff --git a/AudioConsole.X/Source/SPI.h b/AudioConsole.X/Source/SPI.h new file mode 100644 index 0000000..b464442 --- /dev/null +++ b/AudioConsole.X/Source/SPI.h @@ -0,0 +1,14 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef SPI_H +#define SPI_H + +unsigned char SPITransaction(unsigned char OutBuf, unsigned char Baudrate); + +#endif /* SPI_H */ + diff --git a/AudioConsole.X/Source/SPI_Flash.c b/AudioConsole.X/Source/SPI_Flash.c new file mode 100644 index 0000000..257c036 --- /dev/null +++ b/AudioConsole.X/Source/SPI_Flash.c @@ -0,0 +1,432 @@ +#include "SPI_Flash.h" +#include "SPI.h" +#include "BoardCfg.h" + +unsigned char mSPIFlashBaudrate; +unsigned char mSPIFlashHighSpeedBaudrate; +unsigned char mFlashSectorBuffer[SPI_FLASH_SECTOR_SIZE]; +unsigned int mSPIFlashOK; + +int InitSPIFlash() +{ + FLASH_SS_PIN = 1; + + mSPIFlashBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 25000000); +// mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 50000000); + mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 35000000); + mSPIFlashOK = 0; +} + +int SPIFlashCheckAndConfigure() +{ + + if(SPIFlashCheckChipID() == RET_OK) + { + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_STATUS_REG,mSPIFlashHighSpeedBaudrate); + SPITransaction(0x00,mSPIFlashHighSpeedBaudrate); //Configure for write enable the whole memory + FLASH_SS_PIN = 1; + + SPIFlashReadStatusReg(1); + + mSPIFlashOK = 1; + printf("SPI Flash configured\n"); + return RET_OK; + } + + mSPIFlashOK = 0; + printf("ERROR: SPI Flash not detected\n"); + return RET_ERROR; + +} + +int SPIFlashIsPresent() +{ + return mSPIFlashOK; +} + +int SPIFlashWriteEnable() +{ + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_ENABLE,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + return RET_OK; +} + + + +unsigned char SPIFlashReadStatusReg(int print) +{ + unsigned char result; + + FLASH_SS_PIN = 0; + result = SPITransaction(SPI_FLASH_READ_STATUS_REG,mSPIFlashBaudrate); + result = SPITransaction(0x00,mSPIFlashBaudrate); //get data + FLASH_SS_PIN = 1; + + if(print) + { + printf("Flash status register : 0x%x\n",result); + } + + return result; + +} + +int SPIFlashCheckBusy() +{ + unsigned char status = SPIFlashReadStatusReg(0); + if((status & SPI_FLASH_BUSY_MASK) != 0) + { + return 1; + } + + return 0; +} + + +int SPIFlashCheckChipID() +{ + unsigned char VendorID, ChipID; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_READ_ID,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); //Vendor address + VendorID = SPITransaction(0x00,mSPIFlashBaudrate); //Vendor ID, should be 0xBF + ChipID = SPITransaction(0x00,mSPIFlashBaudrate); //Device ID, should be 0x41 + FLASH_SS_PIN = 1; + + if(VendorID != SPI_FLASH_VENDOR_ID || ChipID != SPI_FLASH_CHIP_ID) + { + printf("SPI Flash detection FAILED. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_ERROR; + } + printf("SPI Flash detected. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_OK; + +} + + +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + if(StartAddress + Size - 1 > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_HI_SPEED_READ,mSPIFlashBaudrate); + SPITransaction(((StartAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((StartAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((StartAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction((0x00),mSPIFlashHighSpeedBaudrate); //Chip requires a dummy read in high speed + + int i; + for(i = 0; i < Size; i++) + { + unsigned char tmp; + tmp =SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + *Buf++ = tmp; + // *Buf++ = SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + } + + FLASH_SS_PIN = 1; + + return RET_OK; +} + +int SPIFlashEraseSector(int SectorAddress) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_4KB_SECOTR_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + //SPIFlashWriteEnable(); + + return RET_OK; +} + +int SPIFlashErase64KSector(int SectorAddress, int Blocking) +{ + if(SectorAddress % SPI_FLASH_64K_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + if((SectorAddress + SPI_FLASH_64K_SECTOR_SIZE - 1) > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_64KB_BLOCK_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(Blocking != 0) + { + while( SPIFlashCheckBusy() == true); + // SPIFlashWriteEnable(); + } + + return RET_OK; +} + + + +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + if(Erase == 1) + { + SPIFlashEraseSector(SectorAddress); + } + + unsigned char *DataPtr = &mFlashSectorBuffer[0]; + int j; + for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) + { + unsigned char curbyte; + curbyte = *DataPtr; + SPIFlashWriteEnable(); + + + + char Add1, Add2, Add3; + Add1 = (unsigned char)((SectorAddress & 0xFF0000) >> 16); + Add2 = ((unsigned char)((SectorAddress & 0x00FF00) >> 8)); + Add3 = ((unsigned char)(SectorAddress & 0x0000FF)); + + int t; + t = 0; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)(SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(Add1,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add2,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add3,mSPIFlashHighSpeedBaudrate); + + SPITransaction(curbyte,mSPIFlashHighSpeedBaudrate); +// SPITransaction(*DataPtr,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + DataPtr++; + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + } + + return RET_OK; +} + +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking) +{ + if(ByteAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((ByteAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(byte,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(blocking) + { + while( SPIFlashCheckBusy() == true); + } + + + return RET_OK; + +} + + + +//int SPIFlashEraseSectorForWrite(unsigned char StartAddress, int Size) +//{ +// //First, let's determine which sector to erase. +// +// int NbSectors = 1; +// int FirstSector = StartAddress / 0x1000; +// int LastSector = (StartAddress + Size) / 0x1000; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector; +// } +// +// int i; +// for(i = FirstSector; i < LastSector; i++ ) //Erase each sector one by one +// { +// +// } +// +//} + +//int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +//{ +// //First, we need to determine if the data overlaps or uses more than one sector +// //First, let's determine which sector to erase. +// int EndAddress = StartAddress + Size - 1; +// if(EndAddress > SPI_FLASH_MAX_ADDRESS) +// { +// return RET_ERROR; +// } +// +// int NbSectors = 1; +// int FirstSector = StartAddress / SPI_FLASH_SECTOR_SIZE; +// int LastSector = EndAddress / SPI_FLASH_SECTOR_SIZE; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector + 1; +// } +// +// int i; +// int FlashAddress = StartAddress; +// int CurSector = FirstSector; +// for(i = 0; i < NbSectors; i++ ) //Read, erase and write each sector one by one +// { +// //first we need to backup the data outside our buffer. +// //TODO: optimize +// int SectorStartAddress = CurSector++ * SPI_FLASH_SECTOR_SIZE; +// int SectorEndAddress = SectorStartAddress + SPI_FLASH_SECTOR_SIZE - 1; +// if(SectorEndAddress > EndAddress) +// { +// SectorEndAddress = EndAddress; +// } +// +// SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress); //Get local RAM buffer of the sector +// +// //Update the data to write. +// int RAMAddress = FlashAddress - SectorStartAddress; +// int RAMSectorSize = SectorEndAddress - FlashAddress + 1; +// FlashAddress += RAMSectorSize; +// +// unsigned char* RAMPtr = &mFlashSectorBuffer[RAMAddress]; +// int j; +// for(j = 0; j < RAMSectorSize; j++) +// { +// *RAMPtr++ = *Buf++; +// } +// +// int SectorAddress = SectorStartAddress; +// RAMPtr = mFlashSectorBuffer; +// +// for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) +// { +// SPIFlashWriteEnable(); +// +// FLASH_SS_PIN = 0; +// SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashBaudrate); +// SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashBaudrate); +// SPITransaction((SectorAddress & 0x0000FF),mSPIFlashBaudrate); +// SPITransaction(*RAMPtr++,mSPIFlashBaudrate); +// FLASH_SS_PIN = 1; +// +// SectorAddress++; +// +// while( SPIFlashCheckBusy() == true); +// } +// } +//} + +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + int CurDataFlashAddress, DataFlashEndAddress; + char *DataBufPtr, *WorkPagePtr; + int WriteFinished; + + + //Init stuff + WriteFinished = 0; + DataFlashEndAddress = StartAddress + Size; //Start + size means the data at "DataFlashEndAddress" should not be written. + CurDataFlashAddress = StartAddress; + DataBufPtr = Buf; + + if(DataFlashEndAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + while(WriteFinished == 0) + { + //Determine the current sector start address. + int SectorStartAddress; + SectorStartAddress = ((CurDataFlashAddress / SPI_FLASH_SECTOR_SIZE) * SPI_FLASH_SECTOR_SIZE); //Weird but it works + + //Load the sector in RAM working buffer + if(SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress) != RET_OK) + { + return RET_ERROR; + } + + //Set the working buffer pointer to the right value. + WorkPagePtr = &mFlashSectorBuffer[CurDataFlashAddress - SectorStartAddress]; + + //Modify the working buffer with data to write. + int SectorFinished = 0; + while(SectorFinished == 0) + { + *WorkPagePtr++ = *DataBufPtr++; + CurDataFlashAddress++; + + //Are we at the end of the buffer to write? + if(CurDataFlashAddress == DataFlashEndAddress) + { + SectorFinished = 1; + WriteFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + else if(CurDataFlashAddress % SPI_FLASH_SECTOR_SIZE == 0) //Are we at the beginning of the next sector? + { + SectorFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + } + + } + + return 1; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/SPI_Flash.h b/AudioConsole.X/Source/SPI_Flash.h new file mode 100644 index 0000000..4f6b993 --- /dev/null +++ b/AudioConsole.X/Source/SPI_Flash.h @@ -0,0 +1,49 @@ +#ifndef SPI_FLASH_H /* Guard against multiple inclusion */ +#define SPI_FLASH_H + +#define SPI_FLASH_READ 0x03 +#define SPI_FLASH_HI_SPEED_READ 0x0b +#define SPI_FLASH_4KB_SECOTR_ERASE 0x20 +#define SPI_FLASH_32KB_BLOCK_ERASE 0x52 +#define SPI_FLASH_64KB_BLOCK_ERASE 0xd8 +#define SPI_FLASH_CHIP_ERASE 0x60 +#define SPI_FLASH_BYTE_PROGRAM 0x02 +#define SPI_FLASH_AAI_WORD_PROGRAM 0xad +#define SPI_FLASH_READ_STATUS_REG 0x05 +#define SPI_FLASH_ENABLE_WRITE_STATUS_REG 0x50 +#define SPI_FLASH_WRITE_STATUS_REG 0x01 +#define SPI_FLASH_WRITE_ENABLE 0x06 +#define SPI_FLASH_WRITE_DISABLE 0x04 +#define SPI_FLASH_READ_ID 0x90 +#define SPI_FLASH_READ_JEDEC_ID 0x9f +#define SPI_FLASH_ENABLE_SO_BUSY 0x70 +#define SPI_FLASH_DISABLE_SO_BUSY 0x80 + + +#define SPI_FLASH_BUSY_MASK 0x01 + +#define SPI_FLASH_VENDOR_ID 0xBF +#define SPI_FLASH_CHIP_ID 0x41 +#define SPI_FLASH_MAX_ADDRESS 0x1FFFFF +#define SPI_FLASH_SECTOR_SIZE 0x1000 +#define SPI_FLASH_64K_SECTOR_SIZE 0x10000 +#define SPI_NB_SECTORS 0x1FF //511 sectors = SPI_FLASH_MAX_ADDRESS / SPI_FLASH_SECTOR_SIZE + + +int InitSPIFlash(); +int SPIFlashCheckChipID(); +unsigned char SPIFlashReadStatusReg(int print); +int SPIFlashCheckAndConfigure(); +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashCheckBusy(); +int SPIFlashWriteEnable(); +int SPIFlashEraseSector(int SectorAddress); +int SPIFlashErase64KSector(int SectorAddress, int Blocking); +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase); +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking); +int SPIFlashIsPresent(); + + +#endif /* SPI_FLASH_H */ + diff --git a/AudioConsole.X/Source/Schedule.c b/AudioConsole.X/Source/Schedule.c new file mode 100644 index 0000000..2fbb269 --- /dev/null +++ b/AudioConsole.X/Source/Schedule.c @@ -0,0 +1,7 @@ +#include "define.h" +#include "Schedule.h" + +void InitSchedule() +{ + +} diff --git a/AudioConsole.X/Source/Schedule.h b/AudioConsole.X/Source/Schedule.h new file mode 100644 index 0000000..5f9d04c --- /dev/null +++ b/AudioConsole.X/Source/Schedule.h @@ -0,0 +1,14 @@ +/* + * File: Schedule.h + * Author: JF + * + * Created on May 4, 2017, 1:16 PM + */ + +#ifndef SCHEDULE_H +#define SCHEDULE_H + +void InitSchedule(); + +#endif /* SCHEDULE_H */ + diff --git a/AudioConsole.X/Source/Scheduler.c b/AudioConsole.X/Source/Scheduler.c new file mode 100644 index 0000000..afbdacb --- /dev/null +++ b/AudioConsole.X/Source/Scheduler.c @@ -0,0 +1,39 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120516 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Scheduler.h" + + +//---------------------------------------------------------------------------- +void InitScheduler(void) +{ +} +//---------------------------------------------------------------------------- + + +//EOF diff --git a/AudioConsole.X/Source/Scheduler.h b/AudioConsole.X/Source/Scheduler.h new file mode 100644 index 0000000..4f8afb2 --- /dev/null +++ b/AudioConsole.X/Source/Scheduler.h @@ -0,0 +1,48 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120516 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef SCHEDULER_H +#define SCHEDULER_H + +/* ************************************************************************** */ +/* Includes */ + + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ + + +/* ************************************************************************** */ +/* Prototypes */ +void InitScheduler(void); + + +#endif +//EOF + diff --git a/AudioConsole.X/Source/Syslog.c b/AudioConsole.X/Source/Syslog.c new file mode 100644 index 0000000..d82aad8 --- /dev/null +++ b/AudioConsole.X/Source/Syslog.c @@ -0,0 +1,121 @@ +#include "Syslog.h" +#include "define.h" +#include +#include +#include +#include "terminal.h" +#include "WiFiCtrl.h" +#include "timer.h" +#include "SIM7080GInterface.h" + +//#define SYSLOG_BUFFER_SIZE 1024 +#define SYSLOG_BUFFER_SIZE 500 +char mSyslogBuffer[SYSLOG_BUFFER_SIZE]; +int mSyslogBufPtr; +bool mSyslogLTEPassthroughEnabled; + +int InitSyslog() +{ + mSyslogBufPtr = 0; + mSyslogLTEPassthroughEnabled = 0; + memset(mSyslogBuffer,0,SYSLOG_BUFFER_SIZE); + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + +} + + +void SyslogTick() +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return; + } + + if(mSyslogBufPtr != 0 && IsTimerExpired(SYSLOG_TX_TIMER) == 1) + { + SendSyslogData(mSyslogBuffer,mSyslogBufPtr); + mSyslogBufPtr = 0; +// if(mSyslogBufPtr >= 150) +// { +// SendSyslogData(mSyslogBuffer,150); +// mSyslogBufPtr -= 150; +// +// } +// else +// { +// SendSyslogData(mSyslogBuffer,mSyslogBufPtr); +// mSyslogBufPtr = 0; +// } + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + } + +} + +int SyslogNewByte(char byte) +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return 0; + } + + mSyslogBuffer[mSyslogBufPtr] = byte; + mSyslogBufPtr++; + + if(mSyslogBufPtr == SYSLOG_BUFFER_SIZE) + { + SendSyslogData(mSyslogBuffer,SYSLOG_BUFFER_SIZE); + mSyslogBufPtr = 0; + } + + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + return 1; +} + +int SyslogNewString(char *string) +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return 0; + } + + SendSyslogData(string,strlen(string)); + return 1; +} + +int SyslogIsBufferEmpty() +{ + if(mSyslogBufPtr == 0) + return RET_OK; + + return RET_ERROR; + +} + +void SyslogSetLTEPassthrough(bool Enable) +{ + mSyslogLTEPassthroughEnabled = Enable; + if(Enable == true) + { + SendSyslogData("\nEntering LTE passthrough mode\n",strlen("\nEntering LTE passthrough mode\n")); + } + else + { + SendSyslogData("\nExiting LTE passthrough mode\n",strlen("\nExiting LTE passthrough mode\n")); + } +} + +void RxSyslogBuf(unsigned char *DataBuf, int size) +{ + if(mSyslogLTEPassthroughEnabled == true) + { + int i = 0; + for(i = 0; i < size; i++) + { +// LTEFwdPassthroughData(*DataBuf++); + } + } +} + diff --git a/AudioConsole.X/Source/Syslog.h b/AudioConsole.X/Source/Syslog.h new file mode 100644 index 0000000..86e57f0 --- /dev/null +++ b/AudioConsole.X/Source/Syslog.h @@ -0,0 +1,16 @@ +#ifndef SYSLOG_H +#define SYSLOG_H +#include "define.h" +#define SYSLOG_TX_TIMEOUT 200 //ms + + +int InitSyslog(); +void SyslogTick(); +int SyslogNewByte(char byte); +int SyslogNewString(char *string); +int SyslogIsBufferEmpty(); +void SyslogSetLTEPassthrough(bool Enable); +void RxSyslogBuf(unsigned char *DataBuf, int size); + + +#endif \ No newline at end of file diff --git a/AudioConsole.X/Source/TC77.c b/AudioConsole.X/Source/TC77.c new file mode 100644 index 0000000..47a1f68 --- /dev/null +++ b/AudioConsole.X/Source/TC77.c @@ -0,0 +1,95 @@ +//#include + +#include "TC77.h" +#include "BoardCfg.h" +#include "timer.h" + +short mDeviceID; + +int TC77Configure() +{ + + TEMP_SENSOR_CS_PIN = 0; + + //Execute a 16 bits read first. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Now, write 0xFFFF to config register. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Read Device ID + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + mDeviceID = SPI3BUF; + mDeviceID <<= 8; + + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + mDeviceID += SPI3BUF; + TEMP_SENSOR_CS_PIN = 1; + + mDeviceID &= 0xFFFC; + if(mDeviceID != 0x5400) + { + return RET_ERROR; + } + + Sleep(100); + + //Device detected. Now, put the device in continuous read mode. + TEMP_SENSOR_CS_PIN = 0; + + //Execute a 16 bits read first. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Now, write 0x0000 to config register. + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + + TEMP_SENSOR_CS_PIN = 1; + + return RET_OK; +} +float TC77GetActualTemp() +{ + short RawTemp = 0; + float Temp; + TEMP_SENSOR_CS_PIN = 0; + + //Read 16 bits. + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + RawTemp = SPI3BUF; + RawTemp <<= 8; + + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + RawTemp += SPI3BUF; + + TEMP_SENSOR_CS_PIN = 1; + + RawTemp &= 0xFFF8; //Get rid of useless 3 LSB + //RawTemp >>= 3; + + Temp = ((float)0.0625 * (float)RawTemp); + Temp /= 8; + + return Temp; + +} + +short TC77GetDeviceID() +{ + return mDeviceID; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/TC77.h b/AudioConsole.X/Source/TC77.h new file mode 100644 index 0000000..afdce10 --- /dev/null +++ b/AudioConsole.X/Source/TC77.h @@ -0,0 +1,18 @@ +/* + * File: + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef TC77_H +#define TC77_H +#include "define.h" + +int TC77Configure(); +float TC77GetActualTemp(); +short TC77GetDeviceID(); + + +#endif /* TC77_H */ + diff --git a/AudioConsole.X/Source/TCPServer.c b/AudioConsole.X/Source/TCPServer.c new file mode 100644 index 0000000..b2c45f2 --- /dev/null +++ b/AudioConsole.X/Source/TCPServer.c @@ -0,0 +1,59 @@ +#include "define.h" +#include "TCPServer.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include + +BYTE vTelnetSession; +WORD w, w2; +#ifdef USE_WINC1500 +#else +TCP_SOCKET MyTCPSocket; +#endif + +int OpenTCPServer() +{ + #ifdef USE_WINC1500 + return 0; +#else + MyTCPSocket = TCPOpen(0, TCP_OPEN_SERVER, 1212, TCP_PURPOSE_GENERIC_TCP_SERVER); + + if (MyTCPSocket == INVALID_SOCKET) + return 0; + + return 1; +#endif + +} + +void TickTCPServer() +{ + BYTE i; +#ifdef USE_WINC1500 +#else + WORD size = TCPIsGetReady(MyTCPSocket); + if (size != 0) + { + printf("Server Rx %d bytes\n",size); + BYTE buf[100]; + TCPGetArray(MyTCPSocket, buf,size); + TCPPutArray(MyTCPSocket,buf,size); +// switch (i) +// { +// case 'q': +// case 'Q': +// { +// TCPPutString(MySocket, "Bye\n"); +// TCPDisconnect(MySocket); +// break; +// } +// default: +// { +// TCPPut(MySocket,i); +// }f +// } + } +#endif +} diff --git a/AudioConsole.X/Source/TCPServer.h b/AudioConsole.X/Source/TCPServer.h new file mode 100644 index 0000000..c1bcc85 --- /dev/null +++ b/AudioConsole.X/Source/TCPServer.h @@ -0,0 +1,11 @@ + + +#ifndef TCPSERVER_H +#define TCPSERVER_H + + +int OpenTCPServer(); +void TickTCPServer(); + + +#endif \ No newline at end of file diff --git a/AudioConsole.X/Source/TemperatureSensor.c b/AudioConsole.X/Source/TemperatureSensor.c new file mode 100644 index 0000000..1c349b3 --- /dev/null +++ b/AudioConsole.X/Source/TemperatureSensor.c @@ -0,0 +1,38 @@ +//#include + +#include "TemperatureSensor.h" +#include "BoardCfg.h" +#include "TC77.h" +#include "timer.h" + +void InitTempSensor() +{ + ActualTemp = 0xBAADBEEF; + TimerStart(TEMP_SENSOR_REFRESH_TIMER,1000); +} + +int TempSensorCheckAndConfigure() +{ + if(TC77Configure() == RET_OK) + { + ActualTemp = TC77GetActualTemp(); + return RET_OK; + } + + return RET_ERROR; +} + +float TempSensorGetTemp() +{ + return ActualTemp; +} + +void TickTempSensor() +{ + if(IsTimerExpired(TEMP_SENSOR_REFRESH_TIMER)) + { + ActualTemp = TC77GetActualTemp(); + TimerStart(TEMP_SENSOR_REFRESH_TIMER,1000); +// printf("Temperature: %f\n",ActualTemp); + } +} \ No newline at end of file diff --git a/AudioConsole.X/Source/TemperatureSensor.h b/AudioConsole.X/Source/TemperatureSensor.h new file mode 100644 index 0000000..227e2c3 --- /dev/null +++ b/AudioConsole.X/Source/TemperatureSensor.h @@ -0,0 +1,24 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef TEMPERATURESENSOR_H +#define TEMPERATURESENSOR_H +#include "define.h" + +float ActualTemp; + +void InitTempSensor(); +int TempSensorCheckAndConfigure(); +float TempSensorGetTemp(); + +void TickTempSensor(); + + + + +#endif /* TEMPERATURESENSOR_H */ + diff --git a/AudioConsole.X/Source/Terminal.c b/AudioConsole.X/Source/Terminal.c new file mode 100644 index 0000000..1dec5d8 --- /dev/null +++ b/AudioConsole.X/Source/Terminal.c @@ -0,0 +1,623 @@ + +/* + Description: + This is a template file for standard C header file. + + */ + +/* ************************************************************************** */ +/* Revision: + ### 20120607 JFM + Original version. + + ### 20120607 Initial, Bug Identification + Change description. + */ +#include +#include +#include +#include "terminal.h" +#include "define.h" +#include "WiFiCtrl.h" +#include "LedLightCtrl.h" +#include "ChaletPowerRelay.h" +#include "BatteryMonitor.h" +#include "BootloaderInterface.h" +#include "SIM7080GInterface.h" + +//#include "SDCardMgr.h" +#ifdef TERMINAL_USE_TELNET +#include "TCPIP_Stack/Telnet.h" +#endif + +#define TerminalPrint(fmt, ...) \ + do { sprintf(TerminalWorkString, fmt, __VA_ARGS__); \ + TerminalPrintString(TerminalWorkString);} while (0) + +char TerminalDataBuf[TERMINAL_STRING_LENGTH]; +char TerminalPrevDataBuf[TERMINAL_STRING_LENGTH]; +char TerminalWorkString[TERMINAL_STRING_LENGTH]; +char *TerminalDataPtr; + +int mTerminalPendingAction; +BOOL mTerminalOpened; +int mTerminalTickState; + +#define BOOTLOAD_VERSION_ADDRESS 0x9D000000 +const uint32_t *mBootloaderMagicWord = (uint32_t *) BOOTLOAD_VERSION_ADDRESS; + +static BYTE mHelpString[] = "Here is the list of the available commands:\n\r\n\r" +"help : Shows this window\n\r" +"\npower [state] Set chalet's 12V Inverter feed power state. This command controls the main power relay\n" +" - Available [state] argument are: on\n" +" off\n" +"\nwifi [command] control ChaletDuino's WiFi module state%\n" +" - Available [command] argument are: on (turns ON module)\n" +" off (turns OFF module)\n" +" status (returns current status)\n" +"\nbattery [sensor] returns current battery sensors readings\n" +" - Available [sensor] argument are: voltage\n" +" current\n" +" soc (state of charge)\n" +" Empty [sensor] argument prints all values\n" +"\nstatus : get general system status\n" +"\nbootloader [command] : bootloader mode control\n" +" - Available [command] argument are: start (enable bootloader and opens port)\n" +" stop (disables bootloader if not busy)\n" +" state (prints actual state of the bootloader)\n"; +static BYTE mHelpString1[] = "\nlte [command] [value] : bootloader mode control\n" +" - Available [command] argument are: passthrough (enable using syslog as a passthrough interface with lte module)\n" +" -Available passthrough [value]: on (enable passthrough)\n" +" off (disable passthrough)\n" +" debug (enable using syslog as a debug interface with lte module)\n" +" -Available debug [value]: module (debug LTE module comm only)\n" +" pic (debug PIC comm only)\n" +" both (debug both PIC and LTE module comm )\n" +" off (disable LTE debug)\n" +"\nHave a good day!\n"; + +BYTE *mHelpStringPtr; + +void InitTerminal(void) +{ + TerminalDataPtr = &TerminalDataBuf[0]; + memset(TerminalDataBuf,0,sizeof(TerminalDataBuf)); + memset(TerminalPrevDataBuf,'\0',sizeof(TerminalPrevDataBuf)); + memset(TerminalWorkString,'\0',sizeof(TerminalWorkString)); + + mTerminalPendingAction = TERMINAL_ACTION_NONE; +} + + +void TickTerminal() +{ + switch(mTerminalPendingAction) + { + case TERMINAL_ACTION_NONE: + { + break; + } + case TERMINAL_ACTION_TURN_OFF_WIFI: + { + mTerminalPendingAction = TERMINAL_ACTION_NONE; + TurnOFFWiFi(); + break; + } + } +} + +void RxTerminalBuf(uint8* DataBuf, int size) +{ + if(DataBuf != 0) + { + int i = 0; + for(i = 0; i < size; i++) + { + RxTerminalData(*DataBuf++); + } + } +} + +void RxTerminalData(unsigned char Data) +{ + // sTerminalPrint(TerminalWorkString,"%c",Data); + // TerminalPrintString(TerminalWorkString); + if(Data == 0x0D) //enter + { + //TerminalPrint("\n\r"); + TerminalPrintString("\n\r\0"); + + if(strlen(TerminalDataBuf) != 0) + { + strcpy(TerminalPrevDataBuf,TerminalDataBuf); + ParseNewBuffer(); + } + + TerminalDataPtr = &TerminalDataBuf[0]; + memset(TerminalDataBuf,'\0',sizeof(TerminalDataBuf)); + + } + else if(Data == 0x08 || Data == 0x7F) //backspace + { + // TerminalPrint("%c",Data); + TerminalPrintChar(Data); + if(TerminalDataPtr != &TerminalDataBuf[0]) + { + TerminalDataPtr--; + *TerminalDataPtr = '\0'; + } + + } + // else if(Data == 0x1B) //Up key + // { + // //memcpy(TerminalDataBuf,TerminalPrevDataBuf,strlen(TerminalPrevDataBuf)-1); + // strcpy(TerminalDataBuf,TerminalPrevDataBuf); + // TerminalPrint("%s",TerminalDataBuf); + // } + else + { + //TerminalPrint("%c",Data); + TerminalPrintChar(Data); + if(TerminalDataPtr < &TerminalDataBuf[TERMINAL_STRING_LENGTH]) + { + *TerminalDataPtr = Data; + TerminalDataPtr++; + } + } +} + +void ParseNewBuffer(void) +{ + char mCmdString[30], mDataString1[30], mDataString2[30], mDataString3[30],mDataString4[30]; + memset(mCmdString,'\0',sizeof(mCmdString)); + memset(mDataString1,'\0',sizeof(mDataString1)); + memset(mDataString2,'\0',sizeof(mDataString2)); + memset(mDataString3,'\0',sizeof(mDataString3)); + memset(mDataString4,'\0',sizeof(mDataString4)); + + sscanf(TerminalDataBuf,"%s %s %s %s %s",mCmdString, mDataString1, mDataString2, mDataString3,mDataString4); + + if(strncmp(mCmdString,"help",strlen("help")) == 0) + { + SendTerminalData(mHelpString,strlen(mHelpString)); + + SendTerminalData(mHelpString1,strlen(mHelpString1)); + } + + else if(strncmp(mCmdString,"power",strlen("power")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[state] parameter is invalid. Type 'help' for more info\n"); + return; + } + + + if(strncmp(mDataString1,"on",strlen("on")) == 0) + { + TerminalPrintString("Turning chalet's inverter ON\n"); +// ChaletPowerRelayTurnOn(); + } + else if(strncmp(mDataString1,"off",strlen("off")) == 0) + { + TerminalPrintString("Turning chalet's inverter OFF\n"); + // ChaletPowerRelayTurnOff(); + } + else + { + TerminalPrintString("\n[state] parameter is invalid. Type 'help' for valid values\n"); + } + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"wifi",strlen("wifi")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n"); + return; + } + + if(strncmp(mDataString1,"on",strlen("on")) == 0) + { + if(GetWiFiSate() != WIFI_CONNECTED_STATE) + { + TerminalPrintString("Turning WiFi module ON\n"); + InitWiFi(); + } + else + { + TerminalPrintString("WiFi already connected...\n"); + } + } + else if(strncmp(mDataString1,"off",strlen("off")) == 0) + { + if(GetWiFiSate() != WIFI_MODULE_OFF_STATE) + { + TerminalPrintString("Turning WiFi module OFF... Goodbye!\n"); + //TurnOFFWiFi(); + mTerminalPendingAction = TERMINAL_ACTION_TURN_OFF_WIFI; + } + else + { + TerminalPrintString("WiFi module already OFF... that's weird!\n"); + } + } + else if(strncmp(mDataString1,"status",strlen("status")) == 0) + { + switch (GetWiFiSate()) + { + case WIFI_MODULE_OFF_STATE: + { + TerminalPrintString("WiFi module OFF\n"); + break; + } + case WIFI_CONNECTED_STATE: + { + TerminalPrintString("WiFi Connected\n"); + break; + } + case WIFI_DISCONNECTED_STATE: + { + TerminalPrintString("WiFi Disconnected\n"); + break; + } + case WIFI_INIT_ERROR_STATE: + { + TerminalPrintString("WiFi ERROR\n"); + break; + } + case WIFI_UNKNOWN_STATE: + { + TerminalPrintString("WiFi state Unknown!\n"); + break; + } + } + + } + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"battery",strlen("battery")) == 0) + { +// if(strlen(mDataString1) == 0) +// { +// char voltage[15]; +// sprintf(voltage,"%f",GetBatteryVoltage(0)); +// TerminalPrintString("Battery Voltage: "); +// TerminalPrintString(voltage); +// TerminalPrintString("\n"); +// char current[15]; +// sprintf(current,"%d",GetSolarPanelCurrent()); +// TerminalPrintString("Battery charge current: "); +// TerminalPrintString(current); +// TerminalPrintString("mA\n"); +// return; +// } +// +// if(strncmp(mDataString1,"voltage",strlen("voltage")) == 0) +// { +// char voltage[15]; +// sprintf(voltage,"%f",GetBatteryVoltage(0)); +// TerminalPrintString("Battery Voltage: "); +// TerminalPrintString(voltage); +// TerminalPrintString("\n"); +// } +// else if(strncmp(mDataString1,"current",strlen("current")) == 0) +// { +// char current[15]; +// sprintf(current,"%d",GetSolarPanelCurrent()); +// TerminalPrintString("Battery charge current: "); +// TerminalPrintString(current); +// TerminalPrintString("mA\n"); +// } +// else if(strncmp(mDataString1,"soc",strlen("soc")) == 0) +// { +// char SOC[15]; +// sprintf(SOC,"%d",GetBatterySOC()); +// TerminalPrintString("Battery SOC: "); +// // TerminalPrintString(SOC); +// TerminalPrintString("%\n"); +// } +// TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"status",strlen("status")) == 0) + { + // TerminalPrintString("General status:\nBattery: TBD \nWiFi: TBD\nOther Stuff: TBD\n"); + TerminalPrintString("General status:\n"); + +// if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_OFF_STATE) +// { +// TerminalPrintString("Inverter power relay: OFF\n"); +// } +// else if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) +// { +// TerminalPrintString("Inverter power relay: ON\n"); +// } +// else +// { +// TerminalPrintString("Inverter power relay: UNKNOWN\n"); +// } + + switch(GetWiFiSate()) + { + case WIFI_MODULE_OFF_STATE: + { + TerminalPrintString("WiFi: Module is turned OFF\n"); + break; + } + case WIFI_CONNECTED_STATE: + { + TerminalPrintString("WiFi: Connected to AP\n"); + break; + } + case WIFI_DISCONNECTED_STATE: + { + TerminalPrintString("WiFi: Disconnected from AP\n"); + break; + } + case WIFI_INIT_ERROR_STATE: + { + TerminalPrintString("WiFi: Module initialization error\n"); + break; + } + case WIFI_UNKNOWN_STATE: + default: + { + TerminalPrintString("WiFi: Unknown state\n"); + break; + } + } + +// char voltage[15]; +// memset(voltage,0,15); +// sprintf(voltage,"%.2f",GetBatteryVoltage(0)); +// TerminalPrintString("Battery Voltage: "); +// TerminalPrintString(voltage); +// TerminalPrintString("V\n"); +// +// char current[15]; +// memset(current,0,15); +// sprintf(current,"%dmA\n",GetSolarPanelCurrent()); +// TerminalPrintString("Battery charge current: "); +// TerminalPrintString(current); +// //TerminalPrintString("mA\n"); + + if(*mBootloaderMagicWord == 0xBAADCAFE) + { + TerminalPrintString("Bootloader: Detected\n"); + } + else + { + TerminalPrintString("Bootloader: Not Detected\n"); + } + +// char SOC[15]; +// memset(SOC,0,15); +// sprintf(SOC,"%d%%\n",GetBatterySOC()); +// TerminalPrintString("Battery SOC: "); +// TerminalPrintString(SOC); +// // TerminalPrintString("\n"); + + + + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"bootloader",strlen("bootloader")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n"); + return; + } + + if(strncmp(mDataString1,"start",strlen("start")) == 0) + { + //start bootloader server + // OpenBootloaderServer(); + BootloaderActivateBootloader(); + TerminalPrintString("Activating bootloader\n"); + } + else if(strncmp(mDataString1,"stop",strlen("stop")) == 0) + { + //CloseBootloaderServer(); + TerminalPrintString("Deactivating bootloader\n"); + BootloaderDeactivateBootloader(); + } + else if(strncmp(mDataString1,"status",strlen("status")) == 0) + { + if(IsBootloaderClientConnected()) + { + TerminalPrintString("\nBootloader client connected\n"); + return; + } + else + if(IsBootloaderClientConnected()) + { + TerminalPrintString("\nBootloader client not connected\n"); + return; + } + } + + } + else if(strncmp(mCmdString,"lte",strlen("lte")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n"); + return; + } + if(strlen(mDataString2) == 0) + { + TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n"); + return; + } + + if(strncmp(mDataString1,"passthrough",strlen("passthrough")) == 0) + { +// if(strncmp(mDataString2,"on",strlen("on")) == 0) +// { +// LTEEnterSerialPassthrough(); +// TerminalPrintString("LTE passthrough enabled in Syslog window\n"); +// } +// else if (strncmp(mDataString2,"off",strlen("off")) == 0) +// { +// LTEExitSerialPassthrough(); +// TerminalPrintString("LTE passthrough disabled\n"); +// } +// else +// { +// TerminalPrintString("\nInvalid [value] parameter (use on or off)\n"); +// } + + } + if(strncmp(mDataString1,"debug",strlen("debug")) == 0) + { +// if(strncmp(mDataString2,"module",strlen("module")) == 0) +// { +// if(LTEEnableSerialDebug(true,false) == RET_OK) +// { +// TerminalPrintString("LTE module debug enabled in Syslog window\n"); +// } +// else +// { +// TerminalPrintString("Cannot put LTE module in debug mode (passthrought enabled?)\n"); +// } +// } +// else if(strncmp(mDataString2,"pic",strlen("pic")) == 0) +// { +// if(LTEEnableSerialDebug(false,true) == RET_OK) +// { +// TerminalPrintString("LTE PIC comm debug enabled in Syslog window\n"); +// } +// else +// { +// TerminalPrintString("Cannot put LTE PIC comm in debug mode (passthrought enabled?)\n"); +// } +// } +// else if(strncmp(mDataString2,"both",strlen("both")) == 0) +// { +// if(LTEEnableSerialDebug(true,true) == RET_OK) +// { +// TerminalPrintString("LTE module and PIC comm debug enabled in Syslog window\n"); +// } +// else +// { +// TerminalPrintString("Cannot put LTE comm in debug mode (passthrought enabled?)\n"); +// } +// } +// else if (strncmp(mDataString2,"off",strlen("off")) == 0) +// { +// LTEEnableSerialDebug(false,false); +// TerminalPrintString("LTE debug disabled\n"); +// } +// else +// { +// TerminalPrintString("\nInvalid [value] parameter (use on or off)\n"); +// } + + } + } + else if(strncmp(mCmdString,"debug",strlen(mCmdString)) == 0) + { + // if(strlen(mDataString1) == 0) + // { + // TerminalPrintString("\n[subsystem] parameter is invalid. Type 'help' for more info\n"); + // return; + // } + // if(strlen(mDataString2) == 0) + // { + // TerminalPrintString("\n[timeout] parameter is invalid. Type 'help' for more info\n"); + // return; + // } + // + // unsigned int timeout = atoi(mDataString2); + // if(timeout != 0 && timeout < 100 && timeout > 5000) + // { + // TerminalPrint("[timeout] value must be between 100 & 5000. Current value: %d",timeout); + // return; + // } + // + // if(strncmp(mDataString1,"valve",strlen("valve")) == 0) + // { + // // TerminalPrintValveStatus(); + // TerminalPrintString("Debug valve not implemented\n"); + // } + // else if(strncmp(mDataString1,"flow",strlen("flow")) == 0) + // { + // if(timeout == 0) + // { + // TerminalPrintString("Flow debugging stopped\n"); + // StopDebugFlowMeter(); + // } + // else + // { + // TerminalPrintString("OK\n"); + // StartDebugFlowMeter(timeout); + // } + // } + // else if(strncmp(mDataString1,"hygro",strlen("hygro")) == 0) + // { + // TerminalPrintString("Debug hygro not implemented\n"); + // } + } + + else + TerminalPrintString("Unknown command\n\n"); +} + +void TerminalPrintString(char *str) +{ +#ifdef USE_WINC1500 + SendTerminalData(str,strlen(str)); +#else +#ifdef TERMINAL_USE_TCP_SERVER + TCPPutString(mTerminalSocket, str); +#endif +#endif +} + +void TerminalPrintChar(char byte) +{ +#ifdef USE_WINC1500 + SentTerminalByte(byte); +#else +#ifdef TERMINAL_USE_TCP_SERVER + TCPPut(mTerminalSocket,byte); +#endif +#endif +} + +void TerminalStateMachine(void) +{ + +} + +// +//void TerminalPrintValveStatus() +//{ +// if(GetValveState() == VALVE_ON) +// { +// TerminalPrintString("The valve is ON\n"); +// } +// else +// { +// TerminalPrintString("The valve is OFF\n"); +// } +//} +// +//void TerminalPrintFlowStatus() +//{ +// unsigned int Flow = GetCurrentFlow(); +// TerminalPrint("Flow: %d\n",Flow);; +//} +// +//void TerminalPrintHygroStatus(int unit) +//{ +// TerminalPrint("Hygro %d: ?\n",unit); +//} +// + +//EOf + diff --git a/AudioConsole.X/Source/Terminal.h b/AudioConsole.X/Source/Terminal.h new file mode 100644 index 0000000..b83a3c6 --- /dev/null +++ b/AudioConsole.X/Source/Terminal.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ +#define TERMINAL_STRING_LENGTH 300 +#define USE_WINC1500 +enum eTerminalCmds +{ + HELP_CMD, + PWM_CMD, + SET_CMD, + MAX_CMD +}; + +enum eTerimnalTickStates +{ + TERMINAL_INIT_STATE, + TERMINAL_RUN_STATE +}; + +enum eTerminalActions +{ + TERMINAL_ACTION_NONE = 0, + TERMINAL_ACTION_TURN_OFF_WIFI, + + TERMINAL_ACTION_MAX +}; + + +void InitTerminal(void); + + +void RxTerminalData(unsigned char Data); +void RxTerminalBuf(unsigned char *DataBuf, int size); +void ParseNewBuffer(void); +void TerminalStateMachine(void); + +void TickTerminal(void); +void TerminalPrintString(char *str); +void TerminalPrintChar(char byte); + +void TerminalPrintValveStatus(); +void TerminalPrintFlowStatus(); +void TerminalPrintHygroStatus(int unit); + +//EOF + diff --git a/AudioConsole.X/Source/Uart.c b/AudioConsole.X/Source/Uart.c new file mode 100644 index 0000000..afbdcd0 --- /dev/null +++ b/AudioConsole.X/Source/Uart.c @@ -0,0 +1,719 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Uart.h" +#include "Internaluart.h" +#include +#include +//#include "Watchdog.h" + +#ifndef NO_EXTERNAL_UART +#include "sc16IS740Driver.h" +#endif + +#include "digitalio.h" +//#include "DriveProtocol.h" +#include "terminal.h" +#include "SIM7080GInterface.h" + + + +/* ************************************************************************** */ +/* Local variables */ + +stUartData astUartData[MAX_UART_HANDLE]; + +const char *gUartStrings[MAX_UART_HANDLE] = { "LORA" //UART_1 + ,"LTE", //UART_5 +// ,"CONSOLE" //UART_3 +}; + +/* ************************************************************************** */ +/* Private function prototypes */ +//void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +//void _mon_write (const char * s, unsigned int count); + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InitUart(void) +{ + int i; + + InternalUartInit(); + //InitSC16S740(); + + memset(&astUartData,0,sizeof(astUartData)); + + for(i = 0; i < MAX_UART_HANDLE; i++) + { + astUartData[i].iDataPending = 0; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + astUartData[i].pcTxInPtr = &astUartData[i].acTxCircularBuffer[0]; + astUartData[i].pcTxOutPtr = &astUartData[i].acTxCircularBuffer[0]; + //memset(&astUartData[i].acTxCircularBuffer[0],0xDE,UART_MAX_TX_BUFF_SIZE); + + astUartData[i].pcRxInDataPtr = astUartData[i].pcRxOutDataPtr = &astUartData[i].acRxCircularBuffer[0]; + astUartData[i].iNbRxFIFOPendingBytes = 0; + } + + + //This is a physical mapping of the UARTS. + //DO NOT CHANGE assignments unless hardware changed ! + // + astUartData[UART_1].iIsInternal = 1; + astUartData[UART_1].iPhysicalUartPort = INTERNAL_UART_PORT_2; // (232) + + astUartData[UART_2].iIsInternal = 1; + astUartData[UART_2].iPhysicalUartPort = INTERNAL_UART_PORT_5; // (232) + +#ifndef NO_EXTERNAL_UART + astUartData[UART_3].iIsInternal = 0; + astUartData[UART_3].iPhysicalUartPort = EXT_UART_1; // (SPI - 232 daughter board) +#endif + + setbuf(stdout,NULL); //to use printf without \r + fflush(stdout); + + UartOpenComPort(NETWORK_UART_PORT,9600,UART_ONE_STOP_BIT,UART_NO_PARITY); //Open LoRa module port + UartOpenComPort(LTE_IF_UART_PORT,115200,UART_ONE_STOP_BIT,UART_NO_PARITY); //Open LTE module port +#ifdef USE_PRINTF + //UartOpenComPort(CONSOLE_UART_PORT,115200,UART_ONE_STOP_BIT,UART_NO_PARITY); //Open console port + +#endif + +} + +//----------------------------------------------------------------------------- + +int UartResetPort(int p_iUartHandle) +{ + if(p_iUartHandle > MAX_UART_HANDLE) + return 0; + + //reset the port data structures... + astUartData[p_iUartHandle].iDataPending = 0; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcRxInDataPtr = astUartData[p_iUartHandle].pcRxOutDataPtr = &astUartData[p_iUartHandle].acRxCircularBuffer[0]; + astUartData[p_iUartHandle].iNbRxFIFOPendingBytes = 0; + + if(astUartData[UART_1].iIsInternal == 1) + { + switch(astUartData[p_iUartHandle].iPhysicalUartPort) + { + case INTERNAL_UART_PORT_1: + { + ResetUart1(); + break; + } + case INTERNAL_UART_PORT_2: + { + ResetUart2(); + break; + } + case INTERNAL_UART_PORT_5: + { + ResetUart5(); + break; + } + + default: + break; + } + } + else + { +#ifndef NO_EXTERNAL_UART + switch(astUartData[p_iUartHandle].iPhysicalUartPort) + { + case EXT_UART_1: + { + break; + } + default: + break; + } +#endif + } + + return 1; +} + +//----------------------------------------------------------------------------- +int UartOpenComPort(int p_iUartHandle, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable) +{ + int iStopbits,iParity,iRet; + if(p_iUartHandle >= MAX_UART_HANDLE || p_iUartHandle < 0) + return UART_INVALID_HANDLE; + + if(astUartData[p_iUartHandle].iIsInternal == 1) + { + switch(p_iNbStopBits) + { + case UART_ONE_STOP_BIT: + case UART_ONE_HALF_STOP_BIT: //1½ stop bits doesn't exist for internal uart + { + iStopbits = INT_UART_ONE_STOP_BIT; + break; + } + case UART_TWO_STOP_BITS: + { + iStopbits = INT_UART_TWO_STOP_BITS; + break; + } + } + + switch(p_iParityEnable) + { + case UART_NO_PARITY: + { + iParity = INT_UART_NO_PARITY; + break; + } + case UART_EVEN_PARITY: + { + iParity = INT_UART_EVEN_PARITY; + break; + } + case UART_ODD_PARTIY: + { + iParity = INT_UART_ODD_PARITY; + break; + } + } + + iRet = OpenInternalPort(astUartData[p_iUartHandle].iPhysicalUartPort, + p_iUartHandle, + &astUartData[p_iUartHandle].acTxCircularBuffer[0], + &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1], + p_iBaudRate, + iStopbits, + iParity); + } +#ifndef NO_EXTERNAL_UART + else + { + switch(p_iNbStopBits) + { + case UART_ONE_STOP_BIT: + { + iStopbits = ONE_STOP_BIT; + break; + } + case UART_ONE_HALF_STOP_BIT: //1½ stop bits doesn't exist for internal uart + { + iStopbits = ONE_HALF_STOP_BIT; + break; + } + case UART_TWO_STOP_BITS: + { + iStopbits = TWO_STOP_BITS; + break; + } + } + + switch(p_iParityEnable) + { + case UART_NO_PARITY: + { + iParity = NO_PARITY; + break; + } + case UART_EVEN_PARITY: + { + iParity = EVEN_PARITY; + break; + } + case UART_ODD_PARTIY: + { + iParity = ODD_PARITY; + break; + } + } + + iRet = OpenExternalPort(astUartData[p_iUartHandle].iPhysicalUartPort, + p_iUartHandle, + &astUartData[p_iUartHandle].acTxCircularBuffer[0], + &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1], + p_iBaudRate, + iStopbits, + iParity); + } +#endif + + return iRet; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//All the uart callback function assignment must be done here !!! +//This must be changed if hardware changes or if port assignment is changed !!! +// +int UartReceiveData(int p_iUartHandle, char *p_pcBuffer, int p_iSize) +{ + int i; + stUartData *p_stUartDatPtr = &astUartData[p_iUartHandle]; + + if(p_iUartHandle < 0 && p_iUartHandle >= MAX_UART_HANDLE) + { + //TODO: Flag a logic error ! + return 0; + } + + for(i = 0; i < p_iSize; i++) + { + *p_stUartDatPtr->pcRxInDataPtr++ = *p_pcBuffer++; + if(p_stUartDatPtr->pcRxInDataPtr > &p_stUartDatPtr->acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1]) + { + p_stUartDatPtr->pcRxInDataPtr = &p_stUartDatPtr->acRxCircularBuffer[0]; //wrap pointer +// printf("Wrap\n"); + } + } + p_stUartDatPtr->iNbRxFIFOPendingBytes += p_iSize; + + if(p_stUartDatPtr->iNbRxFIFOPendingBytes >= UART_MAX_RX_BUFF_SIZE) + PRINTF("RX FIFO Overflow\n"); + + +/* switch(p_iUartHandle) + { + case UART_0: + { + break; + } + case UART_1: + { + break; + } + case UART_2: + { + break; + } + case UART_3: + { + break; + } + case UART_4: + { + break; + } + case UART_5: + { + break; + } + } */ + return 1; +} + +int UartGetPendingDataSize(int iUartHandle) +{ + stUartData *p_stUartDatPtr = &astUartData[iUartHandle]; + + if(p_stUartDatPtr->pcRxInDataPtr == p_stUartDatPtr->pcRxOutDataPtr) + { + return 0; + } + else if(p_stUartDatPtr->pcRxOutDataPtr < p_stUartDatPtr->pcRxInDataPtr) + { + return(p_stUartDatPtr->pcRxInDataPtr - p_stUartDatPtr->pcRxOutDataPtr); + } + else + { + int size = &p_stUartDatPtr->acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1] - p_stUartDatPtr->pcRxOutDataPtr; + size += p_stUartDatPtr->pcRxInDataPtr - &p_stUartDatPtr->acRxCircularBuffer[0]; + return size; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int UartTransmitData(int p_iUartHandle, char *p_pcBuffer, int p_iSize) +{ + int iRet = 0; + + // Case where OutPtr < InPtr + // * = Available space + // + //Top ---->|---------------| + // | * | + //OutPtr ->| | + // | | + // | (p_pcBuffer) | //Available size = (OutPtr - Top) + (Bottom - InPtr) + // | | + //InPtr -->| | + // | * | + // | * | + //Bottom ->|---------------| + + + // Case where OutPtr > InPtr + // * = Available space + // + //Top ---->|---------------| + // | | + //InPtr -->| | + // | * | + // | * | //available size = OutPtr - InPtr + // | * | + //OutPtr ->| | + // | (p_pcBuffer) | + // | | + //Bottom ->|---------------| + + + //Check if data buffer fits in remaining circular buffer space + if(astUartData[p_iUartHandle].pcTxOutPtr < astUartData[p_iUartHandle].pcTxInPtr) + { + //Calculate remaining buffer space and check if it's enough to fit requested data buffer + if(p_iSize > ((astUartData[p_iUartHandle].pcTxOutPtr - &astUartData[p_iUartHandle].acTxCircularBuffer[0]) + //Outptr - Top + (&astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1] - astUartData[p_iUartHandle].pcTxInPtr))) //Bottom - Inptr + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + return UART_BUFFER_FULL; + } + } + else if(astUartData[p_iUartHandle].pcTxInPtr < astUartData[p_iUartHandle].pcTxOutPtr) + { + //Calculate remaining buffer space and check if it's enough to fit requested data buffer + if(p_iSize > (astUartData[p_iUartHandle].pcTxOutPtr - astUartData[p_iUartHandle].pcTxInPtr)) + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; //Force data pending flag to flush buffer + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + return UART_BUFFER_FULL; + } + } + else //OutPtr = InPtr + { + if(p_iSize > UART_MAX_TX_BUFF_SIZE - 1) //message is too big to fit in buffer !!! + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; //Force data pending flag to flush buffer + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + + return UART_BUFFER_FULL; + } + } + + int i; + + + for(i = 0; i < p_iSize; i++) + { + *astUartData[p_iUartHandle].pcTxInPtr++ = *p_pcBuffer++; //fill circular buffer + + if(astUartData[p_iUartHandle].pcTxInPtr > &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]) //check for wrapping + { + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + } + } + + //Now flag pending data for transmission. + astUartData[p_iUartHandle].iDataPending = 1; //The data send will start on next Main loop processing + + + return iRet; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//Some data has been entirely sent +//Move output pointer +// +int DataSentNotification(int p_iUartHandle,int DataSize) +{ + //Check wrapping. + if(astUartData[p_iUartHandle].pcTxOutPtr + DataSize < &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE]) + { + astUartData[p_iUartHandle].pcTxOutPtr += DataSize; + } + else //Pointer must wrap + { + + //Top ------>|---------------| + // | * | + //Final Pos->| | // Final Pos = Top + * + // | | + // | (buffer) | // DataSize = & + * + // | | // & = Bottom - OutPtr + //OutPtr --->| | // * = DataSize - & + // | & | // FinalPos = Top + (DataSize - (Bottom - OutPtr)) + // | & | + //Bottom --->|---------------| + +// if(p_iUartHandle != PRINTF_UART_PORT) +// printf("Out wrap\r"); + + DataSize -= (&astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE] - astUartData[p_iUartHandle].pcTxOutPtr); //p_iSize - (Bottom - OutPtr) + + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0] + DataSize; //Top + new p_iSize + + + } + + //Check if data is pending in buffer + if(astUartData[p_iUartHandle].pcTxOutPtr != astUartData[p_iUartHandle].pcTxInPtr) + { + astUartData[p_iUartHandle].iDataPending = 1; + } + else + { + astUartData[p_iUartHandle].iDataPending = 0; +// LORA_MODULE_TX_LED_PIN = LED_OFF; + } + + return UART_OK; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//Called by main loop. Check if any uart has data pending to be sent +// +int UartTick(void) +{ + int i = 0; + int iRet; + int p_iSize; + char aTempBuffer[UART_MAX_RX_BUFF_SIZE]; + + TickInternalUart(); + + //Send... + + for(i = 0; i < MAX_UART_HANDLE; i++) + { + if(astUartData[i].iDataPending) + { + char *pcTxInPtr = astUartData[i].pcTxInPtr; + //Check remaining data size. + if(astUartData[i].pcTxOutPtr < pcTxInPtr) + { + p_iSize = pcTxInPtr - astUartData[i].pcTxOutPtr; + } + else + { + p_iSize = ((&astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE] - astUartData[i].pcTxOutPtr) + + (pcTxInPtr - &astUartData[i].acTxCircularBuffer[0])); + } + + if(astUartData[i].iIsInternal) //Uart handle mapped to PIC internal uart + { + astUartData[i].iDataPending = 0; + iRet = SendInternalUartData(astUartData[i].pcTxOutPtr, + p_iSize, + astUartData[i].iPhysicalUartPort, + &astUartData[i].acTxCircularBuffer[0], + &astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]); + } + +#ifndef NO_EXTERNAL_UART + else //mapped to external uart + { + astUartData[i].iDataPending = 0; + iRet = SendExternalUartData(astUartData[i].iPhysicalUartPort, astUartData[i].pcTxOutPtr, p_iSize,&astUartData[i].acTxCircularBuffer[0], &astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]); + } +#endif + + //TODO: manage return values + switch(iRet) + { + case UART_OK: + { + break; + } + case UART_PORT_BUSY: + case UART_BUFFER_FULL: + { + astUartData[i].iDataPending = 1; + break; + } + case UART_PORT_NOT_OPENED: + { + break; + } + } + } + + + //Receive... + + // int iNbPendingData = astUartData[i].iNbRxFIFOPendingBytes; //JFM 2012-09-05 + int iNbPendingData = UartGetPendingDataSize(i); + if(iNbPendingData > 0) + { + int byte; + for(byte = 0; byte < iNbPendingData; byte++) + { + aTempBuffer[byte] = *astUartData[i].pcRxOutDataPtr++; + if(astUartData[i].pcRxOutDataPtr > &astUartData[i].acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1]) + astUartData[i].pcRxOutDataPtr = &astUartData[i].acRxCircularBuffer[0]; //wrap pointer + } + astUartData[i].iNbRxFIFOPendingBytes -= iNbPendingData; + + switch(i) + { +// case DRIVE_UART_PORT: +// { +// //printf("drive rx\n"); +// DriveProtocolRxData(aTempBuffer,iNbPendingData); +// break; +// } +// case CU_UART_PORT: +// { +// CUProtocolRxData(aTempBuffer,iNbPendingData); // HCAM 20120918 +// break; +// } + case NETWORK_UART_PORT: + { + //HEARTBEAT_LED_1_TOGGLE_REG = HEARTBEAT_LED_1_TOGGLE_MASK; + //UartTransmitData(CONSOLE_UART_PORT, aTempBuffer, iNbPendingData);//echo received character + int i = 0; + for(i = 0; i< iNbPendingData; i++) + { + ProtocolAnalyzeNewData(aTempBuffer[i]); + //RxTerminalData(aTempBuffer[i]); + } + break; + } + case LTE_IF_UART_PORT: + { + int i = 0; + for(i = 0; i< iNbPendingData; i++) + { +// LTE_MODULE_RX_LED_PIN = ~LTE_MODULE_RX_LED_PIN; + LTEModuleNewData(aTempBuffer[i]); + //ProtocolAnalyzeNewData(aTempBuffer[i]); + //RxTerminalData(aTempBuffer[i]); + } + break; + } + } + } + } + + return UART_OK; +} +//----------------------------------------------------------------------------- +// +// This function is used in the case of a large amount of data to be sent or received +// in a process without going back to main loop. + +void UartBlockAndTick(unsigned int TickCount) +{ + int i; + +// KickWatchdog(); + for(i = 0; i < TickCount; i++) + { + UartTick(); + } +// KickWatchdog(); +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// This function is used in the case of a large amount of data to be sent or received +// in a process without going back to main loop. +int UartBlockUntillBufEmpty(int iUartHandle) +{ + if(iUartHandle >= MAX_UART_HANDLE) + return 0; + +// KickWatchdog(); + while(astUartData[iUartHandle].iDataPending) + { + UartTick(); + } +// KickWatchdog(); + return 1; + +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +//Overload the stdio character output routine to redirect printfs +// +//void _mon_putc(char c) +//{ +// KickWatchdog(); + +// U2TXREG = c; +// while (U2STAbits.TRMT==0); + + +//#ifdef USE_BLOCKING_PRINTF +// switch(CONSOLE_UART_PORT) +// { +// case UART_1: //(422) Uart 1B +// { +// if(U1MODEbits.ON == 1) +// { +// U1TXREG = c; +// while (U1STAbits.TRMT==0); +// } +// break; +// } +// case UART_2: //(422) Uart 2A +// { +// if(U2MODEbits.ON == 1) +// { +// U2TXREG = c; +// while (U2STAbits.TRMT==0); +// } +// break; +// } + +// } +//#else +// UartTransmitData(PRINTF_UART_PORT, &c, 1); +//#endif +// UartTransmitData(CONSOLE_UART_PORT, &c, 1); +// Nop(); + +// KickWatchdog(); +//} + +/* +void _mon_write (const char * s, unsigned int count) +{ +#ifdef USE_BLOCKING_PRINTF + int i; + for(i = 0; i < count; i++) + _mon_putc(*s++); +#else + UartTransmitData(UART_10, s, count); +#endif +}*/ + +//EOF + diff --git a/AudioConsole.X/Source/Uart.h b/AudioConsole.X/Source/Uart.h new file mode 100644 index 0000000..6039750 --- /dev/null +++ b/AudioConsole.X/Source/Uart.h @@ -0,0 +1,106 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef UART_H +#define UART_H + +/* ************************************************************************** */ +/* Defines */ +#define UART_MAX_RX_BUFF_SIZE 512 +#define UART_MAX_TX_BUFF_SIZE 1024 + +/* ************************************************************************** */ +/* Type definitions */ +//Handles to the Uart ports as mapped physically on the CU board. +//in comment is the physical port assigned to each handle +// +enum eUartHandles +{ + UART_1, //(232) internet Uart 2 - Lora IF + UART_2, //(232) internal Uart 5 - SIM7080G LTE IF + //UART_3, // !!!EXTERNAL!!! SPI daughter board... + MAX_UART_HANDLE, + + INVALID_UART_HANDLE = 0xFF +}; + +extern const char *gUartStrings[MAX_UART_HANDLE]; + +enum eUartStopBits +{ + UART_ONE_STOP_BIT, + UART_ONE_HALF_STOP_BIT, + UART_TWO_STOP_BITS +}; +enum eUartParity +{ + UART_NO_PARITY, + UART_EVEN_PARITY, + UART_ODD_PARTIY +}; + +typedef struct +{ + int iIsInternal; + int iPhysicalUartPort; + int iDataPending; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + + char acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE]; + char *pcTxInPtr; + char *pcTxOutPtr; + char acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE]; + char *pcRxInDataPtr; + char *pcRxOutDataPtr; + int iNbRxFIFOPendingBytes; + + +}stUartData; + +enum eUartReturnValues +{ + UART_OK = 1, + UART_PORT_BUSY, + UART_PORT_NOT_OPENED, + UART_BUFFER_FULL, + UART_INVALID_HANDLE, + UART_INVALID_PORT +}; + +/* ************************************************************************** */ +/* Prototypes */ +int UartTransmitData(int p_iUartHandle, char *p_pcBuffer, int p_iSize); +int UartReceiveData(int p_iUartHandle, char *p_pcBuffer, int p_iSize); +int DataSentNotification(int p_iUartHandle,int p_iDataSize); +void InitUart(void); +int UartOpenComPort(int p_iUartHandle, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable); +int UartTick(void); +void UartBlockAndTick(unsigned int TickCount); +int UartBlockUntillBufEmpty(int iUartHandle); +int UartGetPendingDataSize(int iUartHandle); +int UartResetPort(int p_iUartHandle); + +#endif +//EOF + diff --git a/AudioConsole.X/Source/Util.c b/AudioConsole.X/Source/Util.c new file mode 100644 index 0000000..f84fd93 --- /dev/null +++ b/AudioConsole.X/Source/Util.c @@ -0,0 +1,367 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Util.h" +#include +#include +#include "PrintfServer.h" +//#include "Watchdog.h" + +/* ************************************************************************** */ +/* Local variables */ +#ifdef ENABLE_DEBUG_LOG +char acDebugLog[DEBUG_LOG_SIZE][100]; +int iLogIndex = 0; +int iWrapCntr = 0; +#endif + +//void _mon_putc(char c); //override from stdio to redirect stdout + + + +//----------------------------------------------------------------------------- +//void _mon_putc(char c) +//{ +// TelnetPutPrintf(c); +//} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +short SwapEndianShort(short p_sData) +{ + return (((p_sData & 0xFF00) >> 8) | ((p_sData & 0x00FF) << 8)); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int SwapEndianInt(int p_iData) +{ + return (((p_iData & 0xFF000000) >> 24) | ((p_iData & 0x00FF0000) >> 8) | ((p_iData & 0x0000FF00) << 8) | ((p_iData & 0x000000FF) << 24)); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#ifdef ENABLE_DEBUG_LOG +char* GetDebugLogPtr(void) +{ + char *pcPtr; + + if(iLogIndex == DEBUG_LOG_SIZE) + { + iLogIndex = 0; + iWrapCntr++; + } + + memset(&acDebugLog[iLogIndex][0],0,sizeof(acDebugLog[iLogIndex])); + pcPtr = &acDebugLog[iLogIndex][0]; + + iLogIndex++; + + return pcPtr; + +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void ClearDebugLog(void) +{ + int i; + for(i = 0; i < DEBUG_LOG_SIZE; i++) + { + memset(&acDebugLog[i][0],0,sizeof(acDebugLog[i])); + } + + iLogIndex = 0; + iWrapCntr = 0; +} + +#endif + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int ConvertIntToStrLeadingZero(char* p_pcString, unsigned int p_iChar, int digit) +{ + char temp[8]; + int i=0; + sprintf(temp, "%X", p_iChar); + //itoa(p_cChar,temp,radix); + if(p_iChar < 0xF) + { + for (i=0; i=0; i--) + { + if (i==p_iSize-1) + { + uiValue = p_pcString[i] - 0x30; + } + else + { + for (j=i; j<=p_iSize-2; j++) + uiFactor *= 16; + uiValue += (p_pcString[i] - 0x30) * uiFactor; + } + + } + + } + else if (p_iRadix == 10) + { + for (i=0; i +#include "Syslog.h" + +int mDebouncingBureau = false; +int mDebouncingCuisine = false; +int mBureauVolume = 0; +int mCuisineVolume = 0; + +char VolDebug[100]; + +int VolumeTransducerInit() +{ + //Bureau volume transducer + IEC0bits.INT1IE = 0; + IFS0bits.INT1IF = 0; + if(BUREAU_VOL_POT_CCW_PIN == 1) + { + INTCONbits.INT1EP = 0; //Falling edge + } + else + { + INTCONbits.INT1EP = 1; //Rising edge + } + IPC1bits.INT1IP = 2; + IPC1bits.INT1IS = 1; + IEC0bits.INT1IE = 1; + + + //Cuisine volume transducer + IEC0bits.INT3IE = 0; + IFS0bits.INT3IF = 0; + if(CUISINE_VOL_POT_CCW_PIN == 1) + { + INTCONbits.INT3EP = 0; //Falling edge + } + else + { + INTCONbits.INT3EP = 1; //Rising edge + } + IPC3bits.INT3IP = 2; + IPC3bits.INT3IS = 2; + IEC0bits.INT3IE = 1; + + + mDebouncingBureau = false; + mDebouncingCuisine = false; + + return RET_OK; +} + + +int VolumeTransducerTick() +{ + if(mDebouncingBureau == true) + { + if(IsTimerExpired(BUREAU_VOLUME_TRANSDUCER_TIMER) == 1) + { + TimerStop(BUREAU_VOLUME_TRANSDUCER_TIMER); + if(BUREAU_VOL_POT_CCW_PIN == BUREAU_VOL_POT_CW_PIN) + { + mBureauVolume += (-1 * VOLUME_TRANSDUCER_INCREMENT); + // mBureauChange = 0; + + sprintf(VolDebug,"Bureau: %d\n",mBureauVolume); + SyslogNewString(VolDebug); + // mBureauChange = -1; + } + else + { + mBureauVolume += (VOLUME_TRANSDUCER_INCREMENT); + // mBureauChange = 0; + + sprintf(VolDebug,"Bureau: %d\n",mBureauVolume); + SyslogNewString(VolDebug); + // mBureauChange = 1; + } + if(BUREAU_VOL_POT_CCW_PIN == 1) + { + INTCONbits.INT1EP = 0; //Falling edge + } + else + { + INTCONbits.INT1EP = 1; //Rising edge + } + IFS0bits.INT1IF = 0; + IEC0bits.INT1IE = 1; + mDebouncingBureau = false; + } + } + + + if(mDebouncingCuisine == true) + { + if(IsTimerExpired(CUISINE_VOLUME_TRANSDUCER_TIMER) == 1) + { + TimerStop(CUISINE_VOLUME_TRANSDUCER_TIMER); + if(CUISINE_VOL_POT_CCW_PIN == CUISINE_VOL_POT_CW_PIN) + { + mCuisineVolume += (-1 * VOLUME_TRANSDUCER_INCREMENT); + // mBureauChange = 0; + + sprintf(VolDebug,"Cuisine: %d\n",mCuisineVolume); + SyslogNewString(VolDebug); + // mBureauChange = -1; + } + else + { + mCuisineVolume += (VOLUME_TRANSDUCER_INCREMENT); + // mBureauChange = 0; + + sprintf(VolDebug,"Cuisine: %d\n",mCuisineVolume); + SyslogNewString(VolDebug); + // mBureauChange = 1; + } + if(CUISINE_VOL_POT_CCW_PIN == 1) + { + INTCONbits.INT3EP = 0; //Falling edge + } + else + { + INTCONbits.INT3EP = 1; //Rising edge + } + IFS0bits.INT3IF = 0; + IEC0bits.INT3IE = 1; + mDebouncingCuisine = false; + } + } +} + + +void __ISR(_EXTERNAL_1_VECTOR, ipl2) BureauTransducerInterrupt(void) +{ + IEC0bits.INT1IE = 0; + + TimerStart(BUREAU_VOLUME_TRANSDUCER_TIMER,VOLUME_TRANSDUCER_DEBOUNCE_TIMEOUT); + mDebouncingBureau = true; + + IFS0bits.INT1IF = 0; //Clear interrupt flag +} + +void __ISR(_EXTERNAL_3_VECTOR, ipl2) CuisineTransducerInterrupt(void) +{ + IEC0bits.INT3IE = 0; + + TimerStart(CUISINE_VOLUME_TRANSDUCER_TIMER,VOLUME_TRANSDUCER_DEBOUNCE_TIMEOUT); + mDebouncingCuisine = true; + + IFS0bits.INT3IF = 0; //Clear interrupt flag +} \ No newline at end of file diff --git a/AudioConsole.X/Source/VolumeTransducer.h b/AudioConsole.X/Source/VolumeTransducer.h new file mode 100644 index 0000000..e3e1e91 --- /dev/null +++ b/AudioConsole.X/Source/VolumeTransducer.h @@ -0,0 +1,19 @@ +/* + * File: VolumeTransducer.h + * Author: JF + * + * Created on February 15, 2025, 9:25 AM + */ + +#ifndef VOLUMETRANSDUCER_H +#define VOLUMETRANSDUCER_H + +#define VOLUME_TRANSDUCER_DEBOUNCE_TIMEOUT 10 //millisecs +#define VOLUME_TRANSDUCER_INCREMENT 50 + + +int VolumeTransducerInit(); +int VolumeTransducerTick(); + +#endif /* VOLUMETRANSDUCER_H */ + diff --git a/AudioConsole.X/Source/Watchdog.c b/AudioConsole.X/Source/Watchdog.c new file mode 100644 index 0000000..2c9126f --- /dev/null +++ b/AudioConsole.X/Source/Watchdog.c @@ -0,0 +1,64 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Watchdog.h" +int WatchdogTriggered = 0; + +void InitWatchdog(void) +{ + if(RCONbits.WDTO == 1) + { + WatchdogTriggered = 1; + printf("Watchdog was triggered\n"); + } + } + +void EnableWatchdog(void) +{ +// WDTCONbits.ON = 1; + WDTCONSET = _WDTCON_ON_MASK; +} + +void DisableWatchdog(void) +{ +// WDTCONbits.ON = 0; + WDTCONCLR = _WDTCON_ON_MASK; +} + +void KickWatchdog(void) +{ +// WDTCONbits.WDTCLR = 1; + WDTCONSET = 0x01; +} + + + + +//EOF + + diff --git a/AudioConsole.X/Source/Watchdog.h b/AudioConsole.X/Source/Watchdog.h new file mode 100644 index 0000000..8ef9b85 --- /dev/null +++ b/AudioConsole.X/Source/Watchdog.h @@ -0,0 +1,37 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: + + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef WATCHDOG_H +#define WATCHDOG_H + +void InitWatchdog(void); +void EnableWatchdog(void); +void DisableWatchdog(void); +void KickWatchdog(void); + +#endif + + +//EOF + diff --git a/AudioConsole.X/Source/WiFiCtrl.c b/AudioConsole.X/Source/WiFiCtrl.c new file mode 100644 index 0000000..dbe8f61 --- /dev/null +++ b/AudioConsole.X/Source/WiFiCtrl.c @@ -0,0 +1,862 @@ +#include "WiFiCtrl.h" +#include "string.h" +#include "driver/include/nmasic.h" +#include +//#include "socket/include/socket.h" +#include "define.h" +#include "Terminal.h" +#include "driver/include/m2m_periph.h" +#include "ProtocolDefs.h" +#include "BoardCfg.h" +#include "timer.h" +#include "BootloaderProtocol.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" + + +/** IP address of host. */ +uint32 gu32HostIp = 0; + +/** Retry count. */ +uint8 gu8RetryCount = 0; + +/** TCP client socket handlers. */ +static SOCKET tcp_client_socket = -1; +SOCKET TerminalSocket = -1, TerminalServerSocket = -1; +uint8 TerminalRxBuf[1024]; + +#ifdef USE_SYSLOG +SOCKET SyslogSocket = -1, SyslogServerSocket = -1; +uint8 SyslogRxBuf[200]; //Syslog shall not receive much data +#endif + + +SOCKET NetworkSocket = -1, NetworkServerSocket = -1; +uint8 NetworkRxBuf[1024]; + +SOCKET BootloaderSocket = -1, BootloaderServerSocket = -1; +uint8 BootloaderRxBuf[1024]; + +/** Receive buffer definition. */ +static uint8 gau8ReceivedBuffer[MAIN_WIFI_M2M_BUFFER_SIZE] = {0}; + +/** Wi-Fi status variable. */ +static bool gbConnectedWifi = false; + +/** Get host IP status variable. */ +static bool gbHostIpByName = false; + +/** TCP Connection status variable. */ +static bool gbTcpConnection = false; + +/** Server host name. */ +static char server_host_name[] = MAIN_WEATHER_SERVER_NAME; + + +tstrWifiInitParam param; +uint8 mac_addr[6]; +uint8 u8IsMacAddrValid; +struct sockaddr_in addr_in; +uint32 mCurIPAddress; + +tstrM2MIPConfig mModuleIPConfig; + +bool mWiFiInitOK = false; +char mWiFiState = WIFI_MODULE_OFF_STATE; //JFM wifi module is always OFF at boot... + + +/** + * \brief Callback function of IP address. + * + * \param[in] hostName Domain name. + * \param[in] hostIp Server IP. + * + * \return None. + */ +static void resolve_cb(uint8 *hostName, uint32 hostIp) +{ + gu32HostIp = hostIp; + gbHostIpByName = true; + char IP1,IP2,IP3,IP4; + IP1 = IPV4_BYTE(hostIp, 0); + IP2 = IPV4_BYTE(hostIp, 1); + IP3 = IPV4_BYTE(hostIp, 2); + IP4 = IPV4_BYTE(hostIp, 3); + + printf("Host IP is %d.%d.%d.%d\r\n", + (int)IPV4_BYTE(hostIp, 0), + (int)IPV4_BYTE(hostIp, 1), + (int)IPV4_BYTE(hostIp, 2), + (int)IPV4_BYTE(hostIp, 3)); + printf("Host Name is %s\r\n", hostName); +} + + + +static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg) +{ + /* Check for socket event on TCP socket. */ + + //if(sock == TerminalSocket) + { + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind->status == 0) + { + if(sock == TerminalServerSocket) + { + listen(TerminalServerSocket, 0); + } + else if(sock == SyslogServerSocket) + { + listen(SyslogServerSocket,0); + } + else if(sock == NetworkServerSocket) + { + listen(NetworkServerSocket,0); + } + else if(sock == BootloaderServerSocket) + { + listen(BootloaderServerSocket,0); + printf("Bootloader server started\n"); + } + } + else + { + printf("Bind Failed\n"); + } + break; + } + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen->status != 0) + { + printf("socket %d listen Failed. Error: %d\n",(int)sock, pstrListen->status); + break; + } + if(sock == SyslogServerSocket) + { + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,1); + } + + break; + } + case SOCKET_MSG_ACCEPT: + { + // New Socket is accepted. + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg *)pvMsg; + if(pstrAccept->sock >= 0) + { + if(sock == TerminalServerSocket) + { + memset(TerminalRxBuf,0,sizeof(TerminalRxBuf)); + // Get the accepted socket. + TerminalSocket = pstrAccept->sock; + recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0); + SendTerminalData("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n",strlen("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n")); + // SendSyslogData("Terminal client connected\n",strlen("Terminal client connected\n")); + printf("Terminal client connected\n"); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); + } + else if(sock == SyslogServerSocket) + { + memset(SyslogRxBuf,0,sizeof(SyslogRxBuf)); + // Get the accepted socket. + SyslogSocket = pstrAccept->sock; + recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); + SendSyslogData("Syslog Welcome\n",strlen("Syslog Welcome\n")); + } + else if(sock == NetworkServerSocket) + { + memset(NetworkRxBuf,0,sizeof(NetworkRxBuf)); + // Get the accepted socket. + NetworkSocket = pstrAccept->sock; + recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0); + printf("Network client connected\n"); + } + else if(sock == BootloaderServerSocket) + { + memset(BootloaderRxBuf,0,sizeof(BootloaderRxBuf)); + // Get the accepted socket. + BootloaderSocket = pstrAccept->sock; + recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0); + printf("Bootloader client connected\n"); + } + + } + else + { + printf("Socket %d : Accept Failed\n", sock); + } + break; + + } + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRecvMsg = (tstrSocketRecvMsg*)pvMsg; + if((pstrRecvMsg->pu8Buffer != NULL) && (pstrRecvMsg->s16BufferSize > 0)) + { + // Process the received message + if(sock == TerminalSocket) + { + //Fwd data to Terminal... + recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0); + RxTerminalBuf(TerminalRxBuf, pstrRecvMsg->s16BufferSize); + + } + else if(sock == SyslogSocket) + { + //Fwd data to stdin... + recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0); + RxSyslogBuf(SyslogRxBuf, pstrRecvMsg->s16BufferSize); + } + else if(sock == NetworkSocket) + { + //Fwd data to Network... + recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0); + } + else if(sock == BootloaderSocket) + { + //Fwd data to Network... + + if(recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0) != 0) + { + char toto; + toto = 1; + } + BootloaderProtocolProtocolAnalyzeNewData(pstrRecvMsg->pu8Buffer, pstrRecvMsg->s16BufferSize); + + } + } + else //Socket must be closed. + { + if(sock == TerminalSocket) + { + close(TerminalSocket); + TerminalSocket = -1; + // SendSyslogData("Terminal client disconnected\n",strlen("Terminal client disconnected\n")); + printf("Terminal client disconnected\n"); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + } + else if(sock == SyslogSocket) + { + close(SyslogSocket); + SyslogSocket = -1; + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + } + else if(sock == NetworkSocket) + { + close(NetworkSocket); + NetworkSocket = -1; + printf("Network client disconnected\n"); + } + else if(sock == BootloaderSocket) + { + close(BootloaderSocket); + BootloaderSocket = -1; + printf("Bootloader client disconnected\n"); + BootloaderDeactivateBootloader(); + } + } + break; + } + case SOCKET_MSG_SEND: + { + if(sock == SyslogSocket) + { + + } + } + } + } + +} + +static void set_dev_name_to_mac(uint8 *name, uint8 *mac_addr) +{ + /* Name must be in the format WINC1500_00:00 */ + uint16 len; + + // len = m2m_strlen(name); + if (len >= 5) { + name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f); + name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f); + name[len - 4] = MAIN_HEX2ASCII((mac_addr[4] >> 0) & 0x0f); + name[len - 5] = MAIN_HEX2ASCII((mac_addr[4] >> 4) & 0x0f); + } +} + +/** + * \brief Callback to get the Wi-Fi status update. + * + * \param[in] u8MsgType Type of Wi-Fi notification. + * \param[in] pvMsg A pointer to a buffer containing the notification parameters. + * + * \return None. + */ +static void wifi_cb(uint8 u8MsgType, void *pvMsg) +{ + switch (u8MsgType) { + case M2M_WIFI_RESP_CON_STATE_CHANGED: { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged *)pvMsg; + if (pstrWifiState->u8CurrState == M2M_WIFI_CONNECTED) + { + printf("Wi-Fi connected\r\n"); + + if(mUseDHCP == true) + { + // m2m_wifi_request_dhcp_client(); + } + else + { + m2m_wifi_set_static_ip(&mModuleIPConfig); + gbConnectedWifi = true; + mCurIPAddress = mModuleIPConfig.u32StaticIP; + } + +//#ifndef USE_STATIC_IP +// // m2m_wifi_request_dhcp_client(); +//#else +// m2m_wifi_set_static_ip(&mModuleIPConfig); +// gbConnectedWifi = true; +// mCurIPAddress = mModuleIPConfig.u32StaticIP; +//#endif + mWiFiState = WIFI_CONNECTED_STATE; + } else if (pstrWifiState->u8CurrState == M2M_WIFI_DISCONNECTED) + { + printf("Wi-Fi disconnected\r\n"); + gbConnectedWifi = false; + mWiFiState = WIFI_DISCONNECTED_STATE; + CloseSockets(); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0); + mCurIPAddress = 0xFFFFFFFF; + } + + break; + } + + case M2M_WIFI_REQ_DHCP_CONF: + { + tstrM2MIPConfig *IPConfig; + IPConfig = (tstrM2MIPConfig*)pvMsg; +// mCurIPAddress = *(uint32*)pvMsg; + + mCurIPAddress = IPConfig->u32StaticIP; + + unsigned char ip1,ip2,ip3,ip4; + ip1 = IPV4_BYTE(mCurIPAddress,0); + ip2 = IPV4_BYTE(mCurIPAddress,1); + ip3 = IPV4_BYTE(mCurIPAddress,2); + ip4 = IPV4_BYTE(mCurIPAddress,3); + + + /* Turn LED0 on to declare that IP address received. */ + // printf("Wi-Fi IP is %u.%u.%u.%u\r\n", pu8IPAddress[0], pu8IPAddress[1], pu8IPAddress[2], pu8IPAddress[3]); + gbConnectedWifi = true; + /* Obtain the IP Address by network name */ + gethostbyname((uint8 *)server_host_name); + break; + } + + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo *)pvMsg; + printf("wifi_cb: M2M_WIFI_RESP_PROVISION_INFO.\r\n"); + + if (pstrProvInfo->u8Status == M2M_SUCCESS) { + m2m_wifi_connect((char *)pstrProvInfo->au8SSID, + strlen((char *)pstrProvInfo->au8SSID), + pstrProvInfo->u8SecType, + pstrProvInfo->au8Password, + M2M_WIFI_CH_ALL); + } else { + printf("wifi_cb: Provision failed.\r\n"); + } + } break; + + default: { + break; + } + } +} + + +int InitWiFi() +{ + tstrWifiInitParam param; + int8_t ret; + + gbTcpConnection = false; + TimerStart(WIFI_RECONNECT_TIMER,1); + mCurIPAddress = 0xFFFFFFFF; + + char IP1,IP2,IP3,IP4,GW1,GW2,GW3,GW4; + + //Load WiFi parameters from flash if present + if(SPIFlashIsPresent() == 1 && USE_IP_STORED_IN_FLASH == 1) + { + char StoredIPConfig[11]; + if(SPIFlashReadBuffer(StoredIPConfig,11,FLASH_WIFI_IP_ADDRESS) != RET_ERROR) + { + mUseDHCP = StoredIPConfig[8]; //Use DHCP + //if(mUseDHCP == 0) + { + IP1 = StoredIPConfig[0]; + IP2 = StoredIPConfig[1]; + IP3 = StoredIPConfig[2]; + IP4 = StoredIPConfig[3]; + + GW1 = StoredIPConfig[4]; + GW2 = StoredIPConfig[5]; + GW3 = StoredIPConfig[6]; + GW4 = StoredIPConfig[7]; + + if((IP1 == (char)0xFF) && (IP2 == (char)0xFF) && (IP3 == (char)0xFF) && (IP4 == (char)0xFF) || \ + ((GW1 == (char)0xFF && GW2 == (char)0xFF && GW3 == (char)0xFF && GW4 == (char)0xFF))) + { + IP1 = STATIC_IP_ADDRESS_1; + IP2 = STATIC_IP_ADDRESS_2; + IP3 = STATIC_IP_ADDRESS_3; + IP4 = STATIC_IP_ADDRESS_4; + + GW1 = GATEWAY_ADDRESS_1; + GW2 = GATEWAY_ADDRESS_2; + GW3 = GATEWAY_ADDRESS_3; + GW4 = GATEWAY_ADDRESS_4; + } + } + char APNameLength, APPassLenght; + APNameLength = StoredIPConfig[9]; + APPassLenght = StoredIPConfig[10]; + + if((APNameLength > 64) || APPassLenght > 64) + { + strcpy(mAPName,HOME_AP_NAME); + strcpy(mAPPassword,HOME_AP_PWD); + } + else + { + if(SPIFlashReadBuffer(mAPName,APNameLength,FLASH_WIFI_IP_ADDRESS+11) != RET_OK) + { + strcpy(mAPName,HOME_AP_NAME); + } + if(SPIFlashReadBuffer(mAPPassword,APPassLenght,FLASH_WIFI_IP_ADDRESS+11+APNameLength) != RET_OK) + { + strcpy(mAPPassword,HOME_AP_PWD); + } + + } + + } + } + else + { + IP1 = STATIC_IP_ADDRESS_1; + IP2 = STATIC_IP_ADDRESS_2; + IP3 = STATIC_IP_ADDRESS_3; + IP4 = STATIC_IP_ADDRESS_4; + + GW1 = GATEWAY_ADDRESS_1; + GW2 = GATEWAY_ADDRESS_2; + GW3 = GATEWAY_ADDRESS_3; + GW4 = GATEWAY_ADDRESS_4; + + strcpy(mAPPassword,HOME_AP_PWD); + strcpy(mAPName,HOME_AP_NAME); + +#ifdef USE_STATIC_IP + mUseDHCP = 0; +#else + mUseDHCP = 1; +#endif + } + + + memset(&mModuleIPConfig,0,sizeof(mModuleIPConfig)); + // mModuleIPConfig.u32StaticIP = IP_TO_U32(STATIC_IP_ADDRESS_1,STATIC_IP_ADDRESS_2,STATIC_IP_ADDRESS_3,STATIC_IP_ADDRESS_4); + mModuleIPConfig.u32StaticIP = IP_TO_U32(IP1,IP2,IP3,IP4); + mModuleIPConfig.u32DNS = IP_TO_U32(DEFAULT_DNS_ADD_1,DEFAULT_DNS_ADD_2,DEFAULT_DNS_ADD_3,DEFAULT_DNS_ADD_4); + // mModuleIPConfig.u32AlternateDNS = IP_TO_U32(ALT_DNS_ADD_1,ALT_DNS_ADD_2,ALT_DNS_ADD_3,ALT_DNS_ADD_4); + // mModuleIPConfig.u32Gateway = IP_TO_U32(GATEWAY_ADDRESS_1,GATEWAY_ADDRESS_2,GATEWAY_ADDRESS_3,GATEWAY_ADDRESS_4); + mModuleIPConfig.u32Gateway = IP_TO_U32(GW1,GW2,GW3,GW4); + mModuleIPConfig.u32SubnetMask = IP_TO_U32(SUBNET_MASK_1,SUBNET_MASK_2,SUBNET_MASK_3,SUBNET_MASK_4); + + /* Initialize the BSP. */ + // nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = (void*) &wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) + { + mWiFiInitOK = false; + mWiFiState = WIFI_INIT_ERROR_STATE; + return RET_ERROR; + } + mWiFiInitOK = true; + + mWiFiState = WIFI_DISCONNECTED_STATE; + + socketInit(); + registerSocketCallback(socket_cb, resolve_cb); + + //Get MAC address from the module + m2m_wifi_get_otp_mac_address(mac_addr, &u8IsMacAddrValid); + if (!u8IsMacAddrValid) { + m2m_wifi_set_mac_address(gau8MacAddr); + } + + //Get the working MAC address from driver. + m2m_wifi_get_mac_address(gau8MacAddr); + + //Initialize the human readable MAC address based on the working MAC + set_dev_name_to_mac((uint8 *)gacDeviceName, gau8MacAddr); + + //Use the MAC to define the SSID of the module + set_dev_name_to_mac((uint8 *)gstrM2MAPConfig.au8SSID, gau8MacAddr); + + // m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName)); + +//#ifdef USE_STATIC_IP +// //Use static ip --> disable dhcp client before connecting +// m2m_wifi_enable_dhcp(0); +//#endif +// if(m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL) != M2M_SUCCESS) +// { +// //wifi connect error... +// printf("error"); +// } + + if(mUseDHCP == 1) + { + m2m_wifi_enable_dhcp(1); + } + else + { + m2m_wifi_enable_dhcp(0); + } + if(m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL) != M2M_SUCCESS) + { + //wifi connect error... + printf("Wifi Connect error"); + } + + tstrPerphInitParam tst; + + m2m_periph_init(&tst); + + //Set all IOs as inputs except the LED (IO3).. + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO3,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO4,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO15,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO16,0); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO18,0); + // m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO6,0); + + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO15,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO18,0); + // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO6,0); + + + TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT); + + + // m2m_wifi_start_provision_mode((tstrM2MAPConfig *)&gstrM2MAPConfig, (char *)gacHttpProvDomainName, 1); + // printf("Provision Mode started.\r\nConnect to [%s] via AP[%s] and fill up the page.\r\n", + // MAIN_HTTP_PROV_SERVER_DOMAIN_NAME, + // gstrM2MAPConfig.au8SSID); +} + +int TurnOFFWiFi() +{ + int shit; + + CloseSockets(); + socketDeinit(); + m2m_wifi_disconnect(); + m2m_wifi_deinit(&shit); + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; + mWiFiInitOK = false; + gbConnectedWifi = false; + HEARTBEAT_LED_2_PIN = LED_OFF; + mCurIPAddress = 0xFFFFFFFF; + + // WIFI + mWiFiState = WIFI_MODULE_OFF_STATE; + return RET_OK; +} + +int CloseSockets() +{ + gbTcpConnection = false; + close(TerminalServerSocket); + if(TerminalSocket != -1) + { + close(TerminalSocket); + } + + close(NetworkServerSocket); + if(NetworkSocket != -1) + { + close(NetworkSocket); + } + +#ifdef USE_SYSLOG + close(SyslogServerSocket); + if(SyslogSocket != -1) + { + close(SyslogSocket); + } +#endif + + close(BootloaderServerSocket); + if(BootloaderSocket != -1) + { + close(BootloaderSocket); + } +} + + +char GetWiFiSate() +{ + return mWiFiState; +} + +uint32 GetCurIPAddress() +{ + return mCurIPAddress; +} + +void TickWiFi() +{ + if(mWiFiInitOK == false) + { + return; + } + if(mWiFiState == WIFI_DISCONNECTED_STATE && gbConnectedWifi == false)//we should be connected.. if the timer is expired, retry + { + if(IsTimerExpired(WIFI_RECONNECT_TIMER)) + { + //m2m_wifi_disconnect(); + //m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL); + m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL); + TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT); + } + } + + // if(IsTimerExpired(WIFI_TICK_TIMER)) + // { + m2m_wifi_handle_events(); + // TimerStart(WIFI_TICK_TIMER,1); + // } + + if (gbConnectedWifi && !gbTcpConnection) + { + + + OpenTerminalServer(); + //OpenNetworkServer(); + // OpenBootloaderServer(); + // BootloaderActivateBootloader(); +#ifdef USE_SYSLOG + OpenSyslogServer(); +#endif + gbTcpConnection = true; + } +} + + +//Terminal server implementation + +int OpenTerminalServer() +{ + struct sockaddr_in strAddr; + + TerminalServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 TerminalPort = TERMINAL_SERVER_PORT; + if(TerminalServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(TerminalPort); + strAddr.sin_addr.s_addr = 0; + + bind(TerminalServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendTerminalData(uint8 *data, int size) +{ + if(TerminalSocket != -1) + { + send(TerminalSocket,data,size,0); + recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} +void SentTerminalByte(uint8 data) +{ + if(TerminalSocket != -1) + { + send(TerminalSocket,&data,1,0); + recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} + +int OpenNetworkServer() +{ + struct sockaddr_in strAddr; + + NetworkServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = NETWORK_SERVER_PORT; + if(NetworkServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(NetworkServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendNetworkData(uint8 *data, int size) +{ + if(NetworkSocket != -1) + { + send(NetworkSocket,data,size,0); + recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} +void SentNetworkByte(uint8 data) +{ + if(NetworkSocket != -1) + { + send(NetworkSocket,&data,1,0); + recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} + +//Printf Server Implementation +#ifdef USE_SYSLOG +int OpenSyslogServer() +{ + struct sockaddr_in strAddr; + + SyslogServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = SYSLOG_SERVER_PORT; + if(SyslogServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(SyslogServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendSyslogData(uint8 *data, int size) +{ + if(SyslogSocket != -1); + { + send(SyslogSocket,data,size,0); + recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} +void SendSyslogByte(uint8 data) +{ + if(SyslogSocket != -1) + { + send(SyslogSocket,&data,1,0); + recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} + +int IsSyslogClientConnected() +{ + if(SyslogSocket == -1) + { + return 0; + } + + return 1; +} +#endif + +int OpenBootloaderServer() +{ + struct sockaddr_in strAddr; + + BootloaderServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = BOOTLOADER_SERVER_PORT; + if(BootloaderServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(BootloaderServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +int CloseBootloaderServer() +{ + close(BootloaderServerSocket); + BootloaderServerSocket = -1; + if(BootloaderSocket != -1) + { + close(BootloaderSocket); + BootloaderSocket = -1; + } +} +void SendBootloaderData(uint8 *data, int size) +{ + if(BootloaderSocket != -1); + { + send(BootloaderSocket,data,size,0); + recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} +void SendSBootloaderByte(uint8 data) +{ + if(BootloaderSocket != -1) + { + send(BootloaderSocket,&data,1,0); + recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} + +int IsBootloaderClientConnected() +{ + if(BootloaderSocket == -1) + { + return 0; + } + + return 1; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/WiFiCtrl.h b/AudioConsole.X/Source/WiFiCtrl.h new file mode 100644 index 0000000..f68f1e0 --- /dev/null +++ b/AudioConsole.X/Source/WiFiCtrl.h @@ -0,0 +1,273 @@ +/* + * File: WiFiCtrl.h + * Author: JF + * + * Created on December 8, 2018, 6:52 AM + */ + +#ifndef WIFICTRL_H +#define WIFICTRL_H + +#include "driver/include/m2m_wifi.h" +#include "socket/include/socket.h" + +/*! +* Used for code portability. +*/ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); + + /*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + + /*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + + /*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; + + + /*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + + /*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + + /*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; + //@} + + + + + + +int InitWiFi(); +void TickWiFi(); +int TurnOFFWiFi(); +int CloseSockets(); +char GetWiFiSate(); +uint32 GetCurIPAddress(); + +int OpenTerminalServer(); +void SendTerminalData(uint8 *data, int size); +void SentTerminalByte(uint8 data); + +int OpenNetworkServer(); +void SendNetworkData(uint8 *data, int size); +void SentNetworkByte(uint8 data); + +int OpenSyslogServer(); +void SendSyslogData(uint8 *data, int size); +void SendSyslogByte(uint8 data); +int IsSyslogClientConnected(); + +int OpenBootloaderServer(); +int CloseBootloaderServer(); +void SendBootloaderData(uint8 *data, int size); +void SendBootloaderByte(uint8 data); +int IsBootloaderClientConnected(); + + + +#define USE_STATIC_IP +#define USE_IP_STORED_IN_FLASH 0 + + +// <<< Use Configuration Wizard in Context Menu >>> +// General network settings in AP (access point) mode +// Network SSID +// app_main_m2m_device_name +#ifndef MAIN_M2M_SSID +#define MAIN_M2M_SSID "WINC3400_00:00" +#endif + +// Security type +// <1=> Wi-Fi network is not secured +// <2=> WPA/WPA2 personal(PSK) +// <3=> WEP (40 or 104) OPEN OR SHARED +// <4=> WPA/WPA2 Enterprise.IEEE802.1x +// app_main_m2m_ap_sec +#ifndef MAIN_M2M_AP_SEC +#define MAIN_M2M_AP_SEC 1 +#endif + +// Security key +// app_main_m2m_ap_key +#ifndef MAIN_M2M_AP_KEY +#define MAIN_M2M_AP_KEY "12345FFFFF" +#endif + +// SSID mode +// <0=>SSID is visible to others +// <1=>SSID is hidden +// app_main_m2m_ap_ssid_mode +#ifndef MAIN_M2M_AP_SSID_MODE +#define MAIN_M2M_AP_SSID_MODE 0 +#endif +// +// DHCP server IP address in AP (access point) mode +// DHCP server IP address 1 <0-255> +// app_ip_address_1 +#ifndef DHCP_IP_ADDRESS_1 +#define DHCP_IP_ADDRESS_1 192 +#endif + +// DHCP server IP address 2 <0-255> +// app_ip_address_2 +#ifndef DHCP_IP_ADDRESS_2 +#define DHCP_IP_ADDRESS_2 168 +#endif + +// DHCP server IP address 3 <0-255> +// app_ip_address_3 +#ifndef DHCP_IP_ADDRESS_3 +#define DHCP_IP_ADDRESS_3 50 +#endif + +// DHCP server IP address 4 <0-255> +// app_ip_address_4 +#ifndef DHCP_IP_ADDRESS_4 +#define DHCP_IP_ADDRESS_4 1 +#endif +// +// <<< end of configuration section >>> + +//Acces Point settings +#define HOME_AP_SEC_TYPE M2M_WIFI_SEC_WPA_PSK +//#define HOME_AP_NAME "ImprVEmard" +//#define HOME_AP_PWD "12345fffff" + +//#define HOME_AP_NAME "ChaletVilleEmard" +#define HOME_AP_NAME "ImprVilleEmard" +//#define HOME_AP_NAME "ElRouteurDuChalet" +//#define HOME_AP_NAME "LeChalet" +//#define HOME_AP_PWD "Evinrude30" +#define HOME_AP_PWD "12345fffff" + +#define TERMINAL_SERVER_PORT 85 +#define NETWORK_SERVER_PORT 86 +#define SYSLOG_SERVER_PORT 87 +#define BOOTLOADER_SERVER_PORT 99 + +#define AUTH_CREDENTIALS {M2M_802_1X_USR_NAME, M2M_802_1X_PWD } + +//Module Static IP settings +#define STATIC_IP_ADDRESS_1 192 +#define STATIC_IP_ADDRESS_2 168 +#define STATIC_IP_ADDRESS_3 50 +#define STATIC_IP_ADDRESS_4 122 + +#define GATEWAY_ADDRESS_1 192 +#define GATEWAY_ADDRESS_2 168 +#define GATEWAY_ADDRESS_3 50 +#define GATEWAY_ADDRESS_4 1 + +#define DEFAULT_DNS_ADD_1 8 +#define DEFAULT_DNS_ADD_2 8 +#define DEFAULT_DNS_ADD_3 8 +#define DEFAULT_DNS_ADD_4 8 + +#define ALT_DNS_ADD_1 8 +#define ALT_DNS_ADD_2 8 +#define ALT_DNS_ADD_3 4 +#define ALT_DNS_ADD_4 4 + +#define SUBNET_MASK_1 255 +#define SUBNET_MASK_2 255 +#define SUBNET_MASK_3 255 +#define SUBNET_MASK_4 0 + +#define IP_TO_U32(add1,add2,add3,add4) (((add4<<24)&0xFF000000) | ((add3<<16)&0x00FF0000) | ((add2<<8)&0x0000FF00) | (add1&0x000000FF)) + +/** Using broadcast address for simplicity. */ +#define MAIN_SERVER_PORT (80) + +/** Using IP address. */ +#define IPV4_BYTE(val, index) ((val >> (index * 8)) & 0xFF) + +/** Send buffer of TCP socket. */ +#define MAIN_PREFIX_BUFFER "GET /data/2.5/weather?q=" +#define MAIN_POST_BUFFER \ + "&mode=xml&units=metric&appid=c592e14137c3471fa9627b44f6649db4 HTTP/1.1\r\nHost: " \ + "api.openweathermap.org\r\nAccept: */*\r\n\r\n" +/** Weather information provider server. */ +#define MAIN_WEATHER_SERVER_NAME "openweathermap.org" + +/** Input City Name. */ +#define MAIN_CITY_NAME "london" + +/** Receive buffer size. */ +#define MAIN_WIFI_M2M_BUFFER_SIZE 1024 + +#define MAIN_M2M_DHCP_SERVER_IP \ + { \ + DHCP_IP_ADDRESS_1, DHCP_IP_ADDRESS_2, DHCP_IP_ADDRESS_3, DHCP_IP_ADDRESS_4 \ + } +#define MAIN_HTTP_PROV_SERVER_DOMAIN_NAME "JF.com" + +#define MAIN_MAC_ADDRESS \ + { \ + 0xf8, 0xf0, 0x05, 0x45, 0xD4, 0x84 \ + } + +#define MAIN_HEX2ASCII(x) (((x) >= 10) ? (((x)-10) + 'A') : ((x) + '0')) + +#define TEMPERATURE_ABS(a) (((a) > 0) ? (a) : -(a)) + +static tstrM2MAPConfig gstrM2MAPConfig = {MAIN_M2M_SSID, + 1, + 0, + sizeof(MAIN_M2M_AP_KEY) - 1, + MAIN_M2M_AP_KEY, + MAIN_M2M_AP_SEC, + MAIN_M2M_AP_SSID_MODE, + MAIN_M2M_DHCP_SERVER_IP}; + +static const char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; + +static uint8 gau8MacAddr[] = MAIN_MAC_ADDRESS; +static sint8 gacDeviceName[] = MAIN_M2M_SSID; +char mAPName[64]; +char mAPPassword[64]; +char mUseDHCP; + +#define MAIN_WAITING_TIME 3000 +#define MAIN_RETRY_COUNT 10 + +extern SOCKET TerminalSocket; + + +#endif /* WIFICTRL_H */ + diff --git a/AudioConsole.X/Source/checksum.h b/AudioConsole.X/Source/checksum.h new file mode 100644 index 0000000..37d4110 --- /dev/null +++ b/AudioConsole.X/Source/checksum.h @@ -0,0 +1,94 @@ +/* + * Library: libcrc + * File: include/checksum.h + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * 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. + * + * Description + * ----------- + * The headerfile include/checksum.h contains the definitions and prototypes + * for routines that can be used to calculate several kinds of checksums. + */ + +#ifndef DEF_LIBCRC_CHECKSUM_H +#define DEF_LIBCRC_CHECKSUM_H + +#include + +/* + * #define CRC_POLY_xxxx + * + * The constants of the form CRC_POLY_xxxx define the polynomials for some well + * known CRC calculations. + */ + +#define CRC_POLY_16 0xA001 +#define CRC_POLY_32 0xEDB88320L +#define CRC_POLY_CCITT 0x1021 +#define CRC_POLY_DNP 0xA6BC +#define CRC_POLY_KERMIT 0x8408 +#define CRC_POLY_SICK 0x8005 + +/* + * #define CRC_START_xxxx + * + * The constants of the form CRC_START_xxxx define the values that are used for + * initialization of a CRC value for common used calculation methods. + */ + +#define CRC_START_8 0x00 +#define CRC_START_16 0x0000 +#define CRC_START_MODBUS 0xFFFF +#define CRC_START_XMODEM 0x0000 +#define CRC_START_CCITT_1D0F 0x1D0F +#define CRC_START_CCITT_FFFF 0xFFFF +#define CRC_START_KERMIT 0x0000 +#define CRC_START_SICK 0x0000 +#define CRC_START_DNP 0x0000 +#define CRC_START_32 0xFFFFFFFFL + +/* + * Prototype list of global functions + */ + +unsigned char * checksum_NMEA( const unsigned char *input_str, unsigned char *result ); +uint8_t crc_8( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_16( const unsigned char *input_str, size_t num_bytes ); +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_1d0f( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_ffff( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_dnp( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_kermit( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_modbus( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_xmodem( const unsigned char *input_str, size_t num_bytes ); +uint8_t update_crc_8( uint8_t crc, unsigned char c ); +uint16_t update_crc_16( uint16_t crc, unsigned char c ); +uint32_t update_crc_32( uint32_t crc, unsigned char c ); +uint16_t update_crc_ccitt( uint16_t crc, unsigned char c ); +uint16_t update_crc_dnp( uint16_t crc, unsigned char c ); +uint16_t update_crc_kermit( uint16_t crc, unsigned char c ); +uint16_t update_crc_sick( uint16_t crc, unsigned char c, unsigned char prev_byte ); + +#endif // DEF_LIBCRC_CHECKSUM_H diff --git a/AudioConsole.X/Source/crc32.c b/AudioConsole.X/Source/crc32.c new file mode 100644 index 0000000..3a0f007 --- /dev/null +++ b/AudioConsole.X/Source/crc32.c @@ -0,0 +1,131 @@ +/* + * Library: libcrc + * File: src/crc32.c + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * 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. + * + * Description + * ----------- + * The source file src/crc32.c contains the routines which are needed to + * calculate a 32 bit CRC value of a sequence of bytes. + */ + +#include +#include +#include "checksum.h" + +static void init_crc32_tab( void ); + +static bool crc_tab32_init = false; +static uint32_t crc_tab32[256]; + +/* + * uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); + * + * The function crc_32() calculates in one pass the common 32 bit CRC value for + * a byte string that is passed to the function together with a parameter + * indicating the length. + */ + +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ) { + + uint32_t crc; + uint32_t tmp; + uint32_t long_c; + const unsigned char *ptr; + size_t a; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + crc = CRC_START_32; + ptr = input_str; + + if ( ptr != NULL ) for (a=0; a> 8) ^ crc_tab32[ tmp & 0xff ]; + + ptr++; + } + + crc ^= 0xffffffffL; + + return crc & 0xffffffffL; + +} /* crc_32 */ + +/* + * uint32_t update_crc_32( uint32_t crc, unsigned char c ); + * + * The function update_crc_32() calculates a new CRC-32 value based on the + * previous value of the CRC and the next byte of the data to be checked. + */ + +uint32_t update_crc_32( uint32_t crc, unsigned char c ) { + + uint32_t tmp; + uint32_t long_c; + + long_c = 0x000000ffL & (uint32_t) c; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + tmp = crc ^ long_c; + crc = (crc >> 8) ^ crc_tab32[ tmp & 0xff ]; + + return crc & 0xffffffffL;; + +} /* update_crc_32 */ + +/* + * static void init_crc32_tab( void ); + * + * For optimal speed, the CRC32 calculation uses a table with pre-calculated + * bit patterns which are used in the XOR operations in the program. This table + * is generated once, the first time the CRC update routine is called. + */ + +static void init_crc32_tab( void ) { + + uint32_t i; + uint32_t j; + uint32_t crc; + + for (i=0; i<256; i++) { + + crc = i; + + for (j=0; j<8; j++) { + + if ( crc & 0x00000001L ) crc = ( crc >> 1 ) ^ CRC_POLY_32; + else crc = crc >> 1; + } + + crc_tab32[i] = crc; + } + + crc_tab32_init = true; + +} /* init_crc32_tab */ diff --git a/AudioConsole.X/Source/define.h b/AudioConsole.X/Source/define.h new file mode 100644 index 0000000..72bb437 --- /dev/null +++ b/AudioConsole.X/Source/define.h @@ -0,0 +1,253 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* ¤Revision: +000 20100616 HCAM, + Original version. + + + ,----.. ,----.. + / / \ / / \ ,--, + | : : __ ,-. ,---. | : : ,--.'| ,---, + . | ;. / ,' ,'/ /| ' ,'\ .--.--. . | ;. / | |, ,-+-. / | + . ; /--` ' | |' | / / | / / ' . ; /--` `--'_ ,--.'|' | + ; | ; __ | | ,'. ; ,. :| : /`./ ; | ; __ ,' ,'| | | ,"' | + | : |.' .'' : / ' | |: :| : ;_ | : |.' .'' | | | | / | | + . | '_.' :| | ' ' | .; : \ \ `. . | '_.' :| | : | | | | | + ' ; : \ |; : | | : | `----. \ ' ; : \ |' : |__ | | | |/ + ' | '/ .'| , ; \ \ / / /`--' / ' | '/ .'| | '.'|| | |--' + | : / ---' `----' '--'. / | : / ; : ;| |/ + \ \ .' `--'---' \ \ .' | , / '---' + `---` `---` ---`-' + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + + + + + /****************************** NOTES *************************************** +-> Timers assignment <- + +- Timer1 used by TCP Stack (tick.c) +- Timer2 used by general timer module (timer.c) (see GP_TIMER_USE_TIMER_X definition below) + - timer3 used by input capture to detect PWM + - timer4 used by hall acquisition module (HallAcquisition.c) + - timer5 used by FPGAInterface to time-base SPI the transfer to the FPGA + + + -> Interrupt priority assignment <- + + Priority.SubPriority - Assignment +HIGHEST + 7.3 + 7.2 + 7.1 + 7.0 + 6.3 + 6.2 + 6.1 + 6.0 + 5.3 + 5.2 + 5.1 + 5.0 + 4.3 + 4.2 + 4.1 + 4.0 + 3.3 + 3.2 + 3.1 + 3.0 - Wifi chip IRQ (Ext INT 0) + 2.3 - TIMER2 (General purpose timer) + 2.2 + 2.1 - Ext Interrupt 1 (Led dimming knob) NOT USED!!! + 1.0 + 1.3 + 1.2 + 1.1 + 1.0 +LOWEST + + *****************************************************************************/ + +#ifndef DEFINE_H +#define DEFINE_H + +/* ************************************************************************** */ +/* Includes */ +#include + +//#include "CUHelperFcns.h" + +enum eWiFiState +{ + WIFI_MODULE_OFF_STATE = 0, + WIFI_CONNECTED_STATE, + WIFI_DISCONNECTED_STATE, + WIFI_INIT_ERROR_STATE, + WIFI_UNKNOWN_STATE +}; + +#define WIFI_MODULE_SPI_BAUDRATE 15000000 + +#define WIFI_CONNECT_TIMEOUT 10000 //The delay we allow the module to establish a connection. + +/* ************************************************************************** */ +/* Defines */ + +#define PIN_INPUT 1 +#define PIN_OUTPUT 0 +#define LED_ON 0 +#define LED_OFF 1 +#define false 0 +#define true 1 +#define MSB8(x) ((x >> 8) & 0xFF) +#define LSB8(x) (x & 0xFF) + +#define RET_OK true +#define RET_ERROR false + +#define bool unsigned int + +#define PI 3.1415926536 + +//#define ENABLE_DEBUG_LOG +#ifdef ENABLE_DEBUG_LOG + #include "util.h" +#endif + +////#define USE_HALL_ACQ_SIMULATOR //Use this switch for development to test hall acquisition traces +//#define USE_ENGINEERING_MODE //Use this switch to disable speed, position and halls traces and traces buffer allocation (all traces !) +////#define USE_TRACE_SIMULATOR //Use this switch to simulate trace data for development +////#define USE_SPI_DONGLE_SIMULATOR //Use this switch if you use the CUMUX as a SPI dongle instead of the CS16IS74 dongle. +////#define USE_PMP_AUTOINCREMENT //Use to speed-up AD2S data transfer +////#define USE_PWM_DETECTION //Use PWM detection to enable/disable bridge +////#define USE_AUTO_BRIDGE_CONTROL //Execute drive bridge control +////#define FORCE_BRIDGE_ON +////#define DRIVE_BOARD_NOT_INSTALLED +//#define DISABLE_PRINT_FAULT +//#define SPI_FAST +////#define USE_DMA_WITH_PMP +////#define USE_RESOLVER_STATEMACHINE +////#define DISABLE_DRIVE_PARAM_MGMT // uncomment to avoid setting the drive at power-up +#define NO_EXTERNAL_UART + +//Choose which timer to use for general purpose timer +#define GP_TIMER_USE_TIMER_1 + + +//#define POLL_UART1_RX +//#define POLL_UART2_RX + + +//#define NO_WIFI + +//Define the com port assignations +//---------------------------- +#define NETWORK_UART_PORT UART_1 + + +#define LTE_IF_UART_PORT UART_2 + + +// +//---------------------------- +//Enable only one of those 3 options +//#define USE_BLOCKING_PRINTF +//#define USE_UART_PRINTF +#define USE_SYSLOG + +#ifdef USE_UART_PRINTF +#ifdef USE_SYSLOG +#error "USE_UART_PRINTF and USE_SYSLOG defined simultaneously" +#endif +#endif +//#error test + +#ifdef USE_SYSLOG +#ifdef NO_WIFI +#undef USE_SYSLOG +#error "USE_SYSLOG defined with NO_WIFI" +#endif +#endif + +#ifdef USE_UART_PRINTF + #define PRINTF(n, a...) printf(n, ## a) +#elif defined USE_SYSLOG + #define PRINTF(n, a...) printf(n, ## a) +#else + #define PRINTF(n, a...) +#endif + +#ifndef NO_WIFI + // #define USE_WIFI_PRINTF +#endif + + //#define USE_UART_PRINTF +//#else +// +// #define NO_EXTERNAL_UART +//#endif + +//#define CONNECT_DEVICE_TO_NETWORK +//#define TERMINAL_USE_TELNET +//#define TERMINAL_USE_TCP_SERVER + + +/* ************************************************************************** */ +/* Type definitions */ + + +//----- STDINT.H TYPE DEFINITIONS ----- +//(Valid for XC16 & XC32 microchip PIC compilers) +#ifndef uint8_t +typedef unsigned char uint8_t; +#endif + +#ifndef int8_t +typedef signed char int8_t; +#endif + +#ifndef uint16_t +typedef unsigned short uint16_t; +#endif + +#ifndef int16_t +typedef signed short int16_t; +#endif + +/* +#ifndef uint32_t +typedef unsigned long uint32_t; +#endif + +#ifndef int32_t +typedef signed long int32_t; +#endif +*/ + +#ifndef uint64_t +typedef unsigned long long uint64_t; +#endif + +#ifndef int64_t +typedef signed long long int64_t; +#endif + + + + + +#endif +//EOF + diff --git a/AudioConsole.X/Source/define_WITT.h b/AudioConsole.X/Source/define_WITT.h new file mode 100644 index 0000000..346b03f --- /dev/null +++ b/AudioConsole.X/Source/define_WITT.h @@ -0,0 +1,168 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* ¤Revision: +000 20100616 HCAM, + Original version. + + + ,----.. ,----.. + / / \ / / \ ,--, + | : : __ ,-. ,---. | : : ,--.'| ,---, + . | ;. / ,' ,'/ /| ' ,'\ .--.--. . | ;. / | |, ,-+-. / | + . ; /--` ' | |' | / / | / / ' . ; /--` `--'_ ,--.'|' | + ; | ; __ | | ,'. ; ,. :| : /`./ ; | ; __ ,' ,'| | | ,"' | + | : |.' .'' : / ' | |: :| : ;_ | : |.' .'' | | | | / | | + . | '_.' :| | ' ' | .; : \ \ `. . | '_.' :| | : | | | | | + ' ; : \ |; : | | : | `----. \ ' ; : \ |' : |__ | | | |/ + ' | '/ .'| , ; \ \ / / /`--' / ' | '/ .'| | '.'|| | |--' + | : / ---' `----' '--'. / | : / ; : ;| |/ + \ \ .' `--'---' \ \ .' | , / '---' + `---` `---` ---`-' + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + + + + + /****************************** NOTES *************************************** + -> Timers assignment <- + + - Timer1 used by general timer module (timer.c) + - Timer2 used by time based Resolver data acquisition module (resolver.c) + - timer3 used by input capture to detect PWM + - timer4 used by hall acquisition module (HallAcquisition.c) + - timer5 used by FPGAInterface to time-base SPI the transfer to the FPGA + + + -> Interrupt priority assignment <- + + Priority.SubPriority - Assignment +HIGHEST + 7.3 + 7.2 + 7.1 - UART1 + 7.0 - UART2 + 6.3 - TIMER2 (Resolver acquisition & halls computation) + 6.2 - PMP + 6.1 + 6.0 - Input Capture + 5.3 - ADC + 5.2 - SPI + 5.1 + 5.0 + 4.3 - Drive Enable pin interrupt + 4.2 - AD2S DOS Pin + 4.1 - AD2S LOT Pin + 4.0 + 3.3 + 3.2 + 3.1 + 3.0 - TIMER5 (FPGA TX) + 2.3 - TIMER1 (General purpose timer) + 2.2 - TIMER3 (PWM Detection) + 2.1 + 1.0 + 1.3 + 1.2 + 1.1 + 1.0 +LOWEST + + *****************************************************************************/ + +#ifndef DEFINE_H +#define DEFINE_H + +/* ************************************************************************** */ +/* Includes */ +#include +//#include "CUHelperFcns.h" + +/* ************************************************************************** */ +/* Defines */ +#define SYS_FREQ (77824000L) //Clock period = 12.85 ns +#define PERIPHERAL_FREQ (77824000L) +#define PIN_INPUT 1 +#define PIN_OUTPUT 0 +#define LED_ON 0 +#define LED_OFF 1 +#define false 0 +#define true 1 +#define MSB8(x) ((x >> 8) & 0xFF) +#define LSB8(x) (x & 0xFF) + +#define PI 3.1415926536 + +//#define ENABLE_DEBUG_LOG +#ifdef ENABLE_DEBUG_LOG + #include "util.h" +#endif + +//#define USE_HALL_ACQ_SIMULATOR //Use this switch for development to test hall acquisition traces +#define USE_ENGINEERING_MODE //Use this switch to disable speed, position and halls traces and traces buffer allocation (all traces !) +//#define USE_TRACE_SIMULATOR //Use this switch to simulate trace data for development +//#define USE_SPI_DONGLE_SIMULATOR //Use this switch if you use the CUMUX as a SPI dongle instead of the CS16IS74 dongle. +//#define USE_PMP_AUTOINCREMENT //Use to speed-up AD2S data transfer +#define USE_PWM_DETECTION //Use PWM detection to enable/disable bridge +#define USE_AUTO_BRIDGE_CONTROL //Execute drive bridge control +//#define FORCE_BRIDGE_ON +//#define DRIVE_BOARD_NOT_INSTALLED +#define DISABLE_PRINT_FAULT +#define SPI_FAST +//#define USE_DMA_WITH_PMP +//#define USE_RESOLVER_STATEMACHINE +//#define DISABLE_DRIVE_PARAM_MGMT // uncomment to avoid setting the drive at power-up + +#define POLL_UART1_RX +#define POLL_UART2_RX + +// Uncomment next #define for testing with ICCA board +// #define USE_ICCA_CU_PA_UART_SNOOPING + + +//Define the com port assignations +//---------------------------- +#define DRIVE_UART_PORT UART_1 +#ifdef USE_ICCA_CU_PA_UART_SNOOPING + // Note: With this configuration there is no CU command going to the PA + #define CU_UART_PORT UART_3 + #define CONSOLE_UART_PORT UART_2 +#else + // Normal setting using PA SPI for UART_3 (CONSOLE_UART_PORT) + #define CU_UART_PORT UART_2 + #define CONSOLE_UART_PORT UART_3 +#endif + +#define ACTUATOR_WITTENSTEIN +//#define ACTUATOR_DS50 + +// +//---------------------------- +//#define USE_BLOCKING_PRINTF +#define USE_PRINTF + +#ifdef USE_PRINTF + #define PRINTF(n, a...) printf(n, ## a) +#else + #define PRINTF(n, a...) + #define NO_EXTERNAL_UART +#endif + + +/* ************************************************************************** */ +/* Type definitions */ +typedef int bool; + +#endif +//EOF + diff --git a/AudioConsole.X/Source/exceptions.c b/AudioConsole.X/Source/exceptions.c new file mode 100644 index 0000000..50f62af --- /dev/null +++ b/AudioConsole.X/Source/exceptions.c @@ -0,0 +1,129 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ + +/******************************************************************************/ +/* Exception Macro Definitions */ +/******************************************************************************/ + +/*When WRITE_EXCEPTION_CAUSE_TO_FLASH is defined the PIC32 executes a self +write routine to save the exception cause register.*/ + +/* #define WRITE_EXCEPTION_CAUSE_TO_FLASH */ + +#ifdef WRITE_EXCEPTION_CAUSE_TO_FLASH + +/* Physical Addresses which are at the end of KSEG 0 program memory. */ +/* User may want to adjust these values */ +#define EXCEPTION_CAUSE 0x1D007FFC +#define EXCEPTION_ADDR 0x1D007FF8 + +#endif + +/******************************************************************************/ +/* Exception Variable Declaration */ +/******************************************************************************/ + +/* static in case exception condition would stop auto variable being created */ +static enum { + EXCEP_IRQ = 0, /* interrupt */ + EXCEP_AdEL = 4, /* address error exception (load or ifetch) */ + EXCEP_AdES, /* address error exception (store) */ + EXCEP_IBE, /* bus error (ifetch) */ + EXCEP_DBE, /* bus error (load/store) */ + EXCEP_Sys, /* syscall */ + EXCEP_Bp, /* breakpoint */ + EXCEP_RI, /* reserved instruction */ + EXCEP_CpU, /* coprocessor unusable */ + EXCEP_Overflow, /* arithmetic overflow */ + EXCEP_Trap, /* trap (possible divide by zero) */ + EXCEP_IS1 = 16, /* implementation specfic 1 */ + EXCEP_CEU, /* CorExtend Unuseable */ + EXCEP_C2E /* coprocessor 2 */ +} _excep_code; + +/* static in case exception condition would stop auto variable being created */ +static unsigned int _epc_code; +static unsigned int _excep_addr; + +/******************************************************************************/ +/* Exception Handling */ +/******************************************************************************/ + +/* This function overrides the normal _weak_ _generic_exception_handler which +is defined in the C32 User's Guide. The _weak_ _generic_exception_handler +just does an infinite loop. */ +void _general_exception_handler(void) +{ + unsigned long t0 = _CP0_GET_COUNT(); /* Used for NVMOP 6 us Delay */ + + /* Mask off Mask of the ExcCode Field from the Cause Register + Refer to the MIPs M4K Software User's manual */ + _excep_code=_CP0_GET_CAUSE() & 0x0000007C >> 2; + _excep_addr=_CP0_GET_EPC(); + + _CP0_SET_STATUS(_CP0_GET_STATUS()&0xFFFFFFE); /* Disable Interrupts */ + +#ifdef WRITE_EXCEPTION_CAUSE_TO_FLASH + + /* Store the exception causes in program memory in case the part exhibited + the problem in release mode. Gives user a place to start debugging + the problem. */ + + NVMCON = 0x4001; /* set WREN and Word Programing mode */ + NVMADDR = EXCEPTION_CAUSE; /* PM Address at which we'll store the */ + /* cause register */ + NVMDATA = _excep_code; + + /* wait at least 6 us for LVD start-up + assume we're running at max frequency + (80 MHz) so we're always safe */ + { + while (_CP0_GET_COUNT() - t0 < (80/2)*6); + } + + NVMKEY = 0xAA996655; + NVMKEY = 0x556699AA; /* unlock sequence */ + NVMCONSET = NVMCON_WR; + while(NVMCON & NVMCON_WR); /* wait on write to finish */ + + NVMCON = 0x4001; /* set WREN and Word Programing mode */ + NVMADDR = EXCEPTION_ADDR; /* PM Address at which we'll store the */ + /* exception address register */ + NVMDATA = _excep_addr; + + /* wait at least 6 us for LVD start-up + assume we're running at max frequency + (80 MHz) so we're always safe */ + { + while (_CP0_GET_COUNT() - t0 < (80/2)*6); + } + + NVMKEY = 0xAA996655; + NVMKEY = 0x556699AA; /* unlock sequence */ + NVMCONSET = NVMCON_WR; + while(NVMCON & NVMCON_WR); + + /* Write the exception cause and address to the part can be read and + the cause determined. */ + NVMWriteWord((void*)EXCEPTION_CAUSE, _excep_code); + NVMWriteWord((void*)EXCEPTION_ADDR, _excep_addr); + +#endif + + + while (1) + { + /* Examine _excep_code to identify the type of exception */ + /* Examine _excep_addr to find the address that caused the exception */ + Nop(); + Nop(); + Nop(); + SoftReset(); + Nop(); + } +} diff --git a/AudioConsole.X/Source/hd44780.c b/AudioConsole.X/Source/hd44780.c new file mode 100644 index 0000000..75cc8ae --- /dev/null +++ b/AudioConsole.X/Source/hd44780.c @@ -0,0 +1,739 @@ +/** + * ---------------------------------------------------------------+ + * @desc HD44780 LCD Driver + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 18.11.2020 + * @file hd44780.c + * @tested AVR Atmega16a + * + * @depend hd44780.h + * ---------------------------------------------------------------+ + * @usage default set 16x2 LCD + * 4-bit with 3 control wires (RW, RS, E) + */ + +// include libraries +#include +//#include +//#include +#include "define.h" +#include "BoardCfg.h" +#include "hd44780.h" +#include "timer.h" + +// +---------------------------+ +// | Power on | +// | Wait for more than 15 ms | // 15 ms wait +// | after VCC rises to 4.5 V | +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | +// | 0 0 0 0 1 1 | // Initial sequence 0x30 +// | Wait for more than 4.1 ms | // 4.1 ms us writing DATA into DDRAM or CGRAM +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | +// | 0 0 0 0 1 1 | // Initial sequence 0x30 +// | Wait for more than 0.1 ms | // 100 us writing DATA into DDRAM or CGRAM +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Initial sequence 0x30 +// | 0 0 0 0 1 1 | // 37 us writing DATA into DDRAM or CGRAM 4 us tadd - time after busy flag disapeared +// | Wait for more than 45 us | // 37 us + 4 us = 41 us * (270/250) = 45us +// +---------------------------+ +// | +// +---------------------------+ // 4bit mode 0x20 !!! MUST BE SET TIME, BF CHECK DOESN'T WORK CORRECTLY !!! +// | RS R/W DB7 DB6 DB5 DB4 | // +// | 0 0 0 0 1 0 | // 37 us writing DATA into DDRAM or CGRAM 4 us tadd - time after busy flag disapeared +// | Wait for more than 45 us | // !!! MUST BE SET DELAY TIME, BUSY FLAG CHECK DOESN'T WORK CORRECTLY !!! +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Display off 0x08 +// | 0 0 0 0 1 0 | // +// | 0 0 1 0 0 0 | // +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Display clear 0x01 +// | 0 0 0 0 0 0 | // +// | 0 0 0 0 0 1 | // +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Entry mode set 0x06 +// | 0 0 0 0 0 0 | // +// | 0 0 0 1 1 0 | // shift cursor to the left, without text shifting +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ + +/** + * @desc LCD display clear + * + * @param void + * + * @return void + */ +void HD44780_DisplayClear (void) +{ + // Diplay clear + HD44780_SendInstruction(HD44780_DISP_CLEAR); +} + +/** + * @desc LCD display on + * + * @param void + * + * @return void + */ +void HD44780_DisplayOn (void) +{ + // send instruction - display on + HD44780_SendInstruction(HD44780_DISP_ON); +} + +/** + * @desc LCD cursor on, display on + * + * @param void + * + * @return void + */ +void HD44780_CursorOn (void) +{ + // send instruction - cursor on + HD44780_SendInstruction(HD44780_CURSOR_ON); +} + +/** + * @desc LCD cursor off + * + * @param void + * + * @return void + */ +void HD44780_CursorOff (void) +{ + // send instruction - cursor on + HD44780_SendInstruction(HD44780_CURSOR_OFF); +} + +/** + * @desc LCD cursor blink, cursor on, display on + * + * @param void + * + * @return void + */ +void HD44780_CursorBlink (void) +{ + // send instruction - Cursor blink + HD44780_SendInstruction(HD44780_CURSOR_BLINK); +} + +/** + * @desc LCD draw char + * + * @param char + * + * @return void + */ +void HD44780_DrawChar (char character) +{ + // Diplay clear + HD44780_SendData(character); +} + +/** + * @desc LCD draw string + * + * @param char * + * + * @return void + */ +void HD44780_DrawString (char *str) +{ + unsigned char i = 0; + // loop through 5 bytes + while (str[i] != '\0') { + //read characters and increment index + HD44780_SendData(str[i++]); + } +} + +/** + * @desc Got to position x,y + * + * @param char + * @param char + * + * @return char + */ +char HD44780_PositionXY (char x, char y) +{ + if (x > HD44780_COLS || y > HD44780_ROWS) { + // error + return ERROR; + } + // check which row + if (y == 0) { + // send instruction 1st row + HD44780_SendInstruction(HD44780_POSITION | (HD44780_ROW1_START + x)); + } else if (y == 1) { + // send instruction 2nd row + HD44780_SendInstruction(HD44780_POSITION | (HD44780_ROW2_START + x)); + } + // success + return 0; +} + +/** + * @desc Shift cursor / display to left / right + * + * @param char item {HD44780_CURSOR; HD44780_DISPLAY} + * @param char direction {HD44780_RIGHT; HD44780_LEFT} + * + * @return char + */ +char HD44780_Shift (char item, char direction) +{ + // check if item is cursor or display or direction is left or right + if ((item != HD44780_DISPLAY) && (item != HD44780_CURSOR)) { + // error + return ERROR; + } + // check if direction is left or right + if ((direction != HD44780_RIGHT) && (direction != HD44780_LEFT)) { + // error + return ERROR; + } + + // cursor shift + if (item == HD44780_CURSOR) { + // right shift + if (direction == HD44780_RIGHT) { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_CURSOR | HD44780_RIGHT); + } else { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_CURSOR | HD44780_LEFT); + } + // display shift + } else { + // right shift + if (direction == HD44780_RIGHT) { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_DISPLAY | HD44780_RIGHT); + } else { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_DISPLAY | HD44780_LEFT); + } + } + // success + return 0; +} + +/** + * @desc LCD init - initialisation routine + * + * @param void + * + * @return void + */ +void HD44780_Init (void) +{ + // set E as output + //SETBIT(HD44780_DDR_E, HD44780_E); + // set RS as output + //SETBIT(HD44780_DDR_RS, HD44780_RS); + // set RW as output + //SETBIT(HD44780_DDR_RW, HD44780_RW); + + // set DB7-DB4 as output +// HD44780_SetDDR_DATA4to7(); + + // clear RS + // CLRBIT(HD44780_PORT_RS, HD44780_RS); + LCD_RS_PIN = 0; + // clear RW + // CLRBIT(HD44780_PORT_RW, HD44780_RW); + LCD_RW_PIN = 0; + // clear E + // CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + + // delay > 15ms + _delay_ms(16); + + + // Busy Flag (BF) cannot be checked in these instructions + // --------------------------------------------------------------------- + // Initial sequence 0x30 - send 4 bits in 4 bit mode +// HD44780_SendInstruction(HD44780_INIT_SEQ);JFM + HD44780_Send4bitsIn4bitMode(HD44780_INIT_SEQ); + // delay > 4.1ms + _delay_ms(5); + + + // pulse E + //HD44780_PulseE(); + // delay > 100us + _delay_us(110); + + HD44780_Send4bitsIn4bitMode(HD44780_INIT_SEQ); + + + // pulse E +// HD44780_PulseE(); + // delay > 45us (=37+4 * 270/250) + _delay_us(50); + + + HD44780_Send4bitsIn4bitMode(HD44780_INIT_SEQ); + // 4 bit mode 0x20 - send 4 bits in 4 bit mode + HD44780_Send4bitsIn4bitMode(HD44780_4BIT_MODE); + // pulse E + //HD44780_PulseE(); + // delay > 45us (=37+4 * 270/250) + _delay_us(50); + // ---------------------------------------------------------------------- + + // 4-bit & 2-lines & 5x8-dots 0x28 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_4BIT_MODE | HD44780_2_ROWS | HD44780_FONT_5x8); + + // display off 0x08 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_DISP_OFF); + + // display clear 0x01 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_DISP_CLEAR); + + // entry mode set 0x06 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_ENTRY_MODE); +} + +/** + * @desc Check Busy Flag (BF) in 4 bit mode + * + * @param void + * + * @return void + */ +void HD44780_CheckBFin4bitMode (void) +{ + unsigned char input = 0; + + Sleep(5); + return; + + // clear DB7-DB4 as input + HD44780_ClearDDR_DATA4to7(); + // set pull-up resistors for DB7-DB4 +// HD44780_SetPORT_DATA4to7(); + + // clear RS +// CLRBIT(HD44780_PORT_RS, HD44780_RS); + LCD_RS_PIN = 0; + // set RW - read instruction +// SETBIT(HD44780_PORT_RW, HD44780_RW); + LCD_RW_PIN = 1; + + // test HIGH level on PIN DB7 + // after clear PIN DB7 should continue + // ------------------------------------- + // us: 0.5|0.5|0.5 + // ___ ___ + // E: ___/ \___/ \__ + // ___ ___ + // DB7: \___/ \___/ \__ + // + while (1) { + + // Read upper nibble + // -------------------------------- + // Set E +// SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // PWeh > 0.5us + _delay_us(0.5); + // read upper nibble (tDDR > 360ns) + input = HD44780_PIN_DATA; + // Clear E +// CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + + // Read lower nibble + // -------------------------------- + // Set E +// SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // PWeh > 0.5us + _delay_us(0.5); + // read lower nibble (tDDR > 360ns) + //input |= (unsigned char)(HD44780_PIN_DATA >> 4); + char IsBusy = (HD44780_DATA7 == 1); + + // Clear E +// CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + +// // check if DB7 is cleared +// if (!(input & (1 << HD44780_DATA7))) + if (IsBusy == 0) + { + // if BF cleared -> end loop + break; + } + } + + // clear RW +// CLRBIT(HD44780_PORT_RW, HD44780_RW); + LCD_RW_PIN = 0; + + // set DB7-DB4 as output + HD44780_SetDDR_DATA4to7(); +} + +/** + * @desc Check Busy Flag (BF) in 8 bit mode + * + * @param void + * @return void + */ +void HD44780_CheckBFin8bitMode (void) +{ +} + +/** + * @desc LCD send instruction + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SendInstruction (unsigned short int data) +{ + // Clear RS +// HD44780_PORT_RS &= ~(1 << HD44780_RS); + LCD_RS_PIN = 0; + + // 4bit mode + // ------------------------------------------ + if (HD44780_MODE == HD44780_4BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn4bitMode(data); + // check busy flag + HD44780_CheckBFin4bitMode(); + // 8 bit mode + // ------------------------------------------ + } else if (HD44780_MODE == HD44780_8BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn8bitMode(data); + // check busy flag + HD44780_CheckBFin8bitMode(); + } +} + +/** + * @desc LCD send data + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SendData (unsigned short int data) +{ + // Set RS +// SETBIT(HD44780_PORT_RS, HD44780_RS); + LCD_RS_PIN = 1; + + // 4bit mode + // ------------------------------------------ + if (HD44780_MODE == HD44780_4BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn4bitMode(data); + // check busy flag + HD44780_CheckBFin4bitMode(); + // 8 bit mode + // ------------------------------------------ + } else if (HD44780_MODE == HD44780_8BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn8bitMode(data); + // check busy flag + HD44780_CheckBFin8bitMode(); + } + + // Clear RS +// CLRBIT(HD44780_PORT_RS, HD44780_RS); + LCD_RS_PIN = 0; +} + +/** + * @desc LCD send 4bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send4bitsIn4bitMode (unsigned short int data) +{ + // Set E +// SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // send data to LCD + HD44780_SetUppNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E +// CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send 8bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send8bitsIn4bitMode (unsigned short int data) +{ + // Send upper nibble + // ---------------------------------- + // Set E +// SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // send data to LCD + HD44780_SetUppNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E +// CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + + // Send lower nibble + // ---------------------------------- + // Set E +// SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // send data to LCD + HD44780_SetUppNibble(data << 4); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E +// CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send 8bits instruction in 8 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send8bitsIn8bitMode (unsigned short int data) +{ + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // send data to LCD + HD44780_SetUppNibble(data); + // send data to LCD + HD44780_SetLowNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send upper nibble + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SetUppNibble (unsigned short int data) +{ + +// LCD_DB4_PIN = 0; +// LCD_DB5_PIN = 0; +// LCD_DB6_PIN = 0; +// LCD_DB7_PIN = 0; + unsigned short test = data; + + if (data & 0x80) + { + LCD_DB7_PIN = 1; + } + else + { + LCD_DB7_PIN = 0; + } + if (data & 0x40) + { + LCD_DB6_PIN = 1; + } + else + { + LCD_DB6_PIN = 0; + } + if (data & 0x20) + { + LCD_DB5_PIN = 1; + } + else + { + LCD_DB5_PIN = 0; + } + if (data & 0x10) + { + LCD_DB4_PIN = 1; + } + else + { + LCD_DB4_PIN = 0; + } + + + // clear bits DB7-DB4 +// CLRBIT(HD44780_PORT_DATA, HD44780_DATA7); +// CLRBIT(HD44780_PORT_DATA, HD44780_DATA6); +// CLRBIT(HD44780_PORT_DATA, HD44780_DATA5); +// CLRBIT(HD44780_PORT_DATA, HD44780_DATA4); +// // set DB7-DB4 if corresponding bit is set +// if (data & 0x80) { SETBIT(HD44780_PORT_DATA, HD44780_DATA7); } +// if (data & 0x40) { SETBIT(HD44780_PORT_DATA, HD44780_DATA6); } +// if (data & 0x20) { SETBIT(HD44780_PORT_DATA, HD44780_DATA5); } +// if (data & 0x10) { SETBIT(HD44780_PORT_DATA, HD44780_DATA4); } +} + +/** + * @desc LCD send lower nibble + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SetLowNibble (unsigned short int data) +{ + // clear bits DB7-DB4 + CLRBIT(HD44780_PORT_DATA, HD44780_DATA3); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA2); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA1); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA0); + // set DB7-DB4 if corresponding bit is set + if (data & 0x08) { SETBIT(HD44780_PORT_DATA, HD44780_DATA3); } + if (data & 0x04) { SETBIT(HD44780_PORT_DATA, HD44780_DATA2); } + if (data & 0x02) { SETBIT(HD44780_PORT_DATA, HD44780_DATA1); } + if (data & 0x01) { SETBIT(HD44780_PORT_DATA, HD44780_DATA0); } +} + +/** + * @desc LCD pulse E + * + * @param void + * + * @return void + */ +void HD44780_PulseE (void) +{ + // Set E + // SETBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 1; + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + // CLRBIT(HD44780_PORT_E, HD44780_E); + LCD_E_PIN = 0; + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc Set PORT DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_SetPORT_DATA4to7 (void) +{ + // set DB4-DB7 + LCD_DB4_PIN = 1; + LCD_DB5_PIN = 1; + LCD_DB6_PIN = 1; + LCD_DB7_PIN = 1; + + // SETBIT(HD44780_PORT_DATA, HD44780_DATA4); + // SETBIT(HD44780_PORT_DATA, HD44780_DATA5); + // SETBIT(HD44780_PORT_DATA, HD44780_DATA6); + // SETBIT(HD44780_PORT_DATA, HD44780_DATA7); +} + +/** + * @desc Clear DDR DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_SetDDR_DATA4to7 (void) +{ + // set DB4-DB7 + LCD_DB4_PIN_DIR = PIN_OUTPUT; + LCD_DB5_PIN_DIR = PIN_OUTPUT; + LCD_DB6_PIN_DIR = PIN_OUTPUT; + LCD_DB7_PIN_DIR = PIN_OUTPUT; + // CLRBIT(HD44780_DDR_DATA, HD44780_DATA4); + // CLRBIT(HD44780_DDR_DATA, HD44780_DATA5); + // CLRBIT(HD44780_DDR_DATA, HD44780_DATA6); + // CLRBIT(HD44780_DDR_DATA, HD44780_DATA7); +} + +/** + * @desc Set DDR DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_ClearDDR_DATA4to7 (void) +{ + LCD_DB4_PIN_DIR = PIN_INPUT; + LCD_DB5_PIN_DIR = PIN_INPUT; + LCD_DB6_PIN_DIR = PIN_INPUT; + LCD_DB7_PIN_DIR = PIN_INPUT; + // SETBIT(HD44780_DDR_DATA, HD44780_DATA4); + // SETBIT(HD44780_DDR_DATA, HD44780_DATA5); + // SETBIT(HD44780_DDR_DATA, HD44780_DATA6); + // SETBIT(HD44780_DDR_DATA, HD44780_DATA7); +} diff --git a/AudioConsole.X/Source/hd44780.h b/AudioConsole.X/Source/hd44780.h new file mode 100644 index 0000000..3025258 --- /dev/null +++ b/AudioConsole.X/Source/hd44780.h @@ -0,0 +1,386 @@ +/** + * ---------------------------------------------------------------+ + * @desc HD44780 LCD Driver + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 18.11.2020 + * @file hd44780.c + * @tested AVR Atmega16a + * + * @depend + * ---------------------------------------------------------------+ + * @usage default set 16x2 LCD + * 4-bit with 3 control wires (RW, RS, E) + * + */ +#ifndef __HD44780_H__ +#define __HD44780_H__ + + // Success + #ifndef SUCCESS + #define SUCCESS 0 + #endif + + // Error + #ifndef ERROR + #define ERROR 1 + #endif + + // define clock + #if defined(__AVR_ATmega8__) + #define _FCPU 8000000 + #elif defined(__AVR_ATmega16__) + #define _FCPU 16000000 + #endif + + //#if defined(__AVR_ATmega16__) + + // E port + // -------------------------------------- + #ifndef HD44780_DDR_E + #define HD44780_DDR_E TRISB + #endif + #ifndef HD44780_PORT_E + #define HD44780_PORT_E PORTB + #endif + #ifndef HD44780_E + #define HD44780_E 12 + #endif + + // RW port + // -------------------------------------- + #ifndef HD44780_DDR_RW + #define HD44780_DDR_RW TRISB + #endif + #ifndef HD44780_PORT_RW + #define HD44780_PORT_RW PORTB + #endif + #ifndef HD44780_RW + #define HD44780_RW 13 + #endif + + // RS port + // -------------------------------------- + #ifndef HD44780_DDR_RS + #define HD44780_DDR_RS TRISD + #endif + #ifndef HD44780_PORT_RS + #define HD44780_PORT_RS PORTD + #endif + #ifndef HD44780_RS + #define HD44780_RS 5 + #endif + + // DATA port / pin + // -------------------------------------- + #ifndef HD44780_DDR_DATA + #define HD44780_DDR_DATA TRISB + #endif + #ifndef HD44780_PORT_DATA + #define HD44780_PORT_DATA PORTB + #endif + #ifndef HD44780_PIN_DATA + #define HD44780_PIN_DATA PORTB + #endif + // pins + #ifndef HD44780_DATA7 + #define HD44780_DATA7 PORTBbits.RB11 // LCD PORT DB7 + #endif + #ifndef HD44780_DATA6 + #define HD44780_DATA6 10 // LCD PORT DB6 + #endif + #ifndef HD44780_DATA5 + #define HD44780_DATA5 9 // LCD PORT DB5 + #endif + #ifndef HD44780_DATA4 + #define HD44780_DATA4 3 // LCD PORT DB4 + #endif + #ifndef HD44780_DATA3 + #define HD44780_DATA3 0 // LCD PORT DB3 + #endif + #ifndef HD44780_DATA2 + #define HD44780_DATA2 0 // LCD PORT DB2 + #endif + #ifndef HD44780_DATA1 + #define HD44780_DATA1 0 // LCD PORT DB1 + #endif + #ifndef HD44780_DATA0 + #define HD44780_DATA0 0 // LCD PORT DB0 + #endif + + // #endif + +#define _delay_ms(x) Sleep(x) +#define _delay_us(x) Sleep(1) + + #define BIT7 0x80 + #define BIT6 0x40 + #define BIT5 0x20 + #define BIT4 0x10 + #define BIT3 0x08 + #define BIT2 0x04 + #define BIT1 0x02 + #define BIT0 0x01 + + #define HD44780_BUSY_FLAG HD44780_DATA7 + #define HD44780_INIT_SEQ 0x30 + #define HD44780_DISP_CLEAR 0x01 + #define HD44780_DISP_OFF 0x08 + #define HD44780_DISP_ON 0x0C + #define HD44780_CURSOR_ON 0x0E + #define HD44780_CURSOR_OFF 0x0C + #define HD44780_CURSOR_BLINK 0x0F + #define HD44780_RETURN_HOME 0x02 + #define HD44780_ENTRY_MODE 0x06 + #define HD44780_4BIT_MODE 0x20 + #define HD44780_8BIT_MODE 0x30 + #define HD44780_2_ROWS 0x08 + #define HD44780_FONT_5x8 0x00 + #define HD44780_FONT_5x10 0x04 + #define HD44780_POSITION 0x80 + + #define HD44780_SHIFT 0x10 + #define HD44780_CURSOR 0x00 + #define HD44780_DISPLAY 0x08 + #define HD44780_LEFT 0x00 + #define HD44780_RIGHT 0x04 + + #define HD44780_ROWS 2 + #define HD44780_COLS 16 + + #define HD44780_ROW1_START 0x00 + #define HD44780_ROW1_END HD44780_COLS + #define HD44780_ROW2_START 0x40 + #define HD44780_ROW2_END HD44780_COLS + + // ********************************************** + // !!! + // MODE DEFINITION - CORRECTLY DEFINED + // + // ---------------------------------------------- + // + // HD44780_4BIT_MODE - 4 bit mode / 4 data wires + // HD44780_8BIT_MODE - 8 bit mode / 8 data wires + // + // ********************************************** + #define HD44780_MODE HD44780_4BIT_MODE + + // set bit + #define SETBIT(REG, BIT) { REG |= (1 << BIT); } + // clear bit + #define CLRBIT(REG, BIT) { REG &= ~(1 << BIT); } + // set port / pin if bit is set + #define SET_IF_BIT_IS_SET(REG, PORT, DATA, BIT) { if((DATA & BIT) > 0) { SETBIT(REG, PORT); } } + + /** + * @desc LCD init - initialisation routine + * + * @param void + * + * @return void + */ + void HD44780_Init (void); + + /** + * @desc LCD display clear + * + * @param void + * + * @return void + */ + void HD44780_DisplayClear (void); + + /** + * @desc LCD display on + * + * @param void + * + * @return void + */ + void HD44780_DisplayOn (void); + + /** + * @desc LCD cursor on, display on + * + * @param void + * + * @return void + */ + void HD44780_CursorOn (void); + + /** + * @desc LCD cursor off + * + * @param void + * + * @return void + */ + void HD44780_CursorOff (void); + + /** + * @desc LCD cursor blink, cursor on, display on + * + * @param void + * + * @return void + */ + void HD44780_CursorBlink (void); + + /** + * @desc LCD draw char + * + * @param char + * @return void + */ + void HD44780_DrawChar (char character); + + /** + * @desc LCD draw string + * + * @param char * + * + * @return void + */ + void HD44780_DrawString (char *str); + + /** + * @desc Got to position x,y + * + * @param char + * @param char + * + * @return char + */ + char HD44780_PositionXY (char x, char y); + + /** + * @desc Shift cursor / display to left / right + * + * @param char item {HD44780_CURSOR; HD44780_DISPLAY} + * @param char direction {HD44780_RIGHT; HD44780_LEFT} + * + * @return char + */ + char HD44780_Shift (char item, char direction); + + /** + * @desc Check Busy Flag (BF) in 8 bit mode + * + * @param void + * + * @return void + */ + void HD44780_CheckBFin8bitMode (void); + + /** + * @desc Check Busy Flag (BF) in 4 bit mode + * + * @param void + * + * @return void + */ + void HD44780_CheckBFin4bitMode (void); + + /** + * @desc LCD send instruction + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SendInstruction (unsigned short int); + + /** + * @desc LCD send data + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SendData (unsigned short int); + + /** + * @desc LCD send 4bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send4bitsIn4bitMode (unsigned short int); + + /** + * @desc LCD send 8bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send8bitsIn4bitMode (unsigned short int); + + /** + * @desc LCD send 8bits instruction in 8 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send8bitsIn8bitMode (unsigned short int); + + /** + * @desc LCD send upper nibble + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SetUppNibble (unsigned short int); + + /** + * @desc LCD send lower nibble + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SetLowNibble (unsigned short int); + + /** + * @desc LCD pulse E + * + * @param void + * + * @return void + */ + void HD44780_PulseE (void); + + /** + * @desc Set PORT DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_SetPORT_DATA4to7 (void); + + /** + * @desc Set DDR DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_SetDDR_DATA4to7 (void); + + /** + * @desc Clear DDR DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_ClearDDR_DATA4to7 (void); + +#endif diff --git a/AudioConsole.X/Source/ina219.c b/AudioConsole.X/Source/ina219.c new file mode 100644 index 0000000..fea36dc --- /dev/null +++ b/AudioConsole.X/Source/ina219.c @@ -0,0 +1,678 @@ +/**************************************************************************/ +/*! + @file ina219.c + @author K. Townsend (microBuilder.eu) + + @brief Driver for the TI INA219 current/power monitor + + @section DESCRIPTION + + The INA219 is an I2C-based current/power monitor that monitors the + voltage drop across a shunt resistor, as well as the supply voltage. + + @section EXAMPLE + @code + ina219Init(); + + int16_t current = 0; + int16_t power = 0; + int16_t current_mA = 0; + int16_t power_mW = 0; + int16_t busvoltage = 0; + int16_t shuntvoltage = 0; + int16_t loadVoltage = 0; + + while(1) + { + shuntvoltage = ina219GetShuntVoltage(); + busvoltage = ina219GetBusVoltage(); + power = ina219GetPower(); + current = ina219GetCurrent(); + power_mW = ina219GetPower_mW(); + current_mA = ina219GetCurrent_mA(); + loadVoltage = busvoltage + (shuntvoltage / 100); + printf("%-15s %6d = %d.%dmV (%duV) \r\n", "Shunt Voltage:", shuntvoltage, shuntvoltage / 100, shuntvoltage % 100, shuntvoltage * 10); + printf("%-15s %6d = %d.%dV \r\n", "Bus Voltage:", busvoltage, busvoltage / 1000, busvoltage % 1000); + printf("%-15s %6d = %d.%dV \r\n", "Load Voltage:", loadVoltage, loadVoltage / 1000, loadVoltage % 1000); + printf("%-15s %6d = %dmW \r\n", "Power:", power, power_mW); + printf("%-15s %6d = %dmA \r\n", "Current:", current, current_mA); + printf("\r\n"); + systickDelay(5000); + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2012 Kevin Townsend + 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 copyright holders 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 ''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 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 "ina219.h" +#include "I2C.h" +#include + +unsigned char I2CMasterBuffer[I2C_BUFSIZE]; +unsigned char I2CSlaveBuffer[I2C_BUFSIZE]; + +// The following multipliers are used to convert raw current and power +// values to mA and mW, taking into account the current config settings +uint32_t ina219_currentDivider_mA = 0; +uint32_t ina219_powerDivider_mW = 0; + +/**************************************************************************/ +/*! + @brief Sends a single command byte over I2C + */ +/**************************************************************************/ +static int ina219WriteRegister (uint8_t reg, uint16_t value) +{ + // Clear write buffers + uint32_t i; + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + //I2CWriteLength = 4; + // I2CReadLength = 0; + I2CMasterBuffer[0] = INA219_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Register + I2CMasterBuffer[2] = value >> 8; // Upper 8-bits + I2CMasterBuffer[3] = value & 0xFF; // Lower 8-bits + + return I2CWrite(I2CMasterBuffer,4); + + + + //i2cEngine(); +} + +/**************************************************************************/ +/*! + @brief Reads a 16 bit values over I2C + */ +/**************************************************************************/ +static void ina219Read16(uint8_t reg, uint16_t *value) +{ + // Clear write buffers + int RET = RET_OK; + uint32_t i; + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + // I2CWriteLength = 2; + //I2CReadLength = 2; + I2CMasterBuffer[0] = INA219_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Command register + // Append address w/read bit + I2CMasterBuffer[2] = INA219_ADDRESS | INA219_READ; + // i2cEngine(); + + I2CWrite(I2CMasterBuffer,2); //write pointer to the good register + RET = I2CRead(I2CMasterBuffer[2],&I2CSlaveBuffer[0],2); //read the data + + if(RET != RET_OK) + { + * value = 0; + return; + } + // Shift values to create properly formed integer + *value = ((I2CSlaveBuffer[0] << 8) | I2CSlaveBuffer[1]); +} + +void ina219SetCalibration_13V_10A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 13V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 3.2A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.00009765 (98µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000488 (488µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0001 (100µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 4096 (0x1000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.002 (2mW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 3.2767A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.32V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 3.2 * 32V + // MaximumPower = 102.4W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10) + ina219_powerDivider_mW = 2; // Power LSB = 1mW per bit (2/1) + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x1000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + // INA219_CONFIG_MODE_SVOLT_CONTINUOUS; + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 32V and 2A + of current. Each unit of current corresponds to 100uA, and + each unit of power corresponds to 2mW. Counter overflow + occurs at 3.2A. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_32V_2A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 32V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 2.0A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.000061 (61µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000488 (488µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0001 (100µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 4096 (0x1000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.002 (2mW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 3.2767A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.32V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 3.2 * 32V + // MaximumPower = 102.4W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10) + ina219_powerDivider_mW = 2; // Power LSB = 1mW per bit (2/1) + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x1000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 32V and 1A + of current. Each unit of current corresponds to 40uA, and each + unit of power corresponds to 800µW. Counter overflow occurs at + 1.3A. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_32V_1A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 32V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 1.0A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.0000305 (30.5µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0.000244 (244µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0000400 (40µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 10240 (0x2800) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0008 (800µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 1.31068A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // ... In this case, we're good though since Max_Current is less than MaxPossible_I + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.131068V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 1.31068 * 32V + // MaximumPower = 41.94176W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 25; // Current LSB = 40uA per bit (1000/40 = 25) + ina219_powerDivider_mW = 1; // Power LSB = 800µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x2800); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 16V and 500mA + of current. Each unit of current corresponds to 25uA, and each + unit of power corresponds to 500µW. Counter overflow occurs at + 800mA. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_16V_500mA(void) +{ + // VBUS_MAX = 16V + // VSHUNT_MAX = 0.08 (Assumes Gain 2, 80mV, can also be 0.32, 0.16, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 0.8A + + // 2. Determine max expected current + // MaxExpected_I = 0.5A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.0000153 (15.3µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0.0001221 (122µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0000250 (25µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 16384 (0x4000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0005 (500µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 0.819175 (819 mA before overflow) + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_Current_Before_Overflow = 0.8A + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.8 * 0.1 + // Max_ShuntVoltage = 0.08V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 0.8 * 16V + // MaximumPower = 12.8W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 40; // Current LSB = 25uA per bit (1000/25 = 40) + ina219_powerDivider_mW = 1; // Power LSB = 500µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x4000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V | + INA219_CONFIG_GAIN_2_80MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 16V and 200mA + of current. Each unit of current corresponds to 10uA, and each + unit of power corresponds to 200µW. Counter overflow occurs at + 327mA. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_16V_200mA(void) +{ + // VBUS_MAX = 16V + // VSHUNT_MAX = 0.04 (Assumes Gain 1, 40mV, can also be 0.32, 0.16, 0.08) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 0.4A + + // 2. Determine max expected current + // MaxExpected_I = 0.2A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.000006104 (6.104µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000048828 (48.82µA per bit) + + // 4. Choose an LSB between the min and max values + // CurrentLSB = 0.000010 (10µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 40960 (0xA000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0002 (200µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 0.32767 (328 mA before overflow) + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.032767V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 0.32767 * 16V + // MaximumPower = 5.24W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 100; // Current LSB = 10uA per bit (1000/10 = 100) + ina219_powerDivider_mW = 1; // Power LSB = 200µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0xA000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V | + INA219_CONFIG_GAIN_1_40MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Initialises the I2C block + */ +/**************************************************************************/ +int ina219Init(void) +{ + int RET = RET_OK; + uint16_t ReadBack; + // Reset INA219 (set to default values) + RET = ina219WriteRegister(INA219_REG_CONFIG, INA219_CONFIG_RESET); + ina219Read16(INA219_REG_CONFIG,&ReadBack); + + if(ReadBack != INA219_CONFIG_RESET_READBACK) + { + return RET_ERROR; + } + + + + // Setup chip for 32V and 2A by default + // ina219SetCalibration_32V_2A(); + ina219SetCalibration_13V_10A(); + + return RET; +} + +/**************************************************************************/ +/*! + @brief Gets the shunt voltage (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetShuntVoltage(void) +{ + uint16_t value; + ina219Read16(INA219_REG_SHUNTVOLTAGE, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the shunt voltage (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetBusVoltage(void) +{ + uint16_t value; + ina219Read16(INA219_REG_BUSVOLTAGE, &value); + // Shift to the right 3 to drop CNVR and OVF and then multiply by LSB + return (value >> 3) * 4; +} + +/**************************************************************************/ +/*! + @brief Gets the raw power value (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetPower(void) +{ + uint16_t value; + ina219Read16(INA219_REG_POWER, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the power value in mW, taking into account the config + settings and power LSB + */ +/**************************************************************************/ +int16_t ina219GetPower_mW(void) +{ + uint16_t value; + ina219Read16(INA219_REG_POWER, &value); + return value / ina219_powerDivider_mW; +} + +/**************************************************************************/ +/*! + @brief Gets the raw current value (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetCurrent(void) +{ + uint16_t value; + ina219Read16(INA219_REG_CURRENT, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the current value in mA, taking into account the + config settings and current LSB + */ +/**************************************************************************/ +int16_t ina219GetCurrent_mA(void) +{ + uint16_t value; + ina219Read16(INA219_REG_CURRENT, &value); + return value / ina219_currentDivider_mA; +} + + diff --git a/AudioConsole.X/Source/ina219.h b/AudioConsole.X/Source/ina219.h new file mode 100644 index 0000000..65eb4fc --- /dev/null +++ b/AudioConsole.X/Source/ina219.h @@ -0,0 +1,141 @@ +/**************************************************************************/ +/*! + @file ina219.h + @author K. Townsend (microBuilder.eu) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2012 Kevin Townsend + 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 copyright holders 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 ''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 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. +*/ +/**************************************************************************/ + +#ifndef _INA219_H_ +#define _INS219_H_ + +#include "define.h" +//#include "projectconfig.h" +//#include "core/i2c/i2c.h" + + + +/*========================================================================= + I2C ADDRESS/BITS + -----------------------------------------------------------------------*/ + #define INA219_ADDRESS (0x80) // 1000000x (A0+A1=GND) + #define INA219_READ (0x01) +/*=========================================================================*/ + +/*========================================================================= + CONFIG REGISTER (R/W) + -----------------------------------------------------------------------*/ + #define INA219_REG_CONFIG (0x00) + /*---------------------------------------------------------------------*/ + #define INA219_CONFIG_RESET (0x8000) // Reset Bit + #define INA219_CONFIG_RESET_READBACK 0x39FF + + #define INA219_CONFIG_BVOLTAGERANGE_MASK (0x4000) // Bus Voltage Range Mask + #define INA219_CONFIG_BVOLTAGERANGE_16V (0x0000) // 0-16V Range + #define INA219_CONFIG_BVOLTAGERANGE_32V (0x4000) // 0-32V Range + + #define INA219_CONFIG_GAIN_MASK (0x1800) // Gain Mask + #define INA219_CONFIG_GAIN_1_40MV (0x0000) // Gain 1, 40mV Range + #define INA219_CONFIG_GAIN_2_80MV (0x0800) // Gain 2, 80mV Range + #define INA219_CONFIG_GAIN_4_160MV (0x1000) // Gain 4, 160mV Range + #define INA219_CONFIG_GAIN_8_320MV (0x1800) // Gain 8, 320mV Range + + #define INA219_CONFIG_BADCRES_MASK (0x0780) // Bus ADC Resolution Mask + #define INA219_CONFIG_BADCRES_9BIT (0x0080) // 9-bit bus res = 0..511 + #define INA219_CONFIG_BADCRES_10BIT (0x0100) // 10-bit bus res = 0..1023 + #define INA219_CONFIG_BADCRES_11BIT (0x0200) // 11-bit bus res = 0..2047 + #define INA219_CONFIG_BADCRES_12BIT (0x0400) // 12-bit bus res = 0..4097 + + #define INA219_CONFIG_SADCRES_MASK (0x0078) // Shunt ADC Resolution and Averaging Mask + #define INA219_CONFIG_SADCRES_9BIT_1S_84US (0x0000) // 1 x 9-bit shunt sample + #define INA219_CONFIG_SADCRES_10BIT_1S_148US (0x0008) // 1 x 10-bit shunt sample + #define INA219_CONFIG_SADCRES_11BIT_1S_276US (0x0010) // 1 x 11-bit shunt sample + #define INA219_CONFIG_SADCRES_12BIT_1S_532US (0x0018) // 1 x 12-bit shunt sample + #define INA219_CONFIG_SADCRES_12BIT_2S_1060US (0x0048) // 2 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_4S_2130US (0x0050) // 4 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_8S_4260US (0x0058) // 8 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060) // 16 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_32S_17MS (0x0068) // 32 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_64S_34MS (0x0070) // 64 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_128S_69MS (0x0078) // 128 x 12-bit shunt samples averaged together + + #define INA219_CONFIG_MODE_MASK (0x0007) // Operating Mode Mask + #define INA219_CONFIG_MODE_POWERDOWN (0x0000) + #define INA219_CONFIG_MODE_SVOLT_TRIGGERED (0x0001) + #define INA219_CONFIG_MODE_BVOLT_TRIGGERED (0x0002) + #define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003) + #define INA219_CONFIG_MODE_ADCOFF (0x0004) + #define INA219_CONFIG_MODE_SVOLT_CONTINUOUS (0x0005) + #define INA219_CONFIG_MODE_BVOLT_CONTINUOUS (0x0006) + #define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007) +/*=========================================================================*/ + +/*========================================================================= + SHUNT VOLTAGE REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_SHUNTVOLTAGE (0x01) +/*=========================================================================*/ + +/*========================================================================= + BUS VOLTAGE REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_BUSVOLTAGE (0x02) +/*=========================================================================*/ + +/*========================================================================= + POWER REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_POWER (0x03) +/*=========================================================================*/ + +/*========================================================================= + CURRENT REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_CURRENT (0x04) +/*=========================================================================*/ + +/*========================================================================= + CALIBRATION REGISTER (R/W) + -----------------------------------------------------------------------*/ + #define INA219_REG_CALIBRATION (0x05) +/*=========================================================================*/ + +int ina219Init(void); +int16_t ina219GetShuntVoltage(void); +int16_t ina219GetBusVoltage(void); +int16_t ina219GetPower(void); +int16_t ina219GetPower_mW(void); +int16_t ina219GetCurrent(void); +int16_t ina219GetCurrent_mA(void); + +#endif + + diff --git a/AudioConsole.X/Source/interrupts.c b/AudioConsole.X/Source/interrupts.c new file mode 100644 index 0000000..e26f215 --- /dev/null +++ b/AudioConsole.X/Source/interrupts.c @@ -0,0 +1,75 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For __ISR definition */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ + +/******************************************************************************/ +/* Interrupt Vector Options */ +/******************************************************************************/ +/* */ +/* VECTOR NAMES: */ +/* */ +/* _CORE_TIMER_VECTOR _COMPARATOR_2_VECTOR */ +/* _CORE_SOFTWARE_0_VECTOR _UART_2A_VECTOR */ +/* _CORE_SOFTWARE_1_VECTOR _I2C_2A_VECTOR */ +/* _EXTERNAL_0_VECTOR _SPI_2_VECTOR */ +/* _TIMER_1_VECTOR _SPI_2A_VECTOR */ +/* _INPUT_CAPTURE_1_VECTOR _I2C_4_VECTOR */ +/* _OUTPUT_COMPARE_1_VECTOR _UART_3_VECTOR */ +/* _EXTERNAL_1_VECTOR _UART_2_VECTOR */ +/* _TIMER_2_VECTOR _SPI_3A_VECTOR */ +/* _INPUT_CAPTURE_2_VECTOR _I2C_3A_VECTOR */ +/* _OUTPUT_COMPARE_2_VECTOR _UART_3A_VECTOR */ +/* _EXTERNAL_2_VECTOR _SPI_4_VECTOR */ +/* _TIMER_3_VECTOR _I2C_5_VECTOR */ +/* _INPUT_CAPTURE_3_VECTOR _I2C_2_VECTOR */ +/* _OUTPUT_COMPARE_3_VECTOR _FAIL_SAFE_MONITOR_VECTOR */ +/* _EXTERNAL_3_VECTOR _RTCC_VECTOR */ +/* _TIMER_4_VECTOR _DMA_0_VECTOR */ +/* _INPUT_CAPTURE_4_VECTOR _DMA_1_VECTOR */ +/* _OUTPUT_COMPARE_4_VECTOR _DMA_2_VECTOR */ +/* _EXTERNAL_4_VECTOR _DMA_3_VECTOR */ +/* _TIMER_5_VECTOR _DMA_4_VECTOR */ +/* _INPUT_CAPTURE_5_VECTOR _DMA_5_VECTOR */ +/* _OUTPUT_COMPARE_5_VECTOR _DMA_6_VECTOR */ +/* _SPI_1_VECTOR _DMA_7_VECTOR */ +/* _I2C_3_VECTOR _FCE_VECTOR */ +/* _UART_1A_VECTOR _USB_1_VECTOR */ +/* _UART_1_VECTOR _CAN_1_VECTOR */ +/* _SPI_1A_VECTOR _CAN_2_VECTOR */ +/* _I2C_1A_VECTOR _ETH_VECTOR */ +/* _SPI_3_VECTOR _UART_4_VECTOR */ +/* _I2C_1_VECTOR _UART_1B_VECTOR */ +/* _CHANGE_NOTICE_VECTOR _UART_6_VECTOR */ +/* _ADC_VECTOR _UART_2B_VECTOR */ +/* _PMP_VECTOR _UART_5_VECTOR */ +/* _COMPARATOR_1_VECTOR _UART_3B_VECTOR */ +/* */ +/* Refer to the device specific .h file in the C32 Compiler */ +/* pic32mx\include\proc directory for a complete Vector and IRQ mnemonic */ +/* listings for the PIC32 device. */ +/* */ +/* PRIORITY OPTIONS: */ +/* */ +/* (default) IPL0AUTO, IPL1, IPL2, ... IPL7 (highest) */ +/* */ +/* Example Shorthand Syntax */ +/* */ +/* void __ISR(,) user_interrupt_routine_name(void) */ +/* { */ +/* */ +/* } */ +/* */ +/* For more interrupt macro examples refer to the C compiler User Guide in */ +/* the C compiler /doc directory. */ +/* */ +/******************************************************************************/ +/* Interrupt Routines */ +/******************************************************************************/ + +/* TODO Add interrupt routine code here. */ + diff --git a/AudioConsole.X/Source/main.c b/AudioConsole.X/Source/main.c new file mode 100644 index 0000000..52543fe --- /dev/null +++ b/AudioConsole.X/Source/main.c @@ -0,0 +1,278 @@ + +/* + Description: + This is a template file for standard C header file. + + */ + +/* ************************************************************************** */ +/* Revision: + ### 20120515 JFM + Original version. + + ### YYYYMMDD Initial, Bug Identification + Change description. + */ + +//JFM WINC TODO + + +#include "define.h" + + +#include "Uart.h" +#include "BoardCfg.h" +#include "timer.h" +#include "Watchdog.h" +//#include "PWMCtrl.h" +//#include "KnobEncoderCtrl.h" +//#include "LedLightCtrl.h" +//#include "PrintfServer.h" + +//#include "MasterCtrlInterface.h" +//#include "SDCardMgr.h" +//#include "FatFS/ff.h" +#include "main.h" +#include "NetworkProtocol.h" +#include "ChaletPowerRelay.h" +#include "BatteryMonitor.h" +#include "CurrentSensor.h" +#include "I2C.h" +#include "SPI_Flash.h" +#include "TemperatureSensor.h" +#include "LoraWatchdog.h" +#include "LCDCtrl.h" +#include "SIM7080GInterface.h" +#include "LTENetworkInterface.h" +#include "BootloaderInterface.h" + +#include "VolumeTransducer.h" + +#include "hd44780.h" + + +//#define NO_WIFI +#ifndef NO_WIFI +#include "Terminal.h" +#include "WiFiCtrl.h" +#include "InternalUart.h" +#endif + +#ifdef USE_PRINTF +void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +#elif defined USE_SYSLOG +#include "Syslog.h" +#include "LoraNetworkInterface.h" +void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +#endif + +#define HEARTBEAT_LED_TIMEOUT 400 +#define VOLTS_PER_BITS (float)3.3/1023 + +static void InitializeBoard(void); + +#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF, WDTPS = PS4096 //Watchdog timeout = 4,096s +#pragma config POSCMOD = EC, FNOSC = PRIPLL, FPBDIV = DIV_1 +//#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1 +#pragma config ICESEL = ICS_PGx2, BWP = OFF +#pragma config FSOSCEN = OFF + +int main(void) +{ + int mRetCode = 1; + + + + + SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); //Use peripheral library to optimize configuration + INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);// configure for multi-vectored mode interrupts + OSCCONbits.SOSCEN = 0; + +#ifndef __32MX330F064H__ + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O +#endif + + InitBoard(); + INTEnableInterrupts(); + + TimerInit(); + InitWatchdog(); + // I2CInit(); +// InitChaletPowerRelay(); + // InitBatteryMonitor(); + // InitHarakiriRelay(); +// InitTempSensor(); + + + // InitUart(); +// LoraNetworkInterfaceInit(); +//// InitLoraWatchdog(); + + + + InitSPIFlash(); +// InitLCDCtrl(); + +// InitLTEModule(); +// LTENetworkInterfaceInit(); + + VolumeTransducerInit(); + +#ifdef USE_SYSLOG + InitSyslog(); +#endif + + + printf("ChaletDuino V2 Initialized\n"); + + SPIFlashCheckAndConfigure(); +// TempSensorCheckAndConfigure(); + + BootloaderInterfaceInit(); + + +// SPIFlashErase64KSector(0x180000,1); +// +// unsigned char test[100]; +// int i = 0; +// +// for(i = 0; i < 100; i++) +// { +// test[i] = i; +// } +// +// +// SPIFlashWriteBuffer(test,100,0x180000); +// +// for(i = 0; i < 100; i++) +// { +// test[i] = 0; +// } +// +// SPIFlashReadBuffer(test,100,0x180000); +// + + +#ifndef NO_WIFI + InitTerminal(); + + InitWiFi(); + + +#endif + + // unsigned int bw; + + // FRESULT res; + // res = f_mount(&FatFs, "", 0); /* Give a work area to the default drive */ + // if(!res) + // { + // printf("Could not mount SD card\n"); + // } + // else + // { + // printf("SD Card mounted successfuly"); + // } + // + // if (f_open(&File[0], "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) /* Create a file */ + //// { + // + // res = f_write(&File[0], "It works!\r\n", 11, &bw); /* Write data to the file */ + // + // res = f_close(&File[0]); /* Close the file */ + // + // } + + // int res = OpenPrintfServer(); + + TimerStart(HEARTBEAT_LED_TMR,HEARTBEAT_LED_TIMEOUT); + + + + + // printf("Lora Monitor Started\n"); + printf("test %d\n", 1); + + EnableWatchdog(); + KickWatchdog(); + mRetCode = 1; + + + + while(mRetCode == 1) + { + + KickWatchdog(); + +#ifndef NO_WIFI + TickWiFi(); +#endif + TickTerminal(); + // UartTick(); +// ChaletPowerRelayTick(); +// BatteryMonitorTick(); + SyslogTick(); +// TickTempSensor(); + BootloaderInterfaceTick(); + + VolumeTransducerTick(); +// TickLoraWatchdog(); +// TickLCDCtrl(); +// TickLTEModule(); +// TickLTENetworkInterface(); + + if(IsTimerExpired(HEARTBEAT_LED_TMR)) + { + HEARTBEAT_LED_2_PIN = ~HEARTBEAT_LED_2_PIN; + ONBOARD_LED1_PIN = ~HEARTBEAT_LED_2_PIN; + ONBOARD_LED2_PIN = ~HEARTBEAT_LED_2_PIN; + ONBOARD_LED3_PIN = ~HEARTBEAT_LED_2_PIN; + ONBOARD_LED7_PIN = ~HEARTBEAT_LED_2_PIN; + PUSH_BUTTON_LED1_PIN = !PUSH_BUTTON_INPUT1_PIN; + PUSH_BUTTON_LED2_PIN = !PUSH_BUTTON_INPUT2_PIN; + PUSH_BUTTON_LED3_PIN = !PUSH_BUTTON_INPUT3_PIN; + PUSH_BUTTON_LED4_PIN = !PUSH_BUTTON_INPUT4_PIN; + PUSH_BUTTON_LED5_PIN = !PUSH_BUTTON_INPUT5_PIN; + PUSH_BUTTON_LED6_PIN = !PUSH_BUTTON_INPUT6_PIN; + PUSH_BUTTON_LED7_PIN = !PUSH_BUTTON_INPUT7_PIN; + + VU1_BACKLIGHT_PIN = LED_ON; + VU1_BACKLIGHT_PIN = LED_OFF; + TimerStart(HEARTBEAT_LED_TMR,HEARTBEAT_LED_TIMEOUT); + +// HD44780_DisplayClear(); +// HD44780_PositionXY(0, 0); +// // send char +// HD44780_DrawString("DISPLAY ON"); +// // display clear +// HD44780_DisplayOn(); + + } + } + + return mRetCode; +} + + +void InitializeBoard() +{ + InitBoard(); + +} + +#ifdef USE_PRINTF +void _mon_putc(char c) +{ + U2TXREG = c; + while (U2STAbits.TRMT==0); +} +#elif defined USE_SYSLOG +void _mon_putc(char c) +{ + SyslogNewByte(c); +} + +#endif + +//EOF + diff --git a/AudioConsole.X/Source/main.h b/AudioConsole.X/Source/main.h new file mode 100644 index 0000000..fad916a --- /dev/null +++ b/AudioConsole.X/Source/main.h @@ -0,0 +1,165 @@ +/** + * \file + * + * \brief MAIN configuration. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef MAIN_H_INCLUDED +#define MAIN_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +//#include "driver/include/m2m_wifi.h" +// +//// <<< Use Configuration Wizard in Context Menu >>> +//// General network settings in AP (access point) mode +//// Network SSID +//// app_main_m2m_device_name +//#ifndef MAIN_M2M_SSID +//#define MAIN_M2M_SSID "WINC1500_00:00" +//#endif +// +//// Security type +//// <1=> Wi-Fi network is not secured +//// <2=> WPA/WPA2 personal(PSK) +//// <3=> WEP (40 or 104) OPEN OR SHARED +//// <4=> WPA/WPA2 Enterprise.IEEE802.1x +//// app_main_m2m_ap_sec +//#ifndef MAIN_M2M_AP_SEC +//#define MAIN_M2M_AP_SEC 1 +//#endif +// +//// Security key +//// app_main_m2m_ap_key +//#ifndef MAIN_M2M_AP_KEY +//#define MAIN_M2M_AP_KEY "12345FFFFF" +//#endif +// +//// SSID mode +//// <0=>SSID is visible to others +//// <1=>SSID is hidden +//// app_main_m2m_ap_ssid_mode +//#ifndef MAIN_M2M_AP_SSID_MODE +//#define MAIN_M2M_AP_SSID_MODE 0 +//#endif +//// +//// DHCP server IP address in AP (access point) mode +//// DHCP server IP address 1 <0-255> +//// app_ip_address_1 +//#ifndef DHCP_IP_ADDRESS_1 +//#define DHCP_IP_ADDRESS_1 192 +//#endif +// +//// DHCP server IP address 2 <0-255> +//// app_ip_address_2 +//#ifndef DHCP_IP_ADDRESS_2 +//#define DHCP_IP_ADDRESS_2 168 +//#endif +// +//// DHCP server IP address 3 <0-255> +//// app_ip_address_3 +//#ifndef DHCP_IP_ADDRESS_3 +//#define DHCP_IP_ADDRESS_3 1 +//#endif +// +//// DHCP server IP address 4 <0-255> +//// app_ip_address_4 +//#ifndef DHCP_IP_ADDRESS_4 +//#define DHCP_IP_ADDRESS_4 1 +//#endif +//// +//// <<< end of configuration section >>> +// +///** Using broadcast address for simplicity. */ +//#define MAIN_SERVER_PORT (80) +// +///** Using IP address. */ +//#define IPV4_BYTE(val, index) ((val >> (index * 8)) & 0xFF) +// +///** Send buffer of TCP socket. */ +//#define MAIN_PREFIX_BUFFER "GET /data/2.5/weather?q=" +//#define MAIN_POST_BUFFER \ +// "&mode=xml&units=metric&appid=c592e14137c3471fa9627b44f6649db4 HTTP/1.1\r\nHost: " \ +// "api.openweathermap.org\r\nAccept: */*\r\n\r\n" +///** Weather information provider server. */ +//#define MAIN_WEATHER_SERVER_NAME "openweathermap.org" +// +///** Input City Name. */ +//#define MAIN_CITY_NAME "london" +// +///** Receive buffer size. */ +//#define MAIN_WIFI_M2M_BUFFER_SIZE 1024 +// +//#define MAIN_M2M_DHCP_SERVER_IP \ +// { \ +// DHCP_IP_ADDRESS_1, DHCP_IP_ADDRESS_2, DHCP_IP_ADDRESS_3, DHCP_IP_ADDRESS_4 \ +// } +//#define MAIN_HTTP_PROV_SERVER_DOMAIN_NAME "atmel.com" +// +//#define MAIN_MAC_ADDRESS \ +// { \ +// 0xf8, 0xf0, 0x05, 0x45, 0xD4, 0x84 \ +// } +// +//#define MAIN_HEX2ASCII(x) (((x) >= 10) ? (((x)-10) + 'A') : ((x) + '0')) +// +//#define TEMPERATURE_ABS(a) (((a) > 0) ? (a) : -(a)) +// +//static tstrM2MAPConfig gstrM2MAPConfig = {MAIN_M2M_SSID, +// 1, +// 0, +// sizeof(MAIN_M2M_AP_KEY) - 1, +// MAIN_M2M_AP_KEY, +// MAIN_M2M_AP_SEC, +// MAIN_M2M_AP_SSID_MODE, +// MAIN_M2M_DHCP_SERVER_IP}; +// +//static CONST char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; +// +//static uint8 gau8MacAddr[] = MAIN_MAC_ADDRESS; +//static sint8 gacDeviceName[] = MAIN_M2M_SSID; +// +//#define MAIN_WAITING_TIME 3000 +//#define MAIN_RETRY_COUNT 10 + +#ifdef __cplusplus +} +#endif + +#endif /* MAIN_H_INCLUDED */ diff --git a/AudioConsole.X/Source/system.c b/AudioConsole.X/Source/system.c new file mode 100644 index 0000000..5dca97c --- /dev/null +++ b/AudioConsole.X/Source/system.c @@ -0,0 +1,20 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ +#include "system.h" /* variables/params used by system.c */ + +/******************************************************************************/ +/* System Level Functions */ +/* */ +/* Custom oscillator configuration funtions, reset source evaluation */ +/* functions, and other non-peripheral microcontroller initialization */ +/* functions get placed in system.c */ +/* */ +/******************************************************************************/ + +/* */ + diff --git a/AudioConsole.X/Source/system.h b/AudioConsole.X/Source/system.h new file mode 100644 index 0000000..f1f513b --- /dev/null +++ b/AudioConsole.X/Source/system.h @@ -0,0 +1,19 @@ +/******************************************************************************/ +/* System Level #define Macros */ +/******************************************************************************/ + +/* TODO Define system operating frequency */ + +/* Microcontroller MIPs (FCY) */ +#define SYS_FREQ 80000000L +#define FCY SYS_FREQ + +/******************************************************************************/ +/* System Function Prototypes */ +/******************************************************************************/ + +/* Custom oscillator configuration funtions, reset source evaluation +functions, and other non-peripheral microcontroller initialization functions +go here. */ + + diff --git a/AudioConsole.X/Source/template.c b/AudioConsole.X/Source/template.c new file mode 100644 index 0000000..97c3ffe --- /dev/null +++ b/AudioConsole.X/Source/template.c @@ -0,0 +1,38 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" + +/* Global variables */ + +/* Implementation */ + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +//EOF + diff --git a/AudioConsole.X/Source/template.h b/AudioConsole.X/Source/template.h new file mode 100644 index 0000000..31f9d80 --- /dev/null +++ b/AudioConsole.X/Source/template.h @@ -0,0 +1,47 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef TEMPLATE_H +#define TEMPLATE_H + +/* ************************************************************************** */ +/* Includes */ + + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ + + +/* ************************************************************************** */ +/* Prototypes */ + + +#endif +//EOF + diff --git a/AudioConsole.X/Source/timer.c b/AudioConsole.X/Source/timer.c new file mode 100644 index 0000000..97729b3 --- /dev/null +++ b/AudioConsole.X/Source/timer.c @@ -0,0 +1,300 @@ +/******************************************************************************* + * * + * Copyright 2010 Rheinmetall Canada Inc. * + * * + * No part of this document may be reproduced, stored in * + * a retrieval system, or transmitted, in any form or by any means, * + * electronic, mechanical, photocopying, recording, or otherwise, * + * without the prior written permission of Rheinmetall Canada Inc. * + * * + *******************************************************************************/ + +#include "timer.h" +#include "define.h" +#include +//#include +//#include "./FatFS/diskio.h" + +//unsigned int MillisecCounter[TIMER_MAX_ID]; +//unsigned int SecondCounter; +//int CalcPeriod; +stTimer astTimer[TIMER_MAX_ID]; + +//------------------------------------------------------- +void TimerInit(void) +{ +#ifdef GP_TIMER_USE_TIMER_1 + + T1CON = 0; + + T1CONbits.TCKPS = 0b01; //1:8 prescaler + TMR1 = 0; + PR1 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms + + IPC1bits.T1IP = 2; //timer interrupt priority = 2; + IPC1bits.T1IS = 3; //timer interrupt sub-priority = 2; + IFS0bits.T1IF = 0; + IEC0bits.T1IE = 1; //start timer + + T1CONbits.ON = 1; + +#endif +#ifdef GP_TIMER_USE_TIMER_2 + T2CON = 0; + + T2CONbits.TCKPS = 0b011; //1:8 prescaler + TMR2 = 0; + PR2 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms + + IPC2bits.T2IP = 2; //timer interrupt priority = 2; + IPC2bits.T2IS = 3; //timer interrupt sub-priority = 2; + IFS0bits.T2IF = 0; + IEC0bits.T2IE = 1; //start timer + + T2CONbits.ON = 1; +#endif + + memset(&astTimer[0], 0, sizeof(astTimer)); +} + +//------------------------------------------------------- +/*unsigned int GetActualTimerMilliSec(void) + { + return MillisecCounter; + }*/ + +//------------------------------------------------------- +/*unsigned int GetActualTimerSec(void) + { + return SecondCounter; + }*/ + + +//------------------------------------------------------- +int IsMilliSecTimerExpired(eTimerID p_eTimerID) +{ + int CalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + CalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + //if(CalcPeriod > 0 && CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + if(CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(CalcPeriod < 0) + { + if((1000 + CalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + + return 0; +} + +//------------------------------------------------------- +int IsSecTimerExpired(eTimerID p_eTimerID) +{ + int iCalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart; + //if(iCalcPeriod > 0 && iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiSecondCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiSecondCounter = 0; + return 1; + } + } + } + + return 0; +} + +//------------------------------------------------------- +int IsTimerExpired(eTimerID p_eTimerID) +{ + int iCalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + /*if (IsSecTimerExpired(p_eTimerID) && IsMilliSecTimerExpired(p_eTimerID)) + return 1;*/ + + iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart; + + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + else if(iCalcPeriod < 0) + { + if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + } + } + + return 0; +} + +//------------------------------------------------------- +void TimerStart(eTimerID p_eTimerID, unsigned int p_uiPeriod) +{ + (astTimer+p_eTimerID)->bRunning = true; + if (p_uiPeriod >= 1000) + { + (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod / 1000; + (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod % 1000; + } + else + { + (astTimer+p_eTimerID)->uiPeriodSecond = 0; + (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod; + } + TimerReset(p_eTimerID); +} +void TimerStartSeconds(eTimerID p_eTimerID, unsigned int p_uiPeriod) +{ + (astTimer+p_eTimerID)->bRunning = true; + (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod; + (astTimer+p_eTimerID)->uiPeriodMillisec = 0; + TimerReset(p_eTimerID); +} +//------------------------------------------------------- +void TimerReset(eTimerID p_eTimerID) +{ + (astTimer+p_eTimerID)->uiStart = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + (astTimer+p_eTimerID)->uiSecondCounter = 0; +} + +//------------------------------------------------------- +bool IsTimerRunning(eTimerID p_eTimerID) +{ + return (astTimer+p_eTimerID)->bRunning; +} + + +//------------------------------------------------------- +void TimerStop(eTimerID p_eTimerID) +{ + (astTimer+p_eTimerID)->bRunning = false; +} + +//------------------------------------------------------- +void Sleep(unsigned int timeout) +{ + TimerStart(SLEEP_FCN_TIMER,timeout); + + while(!IsTimerExpired(SLEEP_FCN_TIMER)) + { + Nop(); + } + TimerStop(SLEEP_FCN_TIMER); +} + + +#ifdef GP_TIMER_USE_TIMER_1 + +void __ISR(_TIMER_1_VECTOR, ipl2) Timer1MilliSecInterrupt(void) +{ + unsigned int i; + stTimer* pstPtr = &astTimer[0]; + + // disk_timerproc(); + + // Update all timers + for (i=0; ibRunning) + { + if(pstPtr->uiMillisecCounter++ == 1000) + { + pstPtr->uiMillisecCounter = 0; + pstPtr->uiSecondCounter++; + } + } + pstPtr++; + } + + IFS0bits.T1IF = 0; //Clear interrupt flag +} +#endif + +#ifdef GP_TIMER_USE_TIMER_2 + +void __ISR(_TIMER_2_VECTOR, ipl2) Timer2MilliSecInterrupt(void) { + unsigned int i; + stTimer* pstPtr = &astTimer[0]; + + //disk_timerproc(); + + // Update all timers + for (i = 0; i < TIMER_MAX_ID; i++) { + // update timer only if timer is running + if (pstPtr->bRunning) { + if (pstPtr->uiMillisecCounter++ == 1000) { + pstPtr->uiMillisecCounter = 0; + pstPtr->uiSecondCounter++; + } + } + pstPtr++; + } + + IFS0bits.T2IF = 0; //Clear interrupt flag +} +#endif + +//EOF + + diff --git a/AudioConsole.X/Source/timer.h b/AudioConsole.X/Source/timer.h new file mode 100644 index 0000000..654b897 --- /dev/null +++ b/AudioConsole.X/Source/timer.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +000 20100616 HCAM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef TIMER_H +#define TIMER_H + + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ +typedef enum +{ + HEARTBEAT_LED_TMR = 0, + SLEEP_FCN_TIMER, + WIFI_RECONNECT_TIMER, + WIFI_TICK_TIMER, + SYSLOG_TX_TIMER, + BOOTLOADER_FLASH_POLL_TIMER, + BUREAU_VOLUME_TRANSDUCER_TIMER, + CUISINE_VOLUME_TRANSDUCER_TIMER, + TIMER_MAX_ID +}eTimerID; + +typedef struct +{ + unsigned int uiStart; + unsigned int uiMillisecCounter; + unsigned int uiSecondCounter; + unsigned int uiPeriodMillisec; + unsigned int uiPeriodSecond; + bool bRunning; +} stTimer; + +/* ************************************************************************** */ +/* Prototypes */ +void TimerInit(void); +int IsMilliSecTimerExpired(eTimerID p_eTimerID); +int IsSecTimerExpired(eTimerID p_eTimerID); +int IsTimerExpired(eTimerID p_eTimerID); +void TimerStart(eTimerID p_eTimerID, unsigned int p_uiPeriod); +void TimerStartSeconds(eTimerID p_eTimerID, unsigned int p_uiPeriod); +void TimerStop(eTimerID p_eTimerID); +void TimerReset(eTimerID p_eTimerID); +bool IsTimerRunning(eTimerID p_eTimerID); + +void Sleep(unsigned int millisecs); + +#endif +//EOF + diff --git a/AudioConsole.X/Source/versionbuild.h b/AudioConsole.X/Source/versionbuild.h new file mode 100644 index 0000000..c3e368b --- /dev/null +++ b/AudioConsole.X/Source/versionbuild.h @@ -0,0 +1,5 @@ +#define VERSIONNUMBER "CHALET_V01.01.6" //shall be 15 chars... +//Force DHCP instead of static IP. + +//#define VERSIONNUMBER "CHALET_V01.00.1" //shall be 15 chars... +//#define VERSIONNUMBER "-__--TEST--__" //shall be 15 chars... diff --git a/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp.h b/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp.h new file mode 100644 index 0000000..abfbec3 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp.h @@ -0,0 +1,317 @@ +/** + * + * \file + * + * \brief WINC BSP API Declarations. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/** \defgroup nm_bsp BSP + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define NMI_API + +#include "winc1500_config.h" +#include "math.h" + +#define NM_EDGE_INTERRUPT (1) + +#define NM_DEBUG CONF_WINC_DEBUG +#define NM_BSP_PRINTF CONF_WINC_PRINTF +/*!< + * Attribute used to define memory section to map Functions in host memory. + */ +#define CONST const + +/*!< + * Used for code portability. + */ + +#ifndef NULL +#define NULL ((void *)0) +#endif +/*!< + * Void Pointer to '0' in case of NULL is not defined. + */ + +#define BSP_MIN(x, y) ((x) > (y) ? (y) : (x)) +/*!< + * Computes the minimum of \b x and \b y. + */ + +//@} + +/**@defgroup DataT DataTypes + * @ingroup nm_bsp + * @{ + */ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); +/*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + +/*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + +/*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; +/*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + +/*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + +/*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; +//@} + +#ifndef CORTUS_APP + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup BSPAPI Function + * @ingroup nm_bsp + */ + +/** @defgroup NmBspInitFn nm_bsp_init + * @ingroup BSPAPI + * + * Initialization for BSP (Board Support Package) such as Reset and Chip Enable Pins for WINC, delays, + * register ISR, enable/disable IRQ for WINC, ...etc. You must use this function in the head of your application to + * enable WINC and Host Driver to communicate with each other. + */ +/**@{*/ +/*! + * @fn sint8 nm_bsp_init(void); + * @brief This function is used to initialize the Board Support Package (BSP) in order to prepare the WINC + * before it start working. + * + * The nm_bsp_init function is the first function that should be called at the beginning of + * every application to initialize the BSP and the WINC board. Otherwise, the rest of the BSP function + * calls will return with failure. This function should also be called after the WINC has been switched off + with + * a successful call to "nm_bsp_deinit" in order to reinitialize the BSP before the user can use any of the + WINC API + * functions again. After the function initialize the WINC. Hard reset must be applied to start the WINC + board. + * @note Implementation of this function is host dependent. + * @warning inappropriate use of this function will lead to unavailability of host-chip communication.\n + * + * @see nm_bsp_deinit, nm_bsp_reset + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_init(void); +/**@}*/ + +/** @defgroup NmBspDeinitFn nm_bsp_deinit + * @ingroup BSPAPI + * De-initialization for BSP ((Board Support Package)). This function should be called only after + * a successful call to nm_bsp_init. + */ +/**@{*/ +/*! + * @fn sint8 nm_bsp_deinit(void); + * @pre The BSP should be initialized through \ref nm_bsp_init first. + * @brief This function is used to de-initialize the BSP and turn off the WINC board. + * + * The nm_bsp_deinit is the last function that should be called after the application has finished and + before the WINC is switched * off. The function call turns off the WINC board by setting CHIP_EN and + RESET_N signals low.Every function call of "nm_bsp_init" should + * be matched with a call to nm_bsp_deinit. Failure to do so may result in the WINC consuming higher power + than expected. + * @note Implementation of this function is host dependent. + * @warning misuse may lead to unknown behavior in case of soft reset.\n + * @see nm_bsp_init + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_deinit(void); +/**@}*/ + +/** @defgroup NmBspResetFn nm_bsp_reset + * @ingroup BSPAPI + * Resetting WINC1500 SoC by setting CHIP_EN and RESET_N signals low, then after specific delay the function will + * put CHIP_EN high then RESET_N high, for the timing between signals please review the WINC data-sheet + */ +/**@{*/ +/*! +* @fn void nm_bsp_reset(void); +* @param [in] None +* @brief Applies a hardware reset to the WINC board. +* The "nm_bsp_reset" is used to apply a hard reset to the WINC board by setting CHIP_EN and RESET_N +signals low, then after specific delay +* the function will put CHIP_EN high then RESET_N high, for the detailed timing between signals please +review the WINC data-sheet. After a * successful call, the WINC board firmware will kick off to load and +kick off the WINC firmware. This function should be called to reset the * WINC firmware after the BSP is +initialized and before the start of any communication with WINC board. Calling this function at any other time * +will result in losing the state and connections saved in the WINC board and starting again from the initial state. The +host driver will need +* to be de-initialized before calling nm_bsp_reset and initialized again after it using the " +m2m_wifi_(de)init". +* @pre Initialize \ref nm_bsp_init first +* @note Implementation of this function is host dependent and called by HIF layer. +* @warning Calling this function will drop any connection and internal state saved on the WINC firmware. +* @see nm_bsp_init, m2m_wifi_init, m2m_wifi_deinit +* @return None + +*/ +void nm_bsp_reset(void); +/**@}*/ + +/** @defgroup NmBspSleepFn nm_bsp_sleep + * @ingroup BSPAPI + * Sleep in units of milliseconds.\n + * This function used by HIF Layer according to different situations. + */ +/**@{*/ +/*! + * @fn void nm_bsp_sleep(uint32); + * @brief Used to put the host to sleep for the specified duration. + * Forcing the host to sleep for extended period may lead to host not being able to respond to WINC board + *events.It's important to be considerate while choosing the sleep period. + * @param [in] u32TimeMsec + * Time unit in milliseconds + * @pre Initialize \ref nm_bsp_init first + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds.\n + * @note Implementation of this function is host dependent. + * @see nm_bsp_init + * @return None + */ +void nm_bsp_sleep(uint32 u32TimeMsec); +/**@}*/ + +/** @defgroup NmBspRegisterFn nm_bsp_register_isr + * @ingroup BSPAPI + * Register ISR (Interrupt Service Routine) in the initialization of HIF (Host Interface) Layer. + * When the interrupt trigger the BSP layer should call the pfisr function once inside the interrupt. + */ +/**@{*/ +/*! + * @fn void nm_bsp_register_isr(tpfNmBspIsr); + * @param [in] tpfNmBspIsr pfIsr + * Pointer to ISR handler in HIF + * @brief Register the host interface interrupt service routine. + * WINC board utilize SPI interface to communicate with the host. This function register the SPI interrupt + the notify * the host whenever there is an outstanding message from the WINC board. The function should + be called during the initialization * of the host interface. It an internal driver function and shouldn't + be called by the application. + * @warning Make sure that ISR for IRQ pin for WINC is disabled by default in your implementation. + * @note Implementation of this function is host dependent and called by HIF layer. + * @see tpfNmBspIsr + * @return None + + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr); +/**@}*/ + +/** @defgroup NmBspInterruptCtrl nm_bsp_interrupt_ctrl + * @ingroup BSPAPI + * Synchronous enable/disable interrupts function + */ +/**@{*/ +/*! + * @fn void nm_bsp_interrupt_ctrl(uint8); + * @pre The interrupt must be registered using nm_bsp_register_isr first. + * @brief Enable/Disable interrupts + * This function can be used to enable/disable the WINC to host interrupt as the depending on how the driver + is implemented. + * It an internal driver function and shouldn't be called by the application. + * @param [in] u8Enable + * '0' disable interrupts. '1' enable interrupts + * @see tpfNmBspIsr, nm_bsp_register_isr + * @note Implementation of this function is host dependent and called by HIF layer. + * @return None + + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable); +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif + +#ifdef _NM_BSP_BIG_END +#define NM_BSP_B_L_32(x) \ + ((((x)&0x000000FF) << 24) + (((x)&0x0000FF00) << 8) + (((x)&0x00FF0000) >> 8) + (((x)&0xFF000000) >> 24)) +#define NM_BSP_B_L_16(x) ((((x)&0x00FF) << 8) + (((x)&0xFF00) >> 8)) +#else +#define NM_BSP_B_L_32(x) (x) +#define NM_BSP_B_L_16(x) (x) +#endif + +#endif /*_NM_BSP_H_*/ diff --git a/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp_internal.h b/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp_internal.h new file mode 100644 index 0000000..4ba0d1f --- /dev/null +++ b/AudioConsole.X/Source/winc1500/bsp/include/nm_bsp_internal.h @@ -0,0 +1,104 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 BSP APIs declarations. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_INTERNAL_H_ +#define _NM_BSP_INTERNAL_H_ + +#ifdef WIN32 +#include "nm_bsp_win32.h" +#endif + +#ifdef __K20D50M__ +#include "nm_bsp_k20d50m.h" +#endif + +#ifdef __MSP430FR5739__ +#include "bsp_msp430fr5739.h" +#endif + +#ifdef _FREESCALE_MCF51CN128_ +#include "bsp/include/nm_bsp_mcf51cn128.h" +#endif + +#ifdef __MCF964548__ +#include "bsp/include/nm_bsp_mc96f4548.h" +#endif + +#ifdef __APP_APS3_CORTUS__ +#include "nm_bsp_aps3_cortus.h" +#endif + +#if (defined __SAMR21G18A__) +#include "bsp/include/nm_bsp_samr21.h" +#endif + +#if (defined __SAML21J18A__) || (defined __SAML21J18B__) +#include "bsp/include/nm_bsp_saml21.h" +#endif + +#if (defined __SAML22N18A__) +#include "bsp/include/nm_bsp_saml22.h" +#endif + +#if (defined __SAM4S16C__) || (defined __SAM4SD32C__) +#include "bsp/include/nm_bsp_sam4s.h" +#endif + +#if (defined __SAME70Q21__) || (defined __SAMV71Q21__) +#include "bsp/include/nm_bsp_same70.h" +#endif + +#ifdef CORTUS_APP +#include "crt_iface.h" +#endif + +#ifdef NRF51 +#include "nm_bsp_nrf51822.h" +#endif + +#ifdef _ARDUINO_UNO_ +#include "bsp/include/nm_bsp_arduino_uno.h" +#endif + +#endif //_NM_BSP_INTERNAL_H_ diff --git a/AudioConsole.X/Source/winc1500/bsp/source/nm_bsp.c b/AudioConsole.X/Source/winc1500/bsp/source/nm_bsp.c new file mode 100644 index 0000000..2fc1f8a --- /dev/null +++ b/AudioConsole.X/Source/winc1500/bsp/source/nm_bsp.c @@ -0,0 +1,181 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "timer.h" +#include "define.h" +#include "BoardCfg.h" +//#include + +//#include "atmel_start.h" +//#include "winc_init.h" + +#ifndef CONF_WINC_EXT_INT_PIN +#define CONF_WINC_EXT_INT_PIN 0 +#endif + +static tpfNmBspIsr gpfIsr = NULL; + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + if (gpfIsr) + { + gpfIsr(); + } + + IFS0bits.INT0IF = 0; +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; +// +//JFM Not necessary, we know our timer base is 1ms... + +// /* Make sure a 1ms Systick is configured. */ +// if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { +// delay_init(SysTick); +// } + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_bsp_reset(void) +{ +// GP_DEBUG_1_PIN = 1; + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(10); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(15); + WIFI_CHP_RST_PIN = 1; + + // GP_DEBUG_1_PIN = 0; + + +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, false); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, false); +// nm_bsp_sleep(1); +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, true); +// nm_bsp_sleep(5); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + Sleep(u32TimeMsec); + + + +// while (u32TimeMsec--) { +// delay_ms(1); +// } +} + +/** + * \internal Get the PIO hardware instance + * + * \param[in] pin The PIO pin + * + * \return The instance of PIO hardware + */ + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + gpfIsr = pfIsr; +// +// ext_irq_register(CONF_WINC_EXT_INT_PIN, chip_isr); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if(u8Enable == 0) + { + IEC0bits.INT0IE = 0; + } + else + { + IEC0bits.INT0IE = 1; + } +// _ext_irq_enable(CONF_WINC_EXT_INT_PIN, u8Enable); +} diff --git a/AudioConsole.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h b/AudioConsole.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h new file mode 100644 index 0000000..2c7102a --- /dev/null +++ b/AudioConsole.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h @@ -0,0 +1,173 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BUS_WRAPPER_H_ +#define _NM_BUS_WRAPPER_H_ + +#include "common/include/nm_common.h" + +/** + BUS Type +**/ +#define NM_BUS_TYPE_I2C ((uint8)0) +#define NM_BUS_TYPE_SPI ((uint8)1) +#define NM_BUS_TYPE_UART ((uint8)2) +/** + IOCTL commands +**/ +#define NM_BUS_IOCTL_R ((uint8)0) /*!< Read only ==> I2C/UART. Parameter:tstrNmI2cDefault/tstrNmUartDefault */ +#define NM_BUS_IOCTL_W ((uint8)1) /*!< Write only ==> I2C/UART. Parameter type tstrNmI2cDefault/tstrNmUartDefault*/ +#define NM_BUS_IOCTL_W_SPECIAL \ + ((uint8)2) /*!< Write two buffers within the same transaction \ + (same start/stop conditions) ==> I2C only. Parameter:tstrNmI2cSpecial */ +#define NM_BUS_IOCTL_RW ((uint8)3) /*!< Read/Write at the same time ==> SPI only. Parameter:tstrNmSpiRw */ + +#define NM_BUS_IOCTL_WR_RESTART \ + ((uint8)4) /*!< Write buffer then made restart condition then read ==> I2C only. parameter:tstrNmI2cSpecial */ +/** + * @struct tstrNmBusCapabilities + * @brief Structure holding bus capabilities information + * @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI + */ +typedef struct { + uint16 u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +/** + * @struct tstrNmI2cDefault + * @brief Structure holding I2C default operation parameters + * @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W + */ +typedef struct { + uint8 u8SlaveAdr; + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmI2cDefault; + +/** + * @struct tstrNmI2cSpecial + * @brief Structure holding I2C special operation parameters + * @sa NM_BUS_IOCTL_W_SPECIAL + */ +typedef struct { + uint8 u8SlaveAdr; + uint8 *pu8Buf1; /*!< pointer to the 1st buffer */ + uint8 *pu8Buf2; /*!< pointer to the 2nd buffer */ + uint16 u16Sz1; /*!< 1st buffer size */ + uint16 u16Sz2; /*!< 2nd buffer size */ +} tstrNmI2cSpecial; + +/** + * @struct tstrNmSpiRw + * @brief Structure holding SPI R/W parameters + * @sa NM_BUS_IOCTL_RW + */ +typedef struct { + uint8 *pu8InBuf; /*!< pointer to input buffer. + Can be set to null and in this case zeros should be sent at MOSI */ + uint8 *pu8OutBuf; /*!< pointer to output buffer. + Can be set to null and in this case data from MISO can be ignored */ + uint16 u16Sz; /*!< Transfere size */ +} tstrNmSpiRw; + +/** + * @struct tstrNmUartDefault + * @brief Structure holding UART default operation parameters + * @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W + */ +typedef struct { + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmUartDefault; +/*!< Bus capabilities. This structure must be declared at platform specific bus wrapper */ +extern tstrNmBusCapabilities egstrNmBusCapabilities; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_init(void *); + +/** + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param [in] u8Cmd + * IOCTL command for the operation + * @param [in] pvParameter + * Arbitrary parameter depending on IOCTL + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter); + +/** + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_deinit(void); + +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *); +/* + * @fn nm_bus_get_chip_type + * @brief get chip type + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +#ifdef CONF_WINC_USE_UART +uint8 nm_bus_get_chip_type(void); +sint8 nm_bus_break(void); +#endif +#ifdef __cplusplus +} +#endif + +#endif /*_NM_BUS_WRAPPER_H_*/ diff --git a/AudioConsole.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c b/AudioConsole.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c new file mode 100644 index 0000000..edb34c8 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c @@ -0,0 +1,206 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" +//#include "atmel_start.h" +//#include "winc_init.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = {NM_BUS_MAX_TRX_SZ}; + + +static sint8 spi_rw(uint8 *pu8Mosi, uint8 *pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + + if (!u8SkipMiso) + { + while(u16Sz-- != 0) + { + uint8 tmp; + tmp = SPITransaction(0xDE); + *pu8Miso++ = tmp; + } + } + if (!u8SkipMosi) + { + while(u16Sz-- != 0) + { + uint8 tmp; + tmp = SPITransaction(*pu8Mosi++); //assign to tmp for debug purposes only. + } + } + WIFI_SPI_SS_PIN = 1; + + + /*uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, false); + if (!u8SkipMiso) { + io_read(io, pu8Miso, u16Sz); + } + if (!u8SkipMosi) { + io_write(io, pu8Mosi, u16Sz); + } + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, true);*/ + + return M2M_SUCCESS; +} + +/* + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_init(void *pvinit) +{ + sint8 result = M2M_SUCCESS; + nm_bsp_reset(); + nm_bsp_sleep(1); + return result; +} + + + + //JFM The SPI module has been initialized in InitBoard() + //so the two following lines are not needed. +/* spi_m_sync_get_io_descriptor(spi_instance, &io); + spi_m_sync_enable(spi_instance);/* + + nm_bsp_reset(); + nm_bsp_sleep(1); + + return result; +} + +/* + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param[IN] u8Cmd + * IOCTL command for the operation + * @param[IN] pvParameter + * Arbitrary parameter depenging on IOCTL + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter) +{ + sint8 s8Ret = 0; + switch (u8Cmd) + { + case NM_BUS_IOCTL_RW: + { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + break; + } + + + default: + { + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + } + return s8Ret; +} + +/* + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + */ +sint8 nm_bus_deinit(void) +{ + sint8 result = 0; + return result; +} +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *config) +{ + return M2M_SUCCESS; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/winc1500/common/include/nm_common.h b/AudioConsole.X/Source/winc1500/common/include/nm_common.h new file mode 100644 index 0000000..043ec1d --- /dev/null +++ b/AudioConsole.X/Source/winc1500/common/include/nm_common.h @@ -0,0 +1,150 @@ +/** + * + * \file + * + * \brief WINC Driver Common API Declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_debug.h" + +/**@defgroup CommonDefines CommonDefines + * @ingroup WlanDefines + */ +/**@{*/ +#define M2M_TIME_OUT_DELAY 10000 + +/*states*/ +#define M2M_SUCCESS ((sint8)0) +#define M2M_ERR_SEND ((sint8)-1) +#define M2M_ERR_RCV ((sint8)-2) +#define M2M_ERR_MEM_ALLOC ((sint8)-3) +#define M2M_ERR_TIME_OUT ((sint8)-4) +#define M2M_ERR_INIT ((sint8)-5) +#define M2M_ERR_BUS_FAIL ((sint8)-6) +#define M2M_NOT_YET ((sint8)-7) +#define M2M_ERR_FIRMWARE ((sint8)-8) +#define M2M_SPI_FAIL ((sint8)-9) +#define M2M_ERR_FIRMWARE_bURN ((sint8)-10) +#define M2M_ACK ((sint8)-11) +#define M2M_ERR_FAIL ((sint8)-12) +#define M2M_ERR_FW_VER_MISMATCH ((sint8)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((sint8)-14) +#define M2M_ERR_INVALID_ARG ((sint8)-15) +#define M2M_ERR_INVALID ((sint8)-16) + +/*i2c MAASTER ERR*/ +#define I2C_ERR_LARGE_ADDRESS 0xE1UL /*the address exceed the max addressing mode in i2c flash*/ +#define I2C_ERR_TX_ABRT 0xE2UL /*NO ACK from slave*/ +#define I2C_ERR_OVER_SIZE 0xE3UL /**/ +#define ERR_PREFIX_NMIS 0xE4UL /*wrong first four byte in flash NMIS*/ +#define ERR_FIRMEWARE_EXCEED_SIZE 0xE5UL /*Total size of firmware exceed the max size 256k*/ +/**/ +#define PROGRAM_START 0x26961735UL +#define BOOT_SUCCESS 0x10add09eUL +#define BOOT_START 0x12345678UL + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +#define M2M_MAX(A, B) ((A) > (B) ? (A) : (B)) +#define M2M_SEL(x, m1, m2, m3) ((x > 1) ? ((x > 2) ? (m3) : (m2)) : (m1)) +#define WORD_ALIGN(val) (((val)&0x03) ? ((val) + 4 - ((val)&0x03)) : (val)) + +#define DATA_PKT_OFFSET 4 + +#ifndef BIG_ENDIAN +#define BYTE_0(word) ((uint8)(((word) >> 0) & 0x000000FFUL)) +#define BYTE_1(word) ((uint8)(((word) >> 8) & 0x000000FFUL)) +#define BYTE_2(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +#define BYTE_3(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#else +#define BYTE_0(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#define BYTE_1(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +#define BYTE_2(word) ((uint8)(((word) >> 8) & 0x000000FFUL)) +#define BYTE_3(word) ((uint8)(((word) >> 0) & 0x000000FFUL)) +#endif + +/**@}*/ +#ifdef __cplusplus +extern "C" { +#endif +NMI_API void m2m_memcpy(uint8 *pDst, uint8 *pSrc, uint32 sz); +NMI_API void m2m_memset(uint8 *pBuf, uint8 val, uint32 sz); +NMI_API uint16 m2m_strlen(uint8 *pcStr); +NMI_API sint8 m2m_memcmp(uint8 *pu8Buff1, uint8 *pu8Buff2, uint32 u32Size); +NMI_API uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); +NMI_API uint8 *m2m_strstr(uint8 *pcIn, uint8 *pcStr); +NMI_API uint8 m2m_checksum(uint8 *buf, int sz); + +#ifdef __cplusplus +} +#endif +#endif /*_NM_COMMON_H_*/ diff --git a/AudioConsole.X/Source/winc1500/common/include/nm_debug.h b/AudioConsole.X/Source/winc1500/common/include/nm_debug.h new file mode 100644 index 0000000..d5ff946 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/common/include/nm_debug.h @@ -0,0 +1,117 @@ +/** + * + * \file + * + * \brief This module contains debug APIs declarations. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + +#include "bsp/include/nm_bsp.h" +/* #include "bsp/include/nm_bsp_internal.h" */ + +/**@defgroup DebugDefines DebugDefines + * @ingroup WlanDefines + */ +/**@{*/ + +#define M2M_LOG_NONE 0 +#define M2M_LOG_ERROR 1 +#define M2M_LOG_INFO 2 +#define M2M_LOG_REQ 3 +#define M2M_LOG_DBG 4 + +#if (defined __APS3_CORTUS__) +#define M2M_LOG_LEVEL M2M_LOG_INFO +#else +#define M2M_LOG_LEVEL M2M_LOG_REQ +#endif + +#define M2M_ERR(...) +#define M2M_INFO(...) +#define M2M_REQ(...) +#define M2M_DBG(...) +#define M2M_PRINT(...) + +#if (CONF_WINC_DEBUG == 1) +#undef M2M_PRINT +#define M2M_PRINT(...) \ + do { \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_ERROR) +#undef M2M_ERR +#define M2M_ERR(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(ERR)[%s][%d]", __FUNCTION__, __LINE__); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_INFO) +#undef M2M_INFO +#define M2M_INFO(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(INFO)"); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_REQ) +#undef M2M_REQ +#define M2M_REQ(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(R)"); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_DBG) +#undef M2M_DBG +#define M2M_DBG(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(DBG)[%s][%d]", __FUNCTION__, __LINE__); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#endif /*M2M_LOG_DBG*/ +#endif /*M2M_LOG_REQ*/ +#endif /*M2M_LOG_INFO*/ +#endif /*M2M_LOG_ERROR*/ +#endif /*CONF_WINC_DEBUG */ + +/**@}*/ +#endif /* _NM_DEBUG_H_ */ diff --git a/AudioConsole.X/Source/winc1500/common/source/nm_common.c b/AudioConsole.X/Source/winc1500/common/source/nm_common.c new file mode 100644 index 0000000..a39b7db --- /dev/null +++ b/AudioConsole.X/Source/winc1500/common/source/nm_common.c @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +void m2m_memcpy(uint8 *pDst, uint8 *pSrc, uint32 sz) +{ + if (sz == 0) + return; + do { + *pDst = *pSrc; + pDst++; + pSrc++; + } while (--sz); +} +uint8 m2m_checksum(uint8 *buf, int sz) +{ + uint8 cs = 0; + while (--sz) { + cs ^= *buf; + buf++; + } + + return cs; +} + +void m2m_memset(uint8 *pBuf, uint8 val, uint32 sz) +{ + if (sz == 0) + return; + do { + *pBuf = val; + pBuf++; + } while (--sz); +} + +uint16 m2m_strlen(uint8 *pcStr) +{ + uint16 u16StrLen = 0; + while (*pcStr) { + u16StrLen++; + pcStr++; + } + return u16StrLen; +} + +uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len) +{ + for (; u16Len > 0; pcS1++, pcS2++, --u16Len) + if (*pcS1 != *pcS2) + return ((*(uint8 *)pcS1 < *(uint8 *)pcS2) ? -1 : +1); + else if (*pcS1 == '\0') + return 0; + return 0; +} + +/* Finds the occurance of pcStr in pcIn. +If pcStr is part of pcIn it returns a valid pointer to the start of pcStr within pcIn. +Otherwise a NULL Pointer is returned. +*/ +uint8 *m2m_strstr(uint8 *pcIn, uint8 *pcStr) +{ + uint8 u8c; + uint16 u16StrLen; + + u8c = *pcStr++; + if (!u8c) + return (uint8 *)pcIn; // Trivial empty string case + + u16StrLen = m2m_strlen(pcStr); + do { + uint8 u8Sc; + + do { + u8Sc = *pcIn++; + if (!u8Sc) + return (uint8 *)0; + } while (u8Sc != u8c); + } while (m2m_strncmp(pcIn, pcStr, u16StrLen) != 0); + + return (uint8 *)(pcIn - 1); +} + +sint8 m2m_memcmp(uint8 *pu8Buff1, uint8 *pu8Buff2, uint32 u32Size) +{ + uint32 i; + sint8 s8Result = 0; + for (i = 0; i < u32Size; i++) { + if (pu8Buff1[i] != pu8Buff2[i]) { + s8Result = 1; + break; + } + } + return s8Result; +} diff --git a/AudioConsole.X/Source/winc1500/driver/include/ecc_types.h b/AudioConsole.X/Source/winc1500/driver/include/ecc_types.h new file mode 100644 index 0000000..ef1d4d5 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/ecc_types.h @@ -0,0 +1,232 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _FIRMWARE_ +#include "driver/include/m2m_types.h" +#else +#include "m2m_types.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + +#if 0 +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +#endif +/*!< + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve { + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +} tenuEcNamedCurve; + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint { + uint8 X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8 Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16 u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16 u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +} tstrECPoint; + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam { + uint32 p[ECC_POINT_MAX_SIZE_WORDS]; + uint32 a[ECC_POINT_MAX_SIZE_WORDS]; + uint32 b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +} tstrECDomainParam; + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct { + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +} tstrEllipticCurve; + +typedef enum { + ECC_REQ_NONE, + ECC_REQ_CLIENT_ECDH, + ECC_REQ_SERVER_ECDH, + ECC_REQ_GEN_KEY, + ECC_REQ_SIGN_GEN, + ECC_REQ_SIGN_VERIFY +} tenuEccREQ; + +typedef struct { + tstrECPoint strPubKey; + uint8 au8Key[ECC_POINT_MAX_SIZE]; +} tstrEcdhReqInfo; + +typedef struct { + uint32 u32nSig; +} tstrEcdsaVerifyReqInfo; + +typedef struct { + uint16 u16CurveType; + uint16 u16HashSz; +} tstrEcdsaSignReqInfo; + +typedef struct { + uint16 u16REQ; + uint16 u16Status; + uint32 u32UserData; + uint32 u32SeqNo; + union { + tstrEcdhReqInfo strEcdhREQ; + tstrEcdsaSignReqInfo strEcdsaSignREQ; + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + }; +} tstrEccReqInfo; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#if 0 +static tstrEllipticCurve gastrECCSuppList[] = { + { + EC_SECP256R1, + { + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0x27D2604B, 0x3BCE3C3E, 0xCC53B0F6, 0x651D06B0, 0x769886BC, 0xB3EBBD55, 0xAA3A93E7, 0x5AC635D8}, + { + { + 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, 0x63, 0xA4, 0x40, 0xF2, + 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 + }, + { + 0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A, 0x7C, 0x0F, 0x9E, 0x16, + 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5 + }, + 32 + } + } + } +}; +#endif + +/*!< + List of supported Elliptic Curves ordered by security level (most secure curve is at index ZERO). +*/ + +#endif /* __ECC_TYPES_H__ */ diff --git a/AudioConsole.X/Source/winc1500/driver/include/m2m_ate_mode.h b/AudioConsole.X/Source/winc1500/driver/include/m2m_ate_mode.h new file mode 100644 index 0000000..6f9c14a --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/m2m_ate_mode.h @@ -0,0 +1,750 @@ +/** + * + * \file + * + * \brief WINC ATE Test Driver Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ + +#ifndef _M2M_ATE_MODE_H_ +#define _M2M_ATE_MODE_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/** \defgroup m2m_ate ATE + */ +/**@defgroup ATEDefine Defines + * @ingroup m2m_ate + * @{ + */ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_ATE_MAX_NUM_OF_RATES (20) +/*!< +Maximum number of all rates (b,g and n) + */ +#define M2M_ATE_MAX_FRAME_LENGTH (1024) +/*!< Maximum number of length for each frame + */ +#define M2M_ATE_MIN_FRAME_LENGTH (1) +/*!< Minimum number of length for each frame + */ +#define M2M_ATE_SUCCESS (M2M_SUCCESS) +/*!< No Error and operation completed successfully. + */ +#define M2M_ATE_ERR_VALIDATE (M2M_ERR_FAIL) +/*!< Error in parameters passed to functions. + */ +#define M2M_ATE_ERR_TX_ALREADY_RUNNING (-1) +/*!< Error in starting a transmission test. Another test is already running and its not allowed to start another ATE + * test. + */ +#define M2M_ATE_ERR_RX_ALREADY_RUNNING (-2) +/*!< Error in starting a reception test. Another test is already running and its not allowed to start another ATE test. + */ +#define M2M_ATE_ERR_UNHANDLED_CASE (-3) +/*!< Invalid case. + */ +#define M2M_ATE_RX_DISABLE_DA 0x0 +/*!< Filter selection for received frames: Disable filtering received frames by the destination address. + */ +#define M2M_ATE_RX_ENABLE_DA 0x1 +/*!< Filter selection for received frames: Enable filtering received frames by the destination address. + */ +#define M2M_ATE_RX_DISABLE_SA 0x0 +/*!< Filter selection for received frames: Disable filtering received frames by the source address. + */ +#define M2M_ATE_RX_ENABLE_SA 0x1 +/*!< Filter selection for received frames: Enable filtering received frames by the source address. + */ +#define M2M_ATE_DISABLE_SELF_MACADDR 0x0 +/*!\n",ret); + while(1); + } + //Initialize the OTA module + m2m_ota_init(OtaUpdateCb,NULL); + //connect to AP that provide connection to the OTA server + m2m_wifi_default_connect(); + + while(1) + { + + //Handle the app state machine plus the WINC event handler + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + + } + + } +} +@endcode + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 *u8DownloadUrl); +/**@}*/ +/** @defgroup OtaStartUpdatefn m2m_ota_start_update_crt + * @ingroup WLANAPI + * Request OTA start for cortus application image using the downloaded URL, the OTA module will download the OTA image + *and ensure integrity of the image, and update the validity of the image in control structure. Switching to that image + *requires calling @ref m2m_ota_switch_crt API. As a prerequisite @ref m2m_ota_init should be called before using + *@ref m2m_ota_start_update_crt(). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); + +@param [in] u8DownloadUrl + The cortus application image url. +@warning + Calling this API does not guarantee cortus application image update, It depends on the connection with the download +server and the validity of the image. If the API response is failure this may invalidate the roll-back image if it was +previously valid, since the WINC does not have any internal memory except the flash roll-back image location to validate +the downloaded image from + +@see + m2m_ota_init + tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_start_update_crt(uint8 *u8DownloadUrl); +/**@}*/ +/** @defgroup OtaRollbackfn m2m_ota_rollback +* @ingroup WLANAPI + Request OTA Roll-back to the old (other) WINC image, the WINC firmware will check the validation of the Roll-back +image and switch to it if it is valid. If the API response is success, system restart is required (re-initialize the +driver with hardware rest) update the host driver version may be required if it is did not match the minimum version +supported by the WINC firmware. + +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void); +/**@}*/ +/** @defgroup OtaRollbackfn m2m_ota_rollback_crt +* @ingroup WLANAPI + Request Cortus application OTA Roll-back to the old (other) cortus application image, the WINC firmware will check +the validation of the Roll-back image and switch to it if it is valid. If the API response is success, system restart is +required (re-initialize the driver with hardware rest) update the host driver version may be required. + +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback_crt(void); + +@sa + m2m_ota_init + m2m_ota_start_update_crt + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback_crt(void); +/**@}*/ +/** @defgroup OtaAbortfn m2m_ota_abort +* @ingroup WLANAPI + Request abort of current OTA download. + The WINC firmware will terminate the OTA download if one is in progress. + If no download is in progress, the API will respond with failure. +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void); +/**@}*/ +/**@}*/ +/** @defgroup OtaSwitchFirmware m2m_ota_switch_firmware +* @ingroup WLANAPI +* Switch to the upgraded Firmware, that API will update the control structure working image to the upgraded image + take effect will be on the next system restart +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@warning + It is important to note that if the API succeeds, system restart is required (re-initializing the driver with +hardware reset) updating the host driver version may be required if it does not match the minimum driver version +supported by the WINC's firmware. +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void); +/**@}*/ +/**@}*/ +/** @defgroup OtaSwitchFirmware m2m_ota_switch_crt +* @ingroup WLANAPI +* Switch to the upgraded cortus application, that API will update the control structure working image to the upgraded +image take effect will be on the next system restart +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@warning + It is important to note that if the API succeeds, system restart is required (re-initializing the driver with +hardware reset) updating the host driver version may be required if it does not match the minimum driver version +supported by the WINC's firmware. +@sa + m2m_ota_init + m2m_ota_start_update_crt + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_crt(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(void); + +@brief + Get the OTA Firmware version. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); +/**@}*/ +NMI_API sint8 m2m_ota_test(void); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/AudioConsole.X/Source/winc1500/driver/include/m2m_periph.h b/AudioConsole.X/Source/winc1500/driver/include/m2m_periph.h new file mode 100644 index 0000000..ce2f009 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/m2m_periph.h @@ -0,0 +1,404 @@ +/** + * + * \file + * + * \brief WINC Peripherals Application Interface. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrPerphInitParam + +@brief + Peripheral module initialization parameters. +*/ +typedef struct { + void *arg; +} tstrPerphInitParam; + +/*! +@enum \ + tenuGpioNum + +@brief + A list of GPIO numbers configurable through the m2m_periph module. +*/ +typedef enum { + M2M_PERIPH_GPIO3, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO4, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO5, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO6, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + +/*! +@enum \ + tenuI2cMasterSclMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SCL signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is avaiable on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is avaiable on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is avaiable on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is avaiable on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is avaiable on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! +@enum \ + tenuI2cMasterSdaMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SDA signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK, /*!< I2C master SDA is avaiable on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is avaiable on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is avaiable on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is avaiable on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is avaiable on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + +/*! +@struct \ + tstrI2cMasterInitParam + +@brief + I2C master configuration parameters. +@sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt +*/ +typedef struct { + uint8 enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8 enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8 u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! +@enum \ + tenuI2cMasterFlags + +@brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read +@sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read +*/ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! +@enum \ + tenuPullupMask + +@brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. +@sa + m2m_periph_pullup_ctrl + +*/ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_DAT2_SPI_RXD = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 12), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 13), + M2M_PERIPH_PULLUP_DIS_I2C_SCL = (1ul << 14), + M2M_PERIPH_PULLUP_DIS_I2C_SDA = (1ul << 15), + M2M_PERIPH_PULLUP_DIS_GPIO_11 = (1ul << 16), + M2M_PERIPH_PULLUP_DIS_GPIO_12 = (1ul << 17), + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 18), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 19), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 20), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 21), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 22), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 23), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 24), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_21 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 28), + M2M_PERIPH_PULLUP_DIS_GPIO_24 = (1ul << 29), +} tenuPullupMask; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@fn \ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + +@brief + Initialize the NMC1500 peripheral driver module. + +@param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrPerphInitParam +*/ +NMI_API sint8 m2m_periph_init(tstrPerphInitParam *param); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + +@brief + Configure a specific NMC1500 pad as a GPIO and sets its direction (input or output). + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + +@brief + Set an NMC1500 GPIO output level high or low. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + +@brief + Read an NMC1500 GPIO input level. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 *pu8GpioVal); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); + +@brief + Set an NMC1500 GPIO pullup resisitor enable or disable. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8PullupEn + Zero: pullup disabled. Non-zero: pullup enabled. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam * param); + +@brief + Initialize and configure the NMC1500 I2C master peripheral. + +@param [in] param + I2C master initialization structure. See members of tstrI2cMasterInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrI2cMasterInitParam +*/ +NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam *param); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint8 flags); + +@brief + Write a stream of bytes to the I2C slave device. + +@param [in] u8SlaveAddr + 7-bit I2C slave address. +@param [in] pu8Buf + A pointer to an input buffer which contains a stream of bytes. +@param [in] u16BufLen + Input buffer length in bytes. +@param [in] flags + Write operation bitwise-ORed flags. See tenuI2cMasterFlags. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuI2cMasterFlags +*/ +NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint8 flags); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint16 * pu16ReadLen, +uint8 flags); + +@brief + Write a stream of bytes to the I2C slave device. + +@param [in] u8SlaveAddr + 7-bit I2C slave address. +@param [out] pu8Buf + A pointer to an output buffer in which a stream of bytes are received. +@param [in] u16BufLen + Max output buffer length in bytes. +@param [out] pu16ReadLen + Actual number of bytes received. +@param [in] flags + Write operation bitwise-ORed flags. See tenuI2cMasterFlags. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuI2cMasterFlags +*/ +NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint16 *pu16ReadLen, + uint8 flags); + +/*! +@fn \ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +@brief + Control the programmable pull-up resistor on the chip pads . + +@param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in +tenuPullupMask. + +@param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuPullupMask +*/ +NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_PERIPH_H_ */ diff --git a/AudioConsole.X/Source/winc1500/driver/include/m2m_ssl.h b/AudioConsole.X/Source/winc1500/driver/include/m2m_ssl.h new file mode 100644 index 0000000..4b6a7b5 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/m2m_ssl.h @@ -0,0 +1,182 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/**@defgroup SSLAPI SSL + */ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" +#include "ecc_types.h" +#include "socket/include/socket.h" + +/**@defgroup SSLEnums Enumeration/Typedefs + * @ingroup SSLAPI + * @{*/ + +/*! +@typedef \ + void (*tpfAppSslCb) (uint8 u8MsgType, void * pvMsg); + +@brief A callback to get SSL notifications. + +@param[in] u8MsgType +@param[in] pvMsg A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb)(uint8 u8MsgType, void *pvMsg); + +/**@} + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SSLFUNCTIONS Functions + * @ingroup SSLAPI + */ + +/**@{*/ +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! + @fn \ NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8 *pu8RspDataBuff, uint16 u16RspDataSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8 *pu8Buffer, uint32 u32BufferSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* + pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16 *pu16CurveType, uint8 *pu8Hash, uint8 *pu8Sig, tstrECPoint *pu8Key); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8 *pu8Hash, uint16 u16HashSz); + +/*! + @fn \ NMI_API void m2m_ssl_stop_processing_certs(void) + @brief Allow ssl driver to tidy up in case application does not read all available certificates. + @warning This API must only be called if some certificates are left unread. + @return None. +*/ +NMI_API void m2m_ssl_stop_processing_certs(void); + +/*! + @fn \ NMI_API void m2m_ssl_ecc_process_done(void) + @brief Allow ssl driver to tidy up after application has finished processing ecc message. + @warning This API must be called after receiving a SSL callback with type @ref M2M_SSL_REQ_ECC + @return None. +*/ +NMI_API void m2m_ssl_ecc_process_done(void); + +/*! +@fn \ + NMI_API sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the +form of a bitmap containing the required ciphers to be on. There is no need to call this function if the application +will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC +ciphersuites. The caller can override the default with any desired combination, except for combinations involving both +RSA and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. If u32SslCsBMP does not +contain any ciphersuites supported by firmware, then the current active list will not be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + +/**@}*/ +#endif /* __M2M_SSL_H__ */ diff --git a/AudioConsole.X/Source/winc1500/driver/include/m2m_types.h b/AudioConsole.X/Source/winc1500/driver/include/m2m_types.h new file mode 100644 index 0000000..c63246d --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/m2m_types.h @@ -0,0 +1,2511 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +//#include "m2m_svnrev.h" + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "common/include/nm_common.h" +#else +#ifndef LINT +#include "m2m_common.h" +#else +#include "../../../firmware/wifi_v111/src/m2m/include/m2m_common.h" +#endif +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup WlanDefines Defines + * @ingroup m2m_wifi + */ +/**@{*/ +#define M2M_MAJOR_SHIFT (8) +#define M2M_MINOR_SHIFT (4) +#define M2M_PATCH_SHIFT (0) + +#define M2M_DRV_VERSION_SHIFT (16) +#define M2M_FW_VERSION_SHIFT (0) + +#define M2M_GET_MAJOR(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_MAJOR_SHIFT) & 0xff) +#define M2M_GET_MINOR(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_MINOR_SHIFT) & 0x0f) +#define M2M_GET_PATCH(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_PATCH_SHIFT) & 0x0f) + +#define M2M_GET_FW_VER(ver_info_word) ((uint16)((ver_info_word) >> M2M_FW_VERSION_SHIFT)) +#define M2M_GET_DRV_VER(ver_info_word) ((uint16)((ver_info_word) >> M2M_DRV_VERSION_SHIFT)) + +#define M2M_GET_DRV_MAJOR(ver_info_word) M2M_GET_MAJOR(M2M_GET_DRV_VER(ver_info_word)) +#define M2M_GET_DRV_MINOR(ver_info_word) M2M_GET_MINOR(M2M_GET_DRV_VER(ver_info_word)) +#define M2M_GET_DRV_PATCH(ver_info_word) M2M_GET_PATCH(M2M_GET_DRV_VER(ver_info_word)) + +#define M2M_GET_FW_MAJOR(ver_info_word) M2M_GET_MAJOR(M2M_GET_FW_VER(ver_info_word)) +#define M2M_GET_FW_MINOR(ver_info_word) M2M_GET_MINOR(M2M_GET_FW_VER(ver_info_word)) +#define M2M_GET_FW_PATCH(ver_info_word) M2M_GET_PATCH(M2M_GET_FW_VER(ver_info_word)) + +#define M2M_MAKE_VERSION(major, minor, patch) \ + (((uint16)((major)&0xff) << M2M_MAJOR_SHIFT) | ((uint16)((minor)&0x0f) << M2M_MINOR_SHIFT) \ + | ((uint16)((patch)&0x0f) << M2M_PATCH_SHIFT)) + +#define M2M_MAKE_VERSION_INFO(fw_major, fw_minor, fw_patch, drv_major, drv_minor, drv_patch) \ + ((((uint32)M2M_MAKE_VERSION((fw_major), (fw_minor), (fw_patch))) << M2M_FW_VERSION_SHIFT) \ + | (((uint32)M2M_MAKE_VERSION((drv_major), (drv_minor), (drv_patch))) << M2M_DRV_VERSION_SHIFT)) + +#define REL_19_5_3_VER M2M_MAKE_VERSION_INFO(19, 5, 3, 19, 3, 0) +#define REL_19_5_2_VER M2M_MAKE_VERSION_INFO(19, 5, 2, 19, 3, 0) +#define REL_19_5_1_VER M2M_MAKE_VERSION_INFO(19, 5, 1, 19, 3, 0) +#define REL_19_5_0_VER M2M_MAKE_VERSION_INFO(19, 5, 0, 19, 3, 0) +#define REL_19_4_6_VER M2M_MAKE_VERSION_INFO(19, 4, 6, 19, 3, 0) +#define REL_19_4_5_VER M2M_MAKE_VERSION_INFO(19, 4, 5, 19, 3, 0) +#define REL_19_4_4_VER M2M_MAKE_VERSION_INFO(19, 4, 4, 19, 3, 0) +#define REL_19_4_3_VER M2M_MAKE_VERSION_INFO(19, 4, 3, 19, 3, 0) +#define REL_19_4_2_VER M2M_MAKE_VERSION_INFO(19, 4, 2, 19, 3, 0) +#define REL_19_4_1_VER M2M_MAKE_VERSION_INFO(19, 4, 1, 19, 3, 0) +#define REL_19_4_0_VER M2M_MAKE_VERSION_INFO(19, 4, 0, 19, 3, 0) +#define REL_19_3_1_VER M2M_MAKE_VERSION_INFO(19, 3, 1, 19, 3, 0) +#define REL_19_3_0_VER M2M_MAKE_VERSION_INFO(19, 3, 0, 19, 3, 0) +#define REL_19_2_2_VER M2M_MAKE_VERSION_INFO(19, 2, 2, 19, 2, 0) +#define REL_19_2_1_VER M2M_MAKE_VERSION_INFO(19, 2, 1, 19, 2, 0) +#define REL_19_2_0_VER M2M_MAKE_VERSION_INFO(19, 2, 0, 19, 2, 0) +#define REL_19_1_0_VER M2M_MAKE_VERSION_INFO(19, 1, 0, 18, 2, 0) +#define REL_19_0_0_VER M2M_MAKE_VERSION_INFO(19, 0, 0, 18, 1, 1) + +/*======*======*======*======* + FIRMWARE VERSION NO INFO + *======*======*======*======*/ + +#define M2M_RELEASE_VERSION_MAJOR_NO (19) +/*!< Firmware Major release version number. + */ + +#define M2M_RELEASE_VERSION_MINOR_NO (5) +/*!< Firmware Minor release version number. + */ + +#define M2M_RELEASE_VERSION_PATCH_NO (4) +/*!< Firmware patch release version number. + */ + +//#define M2M_RELEASE_VERSION_SVN_VERSION (SVN_REVISION) +/*!< Firmware SVN release version number. + */ + +/*======*======*======*======* + SUPPORTED DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_MIN_REQ_DRV_VERSION_MAJOR_NO (19) +/*!< Driver Major release version number. + */ + +#define M2M_MIN_REQ_DRV_VERSION_MINOR_NO (3) +/*!< Driver Minor release version number. + */ + +#define M2M_MIN_REQ_DRV_VERSION_PATCH_NO (0) +/*!< Driver patch release version number. + */ + +#define M2M_MIN_REQ_DRV_SVN_VERSION (0) +/*!< Driver svn version. + */ + +#if !defined(M2M_RELEASE_VERSION_MAJOR_NO) || !defined(M2M_RELEASE_VERSION_MINOR_NO) +#error Undefined version number +#endif + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + +#define M2M_MAC_ADDRES_LEN 6 +/*!< The size fo 802 MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< The offset of the Ethernet header within the WLAN Tx Buffer. + */ + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the Etherenet header in bytes. + */ + +#define M2M_MAX_SSID_LEN 33 +/*!< Maximum size for the Wi-Fi SSID including the NULL termination. + */ + +#define M2M_MAX_PSK_LEN 65 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_MIN_PSK_LEN 9 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + +#define MAX_HIDDEN_SITES 4 +/*!< + max number of hidden SSID suuported by scan request +*/ + +#define M2M_1X_USR_NAME_MAX 21 +/*!< The maximum size of the user name including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_1X_PWD_MAX 41 +/*!< The maximum size of the password including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< The maximum size of IE (Information Element). + */ + +#define PWR_DEFAULT PWR_HIGH +/********************* + * + * WIFI GROUP requests + */ + +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the host configuration commands opcodes. + */ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the station mode host commands opcodes. + */ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. + */ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. + */ +#define M2M_SERVER_CMD_BASE 100 +/*!< The base value of all the power save mode host commands codes. + */ +/********************** + * OTA GROUP requests + */ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. + * The OTA Have special group so can extended from 1-M2M_MAX_GRP_NUM_REQ + */ +/*********************** + * + * CRYPTO group requests + */ +#define M2M_CRYPTO_CMD_BASE 1 +/*!< The base value of all the crypto mode host commands opcodes. + * The crypto Have special group so can extended from 1-M2M_MAX_GRP_NUM_REQ + */ + +#define M2M_MAX_GRP_NUM_REQ (127) +/*!< max number of request in one group equal to 127 as the last bit reserved for config or data pkt + */ + +#define WEP_40_KEY_STRING_SIZE ((uint8)10) +/*!< Indicate the wep key size in bytes for 40 bit string passphrase. + */ + +#define WEP_104_KEY_STRING_SIZE ((uint8)26) +/*!< Indicate the wep key size in bytes for 104 bit string passphrase. + */ +#define WEP_KEY_MAX_INDEX ((uint8)4) +/*!< Indicate the max key index value for WEP authentication + */ +#define M2M_SHA256_CONTEXT_BUFF_LEN (128) +/*!< sha256 context size + */ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default. number of scan slots performed by the WINC board. + */ +#define M2M_SCAN_DEFAULT_SLOT_TIME (30) +/*!< The default. duration in miliseconds of a scan slots performed by the WINC board. + */ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default. number of scan slots performed by the WINC board. + */ + +/*======*======*======*======* + CONNECTION ERROR DEFINITIONS + *======*======*======*======*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((sint8)-23), + /*!< + A failure that indicates that a default connection or forced connection is in progress + */ + M2M_DEFAULT_CONN_FAIL, + /*!< + A failure response that indicates that the winc failed to connect to the cached network + */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< + A failure response that indicates that no one of the cached networks + was found in the scan results, as a result to the function call m2m_default_connect. + */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< + A failure response that indicates an empty network list as + a result to the function call m2m_default_connect. + */ + +} tenuM2mDefaultConnErrcode; + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name including null terminator. + */ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. + */ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. + */ +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value updated in the Control structure in case of ROLLACK image Valid +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value updated in the Control structure in case of ROLLACK image InValid +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header +*/ +#define M2M_MAGIC_APP (0xef522f61UL) +/*!< + Magic value set at the beginning of the Cortus OTA image header +*/ + +#define OTA_FORMAT_VER_0 (0) /*Till 19.2.2 format*/ +#define OTA_FORMAT_VER_1 (1) /*starting from 19.3.0 CRC is used and sequence number is used*/ +/*!< + Control structure format version +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + Sha256 digest size in the OTA image, + the sha256 digest is set at the beginning of image before the OTA header + */ + +/*======*======*======*======* + SSL DEFINITIONS + *======*======*======*======*/ + +#define TLS_CRL_DATA_MAX_LEN 64 +/* Every bit have 3dB gain control each. + for example: + 1 ->3db + 3 ->6db + 7 ->9db + */ + uint16 u8PPAGFor11GN; + /*!< PPA gain for 11GN (as the RF document represented) + PPA_AGC<0:2> Every bit have 3dB gain control each. + for example: + 1 ->3db + 3 ->6db + 7 ->9db + */ +} tstrM2mWifiGainsParams; + +/*! +@struct \ + tstrM2mWifiWepParams + +@brief + WEP security key parameters. +*/ +typedef struct { + uint8 u8KeyIndx; + /*!< Wep key Index. + */ + uint8 u8KeySz; + /*!< Wep key Size. + */ + uint8 au8WepKey[WEP_104_KEY_STRING_SIZE + 1]; + /*!< WEP Key represented as a NULL terminated ASCII string. + */ + uint8 __PAD24__[3]; + /*!< Padding bytes to keep the structure word alligned. + */ +} tstrM2mWifiWepParams; + +/*! +@struct \ + tstr1xAuthCredentials + +@brief + Credentials for the user to authenticate with the AAA server (WPA-Enterprise Mode IEEE802.1x). +*/ +typedef struct { + uint8 au8UserName[M2M_1X_USR_NAME_MAX]; + /*!< User Name. It must be Null terminated string. + */ + uint8 au8Passwd[M2M_1X_PWD_MAX]; + /*!< Password corresponding to the user name. It must be Null terminated string. + */ +} tstr1xAuthCredentials; + +/*! +@union \ + tuniM2MWifiAuth + +@brief + Wi-Fi Security Parameters for all supported security modes. +*/ +typedef union { + uint8 au8PSK[M2M_MAX_PSK_LEN]; + /*!< Pre-Shared Key in case of WPA-Personal security. + */ + tstr1xAuthCredentials strCred1x; + /*!< Credentials for RADIUS server authentication in case of WPA-Enterprise security. + */ + tstrM2mWifiWepParams strWepInfo; + /*!< WEP key parameters in case of WEP security. + */ +} tuniM2MWifiAuth; + +/*! +@struct \ + tstrM2MWifiSecInfo + +@brief + Authentication credentials to connect to a Wi-Fi network. +*/ +typedef struct { + tuniM2MWifiAuth uniAuth; + /*!< Union holding all possible authentication parameters corresponding the current security types. + */ + uint8 u8SecType; + /*!< Wi-Fi network security type. See tenuM2mSecType for supported security types. + */ +#define __PADDING__ (4 - ((sizeof(tuniM2MWifiAuth) + 1) % 4)) + uint8 __PAD__[__PADDING__]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiSecInfo; + +/*! +@struct \ + tstrM2mWifiConnect + +@brief + Wi-Fi Connect Request +*/ +typedef struct { + tstrM2MWifiSecInfo strSec; + /*!< Security parameters for authenticating with the AP. + */ + uint16 u16Ch; + /*!< RF Channel for the target SSID as enumerated in tenuM2mScanCh. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< SSID of the desired AP. It must be NULL terminated string. + */ + uint8 u8NoSaveCred; + /*!< Set to '1' to prevent WINC from saving authentication info (PSK, WEP key, 801.1x password) on WINC flash. + */ +#define __CONN_PAD_SIZE__ (4 - ((sizeof(tstrM2MWifiSecInfo) + M2M_MAX_SSID_LEN + 3) % 4)) + uint8 __PAD__[__CONN_PAD_SIZE__]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiConnect; + +/*! +@struct \ + tstrM2MWPSConnect + +@brief + WPS Configuration parameters + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint8 u8TriggerType; + /*!< WPS triggering method (Push button or PIN) + */ + char acPinNumber[8]; + /*!< WPS PIN No (for PIN method) + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWPSConnect; + +/*! +@struct \ + tstrM2MWPSInfo + +@brief WPS Result + + This structure is passed to the application in response to a WPS request. If the WPS session is completed +successfully, the structure will have Non-ZERO authentication type. If the WPS Session fails (due to error or timeout) +the authentication type is set to ZERO. + +@sa + tenuM2mSecType +*/ +typedef struct { + uint8 u8AuthType; + /*!< Network authentication type. + */ + uint8 u8Ch; + /*!< RF Channel for the AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< SSID obtained from WPS. + */ + uint8 au8PSK[M2M_MAX_PSK_LEN]; + /*!< PSK for the network obtained from WPS. + */ +} tstrM2MWPSInfo; + +/*! +@struct \ + tstrM2MDefaultConnResp + +@brief + Response error of the m2m_default_connect + +@sa + M2M_DEFAULT_CONN_SCAN_MISMATCH + M2M_DEFAULT_CONN_EMPTY_LIST +*/ +typedef struct { + sint8 s8ErrorCode; + /*!< + Default connect error code. possible values are: + - M2M_DEFAULT_CONN_EMPTY_LIST + - M2M_DEFAULT_CONN_SCAN_MISMATCH + */ + uint8 __PAD24__[3]; +} tstrM2MDefaultConnResp; + +/*! +@struct \ + tstrM2MScanOption + +@brief + Scan options and configurations. + +@sa + tenuM2mScanCh + tstrM2MScan +*/ +typedef struct { + uint8 u8NumOfSlot; + /*|< The min number of slots is 2 for every channel, + every slot the soc will send Probe Request on air, and wait/listen for PROBE RESP/BEACONS for the u16slotTime + */ + uint8 u8SlotTime; + /*|< the time that the Soc will wait on every channel listening to the frames on air + when that time increaseed number of AP will increased in the scan results + min time is 10 ms and the max is 250 ms + */ + uint8 u8ProbesPerSlot; + /*!< Number of probe requests to be sent per channel scan slot. + */ + sint8 s8RssiThresh; + /*! < The RSSI threshold of the AP which will be connected to directly. + */ + +} tstrM2MScanOption; + +/*! +@struct \ + tstrM2MScanRegion + +@brief + Wi-Fi channel regulation region information. + +@sa + tenuM2mScanRegion +*/ +typedef struct { + uint16 u16ScanRegion; + /*|< Specifies the number of channels allowed in the region (e.g. North America = 11 ... etc.). + */ + uint8 __PAD16__[2]; + +} tstrM2MScanRegion; + +/*! +@struct \ + tstrM2MScan + +@brief + Wi-Fi Scan Request + +@sa + tenuM2mScanCh + tstrM2MScanOption +*/ +typedef struct { + uint8 u8ChNum; + /*!< The Wi-Fi RF Channel number + */ + uint8 __RSVD8__[1]; + /*!< Reserved for future use. + */ + uint16 u16PassiveScanTime; + /*!< Passive Scan Timeout in ms. The field is ignored for active scan. + */ +} tstrM2MScan; + +/*! +@struct \ + tstrCyptoResp + +@brief + crypto response +*/ +typedef struct { + sint8 s8Resp; + /***/ + uint8 __PAD24__[3]; + /* + */ +} tstrCyptoResp; + +/*! +@struct \ + tstrM2mScanDone + +@brief + Wi-Fi Scan Result +*/ +typedef struct { + uint8 u8NumofCh; + /*!< Number of found APs + */ + sint8 s8ScanState; + /*!< Scan status + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mScanDone; + +/*! +@struct \ + tstrM2mReqScanResult + +@brief Scan Result Request + + The Wi-Fi Scan results list is stored in Firmware. The application can request a certain scan result by its index. +*/ +typedef struct { + uint8 u8Index; + /*!< Index of the desired scan result + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mReqScanResult; + +/*! +@struct \ + tstrM2mWifiscanResult + +@brief Wi-Fi Scan Result + + Information corresponding to an AP in the Scan Result list identified by its order (index) in the list. +*/ +typedef struct { + uint8 u8index; + /*!< AP index in the scan result list. + */ + sint8 s8rssi; + /*!< AP signal strength. + */ + uint8 u8AuthType; + /*!< AP authentication type. + */ + uint8 u8ch; + /*!< AP RF channel. + */ + uint8 au8BSSID[6]; + /*!< BSSID of the AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< AP ssid. + */ + uint8 _PAD8_; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiscanResult; + +/*! +@struct \ + tstrM2mWifiStateChanged + +@brief + Wi-Fi Connection State + +@sa + M2M_WIFI_DISCONNECTED, M2M_WIFI_CONNECTED, M2M_WIFI_REQ_CON_STATE_CHANGED,tenuM2mConnChangedErrcode +*/ +typedef struct { + uint8 u8CurrState; + /*!< Current Wi-Fi connection state + */ + uint8 u8ErrCode; + /*!< Error type review tenuM2mConnChangedErrcode + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiStateChanged; + +/*! +@struct \ + tstrM2mPsType + +@brief + Power Save Configuration + +@sa + tenuPowerSaveModes +*/ +typedef struct { + uint8 u8PsType; + /*!< Power save operating mode + */ + uint8 u8BcastEn; + /*!< + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mPsType; + +/*! +@struct \ + tstrM2mSlpReqTime + +@brief + Manual power save request sleep time + +*/ +typedef struct { + /*!< Sleep time in ms + */ + uint32 u32SleepTime; + +} tstrM2mSlpReqTime; + +/*! +@struct \ + tstrM2mLsnInt + +@brief Listen interval + + It is the value of the Wi-Fi STA listen interval for power saving. It is given in units of Beacon period. + Periodically after the listen interval fires, the WINC is wakeup and listen to the beacon and check for any buffered +frames for it from the AP. +*/ +typedef struct { + uint16 u16LsnInt; + /*!< Listen interval in Beacon period count. + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mLsnInt; + +/*! +@struct \ + tstrM2MWifiMonitorModeCtrl + +@brief Wi-Fi Monitor Mode Filter + + This structure sets the filtering criteria for WLAN packets when monitoring mode is enable. + The received packets matching the filtering parameters, are passed directly to the application. +*/ +typedef struct { + uint8 u8ChannelID; + /* !< RF Channel ID. It must use values from tenuM2mScanCh + */ + uint8 u8FrameType; + /*!< It must use values from tenuWifiFrameType. + */ + uint8 u8FrameSubtype; + /*!< It must use values from tenuSubTypes. + */ + uint8 au8SrcMacAddress[6]; + /* ZERO means DO NOT FILTER Source address. + */ + uint8 au8DstMacAddress[6]; + /* ZERO means DO NOT FILTER Destination address. + */ + uint8 au8BSSID[6]; + /* ZERO means DO NOT FILTER BSSID. + */ + uint8 u8EnRecvHdr; + /* + Enable recv the full hder before the payload + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiMonitorModeCtrl; + +/*! +@struct \ + tstrM2MWifiRxPacketInfo + +@brief Wi-Fi RX Frame Header + + The M2M application has the ability to allow Wi-Fi monitoring mode for receiving all Wi-Fi Raw frames matching a +well defined filtering criteria. When a target Wi-Fi packet is received, the header information are extracted and +assigned in this structure. +*/ +typedef struct { + uint8 u8FrameType; + /*!< It must use values from tenuWifiFrameType. + */ + uint8 u8FrameSubtype; + /*!< It must use values from tenuSubTypes. + */ + uint8 u8ServiceClass; + /*!< Service class from Wi-Fi header. + */ + uint8 u8Priority; + /*!< Priority from Wi-Fi header. + */ + uint8 u8HeaderLength; + /*!< Frame Header length. + */ + uint8 u8CipherType; + /*!< Encryption type for the rx packet. + */ + uint8 au8SrcMacAddress[6]; + /* ZERO means DO NOT FILTER Source address. + */ + uint8 au8DstMacAddress[6]; + /* ZERO means DO NOT FILTER Destination address. + */ + uint8 au8BSSID[6]; + /* ZERO means DO NOT FILTER BSSID. + */ + uint16 u16DataLength; + /*!< Data payload length (Header excluded). + */ + uint16 u16FrameLength; + /*!< Total frame length (Header + Data). + */ + uint32 u32DataRateKbps; + /*!< Data Rate in Kbps. + */ + sint8 s8RSSI; + /*!< RSSI. + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiRxPacketInfo; + +/*! +@struct \ + tstrM2MWifiTxPacketInfo + +@brief Wi-Fi TX Packet Info + + The M2M Application has the ability to compose a RAW Wi-Fi frames (under the application responsibility). + When transmitting a Wi-Fi packet, the application must supply the firmware with this structure for sending the +target frame. +*/ +typedef struct { + uint16 u16PacketSize; + /*!< Wlan frame length. + */ + uint16 u16HeaderLength; + /*!< Wlan frame header length. + */ +} tstrM2MWifiTxPacketInfo; + +/*! + @struct \ + tstrM2MP2PConnect + + @brief + Set the device to operate in the Wi-Fi Direct (P2P) mode. +*/ +typedef struct { + uint8 u8ListenChannel; + /*!< P2P Listen Channel (1, 6 or 11) + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MP2PConnect; + +/*! +@struct \ + tstrM2MAPConfig + +@brief AP Configuration + + This structure holds the configuration parameters for the M2M AP mode. It should be set by the application when + it requests to enable the M2M AP operation mode. The M2M AP mode currently supports only WEP security (with + the NO Security option available of course). +*/ +typedef struct { + /*!< + Configuration parameters for the WiFi AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< AP SSID + */ + uint8 u8ListenChannel; + /*!< Wi-Fi RF Channel which the AP will operate on + */ + uint8 u8KeyIndx; + /*!< Wep key Index + */ + uint8 u8KeySz; + /*!< Wep/WPA key Size + */ + uint8 au8WepKey[WEP_104_KEY_STRING_SIZE + 1]; + /*!< Wep key + */ + uint8 u8SecType; + /*!< Security type: Open or WEP or WPA in the current implementation + */ + uint8 u8SsidHide; + /*!< SSID Status "Hidden(1)/Visible(0)" + */ + uint8 au8DHCPServerIP[4]; + /*!< Ap IP server address + */ + uint8 au8Key[M2M_MAX_PSK_LEN]; + /*!< WPA key + */ + uint8 __PAD24__[2]; + /*!< Padding bytes for forcing alignment + */ +} tstrM2MAPConfig; + +/*! +@struct \ + tstrM2mServerInit + +@brief + PS Server initialization. +*/ +typedef struct { + uint8 u8Channel; + /*!< Server Listen channel + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mServerInit; + +/*! +@struct \ + tstrM2mClientState + +@brief + PS Client State. +*/ +typedef struct { + uint8 u8State; + /*!< PS Client State + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mClientState; + +/*! +@struct \ + tstrM2Mservercmd + +@brief + PS Server CMD +*/ +typedef struct { + uint8 u8cmd; + /*!< PS Server Cmd + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2Mservercmd; + +/*! +@struct \ + tstrM2mSetMacAddress + +@brief + Sets the MAC address from application. The WINC load the mac address from the effuse by default to the WINC +configuration memory, but that function is used to let the application overwrite the configuration memory with the mac +address from the host. + +@note + It's recommended to call this only once before calling connect request and after the m2m_wifi_init +*/ +typedef struct { + uint8 au8Mac[6]; + /*!< MAC address array + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mSetMacAddress; + +/*! +@struct \ + tstrM2MDeviceNameConfig + +@brief Device name + + It is assigned by the application. It is used mainly for Wi-Fi Direct device + discovery and WPS device information. +*/ +typedef struct { + uint8 au8DeviceName[M2M_DEVICE_NAME_MAX]; + /*!< NULL terminated device name + */ +} tstrM2MDeviceNameConfig; + +/*! +@struct \ + tstrM2MIPConfig + +@brief + IP configuration (static/DHCP). The same structure is used for DCHP callback as well as static IP configuration. + +@note + All member IP addresses are expressed in Network Byte Order (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + */ +typedef struct { + uint32 u32StaticIP; + /*!< If DHCP callback, this is the IP address obtained from the DHCP. In static IP config, this is the assigned to + * the device from the application. + */ + uint32 u32Gateway; + /*!< IP of the default internet gateway. + */ + uint32 u32DNS; + /*!< IP for the DNS server. + */ + uint32 u32AlternateDNS; + /*!< IP for the secondary DNS server (if any). Must set to zero if not provided in static IP configuration from the + * application. + */ + uint32 u32SubnetMask; + /*!< Subnet mask for the local area network. + */ + uint32 u32DhcpLeaseTime; + /*!< DHCP Lease Time in sec. This field is is ignored in static IP configuration. + */ +} tstrM2MIPConfig; + +/*! +@struct \ + tstrM2mIpRsvdPkt + +@brief + Received Packet Size and Data Offset + + */ +typedef struct { + uint16 u16PktSz; + uint16 u16PktOffset; +} tstrM2mIpRsvdPkt; + +/*! +@struct \ + tstrM2MProvisionModeConfig + +@brief + M2M Provisioning Mode Configuration + */ + +typedef struct { + tstrM2MAPConfig strApConfig; + /*!< + Configuration parameters for the WiFi AP. + */ + char acHttpServerDomainName[64]; + /*!< + The device domain name for HTTP provisioning. + */ + uint8 u8EnableRedirect; + /*!< + A flag to enable/disable HTTP redirect feature for the HTTP Provisioning server. If the Redirect is enabled, + all HTTP traffic (http://URL) from the device associated with WINC AP will be redirected to the HTTP + Provisioning Web page. + - 0 : Disable HTTP Redirect. + - 1 : Enable HTTP Redirect. + */ + uint8 __PAD24__[3]; +} tstrM2MProvisionModeConfig; + +/*! +@struct \ + tstrM2MProvisionInfo + +@brief + M2M Provisioning Information obtained from the HTTP Provisioning server. + */ +typedef struct { + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< + Provisioned SSID. + */ + uint8 au8Password[M2M_MAX_PSK_LEN]; + /*!< + Provisioned Password. + */ + uint8 u8SecType; + /*!< + Wifi Security type. + */ + uint8 u8Status; + /*!< + Provisioning status. It must be checked before reading the provisioning information. It may be + - M2M_SUCCESS : Provision successful. + - M2M_FAIL : Provision Failed. + */ +} tstrM2MProvisionInfo; + +/*! +@struct \ + tstrM2MConnInfo + +@brief + M2M Provisioning Information obtained from the HTTP Provisioning server. + */ +typedef struct { + char acSSID[M2M_MAX_SSID_LEN]; + /*!< AP connection SSID name */ + uint8 u8SecType; + /*!< Security type */ + uint8 au8IPAddr[4]; + /*!< Connection IP address */ + uint8 au8MACAddress[6]; + /*!< MAC address of the peer Wi-Fi station */ + sint8 s8RSSI; + /*!< Connection RSSI signal */ + uint8 u8CurrChannel; + /*!< Wi-Fi RF channel number 1,2,... 14. */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment */ +} tstrM2MConnInfo; + +/*! +@struct \ + tstrOtaInitHdr + +@brief + OTA Image Header + */ + +typedef struct { + uint32 u32OtaMagicValue; + /*!< Magic value kept in the OTA image after the + sha256 Digest buffer to define the Start of OTA Header */ + uint32 u32OtaPayloadSzie; + /*!< + The Total OTA image payload size, include the sha256 key size + */ + +} tstrOtaInitHdr; + +/*! +@struct \ + tstrOtaControlSec + +@brief + Control section structure is used to define the working image and + the validity of the roll-back image and its offset, also both firmware versions is kept in that structure. + */ + +typedef struct { + uint32 u32OtaMagicValue; + /*!< + Magic value used to ensure the structure is valid or not + */ + uint32 u32OtaFormatVersion; + /*!< + NA NA NA Flash version cs struct version + 00 00 00 00 00 + Control structure format version, the value will be incremented in case of structure changed or updated + */ + uint32 u32OtaSequenceNumber; + /*!< + Sequence number is used while update the control structure to keep track of how many times that section updated + */ + uint32 u32OtaLastCheckTime; + /*!< + Last time OTA check for update + */ + uint32 u32OtaCurrentworkingImagOffset; + /*!< + Current working offset in flash + */ + uint32 u32OtaCurrentworkingImagFirmwareVer; + /*!< + current working image version ex 18.0.1 + */ + uint32 u32OtaRollbackImageOffset; + /*!< + Roll-back image offset in flash + */ + uint32 u32OtaRollbackImageValidStatus; + /*!< + roll-back image valid status + */ + uint32 u32OtaRollbackImagFirmwareVer; + /*!< + Roll-back image version (ex 18.0.3) + */ + uint32 u32OtaCortusAppWorkingOffset; + /*!< + cortus app working offset in flash + */ + uint32 u32OtaCortusAppWorkingValidSts; + /*!< + Working Cortus app valid status + */ + uint32 u32OtaCortusAppWorkingVer; + /*!< + Working cortus app version (ex 18.0.3) + */ + uint32 u32OtaCortusAppRollbackOffset; + /*!< + cortus app rollback offset in flash + */ + uint32 u32OtaCortusAppRollbackValidSts; + /*!< + roll-back cortus app valid status + */ + uint32 u32OtaCortusAppRollbackVer; + /*!< + Roll-back cortus app version (ex 18.0.3) + */ + uint32 u32OtaControlSecCrc; + /*!< + CRC for the control structure to ensure validity + */ +} tstrOtaControlSec; + +/*! +@enum \ + tenuOtaUpdateStatus + +@brief + OTA return status +*/ +typedef enum { + OTA_STATUS_SUCSESS = 0, + /*!< OTA Success with not errors. */ + OTA_STATUS_FAIL = 1, + /*!< OTA generic fail. */ + OTA_STATUS_INVAILD_ARG = 2, + /*!< Invalid or malformed download URL. */ + OTA_STATUS_INVAILD_RB_IMAGE = 3, + /*!< Invalid rollback image. */ + OTA_STATUS_INVAILD_FLASH_SIZE = 4, + /*!< Flash size on device is not enough for OTA. */ + OTA_STATUS_AlREADY_ENABLED = 5, + /*!< An OTA operation is already enabled. */ + OTA_STATUS_UPDATE_INPROGRESS = 6, + /*!< An OTA operation update is in progress */ + OTA_STATUS_IMAGE_VERIF_FAILED = 7, + /*!< OTA Verfication failed */ + OTA_STATUS_CONNECTION_ERROR = 8, + /*!< OTA connection error */ + OTA_STATUS_SERVER_ERROR = 9, + /*!< OTA server Error (file not found or else ...) */ + OTA_STATUS_ABORTED = 10 + /*!< OTA download has been aborted by the application. */ +} tenuOtaUpdateStatus; +/*! +@enum \ + tenuOtaUpdateStatusType + +@brief + OTA update Status type +*/ +typedef enum { + + DL_STATUS = 1, + /*!< Download OTA file status + */ + SW_STATUS = 2, + /*!< Switching to the upgrade firmware status + */ + RB_STATUS = 3, + /*!< Roll-back status + */ + AB_STATUS = 4 + /*!< Abort status + */ +} tenuOtaUpdateStatusType; + +/*! +@struct \ + tstrOtaUpdateStatusResp + +@brief + OTA Update Information + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint8 u8OtaUpdateStatusType; + /*!< + Status type tenuOtaUpdateStatusType + */ + uint8 u8OtaUpdateStatus; + /*!< + OTA_SUCCESS + OTA_ERR_WORKING_IMAGE_LOAD_FAIL + OTA_ERR_INVAILD_CONTROL_SEC + M2M_ERR_OTA_SWITCH_FAIL + M2M_ERR_OTA_START_UPDATE_FAIL + M2M_ERR_OTA_ROLLBACK_FAIL + M2M_ERR_OTA_INVAILD_FLASH_SIZE + M2M_ERR_OTA_INVAILD_ARG + */ + uint8 _PAD16_[2]; +} tstrOtaUpdateStatusResp; + +/*! +@struct \ + tstrOtaUpdateInfo + +@brief + OTA Update Information + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint32 u8NcfUpgradeVersion; + /*!< NCF OTA Upgrade Version + */ + uint32 u8NcfCurrentVersion; + /*!< NCF OTA Current firmware version + */ + uint32 u8NcdUpgradeVersion; + /*!< NCD (host) upgraded version (if the u8NcdRequiredUpgrade == true) + */ + uint8 u8NcdRequiredUpgrade; + /*!< NCD Required upgrade to the above version + */ + uint8 u8DownloadUrlOffset; + /*!< Download URL offset in the received packet + */ + uint8 u8DownloadUrlSize; + /*!< Download URL size in the received packet + */ + uint8 __PAD8__; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrOtaUpdateInfo; + +/*! +@struct \ + tstrSystemTime + +@brief + Used for time storage. +*/ +typedef struct { + uint16 u16Year; + uint8 u8Month; + uint8 u8Day; + uint8 u8Hour; + uint8 u8Minute; + uint8 u8Second; + uint8 __PAD8__; +} tstrSystemTime; + +/*! +@struct \ + tstrM2MMulticastMac + +@brief + M2M add/remove multi-cast mac address + */ +typedef struct { + uint8 au8macaddress[M2M_MAC_ADDRES_LEN]; + /*!< + Mac address needed to be added or removed from filter. + */ + uint8 u8AddRemove; + /*!< + set by 1 to add or 0 to remove from filter. + */ + uint8 __PAD8__; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MMulticastMac; + +/*! +@struct \ + tstrPrng + +@brief + M2M Request PRNG + */ +typedef struct { + /*!< + return buffer address + */ + uint8 *pu8RngBuff; + /*!< + PRNG size requested + */ + uint16 u16PrngSize; + /*!< + PRNG pads + */ + uint8 __PAD16__[2]; +} tstrPrng; + +/* + * TLS certificate revocation list + * Typedefs common between fw and host + */ + +/*! +@struct \ + tstrTlsCrlEntry + +@brief + Certificate data for inclusion in a revocation list (CRL) +*/ +typedef struct { + uint8 u8DataLen; + /*!< + Length of certificate data (maximum possible is @ref TLS_CRL_DATA_MAX_LEN) + */ + uint8 au8Data[TLS_CRL_DATA_MAX_LEN]; + /*!< + Certificate data + */ + uint8 __PAD24__[3]; + /*!< + Padding bytes for forcing 4-byte alignment + */ +} tstrTlsCrlEntry; + +/*! +@struct \ + tstrTlsCrlInfo + +@brief + Certificate revocation list details +*/ +typedef struct { + uint8 u8CrlType; + /*!< + Type of certificate data contained in list + */ + uint8 u8Rsv1; + /*!< + Reserved for future use + */ + uint8 u8Rsv2; + /*!< + Reserved for future use + */ + uint8 u8Rsv3; + /*!< + Reserved for future use + */ + tstrTlsCrlEntry astrTlsCrl[TLS_CRL_MAX_ENTRIES]; + /*!< + List entries + */ +} tstrTlsCrlInfo; + +/*! +@enum\ + tenuSslCertExpSettings + +@brief SSL Certificate Expiry Validation Options +*/ +typedef enum { + SSL_CERT_EXP_CHECK_DISABLE, + /*!< + ALWAYS OFF. + Ignore certificate expiration date validation. If a certificate is + expired or there is no configured system time, the SSL connection SUCCEEDs. + */ + SSL_CERT_EXP_CHECK_ENABLE, + /*!< + ALWAYS ON. + Validate certificate expiration date. If a certificate is expired or + there is no configured system time, the SSL connection FAILs. + */ + SSL_CERT_EXP_CHECK_EN_IF_SYS_TIME + /*!< + CONDITIONAL VALIDATION (Default setting at startup). + Validate the certificate expiration date only if there is a configured system time. + If there is no configured system time, the certificate expiration is bypassed and the + SSL connection SUCCEEDs. + */ +} tenuSslCertExpSettings; + +/*! +@struct \ + tstrTlsSrvSecFileEntry + +@brief + This struct contains a TLS certificate. + */ +typedef struct { + char acFileName[TLS_FILE_NAME_MAX]; + /*!< Name of the certificate. */ + uint32 u32FileSize; + /*!< Size of the certificate. */ + uint32 u32FileAddr; + /*!< Error Code. */ +} tstrTlsSrvSecFileEntry; + +/*! +@struct \ + tstrTlsSrvSecHdr + +@brief + This struct contains a set of TLS certificates. + */ +typedef struct { + uint8 au8SecStartPattern[TLS_SRV_SEC_START_PATTERN_LEN]; + /*!< Start pattern. */ + uint32 u32nEntries; + /*!< Number of certificates stored in the struct. */ + uint32 u32NextWriteAddr; + /*!< TLS Certificates. */ + tstrTlsSrvSecFileEntry astrEntries[TLS_SRV_SEC_MAX_FILES]; +} tstrTlsSrvSecHdr; + +typedef struct { + uint32 u32CsBMP; +} tstrSslSetActiveCsList; + +/*! +@enum\ + tenuWlanTxRate + +@brief All possible supported 802.11 WLAN TX rates. +*/ +typedef enum { + TX_RATE_AUTO = 0xFF, /*!< Automatic rate selection */ + TX_RATE_LOWEST = 0xFE, /*!< Force the lowest possible data rate for longest range. */ + TX_RATE_1 = 0x00, /* 1 Mbps */ + TX_RATE_2 = 0x01, /* 2 Mbps */ + TX_RATE_5_5 = 0x02, /* 5 Mbps */ + TX_RATE_11 = 0x0B, /* 11 Mbps */ + TX_RATE_6 = 0x80, /* 6 Mbps */ + TX_RATE_9 = 0x0F, /* 9 Mbps */ + TX_RATE_12 = 0x03, /* 12 Mbps */ + TX_RATE_18 = 0x0A, /* 18 Mbps */ + TX_RATE_24 = 0x81, /* 24 Mbps */ + TX_RATE_36 = 0x0E, /* 36 Mbps */ + TX_RATE_48 = 0x82, /* 48 Mbps */ + TX_RATE_54 = 0x09, /* 54 Mbps */ + TX_RATE_MCS_0 = 0x83, /* MCS-0: 6.5 Mbps */ + TX_RATE_MCS_1 = 0x0D, /* MCS-1: 13 Mbps */ + TX_RATE_MCS_2 = 0x84, /* MCS-2: 19.5 Mbps */ + TX_RATE_MCS_3 = 0x08, /* MCS-3: 26 Mbps */ + TX_RATE_MCS_4 = 0x85, /* MCS-4: 39 Mbps */ + TX_RATE_MCS_5 = 0x0C, /* MCS-5: 52 Mbps */ + TX_RATE_MCS_6 = 0x86, /* MCS-6: 58.5 Mbps */ + TX_RATE_MCS_7 = 0x87, /* MCS-7: 65 Mbps */ +} tenuWlanTxRate; + +/* Commonly used initalizers for rate lists for B, G, N or mixed modes for iteration on rates. */ +#define WLAN_11B_RATES_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_11 \ + } + +#define WLAN_11G_RATES_INITIALIZER \ + { \ + TX_RATE_6, TX_RATE_9, TX_RATE_12, TX_RATE_18, TX_RATE_24, TX_RATE_36, TX_RATE_48, TX_RATE_54 \ + } + +#define WLAN_11N_RATES_INITIALIZER \ + { \ + TX_RATE_MCS_0, TX_RATE_MCS_1, TX_RATE_MCS_2, TX_RATE_MCS_3, TX_RATE_MCS_4, TX_RATE_MCS_5, TX_RATE_MCS_6, \ + TX_RATE_MCS_7 \ + } + +#define WLAN_11BGN_RATES_ASC_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_6, TX_RATE_MCS_0, TX_RATE_9, TX_RATE_11, TX_RATE_12, TX_RATE_MCS_1, \ + TX_RATE_18, TX_RATE_MCS_2, TX_RATE_24, TX_RATE_MCS_3, TX_RATE_36, TX_RATE_MCS_4, TX_RATE_48, \ + TX_RATE_MCS_5, TX_RATE_54, TX_RATE_MCS_6, TX_RATE_MCS_7, \ + } + +#define WLAN_11BG_RATES_ASC_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_6, TX_RATE_9, TX_RATE_11, TX_RATE_12, TX_RATE_18, TX_RATE_24, \ + TX_RATE_36, TX_RATE_48, TX_RATE_54 \ + } + +/*! +@struct \ + tstrConfAutoRate + +@brief + Auto TX rate selection parameters passed to m2m_wifi_conf_auto_rate. +*/ +typedef struct { + uint16 u16ArMaxRecoveryFailThreshold; + /*!< + To stabilize the TX rate and avoid oscillation, the algorithm will not attempt to + push the rate up again after a failed attempt to push the rate up. + An attempt to push the rate up is considered failed if the next rate suffers from + very high retransmission. In this case, WINC will not attempt again until a + duration of time is elased to keep the TX rate stable. + The min duration is (u16ArMinRecoveryFailThreshold) seconds and doubles + on every failed attempt. The doubling continues until the duration is + (u16ArMaxRecoveryFailThreshold) max. + + Increasing u16ArMaxRecoveryFailThreshold this will cause the TX rate to be + stable over a long period of time with fewer attempts to increase the data rate. + However, increasing this to a very large value will deter the algorithm from + attempting to increase the rate if, for instance, the wireless conditions befores better. + + Default is 5 seconds. + */ + uint16 u16ArMinRecoveryFailThreshold; + /*!< + To stabilize the TX rate and avoid oscillation, the algorithm will not attempt to + push the rate up again after a failed attempt to push the rate up. + An attempt to push the rate up is considered failed if the next rate suffers from + very high retransmission. In this case, WINC will not attempt again until a + duration of time is elased to keep the TX rate stable. + The min duration is (u16ArMinRecoveryFailThreshold) seconds and doubles + on every failed attempt. The doubling continues until the duration is + (u16ArMaxRecoveryFailThreshold) max. + + Default is 1 second. + */ + + tenuWlanTxRate enuWlanTxRate; + /*!< + The TX data rate setlected as enumerated in tenuWlanTxRate + Default is TX_RATE_AUTO. + + WINC shall override the rate provided through this API if it not supported by the peer WLAN device (STA/AP). + For instance, if the TX_RATE_MCS_0 is requested while the connection is to a BG only AP, WINC shall + elect the nearest BG data rate to the requested rate. In this example, it will be TX_RATE_9. + */ + tenuWlanTxRate enuArInitialRateSel; + /*!< + Configures the initial WLAN TX rate used right after association. + This is the starting point for auto rate algorithm. + The algorithm tunes the rate up or down based on the wireless + medium condition if enuWlanTxRate is set to TX_RATE_AUTO. + If enuWlanTxRate is set to any value other than TX_RATE_AUTO, then + u8ArInitialRateSel is ignored. + + By default WINC selects the best initial rate based on the recevie + signal level from the WLAN peer. For applications that favor range + right after association, TX_RATE_LOWEST can bs used. + */ + uint8 u8ArEnoughTxThreshold; + /*!< + Configures the minimum number of transmitted packets per second for auto + rate selection algorithm to start to make rate up or down decisions. + Default is 10. + */ + uint8 u8ArSuccessTXThreshold; + /*!< + Configures the threshold for rate up. Rate goes up if number of + WLAN TX retries is less than (1/u8ArSuccessTXThreshold) of the + number of packet transmitted within one second. + This can be tuned to speed up or slow down the rate at which the algorithm + moves the WLAN TX rate up. Default value is 5. + */ + uint8 u8ArFailTxThreshold; + /*!< + Configures the threshold for rate down. Rate goes down if number of + WLAN TX retries is greater than (1/u8ArFailTxThreshold) of the + number of packet transmitted within one second. + This can be tuned to speed up or slow down the rate at which the algorithm + moves the WLAN TX rate down. Default value is 3. + */ + uint8 __PAD24__[3]; + /*!< Pad bytes for forcing 4-byte alignment + */ +} tstrConfAutoRate; + +#define DEFAULT_CONF_AR_INITIALIZER \ + { \ + 5, 1, TX_RATE_AUTO, TX_RATE_AUTO, 10, 5, 3 \ + } + +/**@}*/ + +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/include/m2m_wifi.h b/AudioConsole.X/Source/winc1500/driver/include/m2m_wifi.h new file mode 100644 index 0000000..282bef3 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/include/m2m_wifi.h @@ -0,0 +1,3000 @@ +/** + * + * \file + * + * \brief WINC WLAN Application Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_H__ +#define __M2M_WIFI_H__ + +/** \defgroup m2m_wifi WLAN + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" + +#ifdef CONF_MGMT + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup WlanEnums DataTypes + * @ingroup m2m_wifi + * @{*/ +/*! +@enum \ + tenuWifiFrameType + +@brief + Enumeration for Wi-Fi MAC frame type codes (2-bit) + The following types are used to identify the type of frame sent or received. + Each frame type constitutes a number of frame subtypes as defined in @ref tenuSubTypes to specify the exact type of +frame. Values are defined as per the IEEE 802.11 standard. + +@remarks + The following frame types are useful for advanced user usage when monitoring mode is used (defining @ref CONF_MGMT) + and the user application requires to monitor the frame transmission and reception. +@see + tenuSubTypes +*/ +typedef enum { + MANAGEMENT = 0x00, + /*!< Wi-Fi Management frame (Probe Req/Resp, Beacon, Association Req/Resp ...etc). + */ + CONTROL = 0x04, + /*!< Wi-Fi Control frame (eg. ACK frame). + */ + DATA_BASICTYPE = 0x08, + /*!< Wi-Fi Data frame. + */ + RESERVED = 0x0C, + + M2M_WIFI_FRAME_TYPE_ANY = 0xFF + /*!< Set monitor mode to receive any of the frames types + */ +} tenuWifiFrameType; + +/*! +@enum \ + tenuSubTypes + +@brief + Enumeration for Wi-Fi MAC Frame subtype code (6-bit). + The frame subtypes fall into one of the three frame type groups as defined in @ref tenuWifiFrameType + (MANAGEMENT, CONTROL & DATA). + Values are defined as per the IEEE 802.11 standard. +@remarks + The following sub-frame types are useful for advanced user usage when @ref CONF_MGMT is defined + and the application developer requires to monitor the frame transmission and reception. +@see + tenuWifiFrameType + tstrM2MWifiMonitorModeCtrl +*/ +typedef enum { + /*!< Sub-Types related to Management Sub-Types */ + ASSOC_REQ = 0x00, + ASSOC_RSP = 0x10, + REASSOC_REQ = 0x20, + REASSOC_RSP = 0x30, + PROBE_REQ = 0x40, + PROBE_RSP = 0x50, + BEACON = 0x80, + ATIM = 0x90, + DISASOC = 0xA0, + AUTH = 0xB0, + DEAUTH = 0xC0, + ACTION = 0xD0, + /**@{*/ + /* Sub-Types related to Control */ + PS_POLL = 0xA4, + RTS = 0xB4, + CTS = 0xC4, + ACK = 0xD4, + CFEND = 0xE4, + CFEND_ACK = 0xF4, + BLOCKACK_REQ = 0x84, + BLOCKACK = 0x94, + /**@{*/ + /* Sub-Types related to Data */ + DATA = 0x08, + DATA_ACK = 0x18, + DATA_POLL = 0x28, + DATA_POLL_ACK = 0x38, + NULL_FRAME = 0x48, + CFACK = 0x58, + CFPOLL = 0x68, + CFPOLL_ACK = 0x78, + QOS_DATA = 0x88, + QOS_DATA_ACK = 0x98, + QOS_DATA_POLL = 0xA8, + QOS_DATA_POLL_ACK = 0xB8, + QOS_NULL_FRAME = 0xC8, + QOS_CFPOLL = 0xE8, + QOS_CFPOLL_ACK = 0xF8, + M2M_WIFI_FRAME_SUB_TYPE_ANY = 0xFF + /*!< Set monitor mode to receive any of the frames types + */ +} tenuSubTypes; + +/*! +@enum \ + tenuInfoElementId + +@brief + Enumeration for the Wi-Fi Information Element(IE) IDs, which indicates the specific type of IEs. + IEs are management frame information included in management frames. + Values are defined as per the IEEE 802.11 standard. + +*/ +typedef enum { + ISSID = 0, + /*!< Service Set Identifier (SSID) + */ + ISUPRATES = 1, + /*!< Supported Rates + */ + IFHPARMS = 2, + /*!< FH parameter set + */ + IDSPARMS = 3, + /*!< DS parameter set + */ + ICFPARMS = 4, + /*!< CF parameter set + */ + ITIM = 5, + /*!< Traffic Information Map + */ + IIBPARMS = 6, + /*!< IBSS parameter set + */ + ICOUNTRY = 7, + /*!< Country element. + */ + IEDCAPARAMS = 12, + /*!< EDCA parameter set + */ + ITSPEC = 13, + /*!< Traffic Specification + */ + ITCLAS = 14, + /*!< Traffic Classification + */ + ISCHED = 15, + /*!< Schedule. + */ + ICTEXT = 16, + /*!< Challenge Text + */ + IPOWERCONSTRAINT = 32, + /*!< Power Constraint. + */ + IPOWERCAPABILITY = 33, + /*!< Power Capability + */ + ITPCREQUEST = 34, + /*!< TPC Request + */ + ITPCREPORT = 35, + /*!< TPC Report + */ + ISUPCHANNEL = 36, + /* Supported channel list + */ + ICHSWANNOUNC = 37, + /*!< Channel Switch Announcement + */ + IMEASUREMENTREQUEST = 38, + /*!< Measurement request + */ + IMEASUREMENTREPORT = 39, + /*!< Measurement report + */ + IQUIET = 40, + /*!< Quiet element Info + */ + IIBSSDFS = 41, + /*!< IBSS DFS + */ + IERPINFO = 42, + /*!< ERP Information + */ + ITSDELAY = 43, + /*!< TS Delay + */ + ITCLASPROCESS = 44, + /*!< TCLAS Processing + */ + IHTCAP = 45, + /*!< HT Capabilities + */ + IQOSCAP = 46, + /*!< QoS Capability + */ + IRSNELEMENT = 48, + /*!< RSN Information Element + */ + IEXSUPRATES = 50, + /*!< Extended Supported Rates + */ + IEXCHSWANNOUNC = 60, + /*!< Extended Ch Switch Announcement + */ + IHTOPERATION = 61, + /*!< HT Information + */ + ISECCHOFF = 62, + /*!< Secondary Channel Offset + */ + I2040COEX = 72, + /*!< 20/40 Coexistence IE + */ + I2040INTOLCHREPORT = 73, + /*!< 20/40 Intolerant channel report + */ + IOBSSSCAN = 74, + /*!< OBSS Scan parameters + */ + IEXTCAP = 127, + /*!< Extended capability + */ + IWMM = 221, + /*!< WMM parameters + */ + IWPAELEMENT = 221 + /*!< WPA Information Element + */ +} tenuInfoElementId; + +/*! +@struct \ + tenuWifiCapability + +@brief + Enumeration for capability Information field bit. + The value of the capability information field from the 802.11 management frames received by the wireless LAN +interface. Defining the capabilities of the Wi-Fi system. Values are defined as per the IEEE 802.11 standard. + +@details + Capabilities:- + ESS/IBSS : Defines whether a frame is coming from an AP or not. + POLLABLE : CF Poll-able + POLLREQ : Request to be polled + PRIVACY : WEP encryption supported + SHORTPREAMBLE : Short Preamble is supported + SHORTSLOT : Short Slot is supported + PBCC :PBCC + CHANNELAGILITY :Channel Agility + SPECTRUM_MGMT :Spectrum Management + DSSS_OFDM : DSSS-OFDM +*/ +typedef enum { + ESS = 0x01, + /*!< ESS capability + */ + IBSS = 0x02, + /*!< IBSS mode + */ + POLLABLE = 0x04, + /*!< CF Pollable + */ + POLLREQ = 0x08, + /*!< Request to be polled + */ + PRIVACY = 0x10, + /*!< WEP encryption supported + */ + SHORTPREAMBLE = 0x20, + /*!< Short Preamble is supported + */ + SHORTSLOT = 0x400, + /*!< Short Slot is supported + */ + PBCC = 0x40, + /*!< PBCC + */ + CHANNELAGILITY = 0x80, + /*!< Channel Agility + */ + SPECTRUM_MGMT = 0x100, + /*!< Spectrum Management + */ + DSSS_OFDM = 0x2000 + /*!< DSSS-OFDM + */ +} tenuWifiCapability; + +#endif + +/*! +@typedef \ + tpfAppWifiCb + +@brief + Wi-Fi's main callback function handler, for handling the M2M_WIFI events received on the Wi-Fi +interface. Such notifications are received in response to Wi-Fi/P2P operations such as @ref m2m_wifi_request_scan, + @ref m2m_wifi_connect. + Wi-Fi/P2P operations are implemented in an asynchronous mode, and all incoming information/status + are to be handled through this callback function when the corresponding notification is received. + Applications are expected to assign this wi-fi callback function by calling @ref m2m_wifi_init +@param [in] u8MsgType + Type of notifications. Possible types are: + /ref M2M_WIFI_RESP_CON_STATE_CHANGED + /ref M2M_WIFI_RESP_CONN_INFO + /ref M2M_WIFI_REQ_DHCP_CONF + /ref M2M_WIFI_REQ_WPS + /ref M2M_WIFI_RESP_IP_CONFLICT + /ref M2M_WIFI_RESP_SCAN_DONE + /ref M2M_WIFI_RESP_SCAN_RESULT + /ref M2M_WIFI_RESP_CURRENT_RSSI + /ref M2M_WIFI_RESP_CLIENT_INFO + /ref M2M_WIFI_RESP_PROVISION_INFO + /ref M2M_WIFI_RESP_DEFAULT_CONNECT + + In case Ethernet/Bypass mode is defined : + @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET + + In case monitoring mode is used: + @ref M2M_WIFI_RESP_WIFI_RX_PACKET + +@param [in] pvMsg + A pointer to a buffer containing the notification parameters (if any). It should be + casted to the correct data type corresponding to the notification type. + +@see + tstrM2mWifiStateChanged + tstrM2MWPSInfo + tstrM2mScanDone + tstrM2mWifiscanResult +*/ +typedef void (*tpfAppWifiCb)(uint8 u8MsgType, void *pvMsg); + +/*! +@typedef \ + tpfAppEthCb + +@brief + ETHERNET (bypass mode) notification callback function receiving Bypass mode events as defined in + the Wi-Fi responses enumeration @ref tenuM2mStaCmd. + +@param [in] u8MsgType + Type of notification. Possible types are: + - [M2M_WIFI_RESP_ETHERNET_RX_PACKET](@ref M2M_WIFI_RESP_ETHERNET_RX_PACKET) + +@param [in] pvMsg + A pointer to a buffer containing the notification parameters (if any). It should be + casted to the correct data type corresponding to the notification type. + For example, it could be a pointer to the buffer holding the received frame in case of @ref +M2M_WIFI_RESP_ETHERNET_RX_PACKET event. + +@param [in] pvControlBuf + A pointer to control buffer describing the accompanied message. + To be casted to @ref tstrM2mIpCtrlBuf in case of @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET event. + +@warning + Make sure that the application defines @ref ETH_MODE. + +@see + m2m_wifi_init + +*/ +typedef void (*tpfAppEthCb)(uint8 u8MsgType, void *pvMsg, void *pvCtrlBuf); + +/*! +@typedef \ + tpfAppMonCb + +@brief + Wi-Fi monitoring mode callback function. This function delivers all received wi-Fi packets through the Wi-Fi +interface. Applications requiring to operate in the monitoring should call the asynchronous function +m2m_wifi_enable_monitoring_mode and expect to receive the Wi-Fi packets through this callback function, when the event +is received. To disable the monitoring mode a call to @ref m2m_wifi_disable_monitoring_mode should be made. +@param [in] pstrWifiRxPacket + Pointer to a structure holding the Wi-Fi packet header parameters. + +@param [in] pu8Payload + Pointer to the buffer holding the Wi-Fi packet payload information required by the application starting +from the defined OFFSET by the application (when calling m2m_wifi_enable_monitoring_mode). Could hold a value of NULL, +if the application does not need any data from the payload. + +@param [in] u16PayloadSize + The size of the payload in bytes. + +@see + m2m_wifi_enable_monitoring_mode,m2m_wifi_init + +@warning + u16PayloadSize should not exceed the buffer size given through m2m_wifi_enable_monitoring_mode. + +*/ +typedef void (*tpfAppMonCb)(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize); + +/** +@struct \ + tstrEthInitParam + +@brief + Structure to hold Ethernet interface parameters. + Structure is to be defined and have its attributes set,based on the application's functionality before + a call is made to initialize the Wi-Fi operations by calling the @ref m2m_wifi_init function. + This structure is part of the Wi-Fi configuration structure @ref tstrWifiInitParam. + Applications shouldn't need to define this structure, if the bypass mode is not defined. + +@see + tpfAppEthCb + tpfAppWifiCb + m2m_wifi_init + +@warning + Make sure that application defines @ref ETH_MODE before using @ref tstrEthInitParam. + +*/ +typedef struct { + tpfAppWifiCb pfAppWifiCb; + /*!< + Callback for wifi notifications. + */ + tpfAppEthCb pfAppEthCb; + /*!< + Callback for Ethernet interface. + */ + uint8 *au8ethRcvBuf; + /*!< + Pointer to Receive Buffer of Ethernet Packet + */ + uint16 u16ethRcvBufSize; + /*!< + Size of Receive Buffer for Ethernet Packet + */ + uint8 u8EthernetEnable; + /*!< + Enable Ethernet mode flag + */ + uint8 __PAD8__; + /*!< + Padding + */ +} tstrEthInitParam; +/*! +@struct \ + tstrM2mIpCtrlBuf + +@brief + Structure holding the incoming buffer's data size information, indicating the data size of the buffer and the +remaining buffer's data size . The data of the buffer which holds the packet sent to the host when in the bypass mode, +is placed in the @ref tstrEthInitParam structure in the + @ref au8ethRcvBuf attribute. This following information is retrieved in the host when an event @ref +M2M_WIFI_RESP_ETHERNET_RX_PACKET is received in the Wi-Fi callback function @ref tpfAppWifiCb. + + The application is expected to use this structure's information to determine if there is still incoming data to be +received from the firmware. + + @see + tpfAppEthCb + tstrEthInitParam + + @warning + Make sure that ETHERNET/bypass mode is defined before using @ref tstrM2mIpCtrlBuf + + */ +typedef struct { + uint16 u16DataSize; + /*!< + Size of the received data in bytes. + */ + uint16 u16RemainigDataSize; + /*!< + Size of the remaining data bytes to be delivered to host. + */ +} tstrM2mIpCtrlBuf; + +/** +@struct \ + tstrWifiInitParam + +@brief + Structure, holding the Wi-fi configuration attributes such as the wi-fi callback , monitoring mode callback and +Ethernet parameter initialization structure. Such configuration parameters are required to be set before calling the +wi-fi initialization function @ref m2m_wifi_init. + @ref pfAppWifiCb attribute must be set to handle the wi-fi callback operations. + @ref pfAppMonCb attribute, is optional based on whether the application requires the monitoring mode configuration, +and can there not be set before the initialization. + @ref strEthInitParam structure, is another optional configuration based on whether the bypass mode is set. + + @see + tpfAppEthCb + tpfAppMonCb + tstrEthInitParam + +*/ +typedef struct { + tpfAppWifiCb pfAppWifiCb; + /*!< + Callback for Wi-Fi notifications. + */ + tpfAppMonCb pfAppMonCb; + /*!< + Callback for monitoring interface. + */ + tstrEthInitParam strEthInitParam; + /*!< + Structure to hold Ethernet interface parameters. + */ + +} tstrWifiInitParam; +//@} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup WLANAPI Function + * @ingroup m2m_wifi + */ +#ifdef __cplusplus +extern "C" { +#endif +/** @defgroup WiFiDownloadFn m2m_wifi_download_mode + * @ingroup WLANAPI + * Synchronous download mode entry function that prepares the WINC board to enter the download mode, ready for the + *firmware or certificate download. The WINC board is prepared for download, through initializations for the WINC driver + *including bus initializations and interrupt enabling, it also halts the chip, to allow for the firmware downloads. + * Firmware can be downloaded through a number of interfaces, UART, I2C and SPI. + */ +/**@{*/ +/*! +@fn \ + NMI_API void m2m_wifi_download_mode(void); +@brief Prepares the WINC broard before downloading any data (Firmware, Certificates .. etc) + + This function should called before starting to download any data to the WINC board. The WINC board is prepared +for download, through initializations for the WINC driver including bus initializations and interrupt enabling, it also +halts the chip, to allow for the firmware downloads Firmware can be downloaded through a number of interfaces, UART, I2C +and SPI. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_download_mode(void); + +/**@}*/ +/** @defgroup WifiInitFn m2m_wifi_init +* @ingroup WLANAPI +* Synchronous initialization function for the WINC driver. This function initializes the driver by, registering the +call back function for M2M_WIFI layer(also the call back function for bypass mode/monitoring mode if defined), +* initializing the host interface layer and the bus interfaces. +* Wi-Fi callback registering is essential to allow the handling of the events received, in response to the asynchronous +Wi-Fi operations. + +Following are the possible Wi-Fi events that are expected to be received through the call back function(provided by the +application) to the M2M_WIFI layer are : + + @ref M2M_WIFI_RESP_CON_STATE_CHANGED \n + @ref M2M_WIFI_RESP_CONN_INFO \n + @ref M2M_WIFI_REQ_DHCP_CONF \n + @ref M2M_WIFI_REQ_WPS \n + @ref M2M_WIFI_RESP_IP_CONFLICT \n + @ref M2M_WIFI_RESP_SCAN_DONE \n + @ref M2M_WIFI_RESP_SCAN_RESULT \n + @ref M2M_WIFI_RESP_CURRENT_RSSI \n + @ref M2M_WIFI_RESP_CLIENT_INFO \n + @ref M2M_WIFI_RESP_PROVISION_INFO \n + @ref M2M_WIFI_RESP_DEFAULT_CONNECT \n + Example: \n + In case Bypass mode is defined : \n + @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET + + In case Monitoring mode is used: \n + @ref M2M_WIFI_RESP_WIFI_RX_PACKET + + Any application using the WINC driver must call this function at the start of its main function. +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_init(tstrWifiInitParam * pWifiInitParam); + +@param [in] pWifiInitParam + This is a pointer to the @ref tstrWifiInitParam structure which holds the pointer to the application WIFI layer call +back function, monitoring mode call back and @ref tstrEthInitParam structure containing bypass mode parameters. + +@brief Initialize the WINC host driver. + This function initializes the driver by, registering the call back function for M2M_WIFI layer(also the call back +function for bypass mode/monitoring mode if defined), initializing the host interface layer and the bus interfaces. + +@pre + Prior to this function call, The application should initialize the BSP using "nm_bsp_init". + Also,application users must provide a call back function responsible for receiving all the WI-FI events that are +received on the M2M_WIFI layer. + +@warning + Failure to successfully complete function indicates that the driver couldn't be initialized and a fatal error will +prevent the application from proceeding. + +@see + nm_bsp_init + m2m_wifi_deinit + tenuM2mStaCmd + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_init(tstrWifiInitParam *pWifiInitParam); +/**@}*/ +/** @defgroup WifiDeinitFn m2m_wifi_deinit + * @ingroup WLANAPI + * Synchronous de-initialization function to the WINC1500 driver. De-initializes the host interface and frees any + * resources used by the M2M_WIFI layer. This function must be called in the application closing phase to ensure that + * all resources have been correctly released. No arguments are expected to be passed in. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_deinit(void * arg); + +@param [in] arg + Generic argument. Not used in the current implementation. +@brief Deinitilize the WINC driver and host enterface. + This function must be called at the De-initilization stage of the application. Generally This function should be +the last function before switching off the chip and it should be followed only by "nm_bsp_deinit" function call. Every +function call of "nm_wifi_init" should be matched with a call to nm_wifi_deinit. +@see + nm_bsp_deinit + nm_wifi_init + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_deinit(void *arg); + +/*! +@fn \ + NMI_API void m2m_wifi_yield(void); + +@brief + Yield from processing more synchronous M2M events + +@details + This function causes the synchronous M2M event handler function to yield from processing further + events and return control to the caller. + +@param [in] arg + Opaque argument, not used in current implementation. + +@return + The function returns @ref M2M_SUCCESS for successful interrupt handling and a negative value + otherwise. + +@pre + Prior to receiving Wi-Fi interrupts, the WINC driver should have been successfully initialized + by calling the @ref m2m_wifi_init function. + +@warning + Failure to successfully complete this function indicates bus errors and hence a fatal error that will prevent the +application from proceeding. +*/ + +NMI_API void m2m_wifi_yield(void); + +/**@}*/ +/** @defgroup WifiHandleEventsFn m2m_wifi_handle_events +* @ingroup WLANAPI +* Synchronous M2M event handler function, responsible for handling interrupts received from the WINC firmware. +* Application developers should call this function periodically in-order to receive the events that are to be +handled by the +* callback functions implemented by the application. + + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_handle_events(void * arg); + +@pre + Prior to receiving events, the WINC driver should have been successfully initialized by calling the @ref +m2m_wifi_init function. + +@brief Handle the varios events received from the WINC board. + Whenever an event happen in the WINC board (e.g. Connection, Disconnection , DHCP .. etc), WINC will interrupt +the host to let it know that a new event has occured. The host driver will attempt to handle these events whenever the +host driver decides to do that by calling the "m2m_wifi_handle_events" function. It's mandatory to call this function +periodically and independantly of any other condition. It's ideal to include this function in the main and the most +frequent loop of the host application. +@warning + Failure to successfully complete this function indicates bus errors and hence a fatal error that will prevent the +application from proceeding. + +@return + The function returns @ref M2M_SUCCESS for successful interrupt handling and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_handle_events(void *arg); + +/**@}*/ +/** @defgroup WifiSendCRLFn m2m_wifi_send_crl +* @ingroup WLANAPI +* Asynchronous API that notifies the WINC with the Certificate Revocation List to be used for TLS. + + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_send_crl(tstrTlsCrlInfo* pCRL); + +@brief + Asynchronous API that notifies the WINC with the Certificate Revocation List. + +@param [in] pCRL + Pointer to the structure containing certificate revocation list details. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ + +sint8 m2m_wifi_send_crl(tstrTlsCrlInfo *pCRL); + +/**@}*/ +/** @defgroup WifiDefaultConnectFn m2m_wifi_default_connect + * @ingroup WLANAPI + * Asynchronous Wi-Fi connection function. An application calling this function will cause the firmware to + correspondingly connect to the last successfully connected AP from the cached connections. + * A failure to connect will result in a response of @ref M2M_WIFI_RESP_DEFAULT_CONNECT indicating the connection + error as defined in the structure @ref tstrM2MDefaultConnResp. + * Possible errors are: + * The connection list is empty @ref M2M_DEFAULT_CONN_EMPTY_LIST or a mismatch for the saved AP name @ref + M2M_DEFAULT_CONN_SCAN_MISMATCH. + * only difference between this function and @ref m2m_wifi_connect, is the connection parameters. + * Connection using this function is expected to connect using cached connection parameters. + + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_default_connect(void); + +@pre + Prior to connecting, the WINC driver should have been successfully initialized by calling the @ref m2m_wifi_init +function. + +@brief Connect to the last successfully connected AP from the cached connections. + +@warning + This function must be called in station mode only. + It's important to note that successful completion of a call to m2m_wifi_default_connect() does not guarantee success of +the WIFI connection, and a negative return value indicates only locally-detected errors. + +@see + m2m_wifi_connect + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_default_connect(void); +/**@}*/ +/** @defgroup WifiConnectFn m2m_wifi_connect + * @ingroup WLANAPI + * Asynchronous wi-fi connection function to a specific AP. Prior to a successful connection, the application must + * define the SSID of the AP, the security type, the authentication information parameters and the channel number to + * which the connection will be established. The connection status is known when a response of @ref + * M2M_WIFI_RESP_CON_STATE_CHANGED is received based on the states defined in @ref tenuM2mConnState, successful + * connection is defined by @ref M2M_WIFI_CONNECTED + * + * The only difference between this function and @ref m2m_wifi_default_connect, is the connection parameters. + * Connection using this function is expected to be made to a specific AP and to a specified channel. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch); + +@param [in] pcSsid + A buffer holding the SSID corresponding to the requested AP. + +@param [in] u8SsidLen + Length of the given SSID (not including the NULL termination). + A length less than ZERO or greater than the maximum defined SSID @ref M2M_MAX_SSID_LEN will result in a +negative error + @ref M2M_ERR_FAIL. + +@param [in] u8SecType + Wi-Fi security type security for the network. It can be one of the following types: + -@ref M2M_WIFI_SEC_OPEN + -@ref M2M_WIFI_SEC_WEP + -@ref M2M_WIFI_SEC_WPA_PSK + -@ref M2M_WIFI_SEC_802_1X + A value outside these possible values will result in a negative return error @ref M2M_ERR_FAIL. + +@param [in] pvAuthInfo + Authentication parameters required for completing the connection. It is type is based on the Security +type. If the authentication parameters are NULL or are greater than the maximum length of the authentication parameters +length as defined by + @ref M2M_MAX_PSK_LEN a negative error will return @ref M2M_ERR_FAIL(-12) indicating connection failure. + +@param [in] u16Ch + Wi-Fi channel number as defined in @ref tenuM2mScanCh enumeration. + Channel number greater than @ref M2M_WIFI_CH_14 returns a negative error @ref M2M_ERR_FAIL(-12). + Except if the value is M2M_WIFI_CH_ALL(255), since this indicates that the firmware should scan all +channels to find the SSID requested to connect to. Failure to find the connection match will return a negative error +@ref M2M_DEFAULT_CONN_SCAN_MISMATCH. +@pre + Prior to a successful connection request, the Wi-Fi driver must have been successfully initialized through the +call of the @ref @m2m_wifi_init function +@see + tuniM2MWifiAuth + tstr1xAuthCredentials + tstrM2mWifiWepParams + +@warning + -This function must be called in station mode only. + -Successful completion of this function does not guarantee success of the WIFI connection, and + a negative return value indicates only locally-detected errors. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch); +/**@}*/ +/** @defgroup WifiConnectFn m2m_wifi_connect_sc + * @ingroup WLANAPI + * Asynchronous wi-fi connection function to a specific AP. Prior to a successful connection, the application + * developers must know the SSID of the AP, the security type, the authentication information parameters and the channel + * number to which the connection will be established.this API allows the user to choose whether to The connection + * status is known when a response of @ref M2M_WIFI_RESP_CON_STATE_CHANGED is received based on the states defined in + * @ref tenuM2mConnState, successful connection is defined by @ref M2M_WIFI_CONNECTED The only difference between this + * function and @ref m2m_wifi_connect, is the option to save the acess point info ( SSID, password...etc) or not. + * Connection using this function is expected to be made to a specific AP and to a specified channel. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 +u16Ch,uint8 u8SaveCred); + +@param [in] pcSsid + A buffer holding the SSID corresponding to the requested AP. + +@param [in] u8SsidLen + Length of the given SSID (not including the NULL termination). + A length less than ZERO or greater than the maximum defined SSID @ref M2M_MAX_SSID_LEN will result in a +negative error + @ref M2M_ERR_FAIL. + +@param [in] u8SecType + Wi-Fi security type security for the network. It can be one of the following types: + -@ref M2M_WIFI_SEC_OPEN + -@ref M2M_WIFI_SEC_WEP + -@ref M2M_WIFI_SEC_WPA_PSK + -@ref M2M_WIFI_SEC_802_1X + A value outside these possible values will result in a negative return error @ref M2M_ERR_FAIL. + +@param [in] pvAuthInfo + Authentication parameters required for completing the connection. It is type is based on the Security +type. If the authentication parameters are NULL or are greater than the maximum length of the authentication parameters +length as defined by + @ref M2M_MAX_PSK_LEN a negative error will return @ref M2M_ERR_FAIL(-12) indicating connection failure. + +@param [in] u16Ch + Wi-Fi channel number as defined in @ref tenuM2mScanCh enumeration. + Channel number greater than @ref M2M_WIFI_CH_14 returns a negative error @ref M2M_ERR_FAIL(-12). + Except if the value is M2M_WIFI_CH_ALL(255), since this indicates that the firmware should scan all +channels to find the SSID requested to connect to. Failure to find the connection match will return a negative error +@ref M2M_DEFAULT_CONN_SCAN_MISMATCH. + +@param [in] u8NoSaveCred + Option to store the acess point SSID and password into the WINC flash memory or not. + +@pre + Prior to a successful connection request, the wi-fi driver must have been successfully initialized through the +call of the @ref @m2m_wifi_init function +@see + tuniM2MWifiAuth + tstr1xAuthCredentials + tstrM2mWifiWepParams + +@warning + -This function must be called in station mode only. + -Successful completion of this function does not guarantee success of the WIFI connection, and + a negative return value indicates only locally-detected errors. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, + uint8 u8NoSaveCred); +/**@}*/ +/** @defgroup WifiDisconnectFn m2m_wifi_disconnect + * @ingroup WLANAPI + * Synchronous wi-fi disconnection function, requesting a Wi-Fi disconnection from the currently connected AP. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_disconnect(void); + +@pre + Disconnection request must be made to a successfully connected AP. If the WINC is not in the connected state, a call +to this function will hold insignificant. + +@brief Request a Wi-Fi disconnect from the currently connected AP. + After the Disconnect is complete the driver should recieve a response of @ref M2M_WIFI_RESP_CON_STATE_CHANGED +based on the states defined in @ref tenuM2mConnState, successful disconnection is defined by @ref M2M_WIFI_DISCONNECTED +. +@warning + This function must be called in station mode only. + +@see + m2m_wifi_connect + m2m_wifi_default_connect + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_disconnect(void); + +/**@}*/ +/** @defgroup StartProvisionModeFn m2m_wifi_start_provision_mode + * @ingroup WLANAPI + * Asynchronous Wi-Fi provisioning function, which starts the WINC HTTP PROVISIONING mode. + The function triggers the WINC to activate the Wi-Fi AP (HOTSPOT) mode with the passed configuration parameters and + then starts the HTTP Provision WEB Server. The provisioning status is returned in an event @ref + M2M_WIFI_RESP_PROVISION_INFO + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 +bEnableHttpRedirect); + +@param [in] pstrAPConfig + AP configuration parameters as defined in @ref tstrM2MAPConfig configuration structure. + A NULL value passed in, will result in a negative error @ref M2M_ERR_FAIL. + +@param [in] pcHttpServerDomainName + Domain name of the HTTP Provision WEB server which others will use to load the provisioning Home page. + The domain name can have one of the following 3 forms: + 1- "wincprov.com" + 2- "http://wincprov.com" + 3- "https://wincprov.com" + The forms 1 and 2 are equivalent, they both will start a plain http server, while form 3 + will start a secure HTTP provisioning Session (HTTP over SSL connection). + +@param [in] bEnableHttpRedirect + A flag to enable/disable the HTTP redirect feature. If Secure provisioning is enabled (i.e. the server + domain name uses "https" prefix) this flag is ignored (no meaning for redirect in HTTPS). + Possible values are: + - ZERO DO NOT Use HTTP Redirect. In this case the associated device could open the +provisioning page ONLY when the HTTP Provision URL of the WINC HTTP Server is correctly written on the browser. + - Non-Zero value Use HTTP Redirect. In this case, all http traffic (http://URL) from the associated + device (Phone, PC, ...etc) will be redirected to the WINC HTTP Provisioning Home +page. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. Registering +the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_PROVISION_INFO + m2m_wifi_stop_provision_mode + tstrM2MAPConfig + +@warning + DO Not use ".local" in the pcHttpServerDomainName. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +\section Example + The example demonstrates a code snippet for how provisioning is triggered and the response event received accordingly. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo*)pvMsg; + if(pstrProvInfo->u8Status == M2M_SUCCESS) + { + m2m_wifi_connect((char*)pstrProvInfo->au8SSID, (uint8)strlen(pstrProvInfo->au8SSID), +pstrProvInfo->u8SecType, pstrProvInfo->au8Password, M2M_WIFI_CH_ALL); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8 bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, + uint8 bEnableHttpRedirect); +/**@}*/ +/** @defgroup StopProvisioningModeFn m2m_wifi_stop_provision_mode + * @ingroup WLANAPI + * Synchronous provision termination function which stops the provision mode if it is active. + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_stop_provision_mode(void); + +@pre + An active provisioning session must be active before it is terminated through this function. +@see + m2m_wifi_start_provision_mode + +@return + The function returns ZERO for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_stop_provision_mode(void); +/**@}*/ +/** @defgroup GetConnectionInfoFn m2m_wifi_get_connection_info + * @ingroup WLANAPI + * Asynchronous connection status retrieval function, retrieves the status information of the currently connected AP. + * The result is passed to the Wi-Fi notification callback through the event @ref M2M_WIFI_RESP_CONN_INFO. Connection + * information is retrieved from the structure @ref tstrM2MConnInfo. + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_get_connection_info(void); + +@brief + Retrieve the current Connection information. The result is passed to the Wi-Fi notification callback + with [M2M_WIFI_RESP_CONN_INFO](@ref M2M_WIFI_RESP_CONN_INFO). +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. Registering +the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + + Connection Information retrieved: + + -Connection Security + -Connection RSSI + -Remote MAC address + -Remote IP address + + and in case of WINC station mode the SSID of the AP is also retrieved. +@warning + -In case of WINC AP mode or P2P mode, ignore the SSID field (NULL string). +@sa + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], +pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_get_connection_info(void); +/**@}*/ +/** @defgroup WifiSetMacAddFn m2m_wifi_set_mac_address + * @ingroup WLANAPI + * Synchronous MAC address assigning to the NMC1500. It is used for non-production SW. Assign MAC address to the WINC + * device. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +@brief Assign a MAC address to the WINC board. + This function override the already assigned MAC address of the WINC board with a user provided one. This is for +experimental use only and should never be used in the production SW. + +@param [in] au8MacAddress + MAC Address to be set to the WINC. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +/**@}*/ +/** @defgroup WifiWpsFn m2m_wifi_wps + * @ingroup WLANAPI + * Asynchronous WPS triggering function. + * This function is called for the WINC to enter the WPS (Wi-Fi Protected Setup) mode. The result is passed to the + *Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char * pcPinNumber); + +@param [in] u8TriggerType + WPS Trigger method. Could be: + - [WPS_PIN_TRIGGER](@ref WPS_PIN_TRIGGER) Push button method + - [WPS_PBC_TRIGGER](@ref WPS_PBC_TRIGGER) Pin method + +@param [in] pcPinNumber + PIN number for WPS PIN method. It is not used if the trigger type is WPS_PBC_TRIGGER. It must follow the +rules stated by the WPS standard. + +@warning + This function is not allowed in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at startup. +Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event [M2M_WIFI_REQ_WPS](@ref M2M_WIFI_REQ_WPS) must be handled in the callback to receive the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be performed. + - The [m2m_wifi_handle_events](@ref m2m_wifi_handle_events) MUST be called periodically to receive the responses in +the callback. +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shows an example of how Wi-Fi WPS is triggered . +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch + 1); + + // establish Wi-Fi connection + m2m_wifi_connect((char*)pstrWPS->au8SSID, (uint8)m2m_strlen(pstrWPS->au8SSID), + pstrWPS->u8AuthType, pstrWPS->au8PSK, pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType, const char *pcPinNumber); +/**@}*/ +/** @defgroup WifiWpsDisableFn m2m_wifi_wps_disable + * @ingroup WLANAPI + * Disable the WINC1500 WPS operation. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps_disable(void); + +@pre WINC should be already in WPS mode using @ref m2m_wifi_wps + +@brief Stops the WPS ongoing session. + +@see + m2m_wifi_wps + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_wps_disable(void); + +/**@}*/ +/** @defgroup WifiP2PFn m2m_wifi_p2p + * @ingroup WLANAPI + * Asynchronous Wi-Fi direct (P2P) enabling mode function. + The WINC supports P2P in device listening mode ONLY (intent is ZERO). + The WINC P2P implementation does not support P2P GO (Group Owner) mode. + Active P2P devices (e.g. phones) could find the WINC in the search list. When a device is connected to WINC, a Wi-Fi + notification event + @ref M2M_WIFI_RESP_CON_STATE_CHANGED is triggered. After a short while, the DHCP IP Address is obtained + and an event @ref M2M_WIFI_REQ_DHCP_CONF is triggered. Refer to the code examples for a more illustrative example. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +@param [in] u8Channel + P2P Listen RF channel. According to the P2P standard It must hold only one of the following values 1, 6 +or 11. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF + must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + This function is not allowed in AP or STA modes. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shown an example of how the p2p mode operates. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? +"CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("P2P IP Address +\"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); +/**@}*/ +/** @defgroup WifiP2PDisconnectFn m2m_wifi_p2p_disconnect + * @ingroup WLANAPI + * Disable the WINC1500 device Wi-Fi direct mode (P2P). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p_disconnect(void); +@pre + The p2p mode must have be enabled and active before a disconnect can be called. + +@see + m2m_wifi_p2p +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_p2p_disconnect(void); +/**@}*/ +/** @defgroup WifiEnableApFn m2m_wifi_enable_ap + * @ingroup WLANAPI + * Asynchronous Wi-FI hot-spot enabling function. + * The WINC supports AP mode operation with the following limitations: + - Only 1 STA could be associated at a time. + - Open and WEP are the only supported security types + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +@param [in] pstrM2MAPConfig + A structure holding the AP configurations. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main +function and the handling of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("Associated STA has IP Address +\"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig *pstrM2MAPConfig); +/**@}*/ +/** @defgroup WifiDisableApFn m2m_wifi_disable_ap + * @ingroup WLANAPI + * Synchronous Wi-Fi hot-spot disabling function. Must be called only when the AP is enabled through the @ref + * m2m_wifi_enable_ap function. Otherwise the call to this function will not be useful. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_disable_ap(void); +@see + m2m_wifi_enable_ap +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_disable_ap(void); +/**@}*/ +/** @defgroup SetStaticIPFn m2m_wifi_set_static_ip + * @ingroup WLANAPI + * Synchronous static IP Address configuration function. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@param [in] pstrStaticIPConf + Pointer to a structure holding the static IP Configurations (IP, + Gateway, subnet mask and DNS address). + +@pre The application must disable auto DHCP using @ref m2m_wifi_enable_dhcp before assigning a static IP address. + +@brief Assign a static IP address to the WINC board. + This function assigns a static IP address in case the AP doesn't have a DHCP server or in case the application +wants to assign a predefined known IP address. The user must take in mind that assigning a static IP address might +result in an IP address conflict. In case of an IP address conflict observed by the WINC board the user will get a +response of @ref M2M_WIFI_RESP_IP_CONFLICT in the wifi callback. The application is then responsible to either solve the +conflict or assign another IP address. +@warning + Normally this function normally should not be used. DHCP configuration is requested automatically after successful +Wi-Fi connection is established. + +@see + tstrM2MIPConfig + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf); + +/**@}*/ +/** @defgroup RequestDHCPClientFn m2m_wifi_request_dhcp_client + * @ingroup WLANAPI + * Starts the DHCP client operation(DHCP requested by the firmware automatically in STA/AP/P2P mode). + * + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +@warning + This function is legacy and exists only for compatability with older applications. DHCP configuration is requested +automatically after successful Wi-Fi connection is established. + +@return + The function returns @ref M2M_SUCCESS always. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_client(void); +/**@}*/ +/** @defgroup RequestDHCPServerFn m2m_wifi_request_dhcp_server + * @ingroup WLANAPI + * Dhcp requested by the firmware automatically in STA/AP/P2P mode). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +@warning + This function is legacy and exists only for compatability with older applications. DHCP server is started +automatically when enabling the AP mode. + +@return + The function returns @ref M2M_SUCCESS always. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_server(uint8 *addr); +/**@}*/ +/** @defgroup WifiDHCPEnableFn m2m_wifi_enable_dhcp + * @ingroup WLANAPI + * Synchronous Wi-Fi DHCP enable function. This function Enable/Disable DHCP protocol. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + +@brief + Enable/Disable the DHCP client after connection. + +@param [in] u8DhcpEn + Possible values: + 1: Enable DHCP client after connection. + 0: Disable DHCP client after connection. +@warnings + -DHCP client is enabled by default + -This Function should be called before using m2m_wifi_set_static_ip() + +@sa + m2m_wifi_set_static_ip() + +@return + The function SHALL return @ref M2M_SUCCESS for successful operation and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn); +/**@}*/ +/** @defgroup WifiSetScanOptionFn m2m_wifi_set_scan_options + * @ingroup WLANAPI + * Synchronous Wi-Fi scan settings function. This function sets the time configuration parameters for the scan + * operation. + */ + +/*! +@fn \ + sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) + +@param [in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption); +/**@}*/ +/** @defgroup WifiSetScanRegionFn m2m_wifi_set_scan_region + * @ingroup WLANAPI + * Synchronous wi-fi scan region setting function. + * This function sets the scan region, which will affect the range of possible scan channels. + * For 2.5GHz supported in the current release, the requested scan region can't exceed the maximum number of channels + *(14). + *@{*/ +/*! +@fn \ + sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) + +@param [in] ScanRegion; + ASIA + NORTH_AMERICA +@see + tenuM2mScanCh + m2m_wifi_request_scan + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_set_scan_region(uint16 ScanRegion); +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan + * @ingroup WLANAPI + * Asynchronous Wi-FI scan request on the given channel. The scan status is delivered in the wifi event callback and + *then the application is supposed to read the scan results sequentially. The number of APs found (N) is returned in + *event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found APs. The application reads the list of APs by calling + *the function @ref m2m_wifi_req_scan_result N times. + * + *@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan_passive +* @ingroup WLANAPI +* Same as m2m_wifi_request_scan but perform passive scanning while the other one perform active scanning. + +* +*@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. + +@param [in] scan_time + The time in ms that passive scan is listening to beacons on each channel per one slot, enter 0 for deafult +setting. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time); + +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan_ssid_list + * @ingroup WLANAPI + * Asynchronous wi-fi scan request on the given channel and the hidden scan list. The scan status is delivered in the + *wi-fi event callback and then the application is to read the scan results sequentially. The number of APs found (N) + *is returned in event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found APs. The application could read the + *list of APs by calling the function @ref m2m_wifi_req_scan_result N times. + * + *@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan_ssid_list(uint8 ch,uint8 * u8SsidList); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. +@param [in] u8SsidList + u8SsidList is a buffer containing a list of hidden SSIDs to + include during the scan. The first byte in the buffer, u8SsidList[0], + is the number of SSIDs encoded in the string. The number of hidden SSIDs + cannot exceed MAX_HIDDEN_SITES. All SSIDs are concatenated in the following + bytes and each SSID is prefixed with a one-byte header containing its length. + The total number of bytes in u8SsidList buffer, including length byte, cannot + exceed 133 bytes (MAX_HIDDEN_SITES SSIDs x 32 bytes each, which is max SSID length). + For instance, encoding the two hidden SSIDs "DEMO_AP" and "TEST" + results in the following buffer content: +@code + uint8 u8SsidList[14]; + u8SsidList[0] = 2; // Number of SSIDs is 2 + u8SsidList[1] = 7; // Length of the string "DEMO_AP" without NULL termination + memcpy(&u8SsidList[2], "DEMO_AP", 7); // Bytes index 2-9 containing the string DEMO_AP + u8SsidList[9] = 4; // Length of the string "TEST" without NULL termination + memcpy(&u8SsidList[10], "TEST", 4); // Bytes index 10-13 containing the string TEST +@endcode + +@warning + This function is not allowed in P2P. It works only for STA/AP mode (connected or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + static void request_scan_hidden_demo_ap(void); + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + request_scan_hidden_demo_ap(); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + static void request_scan_hidden_demo_ap(void) + { + uint8 list[9]; + char ssid[] = "DEMO_AP"; + uint8 len = (uint8)(sizeof(ssid)-1); + + list[0] = 1; + list[1] = len; + memcpy(&list[2], ssid, len); // copy 7 bytes + // Scan all channels + m2m_wifi_request_scan_ssid_list(M2M_WIFI_CH_ALL, list); + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + request_scan_hidden_demo_ap(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan_ssid_list(uint8 ch, uint8 *u8Ssidlist); + +/**@}*/ +/** @defgroup WifiGetNumAPFoundFn m2m_wifi_get_num_ap_found + * @ingroup WLANAPI + * Synchronous function to retrieve the number of AP's found in the last scan request, The function reads the number of + * APs from global variable which was updated in the Wi-Fi callback function through the M2M_WIFI_RESP_SCAN_DONE event. + * Function used only in STA mode only. + */ +/**@{*/ +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +@see m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT +@pre m2m_wifi_request_scan need to be called first + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_RESP_SCAN_DONE must be handled in the callback to receive the requested scan +information. +@warning This function must be called only in the wi-fi callback function when the events @ref M2M_WIFI_RESP_SCAN_DONE +or @ref M2M_WIFI_RESP_SCAN_RESULT are received. Calling this function in any other place will result in +undefined/outdated numbers. +@return Return the number of AP's found in the last Scan Request. + +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API uint8 m2m_wifi_get_num_ap_found(void); +/**@}*/ +/** @defgroup WifiReqScanResult m2m_wifi_req_scan_result + * @ingroup WLANAPI + * Synchronous call to read the AP information from the SCAN Result list with the given index. + * This function is expected to be called when the response events M2M_WIFI_RESP_SCAN_RESULT or + * M2M_WIFI_RESP_SCAN_DONE are received in the wi-fi callback function. + * The response information received can be obtained through the casting to the @ref tstrM2mWifiscanResult structure + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found + +@see tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre @ref m2m_wifi_request_scan needs to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. +Registering the callback is done through passing it to the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the requested scan +information. +@warning Function used in STA mode only. the scan results are updated only if the scan request is called. + Calling this function only without a scan request will lead to firmware errors. + Refrain from introducing a large delay between the scan request and the scan result request, to prevent + errors occurring. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +/**@}*/ +/** @defgroup WifiReqCurrentRssiFn m2m_wifi_req_curr_rssi + * @ingroup WLANAPI + * Asynchronous request for the current RSSI of the connected AP. + * The response received in through the @ref M2M_WIFI_RESP_CURRENT_RSSI event. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@pre - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered before +initialization. Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init) through +the @ref tstrWifiInitParam initialization structure. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback to receive the requested Rssi +information. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of +the event received in the callback. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + sint8 *rssi = (sint8*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_req_curr_rssi(void); +/**@}*/ +/** @defgroup WifiGetOtpMacAddFn m2m_wifi_get_otp_mac_address + * @ingroup WLANAPI + * Request the MAC address stored on the One Time Programmable(OTP) memory of the device. + * The function is blocking until the response is received. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + Output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@pre m2m_wifi_init required to be called before any WIFI/socket function +@see m2m_wifi_get_mac_address + +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid); +/**@}*/ +/** @defgroup WifiGetMacAddFn m2m_wifi_get_mac_address + * @ingroup WLANAPI + * Function to retrieve the current MAC address. The function is blocking until the response is received. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@pre m2m_wifi_init required to be called before any WIFI/socket function +@see m2m_wifi_get_otp_mac_address +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr); +/**@}*/ +/** @defgroup SetSleepModeFn m2m_wifi_set_sleep_mode + * @ingroup WLANAPI + * This is one of the two synchronous power-save setting functions that + * allow the host MCU application to tweak the system power consumption. Such tweaking can be done through one of two + * ways: 1) Changing the power save mode, to one of the allowed power save modes @ref tenuPowerSaveModes. This is done + * by setting the first parameter 2) Configuring DTIM monitoring: Configuring beacon monitoring parameters by enabling + * or disabling the reception of broadcast/multicast data. this is done by setting the second parameter. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@param [in] PsTyp + Desired power saving mode. Supported types are enumerated in @ref tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC1500 will be awake each DTIM beacon for receiving broadcast traffic. + If it is 0, the WINC1500: disable broadcast traffic. Through this flag the WINC1500 will not wakeup at the +DTIM beacon, but it will wakeup depends only on the the configured Listen Interval. + +@warning The function called once after initialization. + +@see tenuPowerSaveModes + m2m_wifi_get_sleep_mode + m2m_wifi_set_lsn_int + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +/**@}*/ +/** @defgroup WifiRequestSleepFn m2m_wifi_request_sleep + * @ingroup WLANAPI + * Synchronous power-save sleep request function, which requests from the WINC1500 device to sleep in the currenlty + * configured power save mode as defined by the @ref m2m_wifi_set_sleep_mode, for a specific time as defined by the + * passed in parameter. This function should be used in the @ref M2M_PS_MANUAL power save mode only. A wake up + * request is automatically performed by the WINC1500 device when any host driver API function, e.g. Wi-Fi or socket + * operation is called. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); +@param [in] u32SlpReqTime + Request sleep time in ms + The best recommended sleep duration is left to be determined by the application. Taking into account that if +the application sends notifications very rarely, sleeping for a long time can be a power-efficient decision. In contrast +applications that are senstive for long periods of absence can experience performance degradation in the connection if +long sleeping times are used. +@warning The function should be called in @ref M2M_PS_MANUAL power save mode only. As enumerated in @ref +tenuPowerSaveModes It's also important to note that during the sleeping time while in the M2M_PS_MANUAL mode, AP beacon +monitoring is bypassed and the wifi-connection may drop if the sleep period is enlongated. +@see tenuPowerSaveModes + m2m_wifi_set_sleep_mode + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); +/**@}*/ +/** @defgroup GetSleepModeFn m2m_wifi_get_sleep_mode + * @ingroup WLANAPI + * Synchronous power save mode retrieval function. + */ +/**@{*/ +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@see tenuPowerSaveModes + m2m_wifi_set_sleep_mode +@return The current operating power saving mode based on the enumerated sleep modes @ref tenuPowerSaveModes. +*/ +NMI_API uint8 m2m_wifi_get_sleep_mode(void); +/**@}*/ +/** @defgroup WifiReqClientCtrlFn m2m_wifi_req_client_ctrl + * @ingroup WLANAPI + * Asynchronous command sending function to the PS Client (An WINC1500 board running the ps_firmware) + * if the PS client send any command it will be received through the @ref M2M_WIFI_RESP_CLIENT_INFO event + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +@brief +@param [in] cmd + Control command sent from PS Server to PS Client (command values defined by the application) +@pre @ref m2m_wifi_req_server_init should be called first +@warning This mode is not supported in the current release. +@see m2m_wifi_req_server_init + M2M_WIFI_RESP_CLIENT_INFO +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +/**@}*/ +/** @defgroup WifiReqServerInit m2m_wifi_req_server_init + * @ingroup WLANAPI + * Synchronous function to initialize the PS Server. + * The WINC1500 supports non secure communication with another WINC1500, + * (SERVER/CLIENT) through one byte command (probe request and probe response) without any connection setup. + * The server mode can't be used with any other modes (STA/P2P/AP) + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +@param [in] ch + Server listening channel +@see m2m_wifi_req_client_ctrl +@warning This mode is not supported in the current release. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +/**@}*/ +/** @defgroup WifiSetDeviceNameFn m2m_wifi_set_device_name + * @ingroup WLANAPI + * Sets the WINC device name. The name string is used as a device name in both (P2P) WiFi-Direct mode as well as DHCP + * hostname (option 12). For P2P devices to communicate a device name must be present. If it is not set through this + * function a default name is assigned. The default name is WINC-XX-YY, where XX and YY are the last 2 octets of the + * OTP MAC address. If OTP (eFuse) is programmed, then the default name is WINC-00-00. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@param [in] pu8DeviceName + A Buffer holding the device name. Device name is a null terminated C string. +@param [in] u8DeviceNameLength + The length of the device name. Should not exceed the maximum device name's length @ref M2M_DEVICE_NAME_MAX +(including null character). +@warning The function called once after initialization. + Used for the Wi-Fi Direct (P2P) as well as DHCP client hostname option (12). +@warning Device name shall contain only characters allowed in valid internet host name as defined in RFC 952 and +1123. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +/**@}*/ +/** @defgroup WifiSetLsnIntFn m2m_wifi_set_lsn_int + * @ingroup WLANAPI + * This is one of the two synchronous power-save setting functions that + * allow the host MCU application to tweak the system power consumption. Such tweaking can be done by modifying the + * the Wi-Fi listen interval. The listen interval is how many beacon periods the station can sleep before it wakes up + *to receive data buffer in AP. It is represented in units of AP beacon periods(100ms). + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@pre Function @m2m_wifi_set_sleep_mode shall be called first, to set the power saving mode required. +@warning The function should be called once after initialization. +@see tstrM2mLsnInt + m2m_wifi_set_sleep_mode +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); +/**@}*/ +/** @defgroup WifiEnableMonitorModeFn m2m_wifi_enable_monitoring_mode + * @ingroup WLANAPI + * Asynchronous Wi-Fi monitoring mode (Promiscuous mode) enabling function. This function enables the monitoring + * mode, thus allowing two operations to be performed: 1) Transmission of manually configured frames, through using the + * @ref m2m_wifi_send_wlan_pkt function. 2) Reception of frames based on a defined filtering criteria When the + * monitoring mode is enabled, reception of all frames that satisfy the filter criteria passed in as a parameter is + * allowed, on the current wireless channel \n. All packets that meet the filtering criteria are passed to the + * application layer, to be handled by the assigned monitoring callback function \n. The monitoring callback function + * must be implemented before starting the monitoring mode, in-order to handle the packets received \n. Registering + * of the implemented callback function is through the callback pointer @ref tpfAppMonCb in the @ref + * tstrWifiInitParam structure\n. passed to @ref m2m_wifi_init function at initialization. + * + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8 *, uint16 , +uint16); + * @param [in] pstrMtrCtrl + * Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the filtering parameters. + * @param [in] pu8PayloadBuffer + * Pointer to a buffer allocated by the application. The buffer SHALL hold the Data field of + * the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + * be discarded by the monitoring driver. + * @param [in] u16BufferSize + * The total size of the pu8PayloadBuffer in bytes. + * @param [in] u16DataOffset + * Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + * in reading specific information from the received packet. It must assign the offset to the starting + * position of it relative to the DATA payload start.\n + * \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ \e +packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + * @warning When This mode is enabled, you can not be connected in any mode (Station, Access Point, or P2P).\n + * @see tstrM2MWifiMonitorModeCtrl + tstrM2MWifiRxPacketInfo + tstrWifiInitParam + tenuM2mScanCh + m2m_wifi_disable_monitoring_mode + m2m_wifi_send_wlan_pkt + m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*\section Example +* The example demonstrates the main function where-by the monitoring enable function is called after the initialization +of the driver and the packets are +* handled in the callback function. +* @code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + //Declare receive buffer + uint8 gmgmt[1600]; + + //Callback functions + void wifi_cb(uint8 u8WiFiEvent, void * pvMsg) + { + ; + } + void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize) + { + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } + } + + int main() + { + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; + } + * @endcode + */ +NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset); +/**@}*/ +/** @defgroup WifiDisableMonitorModeFn m2m_wifi_disable_monitoring_mode + * @ingroup WLANAPI + * Synchronous function to disable Wi-Fi monitoring mode (Promiscuous mode). Expected to be called, if the enable + * monitoring mode is set, but if it was called without enabling no negative impact will reside. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + * @see m2m_wifi_enable_monitoring_mode + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); +/**@}*/ +/** @defgroup SendWlanPktFn m2m_wifi_send_wlan_pkt + * @ingroup WLANAPI + * Synchronous function to transmit a WIFI RAW packet while the implementation of this packet is left to the + * application developer. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *, uint16, uint16); + + * @param [in] pu8WlanPacket + * Pointer to a buffer holding the whole WIFI frame. + * @param [in] u16WlanHeaderLength + * The size of the WIFI packet header ONLY. + * @param [in] u16WlanPktSize + * The size of the whole bytes in packet. + * @see m2m_wifi_enable_monitoring_mode + m2m_wifi_disable_monitoring_mode + * @pre Enable Monitoring mode first using @ref m2m_wifi_enable_monitoring_mode + * @warning This function available in monitoring mode ONLY.\n + * @note Packets are user's responsibility. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize); +/**@}*/ +/** @defgroup WifiSendEthernetPktFn m2m_wifi_send_ethernet_pkt + * @ingroup WLANAPI + * Synchronous function to transmit an Ethernet packet. Transmit a packet directly in ETHERNET/bypass mode where the + * TCP/IP stack is disabled and the implementation of this packet is left to the application developer. The Ethernet + * packet composition is left to the application developer. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) + * @param [in] pu8Packet + * Pointer to a buffer holding the whole Ethernet frame. + * @param [in] u16PacketSize + * The size of the whole bytes in packet. + * @warning This function available in ETHERNET/Bypass mode ONLY. Make sure that application defines @ref + ETH_MODE.\n + * @note Packets are the user's responsibility. + * @sa m2m_wifi_enable_mac_mcast,m2m_wifi_set_receive_buffer + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8 *pu8Packet, uint16 u16PacketSize); +/**@}*/ +/** @defgroup WifiEnableSntpFn m2m_wifi_enable_sntp + * @ingroup WLANAPI + * Synchronous function to enable/disable the native Simple Network Time Protocol(SNTP) client in the WINC1500 + * firmware.\n The SNTP is enabled by default at start-up.The SNTP client at firmware is used to synchronize the system + * clock to the UTC time from the well known time servers (e.g. "time-c.nist.gov"). The SNTP client uses a default + * update cycle of 1 day. The UTC is important for checking the expiration date of X509 certificates used while + * establishing TLS (Transport Layer Security) connections. It is highly recommended to use it if there is no other + * means to get the UTC time. If there is a RTC on the host MCU, the SNTP could be disabled and the host should set + * the system time to the firmware using the @ref m2m_wifi_set_system_time function. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_sntp(uint8); + * @param [in] bEnable + * Enabling/Disabling flag + * '0' :disable SNTP + * '1' :enable SNTP + * @see m2m_wifi_set_sytem_time + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_enable_sntp(uint8 bEnable); +/**@}*/ +/** @defgroup WifiSetSystemTime m2m_wifi_set_sytem_time + * @ingroup WLANAPI + * Synchronous function for setting the system time in time/date format (@ref uint32).\n + * The @ref tstrSystemTime structure can be used as a reference to the time values that should be set and pass its + * value as @ref uint32 + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_sytem_time(uint32); + * @param [in] u32UTCSeconds + * Seconds elapsed since January 1, 1900 (NTP Timestamp). + * @see m2m_wifi_enable_sntp + * tstrSystemTime + * @note If there is an RTC on the host MCU, the SNTP could be disabled and the host should set the system time + *to the firmware using the API @ref m2m_wifi_set_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds); +/**@}*/ +/** @defgroup WifiGetSystemTime m2m_wifi_get_sytem_time + * @ingroup WLANAPI + * Asynchronous function used to retrieve the system time through the use of the response @ref + * M2M_WIFI_RESP_GET_SYS_TIME. Response time retrieved is parsed into the members defined in the structure @ref + * tstrSystemTime. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note Get the system time from the SNTP client + * using the API @ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_get_sytem_time(void); +/**@}*/ +/** @defgroup WifiSetCustInfoElementFn m2m_wifi_set_cust_InfoElement + * @ingroup WLANAPI + * Synchronous function to Add/Remove user-defined Information Element to the WIFIBeacon and Probe Response frames + * while chip mode is Access Point Mode.\n According to the information element layout shown bellow, if it is required + * to set new data for the information elements, pass in the buffer with the information according to the sizes and + * ordering defined bellow. However, if it's required to delete these IEs, fill the buffer with zeros. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8*); + * @param [in] pau8M2mCustInfoElement + * Pointer to Buffer containing the IE to be sent. It is the application developer's + responsibility to ensure on the correctness of the information element's ordering passed in. + * @warning - Size of All elements combined must not exceed 255 byte.\n + * - Used in Access Point Mode \n + * @note IEs Format will be follow the following layout:\n + * @verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- + ---------------------- | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | + Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- + --------|-----------|------------------| | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | + Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- + ---------------------- + * @endverbatim + * @see m2m_wifi_enable_sntp + * tstrSystemTime + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + \section Example + The example demonstrates how the information elements are set using this function. + *@code + * + char elementData[21]; + static char state = 0; // To Add, Append, and Delete + if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; + } else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; + } else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; + } + m2m_wifi_set_cust_InfoElement(elementData); + * @endcode + */ +NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8 *pau8M2mCustInfoElement); +/**@}*/ +/** @defgroup WifiSetPowerProfile m2m_wifi_set_power_profile + * @ingroup WLANAPI + * Change the power profile mode + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief +@param [in] u8PwrMode + Change the WINC1500 power profile to different mode based on the enumeration + @ref tenuM2mPwrMode +@pre Must be called after the initializations and before any connection request and can't be changed in run time. +@sa tenuM2mPwrMode + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +/**@}*/ +/** @defgroup WifiSetTxPower m2m_wifi_set_tx_power + * @ingroup WLANAPI + * Set the TX power tenuM2mTxPwrLevel + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@param [in] u8TxPwrLevel + change the TX power based on the enumeration tenuM2mTxPwrLevel +@pre Must be called after the initialization and before any connection request and can't be changed in runtime. +@sa tenuM2mTxPwrLevel + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +/**@}*/ +/** @defgroup WifiEnableFirmware m2m_wifi_enable_firmware_logs + * @ingroup WLANAPI + * Enable or Disable logs in run time (Disabling Firmware logs will + * enhance the firmware start-up time and performance) + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@param [in] u8Enable + Set 1 to enable the logs, 0 for disable +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +/**@}*/ +/** @defgroup WifiSetBatteryVoltage m2m_wifi_set_battery_voltage + * @ingroup WLANAPI + * Set the battery voltage to update the firmware calculations + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint8 u8BattVolt) +@brief Set the battery voltage to update the firmware calculations +@param [in] dbBattVolt + Battery Volt in double +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +/**@}*/ +/** @defgroup WifiSetGains m2m_wifi_set_gains + * @ingroup WLANAPI + * Set the chip gains mainly (PPA for 11b/11gn) + */ +/**@{*/ +/*! +@fn sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams* pstrM2mGain); +@brief Set the chip PPA gain for 11b/11gn +@param [in] pstrM2mGain + tstrM2mWifiGainsParams contain gain parmaters as implemnted in rf document +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams *pstrM2mGain); +/**@}*/ +/** @defgroup WifiGetFirmwareVersion m2m_wifi_get_firmware_version + * @ingroup WLANAPI + * Get Firmware version info as defined in the structure @ref tstrM2mRev. + */ +/**@{*/ +/*! +@fn m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) +@param [out] M2mRev + Pointer to the structure @ref tstrM2mRev that contains the firmware version parameters +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); +/**@}*/ +#ifdef ETH_MODE +/** @defgroup WifiEnableMacMcastFn m2m_wifi_enable_mac_mcast + * @ingroup WLANAPI + * Synchronous function for filtering received MAC addresses from certain MAC address groups. + * This function allows the addtion/removal of certain MAC addresses, used in the multicast filter. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *, uint8); + * @brief + * @param [in] pu8MulticastMacAddress + * Pointer to MAC address + * @param [in] u8AddRemove + * A flag to add or remove the MAC ADDRESS, based on the following values: + * - 0 : remove MAC address + * - 1 : add MAC address + * @warning This function is available in ETHERNET/bypass mode ONLY. Make sure that the application defines @ref + * ETH_MODE.\n + * @note Maximum number of MAC addresses that could be added is 8. + * @sa m2m_wifi_set_receive_buffer, m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *pu8MulticastMacAddress, uint8 u8AddRemove); +/**@}*/ +/** @defgroup SetReceiveBufferFn m2m_wifi_set_receive_buffer + * @ingroup WLANAPI + * Synchronous function for setting or modifying the receiver buffer's length. + * In the ETHERNET/bypass mode the application should define a callback of type @ref tpfAppEthCb, through which the + *application handles the received ethernet frames. It is through this callback function that the user can dynamically + *modify the length of the currently used receiver buffer. + *@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_receive_buffer(void *, uint16); + + * @param [in] pvBuffer + * Pointer to Buffer to receive data. + * NULL pointer causes a negative error @ref M2M_ERR_FAIL. + * + * @param [in] u16BufferLen + * Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + * defined as @ref SOCKET_BUFFER_MAX_LENGTH + * + * @warning This function is available in the Ethernet/bypass mode ONLY. Make sure that the application defines + @ref ETH_MODE.\n + * @sa m2m_wifi_enable_mac_mcast,m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_set_receive_buffer(void *pvBuffer, uint16 u16BufferLen); +/**@}*/ +#endif /* ETH_MODE */ +/** @defgroup GetPrngBytes m2m_wifi_prng_get_random_bytes + * @ingroup WLANAPI + * Asynchronous function for retrieving from the firmware a pseudo-random set of bytes as specifed in the size passed + *in as a parameter. The registered wifi-cb function retrieves the random bytes through the response @ref + *M2M_WIFI_RESP_GET_PRNG + *@{*/ +/*! + * @fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PRNGBuff,uint16 u16PRNGSize) + * @param [out] pu8PrngBuff + * Pointer to a buffer to receive data. + * @param [in] u16PrngSize + * Request size in bytes + *@warning Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + * causes a negative error @ref M2M_ERR_FAIL. + *@see tstrPrng + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_prng_get_random_bytes(uint8 *pu8PrngBuff, uint16 u16PrngSize); +/**@}*/ + +/** @defgroup WifiConfAutRate m2m_wifi_conf_auto_rate + * @ingroup WLANAPI + * Configures WLAN automatic TX rate adaptation algorithm. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate * pstrConfAutoRate) + +@brief + Allow the host MCU app to configure auto TX rate selection algorithm. The application can use this + API to tweak the algorithm performance. Moreover, it allows the application to force a specific WLAN + PHY rate for transmitted data packets to favor range vs. throughput needs. + +@param [in] pstrConfAutoRate + The Auto rate configuration parameters as listed in tstrConfAutoRate. +@sa + tstrConfAutoRate +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate *pstrConfAutoRate); +/**@}*/ + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_ate_mode.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_ate_mode.c new file mode 100644 index 0000000..6c5e19b --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_ate_mode.c @@ -0,0 +1,787 @@ +/** + * + * \file + * + * \brief NMC1500 Peripherials Application Interface. + * + * Copyright (c) 2014 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_ate_mode.h" +#include "driver/source/nmasic.h" +#include "driver/source/nmdrv.h" +#include "m2m_hif.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define rInterrupt_CORTUS_0 (0x10a8) +#define rInterrupt_CORTUS_1 (0x10ac) +#define rInterrupt_CORTUS_2 (0x10b0) + +#define rBurstTx_NMI_TX_RATE (0x161d00) +#define rBurstTx_NMI_NUM_TX_FRAMES (0x161d04) +#define rBurstTx_NMI_TX_FRAME_LEN (0x161d08) +#define rBurstTx_NMI_TX_CW_PARAM (0x161d0c) +#define rBurstTx_NMI_TX_GAIN (0x161d10) +#define rBurstTx_NMI_TX_DPD_CTRL (0x161d14) +#define rBurstTx_NMI_USE_PMU (0x161d18) +#define rBurstTx_NMI_TEST_CH (0x161d1c) +#define rBurstTx_NMI_TX_PHY_CONT (0x161d20) +#define rBurstTx_NMI_TX_CW_MODE (0x161d24) +#define rBurstTx_NMI_TEST_XO_OFF (0x161d28) +#define rBurstTx_NMI_USE_EFUSE_XO_OFF (0x161d2c) + +#define rBurstTx_NMI_MAC_FILTER_ENABLE_DA (0x161d30) +#define rBurstTx_NMI_MAC_ADDR_LO_PEER (0x161d34) +#define rBurstTx_NMI_MAC_ADDR_LO_SELF (0x161d38) +#define rBurstTx_NMI_MAC_ADDR_HI_PEER (0x161d3c) +#define rBurstTx_NMI_MAC_ADDR_HI_SELF (0x161d40) +#define rBurstTx_NMI_RX_PKT_CNT_SUCCESS (0x161d44) +#define rBurstTx_NMI_RX_PKT_CNT_FAIL (0x161d48) +#define rBurstTx_NMI_SET_SELF_MAC_ADDR (0x161d4c) +#define rBurstTx_NMI_MAC_ADDR_LO_SA (0x161d50) +#define rBurstTx_NMI_MAC_ADDR_HI_SA (0x161d54) +#define rBurstTx_NMI_MAC_FILTER_ENABLE_SA (0x161d58) + +#define rBurstRx_NMI_RX_ALL_PKTS_CONT (0x9898) +#define rBurstRx_NMI_RX_ERR_PKTS_CONT (0x988c) + +#define TX_DGAIN_MAX_NUM_REGS (4) +#define TX_DGAIN_REG_BASE_ADDRESS (0x1240) +#define TX_GAIN_CODE_MAX_NUM_REGS (3) +#define TX_GAIN_CODE_BASE_ADDRESS (0x1250) +#define TX_PA_MAX_NUM_REGS (3) +#define TX_PA_BASE_ADDRESS (0x1e58) +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +VARIABLES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +volatile static uint8 gu8AteIsRunning = 0; /*!< ATE firmware status, 1 means ATE is running otherwise stopped */ +volatile static uint8 gu8RxState = 0; /*!< RX status, 1 means Rx is running otherwise stopped */ +volatile static uint8 gu8TxState = 0; /*!< TX status, 1 means Tx is running otherwise stopped */ +volatile static uint32 gaAteFwTxRates[M2M_ATE_MAX_NUM_OF_RATES] = { + 0x01, 0x02, 0x05, 0x0B, /*B-Rats*/ + 0x06, 0x09, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x36, /*G-Rats*/ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 /*N-Rats*/ +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static void m2m_ate_set_rx_status(uint8 u8Value) +{ + gu8RxState = u8Value; +} + +static void m2m_ate_set_tx_status(uint8 u8Value) +{ + gu8TxState = u8Value; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(void) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_ATE_HIGH; + + s8Ret = nm_drv_init(&u8WifiMode); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_init(tstrM2mAteInit *pstrInit); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init_param(tstrM2mAteInit *pstrInit) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_drv_init((void *)&pstrInit->u8RxPwrMode); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void) +{ + return nm_drv_deinit(NULL); +} + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8 u8State) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32_t u32Val = 0; + + if ((M2M_ATE_FW_STATE_STOP == u8State) && (M2M_ATE_FW_STATE_STOP != gu8AteIsRunning)) { + u32Val = nm_read_reg(rNMI_GLB_RESET); + u32Val &= ~(1 << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + gu8AteIsRunning = M2M_ATE_FW_STATE_STOP; + } else if ((M2M_ATE_FW_STATE_RUN == u8State) && (M2M_ATE_FW_STATE_RUN != gu8AteIsRunning)) { + /* 0x1118[0]=0 at power-on-reset: pad-based control. */ + /* Switch cortus reset register to register control. 0x1118[0]=1. */ + u32Val = nm_read_reg(rNMI_BOOT_RESET_MUX); + u32Val |= (1 << 0); + s8Ret = nm_write_reg(rNMI_BOOT_RESET_MUX, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + /** + Write the firmware download complete magic value 0x10ADD09E at + location 0xFFFF000C (Cortus map) or C000C (AHB map). + This will let the boot-rom code execute from RAM. + **/ + s8Ret = nm_write_reg(0xc0000, 0x71); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + + u32Val = nm_read_reg(rNMI_GLB_RESET); + if ((u32Val & (1ul << 10)) == (1ul << 10)) { + u32Val &= ~(1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + } + + u32Val |= (1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + gu8AteIsRunning = M2M_ATE_FW_STATE_RUN; + } else { + s8Ret = M2M_ATE_ERR_UNHANDLED_CASE; + } + +__EXIT: + if ((M2M_SUCCESS == s8Ret) && (M2M_ATE_FW_STATE_RUN == gu8AteIsRunning)) { + nm_bsp_sleep(500); /*wait for ATE firmware start up*/ + } + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void) +{ + return gu8AteIsRunning; +} + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8 u8Index) +{ + if (M2M_ATE_MAX_NUM_OF_RATES <= u8Index) { + return 0; + } + return gaAteFwTxRates[u8Index]; +} + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void) +{ + return gu8TxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx *strM2mAteTx) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8LoopCntr = 0; + uint32_t val32; + + if (NULL == strM2mAteTx) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (0 != m2m_ate_get_rx_status()) { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if ((strM2mAteTx->channel_num < M2M_ATE_CHANNEL_1) || (strM2mAteTx->channel_num > M2M_ATE_CHANNEL_14) + || (strM2mAteTx->tx_gain_sel < M2M_ATE_TX_GAIN_DYNAMIC) || (strM2mAteTx->tx_gain_sel > M2M_ATE_TX_GAIN_TELEC) + || (strM2mAteTx->frame_len > M2M_ATE_MAX_FRAME_LENGTH) || (strM2mAteTx->frame_len < M2M_ATE_MIN_FRAME_LENGTH)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if ((strM2mAteTx->duty_cycle < M2M_ATE_TX_DUTY_MAX_VALUE /*1*/) + || (strM2mAteTx->duty_cycle > M2M_ATE_TX_DUTY_MIN_VALUE /*10*/) + || (strM2mAteTx->dpd_ctrl < M2M_ATE_TX_DPD_DYNAMIC) || (strM2mAteTx->dpd_ctrl > M2M_ATE_TX_DPD_ENABLED) + || (strM2mAteTx->use_pmu > M2M_ATE_PMU_ENABLE) || (strM2mAteTx->phy_burst_tx < M2M_ATE_TX_SRC_MAC) + || (strM2mAteTx->phy_burst_tx > M2M_ATE_TX_SRC_PHY) || (strM2mAteTx->cw_tx < M2M_ATE_TX_MODE_NORM) + || (strM2mAteTx->cw_tx > M2M_ATE_TX_MODE_CW)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + for (u8LoopCntr = 0; u8LoopCntr < M2M_ATE_MAX_NUM_OF_RATES; u8LoopCntr++) { + if (gaAteFwTxRates[u8LoopCntr] == strM2mAteTx->data_rate) { + break; + } + } + + if (M2M_ATE_MAX_NUM_OF_RATES == u8LoopCntr) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteTx->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_PHY_CONT, strM2mAteTx->phy_burst_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_NUM_TX_FRAMES, strM2mAteTx->num_frames); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_GAIN, strM2mAteTx->tx_gain_sel); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteTx->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_FRAME_LEN, strM2mAteTx->frame_len); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_PARAM, strM2mAteTx->duty_cycle); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_DPD_CTRL, strM2mAteTx->dpd_ctrl); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_RATE, strM2mAteTx->data_rate); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_MODE, strM2mAteTx->cw_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteTx->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteTx->use_efuse_xo_offset); + + val32 = strM2mAteTx->peer_mac_addr[5] << 0; + val32 |= strM2mAteTx->peer_mac_addr[4] << 8; + val32 |= strM2mAteTx->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_PEER, val32); + + val32 = strM2mAteTx->peer_mac_addr[2] << 0; + val32 |= strM2mAteTx->peer_mac_addr[1] << 8; + val32 |= strM2mAteTx->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_PEER, val32); + + if (M2M_SUCCESS == s8Ret) { + s8Ret += nm_write_reg(rInterrupt_CORTUS_0, 1); /*Interrupt Cortus*/ + m2m_ate_set_tx_status(1); + nm_bsp_sleep(200); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_write_reg(rInterrupt_CORTUS_1, 1); + if (M2M_SUCCESS == s8Ret) { + m2m_ate_set_tx_status(0); + } + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void) +{ + return gu8RxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx *strM2mAteRxStr) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32 val32; + if (NULL == strM2mAteRxStr) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (0 != m2m_ate_get_rx_status()) { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if ((strM2mAteRxStr->channel_num < M2M_ATE_CHANNEL_1) || (strM2mAteRxStr->channel_num > M2M_ATE_CHANNEL_14) + || (strM2mAteRxStr->use_pmu > M2M_ATE_PMU_ENABLE)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteRxStr->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteRxStr->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteRxStr->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteRxStr->use_efuse_xo_offset); + + if (strM2mAteRxStr->override_self_mac_addr) { + val32 = strM2mAteRxStr->self_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SELF, val32); + + val32 = strM2mAteRxStr->self_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SELF, val32); + } + + if (strM2mAteRxStr->mac_filter_en_sa) { + val32 = strM2mAteRxStr->peer_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->peer_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SA, val32); + + val32 = strM2mAteRxStr->peer_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->peer_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SA, val32); + } + + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA, strM2mAteRxStr->mac_filter_en_da); + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA, strM2mAteRxStr->mac_filter_en_sa); + nm_write_reg(rBurstTx_NMI_SET_SELF_MAC_ADDR, strM2mAteRxStr->override_self_mac_addr); + + if (M2M_SUCCESS == s8Ret) { + s8Ret += nm_write_reg(rInterrupt_CORTUS_2, 1); /*Interrupt Cortus*/ + m2m_ate_set_rx_status(1); + nm_bsp_sleep(10); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void) +{ + m2m_ate_set_rx_status(0); + nm_bsp_sleep(200); /*Recommended*/ + return M2M_SUCCESS; +} + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *strM2mAteRxStatus) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (NULL == strM2mAteRxStatus) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA) || nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA)) { + strM2mAteRxStatus->num_rx_pkts + = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS) + nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + strM2mAteRxStatus->num_good_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + } else { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstRx_NMI_RX_ALL_PKTS_CONT) + nm_read_reg(0x989c); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstRx_NMI_RX_ERR_PKTS_CONT); + strM2mAteRxStatus->num_good_pkts = strM2mAteRxStatus->num_rx_pkts - strM2mAteRxStatus->num_err_pkts; + } + +__EXIT: + return s8Ret; +} +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB) +{ + uint32_t dGain, val32; + dGain = (uint32_t)(pow(10, dGaindB / 20.0) * 1024.0); + + val32 = nm_read_reg(0x160cd0); + val32 &= ~(0x1ffful << 0); + val32 |= (((uint32_t)dGain) << 0); + nm_write_reg(0x160cd0, val32); + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * dGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * dGaindB + The retrieved digital gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double *dGaindB) +{ + uint32 dGain, val32; + + if (!dGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x160cd0); + + dGain = (val32 >> 0) & 0x1ffful; + *dGaindB = 20.0 * log10((double)dGain / 1024.0); + + return M2M_SUCCESS; +} +/*! +@fn \ + void m2m_ate_set_pa_gain(uint8 gain_db) + +@brief + This function is used to set the PA gain (18/15/12/9/6/3/0 only) + +@param [in] uint8 gain_db + PA gain level allowed (18/15/12/9/6/3/0 only) + +*/ +void m2m_ate_set_pa_gain(uint8 gain_db) +{ + uint32 PA_1e9c; + uint8 aGain[] = {/* "0 dB" */ 0x00, + /* "3 dB" */ 0x01, + /* "6 dB" */ 0x03, + /* "9 dB" */ 0x07, + /* "12 dB" */ 0x0f, + /* "15 dB" */ 0x1f, + /* "18 dB" */ 0x3f}; + /* The variable PA gain is valid only for High power mode */ + PA_1e9c = nm_read_reg(0x1e9c); + /* TX bank 0. */ + PA_1e9c &= ~(0x3ful << 8); + PA_1e9c |= (((uint32)aGain[gain_db / 3] & 0x3f) << 8); + nm_write_reg(0x1e9c, PA_1e9c); +} +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(double *paGaindB) + +@brief + This function is used to get the PA gain + +@param [out] double *paGaindB + The retrieved PA gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(double *paGaindB) +{ + uint32 val32, paGain; + uint32 m_cmbPAGainStep; + + if (!paGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1e9c); + + paGain = (val32 >> 8) & 0x3f; + + switch (paGain) { + case 0x1: + m_cmbPAGainStep = 5; + break; + case 0x3: + m_cmbPAGainStep = 4; + break; + case 0x7: + m_cmbPAGainStep = 3; + break; + case 0xf: + m_cmbPAGainStep = 2; + break; + case 0x1f: + m_cmbPAGainStep = 1; + break; + case 0x3f: + m_cmbPAGainStep = 0; + break; + default: + m_cmbPAGainStep = 0; + break; + } + + *paGaindB = 18 - m_cmbPAGainStep * 3; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(double * ppaGaindB) + +@brief + This function is used to get the PPA gain + +@param [out] uint32 * ppaGaindB + The retrieved PPA gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(double *ppaGaindB) +{ + uint32 val32, ppaGain, m_cmbPPAGainStep; + + if (!ppaGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1ea0); + + ppaGain = (val32 >> 5) & 0x7; + + switch (ppaGain) { + case 0x1: + m_cmbPPAGainStep = 2; + break; + case 0x3: + m_cmbPPAGainStep = 1; + break; + case 0x7: + m_cmbPPAGainStep = 0; + break; + default: + m_cmbPPAGainStep = 3; + break; + } + + *ppaGaindB = 9 - m_cmbPPAGainStep * 3; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * totGaindB) + +@brief + This function is used to calculate the total gain + +@param [out] double * totGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, PA and PPA gain +values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double *totGaindB) +{ + double dGaindB, paGaindB, ppaGaindB; + + if (!totGaindB) + return M2M_ERR_INVALID_ARG; + + m2m_ate_get_pa_gain(&paGaindB); + m2m_ate_get_ppa_gain(&ppaGaindB); + m2m_ate_get_dig_gain(&dGaindB); + + *totGaindB = dGaindB + paGaindB + ppaGaindB; + + return M2M_SUCCESS; +} + +#endif //_M2M_ATE_FW_ diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_crypto.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_crypto.c new file mode 100644 index 0000000..ed24236 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_crypto.c @@ -0,0 +1,949 @@ +/** + * + * \file m2m_crypto.c + * + * \brief WINC Crypto module. + * + * Copyright (c) 2014 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_crypto.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +#ifdef CONF_CRYPTO_HW + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*======*======*======*======*======*=======* + * WINC SHA256 HW Engine Register Definition * + *======*======*======*======*======*========*/ + +#define SHA_BLOCK_SIZE (64) + +#define SHARED_MEM_BASE (0xd0000) + +#define SHA256_MEM_BASE (0x180000UL) +#define SHA256_ENGINE_ADDR (0x180000ul) + +/* SHA256 Registers */ +#define SHA256_CTRL (SHA256_MEM_BASE + 0x00) +#define SHA256_CTRL_START_CALC_MASK (NBIT0) +#define SHA256_CTRL_START_CALC_SHIFT (0) +#define SHA256_CTRL_PREPROCESS_MASK (NBIT1) +#define SHA256_CTRL_PREPROCESS_SHIFT (1) +#define SHA256_CTRL_HASH_HASH_MASK (NBIT2) +#define SHA256_CTRL_HASH_HASH_SHIFT (2) +#define SHA256_CTRL_INIT_SHA256_STATE_MASK (NBIT3) +#define SHA256_CTRL_INIT_SHA256_STATE_SHIFT (3) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_MASK (NBIT4) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_SHIFT (4) +#define SHA256_CTRL_FORCE_SHA256_QUIT_MASK (NBIT5) +#define SHA256_CTRL_FORCE_SHA256_QUIT_SHIFT (5) + +#define SHA256_REGS_SHA256_CTRL_AHB_BYTE_REV_EN (NBIT6) +#define SHA256_REGS_SHA256_CTRL_RESERVED (NBIT7) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO (NBIT8 + NBIT9 + NBIT10) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_MASK (NBIT2 + NBIT1 + NBIT0) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_SHIFT (8) +#define SHA256_REGS_SHA256_CTRL_RESERVED_11 (NBIT11) +#define SHA256_REGS_SHA256_CTRL_SHA1_CALC (NBIT12) +#define SHA256_REGS_SHA256_CTRL_PBKDF2_SHA1_CALC (NBIT13) + +#define SHA256_START_RD_ADDR (SHA256_MEM_BASE + 0x04UL) +#define SHA256_DATA_LENGTH (SHA256_MEM_BASE + 0x08UL) +#define SHA256_START_WR_ADDR (SHA256_MEM_BASE + 0x0cUL) +#define SHA256_COND_CHK_CTRL (SHA256_MEM_BASE + 0x10) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_MASK (NBIT1 | NBIT0) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_SHIFT (0) +#define SHA256_COND_CHK_CTRL_STEP_VAL_MASK (NBIT6 | NBIT5 | NBIT4 | NBIT3 | NBIT2) +#define SHA256_COND_CHK_CTRL_STEP_VAL_SHIFT (2) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_MASK (NBIT7) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_SHIFT (7) + +#define SHA256_MOD_DATA_RANGE (SHA256_MEM_BASE + 0x14) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_MASK (NBIT24 - 1) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_SHIFT (0) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_MASK (NBIT24 | NBIT25 | NBIT26) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_SHIFT (24) + +#define SHA256_COND_CHK_STS_1 (SHA256_MEM_BASE + 0x18) +#define SHA256_COND_CHK_STS_2 (SHA256_MEM_BASE + 0x1c) +#define SHA256_DONE_INTR_ENABLE (SHA256_MEM_BASE + 0x20) +#define SHA256_DONE_INTR_STS (SHA256_MEM_BASE + 0x24) +#define SHA256_TARGET_HASH_H1 (SHA256_MEM_BASE + 0x28) +#define SHA256_TARGET_HASH_H2 (SHA256_MEM_BASE + 0x2c) +#define SHA256_TARGET_HASH_H3 (SHA256_MEM_BASE + 0x30) +#define SHA256_TARGET_HASH_H4 (SHA256_MEM_BASE + 0x34) +#define SHA256_TARGET_HASH_H5 (SHA256_MEM_BASE + 0x38) +#define SHA256_TARGET_HASH_H6 (SHA256_MEM_BASE + 0x3c) +#define SHA256_TARGET_HASH_H7 (SHA256_MEM_BASE + 0x40) +#define SHA256_TARGET_HASH_H8 (SHA256_MEM_BASE + 0x44) + +/*======*======*======*======*======*=======* + * WINC BIGINT HW Engine Register Definition * + *======*======*======*======*======*========*/ + +#define BIGINT_ENGINE_ADDR (0x180080ul) +#define BIGINT_VERSION (BIGINT_ENGINE_ADDR + 0x00) + +#define BIGINT_MISC_CTRL (BIGINT_ENGINE_ADDR + 0x04) +#define BIGINT_MISC_CTRL_CTL_START (NBIT0) +#define BIGINT_MISC_CTRL_CTL_RESET (NBIT1) +#define BIGINT_MISC_CTRL_CTL_MSW_FIRST (NBIT2) +#define BIGINT_MISC_CTRL_CTL_SWAP_BYTE_ORDER (NBIT3) +#define BIGINT_MISC_CTRL_CTL_FORCE_BARRETT (NBIT4) +#define BIGINT_MISC_CTRL_CTL_M_PRIME_VALID (NBIT5) + +#define BIGINT_M_PRIME (BIGINT_ENGINE_ADDR + 0x08) + +#define BIGINT_STATUS (BIGINT_ENGINE_ADDR + 0x0C) +#define BIGINT_STATUS_STS_DONE (NBIT0) + +#define BIGINT_CLK_COUNT (BIGINT_ENGINE_ADDR + 0x10) +#define BIGINT_ADDR_X (BIGINT_ENGINE_ADDR + 0x14) +#define BIGINT_ADDR_E (BIGINT_ENGINE_ADDR + 0x18) +#define BIGINT_ADDR_M (BIGINT_ENGINE_ADDR + 0x1C) +#define BIGINT_ADDR_R (BIGINT_ENGINE_ADDR + 0x20) +#define BIGINT_LENGTH (BIGINT_ENGINE_ADDR + 0x24) + +#define BIGINT_IRQ_STS (BIGINT_ENGINE_ADDR + 0x28) +#define BIGINT_IRQ_STS_DONE (NBIT0) +#define BIGINT_IRQ_STS_CHOOSE_MONT (NBIT1) +#define BIGINT_IRQ_STS_M_READ (NBIT2) +#define BIGINT_IRQ_STS_X_READ (NBIT3) +#define BIGINT_IRQ_STS_START (NBIT4) +#define BIGINT_IRQ_STS_PRECOMP_FINISH (NBIT5) + +#define BIGINT_IRQ_MASK (BIGINT_ENGINE_ADDR + 0x2C) +#define BIGINT_IRQ_MASK_CTL_IRQ_MASK_START (NBIT4) + +#define ENABLE_FLIPPING 1 + +#define GET_UINT32(BUF, OFFSET) \ + (((uint32)((BUF)[OFFSET])) | ((uint32)(((BUF)[OFFSET + 1]) << 8)) | ((uint32)(((BUF)[OFFSET + 2]) << 16)) \ + | ((uint32)(((BUF)[OFFSET + 3]) << 24))) + +#define PUTU32(VAL32, BUF, OFFSET) \ + do { \ + (BUF)[OFFSET] = BYTE_3((VAL32)); \ + (BUF)[OFFSET + 1] = BYTE_2((VAL32)); \ + (BUF)[OFFSET + 2] = BYTE_1((VAL32)); \ + (BUF)[OFFSET + 3] = BYTE_0((VAL32)); \ + } while (0) + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrHashContext + +@brief +*/ +typedef struct { + uint32 au32HashState[M2M_SHA256_DIGEST_LEN / 4]; + uint8 au8CurrentBlock[64]; + uint32 u32TotalLength; + uint8 u8InitHashFlag; +} tstrSHA256HashCtxt; + +/*======*======*======*======*======*=======* + * SHA256 IMPLEMENTATION * + *======*======*======*======*======*========*/ + +sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt) +{ + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + m2m_memset((uint8 *)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt)); + pstrSHA256->u8InitHashFlag = 1; + } + return 0; +} + +sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint32 u32ResidualBytes; + uint32 u32NBlocks; + uint32 u32Offset; + uint32 u32CurrentBlock = 0; + uint8 u8IsDone = 0; + + /* Get the remaining bytes from the previous update (if the length is not block aligned). */ + u32ResidualBytes = pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE; + + /* Update the total data length. */ + pstrSHA256->u32TotalLength += u16DataLength; + + if (u32ResidualBytes != 0) { + if ((u32ResidualBytes + u16DataLength) >= SHA_BLOCK_SIZE) { + u32Offset = SHA_BLOCK_SIZE - u32ResidualBytes; + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u32Offset); + pu8Data += u32Offset; + u16DataLength -= u32Offset; + + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + u32CurrentBlock = 1; + } else { + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u16DataLength); + u16DataLength = 0; + } + } + + /* Get the number of HASH BLOCKs and the residual bytes. */ + u32NBlocks = u16DataLength / SHA_BLOCK_SIZE; + u32ResidualBytes = u16DataLength % SHA_BLOCK_SIZE; + + if (u32NBlocks != 0) { + nm_write_block(u32Addr, pu8Data, (uint16)(u32NBlocks * SHA_BLOCK_SIZE)); + pu8Data += (u32NBlocks * SHA_BLOCK_SIZE); + } + + u32NBlocks += u32CurrentBlock; + if (u32NBlocks != 0) { + uint32 u32RegVal = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if (pstrSHA256->u8InitHashFlag) { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + u32ReadAddr = u32WriteAddr + (u32NBlocks * SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u32NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + + u32RegVal &= ~(0x7 << 8); + u32RegVal |= (2 << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while (!u8IsDone) { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + } + if (u32ResidualBytes != 0) { + m2m_memcpy(pstrSHA256->au8CurrentBlock, pu8Data, u32ResidualBytes); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint16 u16Offset; + uint16 u16PaddingLength; + uint16 u16NBlocks = 1; + uint32 u32RegVal = 0; + uint32 u32Idx, u32ByteIdx; + uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4]; + uint8 u8IsDone = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if (pstrSHA256->u8InitHashFlag) { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + /* Calculate the offset of the last data byte in the current block. */ + u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE); + + /* Add the padding byte 0x80. */ + pstrSHA256->au8CurrentBlock[u16Offset++] = 0x80; + + /* Calculate the required padding to complete + one Hash Block Size. + */ + u16PaddingLength = SHA_BLOCK_SIZE - u16Offset; + m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength); + + /* If the padding count is not enough to hold 64-bit representation of + the total input message length, one padding block is required. + */ + if (u16PaddingLength < 8) { + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE); + u16NBlocks++; + } + + /* pack the length at the end of the padding block */ + PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4)); + + u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE); + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK; + u32RegVal &= ~(0x7UL << 8); + u32RegVal |= (0x2UL << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while (!u8IsDone) { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + nm_read_block(u32ReadAddr, (uint8 *)au32Digest, 32); + + /* Convert the output words to an array of bytes. + */ + u32ByteIdx = 0; + for (u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx++) { + pu8Sha256Digest[u32ByteIdx++] = BYTE_3(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_2(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_1(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_0(au32Digest[u32Idx]); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +/*======*======*======*======*======*=======* + * RSA IMPLEMENTATION * + *======*======*======*======*======*========*/ + +static void FlipBuffer(uint8 *pu8InBuffer, uint8 *pu8OutBuffer, uint16 u16BufferSize) +{ + uint16 u16Idx; + for (u16Idx = 0; u16Idx < u16BufferSize; u16Idx++) { +#if ENABLE_FLIPPING == 1 + pu8OutBuffer[u16Idx] = pu8InBuffer[u16BufferSize - u16Idx - 1]; +#else + pu8OutBuffer[u16Idx] = pu8InBuffer[u16Idx]; +#endif + } +} + +void BigInt_ModExp(uint8 *pu8X, uint16 u16XSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8M, uint16 u16MSize, + uint8 *pu8R, uint16 u16RSize) +{ + uint32 u32Reg; + uint8 au8Tmp[780] = {0}; + uint32 u32XAddr = SHARED_MEM_BASE; + uint32 u32MAddr; + uint32 u32EAddr; + uint32 u32RAddr; + uint8 u8EMswBits = 32; + uint32 u32Mprime = 0x7F; + uint16 u16XSizeWords, u16ESizeWords; + uint32 u32Exponent; + + u16XSizeWords = (u16XSize + 3) / 4; + u16ESizeWords = (u16ESize + 3) / 4; + + u32MAddr = u32XAddr + (u16XSizeWords * 4); + u32EAddr = u32MAddr + (u16XSizeWords * 4); + u32RAddr = u32EAddr + (u16ESizeWords * 4); + + /* Reset the core. + */ + u32Reg = 0; + u32Reg |= BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + + nm_write_block(u32RAddr, au8Tmp, u16RSize); + + /* Write Input Operands to Chip Memory. + */ + /*------- X -------*/ + FlipBuffer(pu8X, au8Tmp, u16XSize); + nm_write_block(u32XAddr, au8Tmp, u16XSizeWords * 4); + + /*------- E -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8E, au8Tmp, u16ESize); + nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4); + u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4); + while ((u32Exponent & NBIT31) == 0) { + u32Exponent <<= 1; + u8EMswBits--; + } + + /*------- M -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8M, au8Tmp, u16XSize); + nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4); + + /* Program the addresses of the input operands. + */ + nm_write_reg(BIGINT_ADDR_X, u32XAddr); + nm_write_reg(BIGINT_ADDR_E, u32EAddr); + nm_write_reg(BIGINT_ADDR_M, u32MAddr); + nm_write_reg(BIGINT_ADDR_R, u32RAddr); + + /* Mprime. + */ + nm_write_reg(BIGINT_M_PRIME, u32Mprime); + + /* Length. + */ + u32Reg = (u16XSizeWords & 0xFF); + u32Reg += ((u16ESizeWords & 0xFF) << 8); + u32Reg += (u8EMswBits << 16); + nm_write_reg(BIGINT_LENGTH, u32Reg); + + /* CTRL Register. + */ + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg ^= BIGINT_MISC_CTRL_CTL_START; + u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT; + // u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID; +#if ENABLE_FLIPPING == 0 + u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST; +#endif + nm_write_reg(BIGINT_MISC_CTRL, u32Reg); + + /* Wait for computation to complete. */ + while (1) { + u32Reg = nm_read_reg(BIGINT_IRQ_STS); + if (u32Reg & BIGINT_IRQ_STS_DONE) { + break; + } + } + nm_write_reg(BIGINT_IRQ_STS, 0); + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + nm_read_block(u32RAddr, au8Tmp, u16RSize); + FlipBuffer(au8Tmp, pu8R, u16RSize); +} + +#define MD5_DIGEST_SIZE (16) +#define SHA1_DIGEST_SIZE (20) + +static const uint8 au8TEncodingMD5[] + = {0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the MD5 hash algorithm. + */ + +static const uint8 au8TEncodingSHA1[] + = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the SHA-1 hash algorithm. + */ + +static const uint8 au8TEncodingSHA2[] + = {0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the SHA-2 hash algorithm. + */ + +sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if ((pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if (u16HashLength == MD5_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } else if (u16HashLength == SHA1_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } else { + pu8T = (uint8 *)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if (u16NSize >= (u16TLength + 11)) { + uint32 u32PSLength, u32Idx = 0; + + /* + RSA verification + */ + BigInt_ModExp(pu8RsaSignature, u16NSize, pu8E, u16ESize, pu8N, u16NSize, au8EM, u16NSize); + + u32PSLength = u16NSize - u16TLength - 3; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + if ((au8EM[0] == 0x00) && (au8EM[1] == 0x01)) { + for (u32Idx = 2; au8EM[u32Idx] == 0xFF; u32Idx++) + ; + if (u32Idx == (u32PSLength + 2)) { + if (au8EM[u32Idx++] == 0x00) { + if (!m2m_memcmp(&au8EM[u32Idx], pu8T, u16TEncodingLength)) { + u32Idx += u16TEncodingLength; + if (au8EM[u32Idx++] == u16HashLength) + s8Ret = m2m_memcmp(&au8EM[u32Idx], pu8SignedMsgHash, u16HashLength); + } + } + } + } + } + } + return s8Ret; +} + +sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if ((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if (u16HashLength == MD5_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } else if (u16HashLength == SHA1_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } else { + pu8T = (uint8 *)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if (u16NSize >= (u16TLength + 11)) { + uint16 u16PSLength = 0; + uint16 u16Offset = 0; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + au8EM[u16Offset++] = 0; + au8EM[u16Offset++] = 1; + u16PSLength = u16NSize - u16TLength - 3; + m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength); + u16Offset += u16PSLength; + au8EM[u16Offset++] = 0; + m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength); + u16Offset += u16TEncodingLength; + au8EM[u16Offset++] = u16HashLength; + m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength); + + /* + RSA Signature Generation + */ + BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize); + s8Ret = M2M_RSA_SIGN_OK; + } + } + return s8Ret; +} + +#endif /* CONF_CRYPTO */ + +#ifdef CONF_CRYPTO_SOFT + +typedef struct { + tpfAppCryproCb pfAppCryptoCb; + uint8 * pu8Digest; + uint8 * pu8Rsa; + uint8 u8CryptoBusy; +} tstrCryptoCtxt; + +typedef struct { + uint8 au8N[M2M_MAX_RSA_LEN]; + uint8 au8E[M2M_MAX_RSA_LEN]; + uint8 au8Hash[M2M_SHA256_DIGEST_LEN]; + uint16 u16Nsz; + uint16 u16Esz; + uint16 u16Hsz; + uint8 _pad16_[2]; +} tstrRsaPayload; + +static tstrCryptoCtxt gstrCryptoCtxt; + +/** + * @fn m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @author + * @date + * @version 1.0 + */ +static void m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + gstrCryptoCtxt.u8CryptoBusy = 0; + if (u8OpCode == M2M_CRYPTO_RESP_SHA256_INIT) { + tstrM2mSha256Ctxt strCtxt; + if (hif_receive(u32Addr, (uint8 *)&strCtxt, sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, &strCtxt); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_SHA256_UPDATE) { + tstrM2mSha256Ctxt strCtxt; + if (hif_receive(u32Addr, (uint8 *)&strCtxt, sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, &strCtxt); + } + } + + } else if (u8OpCode == M2M_CRYPTO_RESP_SHA256_FINSIH) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 0) + == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp), + (uint8 *)gstrCryptoCtxt.pu8Digest, + M2M_SHA256_DIGEST_LEN, + 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, gstrCryptoCtxt.pu8Digest); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_GEN) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8 *)&strResp, sizeof(tstrCyptoResp), 0) == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrRsaPayload) + sizeof(tstrCyptoResp), + (uint8 *)gstrCryptoCtxt.pu8Rsa, + M2M_MAX_RSA_LEN, + 0) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, gstrCryptoCtxt.pu8Rsa); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_VERIFY) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, NULL); + } + } else { + M2M_ERR("u8Code %d ??\n", u8OpCode); + } +} +/*! +@fn \ + sint8 m2m_crypto_init(); + +@brief crypto initialization + +@param[in] pfAppCryproCb + +*/ +sint8 m2m_crypto_init(tpfAppCryproCb pfAppCryproCb) +{ + sint8 ret = M2M_ERR_FAIL; + m2m_memset((uint8 *)&gstrCryptoCtxt, 0, sizeof(tstrCryptoCtxt)); + if (pfAppCryproCb != NULL) { + gstrCryptoCtxt.pfAppCryptoCb = pfAppCryproCb; + ret = hif_register_cb(M2M_REQ_GROUP_CRYPTO, m2m_crypto_cb); + } + return ret; +} +/*! +@fn \ + sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + +@brief SHA256 hash initialization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. +*/ +sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt) +{ + sint8 ret = M2M_ERR_FAIL; + if ((psha256Ctxt != NULL) && (!gstrCryptoCtxt.u8CryptoBusy)) { + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_INIT | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + +@brief SHA256 hash update + +@param [in] psha256Ctxt + Pointer to the sha256 context. + +@param [in] pu8Data + Buffer holding the data submitted to the hash. + +@param [in] u16DataLength + Size of the data bufefr in bytes. +*/ +sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Data != NULL) + && (u16DataLength < M2M_SHA256_MAX_DATA)) { + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_UPDATE | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + pu8Data, + u16DataLength, + sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp)); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + +@brief SHA256 hash finalization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. + +@param [in] pu8Sha256Digest + Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less +than M2M_SHA256_DIGEST_LEN. +*/ +sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Sha256Digest != NULL)) { + gstrCryptoCtxt.pu8Digest = pu8Sha256Digest; + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_FINSIH | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Verification + + The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed +message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is +identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8E + RSA public exponent. + +@param[in] u16ESize + Size of the RSA public exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Signature value to be verified. +*/ + +sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) + && (pu8SignedMsgHash != NULL) && (u16NSize != 0) && (u16ESize != 0) && (u16HashLength != 0) + && (pu8RsaSignature != NULL)) + + { + tstrRsaPayload strRsa = {0}; + + m2m_memcpy(strRsa.au8N, pu8N, u16NSize); + m2m_memcpy(strRsa.au8E, pu8E, u16ESize); + m2m_memcpy(strRsa.au8Hash, pu8SignedMsgHash, u16HashLength); + + strRsa.u16Esz = u16ESize; + strRsa.u16Hsz = u16HashLength; + strRsa.u16Nsz = u16NSize; + + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_RSA_SIGN_VERIFY | M2M_REQ_DATA_PKT, + (uint8 *)&strRsa, + sizeof(tstrRsaPayload), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Generation + + The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed +message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is +identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8d + RSA private exponent. + +@param[in] u16dSize + Size of the RSA private exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Pointer to a user buffer allocated by teh caller shall hold the generated signature. +*/ +sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) + && (pu8SignedMsgHash != NULL) && (u16NSize != 0) && (u16dSize != 0) && (u16HashLength != 0) + && (pu8RsaSignature != NULL)) + + { + tstrRsaPayload strRsa = {0}; + + m2m_memcpy(strRsa.au8N, pu8N, u16NSize); + m2m_memcpy(strRsa.au8E, pu8d, u16dSize); + m2m_memcpy(strRsa.au8Hash, pu8SignedMsgHash, u16HashLength); + + strRsa.u16Esz = u16dSize; + strRsa.u16Hsz = u16HashLength; + strRsa.u16Nsz = u16NSize; + + gstrCryptoCtxt.pu8Rsa = pu8RsaSignature; + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_RSA_SIGN_GEN | M2M_REQ_DATA_PKT, + (uint8 *)&strRsa, + sizeof(tstrRsaPayload), + NULL, + 0, + 0); + } + return ret; +} + +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.c new file mode 100644 index 0000000..e46f4c8 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.c @@ -0,0 +1,679 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "m2m_hif.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_periph.h" + +#if (defined NM_EDGE_INTERRUPT) && (defined NM_LEVEL_INTERRUPT) +#error "only one type of interrupt NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#if !((defined NM_EDGE_INTERRUPT) || (defined NM_LEVEL_INTERRUPT)) +#error "define interrupt type NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#ifndef CORTUS_APP +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WIFI_HOST_RCV_CTRL_4 (0x150400) +#define WIFI_HOST_RCV_CTRL_5 (0x1088) + +typedef struct { + uint8 u8ChipMode; + uint8 u8ChipSleep; + uint8 u8HifRXDone; + uint8 u8Interrupt; + uint8 u8Yield; + uint32 u32RxAddr; + uint32 u32RxSize; + tpfHifCallBack pfWifiCb; + tpfHifCallBack pfIpCb; + tpfHifCallBack pfOtaCb; + tpfHifCallBack pfSigmaCb; + tpfHifCallBack pfHifCb; + tpfHifCallBack pfCryptoCb; + tpfHifCallBack pfSslCb; +} tstrHifContext; + +volatile tstrHifContext gstrHifCxt; + +#ifdef ETH_MODE +extern void os_hook_isr(void); +#endif + +static void isr(void) +{ + gstrHifCxt.u8Interrupt++; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(0); +#endif +#ifdef ETH_MODE + os_hook_isr(); +#endif +} +static sint8 hif_set_rx_done(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; + + gstrHifCxt.u8HifRXDone = 0; +#ifdef NM_EDGE_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + /* Set RX Done */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if (ret != M2M_SUCCESS) + goto ERR1; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif +ERR1: + return ret; +} +/** + * @fn static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ +} +/** + * @fn NMI_API sint8 hif_chip_wake(void); + * @brief To Wakeup the chip. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + if (gstrHifCxt.u8HifRXDone) { + /*chip already wake for the rx not done no need to send wake request*/ + return ret; + } + if (gstrHifCxt.u8ChipSleep == 0) { + if (gstrHifCxt.u8ChipMode != M2M_NO_PS) { + ret = chip_wake(); + if (ret != M2M_SUCCESS) + goto ERR1; + } else { + } + } + gstrHifCxt.u8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8 u8Pstype) +{ + gstrHifCxt.u8ChipMode = u8Pstype; +} +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8 hif_get_sleep_mode(void) +{ + return gstrHifCxt.u8ChipMode; +} + +/** + * @fn NMI_API sint8 hif_chip_sleep_sc(void); + * @brief To clear the chip sleep but keep the chip sleep + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_sleep_sc(void) +{ + if (gstrHifCxt.u8ChipSleep >= 1) { + gstrHifCxt.u8ChipSleep--; + } + return M2M_SUCCESS; +} +/** + * @fn NMI_API sint8 hif_chip_sleep(void); + * @brief To make the chip sleep. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_sleep(void) +{ + sint8 ret = M2M_SUCCESS; + + if (gstrHifCxt.u8ChipSleep >= 1) { + gstrHifCxt.u8ChipSleep--; + } + + if (gstrHifCxt.u8ChipSleep == 0) { + if (gstrHifCxt.u8ChipMode != M2M_NO_PS) { + ret = chip_sleep(); + if (ret != M2M_SUCCESS) + goto ERR1; + + } else { + } + } +ERR1: + return ret; +} +/** + * @fn NMI_API sint8 hif_init(void * arg); + * @brief To initialize HIF layer. + * @param [in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_init(void *arg) +{ + m2m_memset((uint8 *)&gstrHifCxt, 0, sizeof(tstrHifContext)); + nm_bsp_register_isr(isr); + hif_register_cb(M2M_REQ_GROUP_HIF, m2m_hif_cb); + return M2M_SUCCESS; +} +/** + * @fn NMI_API sint8 hif_deinit(void * arg); + * @brief To De-initialize HIF layer. + * @param [in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +sint8 hif_deinit(void *arg) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + m2m_memset((uint8 *)&gstrHifCxt, 0, sizeof(tstrHifContext)); + return ret; +} +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_send(uint8 u8Gid, uint8 u8Opcode, uint8 *pu8CtrlBuf, uint16 u16CtrlBufSize, uint8 *pu8DataBuf, + uint16 u16DataSize, uint16 u16DataOffset) +{ + sint8 ret = M2M_ERR_SEND; + volatile tstrHifHdr strHif; + + strHif.u8Opcode = u8Opcode & (~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + if (pu8DataBuf != NULL) { + strHif.u16Length += u16DataOffset + u16DataSize; + } else { + strHif.u16Length += u16CtrlBufSize; + } + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + volatile uint32 reg, dma_addr = 0; + volatile uint16 cnt = 0; +//#define OPTIMIZE_BUS +/*please define in firmware also*/ +#ifndef OPTIMIZE_BUS + reg = 0UL; + reg |= (uint32)u8Gid; + reg |= ((uint32)u8Opcode << 8); + reg |= ((uint32)strHif.u16Length << 16); + ret = nm_write_reg(NMI_STATE_REG, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg = 0UL; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +#else + reg = 0UL; + reg |= NBIT1; + reg |= ((u8Opcode & NBIT7) ? (NBIT2) : (0)); /*Data = 1 or config*/ + reg |= (u8Gid == M2M_REQ_GROUP_IP) ? (NBIT3) : (0); /*IP = 1 or non IP*/ + reg |= ((uint32)strHif.u16Length << 4); /*length of pkt max = 4096*/ + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +#endif + dma_addr = 0; + + for (cnt = 0; cnt < 1000; cnt++) { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2, (uint32 *)®); + if (ret != M2M_SUCCESS) + break; + /* + * If it takes too long to get a response, the slow down to + * avoid back-to-back register read operations. + */ + if (cnt >= 500) { + if (cnt < 501) { + M2M_INFO("Slowing down...\n"); + } + nm_bsp_sleep(1); + } + if (!(reg & NBIT1)) { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4, (uint32 *)&dma_addr); + if (ret != M2M_SUCCESS) { + /*in case of read error clear the DMA address and return error*/ + dma_addr = 0; + goto ERR1; + } + /*in case of success break */ + break; + } + } + + if (dma_addr != 0) { + volatile uint32 u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8 *)&strHif, M2M_HIF_HDR_OFFSET); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if (pu8CtrlBuf != NULL) { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if (pu8DataBuf != NULL) { + u32CurrAddr += (u16DataOffset - u16CtrlBufSize); + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + } else { + ret = hif_chip_sleep(); + M2M_DBG("Failed to alloc rx size %d\r", ret); + ret = M2M_ERR_MEM_ALLOC; + goto ERR2; + } + + } else { + M2M_ERR("(HIF)Fail to wakup the chip\n"); + goto ERR2; + } + /*actual sleep ret = M2M_SUCCESS*/ + ret = hif_chip_sleep(); + return ret; +ERR1: + /*reset the count but no actual sleep as it already bus error*/ + hif_chip_sleep_sc(); +ERR2: + /*logical error*/ + return ret; +} +/** + * @fn hif_isr + * @brief Host interface interrupt service routine + * @author M. Abdelmawla + * @date 15 July 2012 + * @return 1 in case of interrupt received else 0 will be returned + * @version 1.0 + */ +static sint8 hif_isr(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg; + volatile tstrHifHdr strHif; + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if (M2M_SUCCESS == ret) { + if (reg & 0x1) /* New interrupt has been received */ + { + uint16 size; + + nm_bsp_interrupt_ctrl(0); + /*Clearing RX interrupt*/ + reg &= ~NBIT0; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + gstrHifCxt.u8HifRXDone = 1; + size = (uint16)((reg >> 2) & 0xfff); + if (size > 0) { + uint32 address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if (M2M_SUCCESS != ret) { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + gstrHifCxt.u32RxAddr = address; + gstrHifCxt.u32RxSize = size; + ret = nm_read_block(address, (uint8 *)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if (M2M_SUCCESS != ret) { + M2M_ERR("(hif) address bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + if (strHif.u16Length != size) { + if ((size - strHif.u16Length) > 4) { + M2M_ERR("(hif) Corrupted packet Size = %u \n", + size, + strHif.u16Length, + strHif.u8Gid, + strHif.u8Opcode); + nm_bsp_interrupt_ctrl(1); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + + if (M2M_REQ_GROUP_WIFI == strHif.u8Gid) { + if (gstrHifCxt.pfWifiCb) + gstrHifCxt.pfWifiCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("WIFI callback is not registered\n"); + + } else if (M2M_REQ_GROUP_IP == strHif.u8Gid) { + if (gstrHifCxt.pfIpCb) + gstrHifCxt.pfIpCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Scoket callback is not registered\n"); + + } else if (M2M_REQ_GROUP_OTA == strHif.u8Gid) { + if (gstrHifCxt.pfOtaCb) + gstrHifCxt.pfOtaCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Ota callback is not registered\n"); + + } else if (M2M_REQ_GROUP_CRYPTO == strHif.u8Gid) { + if (gstrHifCxt.pfCryptoCb) + gstrHifCxt.pfCryptoCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + + else + M2M_ERR("Crypto callback is not registered\n"); + } else if (M2M_REQ_GROUP_SIGMA == strHif.u8Gid) { + if (gstrHifCxt.pfSigmaCb) + gstrHifCxt.pfSigmaCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Sigma callback is not registered\n"); + } else if (M2M_REQ_GROUP_SSL == strHif.u8Gid) { + if (gstrHifCxt.pfSslCb) + gstrHifCxt.pfSslCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } else { + M2M_ERR("(hif) invalid group ID\n"); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + if (gstrHifCxt.u8HifRXDone) { + M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode); + ret = hif_set_rx_done(); + if (ret != M2M_SUCCESS) + goto ERR1; + } + } else { + M2M_ERR("(hif) Wrong Size\n"); + ret = M2M_ERR_RCV; + goto ERR1; + } + } else { +#ifndef WIN32 + M2M_ERR("(hif) False interrupt %lx", reg); + ret = M2M_ERR_FAIL; + goto ERR1; +#else +#endif + } + } else { + M2M_ERR("(hif) Fail to Read interrupt reg\n"); + goto ERR1; + } + +ERR1: + return ret; +} + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +void hif_yield(void) +{ + gstrHifCxt.u8Yield = 1; +} + +/** + * @fn hif_handle_isr(void) + * @brief Handle interrupt received from NMC1500 firmware. + * @return The function SHALL return 0 for success and a negative value otherwise. + */ + +sint8 hif_handle_isr(void) +{ + sint8 ret = M2M_SUCCESS; + + gstrHifCxt.u8Yield = 0; + while (gstrHifCxt.u8Interrupt && !gstrHifCxt.u8Yield) { + /*must be at that place because of the race of interrupt increment and that decrement*/ + /*when the interrupt enabled*/ + gstrHifCxt.u8Interrupt--; + while (1) { + ret = hif_isr(); + if (ret == M2M_SUCCESS) { + /*we will try forever untill we get that interrupt*/ + /*Fail return errors here due to bus errors (reading expected values)*/ + break; + } else { + M2M_ERR("(HIF) Fail to handle interrupt %d try Again..\n", ret); + } + } + } + + return ret; +} +/* + * @fn hif_receive + * @brief Host interface interrupt serviece routine + * @param [in] u32Addr + * Receive start address + * @param [out] pu8Buf + * Pointer to receive buffer. Allocated by the caller + * @param [in] u16Sz + * Receive buffer size + * @param [in] isDone + * If you don't need any more packets send True otherwise send false + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone) +{ + sint8 ret = M2M_SUCCESS; + if ((u32Addr == 0) || (pu8Buf == NULL) || (u16Sz == 0)) { + if (isDone) { + /* set RX done */ + ret = hif_set_rx_done(); + } else { + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\n"); + } + goto ERR1; + } + + if (u16Sz > gstrHifCxt.u32RxSize) { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the recived buffer size <%u><%lu>\n", u16Sz, gstrHifCxt.u32RxSize); + goto ERR1; + } + if ((u32Addr < gstrHifCxt.u32RxAddr) || ((u32Addr + u16Sz) > (gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize))) { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the recived buffer address and length\n"); + goto ERR1; + } + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if (ret != M2M_SUCCESS) + goto ERR1; + + /* check if this is the last packet */ + if ((((gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize) - (u32Addr + u16Sz)) <= 0) || isDone) { + /* set RX done */ + ret = hif_set_rx_done(); + } + +ERR1: + return ret; +} + +/** + * @fn hif_register_cb + * @brief To set Callback function for every compantent Component + * @param [in] u8Grp + * Group to which the Callback function should be set. + * @param [in] fn + * function to be set + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_register_cb(uint8 u8Grp, tpfHifCallBack fn) +{ + sint8 ret = M2M_SUCCESS; + switch (u8Grp) { + case M2M_REQ_GROUP_IP: + gstrHifCxt.pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + gstrHifCxt.pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + gstrHifCxt.pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + gstrHifCxt.pfHifCb = fn; + break; + case M2M_REQ_GROUP_CRYPTO: + gstrHifCxt.pfCryptoCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + gstrHifCxt.pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + gstrHifCxt.pfSslCb = fn; + break; + default: + M2M_ERR("GRp ? %d\n", u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.h b/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.h new file mode 100644 index 0000000..b8d7d19 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_hif.h @@ -0,0 +1,255 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +/*!< Include depends on UNO Board is used or not*/ +#ifdef ENABLE_UNO_BOARD +#include "m2m_uno_hif.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. + */ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + +/** + * @struct tstrHifHdr + * @brief Structure to hold HIF header + */ +typedef struct { + uint8 u8Gid; /*!< Group ID */ + uint8 u8Opcode; /*!< OP code */ + uint16 u16Length; /*!< Payload length */ +} tstrHifHdr; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_init(void *arg); +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_deinit(void *arg); +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_send(uint8 u8Gid, uint8 u8Opcode, uint8 *pu8CtrlBuf, uint16 u16CtrlBufSize, uint8 *pu8DataBuf, + uint16 u16DataSize, uint16 u16DataOffset); +/* +* @fn hif_receive +* @brief Host interface interrupt serviece routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_register_cb(uint8 u8Grp, tpfHifCallBack fn); +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep(void); +/** +* @fn NMI_API sint8 hif_chip_sleep_sc(void); +* @brief + To clear the chip count only but keep the chip awake +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep_sc(void); +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_chip_wake(void); +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API void hif_set_sleep_mode(uint8 u8Pstype); +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +NMI_API uint8 hif_get_sleep_mode(void); + +#ifdef CORTUS_APP +/** +* @fn hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize) +* @brief + Response handler for HIF layer. + +* @param [in] pu8Buffer + Pointer to the buffer. + +* @param [in] u16BufferSize + Buffer size. + +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize); +#endif + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +NMI_API void hif_yield(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from NMC1500 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_ota.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_ota.c new file mode 100644 index 0000000..b383c7a --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_ota.c @@ -0,0 +1,395 @@ +/** + * + * \file + * + * \brief NMC1500 IoT OTA Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/include/m2m_ota.h" +#include "driver/source/m2m_hif.h" +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; +static tpfOtaNotifCb gpfOtaNotifCb = NULL; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** + * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_ota_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + if (u8OpCode == M2M_OTA_RESP_NOTIF_UPDATE_INFO) { + tstrOtaUpdateInfo strOtaUpdateInfo; + m2m_memset((uint8 *)&strOtaUpdateInfo, 0, sizeof(tstrOtaUpdateInfo)); + ret = hif_receive(u32Addr, (uint8 *)&strOtaUpdateInfo, sizeof(tstrOtaUpdateInfo), 0); + if (ret == M2M_SUCCESS) { + if (gpfOtaNotifCb) + gpfOtaNotifCb(&strOtaUpdateInfo); + } + } else if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + m2m_memset((uint8 *)&strOtaUpdateStatusResp, 0, sizeof(tstrOtaUpdateStatusResp)); + ret = hif_receive(u32Addr, (uint8 *)&strOtaUpdateStatusResp, sizeof(tstrOtaUpdateStatusResp), 0); + if (ret == M2M_SUCCESS) { + if (gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType, strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } else { + M2M_ERR("Invaild OTA resp %d ?\n", u8OpCode); + } +} +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb); + +@brief + Initialize the OTA layer. + +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb) +{ + sint8 ret = M2M_SUCCESS; + + if (pfOtaUpdateCb) { + gpfOtaUpdateCb = pfOtaUpdateCb; + } else { + M2M_ERR("Invaild Ota update cb\n"); + } + if (pfOtaNotifCb) { + gpfOtaNotifCb = pfOtaNotifCb; + } else { + M2M_ERR("Invaild Ota notify cb\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA, m2m_ota_cb); + + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + +@brief + Set the OTA url + +@param [in] u8Url + The url server address + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 *u8Url) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16UrlSize = m2m_strlen(u8Url) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_SET_URL, u8Url, u16UrlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + +@brief + check for ota update + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); + +@brief + Schedule OTA update + +@param [in] u32Period + Period in days + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + +@brief + Request OTA start update using the downloaded url + +@param [in] u8DownloadUrl + The download firmware url, you get it from device info + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 *u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_FW_UPDATE, u8DownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); + +@brief + Request OTA start for the Cortus app image. + +@param [in] u8DownloadUrl + The cortus application image url. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update_crt(uint8 *u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_CRT_UPDATE, u8DownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@brief + Request OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK_FW, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback_crt(void); + +@brief + Request Cortus application OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback_crt(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK_CRT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@brief + Request OTA Abort + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ABORT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@brief + Switch to the upgraded Firmware + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_FIRMWARE, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_crt(void); + +@brief + Switch to the upgraded cortus application. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_crt(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_CRT_IMG, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev * pstrRev); + +@brief + Get the OTA Firmware version. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#if 0 +#define M2M_OTA_FILE "../../../m2m_ota.dat" +NMI_API sint8 m2m_ota_test(void) +{ + uint32 page = 0; + uint8 buffer[1500]; + uint32 u32Sz = 0; + sint8 ret = M2M_SUCCESS; + FILE *fp =NULL; + fp = fopen(M2M_OTA_FILE,"rb"); + if(fp) + { + fseek(fp, 0L, SEEK_END); + u32Sz = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + while(u32Sz > 0) + { + { + page = (rand()%1400); + + if((page<100)||(page>1400)) page = 1400; + } + + if(u32Sz>page) + { + u32Sz-=page; + } + else + { + page = u32Sz; + u32Sz = 0; + } + printf("page %d\n", (int)page); + fread(buffer,page,1,fp); + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_TEST|M2M_REQ_DATA_PKT,NULL,0,(uint8*)&buffer,page,0); + if(ret != M2M_SUCCESS) + { + M2M_ERR("\n"); + } + nm_bsp_sleep(1); + } + + } + else + { + M2M_ERR("nO err\n"); + } + return ret; +} +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_periph.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_periph.c new file mode 100644 index 0000000..8ea870b --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_periph.c @@ -0,0 +1,169 @@ +/** + * + * \file + * + * \brief NMC1500 Peripherials Application Interface. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_periph.h" +#include "driver/source/nmasic.h" +#include "m2m_hif.h" + +#ifdef CONF_PERIPH + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static sint8 get_gpio_idx(uint8 u8GpioNum) +{ + if (u8GpioNum >= M2M_PERIPH_GPIO_MAX) + return -1; + if (u8GpioNum == M2M_PERIPH_GPIO15) { + return 15; + } else if (u8GpioNum == M2M_PERIPH_GPIO16) { + return 16; + } else if (u8GpioNum == M2M_PERIPH_GPIO18) { + return 18; + } else if (u8GpioNum == M2M_PERIPH_GPIO3) { + return 3; + } else if (u8GpioNum == M2M_PERIPH_GPIO4) { + return 4; + } else if (u8GpioNum == M2M_PERIPH_GPIO5) { + return 5; + } else if (u8GpioNum == M2M_PERIPH_GPIO6) { + return 6; + } else { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static sint8 gpio_ioctl(uint8 op, uint8 u8GpioNum, uint8 u8InVal, uint8 *pu8OutVal) +{ + sint8 ret, gpio; + + ret = hif_chip_wake(); + if (ret != M2M_SUCCESS) + goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if (gpio < 0) + goto _EXIT1; + + if (op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8)gpio, u8InVal); + } else if (op == GPIO_OP_SET) { + ret = set_gpio_val((uint8)gpio, u8InVal); + } else if (op == GPIO_OP_GET) { + ret = get_gpio_val((uint8)gpio, pu8OutVal); + } + if (ret != M2M_SUCCESS) + goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +sint8 m2m_periph_init(tstrPerphInitParam *param) +{ + return M2M_SUCCESS; +} + +sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 *pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam *param) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint8 flags) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint16 *pu16ReadLen, uint8 flags) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable) +{ + return pullup_ctrl(pinmask, enable); +} +#endif /* CONF_PERIPH */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_ssl.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_ssl.c new file mode 100644 index 0000000..ef2738f --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_ssl.c @@ -0,0 +1,310 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_ssl.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32 gu32HIFAddr = 0; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @fn \ m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + @brief SSL callback function + @param [in] u8OpCode + HIF Opcode type. + @param [in] u16DataSize + HIF data length. + @param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 s8tmp = M2M_SUCCESS; + switch (u8OpCode) { + case M2M_SSL_REQ_ECC: { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8 *)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if (s8tmp == M2M_SUCCESS) { + if (gpfAppSSLCb) { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } break; + case M2M_SSL_RESP_SET_CS_LIST: { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8 *)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if (s8tmp == M2M_SUCCESS) { + if (gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } break; + } + if (s8tmp != M2M_SUCCESS) { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + +/*! + @fn \ m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8 *pu8RspDataBuff, uint16 u16RspDataSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, + (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), + (uint8 *)strECCResp, + sizeof(tstrEccReqInfo), + pu8RspDataBuff, + u16RspDataSz, + sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_send_certs_to_winc(uint8* sector_buffer, uint32 sector_size) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8 *pu8Buffer, uint32 u32BufferSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_IND_CERTS_ECC | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_cert(uint32 u32ReadAddr, uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, + tstrECPoint* pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16 *pu16CurveType, uint8 *pu8Hash, uint8 *pu8Sig, tstrECPoint *pu8Key) +{ + uint8 bSetRxDone = 1; + uint16 u16HashSz, u16SigSz, u16KeySz; + sint8 s8Ret = M2M_SUCCESS; + + if (gu32HIFAddr == 0) + return M2M_ERR_FAIL; + + if (hif_receive(gu32HIFAddr, (uint8 *)pu16CurveType, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16KeySz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16HashSz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16SigSz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + (*pu16CurveType) = _htons((*pu16CurveType)); + pu8Key->u16Size = _htons(u16KeySz); + u16HashSz = _htons(u16HashSz); + u16SigSz = _htons(u16SigSz); + + if (hif_receive(gu32HIFAddr, pu8Key->X, pu8Key->u16Size * 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += (pu8Key->u16Size * 2); + + if (hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += u16HashSz; + + if (hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += u16SigSz; + + bSetRxDone = 0; + +__ERR: + if (bSetRxDone) { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_hash(uint32 u32ReadAddr, uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8 *pu8Hash, uint16 u16HashSz) +{ + uint8 bSetRxDone = 1; + sint8 s8Ret = M2M_SUCCESS; + + if (gu32HIFAddr == 0) + return M2M_ERR_FAIL; + + if (hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) + goto __ERR; + + bSetRxDone = 0; + +__ERR: + if (bSetRxDone) { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_stop_processing_certs(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_stop_processing_certs(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! + @fn \ m2m_ssl_ecc_process_done(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn \ + m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the +form of a bitmap containing the required ciphers to be on. There is no need to call this function if the application +will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC +ciphersuites. The caller can override the default with any desired combination, except for combinations involving both +RSA and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. If u32SslCsBMP does not +contain any ciphersuites supported by firmware, then the current active list will not be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP) +{ + sint8 s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send( + M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8 *)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + sint8 s8Ret = M2M_SUCCESS; + + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL, m2m_ssl_cb); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} diff --git a/AudioConsole.X/Source/winc1500/driver/source/m2m_wifi.c b/AudioConsole.X/Source/winc1500/driver/source/m2m_wifi.c new file mode 100644 index 0000000..6c98e5d --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/m2m_wifi.c @@ -0,0 +1,1435 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" + +/** + * \defgroup winc1500_group WINC1500 (Wi-Fi) + * + * \{ + */ + +static volatile uint8 gu8ChNum; +static volatile uint8 gu8scanInProgress = 0; +static tpfAppWifiCb gpfAppWifiCb = NULL; + +#ifdef ETH_MODE +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8 * gau8ethRcvBuf = NULL; +static uint16 gu16ethRcvBufSize; +#endif + +//#define CONF_MGMT +#ifdef CONF_MGMT +static tpfAppMonCb gpfAppMonCb = NULL; +static struct _tstrMgmtCtrl { + uint8 *pu8Buf; + uint16 u16Offset; + uint16 u16Sz; +} gstrMgmtCtrl = {NULL, 0, 0}; +#endif +/** + * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + uint8 rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8 *)&strState, sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8 *)&strSysTime, sizeof(tstrSystemTime), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } else if (u8OpCode == M2M_WIFI_RESP_CONN_INFO) { + tstrM2MConnInfo strConnInfo; + if (hif_receive(u32Addr, (uint8 *)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) { +#if 0 + if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) + { + tstrM2mWifiStateChanged strState; + m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); + if (app_wifi_recover_cb) + app_wifi_recover_cb(strState.u8CurrState); + } +#endif + } else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig); + } + } else if (u8OpCode == M2M_WIFI_REQ_WPS) { + tstrM2MWPSInfo strWps; + m2m_memset((uint8 *)&strWps, 0, sizeof(tstrM2MWPSInfo)); + if (hif_receive(u32Addr, (uint8 *)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) { + uint32 u32ConflictedIP; + if (hif_receive(u32Addr, (uint8 *)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \" \n", + BYTE_0(u32ConflictedIP), + BYTE_1(u32ConflictedIP), + BYTE_2(u32ConflictedIP), + BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + } + } else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) { + tstrM2mScanDone strState; + gu8scanInProgress = 0; + if (hif_receive(u32Addr, (uint8 *)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) { + tstrM2mWifiscanResult strScanResult; + if (hif_receive(u32Addr, (uint8 *)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } else if (u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) { + tstrM2MProvisionInfo strProvInfo; + if (hif_receive(u32Addr, (uint8 *)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } else if (u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) { + tstrM2MDefaultConnResp strResp; + if (hif_receive(u32Addr, (uint8 *)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + + else if (u8OpCode == M2M_WIFI_RESP_GET_PRNG) { + tstrPrng strPrng; + if (hif_receive(u32Addr, (uint8 *)&strPrng, sizeof(tstrPrng), 0) == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrPrng), strPrng.pu8RngBuff, strPrng.u16PrngSize, 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG, &strPrng); + } + } + } +#ifdef ETH_MODE + else if (u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) { + uint8 u8SetRxDone; + tstrM2mIpRsvdPkt strM2mRsvd; + if (hif_receive(u32Addr, (uint8 *)(&strM2mRsvd), sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) { + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16 u16Offset = strM2mRsvd.u16PktOffset; + strM2mIpCtrlBuf.u16RemainigDataSize = strM2mRsvd.u16PktSz; + if ((gpfAppEthCb) && (gau8ethRcvBuf) && (gu16ethRcvBufSize > 0)) { + do { + u8SetRxDone = 1; + if (strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) { + u8SetRxDone = 0; + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize; + } else { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; + } + + if (hif_receive(u32Addr + u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, u8SetRxDone) + == M2M_SUCCESS) { + strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } else { + break; + } + } while (strM2mIpCtrlBuf.u16RemainigDataSize > 0); + } + } + } +#endif /* ETH_MODE */ +#ifdef CONF_MGMT + else if (u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) { + + tstrM2MWifiRxPacketInfo strRxPacketInfo; + if (u16DataSize >= sizeof(tstrM2MWifiRxPacketInfo)) { + if (hif_receive(u32Addr, (uint8 *)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) { + u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); + if (u16DataSize > 0 && gstrMgmtCtrl.pu8Buf != NULL) { + if (u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) { + u16DataSize = gstrMgmtCtrl.u16Sz; + } + u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; + if (hif_receive(u32Addr, gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) + return; + } + if (gpfAppMonCb) + gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf, u16DataSize); + } + } else { + M2M_ERR("Incorrect mon data size %u\n", u16DataSize); + } + } +#endif + else { + M2M_ERR("REQ Not defined %d\n", u8OpCode); + } +} + +sint8 m2m_wifi_download_mode() +{ + sint8 ret = M2M_SUCCESS; + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(); + if (ret != M2M_SUCCESS) + goto _EXIT0; + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static sint8 m2m_validate_ap_parameters(CONST tstrM2MAPConfig *pstrM2MAPConfig) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (pstrM2MAPConfig == NULL) { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if ((m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) <= 0) + || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) >= M2M_MAX_SSID_LEN)) { + M2M_ERR("INVALID SSID\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if (pstrM2MAPConfig->u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPConfig->u8ListenChannel < M2M_WIFI_CH_1) { + M2M_ERR("INVALID CH\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if (!(pstrM2MAPConfig->au8DHCPServerIP[0] || pstrM2MAPConfig->au8DHCPServerIP[1])) { + if (!(pstrM2MAPConfig->au8DHCPServerIP[2])) { + M2M_ERR("INVALID DHCP SERVER IP\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_OPEN) { + goto ERR1; + } else if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WEP) { + /* Check for WEP Key index */ + if ((pstrM2MAPConfig->u8KeyIndx <= 0) || (pstrM2MAPConfig->u8KeyIndx > WEP_KEY_MAX_INDEX)) { + M2M_ERR("INVALID KEY INDEX\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if ((pstrM2MAPConfig->u8KeySz != WEP_40_KEY_STRING_SIZE) + && (pstrM2MAPConfig->u8KeySz != WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("INVALID KEY STRING SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + + if ((m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) <= 0) + || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) > WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("INVALID KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } else if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WPA_PSK) { + /* Check for WPA Key size */ + if (((pstrM2MAPConfig->u8KeySz + 1) < M2M_MIN_PSK_LEN) || ((pstrM2MAPConfig->u8KeySz + 1) > M2M_MAX_PSK_LEN)) { + M2M_ERR("INVALID WPA KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } else { + M2M_ERR("INVALID AUTHENTICATION MODE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} +static sint8 m2m_validate_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (ptstrM2MScanOption == NULL) { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid No of slots */ + if (ptstrM2MScanOption->u8NumOfSlot == 0) { + M2M_ERR("INVALID No of scan slots! %d\n", ptstrM2MScanOption->u8NumOfSlot); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid time of slots */ + if (ptstrM2MScanOption->u8SlotTime < 10 || ptstrM2MScanOption->u8SlotTime > 250) { + M2M_ERR("INVALID scan slot time! %d\n", ptstrM2MScanOption->u8SlotTime); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid No of probe requests per slot */ + if ((ptstrM2MScanOption->u8ProbesPerSlot == 0) + || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) { + M2M_ERR("INVALID No of probe requests per scan slot %d\n", ptstrM2MScanOption->u8ProbesPerSlot); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid RSSI threshold */ + if ((ptstrM2MScanOption->s8RssiThresh < -99) || (ptstrM2MScanOption->s8RssiThresh >= 0)) { + M2M_ERR("INVALID RSSI threshold %d \n", ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + +ERR: + return s8Ret; +} + +sint8 m2m_wifi_send_crl(tstrTlsCrlInfo *pCRL) +{ + sint8 s8Ret = M2M_ERR_FAIL; + s8Ret = hif_send( + M2M_REQ_GROUP_SSL, M2M_SSL_IND_CRL | M2M_REQ_DATA_PKT, NULL, 0, (uint8 *)pCRL, sizeof(tstrTlsCrlInfo), 0); + return s8Ret; +} + +sint8 m2m_wifi_init(tstrWifiInitParam *param) +{ + tstrM2mRev strtmp; + sint8 ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_NORMAL; + + if (param == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = param->pfAppWifiCb; + +#ifdef ETH_MODE + gpfAppEthCb = param->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = param->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = param->strEthInitParam.u16ethRcvBufSize; + if (param->strEthInitParam.u8EthernetEnable) + u8WifiMode = M2M_WIFI_MODE_ETHERNET; +#endif /* ETH_MODE */ + +#ifdef CONF_MGMT + gpfAppMonCb = param->pfAppMonCb; +#endif + gu8scanInProgress = 0; + /* Apply device specific initialization. */ + ret = nm_drv_init(&u8WifiMode); + if (ret != M2M_SUCCESS) + goto _EXIT0; + /* Initialize host interface module */ + ret = hif_init(NULL); + if (ret != M2M_SUCCESS) + goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI, m2m_wifi_cb); + + ret = nm_get_firmware_full_info(&strtmp); + + M2M_INFO("Firmware ver : %u.%u.%u Svnrev %u\n", + strtmp.u8FirmwareMajor, + strtmp.u8FirmwareMinor, + strtmp.u8FirmwarePatch, + strtmp.u16FirmwareSvnNum); + M2M_INFO("Firmware Build %s Time %s\n", strtmp.BuildDate, strtmp.BuildTime); + M2M_INFO("Firmware Min driver ver : %u.%u.%u\n", strtmp.u8DriverMajor, strtmp.u8DriverMinor, strtmp.u8DriverPatch); + M2M_INFO("Driver ver: %u.%u.%u\n", + M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + M2M_INFO("Driver built at %s\t%s\n", __DATE__, __TIME__); + if (M2M_ERR_FW_VER_MISMATCH == ret) { + M2M_ERR("Mismatch Firmawre Version\n"); + } + + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); +_EXIT0: + return ret; +} + +sint8 m2m_wifi_deinit(void *arg) +{ + + hif_deinit(NULL); + + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} + +void m2m_wifi_yield(void) +{ + hif_yield(); +} + +sint8 m2m_wifi_handle_events(void *arg) +{ + return hif_handle_isr(); +} + +sint8 m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch, 0); +} +sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, + uint8 u8NoSaveCred) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mWifiConnect strConnect; + tstrM2MWifiSecInfo *pstrAuthInfo; + + if (u8SecType != M2M_WIFI_SEC_OPEN) { + if (pvAuthInfo == NULL) { + M2M_ERR("Key is not valid\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + if ((u8SecType == M2M_WIFI_SEC_WPA_PSK) && (m2m_strlen(pvAuthInfo) == (M2M_MAX_PSK_LEN - 1))) { + uint8 i = 0; + uint8 *pu8Psk = (uint8 *)pvAuthInfo; + while (i < (M2M_MAX_PSK_LEN - 1)) { + if (pu8Psk[i] < '0' || (pu8Psk[i] > '9' && pu8Psk[i] < 'A') || (pu8Psk[i] > 'F' && pu8Psk[i] < 'a') + || pu8Psk[i] > 'f') { + M2M_ERR("Invalid Key\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + i++; + } + } + } + if ((u8SsidLen <= 0) || (u8SsidLen >= M2M_MAX_SSID_LEN)) { + M2M_ERR("SSID LEN INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + if (u16Ch < M2M_WIFI_CH_1 || u16Ch > M2M_WIFI_CH_14) { + if (u16Ch != M2M_WIFI_CH_ALL) { + M2M_ERR("CH INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + } + + m2m_memcpy(strConnect.au8SSID, (uint8 *)pcSsid, u8SsidLen); + strConnect.au8SSID[u8SsidLen] = 0; + strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); + /* Credentials will be Not be saved if u8NoSaveCred is set */ + strConnect.u8NoSaveCred = u8NoSaveCred ? 1 : 0; + pstrAuthInfo = &strConnect.strSec; + pstrAuthInfo->u8SecType = u8SecType; + + if (u8SecType == M2M_WIFI_SEC_WEP) { + tstrM2mWifiWepParams *pstrWepParams = (tstrM2mWifiWepParams *)pvAuthInfo; + tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; + pstrWep->u8KeyIndx = pstrWepParams->u8KeyIndx - 1; + + if (pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) { + M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); + ret = M2M_ERR_FAIL; + goto ERR1; + } + pstrWep->u8KeySz = pstrWepParams->u8KeySz - 1; + if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE) && (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy((uint8 *)pstrWep->au8WepKey, (uint8 *)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); + pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; + + } + + else if (u8SecType == M2M_WIFI_SEC_WPA_PSK) { + uint16 u16KeyLen = m2m_strlen((uint8 *)pvAuthInfo); + if ((u16KeyLen <= 0) || (u16KeyLen >= M2M_MAX_PSK_LEN)) { + M2M_ERR("Incorrect PSK key length\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8 *)pvAuthInfo, u16KeyLen + 1); + } else if (u8SecType == M2M_WIFI_SEC_802_1X) { + m2m_memcpy((uint8 *)&pstrAuthInfo->uniAuth.strCred1x, (uint8 *)pvAuthInfo, sizeof(tstr1xAuthCredentials)); + } else if (u8SecType == M2M_WIFI_SEC_OPEN) { + + } else { + M2M_ERR("undefined sec type\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8 *)&strConnect, sizeof(tstrM2mWifiConnect), NULL, 0, 0); + +ERR1: + return ret; +} + +sint8 m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0, 0); +} +sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + m2m_memcpy((uint8 *)strTmp.au8Mac, (uint8 *)au8MacAddress, 6); + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, (uint8 *)&strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0, 0); +} + +sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32(pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32(pstrStaticIPConf->u32SubnetMask); + return hif_send( + M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, (uint8 *)pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0, 0); +} + +sint8 m2m_wifi_request_dhcp_client(void) +{ + /*legacy API should be removed */ + return 0; +} +sint8 m2m_wifi_request_dhcp_server(uint8 *addr) +{ + /*legacy API should be removed */ + return 0; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); +@brief Set the Wi-Fi listen interval for power save operation. It is represented in units + of AP Beacon periods. +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tstrM2mLsnInt , m2m_wifi_set_sleep_mode +@pre m2m_wifi_set_sleep_mode shall be called first +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn) +{ + + uint8 u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt) +{ + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8 *)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +sint8 m2m_wifi_set_cust_InfoElement(uint8 *pau8M2mCustInfoElement) +{ + + sint8 ret = M2M_ERR_FAIL; + if (pau8M2mCustInfoElement != NULL) { + if ((pau8M2mCustInfoElement[0] + 1) < M2M_CUST_IE_LEN_MAX) { + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_CUST_INFO_ELEMENT | M2M_REQ_DATA_PKT, + (uint8 *)pau8M2mCustInfoElement, + pau8M2mCustInfoElement[0] + 1, + NULL, + 0, + 0); + } + } + return ret; +} + +sint8 m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if (m2m_validate_scan_options(ptstrM2MScanOption) == M2M_SUCCESS) { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_SCAN_OPTION, + (uint8 *)ptstrM2MScanOption, + sizeof(tstrM2MScanOption), + NULL, + 0, + 0); + } + return s8Ret; +} +sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_SCAN_REGION, + (uint8 *)&strScanRegion, + sizeof(tstrM2MScanRegion), + NULL, + 0, + 0); + return s8Ret; +} +sint8 m2m_wifi_request_scan(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (!gu8scanInProgress) { + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8 *)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } else { + s8Ret = M2M_ERR_INVALID_ARG; + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (!gu8scanInProgress) { + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + strtmp.u16PassiveScanTime = scan_time; + + s8Ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8 *)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } else { + s8Ret = M2M_ERR_INVALID_ARG; + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_ssid_list(uint8 ch, uint8 *u8Ssidlist) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if (!gu8scanInProgress) { + if ((((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) && (u8Ssidlist != NULL)) { + tstrM2MScan strtmp; + uint16 u16Lsize = 0; + uint8 u8Apnum = u8Ssidlist[u16Lsize]; + if (u8Apnum <= MAX_HIDDEN_SITES) { + u16Lsize++; + while (u8Apnum) { + if (u8Ssidlist[u16Lsize] >= M2M_MAX_SSID_LEN) { + goto EXIT; + } else { + u16Lsize += u8Ssidlist[u16Lsize] + 1; + u8Apnum--; + } + } + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SCAN_SSID_LIST | M2M_REQ_DATA_PKT, + (uint8 *)&strtmp, + sizeof(tstrM2MScan), + u8Ssidlist, + u16Lsize, + sizeof(tstrM2MScan)); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } +EXIT: + return s8Ret; +} +sint8 m2m_wifi_wps(uint8 u8TriggerType, const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + /* Stop Scan if it is ongoing. + */ + gu8scanInProgress = 0; + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + m2m_memcpy((uint8 *)strtmp.acPinNumber, (uint8 *)pcPinNumber, 8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8 *)&strtmp, sizeof(tstrM2MWPSConnect), NULL, 0, 0); +} +sint8 m2m_wifi_wps_disable(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +@brief Send a command to the PS Client (An WINC1500 board running the ps_firmware), + if the PS client send any commands it will be received in wifi_cb M2M_WIFI_RESP_CLIENT_INFO +@param [in] cmd + Control command sent from PS Server to PS Client (command values defined by the application) +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa m2m_wifi_req_server_init, M2M_WIFI_RESP_CLIENT_INFO +@pre m2m_wifi_req_server_init should be called first +@warning +*/ +sint8 m2m_wifi_req_client_ctrl(uint8 u8Cmd) +{ + + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2Mservercmd strCmd; + strCmd.u8cmd = u8Cmd; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CLIENT_CTRL, (uint8 *)&strCmd, sizeof(tstrM2Mservercmd), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +@brief Initialize the PS Server, The WINC1500 support Non secure communication with another WINC1500, + (SERVER/CLIENT) through one byte command (probe request and probe response) without any connection setup +@param [in] ch + Server listening channel +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise +@sa m2m_wifi_req_client_ctrl +@warning The server mode can't be used with any other modes (STA/P2P/AP) +*/ +sint8 m2m_wifi_req_server_init(uint8 ch) +{ + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2mServerInit strServer; + strServer.u8Channel = ch; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SERVER_INIT, (uint8 *)&strServer, sizeof(tstrM2mServerInit), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +sint8 m2m_wifi_p2p(uint8 u8Channel) +{ + sint8 ret = M2M_SUCCESS; + if ((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8 *)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0, 0); + } else { + M2M_ERR("Listen channel should only be M2M_WIFI_CH_1/6/11 \n"); + ret = M2M_ERR_FAIL; + } + return ret; +} +sint8 m2m_wifi_p2p_disconnect(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig *pstrM2MAPConfig) +{ + sint8 ret = M2M_ERR_FAIL; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPConfig)) { + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig), NULL, 0, 0); + } + return ret; +} + +sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams *pstrM2mGain) +{ + sint8 ret = M2M_ERR_FAIL; + if (pstrM2mGain != NULL) { + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_GAINS, + (uint8 *)pstrM2mGain, + sizeof(tstrM2mWifiGainsParams), + NULL, + 0, + 0); + } + return ret; +} +sint8 m2m_wifi_disable_ap(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_req_curr_rssi(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_send_ethernet_pkt(uint8 *pu8Packet, uint16 u16PacketSize) +{ + sint8 s8Ret = -1; + if ((pu8Packet != NULL) && (u16PacketSize > 0)) { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8 *)&strTxPkt, + sizeof(tstrM2MWifiTxPacketInfo), + pu8Packet, + u16PacketSize, + M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + if (ret == M2M_SUCCESS) { + ret = hif_chip_sleep(); + } + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nmi_get_mac_address(pu8MacAddr); + if (ret == M2M_SUCCESS) { + ret = hif_chip_sleep(); + } + } + + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return M2M_SUCCESE for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +sint8 m2m_wifi_req_scan_result(uint8 index) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SCAN_RESULT, + (uint8 *)&strReqScanRlt, + sizeof(tstrM2mReqScanResult), + NULL, + 0, + 0); + return ret; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8 m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8 m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@brief Set the power saving mode for the WINC1500. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC1500 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC1500 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8 *)&strPs, sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\n", PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(void) +@brief Request from WINC1500 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning the Function should be called in M2M_PS_MANUAL power save only +*/ +sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime) +{ + sint8 ret = M2M_SUCCESS; + uint8 psType; + psType = hif_get_sleep_mode(); + if (psType == M2M_PS_MANUAL) { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8 *)&strPs, sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@brief Set the WINC1500 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if (u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + // pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength++; + m2m_memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8 *)&strDeviceName, + sizeof(tstrM2MDeviceNameConfig), + NULL, + 0, + 0); +} +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#ifdef CONF_MGMT +sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset) +{ + sint8 s8Ret = -1; + if ((pstrMtrCtrl->u8ChannelID >= M2M_WIFI_CH_1) && (pstrMtrCtrl->u8ChannelID <= M2M_WIFI_CH_14)) { + gstrMgmtCtrl.pu8Buf = pu8PayloadBuffer; + gstrMgmtCtrl.u16Sz = u16BufferSize; + gstrMgmtCtrl.u16Offset = u16DataOffset; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_ENABLE_MONITORING, + (uint8 *)pstrMtrCtrl, + sizeof(tstrM2MWifiMonitorModeCtrl), + NULL, + 0, + 0); + } + return s8Ret; +} + +sint8 m2m_wifi_disable_monitoring_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_MONITORING, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize) +{ + sint8 s8Ret = -1; + if (pu8WlanPacket != NULL) { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16WlanPktSize; + strTxPkt.u16HeaderLength = u16WlanHeaderLength; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SEND_WIFI_PACKET | M2M_REQ_DATA_PKT, + (uint8 *)&strTxPkt, + sizeof(tstrM2MWifiTxPacketInfo), + pu8WlanPacket, + u16WlanPktSize, + sizeof(tstrM2MWifiTxPacketInfo)); + } + return s8Ret; +} +#endif + +sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, + uint8 bEnableHttpRedirect) +{ + sint8 s8Ret = M2M_ERR_FAIL; + + if ((pstrAPConfig != NULL)) { + tstrM2MProvisionModeConfig strProvConfig; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPConfig)) { + m2m_memcpy((uint8 *)&strProvConfig.strApConfig, (uint8 *)pstrAPConfig, sizeof(tstrM2MAPConfig)); + if ((m2m_strlen((uint8 *)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) { + M2M_ERR("INVALID DOMAIN NAME\n"); + goto ERR1; + } + m2m_memcpy((uint8 *)strProvConfig.acHttpServerDomainName, (uint8 *)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + /* Stop Scan if it is ongoing. + */ + gu8scanInProgress = 0; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8 *)&strProvConfig, + sizeof(tstrM2MProvisionModeConfig), + NULL, + 0, + 0); + } else { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +sint8 m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds) +{ + /* + The firmware accepts timestamps relative to 1900 like NTP Timestamp. + */ + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8 *)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_get_sytem_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_enable_sntp(uint8 bEnable) +{ + uint8 u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief Change the power profile mode +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_POWER_PROFILE, + (uint8 *)&strM2mPwrMode, + sizeof(tstrM2mPwrMode), + NULL, + 0, + 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_TX_POWER, + (uint8 *)&strM2mTxPwrLevel, + sizeof(tstrM2mTxPwrLevel), + NULL, + 0, + 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_ENABLE_LOGS, + (uint8 *)&strM2mEnableLogs, + sizeof(tstrM2mEnableLogs), + NULL, + 0, + 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + (uint8 *)&strM2mBattVol, + sizeof(tstrM2mBatteryVoltage), + NULL, + 0, + 0); + return ret; +} +/*! +@fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +*/ +sint8 m2m_wifi_prng_get_random_bytes(uint8 *pu8PrngBuff, uint16 u16PrngSize) +{ + sint8 ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if ((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng))) && (pu8PrngBuff != NULL)) { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_GET_PRNG | M2M_REQ_DATA_PKT, + (uint8 *)&strRng, + sizeof(tstrPrng), + NULL, + 0, + 0); + } else { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\n", u16PrngSize); + } + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate * pstrConfAutoRate) + +@brief + Allow the host MCU app to configure auto TX rate selection algorithm. The application can use this + API to tweak the algorithm performance. Moreover, it allows the application to force a specific WLAN + PHY rate for transmitted data packets to favor range vs. throughput needs. + +@param [in] pstrConfAutoRate + The Auto rate configuration parameters as listed in tstrConfAutoRate. +@sa + tstrConfAutoRate +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate *pstrConfAutoRate) +{ + sint8 s8ret = M2M_ERR_FAIL; + + s8ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_CONG_AUTO_RATE, + (uint8 *)pstrConfAutoRate, + sizeof(tstrConfAutoRate), + NULL, + 0, + 0); + + return s8ret; +} + +#ifdef ETH_MODE +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *pu8MulticastMacAddress, uint8 u8AddRemove) +{ + sint8 s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if (pu8MulticastMacAddress != NULL) { + strMulticastMac.u8AddRemove = u8AddRemove; + m2m_memcpy(strMulticastMac.au8macaddress, pu8MulticastMacAddress, M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n", + strMulticastMac.au8macaddress[0], + strMulticastMac.au8macaddress[1], + strMulticastMac.au8macaddress[2], + strMulticastMac.au8macaddress[3], + strMulticastMac.au8macaddress[4], + strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_MAC_MCAST, + (uint8 *)&strMulticastMac, + sizeof(tstrM2MMulticastMac), + NULL, + 0, + 0); + } + + return s8ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +@brief + set the ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void *pvBuffer, uint16 u16BufferLen) +{ + sint8 s8ret = M2M_SUCCESS; + if (pvBuffer != NULL) { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize = u16BufferLen; + } else { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} +#endif /* ETH_MODE */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmasic.c b/AudioConsole.X/Source/winc1500/driver/source/nmasic.c new file mode 100644 index 0000000..9c595b7 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmasic.c @@ -0,0 +1,679 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 ASIC specific internal APIs. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X, Y) (X[0 + Y] + ((uint32)X[1 + Y] << 8) + ((uint32)X[2 + Y] << 16) + ((uint32)X[3 + Y] << 24)) + +/*SPI and I2C only*/ +#define CORT_HOST_COMM (0x10) +#define HOST_CORT_COMM (0x0b) +#define WAKE_CLK_REG (0x1) +#define CLOCKS_EN_REG (0xf) + +#define TIMEOUT (0xfffffffful) +#define WAKUP_TRAILS_TIMEOUT (4) + +sint8 chip_apply_conf(uint32 u32Conf) +{ + sint8 ret = M2M_SUCCESS; + uint32 val32 = u32Conf; + +#if (defined __ENABLE_PMU__) || (defined CONF_WINC_INT_PMU) + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif +#if defined CONF_WINC_XO_XTALGM2_DIS + val32 |= rHAVE_XO_XTALGM2_DIS_BIT; +#endif + + val32 |= rHAVE_RESERVED1_BIT; + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if (val32 != 0) { + uint32 reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if (ret == M2M_SUCCESS) { + if (reg == val32) + break; + } + } else { + break; + } + } while (1); + + return M2M_SUCCESS; +} +void chip_idle(void) +{ + uint32 reg = 0; + nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (reg & NBIT1) { + reg &= ~NBIT1; + nm_write_reg(WAKE_CLK_REG, reg); + } +} + +sint8 enable_interrupts(void) +{ + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg |= ((uint32)1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg |= ((uint32)1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +ERR1: + return ret; +} + +sint8 cpu_start(void) +{ + uint32 reg = 0; + sint8 ret; + + /** + reset regs + */ + ret = nm_write_reg(BOOTROM_REG, 0); + ret += nm_write_reg(NMI_STATE_REG, 0); + ret += nm_write_reg(NMI_REV_REG, 0); + /** + Go... + **/ + ret += nm_read_reg_with_ret(0x1118, ®); + reg |= (1 << 0); + ret += nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_bsp_sleep(1); + return ret; +} + +uint32 nmi_get_chipid(void) +{ + static uint32 chipid = 0; + + if (chipid == 0) { + uint32 rfrevid; + + if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + // if((ret = nm_read_reg_with_ret(0x11fc, &revid)) != M2M_SUCCESS) { + // return 0; + //} + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if (chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if (chipid == 0x1002b0) { + if (rfrevid == 3) { /* 1002B0 */ + } else if (rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if (chipid == 0x1000F0) { + if ((nm_read_reg_with_ret(0x3B0000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + } else { + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if (chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if (flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if (flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } +#else + /*M2M is by default have SPI flash*/ + chipid &= ~(0x0f0000); + chipid |= 0x050000; +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32 nmi_get_rfrevid(void) +{ + uint32 rfrevid; + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + return 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if (REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32 pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32 val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} +sint8 chip_sleep(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; + + while (1) { + ret = nm_read_reg_with_ret(CORT_HOST_COMM, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if ((reg & NBIT0) == 0) + break; + } + + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if (reg & NBIT1) { + reg &= ~NBIT1; + ret = nm_write_reg(WAKE_CLK_REG, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + } + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if (reg & NBIT0) { + reg &= ~NBIT0; + ret = nm_write_reg(HOST_CORT_COMM, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + } + +ERR1: + return ret; +} +sint8 chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, clk_status_reg = 0, trials = 0; + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + + if (!(reg & NBIT0)) { + /*USE bit 0 to indicate host wakeup*/ + ret = nm_write_reg(HOST_CORT_COMM, reg | NBIT0); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + } + + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + /* Set bit 1 */ + if (!(reg & NBIT1)) { + ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + } + + do { + ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + if (ret != M2M_SUCCESS) { + M2M_ERR("Bus error (5).%d %x\n", ret, clk_status_reg); + goto _WAKE_EXIT; + } + if (clk_status_reg & NBIT2) { + break; + } + nm_bsp_sleep(2); + trials++; + if (trials > WAKUP_TRAILS_TIMEOUT) { + M2M_ERR("Failed to wakup the chip\n"); + ret = M2M_ERR_TIME_OUT; + goto _WAKE_EXIT; + } + } while (1); + + /*workaround sometimes spi fail to read clock regs after reading/writing clockless registers*/ + nm_bus_reset(); + +_WAKE_EXIT: + return ret; +} +sint8 cpu_halt(void) +{ + sint8 ret; + uint32 reg = 0; + ret = nm_read_reg_with_ret(0x1118, ®); + reg |= (1 << 0); + ret += nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } + return ret; +} +sint8 chip_reset_and_cpu_halt(void) +{ + sint8 ret = M2M_SUCCESS; + + /*Wakeup needed only for I2C interface*/ + ret = chip_wake(); + if (ret != M2M_SUCCESS) + goto ERR1; + /*Reset and CPU halt need for no wait board only*/ + ret = chip_reset(); + if (ret != M2M_SUCCESS) + goto ERR1; + ret = cpu_halt(); + if (ret != M2M_SUCCESS) + goto ERR1; +ERR1: + return ret; +} +sint8 chip_reset(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_write_reg(NMI_GLB_RESET_0, 0); + nm_bsp_sleep(50); + return ret; +} + +sint8 wait_for_bootrom(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + uint32 u32GpReg1 = 0; + uint32 u32DriverVerInfo = M2M_MAKE_VERSION_INFO(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO, + M2M_MIN_REQ_DRV_VERSION_MAJOR_NO, + M2M_MIN_REQ_DRV_VERSION_MINOR_NO, + M2M_MIN_REQ_DRV_VERSION_PATCH_NO); + + reg = 0; + while (1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if (reg == 0) { + reg = 0; + while (reg != M2M_FINISH_BOOT_ROM) { + nm_bsp_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if (++cnt > TIMEOUT) { + M2M_DBG("failed to load firmware from flash.\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if (M2M_WIFI_MODE_ATE_HIGH == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + nm_write_reg(NMI_STATE_REG, NBIT20); + } else if (M2M_WIFI_MODE_ATE_LOW == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + nm_write_reg(NMI_STATE_REG, 0); + } else if (M2M_WIFI_MODE_ETHERNET == arg) { + u32GpReg1 = rHAVE_ETHERNET_MODE_BIT; + nm_write_reg(NMI_STATE_REG, u32DriverVerInfo); + } else { + /*bypass this step*/ + nm_write_reg(NMI_STATE_REG, u32DriverVerInfo); + } + + if (REV(nmi_get_chipid()) >= REV_3A0) { + chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT); + } else { + chip_apply_conf(u32GpReg1); + } + M2M_INFO("DriverVerInfo: 0x%08lx\n", u32DriverVerInfo); + + nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +sint8 wait_for_firmware_start(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + uint32 u32Timeout = TIMEOUT; + volatile uint32 regAddress = NMI_STATE_REG; + volatile uint32 checkValue = M2M_FINISH_INIT_STATE; + + if ((M2M_WIFI_MODE_ATE_HIGH == arg) || (M2M_WIFI_MODE_ATE_LOW == arg)) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) { + nm_bsp_sleep(2); /* TODO: Why bus error if this delay is not here. */ + M2M_DBG("%x %x %x\n", + (unsigned int)nm_read_reg(0x108c), + (unsigned int)nm_read_reg(0x108c), + (unsigned int)nm_read_reg(0x14A0)); + reg = nm_read_reg(regAddress); + if (++cnt >= u32Timeout) { + M2M_DBG("Time out for wait firmware Run\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if (M2M_FINISH_INIT_STATE == checkValue) { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +sint8 chip_deinit(void) +{ + uint32 reg = 0; + sint8 ret; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + goto ERR1; + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + goto ERR1; + } + +ERR1: + return ret; +} + +#ifdef CONF_PERIPH + +sint8 set_gpio_dir(uint8 gpio, uint8 dir) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + if (dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +sint8 set_gpio_val(uint8 gpio, uint8 val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + if (val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +sint8 get_gpio_val(uint8 gpio, uint8 *val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + *val = (uint8)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable) +{ + sint8 s8Ret; + uint32 val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\n"); + goto _EXIT; + } + if (enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} +#endif /* CONF_PERIPH */ + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, &u32RegValue); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if (!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\n"); + m2m_memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\n"); + u32RegValue >>= 16; + ret = nm_read_block(u32RegValue | 0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + if (pu8IsValid) + *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if (pu8IsValid) + *pu8IsValid = 0; + return ret; +} + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, &u32RegValue); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &= 0x0000ffff; + ret = nm_read_block(u32RegValue | 0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + + return ret; + +_EXIT_ERR: + return ret; +} diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmasic.h b/AudioConsole.X/Source/winc1500/driver/source/nmasic.h new file mode 100644 index 0000000..2eba658 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmasic.h @@ -0,0 +1,218 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 ASIC specific internal APIs. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "common/include/nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GP_REG_2 (0xc0008) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define NMI_REV_REG_ATE (0x1048) /*Revision info register in case of ATE FW*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE \ + (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) ((((id)&0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) ((((id)&0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3000(id) ((((id)&0xfff00000) == 0x300000) ? 1 : 0) +#define REV(id) (((id)&0x00000fff)) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) +#define rHAVE_ETHERNET_MODE_BIT (NBIT7) +#define rHAVE_RESERVED1_BIT (NBIT8) +#define rHAVE_RESERVED2_BIT (NBIT9) +#define rHAVE_XO_XTALGM2_DIS_BIT (NBIT10) + +typedef struct { + uint32 u32Mac_efuse_mib; + uint32 u32Firmware_Ota_rev; +} tstrGpRegs; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @fn cpu_halt + * @brief + */ +sint8 cpu_halt(void); +/* + * @fn chip_sleep + * @brief + */ +sint8 chip_sleep(void); +/* + * @fn chip_wake + * @brief + */ +sint8 chip_wake(void); +/* + * @fn chip_idle + * @brief + */ +void chip_idle(void); +/* + * @fn enable_interrupts + * @brief + */ +sint8 enable_interrupts(void); +/* + * @fn cpu_start + * @brief + */ +sint8 cpu_start(void); +/* + * @fn nmi_get_chipid + * @brief + */ +uint32 nmi_get_chipid(void); +/* + * @fn nmi_get_rfrevid + * @brief + */ +uint32 nmi_get_rfrevid(void); +/* + * @fn restore_pmu_settings_after_global_reset + * @brief + */ +void restore_pmu_settings_after_global_reset(void); +/* + * @fn nmi_update_pll + * @brief + */ +void nmi_update_pll(void); +/* + * @fn nmi_set_sys_clk_src_to_xo + * @brief + */ +void nmi_set_sys_clk_src_to_xo(void); +/* + * @fn chip_reset + * @brief + */ +sint8 chip_reset(void); +/* + * @fn wait_for_bootrom + * @brief + */ +sint8 wait_for_bootrom(uint8); +/* + * @fn wait_for_firmware_start + * @brief + */ +sint8 wait_for_firmware_start(uint8); +/* + * @fn chip_deinit + * @brief + */ +sint8 chip_deinit(void); +/* + * @fn chip_reset_and_cpu_halt + * @brief + */ +sint8 chip_reset_and_cpu_halt(void); +/* + * @fn set_gpio_dir + * @brief + */ +sint8 set_gpio_dir(uint8 gpio, uint8 dir); +/* + * @fn set_gpio_val + * @brief + */ +sint8 set_gpio_val(uint8 gpio, uint8 val); +/* + * @fn get_gpio_val + * @brief + */ +sint8 get_gpio_val(uint8 gpio, uint8 *val); +/* + * @fn pullup_ctrl + * @brief + */ +sint8 pullup_ctrl(uint32 pinmask, uint8 enable); +/* + * @fn nmi_get_otp_mac_address + * @brief + */ +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid); +/* + * @fn nmi_get_mac_address + * @brief + */ +sint8 nmi_get_mac_address(uint8 *pu8MacAddr); +/* + * @fn chip_apply_conf + * @brief + */ +sint8 chip_apply_conf(uint32 u32conf); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMASIC_H_*/ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmbus.c b/AudioConsole.X/Source/winc1500/driver/source/nmbus.c new file mode 100644 index 0000000..4f3ac93 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmbus.c @@ -0,0 +1,288 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#ifndef CORTUS_APP + +#include "nmbus.h" +#include "nmi2c.h" +#include "nmspi.h" +#include "nmuart.h" + +#define MAX_TRX_CFG_SZ 8 + +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_bus_iface_init(void *pvInitVal) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal); + return ret; +} + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Samer Sarhan + * @date 07 April 2014 + * @version 1.0 + */ +sint8 nm_bus_iface_deinit(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +sint8 nm_bus_reset(void) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_reset(); +#elif defined(CONF_WINC_USE_I2C) +#else +#error "Plesae define bus usage" +#endif + + return ret; +} + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Viswanathan Murugesan + * @date 22 Oct 2014 + * @version 1.0 + */ +sint8 nm_bus_iface_reconfigure(void *ptr) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART + ret = nm_uart_reconfigure(ptr); +#endif + return ret; +} +/* + * @fn nm_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_read_reg(uint32 u32Addr) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg(u32Addr); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_reg(u32Addr); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_reg(u32Addr); +#else +#error "Plesae define bus usage" +#endif +} + +/* + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg_with_ret(u32Addr, pu32RetVal); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_reg_with_ret(u32Addr, pu32RetVal); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_reg_with_ret(u32Addr, pu32RetVal); +#else +#error "Plesae define bus usage" +#endif +} + +/* + * @fn nm_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_reg(u32Addr, u32Val); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_write_reg(u32Addr, u32Val); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_write_reg(u32Addr, u32Val); +#else +#error "Plesae define bus usage" +#endif +} + +static sint8 p_nm_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_block(u32Addr, puBuf, u16Sz); +#else +#error "Plesae define bus usage" +#endif +} +/* + * @fn nm_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for (;;) { + if (u32Sz <= u16MaxTrxSz) { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } else { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if (M2M_SUCCESS != s8Ret) + break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static sint8 p_nm_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_write_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_write_block(u32Addr, puBuf, u16Sz); +#else +#error "Plesae define bus usage" +#endif +} +/** + * @fn nm_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for (;;) { + if (u32Sz <= u16MaxTrxSz) { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } else { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if (M2M_SUCCESS != s8Ret) + break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmbus.h b/AudioConsole.X/Source/winc1500/driver/source/nmbus.h new file mode 100644 index 0000000..09edf67 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmbus.h @@ -0,0 +1,141 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_init(void *); + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_deinit(void); + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +sint8 nm_bus_reset(void); + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_reconfigure(void *ptr); + +/** + * @fn nm_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_read_reg(uint32 u32Addr); + +/** + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +/** + * @fn nm_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmdrv.c b/AudioConsole.X/Source/winc1500/driver/source/nmdrv.c new file mode 100644 index 0000000..96b0148 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmdrv.c @@ -0,0 +1,379 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 M2M driver APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmdrv.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" +#include "spi_flash/include/spi_flash.h" + +#ifdef CONF_WINC_USE_SPI +#include "driver/source/nmspi.h" +#endif + +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_info(tstrM2mRev *M2mRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + // In case the Firmware running is ATE fw + if (M2M_ATE_FW_IS_UP_VALUE == reg) { + // Read FW info again from the register specified for ATE + ret = nm_read_reg_with_ret(NMI_REV_REG_ATE, ®); + } + M2mRev->u8DriverMajor = M2M_GET_DRV_MAJOR(reg); + M2mRev->u8DriverMinor = M2M_GET_DRV_MINOR(reg); + M2mRev->u8DriverPatch = M2M_GET_DRV_PATCH(reg); + M2mRev->u8FirmwareMajor = M2M_GET_FW_MAJOR(reg); + M2mRev->u8FirmwareMinor = M2M_GET_FW_MINOR(reg); + M2mRev->u8FirmwarePatch = M2M_GET_FW_PATCH(reg); + M2mRev->u32Chipid = nmi_get_chipid(); + M2mRev->u16FirmwareSvnNum = 0; + + curr_firm_ver = M2M_MAKE_VERSION(M2mRev->u8FirmwareMajor, M2mRev->u8FirmwareMinor, M2mRev->u8FirmwarePatch); + curr_drv_ver + = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, M2M_RELEASE_VERSION_MINOR_NO, M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION(M2mRev->u8DriverMajor, M2mRev->u8DriverMinor, M2mRev->u8DriverPatch); + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + } + return ret; +} +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_full_info(tstrM2mRev *pstrRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + if (pstrRev != NULL) { + m2m_memset((uint8 *)pstrRev, 0, sizeof(tstrM2mRev)); + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, ®); + if (ret == M2M_SUCCESS) { + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret == M2M_SUCCESS) { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)pstrRev, sizeof(tstrM2mRev)); + if (ret == M2M_SUCCESS) { + curr_firm_ver = M2M_MAKE_VERSION( + pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + curr_drv_ver = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION( + pstrRev->u8DriverMajor, pstrRev->u8DriverMinor, pstrRev->u8DriverPatch); + if ((curr_firm_ver == 0) || (min_req_drv_ver == 0) || (min_req_drv_ver == 0)) { + ret = M2M_ERR_FAIL; + goto EXIT; + } + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + goto EXIT; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + goto EXIT; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } +EXIT: + return ret; +} +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev *pstrRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret; + tstrGpRegs strgp = {0}; + + if (pstrRev != NULL) { + m2m_memset((uint8 *)pstrRev, 0, sizeof(tstrM2mRev)); + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, ®); + if (ret == M2M_SUCCESS) { + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret == M2M_SUCCESS) { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)pstrRev, sizeof(tstrM2mRev)); + if (ret == M2M_SUCCESS) { + curr_firm_ver = M2M_MAKE_VERSION( + pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + curr_drv_ver = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION( + pstrRev->u8DriverMajor, pstrRev->u8DriverMinor, pstrRev->u8DriverPatch); + if ((curr_firm_ver == 0) || (min_req_drv_ver == 0) || (min_req_drv_ver == 0)) { + ret = M2M_ERR_FAIL; + goto EXIT; + } + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + } + } + } else { + ret = M2M_ERR_INVALID; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } else { + ret = M2M_ERR_INVALID_ARG; + } +EXIT: + return ret; +} + +/* + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver + * @return M2M_SUCCESS in case of success and Negative error code in case of failure + * @param [in] arg + * Generic argument + * @author Viswanathan Murugesan + * @date 10 Oct 2014 + * @version 1.0 + */ +sint8 nm_drv_init_download_mode() +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + + /** + TODO:reset the chip and halt the cpu in case of no wait efuse is set (add the no wait effuse check) + */ + if (!ISNMC3000(GET_CHIPID())) { + /*Execuate that function only for 1500A/B, no room in 3000, but it may be needed in 3400 no wait*/ + chip_reset_and_cpu_halt(); + } + +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300, 0); + +ERR1: + return ret; +} + +/* + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @return M2M_SUCCESS in case of success and Negative error code in case of failure + * @param [in] arg + * Generic argument + * @author M. Abdelmawla + * @date 15 July 2012 + * @version 1.0 + */ +sint8 nm_drv_init(void *arg) +{ + sint8 ret = M2M_SUCCESS; + uint8 u8Mode; + + if (NULL != arg) { + u8Mode = *((uint8 *)arg); + if ((u8Mode < M2M_WIFI_MODE_NORMAL) || (u8Mode >= M2M_WIFI_MODE_MAX)) { + u8Mode = M2M_WIFI_MODE_NORMAL; + } + } else { + u8Mode = M2M_WIFI_MODE_NORMAL; + } + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + +#ifdef NO_HW_CHIP_EN + ret = chip_wake(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\n"); + goto ERR2; + } + /** + Go... + **/ + ret = chip_reset(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } +#endif +// M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if ((M2M_WIFI_MODE_ATE_HIGH == u8Mode) || (M2M_WIFI_MODE_ATE_LOW == u8Mode)) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\n"); + goto ERR2; + } + return ret; +ERR2: + nm_bus_iface_deinit(); +ERR1: + return ret; +} + +/* + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @author M. Abdelmawla + * @date 17 July 2012 + * @version 1.0 + */ +sint8 nm_drv_deinit(void *arg) +{ + sint8 ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\n"); + goto ERR1; + } + + /* Disable SPI flash to save power when the chip is off */ + ret = spi_flash_enable(0); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: SPI flash disable fail\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\n"); + goto ERR1; + } +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); +#endif + +ERR1: + return ret; +} diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmdrv.h b/AudioConsole.X/Source/winc1500/driver/source/nmdrv.h new file mode 100644 index 0000000..effd356 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmdrv.h @@ -0,0 +1,136 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 M2M driver APIs declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "common/include/nm_common.h" + +/** + * @struct tstrM2mRev + * @brief Structure holding firmware version parameters and build date/time + */ +typedef struct { + uint32 u32Chipid; /* HW revision which will be basically the chip ID */ + uint8 u8FirmwareMajor; /* Version Major Number which represents the official release base */ + uint8 u8FirmwareMinor; /* Version Minor Number which represents the engineering release base */ + uint8 u8FirmwarePatch; /* Version pathc Number which represents the pathces release base */ + uint8 u8DriverMajor; /* Version Major Number which represents the official release base */ + uint8 u8DriverMinor; /* Version Minor Number which represents the engineering release base */ + uint8 u8DriverPatch; /* Version Patch Number which represents the pathces release base */ + uint8 BuildDate[sizeof(__DATE__)]; + uint8 BuildTime[sizeof(__TIME__)]; + uint8 _PAD8_; + uint16 u16FirmwareSvnNum; + uint16 _PAD16_[2]; +} tstrM2mRev; + +/** + * @struct tstrM2mBinaryHeader + * @brief Structure holding compatibility version info for firmware binaries + */ +typedef struct { + tstrM2mRev binVerInfo; + uint32 flashOffset; + uint32 payloadSize; +} tstrM2mBinaryHeader; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_info(tstrM2mRev *M2mRev); +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_full_info(tstrM2mRev *pstrRev); +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev *pstrRev); +/* + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @return ZERO in case of success and Negative error code in case of failure + */ +sint8 nm_drv_init_download_mode(void); + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Generic argument TBD +* @return ZERO in case of success and Negative error code in case of failure + +*/ +sint8 nm_drv_init(void *arg); + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @author M. Abdelmawla + * @param [in] arg + * Generic argument TBD + * @return ZERO in case of success and Negative error code in case of failure + */ +sint8 nm_drv_deinit(void *arg); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMDRV_H_*/ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmi2c.c b/AudioConsole.X/Source/winc1500/driver/source/nmi2c.c new file mode 100644 index 0000000..b4bd962 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmi2c.c @@ -0,0 +1,258 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 I2C protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_I2C + +#include "nmi2c.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +/* + * @fn nm_i2c_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + uint8 b[6]; + uint8 rsz; + tstrNmI2cDefault strI2c; + sint8 s8Ret = M2M_SUCCESS; + + if (u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x09; + b[1] = (uint8)(u32Addr); + rsz = 1; + strI2c.u16Sz = 2; + } else { + b[0] = 0x80; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)(u32Addr); + b[5] = 0x04; + rsz = 4; + strI2c.u16Sz = 6; + } + + strI2c.pu8Buf = b; + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + strI2c.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) { + // M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + if (rsz == 1) { + *pu32RetVal = b[0]; + } else { + *pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24); + } + return s8Ret; +} + +/* + * @fn nm_i2c_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_i2c_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_i2c_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* + * @fn nm_i2c_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmI2cDefault strI2c; + uint8 b[16]; + sint8 s8Ret = M2M_SUCCESS; + + if (u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x19; + b[1] = (uint8)(u32Addr); + b[2] = (uint8)(u32Val); + strI2c.u16Sz = 3; + } else { + b[0] = 0x90; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)u32Addr; + b[5] = 0x04; + b[6] = (uint8)u32Val; + b[7] = (uint8)(u32Val >> 8); + b[8] = (uint8)(u32Val >> 16); + b[9] = (uint8)(u32Val >> 24); + strI2c.u16Sz = 10; + } + + strI2c.pu8Buf = b; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +/* + * @fn nm_i2c_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmI2cDefault strI2c; + uint8 au8Buf[7]; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x02; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr >> 0); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf = au8Buf; + strI2c.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + strI2c.pu8Buf = pu8Buf; + strI2c.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + + return s8Ret; +} + +/* + * @fn nm_i2c_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + uint8 au8Buf[7]; + tstrNmI2cSpecial strI2c; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x12; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf1 = au8Buf; + strI2c.pu8Buf2 = pu8Buf; + strI2c.u16Sz1 = sizeof(au8Buf); + strI2c.u16Sz2 = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W_SPECIAL, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +#endif +/* EOF */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmi2c.h b/AudioConsole.X/Source/winc1500/driver/source/nmi2c.h new file mode 100644 index 0000000..149e0b6 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmi2c.h @@ -0,0 +1,104 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 I2C protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NMI2C_H_ +#define _NMI2C_H_ + +#include "common/include/nm_common.h" + +/** + * @fn nm_i2c_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_i2c_read_reg(uint32 u32Addr); + +/** + * @fn nm_i2c_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_i2c_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_i2c_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_i2c_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#endif /* _NMI2C_H_ */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmspi.c b/AudioConsole.X/Source/winc1500/driver/source/nmspi.c new file mode 100644 index 0000000..c880514 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmspi.c @@ -0,0 +1,1357 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 SPI protocol bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_SPI + +#define USE_OLD_SPI_SW + +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "nmspi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE + 0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE + 0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE + 0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE + 0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE + 0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE + 0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE + 0x2c) +#define NMI_SPI_MISC_CTRL (NMI_SPI_REG_BASE + 0x48) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG - NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +#define CMD_DMA_WRITE 0xc1 +#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +#define CMD_TERMINATE 0xc5 +#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 1 +#define N_FAIL 0 +#define N_RESET -1 +#define N_RETRY -2 + +#define SPI_RESP_RETRY_COUNT (10) +#define SPI_RETRY_COUNT (10) +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8 gu8Crc_off = 0; + +static sint8 nmi_spi_read(uint8 *b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = NULL; + spi.pu8OutBuf = b; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_write(uint8 *b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = b; + spi.pu8OutBuf = NULL; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} +#ifndef USE_OLD_SPI_SW +static sint8 nmi_spi_rw(uint8 *bin, uint8 *bout, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = bin; + spi.pu8OutBuf = bout; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} +#endif +/******************************************** + + Crc7 + +********************************************/ + +static const uint8 crc7_syndrome_table[256] + = {0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x19, 0x10, 0x0b, + 0x02, 0x3d, 0x34, 0x2f, 0x26, 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, + 0x04, 0x0d, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x63, + 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, + 0x08, 0x01, 0x1a, 0x13, 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, + 0x0a, 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, 0x4f, 0x46, + 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, 0x41, 0x48, 0x53, 0x5a, 0x65, + 0x6c, 0x77, 0x7e, 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x3b, 0x32, 0x29, + 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, + 0x14, 0x1d, 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, 0x3c, + 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, 0x17, 0x1e, 0x05, 0x0c, + 0x33, 0x3a, 0x21, 0x28, 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, + 0x31, 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79}; + +static uint8 crc7_byte(uint8 crc, uint8 data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static uint8 crc7(uint8 crc, const uint8 *buffer, uint32 len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + + /******************************************** + + Spi protocol Function + + ********************************************/ + +#define CMD_DMA_WRITE 0xc1 +#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +#define CMD_TERMINATE 0xc5 +#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static sint8 spi_cmd(uint8 cmd, uint32 adr, uint32 u32data, uint32 sz, uint8 clockless) +{ + uint8 bc[9]; + uint8 len = 5; + sint8 result = N_OK; + + bc[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8)(adr >> 8); + if (clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8)adr; + bc[3] = 0x00; + len = 5; + break; + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 8); + bc[5] = (uint8)(sz); + len = 7; + break; + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 16); + bc[5] = (uint8)(sz >> 8); + bc[6] = (uint8)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8)(adr >> 8); + if (clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8)(adr); + bc[3] = (uint8)(u32data >> 24); + bc[4] = (uint8)(u32data >> 16); + bc[5] = (uint8)(u32data >> 8); + bc[6] = (uint8)(u32data); + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)(adr); + bc[4] = (uint8)(u32data >> 24); + bc[5] = (uint8)(u32data >> 16); + bc[6] = (uint8)(u32data >> 8); + bc[7] = (uint8)(u32data); + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result) { + if (!gu8Crc_off) + bc[len - 1] = (crc7(0x7f, (const uint8 *)&bc[0], len - 1)) << 1; + else + len -= 1; + + if (M2M_SUCCESS != nmi_spi_write(bc, len)) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + } + } + + return result; +} + +static sint8 spi_data_rsp(uint8 cmd) +{ + uint8 len; + uint8 rsp[3]; + sint8 result = N_OK; + + if (!gu8Crc_off) + len = 2; + else + len = 3; + + if (M2M_SUCCESS != nmi_spi_read(&rsp[0], len)) { + M2M_ERR("[nmi spi]: Failed bus error...\n"); + result = N_FAIL; + goto _fail_; + } + + if ((rsp[len - 1] != 0) || (rsp[len - 2] != 0xC3)) { + M2M_ERR("[nmi spi]: Failed data response read, %x %x %x\n", rsp[0], rsp[1], rsp[2]); + result = N_FAIL; + goto _fail_; + } +_fail_: + + return result; +} + +static sint8 spi_cmd_rsp(uint8 cmd) +{ + uint8 rsp; + sint8 result = N_OK; + sint8 s8RetryCnt; + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } + + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while ((rsp != cmd) && (s8RetryCnt-- > 0)); + + /** + State response + **/ + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while ((rsp != 0x00) && (s8RetryCnt-- > 0)); + +_fail_: + + return result; +} +#ifndef USE_OLD_SPI_SW +static int spi_cmd_complete(uint8_t cmd, uint32_t adr, uint8_t *b, uint32_t sz, uint8_t clockless) +{ + uint8_t wb[32], rb[32]; + uint8_t wix, rix; + uint32_t len2; + uint8_t rsp; + int len = 0; + int result = N_OK; + + wb[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + wb[1] = (uint8_t)(adr >> 8); + if (clockless == 1) + wb[1] |= (1 << 7); + wb[2] = (uint8_t)adr; + wb[3] = 0x00; + len = 5; + break; + case CMD_TERMINATE: /* termination */ + wb[1] = 0x00; + wb[2] = 0x00; + wb[3] = 0x00; + len = 5; + break; + case CMD_REPEAT: /* repeat */ + wb[1] = 0x00; + wb[2] = 0x00; + wb[3] = 0x00; + len = 5; + break; + case CMD_RESET: /* reset */ + wb[1] = 0xff; + wb[2] = 0xff; + wb[3] = 0xff; + len = 5; + break; + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + wb[4] = (uint8_t)(sz >> 8); + wb[5] = (uint8_t)(sz); + len = 7; + break; + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + wb[4] = (uint8_t)(sz >> 16); + wb[5] = (uint8_t)(sz >> 8); + wb[6] = (uint8_t)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + wb[1] = (uint8_t)(adr >> 8); + if (clockless == 1) + wb[1] |= (1 << 7); + wb[2] = (uint8_t)(adr); + wb[3] = b[3]; + wb[4] = b[2]; + wb[5] = b[1]; + wb[6] = b[0]; + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)(adr); + wb[4] = b[3]; + wb[5] = b[2]; + wb[6] = b[1]; + wb[7] = b[0]; + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result != N_OK) { + return result; + } + + if (!gu8Crc_off) { + wb[len - 1] = (crc7(0x7f, (const uint8_t *)&wb[0], len - 1)) << 1; + } else { + len -= 1; + } + +#define NUM_SKIP_BYTES (1) +#define NUM_RSP_BYTES (2) +#define NUM_DATA_HDR_BYTES (1) +#define NUM_DATA_BYTES (4) +#define NUM_CRC_BYTES (2) +#define NUM_DUMMY_BYTES (3) + + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + len2 = len + (NUM_SKIP_BYTES + NUM_RSP_BYTES + NUM_DUMMY_BYTES); + } else if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) { + if (!gu8Crc_off) { + len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES + NUM_CRC_BYTES + NUM_DUMMY_BYTES); + } else { + len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES + NUM_DUMMY_BYTES); + } + } else { + len2 = len + (NUM_RSP_BYTES + NUM_DUMMY_BYTES); + } +#undef NUM_DUMMY_BYTES + + if (len2 > (sizeof(wb) / sizeof(wb[0]))) { + M2M_ERR("[nmi spi]: spi buffer size too small (%d) (%d)\n", len2, (sizeof(wb) / sizeof(wb[0]))); + result = N_FAIL; + return result; + } + /* zero spi write buffers. */ + for (wix = len; wix < len2; wix++) { + wb[wix] = 0; + } + rix = len; + + if (nmi_spi_rw(wb, rb, len2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + return result; + } + +#if 0 + { + int jj; + printk("--- cnd = %x, len=%d, len2=%d\n", cmd, len, len2); + for(jj=0; jj= len2) break; + if(((jj+1)%16) != 0) { + if((jj%16) == 0) { + printk("wb[%02x]: %02x ", jj, wb[jj]); + } else { + printk("%02x ", wb[jj]); + } + } else { + printk("%02x\n", wb[jj]); + } + } + printk("\n"); + + for(jj=0; jj= len2) break; + if(((jj+1)%16) != 0) { + if((jj%16) == 0) { + printk("rb[%02x]: %02x ", jj, rb[jj]); + } else { + printk("%02x ", rb[jj]); + } + } else { + printk("%02x\n", rb[jj]); + } + } + printk("\n"); + } +#endif + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + rix++; /* skip 1 byte */ + } + + rsp = rb[rix++]; + + if (rsp != cmd) { + M2M_ERR("[nmi spi]: Failed cmd response, cmd (%02x), resp (%02x)\n", cmd, rsp); + result = N_FAIL; + return result; + } + + /** + State response + **/ + rsp = rb[rix++]; + if (rsp != 0x00) { + M2M_ERR("[nmi spi]: Failed cmd state response state (%02x)\n", rsp); + result = N_FAIL; + return result; + } + + if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ) || (cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) { + int retry; + // uint16_t crc1, crc2; + uint8_t crc[2]; + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + /* ensure there is room in buffer later to read data and crc */ + if (rix < len2) { + rsp = rb[rix++]; + } else { + retry = 0; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Error, data read response (%02x)\n", rsp); + result = N_RESET; + return result; + } + + if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) { + /** + Read bytes + **/ + if ((rix + 3) < len2) { + b[0] = rb[rix++]; + b[1] = rb[rix++]; + b[2] = rb[rix++]; + b[3] = rb[rix++]; + } else { + M2M_ERR("[nmi spi]: buffer overrun when reading data.\n"); + result = N_FAIL; + return result; + } + + if (!gu8Crc_off) { + /** + Read Crc + **/ + if ((rix + 1) < len2) { + crc[0] = rb[rix++]; + crc[1] = rb[rix++]; + } else { + M2M_ERR("[nmi spi]: buffer overrun when reading crc.\n"); + result = N_FAIL; + return result; + } + } + } else if ((cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) { + int ix; + + /* some data may be read in response to dummy bytes. */ + for (ix = 0; (rix < len2) && (ix < sz);) { + b[ix++] = rb[rix++]; + } +#if 0 + if(ix) M2M_INFO("ttt %d %d\n", sz, ix); +#endif + sz -= ix; + + if (sz > 0) { + int nbytes; + + if (sz <= (DATA_PKT_SZ - ix)) { + nbytes = sz; + } else { + nbytes = DATA_PKT_SZ - ix; + } + + /** + Read bytes + **/ + if (nmi_spi_read(&b[ix], nbytes) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + goto _error_; + } + + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (nmi_spi_read(crc, 2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + goto _error_; + } + } + + ix += nbytes; + sz -= nbytes; + } + + /* if any data in left unread, then read the rest using normal DMA code.*/ + while (sz > 0) { + int nbytes; + + if (sz <= DATA_PKT_SZ) { + nbytes = sz; + } else { + nbytes = DATA_PKT_SZ; + } + + /** + read data response only on the next DMA cycles not + the first DMA since data response header is already + handled above for the first DMA. + **/ + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + if (nmi_spi_read(&rsp, 1) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + /** + Read bytes + **/ + if (nmi_spi_read(&b[ix], nbytes) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (nmi_spi_read(crc, 2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } + } + } +_error_: + return result; +} +#endif +static sint8 spi_data_read(uint8 *b, uint16 sz, uint8 clockless) +{ + sint16 retry, ix, nbytes; + sint8 result = N_OK; + uint8 crc[2]; + uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Failed data response read...(%02x)\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (M2M_SUCCESS != nmi_spi_read(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + if (!clockless) { + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_read(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static sint8 spi_data_write(uint8 *b, uint16 sz) +{ + sint16 ix; + uint16 nbytes; + sint8 result = 1; + uint8 cmd, order, crc[2] = {0}; + // uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } else { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + cmd |= order; + if (M2M_SUCCESS != nmi_spi_write(&cmd, 1)) { + M2M_ERR("[nmi spi]: Failed data block cmd write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (M2M_SUCCESS != nmi_spi_write(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_write(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc write, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } while (sz); + + return result; +} + +/******************************************** + + Spi Internal Read/Write Function + +********************************************/ + +/******************************************** + + Spi interfaces + +********************************************/ + +static sint8 spi_write_reg(uint32 addr, uint32 u32data) +{ + uint8 retry = SPI_RETRY_COUNT; + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_WRITE; + uint8 clockless = 0; + +_RETRY_: + if (addr <= 0x30) { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } else { + cmd = CMD_SINGLE_WRITE; + clockless = 0; + } + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, write reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + +#else + + result = spi_cmd_complete(cmd, addr, (uint8 *)&u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", addr); + goto _FAIL_; + } + +#endif +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %x\n", retry, addr, u32data); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 nm_spi_write(uint32 addr, uint8 *buf, uint16 size) +{ + sint8 result; + uint8 retry = SPI_RETRY_COUNT; + uint8 cmd = CMD_DMA_EXT_WRITE; + +_RETRY_: + /** + Command + **/ +#if defined USE_OLD_SPI_SW + // Workaround hardware problem with single byte transfers over SPI bus + if (size == 1) + size = 2; + + result = spi_cmd(cmd, addr, 0, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi ]: Failed cmd response, write block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, NULL, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", addr); + goto _FAIL_; + } +#endif + + /** + Data + **/ + result = spi_data_write(buf, size); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + goto _FAIL_; + } + /** + Data RESP + **/ + result = spi_data_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + goto _FAIL_; + } + +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %d\n", retry, addr, size); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 spi_read_reg(uint32 addr, uint32 *u32data) +{ + uint8 retry = SPI_RETRY_COUNT; + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_READ; + uint8 tmp[4]; + uint8 clockless = 0; + +_RETRY_: + + if (addr <= 0xff) { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } else { + cmd = CMD_SINGLE_READ; + clockless = 0; + } + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, 0, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + /* to avoid endianess issues */ + result = spi_data_read(&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed data read...\n"); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, (uint8 *)&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", addr); + goto _FAIL_; + } + +#endif + + *u32data = tmp[0] | ((uint32)tmp[1] << 8) | ((uint32)tmp[2] << 16) | ((uint32)tmp[3] << 24); + +_FAIL_: + if (result != N_OK) { + + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x\n", retry, addr); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 nm_spi_read(uint32 addr, uint8 *buf, uint16 size) +{ + uint8 cmd = CMD_DMA_EXT_READ; + sint8 result; + uint8 retry = SPI_RETRY_COUNT; +#if defined USE_OLD_SPI_SW + uint8 tmp[2]; + uint8 single_byte_workaround = 0; +#endif + +_RETRY_: + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + if (size == 1) { + // Workaround hardware problem with single byte transfers over SPI bus + size = 2; + single_byte_workaround = 1; + } + result = spi_cmd(cmd, addr, 0, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + /** + Data + **/ + if (single_byte_workaround) { + result = spi_data_read(tmp, size, 0); + buf[0] = tmp[0]; + } else + result = spi_data_read(buf, size, 0); + + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data read...\n"); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, buf, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", addr); + goto _FAIL_; + } +#endif + +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %d\n", retry, addr, size); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +/******************************************** + + Bus interfaces + +********************************************/ + +static void spi_init_pkt_sz(void) +{ + uint32 val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE + 0x24); + val32 &= ~(0x7 << 4); + switch (DATA_PKT_SZ) { + case 256: + val32 |= (0 << 4); + break; + case 512: + val32 |= (1 << 4); + break; + case 1024: + val32 |= (2 << 4); + break; + case 2048: + val32 |= (3 << 4); + break; + case 4096: + val32 |= (4 << 4); + break; + case 8192: + val32 |= (5 << 4); + break; + } + nm_spi_write_reg(SPI_BASE + 0x24, val32); +} + +sint8 nm_spi_reset(void) +{ + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_init + * @brief Initialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_init(void) +{ + uint32 chipid; + uint32 reg = 0; + + /** + configure protocol + **/ + gu8Crc_off = 0; + + // TODO: We can remove the CRC trials if there is a definite way to reset + // the SPI to it's initial value. + if (!spi_read_reg(NMI_SPI_PROTOCOL_CONFIG, ®)) { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nmi spi]: Failed internal read protocol with CRC on, retyring with CRC off...\n"); + if (!spi_read_reg(NMI_SPI_PROTOCOL_CONFIG, ®)) { + // Reaad failed with both CRC on and off, something went bad + M2M_ERR("[nmi spi]: Failed internal read protocol...\n"); + return 0; + } + } + if (gu8Crc_off == 0) { + reg &= ~0xc; /* disable crc checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + if (!spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg)) { + M2M_ERR("[nmi spi]: Failed internal write protocol reg...\n"); + return 0; + } + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (!spi_read_reg(0x1000, &chipid)) { + M2M_ERR("[nmi spi]: Fail cmd read chip id...\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nmi spi]: chipid (%08x)\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_init + * @brief DeInitialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Samer Sarhan + * @date 27 Feb 2015 + * @version 1.0 + */ +sint8 nm_spi_deinit(void) +{ + gu8Crc_off = 0; + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_spi_read_reg(uint32 u32Addr) +{ + uint32 u32Val; + + spi_read_reg(u32Addr, &u32Val); + + return u32Val; +} + +/* + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + sint8 s8Ret; + + s8Ret = spi_read_reg(u32Addr, pu32RetVal); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val) +{ + sint8 s8Ret; + + s8Ret = spi_write_reg(u32Addr, u32Val); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + sint8 s8Ret; + + s8Ret = nm_spi_read(u32Addr, puBuf, u16Sz); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + sint8 s8Ret; + + s8Ret = nm_spi_write(u32Addr, puBuf, u16Sz); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +#endif diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmspi.h b/AudioConsole.X/Source/winc1500/driver/source/nmspi.h new file mode 100644 index 0000000..36eb9a9 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmspi.h @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 SPI protocol bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "common/include/nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @fn nm_spi_init + * @brief Initialize the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_init(void); +/** + * @fn nm_spi_reset + * @brief reset the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_reset(void); + +/** + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_deinit(void); + +/** + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_spi_read_reg(uint32 u32Addr); + +/** + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMSPI_H_ */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmuart.c b/AudioConsole.X/Source/winc1500/driver/source/nmuart.c new file mode 100644 index 0000000..52b8961 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmuart.c @@ -0,0 +1,471 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 UART protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_UART + +#include "driver/source/nmuart.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#define HDR_SZ 12 + +static uint8 get_cs(uint8 *b, uint8 sz) +{ + int i; + uint8 cs = 0; + for (i = 0; i < sz; i++) + cs ^= b[i]; + return cs; +} + +/* + * @fn nm_uart_sync_cmd + * @brief Check COM Port + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_sync_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = -1; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + uint8 onchip = 0; + + /*read reg*/ + b[0] = 0x12; + + rsz = 1; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0x5a) { + s8Ret = 0; + onchip = 1; + M2M_INFO("Built-in WINC1500 UART Found\n"); + } else if (b[0] == 0x5b) { + s8Ret = 0; + onchip = 0; + M2M_INFO("WINC1500 Serial Bridge Found\n"); + } + /*TODO: this should be the way we read the register since the cortus is little endian*/ + /**pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24);*/ + if (s8Ret == M2M_SUCCESS) + s8Ret = (sint8)onchip; + return s8Ret; +} +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + + /*read reg*/ + b[0] = 0xa5; + b[1] = 0; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + b[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + b[8] = (uint8)((u32Addr & 0xff000000) >> 24); + b[9] = 0; + b[10] = 0; + b[11] = 0; + b[12] = 0; + + b[2] = get_cs(&b[1], HDR_SZ); + + rsz = 4; + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + if (!nm_bus_get_chip_type()) { + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the command\n"); + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + /*TODO: this should be the way we read the register since the cortus is little endian*/ + /**pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24);*/ + + *pu32RetVal = ((uint32)b[0] << 24) | ((uint32)b[1] << 16) | ((uint32)b[2] << 8) | b[3]; + + return s8Ret; +} + +/* + * @fn nm_uart_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +uint32 nm_uart_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_uart_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* + * @fn nm_uart_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 1; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + b[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + b[8] = (uint8)((u32Addr & 0xff000000) >> 24); + b[9] = (uint8)(u32Val & 0x000000ff); + b[10] = (uint8)((u32Val & 0x0000ff00) >> 8); + b[11] = (uint8)((u32Val & 0x00ff0000) >> 16); + b[12] = (uint8)((u32Val & 0xff000000) >> 24); + + b[2] = get_cs(&b[1], HDR_SZ); + + get_cs(&b[1], HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the reg write command\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** + * @fn nm_uart_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 au8Buf[HDR_SZ + 1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 2; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00) >> 8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000) >> 24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1], HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the block read command\n"); + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("write error (Error sending the block read command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** + * @fn nm_uart_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + static uint8 au8Buf[HDR_SZ + 1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 3; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00) >> 8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000) >> 24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1], HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the block Write command\n"); + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + // check for the ack from the SAMD21 for the payload reception. + strUart.pu8Buf = au8Buf; + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the data payload\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } else { + M2M_ERR("write error (Error sending the block write command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + return s8Ret; +} + +/** + * @fn nm_uart_reconfigure + * @brief Reconfigures the UART interface + * @param [in] ptr + * Pointer to a DWORD containing baudrate at this moment. + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Viswanathan Murugesan + * @date 22 OCT 2014 + * @version 1.0 + */ +sint8 nm_uart_reconfigure(void *ptr) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 5; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + b[8] = 0; + b[9] = (uint8)((*(unsigned long *)ptr) & 0x000000ff); + b[10] = (uint8)(((*(unsigned long *)ptr) & 0x0000ff00) >> 8); + b[11] = (uint8)(((*(unsigned long *)ptr) & 0x00ff0000) >> 16); + b[12] = (uint8)(((*(unsigned long *)ptr) & 0xff000000) >> 24); + + b[2] = get_cs(&b[1], HDR_SZ); + + get_cs(&b[1], HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the UART reconfigure command\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} +#endif +/* EOF */ diff --git a/AudioConsole.X/Source/winc1500/driver/source/nmuart.h b/AudioConsole.X/Source/winc1500/driver/source/nmuart.h new file mode 100644 index 0000000..0bb1c36 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/driver/source/nmuart.h @@ -0,0 +1,118 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 UART protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef _NMUART_H_ +#define _NMUART_H_ + +#include "common/include/nm_common.h" + +/* + * @fn nm_uart_sync_cmd + * @brief Check COM Port + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_sync_cmd(void); +/** + * @fn nm_uart_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_uart_read_reg(uint32 u32Addr); + +/** + * @fn nm_uart_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_uart_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_uart_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_uart_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_uart_reconfigure + * @brief Reconfigures the UART interface + * @param [in] ptr + * Pointer to a DWORD containing baudrate at this moment. + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_reconfigure(void *ptr); +#endif /* _NMI2C_H_ */ diff --git a/AudioConsole.X/Source/winc1500/programmer/programmer.h b/AudioConsole.X/Source/winc1500/programmer/programmer.h new file mode 100644 index 0000000..c788cdc --- /dev/null +++ b/AudioConsole.X/Source/winc1500/programmer/programmer.h @@ -0,0 +1,71 @@ +/** + * + * \file + * + * \brief WINC Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef __PROGRAMMER_H__ +#define __PROGRAMMER_H__ + +/** + * Include + */ +#include "spi_flash/include/spi_flash_map.h" +#include "spi_flash/include/spi_flash.h" + +#define ROOT_CERT_SIZE M2M_TLS_ROOTCER_FLASH_SIZE + +#define programmer_get_flash_size() (((spi_flash_get_size() * 1024) / 8) * 1024) +#define programmer_write(pu8Buf, u32Offset, u32Sz) spi_flash_write(pu8Buf, u32Offset, u32Sz) +#define programmer_erase(u32Offset, u32Sz) spi_flash_erase(u32Offset, u32Sz) +#define programmer_eraseall() programmer_erase(0, programmer_get_flash_size()) +#define programmer_read(pu8Buf, u32Offset, u32Sz) spi_flash_read(pu8Buf, u32Offset, u32Sz) + +#define programmer_write_root_cert(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) +#define programmer_read_root_cert(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) +#define programmer_erase_root_cert() programmer_erase(M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) + +#define programmer_write_tls_cert_store(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) +#define programmer_read_tls_cert_store(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) +#define programmer_erase_tls_cert_store() programmer_erase(M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) + +#endif /* __PROGRAMMER_H__ */ diff --git a/AudioConsole.X/Source/winc1500/programmer/programmer_apis.h b/AudioConsole.X/Source/winc1500/programmer/programmer_apis.h new file mode 100644 index 0000000..72b8b44 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/programmer/programmer_apis.h @@ -0,0 +1,65 @@ +/** + * + * \file + * + * \brief Programmer APIs. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef FIRMWARE_PROGRAMMER_APIS_H_INCLUDED +#define FIRMWARE_PROGRAMMER_APIS_H_INCLUDED + +/** + * Include + */ +#include "common/include/nm_common.h" +#include "programmer/programmer.h" +#include "spi_flash/include/spi_flash_map.h" + +#define programmer_write_cert_image(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define programmer_read_cert_image(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define programmer_erase_cert_image() \ + programmer_erase(M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) + +#define programmer_write_firmware_image(buff, offSet, sz) programmer_write((uint8 *)buff, offSet, sz) +#define programmer_read_firmware_image(buff, offSet, sz) programmer_read((uint8 *)buff, offSet, sz) +//#define programmer_erase_firmware_image() programmer_eraseall() + +#define programmer_erase_all() programmer_erase(0, programmer_get_flash_size()) + +#endif /* __FIRMWARE_PROGRAMMER_APIS__ */ diff --git a/AudioConsole.X/Source/winc1500/socket/include/m2m_socket_host_if.h b/AudioConsole.X/Source/winc1500/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..4e0bfdb --- /dev/null +++ b/AudioConsole.X/Source/winc1500/socket/include/m2m_socket_host_if.h @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2014 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "socket/include/socket.h" +#else +#include "m2m_types.h" +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/socket.h + * The two definitions must match. + */ +#ifdef _FIRMWARE_ +#define HOSTNAME_MAX_SIZE (64) +#endif + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invlaid Socket command value. +*/ + +#define SOCKET_CMD_BIND 0x41 +/*!< + Socket Binding command value. +*/ + +#define SOCKET_CMD_LISTEN 0x42 +/*!< + Socket Listening command value. +*/ + +#define SOCKET_CMD_ACCEPT 0x43 +/*!< + Socket Accepting command value. +*/ + +#define SOCKET_CMD_CONNECT 0x44 +/*!< + Socket Connecting command value. +*/ + +#define SOCKET_CMD_SEND 0x45 +/*!< + Socket send command value. +*/ + +#define SOCKET_CMD_RECV 0x46 +/*!< + Socket Recieve command value. +*/ + +#define SOCKET_CMD_SENDTO 0x47 +/*!< + Socket sendTo command value. +*/ + +#define SOCKET_CMD_RECVFROM 0x48 +/*!< + Socket RecieveFrom command value. +*/ + +#define SOCKET_CMD_CLOSE 0x49 +/*!< + Socket Close command value. +*/ + +#define SOCKET_CMD_DNS_RESOLVE 0x4A +/*!< + Socket DNS Resolve command value. +*/ + +#define SOCKET_CMD_SSL_CONNECT 0x4B +/*!< + SSL-Socket Connect command value. +*/ + +#define SOCKET_CMD_SSL_SEND 0x4C +/*!< + SSL-Socket Send command value. +*/ + +#define SOCKET_CMD_SSL_RECV 0x4D +/*!< + SSL-Socket Recieve command value. +*/ + +#define SOCKET_CMD_SSL_CLOSE 0x4E +/*!< + SSL-Socket Close command value. +*/ + +#define SOCKET_CMD_SET_SOCKET_OPTION 0x4F +/*!< + Set Socket Option command value. +*/ + +#define SOCKET_CMD_SSL_CREATE 0x50 +/*!< + */ + +#define SOCKET_CMD_SSL_SET_SOCK_OPT 0x51 +/*!< + */ + +#define SOCKET_CMD_PING 0x52 +/*!< + */ + +#define SOCKET_CMD_SSL_SET_CS_LIST 0x53 +/*!< + Recommend instead using @ref M2M_SSL_REQ_SET_CS_LIST and + associated response @ref M2M_SSL_RESP_SET_CS_LIST +*/ + +#define SOCKET_CMD_SSL_BIND 0x54 +/*!< + */ + +#define SOCKET_CMD_SSL_EXP_CHECK 0x55 +/*!< + */ + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + * @brief + */ +typedef struct { + uint16 u16Family; + uint16 u16Port; + uint32 u32IPAddr; +} tstrSockAddr; + +//typedef sint8 SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct { + char acHostName[HOSTNAME_MAX_SIZE]; + uint32 u32HostIP; +} tstrDnsReply; + +/*! +@brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrBindCmd; + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +} tstrBindReply; + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8BackLog; + uint16 u16SessionID; +} tstrListenCmd; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct { + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +} tstrListenReply; + +/*! + * @brief + */ +typedef struct { + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +} tstrAcceptReply; + +/*! + * @brief + */ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8SslFlags; + uint16 u16SessionID; +} tstrConnectCmd; + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct { + SOCKET sock; + sint8 s8Error; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +} tstrConnectReply; + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + uint8 u8Void; + uint16 u16DataSize; + tstrSockAddr strAddr; + uint16 u16SessionID; + uint16 u16Void; +} tstrSendCmd; + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct { + SOCKET sock; + uint8 u8Void; + sint16 s16SentBytes; + uint16 u16SessionID; + uint16 u16Void; +} tstrSendReply; + +/*! + * @brief + */ +typedef struct { + uint32 u32Timeoutmsec; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrRecvCmd; + +/*! +@struct +@brief +*/ +typedef struct { + tstrSockAddr strRemoteAddr; + sint16 s16RecvStatus; + uint16 u16DataOffset; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrRecvReply; + +/*! + * @brief + */ +typedef struct { + uint32 u32OptionValue; + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; +} tstrSetSocketOptCmd; + +typedef struct { + SOCKET sslSock; + uint8 __PAD24__[3]; +} tstrSSLSocketCreateCmd; + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; + uint32 u32OptLen; + uint8 au8OptVal[SSL_MAX_OPT_LEN]; +} tstrSSLSetSockOptCmd; + +/*! + */ +typedef struct { + uint32 u32DestIPAddr; + uint32 u32CmdPrivate; + uint16 u16PingCount; + uint8 u8TTL; + uint8 __PAD8__; +} tstrPingCmd; + +typedef struct { + uint32 u32IPAddr; + uint32 u32CmdPrivate; + uint32 u32RTT; + uint16 u16Success; + uint16 u16Fail; + uint8 u8ErrorCode; + uint8 __PAD24__[3]; +} tstrPingReply; + +/*! +@struct\ + tstrSslCertExpSettings + +@brief SSL Certificate Expiry Validation Settings + +@sa tenuSslCertExpSettings +*/ +typedef struct { + uint32 u32CertExpValidationOpt; + /*!< + See @tenuSslCertExpSettings for possible values. + */ +} tstrSslCertExpSettings; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/AudioConsole.X/Source/winc1500/socket/include/socket.h b/AudioConsole.X/Source/winc1500/socket/include/socket.h new file mode 100644 index 0000000..7c31e7f --- /dev/null +++ b/AudioConsole.X/Source/winc1500/socket/include/socket.h @@ -0,0 +1,1987 @@ +/** + * + * \file + * + * \brief WINC BSD compatible Socket Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup SocketHeader Socket + * BSD compatible socket interface beftween the host layer and the network + * protocol stacks in the firmware. + * These functions are used by the host application to send or receive + * packets and to do other socket operations. + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** + * @defgroup SocketDefines Defines + * @ingroup SocketHeader + */ + +/** @defgroup IPDefines TCP/IP Defines + * @ingroup SocketDefines + * The following list of macros are used to define constants used throughout the socket layer. + * @{ + */ + +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/m2m_socket_host_if.h + * The two definitions must match. + */ +#define HOSTNAME_MAX_SIZE 64 +/*!< + Maximum allowed size for a host domain name passed to the function gethostbyname @ref gethostbyname. + command value. Used with the setsockopt function. + +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in + structure. (It is the only supported type for the current implementation.) +*/ + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag shall be passed to the socket API for SSL session. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks. + Used with the @ref setsockopt function. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value (to join a multicast group). + Used with the @ref setsockopt function. +*/ + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value (to leave a multicast group). + Used with the @ref setsockopt function. +*/ +//@} + +/** + * @defgroup TLSDefines TLS Defines + * @ingroup SocketDefines + */ + +/** @defgroup SSLSocketOptions TLS Socket Options + * @ingroup TLSDefines + * The following list of macros are used to define SSL Socket options. + * @{ + * @sa setsockopt + */ + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate + verification process. + It is highly required NOT to use this socket option in production + software applications. It is supported for debugging and testing + purposes. + The option value should be casted to int type and it is handled + as a boolean flag. +*/ + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The + SNI is a NULL terminated string containing the server name + associated with the connection. It must not exceed the size + of HOSTNAME_MAX_SIZE. +*/ + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + This option allow the TLS to cache the session information for fast + TLS session establishment in future connections using the + TLS Protocol session resume features. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Enable SNI validation against the server's certificate subject + common name. If there is no SNI provided (via the SO_SSL_SNI + option), setting this option does nothing. +*/ + +//@} + +/** @defgroup LegacySSLCipherSuite Legacy names for TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros MUST NOT be used. Instead use the new names under SSLCipherSuiteID + * @sa sslSetActiveCipherSuites + * @{ + */ + +#define SSL_ENABLE_RSA_SHA_SUITES 0x01 +/*!< + Enable RSA Hmac_SHA based Cipher suites. For example, + TLS_RSA_WITH_AES_128_CBC_SHA +*/ + +#define SSL_ENABLE_RSA_SHA256_SUITES 0x02 +/*!< + Enable RSA Hmac_SHA256 based Cipher suites. For example, + TLS_RSA_WITH_AES_128_CBC_SHA256 +*/ + +#define SSL_ENABLE_DHE_SHA_SUITES 0x04 +/*!< + Enable DHE Hmac_SHA based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_CBC_SHA +*/ + +#define SSL_ENABLE_DHE_SHA256_SUITES 0x08 +/*!< + Enable DHE Hmac_SHA256 based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 +*/ + +#define SSL_ENABLE_RSA_GCM_SUITES 0x10 +/*!< + Enable RSA AEAD based Cipher suites. For example, + TLS_RSA_WITH_AES_128_GCM_SHA256 +*/ + +#define SSL_ENABLE_DHE_GCM_SUITES 0x20 +/*!< + Enable DHE AEAD based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 +*/ + +#define SSL_ENABLE_ALL_SUITES 0x0000003F +/*!< + Enable all possible supported cipher suites. +*/ + +//@} + +/** @defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + +#define SSL_ECC_ONLY_CIPHERS \ + (SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) +/*!< + All ciphers that use ECC crypto only. This execuldes ciphers that use RSA. They use ECDSA instead. + These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ +#define SSL_ECC_ALL_CIPHERS \ + (SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) +/*!< + All supported ECC Ciphers including those ciphers that depend on RSA and ECC. + These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ + +#define SSL_NON_ECC_CIPHERS_AES_128 \ + (SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256) +/*!< + All supported AES-128 Ciphers (ECC ciphers are not counted). This is the default active group after startup. +*/ + +#define SSL_ECC_CIPHERS_AES_256 (SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA) +/*!< + ECC AES-256 supported ciphers. +*/ + +#define SSL_NON_ECC_CIPHERS_AES_256 \ + (SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256) +/*!< + AES-256 Ciphers. + This group is disabled by default at startup because the WINC1500 HW Accelerator + supports only AES-128. If the application needs to force AES-256 cipher support, + it could enable them (or any of them) explicitly by calling sslSetActiveCipherSuites. +*/ + +#define SSL_CIPHER_ALL \ + (SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA) +/*!< + Turn On All TLS Ciphers. +*/ + +//@} + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SocketHeader + * The following list of macros are used to define the possible error codes returned as a result of a call to a socket + * function. Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation +*/ + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a specific + address For example: bind is called without specifying a port number +*/ + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. With socket operations, only one IP address per socket is + permitted. Any attempt for a new socket to bind with an IP address already bound to another open socket, will return + the following error code. States that bind operation failed. +*/ + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through + TCP_SOCK_MAX. It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation + failed. +*/ + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through + UDP_SOCK_MAX. It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation + failed +*/ + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a function. +*/ + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies Identifies that @ref listen operation failed. +*/ + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the + current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be + completed. It is generated as an error to the @ref sendto function when the address required to send the data to is + not known. +*/ + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed by the peer. The local socket is + closed also. +*/ + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has Timedout. +*/ + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ + +#ifdef _NM_BSP_BIG_END + +#define _htonl(m) (m) +#define _htons(A) (A) + +#else + +#define _htonl(m) \ + (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) \ + | ((uint32)(((uint32)m) >> 24))) +/*!< + Convert a 4-byte integer from the host representation to the Network byte order representation. +*/ + +#define _htons(A) (uint16)((((uint16)(A)) << 8) | (((uint16)(A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from the host representation to the Network byte order representation. +*/ + +#endif + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from the Network byte order representation to the host representation . +*/ + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from the Network byte order representation to the host representation . +*/ +//@} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** @defgroup SocketEnums DataTypes + * @ingroup SocketHeader + * Specific Enumeration-typedefs used for socket operations + * @{ */ + +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + Such an ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef sint8 SOCKET; + +/*! +@struct \ + in_addr + +@brief + IPv4 address representation. + + This structure is used as a placeholder for IPV4 address in other structures. +@see + sockaddr_in +*/ +typedef struct { + uint32 s_addr; + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ +} in_addr; + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see + sockaddr_in +*/ +struct sockaddr { + uint16 sa_family; + /*!< +Socket address family. + */ + uint8 sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + sockaddr_in + +@brief + Socket address structure for IPV4 addresses. Used to specify socket address information to which to connect to. + Can be cast to @ref sockaddr structure. +*/ +struct sockaddr_in { + uint16 sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16 sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + It must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. non zero otherwise. + */ + uint8 sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; +//@} +/**@defgroup AsyncCalback Asynchronous Events + * @ingroup SocketEnums + * Specific Enumeration used for asynchronous operations + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs, make use of callback functions, in-order to return back the results once the corresponding socket +operation is completed. Hence resuming the normal execution of the application code while the socket operation returns +the results. Callback functions expect event messages to be passed in, in-order to identify the operation they're +returning the results for. The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback +functions. A function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket +operation. + +@see + bind + listen + accept + connect + send + recv + +*/ +typedef enum { + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + sendto socket event. + */ + SOCKET_MSG_RECVFROM + /*!< + Recvfrom socket event. + */ +} tenuSocketCallbackMsgType; + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind + +*/ +typedef struct { + sint8 status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketBindMsg; + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen +function. This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback +function. +@see + listen +*/ +typedef struct { + sint8 status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketListenMsg; + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept +function. This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback +function. +*/ +typedef struct { + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with + the remote peer. Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +} tstrSocketAcceptMsg; + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to the asynchronous call to the @ref +connect socket function. This structure together with the event @ref SOCKET_MSG_CONNECT are passed-in parameters to the +callback function. +*/ +typedef struct { + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the connect function call. + */ + sint8 s8Error; + /*!< + Connect error code. + Holding a value of ZERO for a successful connect or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketConnectMsg; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the recv or +recvfrom socket functions. This structure together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM are +passed-in parameters to the callback function. +@remark + In case the received data from the remote peer is larger than the USER buffer size defined during the asynchronous +call to the @ref recv function, the data is delivered to the user in a number of consecutive chunks according to the +USER Buffer size. a negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted + @SOCK_ERR_TIMEOUT : Socket receive timed out +*/ +typedef struct { + uint8 *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + sint16 s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16 u16RemainingSize; + /*!< + The number of bytes remaining in the current @ref recv operation. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +} tstrSocketRecvMsg; + +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application +callback through this function by calling @ref registerSocketCallback. In response to events received, the following +callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref +connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is recived in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb)(SOCKET sock, uint8 u8Msg, void *pvMsg); + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref +registerSocketCallback. The following callback is triggered in response to asynchronous call to the @ref gethostbyname +function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in NW byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb)(uint8 *pu8DomainName, uint32 u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32 u32IPAddr, uint32 u32RTT, uint8 u8ErrorCode); + +/**@}*/ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SocketAPI Function + * @ingroup SocketHeader + */ + +/** @defgroup SocketInitalizationFn socketInit + * @ingroup SocketAPI + * The function performs the necessary initializations for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent reseting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + + */ +/**@{*/ +/*! +@fn \ + NMI_API void socketInit(void); + +@param [in] void + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based in the maximum +number of sockets @ref MAX_SOCKET based on the systems capability. \section Example This example demonstrates the use of +the socketinit for socket initialization for an mqtt chat application. \code tstrWifiInitParam param; int8_t ret; char +topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + m2m_wifi_connect((char *)MAIN_WLAN_SSID, sizeof(MAIN_WLAN_SSID), + MAIN_WLAN_AUTH, (char *)MAIN_WLAN_PSK, M2M_WIFI_CH_ALL); + +\endcode +*/ +NMI_API void socketInit(void); + +/*! +@fn \ + NMI_API void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked as the last any socket operation is performed on any active sockets. +*/ +NMI_API void socketDeinit(void); + +/** @} */ +/** @defgroup SocketCallbackFn registerSocketCallback + * @ingroup SocketAPI + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering + function. The registered callback functions are used to retrieve information in response to the asynchronous socket + functions called. + */ +/**@{*/ + +/*! +@fn \ + NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + +@param [in] tpfAppSocketCb + Assignment of callback function to the global callback @ref tpfAppSocketCb +gpfAppSocketCb. Delivers socket messages to the host application. In response to the asynchronous function calls, such +as @ref bind + @ref listen @ref accept @ref connect + +@param [in] tpfAppResolveCb + Assignment of callback function to the global callback @ref tpfAppResolveCb +gpfAppResolveCb. Used for DNS resolving functionalities. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when, DNS resolution is not required. + +@return void +@remarks + If any of the socket functionalities is not to be used, NULL is passed in as a parameter. + It must be invoked after socketinit and before other socket layer operations. + +\section Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS +resolution CB set to null for a simple UDP server example. \code tstrWifiInitParam param; int8_t ret; struct sockaddr_in +addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + m2m_wifi_connect((char *)MAIN_WLAN_SSID, sizeof(MAIN_WLAN_SSID), MAIN_WLAN_AUTH, (char *)MAIN_WLAN_PSK, +M2M_WIFI_CH_ALL); \endcode +*/ +NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + +/** @} */ + +/** @defgroup SocketFn socket + * @ingroup SocketAPI + * Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and + * their possible types are either TCP or a UDP sockets. The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX + * sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + * + */ +/**@{*/ +/*! +@fn \ + NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + +@param [in] u8Flags + Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets. + It could be @ref SOCKET_FLAGS_SSL if the socket is used for SSL session. The use of the flag + @ref SOCKET_FLAGS_SSL has no meaning in case of UDP sockets. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket +handler. before any call to the socket function can be made. + +@see + connect + bind + listen + accept + recv + recvfrom + send + sendto + close + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of +available sockets. + +@remarks + The socket function must be called a priori to any other related socket functions "e.g. send, recv, close +..etc" \section Example This example demonstrates the use of the socket function to allocate the socket, returning the +socket handler to be used for other socket operations. Socket creation is dependent on the socket type. \subsection sub1 +UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0)); +@endcode +\subsection sub3 SSL example +@code +static SOCKET ssl_socket = -1; + +ssl_socket = socket(AF_INET, SOCK_STREAM, SOCK_FLAGS_SSL)); +@endcode +*/ +NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + +/** @} */ +/** @defgroup BindFn bind + * @ingroup SocketAPI + * Asynchronous bind function associates the provided address and local port to the socket. + * The function can be used with both TCP and UDP sockets it's mandatory to call the @ref bind function before + *starting any UDP or TCP server operation. Upon socket bind completion, the application will receive a @ref + *SOCKET_MSG_BIND message in the socket callback. + */ +/**@{*/ +/*! +\fn \ + NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see + socket + connect + listen + accept + recv + recvfrom + send + sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(1234); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret != 0) + { + printf("Bind Failed. Error code = %d\n",ret); + close(udpServerSocket); + } + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +/** @} */ + +/** @defgroup ListenFn listen + * @ingroup SocketAPI + * After successful socket binding to an IP address and port on the system, start listening on a passive socket for + incoming connections. The socket must be bound on a local port or the listen operation fails. Upon the call to the + asynchronous listen function, response is received through the event [SOCKET_MSG_BIND](@ref SOCKET_MSG_BIND) in the + socket callback. A successful listen means the TCP server operation is active. If a connection is accepted, then the + application socket callback function is notified with the new connected socket through the event @ref + SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function after calling @ref listen. + + After a connection is accepted, the user is then required to call the @ref recv to receive any packets transmitted + by the remote host or to receive notification of socket connection termination. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 listen(SOCKET sock, uint8 backlog); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see + bind + accept + recv + recvfrom + send + sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8 u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +NMI_API sint8 listen(SOCKET sock, uint8 backlog); +/** @} */ +/** @defgroup AcceptFn accept + * @ingroup SocketAPI + * The function has no current implementation. An empty deceleration is used to prevent errors when legacy application + *code is used. For recent application use, the accept function can be safer as it has no effect and could be safely + *removed from any application using it. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); +/** @} */ +/** @defgroup ConnectFn connect + * @ingroup SocketAPI + * Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of a successful new socket connection through the event @ref + SOCKET_MSG_CONNECT. A successful connect means the TCP session is active. The application is then required to make a + call to the @ref recv to receive any packets transmitted by the remote server, unless the application is interrupted by + a notification of socket connection termination. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pstrAddr + Address of the remote server. +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through +the main function and how the callback function handles the @ref SOCKET_MSG_CONNECT event. \subsection sub1 Main +Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,0); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub2 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8 acBuffer[GROWL_MSG_SIZE]; + uint16 u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + close(pstrNotification->Socket); + } + } +@endcode +*/ +NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/** @} */ +/** @defgroup ReceiveFn recv + * @ingroup SocketAPI + * An asynchronous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the + two socket events [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the + socket is already connected to a remote host. The application receives the required data in response to this + asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - SOCK_ERR_NO_ERROR : Socket connection closed + - SOCK_ERR_CONN_ABORTED : Socket connection aborted + - SOCK_ERR_TIMEOUT : Socket receive timed out + The application code is expected to close the socket through the call to the @ref close function upon the appearance + of the above mentioned errors. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see + socket + connect + bind + listen + recvfrom + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Recieve buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification +of the accept or connect events, and the parsing of the received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + close(sock); + } + } + break; + + default: + break; + } +} +@endcode +*/ +NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/** @} */ +/** @defgroup ReceiveFromSocketFn recvfrom + * @ingroup SocketAPI + * Receives data from a UDP Socket. + * + * The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + * a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + * with successful status in the socket callback). + * + * Upon calling the recvfrom function with a successful return code, the application is expected to receive a + *notification in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + * + * Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + * Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error + *@SOCK_ERR_TIMEOUT: + * + * The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + * using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a UDP socket before passing the socket ID to the recvfrom function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref +bind function. + +@see + socket + bind + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon +notification of a successful bind event, and the parsing of the received data when the SOCKET_MSG_RECVFROM event is +received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16 u16port = pstrRx->strRemoteAddr.sin_port; + uint32 strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Recieved frame with size = %d.\tHost address=%x, Port number = +%d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + ret = close(sock); + } + } + break; + + default: + break; + } +} +@endcode +*/ +NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/** @} */ +/** @defgroup SendFn send + * @ingroup SocketAPI +* Asynchronous sending function, used to send data on a TCP/UDP socket. + +* Called by the application code when there is outgoing data available required to be sent on a specific socket +handler. +* The only difference between this function and the similar @ref sendto function, is the type of socket the data is +sent on and the parameters passed in. +* @ref send function is most commonly called for sockets in a connected state. +* After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to +receive an event of type +* @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument +is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the +data). Hence this function is expected to be called after a successful socket connect operation(in client case or accept +in the the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order +to send outgoing data using the @ref send function, at least one successful call must be made to the @ref sendto +function a priori the consecutive calls to the @ref send function, to ensure that the destination address is saved in +the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifier through the a prior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the +error) otherwise. +*/ +NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); +/** @} */ +/** @defgroup SendToSocketFn sendto + * @ingroup SocketAPI + * Asynchronous sending function, used to send data on a UDP socket. + * Called by the application code when there is data required to be sent on a UDP socket handler. + * The application code is expected to receive data from a successful bounded socket node. + * The only difference between this function and the similar @ref send function, is the type of socket the data is + * received on. This function works only with UDP sockets. After the data is sent, the socket callback function + * registered using registerSocketCallback(), is expected to receive an event of type + * @ref SOCKET_MSG_SENDTO. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr +*pstrDestAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument +is passed in. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + +@param [in] flags + Not used in the current implementation + +@param [in] pstrDestAddr + The destination address. + +@param [in] u8AddrLen + Destination address length in bytes. + Not used in the current implementation, only included for BSD compatibility. +@pre + Sockets must be initialized using socketInit. + +@see + socketInit + recvfrom + sendto + socket + connect + accept + send + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket (returned from socket ). + A valid buffer pointer must be used (not NULL). \n + Successful completion of a call to sendto() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) +otherwise. +*/ +NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, + struct sockaddr *pstrDestAddr, uint8 u8AddrLen); +/** @} */ +/** @defgroup CloseSocketFn close + * @ingroup SocketAPI + * Synchronous close function, releases all the socket assigned resources. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 close(SOCKET sock); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@pre + Sockets must be initialized through the call of the socketInit function. + @ref close is called only for valid socket identifiers created through the @ref socket function. + +@warning + If @ref close is called while there are still pending messages (sent or received ) they will be discarded. + +@see + socketInit + socket + +@return + The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) +otherwise. +*/ +NMI_API sint8 close(SOCKET sock); + +/** @} */ +/** @defgroup InetAddressFn nmi_inet_addr + * @ingroup SocketAPI + * Synchronous function which returns a BSD socket compliant Internet Protocol (IPv4) socket address. + * This IPv4 address in the input string parameter could either be specified as a host name, or as a numeric string + * representation like n.n.n.n known as the IPv4 dotted-decimal format (i.e. "192.168.10.1"). This function is used + * whenever an ip address needs to be set in the proper format (i.e. for the @ref tstrM2MIPConfig structure). + */ +/**@{*/ +/*! +@fn \ + NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + +@param [in] pcIpAddr + A null terminated string containing the IP address in IPv4 dotted-decimal address. + +@return + Unsigned 32-bit integer representing the IP address in Network byte order + (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + +*/ +NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + +/** @} */ +/** @defgroup gethostbynameFn gethostbyname + * @ingroup SocketAPI + * Asynchronous DNS resolving function. This function use DNS to resolve a domain name into the corresponding IP + * address. A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS + * callback function registered using registerSocketCallback() + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 gethostbyname(uint8 * pcHostName); + +@param [in] pcHostName + NULL terminated string containing the domain name for the remote host. + Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + +@see + registerSocketCallback + +@warning + Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + a negative return value indicates only locally-detected errors + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint8 gethostbyname(uint8 *pcHostName); + +/** @} */ +/** @defgroup sslEnableCertExpirationCheckFn sslEnableCertExpirationCheck + * @ingroup SocketAPI + * Configure the behavior of the SSL Library for Certificate Expiry Validation. + */ +/**@{*/ +/*! +@fn \ +NMI_API sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting); + +@param [in] enuValidationSetting + See @ref tenuSslCertExpSettings for details. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) for successful operation and negative error code otherwise. + +@sa tenuSslCertExpSettings +*/ +NMI_API sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting); + +/** @} */ + +/** @defgroup SetSocketOptionFn setsockopt + * @ingroup SocketAPI + *The setsockopt() function shall set the option specified by the option_name + * argument, at the protocol level specified by the level argument, to the value + * pointed to by the option_value argument for the socket specified by the socket argument. + * + *

Possible protocol level values supported are @ref SOL_SOCKET and @ref SOL_SSL_SOCKET. + * Possible options when the protocol level is @ref SOL_SOCKET :

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
@ref SO_SET_UDP_SEND_CALLBACKEnable/Disable callback messages for sendto(). + * Since UDP is unreliable by default the user maybe interested (or not) in + * receiving a message of @ref SOCKET_MSG_SENDTO for each call of sendto(). + * Enabled if option value equals @ref TRUE, disabled otherwise.
@ref IP_ADD_MEMBERSHIPValid for UDP sockets. This option is used to receive frames sent to + * a multicast group. option_value shall be a pointer to Unsigned 32-bit + * integer containing the multicast IPv4 address.
@ref IP_DROP_MEMBERSHIPValid for UDP sockets. This option is used to stop receiving frames + * sent to a multicast group. option_value shall be a pointer to Unsigned + * 32-bit integer containing the multicast IPv4 address.
+ *

Possible options when the protcol leve  is @ref SOL_SSL_SOCKET

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
+ * @ref SO_SSL_BYPASS_X509_VERIFAllow an opened SSL socket to bypass the X509 + * certificate verification process. It is highly recommended NOT to use + * this socket option in production software applications. The option is + * supported for debugging and testing purposes. The option value should be + * casted to int type and it is handled as a boolean flag.
@ref SO_SSL_SNISet the Server Name Indicator (SNI) for an SSL socket. The SNI is a + * null terminated string containing the server name associated with the + * connection. It must not exceed the size of @ref HOSTNAME_MAX_SIZE.
@ref SO_SSL_ENABLE_SESSION_CACHINGThis option allow the TLS to cache the session information for fast + * TLS session establishment in future connections using the TLS Protocol + * session resume features.
+ */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); + +@param [in] sock + Socket handler. + +@param [in] level + protocol level. See description above. + +@param [in] option_name + option to be set. See description above. + +@param [in] option_value + pointer to user provided value. + +@param [in] option_len + length of the option value in bytes. +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +@sa SOL_SOCKET, SOL_SSL_SOCKET, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP +*/ +NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, const void *option_value, + uint16 u16OptionLen); + +/** @} */ +/** @defgroup GetSocketOptionsFn getsockopt + * @ingroup SocketAPI + * Get socket options retrieves + * This Function isn't implemented yet but this is the form that will be released later. + */ +/**@{*/ +/*! +@fn \ + sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 * pu8OptLen); + +@brief + +@param [in] sock + Socket Identifie. +@param [in] u8Level + The protocol level of the option. +@param [in] u8OptName + The u8OptName argument specifies a single option to get. +@param [out] pvOptValue + The pvOptValue argument contains pointer to a buffer containing the option value. +@param [out] pu8OptLen + Option value buffer length. +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 *pu8OptLen); +/** @} */ + +/**@}*/ +/** @defgroup PingFn m2m_ping_req + * @ingroup SocketAPI + * The function sends ping request to the given IP Address. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); + +@param [in] u32DstIP + Target Destination IP Address for the ping request. It must be represented in Network byte order. + The function nmi_inet_addr could be used to translate the dotted decimal notation IP + to its Network bytes order integer represntative. + +@param [in] u8TTL + IP TTL value for the ping request. If set to ZERO, the dfault value SHALL be used. + +@param [in] fpPingCb + Callback will be called to deliver the ping statistics. + +@see nmi_inet_addr +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); +/**@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/AudioConsole.X/Source/winc1500/socket/source/socket.c b/AudioConsole.X/Source/winc1500/socket/source/socket.c new file mode 100644 index 0000000..4ee5002 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/socket/source/socket.c @@ -0,0 +1,1194 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "bsp/include/nm_bsp.h" +#include "socket/include/socket.h" +#include "driver/source/m2m_hif.h" +#include "socket/source/socket_internal.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_2_RESERVD NBIT2 +#define SSL_FLAGS_3_RESERVD NBIT3 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_NO_TX_COPY NBIT5 +#define SSL_FLAGS_CHECK_SNI NBIT6 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8Dummy; + uint16 u16SessionID; +} tstrCloseCmd; + +/*! + * @brief + */ +typedef struct { + uint8 *pu8UserBuffer; + uint16 u16UserBufferSize; + uint16 u16SessionID; + uint16 u16DataOffset; + uint8 bIsUsed; + uint8 u8SSLFlags; + uint8 bIsRecvPending; +} tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile sint8 gsockerrno; +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint8 gu8OpCode; +volatile uint16 gu16BufferSize; +volatile uint16 gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8 gbSocketInit = 0; +volatile tpfPingCb gfpPingCb; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the NMC1500 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8 u8SocketMsg, uint32 u32StartAddress, + uint16 u16ReadCount) +{ + if ((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) + && (gastrSockets[sock].bIsUsed == 1)) { + uint32 u32Address = u32StartAddress; + uint16 u16Read; + sint16 s16Diff; + uint8 u8SetRxDone; + + pstrRecv->u16RemainingSize = u16ReadCount; + do { + u8SetRxDone = 1; + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if (s16Diff > 0) { + u8SetRxDone = 0; + u16Read = gastrSockets[sock].u16UserBufferSize; + } + + if (hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, u8SetRxDone) == M2M_SUCCESS) { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8SocketMsg, pstrRecv); + + u16ReadCount -= u16Read; + u32Address += u16Read; + + if ((!gastrSockets[sock].bIsUsed) && (u16ReadCount)) { + M2M_DBG("Application Closed Socket While Rx Is not Complete\n"); + if (hif_receive(0, NULL, 0, 1) == M2M_SUCCESS) + M2M_DBG("hif_receive Success\n"); + else + M2M_DBG("hif_receive Fail\n"); + break; + } + } else { + M2M_INFO("(ERRR)Current <%d>\n", u16ReadCount); + break; + } + } while (u16ReadCount != 0); + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +static void m2m_ip_cb(uint8 u8OpCode, uint16 u16BufferSize, uint32 u32Address) +{ + if ((u8OpCode == SOCKET_CMD_BIND) || (u8OpCode == SOCKET_CMD_SSL_BIND)) { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if (hif_receive(u32Address, (uint8 *)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) { + strBind.status = strBindReply.s8Status; + if (gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock, SOCKET_MSG_BIND, &strBind); + } + } else if (u8OpCode == SOCKET_CMD_LISTEN) { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if (hif_receive(u32Address, (uint8 *)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) { + strListen.status = strListenReply.s8Status; + if (gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock, SOCKET_MSG_LISTEN, &strListen); + } + } else if (u8OpCode == SOCKET_CMD_ACCEPT) { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if (hif_receive(u32Address, (uint8 *)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) { + if (strAcceptReply.sConnectedSock >= 0) { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags + = gastrSockets[strAcceptReply.sListenSock].u8SSLFlags; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + gastrSockets[strAcceptReply.sConnectedSock].u16DataOffset + = strAcceptReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if (gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n", strAcceptReply.sConnectedSock, gu16SessionID); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if (gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } else if ((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT)) { + tstrConnectReply strConnectReply; + tstrSocketConnectMsg strConnMsg; + if (hif_receive(u32Address, (uint8 *)&strConnectReply, sizeof(tstrConnectReply), 0) == M2M_SUCCESS) { + strConnMsg.sock = strConnectReply.sock; + strConnMsg.s8Error = strConnectReply.s8Error; + if (strConnectReply.s8Error == SOCK_ERR_NO_ERROR) { + gastrSockets[strConnectReply.sock].u16DataOffset + = strConnectReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + } + if (gpfAppSocketCb) + gpfAppSocketCb(strConnectReply.sock, SOCKET_MSG_CONNECT, &strConnMsg); + } + } else if (u8OpCode == SOCKET_CMD_DNS_RESOLVE) { + tstrDnsReply strDnsReply; + if (hif_receive(u32Address, (uint8 *)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) { + if (gpfAppResolveCb) + gpfAppResolveCb((uint8 *)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } else if ((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) + || (u8OpCode == SOCKET_CMD_SSL_RECV)) { + SOCKET sock; + sint16 s16RecvStatus; + tstrRecvReply strRecvReply; + uint16 u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8 u8CallbackMsgID = SOCKET_MSG_RECV; + uint16 u16DataOffset; + + if (u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if (hif_receive(u32Address, (uint8 *)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) { + uint16 u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n", u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if (u16SessionID == gastrSockets[sock].u16SessionID) { + if ((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. If the buffer is smaller than the received data, + the data is passed to the application in chunks according to its buffer size. + */ + u16ReadSize = (uint16)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } else { + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &strRecvMsg); + } + } else { + M2M_DBG("Discard recv callback %d %d \r\n", u16SessionID, gastrSockets[sock].u16SessionID); + if (u16ReadSize < u16BufferSize) { + if (hif_receive(0, NULL, 0, 1) == M2M_SUCCESS) + M2M_DBG("hif_receive Success\n"); + else + M2M_DBG("hif_receive Fail\n"); + } + } + } + } else if ((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) { + SOCKET sock; + sint16 s16Rcvd; + tstrSendReply strReply; + uint8 u8CallbackMsgID = SOCKET_MSG_SEND; + + if (u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if (hif_receive(u32Address, (uint8 *)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) { + uint16 u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n", u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if (u16SessionID == gastrSockets[sock].u16SessionID) { + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &s16Rcvd); + } else { + M2M_DBG("Discard send callback %d %d \r\n", u16SessionID, gastrSockets[sock].u16SessionID); + } + } + } else if (u8OpCode == SOCKET_CMD_PING) { + tstrPingReply strPingReply; + if (hif_receive(u32Address, (uint8 *)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) { + gfpPingCb = (void (*)(uint32, uint32, uint8))strPingReply.u32CmdPrivate; + if (gfpPingCb != NULL) { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); + } + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void socketInit(void) +{ + if (gbSocketInit == 0) { + m2m_memset((uint8 *)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, m2m_ip_cb); + gbSocketInit = 1; + gu16SessionID = 0; + } +} +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. + +Author + Samer Sarhan + +Version + 1.0 + +Date + 27 Feb 2015 +*********************************************************************/ +void socketDeinit(void) +{ + m2m_memset((uint8 *)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. + +Author + Ahmed Ezzat + +Versio + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags) +{ + SOCKET sock = -1; + uint8 u8SockID; + uint8 u8Count; + volatile tstrSocket * pstrSock; + static volatile uint8 u8NextTcpSock = 0; + static volatile uint8 u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if (u16Domain == AF_INET) { + if (u8Type == SOCK_STREAM) { + for (u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count++) { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if (!pstrSock->bIsUsed) { + sock = (SOCKET)u8SockID; + break; + } + } + } else if (u8Type == SOCK_DGRAM) { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for (u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count++) { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if (!pstrSock->bIsUsed) { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + break; + } + } + } + + if (sock >= 0) { + m2m_memset((uint8 *)pstrSock, 0, sizeof(tstrSocket)); + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if (gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n", sock, gu16SessionID); + + if (u8Flags & SOCKET_FLAGS_SSL) { + tstrSSLSocketCreateCmd strSSLCreate; + strSSLCreate.sslSock = sock; + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE | SSL_FLAGS_NO_TX_COPY; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8 *)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + } + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((pstrAddr != NULL) && (sock >= 0) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) { + tstrBindCmd strBind; + uint8 u8CMD = SOCKET_CMD_BIND; + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8CMD = SOCKET_CMD_SSL_BIND; + } + + /* Build the bind request. */ + strBind.sock = sock; + m2m_memcpy((uint8 *)&strBind.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(u8CMD, (uint8 *)&strBind, sizeof(tstrBindCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 listen(SOCKET sock, uint8 backlog) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8 *)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((sock >= 0) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) { + tstrConnectCmd strConnect; + uint8 u8Cmd = SOCKET_CMD_CONNECT; + if ((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + m2m_memcpy((uint8 *)&strConnect.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) + && (gastrSockets[sock].bIsUsed == 1)) { + uint16 u16DataOffset; + tstrSendCmd strSend; + uint8 u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if (sock >= TCP_SOCK_MAX) { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd | M2M_REQ_DATA_PKT, + (uint8 *)&strSend, + sizeof(tstrSendCmd), + pvSendBuffer, + u16SendLength, + u16DataOffset); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, + uint8 u8AddrLen) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) + && (gastrSockets[sock].bIsUsed == 1)) { + if (gastrSockets[sock].bIsUsed) { + tstrSendCmd strSendTo; + + m2m_memset((uint8 *)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if (pstrDestAddr != NULL) { + struct sockaddr_in *pstrAddr; + pstrAddr = (void *)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO | M2M_REQ_DATA_PKT, + (uint8 *)&strSendTo, + sizeof(tstrSendCmd), + pvSendBuffer, + u16SendLength, + UDP_TX_PACKET_OFFSET); + + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8 *)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if (!gastrSockets[sock].bIsRecvPending) { + tstrRecvCmd strRecv; + uint8 u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if (u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + close + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 close(SOCKET sock) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + M2M_INFO("Sock to delete <%d>\n", sock); + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + uint8 u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + gastrSockets[sock].bIsUsed = 0; + gastrSockets[sock].u16SessionID = 0; + + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strclose, sizeof(tstrCloseCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + m2m_memset((uint8 *)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_NO_ERROR; + if ((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) { + if (gastrSockets[sock].bIsUsed) { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8 *)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if (!gastrSockets[sock].bIsRecvPending) { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if (u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8 *)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } else { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + nmi_inet_addr + +Description + +Return + Unsigned 32-bit integer representing the IP address in Network + byte order. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +uint32 nmi_inet_addr(char *pcIpAddr) +{ + uint8 tmp; + uint32 u32IP = 0; + uint8 au8IP[4]; + uint8 c; + uint8 i, j; + + tmp = 0; + + for (i = 0; i < 4; ++i) { + j = 0; + do { + c = *pcIpAddr; + ++j; + if (j > 4) { + return 0; + } + if (c == '.' || c == 0) { + au8IP[i] = tmp; + tmp = 0; + } else if (c >= '0' && c <= '9') { + tmp = (tmp * 10) + (c - '0'); + } else { + return 0; + } + ++pcIpAddr; + } while (c != '.' && c != 0); + } + m2m_memcpy((uint8 *)&u32IP, au8IP, 4); + return u32IP; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 gethostbyname(uint8 *pcHostName) +{ + sint8 s8Err = SOCK_ERR_INVALID_ARG; + uint8 u8HostNameSize = (uint8)m2m_strlen(pcHostName); + if (u8HostNameSize <= HOSTNAME_MAX_SIZE) { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE, (uint8 *)pcHostName, u8HostNameSize + 1, NULL, 0, 0); + } + return s8Err; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +static sint8 sslSetSockOpt(SOCKET sock, uint8 u8Opt, const void *pvOptVal, uint16 u16OptLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if (sock < TCP_SOCK_MAX) { + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + if (u8Opt == SO_SSL_BYPASS_X509_VERIF) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_BYPASS_X509; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_BYPASS_X509; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_ENABLE_SESSION_CACHING) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CACHE_SESSION; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CACHE_SESSION; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_ENABLE_SNI_VALIDATION) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CHECK_SNI; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CHECK_SNI; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_SNI) { + if (u16OptLen < HOSTNAME_MAX_SIZE) { + uint8 * pu8SNI = (uint8 *)pvOptVal; + tstrSSLSetSockOptCmd strCmd; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + m2m_memcpy(strCmd.au8OptVal, pu8SNI, HOSTNAME_MAX_SIZE); + + if (SOCKET_REQUEST( + SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8 *)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0) + == M2M_ERR_MEM_ALLOC) { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8 *)&strCmd, + sizeof(tstrSSLSetSockOptCmd), + 0, + 0, + 0); + } + s8Ret = SOCK_ERR_NO_ERROR; + } else { + M2M_ERR("SNI Exceeds Max Length\n"); + } + } else { + M2M_ERR("Unknown SSL Socket Option %d\n", u8Opt); + } + } else { + M2M_ERR("Not SSL Socket\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +sint8 setsockopt(SOCKET sock, uint8 u8Level, uint8 option_name, const void *option_value, uint16 u16OptionLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((sock >= 0) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) { + if (u8Level == SOL_SSL_SOCKET) { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } else { + uint8 u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option = option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32 *)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 24 August 2014 +*********************************************************************/ +sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 *pu8OptLen) +{ + /* TBD */ + return M2M_SUCCESS; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2015 +*********************************************************************/ +sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if ((u32DstIP != 0) && (fpPingCb != NULL)) { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = (uint32)fpPingCb; + strPingCmd.u8TTL = u8TTL; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8 *)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} +/********************************************************************* +Function + sslEnableCertExpirationCheck + +Description + Enable/Disable TLS Certificate Expiration Check. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + +*********************************************************************/ +sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting) +{ + tstrSslCertExpSettings strSettings; + strSettings.u32CertExpValidationOpt = (uint32)enuValidationSetting; + return SOCKET_REQUEST(SOCKET_CMD_SSL_EXP_CHECK, (uint8 *)&strSettings, sizeof(tstrSslCertExpSettings), NULL, 0, 0); +} diff --git a/AudioConsole.X/Source/winc1500/socket/source/socket_internal.h b/AudioConsole.X/Source/winc1500/socket/source/socket_internal.h new file mode 100644 index 0000000..f74c162 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/socket/source/socket_internal.h @@ -0,0 +1,66 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#ifndef __SOCKET_INTERNAL_H__ +#define __SOCKET_INTERNAL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket/include/socket.h" +#include "socket/include/m2m_socket_host_if.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8 u8SocketMsg, uint32 u32StartAddress, + uint16 u16ReadCount); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash.h b/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..f0bcfbe --- /dev/null +++ b/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash.h @@ -0,0 +1,225 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/** \defgroup SPIFLASH Spi Flash + * @file spi_flash.h + * @brief This file describe SPI flash APIs, how to use it and limitations with each one. + * @section Example + * This example illustrates a complete guide of how to use these APIs. + * @code{.c} + #include "spi_flash.h" + + #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + + int main() + { + uint8 au8FlashContent[FLASH_SECTOR_SZ] = {0}; + uint32 u32FlashTotalSize = 0; + uint32 u32FlashOffset = 0; + + ret = m2m_wifi_download_mode(); + if(M2M_SUCCESS != ret) + { + printf("Unable to enter download mode\r\n"); + } + else + { + u32FlashTotalSize = spi_flash_get_size(); + } + + while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + { + ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to read SPI sector\r\n"); + break; + } + memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + + ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to erase SPI sector\r\n"); + break; + } + + ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to write SPI sector\r\n"); + break; + } + u32FlashOffset += FLASH_SECTOR_SZ; + } + + if(M2M_SUCCESS == ret) + { + printf("Successful operations\r\n"); + } + else + { + printf("Failed operations\r\n"); + } + + while(1); + return M2M_SUCCESS; + } + * @endcode + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +/** + * @fn spi_flash_enable + * @brief Enable spi flash operations + * @version 1.0 + */ +sint8 spi_flash_enable(uint8 enable); +/** \defgroup SPIFLASHAPI Function + * @ingroup SPIFLASH + */ + +/** @defgroup SPiFlashGetFn spi_flash_get_size + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn uint32 spi_flash_get_size(void); + * @brief Returns with \ref uint32 value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32 spi_flash_get_size(void); +/**@}*/ + +/** @defgroup SPiFlashRead spi_flash_read + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_read(uint8 *, uint32, uint32); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will fill in with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus + * using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz); +/**@}*/ + +/** @defgroup SPiFlashWrite spi_flash_write + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_write(uint8 *, uint32, uint32); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the required to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and compare it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus + using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase it first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_write(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Sz); +/**@}*/ + +/** @defgroup SPiFlashErase spi_flash_erase + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_erase(uint32, uint32); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Size of SPI flash required to be erased. + * @note It is blocking function \n +* @warning +* - Address (offset) plus size of data must not exceed flash size.\n +* - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus +using + * @ref m2m_wifi_download_mode + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz); +/**@}*/ +#endif //__SPI_FLASH_H__ diff --git a/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash_map.h b/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..ce3ed21 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/spi_flash/include/spi_flash_map.h @@ -0,0 +1,243 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2016-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/** + * @file spi_flash_map.h + * @brief This module contains spi flash CONTENT + * @author M.S.M + * @date 17 SEPT 2013 + * @version 1.0 + */ +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +#define FLASH_MAP_VER_0 (0) +#define FLASH_MAP_VER_1 (1) +#define FLASH_MAP_VER_2 (2) +#define FLASH_MAP_VER_3 (3) + +#define FLASH_MAP_VERSION FLASH_MAP_VER_3 + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! location :xxxK + * "S:xxxK" -means-> Size is :xxxK + */ + +/* + * Boot Firmware: which used to select which firmware to run + * + */ +#define M2M_BOOT_FIRMWARE_STARTING_ADDR (FLASH_START_ADDR) +#define M2M_BOOT_FIRMWARE_FLASH_SZ (FLASH_SECTOR_SZ) + +/* + * Control Section: which used by Boot firmware + * + */ +#define M2M_CONTROL_FLASH_OFFSET (M2M_BOOT_FIRMWARE_STARTING_ADDR + M2M_BOOT_FIRMWARE_FLASH_SZ) +#define M2M_CONTROL_FLASH_BKP_OFFSET (M2M_CONTROL_FLASH_OFFSET + FLASH_SECTOR_SZ) +#define M2M_CONTROL_FLASH_SEC_SZ (FLASH_SECTOR_SZ) +#define M2M_CONTROL_FLASH_TOTAL_SZ (FLASH_SECTOR_SZ * 2) + +/* + * LUT for PLL and TX Gain settings: + * + */ +#define M2M_PLL_FLASH_OFFSET (M2M_CONTROL_FLASH_OFFSET + M2M_CONTROL_FLASH_TOTAL_SZ) +#define M2M_PLL_FLASH_SZ (1024 * 1) +#define M2M_GAIN_FLASH_OFFSET (M2M_PLL_FLASH_OFFSET + M2M_PLL_FLASH_SZ) +#define M2M_GAIN_FLASH_SZ (M2M_CONFIG_SECT_TOTAL_SZ - M2M_PLL_FLASH_SZ) +#define M2M_CONFIG_SECT_TOTAL_SZ (FLASH_SECTOR_SZ) + +/* + * Certificate: + * + */ +#define M2M_TLS_ROOTCER_FLASH_OFFSET (M2M_PLL_FLASH_OFFSET + M2M_CONFIG_SECT_TOTAL_SZ) +#define M2M_TLS_ROOTCER_FLASH_SIZE (FLASH_SECTOR_SZ * 1) + +/* + * Scratch: + * + */ +#define M2M_TLS_FLASH_SESSION_CACHE_OFFSET (M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET + M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define M2M_TLS_FLASH_SESSION_CACHE_SIZE (FLASH_SECTOR_SZ * 1) + +/* + * reserved section + * + */ +#define M2M_TLS_SERVER_FLASH_OFFSET (M2M_TLS_ROOTCER_FLASH_OFFSET + M2M_TLS_ROOTCER_FLASH_SIZE) +#define M2M_TLS_SERVER_FLASH_SIZE (FLASH_SECTOR_SZ * 2) + +/* + * HTTP Files + * + */ +#define M2M_HTTP_MEM_FLASH_OFFSET (M2M_RESERVED_FLASH_OFFSET + M2M_RESERVED_FLASH_SZ) +#define M2M_HTTP_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 2) +/* + * Saved Connection Parameters: + * + */ +#define M2M_CACHED_CONNS_FLASH_OFFSET (M2M_HTTP_MEM_FLASH_OFFSET + M2M_HTTP_MEM_FLASH_SZ) +#define M2M_CACHED_CONNS_FLASH_SZ (FLASH_SECTOR_SZ * 1) + +/* + * + * Common section size + */ + +#define M2M_COMMON_DATA_SEC \ + (M2M_BOOT_FIRMWARE_FLASH_SZ + M2M_CONTROL_FLASH_TOTAL_SZ + M2M_CONFIG_SECT_TOTAL_SZ \ + + M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE + M2M_TLS_FLASH_SESSION_CACHE_SIZE + M2M_HTTP_MEM_FLASH_SZ \ + + M2M_CACHED_CONNS_FLASH_SZ + M2M_RESERVED_FLASH_SZ) +/* + * + * OTA image1 Offset + */ + +#define M2M_OTA_IMAGE1_OFFSET (M2M_CACHED_CONNS_FLASH_OFFSET + M2M_CACHED_CONNS_FLASH_SZ) +/* + * Firmware Offset + * + */ +#if (defined _FIRMWARE_) || (defined OTA_GEN) +#define M2M_FIRMWARE_FLASH_OFFSET (0UL) +#else +#if (defined DOWNLOAD_ROLLBACK) +#define M2M_FIRMWARE_FLASH_OFFSET (M2M_OTA_IMAGE2_OFFSET) +#else +#define M2M_FIRMWARE_FLASH_OFFSET (M2M_OTA_IMAGE1_OFFSET) +#endif +#endif +/* + * + * Firmware + */ +#define M2M_FIRMWARE_FLASH_SZ (236 * 1024UL) +/** + * + * OTA image Size + */ +#define OTA_IMAGE_SIZE (M2M_FIRMWARE_FLASH_SZ) +/** + * + * Flash Total size + */ +#define FLASH_IMAGE1_CONTENT_SZ (M2M_COMMON_DATA_SEC + OTA_IMAGE_SIZE) + +/** + * + * OTA image 2 offset + */ +#define M2M_OTA_IMAGE2_OFFSET (FLASH_IMAGE1_CONTENT_SZ) + +/* + * App(Cortus App 4M): App. which runs over firmware + * + */ +#define M2M_APP_4M_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 16) +#define M2M_APP_4M_MEM_FLASH_OFFSET (FLASH_4M_TOTAL_SZ - M2M_APP_4M_MEM_FLASH_SZ) +#define M2M_APP_8M_MEM_FLASH_OFFSET (M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) +#define M2M_APP_8M_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 32) +#define M2M_APP_OTA_MEM_FLASH_OFFSET (M2M_APP_8M_MEM_FLASH_OFFSET + M2M_APP_8M_MEM_FLASH_SZ) + +/* Check if total size of content + * don't exceed total size of memory allowed + **/ +#if (M2M_COMMON_DATA_SEC + (OTA_IMAGE_SIZE * 2) > FLASH_4M_TOTAL_SZ) +#error "Excced 4M Flash Size" +#endif /* (FLASH_CONTENT_SZ > FLASH_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/AudioConsole.X/Source/winc1500/spi_flash/source/spi_flash.c b/AudioConsole.X/Source/winc1500/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..992cfe1 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/spi_flash/source/spi_flash.c @@ -0,0 +1,740 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#ifdef PROFILING +#include "windows.h" +#endif +#include "spi_flash/include/spi_flash.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +//#define DISABLE_UNSED_FLASH_FUNCTIONS + +#define FLASH_BLOCK_SIZE (32UL * 1024) +/*!> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_sector_erase + * @brief Erase sector (4KB) + * @param[IN] u32FlashAdr + * Any memory address within the sector + * @return Status of execution + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_sector_erase(uint32 u32FlashAdr) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_write_enable + * @brief Send write enable command to SPI flash + * @return Status of execution + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_write_enable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_write_disable + * @brief Send write disable command to SPI flash + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_write_disable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_page_program + * @brief Write data (less than page size) from cortus memory to SPI flash + * @param[IN] u32MemAdr + * Cortus data address. It must be set to its AHB access address + * @param[IN] u32FlashAdr + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_page_program(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1 << 7) | ((u32Sz & 0xfffff) << 8)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_read_internal + * @brief Read from data from SPI flash + * @param[OUT] pu8Buf + * Pointer to data buffer + * @param[IN] u32Addr + * Address to read from at the SPI flash + * @param[IN] u32Sz + * Data size + * @note Data size must be < 64KB (limitation imposed by the bus wrapper) + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_read_internal(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if (M2M_SUCCESS != ret) + goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** + * @fn spi_flash_pp + * @brief Program data of size less than a page (256 bytes) at the SPI flash + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] pu8Buf + * Pointer to data buffer + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_pp(uint32 u32Offset, uint8 *pu8Buf, uint16 u16Sz) +{ + sint8 ret = M2M_SUCCESS; + uint8 tmp; + spi_flash_write_enable(); + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + ret += spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz); + ret += spi_flash_read_status_reg(&tmp); + do { + if (ret != M2M_SUCCESS) + goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } while (tmp & 0x01); + ret += spi_flash_write_disable(); +ERR: + return ret; +} + +/** + * @fn spi_flash_rdid + * @brief Read SPI Flash ID + * @return SPI FLash ID + * @author M.S.M + * @version 1.0 + */ +static uint32 spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32 reg = 0; + uint32 cnt = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if (M2M_SUCCESS != ret) + break; + if (++cnt > 500) { + ret = M2M_ERR_INIT; + break; + } + } while (reg != 1); + reg = (M2M_SUCCESS == ret) ? (nm_read_reg(DUMMY_REGISTER)) : (0); + M2M_PRINT("Flash ID %x \n", (unsigned int)reg); + return reg; +} + +/** + * @fn spi_flash_unlock + * @brief Unlock SPI Flash + * @author M.S.M + * @version 1.0 + */ +#if 0 +static void spi_flash_unlock(void) +{ + uint8 tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif +static void spi_flash_enter_low_power_mode(void) +{ + volatile unsigned long tmp; + unsigned char * cmd = (unsigned char *)&tmp; + unsigned int count = 0; + + cmd[0] = 0xb9; + + nm_write_reg(SPI_FLASH_DATA_CNT, 0); + nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + while (nm_read_reg(SPI_FLASH_TR_DONE) != 1) //JFM ajouté compteur... + { + if(count++ >= 5000) + return; + } +} + +static void spi_flash_leave_low_power_mode(void) +{ + volatile unsigned long tmp; + unsigned char * cmd = (unsigned char *)&tmp; + + cmd[0] = 0xab; + + nm_write_reg(SPI_FLASH_DATA_CNT, 0); + nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + while (nm_read_reg(SPI_FLASH_TR_DONE) != 1) + ; +} +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ +/** + * @fn spi_flash_enable + * @brief Enable spi flash operations + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_enable(uint8 enable) +{ + sint8 s8Ret = M2M_SUCCESS; + if (REV(nmi_get_chipid()) >= REV_3A0) { + uint32 u32Val; + + /* Enable pinmux to SPI flash. */ + s8Ret = nm_read_reg_with_ret(0x1410, &u32Val); + if (s8Ret != M2M_SUCCESS) { + goto ERR1; + } + /* GPIO15/16/17/18 */ + u32Val &= ~((0x7777ul) << 12); + u32Val |= ((0x1111ul) << 12); + nm_write_reg(0x1410, u32Val); + if (enable) { + spi_flash_leave_low_power_mode(); + } else { + spi_flash_enter_low_power_mode(); + } + /* Disable pinmux to SPI flash to minimize leakage. */ + u32Val &= ~((0x7777ul) << 12); + u32Val |= ((0x0010ul) << 12); + nm_write_reg(0x1410, u32Val); + } +ERR1: + return s8Ret; +} +/** + * @fn spi_flash_read + * @brief Read from data from SPI flash + * @param[OUT] pu8Buf + * Pointer to data buffer + * @param[IN] u32offset + * Address to read from at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @note Data size is limited by the SPI flash size only + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32offset, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + if (u32Sz > FLASH_BLOCK_SIZE) { + do { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if (M2M_SUCCESS != ret) + goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while (u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** + * @fn spi_flash_write + * @brief Proram SPI flash + * @param[IN] pu8Buf + * Pointer to data buffer + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_write(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Sz) +{ +#ifdef PROFILING + uint32 t1 = 0; + uint32 percent = 0; + uint32 tpercent = 0; +#endif + sint8 ret = M2M_SUCCESS; + uint32 u32wsz; + uint32 u32off; + uint32 u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz / u32Blksz) + ((u32Sz % u32Blksz) > 0); + t1 = GetTickCount(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if (u32Sz <= 0) { + M2M_ERR("Data size = %d", (int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if (u32off) /*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if (spi_flash_pp(u32Offset, pu8Buf, (uint16)BSP_MIN(u32Sz, u32wsz)) != M2M_SUCCESS) { + ret = M2M_ERR_FAIL; + goto ERR; + } + if (u32Sz < u32wsz) + goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while (u32Sz > 0) { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if (spi_flash_pp(u32Offset, pu8Buf, (uint16)u32wsz) != M2M_SUCCESS) { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r", ((percent * 100) / tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r", (GetTickCount() - t1) / 1000.0); +#endif +ERR: + return ret; +} + +/** + * @fn spi_flash_erase + * @brief Erase from data from SPI flash + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @note Data size is limited by the SPI flash size only + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz) +{ + uint32 i = 0; + sint8 ret = M2M_SUCCESS; + uint8 tmp = 0; +#ifdef PROFILING + uint32 t; + t = GetTickCount(); +#endif + M2M_PRINT("\r\n>Start erasing...\r\n"); + for (i = u32Offset; i < (u32Sz + u32Offset); i += (16 * FLASH_PAGE_SZ)) { + ret += spi_flash_write_enable(); + ret += spi_flash_read_status_reg(&tmp); + ret += spi_flash_sector_erase(i + 10); + ret += spi_flash_read_status_reg(&tmp); + do { + if (ret != M2M_SUCCESS) + goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } while (tmp & 0x01); + } + M2M_PRINT("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (GetTickCount() - t) / 1000.0); +#endif +ERR: + return ret; +} + +/** + * @fn spi_flash_get_size + * @brief Get size of SPI Flash + * @return Size of Flash + * @author M.S.M + * @version 1.0 + */ +uint32 spi_flash_get_size(void) +{ + uint32 u32FlashId = 0, u32FlashPwr = 0; + static uint32 gu32InernalFlashSize = 0; + + if (!gu32InernalFlashSize) { + u32FlashId = spi_flash_rdid(); // spi_flash_probe(); + if (u32FlashId != 0xffffffff) { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId >> 16) & 0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InernalFlashSize = 1 << u32FlashPwr; + M2M_INFO("Flash Size %lu Mb\n", gu32InernalFlashSize); + } else { + M2M_ERR("Cann't Detect Flash size\n"); + } + } + + return gu32InernalFlashSize; +} diff --git a/AudioConsole.X/Source/winc1500/winc_init.c b/AudioConsole.X/Source/winc1500/winc_init.c new file mode 100644 index 0000000..344dcd9 --- /dev/null +++ b/AudioConsole.X/Source/winc1500/winc_init.c @@ -0,0 +1,38 @@ +/* + * Code generated from Atmel Start. + * + * This file will be overwritten when reconfiguring your Atmel Start project. + * Please copy examples or other code you want to keep to a separate file or main.c + * to avoid loosing it when reconfiguring. + */ + +//#include "atmel_start.h" +#include "string.h" +#include "winc_init.h" +#include "driver/source/nmasic.h" +#include + +//extern void set_winc_spi_descriptor(struct spi_m_sync_descriptor *spi_inst); + +/* + * \brief Initialize Wifi library + */ +void wifi_init(tstrWifiInitParam *params) +{ + tstrWifiInitParam param; + int8_t ret; + + //set_winc_spi_descriptor(&WINC_SPI); //JFM + + /* Initialize the BSP. */ + nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = params->pfAppWifiCb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + while (1) { + } + } +} diff --git a/AudioConsole.X/Source/winc1500/winc_init.h b/AudioConsole.X/Source/winc1500/winc_init.h new file mode 100644 index 0000000..dce666c --- /dev/null +++ b/AudioConsole.X/Source/winc1500/winc_init.h @@ -0,0 +1,14 @@ +#ifndef WINC1500_MAIN_H +#define WINC1500_MAIN_H + +//#include "atmel_start.h" + +#include "driver/include/m2m_wifi.h" + +//#define CONF_WINC_PIN_CHIP_SELECT WINC_PIN_CHIP_SELECT +//#define CONF_WINC_PIN_CHIP_ENABLE WINC_PIN_CHIP_ENABLE +//#define CONF_WINC_PIN_RESET WINC_PIN_RESET + +void wifi_init(tstrWifiInitParam *params); + +#endif diff --git a/AudioConsole.X/Source/winc1500_config.h b/AudioConsole.X/Source/winc1500_config.h new file mode 100644 index 0000000..1439fe2 --- /dev/null +++ b/AudioConsole.X/Source/winc1500_config.h @@ -0,0 +1,28 @@ +/* Auto-generated config file winc1500_config.h */ +#ifndef WINC1500_CONFIG_H +#define WINC1500_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +#include +// Basic configuration + +// Enable Wi-Fi Management +// Enable Wi-Fi Management +// wifi_mgmt_enable +#ifndef CONF_MGMT +#define CONF_MGMT 0 +#endif +#ifndef CONF_WINC_USE_SPI +#define CONF_WINC_USE_SPI 1 +#endif +#ifndef CONF_PERIPH +#define CONF_PERIPH 1 +#endif +#define CONF_WINC_DEBUG (1) +#define CONF_WINC_PRINTF printf +// + +// <<< end of configuration section >>> + +#endif // WINC1500_CONFIG_H diff --git a/AudioConsole.X/Source/winc3400/WINC3400_BLE_APIs.chm b/AudioConsole.X/Source/winc3400/WINC3400_BLE_APIs.chm new file mode 100644 index 0000000..00af218 Binary files /dev/null and b/AudioConsole.X/Source/winc3400/WINC3400_BLE_APIs.chm differ diff --git a/AudioConsole.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm b/AudioConsole.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm new file mode 100644 index 0000000..1cc90f7 Binary files /dev/null and b/AudioConsole.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm differ diff --git a/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp.h b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp.h new file mode 100644 index 0000000..1da8018 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp.h @@ -0,0 +1,248 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 BSP APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup nm_bsp BSP + */ + +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define NMI_API +/*!< +* Attribute used to define memory section to map Functions in host memory. +*/ + +#include "winc3400_config.h" +#define CONST const + +#ifndef NULL +#define NULL ((void*)0) +#endif +/*!< +* Void Pointer to '0' in case of NULL is not defined. +*/ + + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) +/*!< +* Computes the minimum of \b x and \b y. +*/ + + //@} + +/**@defgroup DataT Enumeration/Typedefs + * @ingroup nm_bsp + * @{ + */ + + /*! +* Used for code portability. +*/ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); + + /*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + + /*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + + /*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; + + + /*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + + /*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + + /*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; + //@} + +#ifndef CORTUS_APP + + +#ifdef __cplusplus +extern "C"{ +#endif + +/** \defgroup BSPAPI Functions + * @ingroup nm_bsp + * @{ + */ + +/*! + * @fn sint8 nm_bsp_init(void); + * Initialization for BSP such as Reset and Chip Enable Pins for WINC, delays, register ISR, enable/disable IRQ for WINC, ...etc. You must use this function in the head of your application to + * enable WINC and Host Driver to communicate with each other. + * @note Implementation of this function is host dependent. + * @warning Omission will lead to unavailability of host communication.\n + * + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_init(void); +/*! + * @fn sint8 nm_bsp_deinit(void); + * De-initialization for BSP (\e Board \e Support \e Package) + * @pre Initialize \ref nm_bsp_init first + * @note Implementation of this function is host dependent. + * @warning Omission may lead to unknown behavior in case of soft reset.\n + * @see nm_bsp_init + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_deinit(void); + /*! + * @fn void nm_bsp_reset(void); + * Resetting NMC1500 SoC by setting CHIP_EN and RESET_N signals low, then after specific delay the function will put CHIP_EN high then RESET_N high, + * for the timing between signals please review the WINC data-sheet + * @pre Initialize \ref nm_bsp_init first + * @note Implementation of this function is host dependent and called by HIF layer. + * @see nm_bsp_init + * @return None + + */ +void nm_bsp_reset(void); +/*! + * @fn void nm_bsp_sleep(uint32); + * Sleep in units of milliseconds.\n + * This function is used by HIF Layer as required in various situations. + * @brief + * @param [in] u32TimeMsec + * Time unit in milliseconds + * @pre Initialize \ref nm_bsp_init first + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds.\n + * @note Implementation of this function is host dependent. + * @see nm_bsp_init + * @return None + */ +void nm_bsp_sleep(uint32 u32TimeMsec); +/*! + * @fn void nm_bsp_register_isr(tpfNmBspIsr); + * Register ISR (Interrupt Service Routine) in the initialization of HIF (Host Interface) Layer. + * When the interrupt trigger the BSP layer should call the pfisr function once inside the interrupt. + * @param [in] pfIsr + * Pointer to ISR handler in HIF + * @warning Make sure that ISR for IRQ pin for WINC is disabled by default in your implementation. + * @note Implementation of this function is host dependent and called by HIF layer. + * @see tpfNmBspIsr + * @return None + + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr); +/*! + * @fn void nm_bsp_interrupt_ctrl(uint8); + * Synchronous enable/disable interrupts function + * @brief Enable/Disable interrupts + * @param [in] u8Enable + * '0' disable interrupts. '1' enable interrupts + * @see tpfNmBspIsr + * @note Implementation of this function is host dependent and called by HIF layer. + * @return None + + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable); + /**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif + +/** + * @addtogroup BSPDefine + * @{ + */ + +#ifdef _NM_BSP_BIG_END +/*! Switch endianness of 32bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_32(x) \ +((((x) & 0x000000FF) << 24) + \ +(((x) & 0x0000FF00) << 8) + \ +(((x) & 0x00FF0000) >> 8) + \ +(((x) & 0xFF000000) >> 24)) +/*! Switch endianness of 16bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_16(x) \ +((((x) & 0x00FF) << 8) + \ +(((x) & 0xFF00) >> 8)) +#else +/*! Retain endianness of 32bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_32(x) (x) +/*! Retain endianness of 16bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_16(x) (x) +#endif + +/**@} + */ + +#endif /*_NM_BSP_H_*/ diff --git a/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_internal.h b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_internal.h new file mode 100644 index 0000000..3fac66d --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_internal.h @@ -0,0 +1,100 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 BSP APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_INTERNAL_H_ +#define _NM_BSP_INTERNAL_H_ + + + +#ifdef WIN32 +#include "nm_bsp_win32.h" +#endif + +#ifdef __K20D50M__ +#include "nm_bsp_k20d50m.h" +#endif + +#ifdef __MSP430FR5739__ +#include "bsp_msp430fr5739.h" +#endif + +#ifdef _FREESCALE_MCF51CN128_ +#include "bsp/include/nm_bsp_mcf51cn128.h" +#endif + +#ifdef __MCF964548__ +#include "bsp/include/nm_bsp_mc96f4548.h" +#endif + +#ifdef __APP_APS3_CORTUS__ +#include "nm_bsp_aps3_cortus.h" +#endif + +#if (defined __SAMD21J18A__) || (defined __SAMD21G18A__) +#include "bsp/include/nm_bsp_samd21.h" +#endif + +#if (defined __SAM4S16C__) || (defined __SAM4SD32C__) +#include "bsp/include/nm_bsp_sam4s.h" +#endif + +#ifdef __SAMG55J19__ +#include "bsp/include/nm_bsp_samg55.h" +#endif + +#ifdef __SAMG53N19__ +#include "bsp/include/nm_bsp_samg53.h" +#endif + +#if (defined __SAME70Q21__) || (defined __SAME70Q21B__) +#include "bsp/include/nm_bsp_same70.h" +#endif + +#ifdef CORTUS_APP +#include "crt_iface.h" +#endif + +#ifdef NRF51 +#include "nm_bsp_nrf51822.h" +#endif + +#ifdef _ARDUINO_UNO_ +#include "bsp/include/nm_bsp_arduino_uno.h" +#endif + + +#endif //_NM_BSP_INTERNAL_H_ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21.h b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21.h new file mode 100644 index 0000000..070ff1a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21.h @@ -0,0 +1,46 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BSP_SAMD21_H_ +#define _NM_BSP_SAMD21_H_ + +#include "conf_winc.h" +#include "math.h" + +#define NM_EDGE_INTERRUPT (1) + +#define NM_DEBUG CONF_WINC_DEBUG +#define NM_BSP_PRINTF CONF_WINC_PRINTF + +#endif /* _NM_BSP_SAMD21_H_ */ diff --git a/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h new file mode 100644 index 0000000..a173746 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h @@ -0,0 +1,204 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BSP_SAMD21_APP_H_ +#define _NM_BSP_SAMD21_APP_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include + + +#define M2M_PRINTX(x) nm_bsp_uart_send((const uint8_t *)x,sizeof(x)) +/** +*Extern global variables +* +*/ +extern uint32 gu32Jiffies20ms; +extern uint32 gu32Jiffies1ms; +#ifdef __cplusplus +extern "C"{ +#endif + +/* +* +*/ +#define SW1 NBIT0 +#define SW2 NBIT1 +/**/ + +#define NM_BSP_PERM_FIRMWARE_SIZE (1024UL*256) /* Permenant storage size available for the firmware */ + +#define TICK_RES 20 /*!< Tick resolution in milliseconds*/ +#define TICK_RES_SLEEP 20 /*it must be equal tick or higher*/ + +#define NM_BSP_TIME_MSEC (gu32Jiffies20ms * TICK_RES) + + +/** +* +*Callback functions +*/ +typedef void (*tpfNmBspBtnPress)(uint8 u8Btn, uint8 u8Type); +typedef void (*tpfNmBspTimerCb)(void); + +/** +* @fn nm_bsp_init +* @brief Initialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_init(void); + +/* +* @fn nm_bsp_app_configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_app_configurable_timer_init(uint32_t u32Period); + +/** +* @fn nm_bsp_deinit +* @brief De-iInitialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_deinit(void); + +/** +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_uart_send(const uint8 *pu8Buf, uint16 u16Sz); +/** +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_btn_init(tpfNmBspBtnPress pfBtnCb); +#ifdef _STATIC_PS_ +/** +* @fn nm_bsp_register_wake_isr +* @brief REGISTER wake up timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_register_wake_isr(tpfNmBspIsr pfIsr,uint32 u32MsPeriod); +/** +* @fn nm_bsp_wake_ctrl +* @brief control wake up timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_wake_ctrl(uint8 en); + +#endif +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +/** +* @fn nm_bsp_enable_mcu_ps +* @brief Start POWER SAVE FOR MCU +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_enable_mcu_ps(void); +#endif + +/** +* @fn nm_bsp_start_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_start_timer(tpfNmBspTimerCb pfCb, uint32 u32Period); + +/* +* @fn nm_bsp_start_1ms_timer +* @brief Start 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_1ms_timer(tpfNmBspTimerCb pfCb); + +/* +* @fn nm_bsp_start_configurable_timer +* @brief Start configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_configurable_timer(tpfNmBspTimerCb pfCb); + +/** +* @fn nm_bsp_stop_timer +* @brief Stop 20ms timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_stop_timer(void); + +/* +* @fn nm_bsp_stop_1ms_timer +* @brief Stop 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_1ms_timer(void); + +/* +* @fn nm_bsp_stop_configurable_timer +* @brief Stop configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_configurable_timer(void); + + +#ifdef __cplusplus +} +#endif +#endif /* _NM_BSP_SAMD21_H_ */ diff --git a/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp.c b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp.c new file mode 100644 index 0000000..7261bc1 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp.c @@ -0,0 +1,181 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "timer.h" +#include "define.h" +#include "BoardCfg.h" +//#include + +//#include "atmel_start.h" +//#include "winc_init.h" + +#ifndef CONF_WINC_EXT_INT_PIN +#define CONF_WINC_EXT_INT_PIN 0 +#endif + +static tpfNmBspIsr gpfIsr = NULL; + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + if (gpfIsr) + { + gpfIsr(); + } + + IFS0bits.INT0IF = 0; +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; +// +//JFM Not necessary, we know our timer base is 1ms... + +// /* Make sure a 1ms Systick is configured. */ +// if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { +// delay_init(SysTick); +// } + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_bsp_reset(void) +{ +// GP_DEBUG_1_PIN = 1; + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(100); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(150); + WIFI_CHP_RST_PIN = 1; + + // GP_DEBUG_1_PIN = 0; + + +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, false); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, false); +// nm_bsp_sleep(1); +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, true); +// nm_bsp_sleep(5); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + Sleep(u32TimeMsec); + + + +// while (u32TimeMsec--) { +// delay_ms(1); +// } +} + +/** + * \internal Get the PIO hardware instance + * + * \param[in] pin The PIO pin + * + * \return The instance of PIO hardware + */ + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + gpfIsr = pfIsr; +// +// ext_irq_register(CONF_WINC_EXT_INT_PIN, chip_isr); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if(u8Enable == 0) + { + IEC0bits.INT0IE = 0; + } + else + { + IEC0bits.INT0IE = 1; + } +// _ext_irq_enable(CONF_WINC_EXT_INT_PIN, u8Enable); +} diff --git a/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21.c b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21.c new file mode 100644 index 0000000..0691ef2 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21.c @@ -0,0 +1,185 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "bsp/include/nm_bsp_internal.h" +#include "common/include/nm_common.h" +#include "extint.h" +#include "port.h" +#ifdef TICK_IF +#include "tick_if.h" +#else +#include "delay.h" +#endif +#include "system_interrupt.h" +#include "conf_winc.h" + +static tpfNmBspIsr gpfIsr; + +static void chip_isr(void) +{ + if (gpfIsr) { + gpfIsr(); + } +} + +/* + * @fn init_chip_pins + * @brief Initialize reset, chip enable and wake pin + */ +static void init_chip_pins(void) +{ + struct port_config pin_conf; + + port_get_config_defaults(&pin_conf); + + /* Configure control pins as output. */ + pin_conf.direction = PORT_PIN_DIR_OUTPUT; + port_pin_set_config(CONF_WINC_PIN_RESET, &pin_conf); + port_pin_set_config(CONF_WINC_PIN_CHIP_ENABLE, &pin_conf); + port_pin_set_config(CONF_WINC_PIN_WAKE, &pin_conf); + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, false); + port_pin_set_output_level(CONF_WINC_PIN_RESET, false); +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; + + /* Initialize chip IOs. */ + init_chip_pins(); +#ifndef CONF_WINC_USE_SPI + nm_bsp_reset(); +#endif + + /* Make sure a 1ms Systick is configured. */ + if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { + delay_init(); + } + + system_interrupt_enable_global(); + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + struct port_config pin_conf; + port_get_config_defaults(&pin_conf); + /* Configure control pins as input no pull up. */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_NONE; + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, false); + port_pin_set_output_level(CONF_WINC_PIN_RESET, false); + port_pin_set_config(CONF_WINC_SPI_INT_PIN, &pin_conf); + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high. + * CHIP_EN and RESET_N are actually already set low by nm_bsp_init or nm_bsp_deinit(). + * Here we just need to set them high. + */ +void nm_bsp_reset(void) +{ + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, true); + nm_bsp_sleep(5); + port_pin_set_output_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + while (u32TimeMsec--) { + delay_ms(1); + } +} + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + struct extint_chan_conf config_extint_chan; + + gpfIsr = pfIsr; + + extint_chan_get_config_defaults(&config_extint_chan); + config_extint_chan.gpio_pin = CONF_WINC_SPI_INT_PIN; + config_extint_chan.gpio_pin_mux = CONF_WINC_SPI_INT_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(CONF_WINC_SPI_INT_EIC, &config_extint_chan); + extint_register_callback(chip_isr, CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + extint_chan_enable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if (u8Enable) { + extint_chan_enable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + } else { + extint_chan_disable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + } +} diff --git a/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c new file mode 100644 index 0000000..c681949 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c @@ -0,0 +1,522 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp_samd21_app.h" +#include "common/include/nm_common.h" + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) + + +#define SW1_PIN +#define SW1_MUX +#define SW1_LINE + +#ifdef WING_BOARD_WITH_LEDS_BUTTON +#define SW2_LINE 3 +#define SW2_PIN PIN_PB03 +#define SW2_MUX MUX_PB03A_EIC_EXTINT3 +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + +/* + --------------------------------- + ------ Module Pin Settings ------ + --------------------------------- +*/ + +#define LONG_PRESS_TIME (1500/TICK_RES) // ~2 sec +#define DEBOUNCE_TIME (40/TICK_RES) // ~50ms + +/* +* Structure +* +*/ +typedef struct +{ + tpfNmBspTimerCb pfCb; + uint32 u32Timeout; + uint32 u32Period; +} tstrTimer; + + +typedef struct +{ + tstrTimer strTimer; + uint8 u8Enabled; +} tstrWakeTimer; +/** +* +* Global variables +*/ +uint32 gu32Jiffies1ms; +uint32 gu32Jiffies20ms; + + +static uint16 gu16Btn1Cnt, gu16Btn2Cnt; +static tpfNmBspBtnPress gpfBtns; +static uint8 gu8BtnIfg; +static tstrTimer gstrTimer20ms, gstrTimer1ms, gstrConfigurableTimer; +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +static tstrWakeTimer gstrWakeTimer; +#endif + +struct tcc_module tcc_instance; +struct tcc_module configurable_tcc; +/** +* +* Static functions +*/ +static void btn_poll(void) +{ + bool btn_inactive; + if (gu8BtnIfg & SW1) { + if (gu16Btn1Cnt <= LONG_PRESS_TIME) { + gu16Btn1Cnt++; + } + if (gu16Btn1Cnt == LONG_PRESS_TIME) { + gpfBtns(SW1, 1); /* long press callback */ + } + btn_inactive = (port_pin_get_input_level(BUTTON_0_PIN) == BUTTON_0_INACTIVE); + if ((gu16Btn1Cnt >= DEBOUNCE_TIME) && (gu16Btn1Cnt < LONG_PRESS_TIME) + && btn_inactive) { + gpfBtns(SW1, 0); /* Short press callback */ + } + if (btn_inactive) + { + gu8BtnIfg &= ~SW1; + gu16Btn1Cnt = 0; + extint_chan_enable_callback(BUTTON_0_EIC_LINE, EXTINT_CALLBACK_TYPE_DETECT); + } + } + +#ifdef WING_BOARD_WITH_LEDS_BUTTON + if (gu8BtnIfg & SW2) { + if (gu16Btn2Cnt <= LONG_PRESS_TIME) { + gu16Btn2Cnt++; + } + if (gu16Btn2Cnt == LONG_PRESS_TIME) { + gpfBtns(SW2, 1); /* long press callback */ + } + btn_inactive = (port_pin_get_input_level(SW2_PIN) == BUTTON_0_INACTIVE); + if ((gu16Btn2Cnt >= DEBOUNCE_TIME) && (gu16Btn2Cnt < LONG_PRESS_TIME) + && btn_inactive) { + gpfBtns(SW2, 0); /* Short press callback */ + } + if (btn_inactive) + { + gu8BtnIfg &= ~SW2; + gu16Btn2Cnt = 0; + extint_chan_enable_callback(SW2_LINE, EXTINT_CALLBACK_TYPE_DETECT); + } + } +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ +} + +static void _tcc_callback_to_change_duty_cycle(struct tcc_module *const module_inst) +{ + gu32Jiffies1ms++; + if(gstrTimer1ms.pfCb) + gstrTimer1ms.pfCb(); + + if(gu32Jiffies1ms%20 == 0) + { +#ifdef _STATIC_PS_ + if((gstrWakeTimer.strTimer.pfCb)&&(gstrWakeTimer.u8Enabled)) + { + gu32Jiffies20ms+=(TICK_RES_SLEEP/TICK_RES); + } +else +#endif + { + gu32Jiffies20ms++; + } +#ifdef _STATIC_PS_ + if(gstrWakeTimer.strTimer.pfCb) + { + if(NM_BSP_TIME_MSEC >= gstrWakeTimer.strTimer.u32Timeout) + { + nm_bsp_wake_ctrl(0); + gstrWakeTimer.strTimer.pfCb(); + gstrWakeTimer.strTimer.u32Timeout = NM_BSP_TIME_MSEC + gstrWakeTimer.strTimer.u32Period; + } + } +#endif + if(gstrTimer20ms.pfCb) + { + if(NM_BSP_TIME_MSEC >= gstrTimer20ms.u32Timeout) + { + gstrTimer20ms.pfCb(); + gstrTimer20ms.u32Timeout = NM_BSP_TIME_MSEC + gstrTimer20ms.u32Period; + } + } + + btn_poll(); + } +} + +/* +* @fn _tcc_configurable_timer_callback +* @brief Configurable Timer Callback +* @date 08 October 2015 +* @version 1.0 +*/ + +static void _tcc_configurable_timer_callback(struct tcc_module *const module_inst) +{ + if(gstrConfigurableTimer.pfCb) + gstrConfigurableTimer.pfCb(); +} + + +static void timer0_init(void) +{ + + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, TCC0); + + //! [setup_change_config] + config_tcc.counter.period = 750; + config_tcc.counter.reload_action = TCC_RELOAD_ACTION_GCLK; + config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV64; + tcc_init(&tcc_instance, TCC0, &config_tcc); + tcc_enable(&tcc_instance); + + //! [setup_register_callback] + tcc_register_callback( + &tcc_instance, + _tcc_callback_to_change_duty_cycle, + TCC_CALLBACK_CHANNEL_0); + + tcc_enable_callback(&tcc_instance, + TCC_CALLBACK_CHANNEL_0); +} + +/* +* @fn configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ + +static void configurable_timer_init(uint32_t u32Period) +{ + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, TCC1); + M2M_DBG("Timer period: %lu\r\n", u32Period); + + //! [setup_change_config] + config_tcc.counter.period = u32Period; + tcc_init(&configurable_tcc, TCC1, &config_tcc); + tcc_enable(&configurable_tcc); + + //! [setup_register_callback] + tcc_register_callback( + &configurable_tcc, + _tcc_configurable_timer_callback, + TCC_CALLBACK_OVERFLOW); +} + + +static void btn_isr(void) +{ + gu8BtnIfg |= SW1; + extint_chan_disable_callback(BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +} +#ifdef WING_BOARD_WITH_LEDS_BUTTON +static void btn2_isr(void) +{ + + gu8BtnIfg |= SW2; + extint_chan_disable_callback(SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +} +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + +/* +* @fn nm_bsp_init +* @brief Initialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M.S.M +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_init(void) +{ + gstrTimer20ms.pfCb = NULL; + gstrTimer20ms.u32Timeout = 0; + gstrTimer20ms.u32Period = 0; + +#ifdef _STATIC_PS_ + gstrWakeTimer.strTimer.pfCb = NULL; + gstrWakeTimer.strTimer.u32Timeout = 0; + gstrWakeTimer.strTimer.u32Period = ((uint32)-1); + gstrWakeTimer.u8Enabled = 0; +#endif + + gstrTimer1ms.pfCb = NULL; + gstrTimer1ms.u32Timeout = 0; + gstrTimer1ms.u32Period = 0; + + gstrConfigurableTimer.pfCb = NULL; + gstrConfigurableTimer.u32Timeout = 0; + gstrConfigurableTimer.u32Period = 0; + + timer0_init(); + + return M2M_SUCCESS; +} + +/* +* @fn nm_bsp_app_configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_app_configurable_timer_init(uint32_t u32Period) +{ + configurable_timer_init(u32Period); +} + +/** +* @fn nm_bsp_deinit +* @brief De-iInitialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_deinit(void) +{ + return M2M_SUCCESS; +} + +/* +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ + +void nm_bsp_btn_init(tpfNmBspBtnPress pfBtnCb) +{ + //struct port_config pin_conf; + struct extint_chan_conf config_extint_chan; + + gpfBtns = pfBtnCb; + gu8BtnIfg = 0; + gu16Btn1Cnt = 0; + gu16Btn2Cnt = 0; + +#ifdef WING_BOARD_WITH_LEDS_BUTTON + port_get_config_defaults(&pin_conf); + + /* Set buttons as inputs */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_UP; + port_pin_set_config(SW2_PIN, &pin_conf); + + + /*Configure SW1*/ + extint_chan_get_config_defaults(&config_extint_chan); + + config_extint_chan.gpio_pin = SW2_PIN; + config_extint_chan.gpio_pin_mux = SW2_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(SW2_LINE, &config_extint_chan); + + extint_register_callback(btn2_isr, + SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + extint_chan_enable_callback(SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + + /*Configure SW2*/ + extint_chan_get_config_defaults(&config_extint_chan); + + config_extint_chan.gpio_pin = BUTTON_0_EIC_PIN; + config_extint_chan.gpio_pin_mux = BUTTON_0_EIC_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(BUTTON_0_EIC_LINE, &config_extint_chan); + + extint_register_callback(btn_isr, + BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + + extint_chan_enable_callback(BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + +} + +/* +* @fn nm_bsp_uart_sendnm_bsp_uart_send +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_uart_send(const uint8 *pu8Buf, uint16 u16Sz) +{ + +} +/** +* @fn nm_bsp_start_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_start_timer(tpfNmBspTimerCb pfCb, uint32 u32Period) +{ + gstrTimer20ms.pfCb = pfCb; + gstrTimer20ms.u32Timeout = u32Period+ NM_BSP_TIME_MSEC; + gstrTimer20ms.u32Period = u32Period; +} + +/* +* @fn nm_bsp_start_1ms_timer +* @brief Start 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_1ms_timer(tpfNmBspTimerCb pfCb) +{ + gstrTimer1ms.pfCb = pfCb; +} + +/* +* @fn nm_bsp_start_configurable_timer +* @brief Start configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_configurable_timer(tpfNmBspTimerCb pfCb) +{ + tcc_enable_callback(&configurable_tcc, TCC_CALLBACK_OVERFLOW); + gstrConfigurableTimer.pfCb = pfCb; +} + +/** +* @fn nm_bsp_stop_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_stop_timer(void) +{ + gstrTimer20ms.pfCb = NULL; +} + +/* +* @fn nm_bsp_stop_1ms_timer +* @brief Stop 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_1ms_timer(void) +{ + gstrTimer1ms.pfCb = NULL; +} + +/* +* @fn nm_bsp_stop_configurable_timer +* @brief Stop configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_configurable_timer(void) +{ + gstrConfigurableTimer.pfCb = NULL; + tcc_disable_callback(&configurable_tcc, TCC_CALLBACK_OVERFLOW); + tcc_disable(&configurable_tcc); +} + +#ifdef _STATIC_PS_ +/** +* @fn nm_bsp_register_wake_isr +* @brief REGISTER wake up timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_register_wake_isr(tpfNmBspIsr pfIsr,uint32 u32MsPeriod) +{ + + gstrWakeTimer.strTimer.pfCb = pfIsr; + gstrWakeTimer.strTimer.u32Timeout = u32MsPeriod + NM_BSP_TIME_MSEC; + gstrWakeTimer.strTimer.u32Period = u32MsPeriod; + gstrWakeTimer.u8Enabled = 0; +} +/** +* @fn nm_bsp_wake_ctrl +* @brief control wake up timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_wake_ctrl(uint8 en) +{ + gstrWakeTimer.u8Enabled = en; + if(en) + { + gstrWakeTimer.strTimer.u32Timeout = gstrWakeTimer.strTimer.u32Period + NM_BSP_TIME_MSEC; + } +} +#endif +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +/** +* @fn nm_bsp_enable_mcu_ps +* @brief Start POWER SAVE FOR MCU +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_enable_mcu_ps(void) +{ + if(!gu8BtnIfg) + { + if(gstrWakeTimer.u8Enabled) + { + + } + } +} +#endif + + diff --git a/AudioConsole.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h b/AudioConsole.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h new file mode 100644 index 0000000..6c680e4 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h @@ -0,0 +1,189 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus wrapper APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BUS_WRAPPER_H_ +#define _NM_BUS_WRAPPER_H_ + +#include "common/include/nm_common.h" + +/** + BUS Type +**/ +#define NM_BUS_TYPE_I2C ((uint8)0) +#define NM_BUS_TYPE_SPI ((uint8)1) +#define NM_BUS_TYPE_UART ((uint8)2) +/** + IOCTL commands +**/ +#define NM_BUS_IOCTL_R ((uint8)0) /*!< Read only ==> I2C/UART. Parameter:tstrNmI2cDefault/tstrNmUartDefault */ +#define NM_BUS_IOCTL_W ((uint8)1) /*!< Write only ==> I2C/UART. Parameter type tstrNmI2cDefault/tstrNmUartDefault*/ +#define NM_BUS_IOCTL_W_SPECIAL ((uint8)2) /*!< Write two buffers within the same transaction + (same start/stop conditions) ==> I2C only. Parameter:tstrNmI2cSpecial */ +#define NM_BUS_IOCTL_RW ((uint8)3) /*!< Read/Write at the same time ==> SPI only. Parameter:tstrNmSpiRw */ + +#define NM_BUS_IOCTL_WR_RESTART ((uint8)4) /*!< Write buffer then made restart condition then read ==> I2C only. parameter:tstrNmI2cSpecial */ +/** +* @struct tstrNmBusCapabilities +* @brief Structure holding bus capabilities information +* @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI +*/ +typedef struct +{ + uint16 u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +/** +* @struct tstrNmI2cDefault +* @brief Structure holding I2C default operation parameters +* @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W +*/ +typedef struct +{ + uint8 u8SlaveAdr; + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmI2cDefault; + +/** +* @struct tstrNmI2cSpecial +* @brief Structure holding I2C special operation parameters +* @sa NM_BUS_IOCTL_W_SPECIAL +*/ +typedef struct +{ + uint8 u8SlaveAdr; + uint8 *pu8Buf1; /*!< pointer to the 1st buffer */ + uint8 *pu8Buf2; /*!< pointer to the 2nd buffer */ + uint16 u16Sz1; /*!< 1st buffer size */ + uint16 u16Sz2; /*!< 2nd buffer size */ +} tstrNmI2cSpecial; + +/** +* @struct tstrNmSpiRw +* @brief Structure holding SPI R/W parameters +* @sa NM_BUS_IOCTL_RW +*/ +typedef struct +{ + uint8 *pu8InBuf; /*!< pointer to input buffer. + Can be set to null and in this case zeros should be sent at MOSI */ + uint8 *pu8OutBuf; /*!< pointer to output buffer. + Can be set to null and in this case data from MISO can be ignored */ + uint16 u16Sz; /*!< Transfere size */ +} tstrNmSpiRw; + + +/** +* @struct tstrNmUartDefault +* @brief Structure holding UART default operation parameters +* @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W +*/ +typedef struct +{ + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmUartDefault; +/*!< Bus capabilities. This structure must be declared at platform specific bus wrapper */ +extern tstrNmBusCapabilities egstrNmBusCapabilities; + + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @param [in] req_com_port +* Used to choose com port assigned to device like edbg +* @param [in] req_serial_number +* Used to choose peripheral, eg if 2 aardvark's are connected to pc. +* Pass 0 to select first/only or if using UART. +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_init(uint8 *req_com_port, uint32 req_serial_number); + +/** +* @fn nm_bus_ioctl +* @brief send/receive from the bus +* @param [in] u8Cmd +* IOCTL command for the operation +* @param [in] pvParameter +* Arbitrary parameter depending on IOCTL +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +* @note For SPI only, it's important to be able to send/receive at the same time +*/ +sint8 nm_bus_ioctl(uint8 u8Cmd, void* pvParameter); + +/** +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_deinit(void); + +/* +* @fn nm_bus_reinit +* @brief re-initialize the bus wrapper +* @param [in] void *config +* re-init configuration data +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_reinit(void *); +/* +* @fn nm_bus_get_chip_type +* @brief get chip type +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +#ifdef CONF_WINC_USE_UART +uint8 nm_bus_get_chip_type(void); +uint8 nm_bus_get_sb_type(void); +#endif + +/* +* @fn spi_rw +* @brief Process SPI Read/Write operation +* @param pu8Mosi TX Data buffer +* @param pu8Miso RX Data buffer +* @param u16Sz Transfer length +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +#ifdef CONF_WINC_USE_SPI +sint8 nm_spi_rw(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz); +#endif + +#ifdef __cplusplus + } + #endif + +#endif /*_NM_BUS_WRAPPER_H_*/ diff --git a/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c b/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c new file mode 100644 index 0000000..a227973 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c @@ -0,0 +1,215 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" +//#include "atmel_start.h" +//#include "winc_init.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = {NM_BUS_MAX_TRX_SZ}; +unsigned char mWifiSPIBaudrate; + + +sint8 nm_spi_rw(uint8 *pu8Mosi, uint8 *pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + + if (!u8SkipMiso) + { + while(u16Sz-- != 0) + { + uint8 tmp; + WIFI_SPI_SS_PIN = 0; + tmp = SPITransaction(0x00,mWifiSPIBaudrate); + WIFI_SPI_SS_PIN = 1; + //tmp = SPITransaction(0xDE); + *pu8Miso++ = tmp; + } + } + if (!u8SkipMosi) + { + while(u16Sz-- != 0) + { + uint8 tmp; + WIFI_SPI_SS_PIN = 0; + tmp = SPITransaction(*pu8Mosi++,mWifiSPIBaudrate); //assign to tmp for debug purposes only. + WIFI_SPI_SS_PIN = 1; + } + } + WIFI_SPI_SS_PIN = 1; + + + /*uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, false); + if (!u8SkipMiso) { + io_read(io, pu8Miso, u16Sz); + } + if (!u8SkipMosi) { + io_write(io, pu8Mosi, u16Sz); + } + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, true);*/ + + return M2M_SUCCESS; +} + +/* + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +//sint8 nm_bus_init(void *pvinit) +sint8 nm_bus_init(uint8 *req_com_port, uint32 req_serial_number) +{ + sint8 result = M2M_SUCCESS; + mWifiSPIBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, WIFI_MODULE_SPI_BAUDRATE); + nm_bsp_reset(); + nm_bsp_sleep(1); + return result; +} + + + + //JFM The SPI module has been initialized in InitBoard() + //so the two following lines are not needed. +/* spi_m_sync_get_io_descriptor(spi_instance, &io); + spi_m_sync_enable(spi_instance);/* + + nm_bsp_reset(); + nm_bsp_sleep(1); + + return result; +} + +/* + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param[IN] u8Cmd + * IOCTL command for the operation + * @param[IN] pvParameter + * Arbitrary parameter depenging on IOCTL + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter) +{ + sint8 s8Ret = 0; + switch (u8Cmd) + { + case NM_BUS_IOCTL_RW: + { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = nm_spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + break; + } + + + default: + { + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + } + return s8Ret; +} + +/* + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + */ +sint8 nm_bus_deinit(void) +{ + sint8 result = 0; + return result; +} +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *config) +{ + return M2M_SUCCESS; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c b/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c new file mode 100644 index 0000000..d2183ab --- /dev/null +++ b/AudioConsole.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus wrapper APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "spi.h" +#include "port.h" +#include "conf_winc.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = +{ + NM_BUS_MAX_TRX_SZ +}; + +#ifdef CONF_WINC_USE_I2C + +struct i2c_master_module i2c_master_instance; +#define SLAVE_ADDRESS 0x60 + +/** Number of times to try to send packet if failed. */ +#define I2C_TIMEOUT 100 + +static sint8 nm_i2c_write(uint8 *b, uint16 sz) +{ + sint8 result = M2M_SUCCESS; + uint16_t timeout = 0; + + struct i2c_master_packet packet = { + .address = SLAVE_ADDRESS, + .data_length = sz, + .data = b, + }; + + /* Write buffer to slave until success. */ + while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { + /* Increment timeout counter and check if timed out. */ + if (timeout++ == I2C_TIMEOUT) { + break; + } + } + + return result; +} + +static sint8 nm_i2c_read(uint8 *rb, uint16 sz) +{ + uint16_t timeout = 0; + sint8 result = M2M_SUCCESS; + struct i2c_master_packet packet = { + .address = SLAVE_ADDRESS, + .data_length = sz, + .data = rb, + }; + + /* Write buffer to slave until success. */ + while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { + /* Increment timeout counter and check if timed out. */ + if (timeout++ == I2C_TIMEOUT) { + break; + } + } + + return result; +} + +static sint8 nm_i2c_write_special(uint8 *wb1, uint16 sz1, uint8 *wb2, uint16 sz2) +{ + static uint8 tmp[NM_BUS_MAX_TRX_SZ]; + m2m_memcpy(tmp, wb1, sz1); + m2m_memcpy(&tmp[sz1], wb2, sz2); + return nm_i2c_write(tmp, sz1+sz2); +} +#endif + +#ifdef CONF_WINC_USE_SPI + +struct spi_module master; +struct spi_slave_inst slave_inst; + +#ifdef CONF_WINC_SPI_DMA +static volatile bool spi_dma_tx_done; +static volatile bool spi_dma_rx_done; +struct dma_resource dma_res_tx; +struct dma_resource dma_res_rx; +COMPILER_ALIGNED(32) DmacDescriptor dma_dsc_tx; +COMPILER_ALIGNED(32) DmacDescriptor dma_dsc_rx; +struct dma_descriptor_config dma_cfg_rx; +struct dma_descriptor_config dma_cfg_tx; + +static void spi_dma_tx_completion_callback(const struct dma_resource* const resource) +{ + spi_dma_tx_done = true; +} +static void spi_dma_rx_completion_callback(const struct dma_resource* const resource) +{ + spi_dma_rx_done = true; +} + +static inline sint8 spi_rw_dma(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ + uint32_t dummy_buf = 0; + spi_dma_tx_done = false; + spi_dma_rx_done = false; + + dma_cfg_tx.block_transfer_count = u16Sz; + dma_cfg_rx.block_transfer_count = u16Sz; + + if (pu8Mosi) { + dma_cfg_tx.src_increment_enable = true; + dma_cfg_tx.source_address = (uint32_t)pu8Mosi + u16Sz; + } else { + dma_cfg_tx.src_increment_enable = false; + dma_cfg_tx.source_address = &dummy_buf; + } + dma_descriptor_create(&dma_dsc_tx, &dma_cfg_tx); + + if (pu8Miso) { + dma_cfg_rx.dst_increment_enable = true; + dma_cfg_rx.destination_address = (uint32_t)pu8Miso + u16Sz; + } else { + dma_cfg_rx.dst_increment_enable = false; + dma_cfg_rx.destination_address = &dummy_buf; + } + dma_descriptor_create(&dma_dsc_rx, &dma_cfg_rx); + + spi_select_slave(&master, &slave_inst, true); + dma_start_transfer_job(&dma_res_rx); + dma_start_transfer_job(&dma_res_tx); + while((!spi_dma_tx_done) && (!spi_dma_rx_done)) + ; + spi_select_slave(&master, &slave_inst, false); + + return M2M_SUCCESS; +} +#endif //CONF_WINC_SPI_DMA + +static inline sint8 spi_rw_pio(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + uint16_t txd_data = 0; + uint16_t rxd_data = 0; + + if (!pu8Mosi) { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if(!pu8Miso) { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else { + return M2M_ERR_BUS_FAIL; + } + + spi_select_slave(&master, &slave_inst, true); + + while (u16Sz) { + txd_data = *pu8Mosi; + while (!spi_is_ready_to_write(&master)) + ; + while(spi_write(&master, txd_data) != STATUS_OK) + ; + + /* Read SPI master data register. */ + while (!spi_is_ready_to_read(&master)) + ; + while (spi_read(&master, &rxd_data) != STATUS_OK) + ; + *pu8Miso = rxd_data; + + u16Sz--; + if (!u8SkipMiso) + pu8Miso++; + if (!u8SkipMosi) + pu8Mosi++; + } + + while (!spi_is_write_complete(&master)) + ; + + spi_select_slave(&master, &slave_inst, false); + + return M2M_SUCCESS; +} + +sint8 nm_spi_rw(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ +#ifdef CONF_WINC_SPI_DMA + if (u16Sz >= 8) { + return spi_rw_dma(pu8Mosi, pu8Miso, u16Sz); + } + else +#endif //CONF_WINC_SPI_DMA + { + return spi_rw_pio(pu8Mosi, pu8Miso, u16Sz); + } +} + +#endif + +/* +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_init(uint8 *pvinit, uint32 req_serial_number) +{ + sint8 result = M2M_SUCCESS; + +#ifdef CONF_WINC_USE_I2C + /* Initialize config structure and software module. */ + struct i2c_master_config config_i2c_master; + i2c_master_get_config_defaults(&config_i2c_master); + + /* Change buffer timeout to something longer. */ + config_i2c_master.buffer_timeout = 1000; + + /* Initialize and enable device with config. */ + i2c_master_init(&i2c_master_instance, SERCOM2, &config_i2c_master); + + i2c_master_enable(&i2c_master_instance); + +#elif defined CONF_WINC_USE_SPI + /* Structure for SPI configuration. */ + struct spi_config config; + struct spi_slave_inst_config slave_config; + + /* Select SPI slave CS pin. */ + /* This step will set the CS high */ + spi_slave_inst_get_config_defaults(&slave_config); + slave_config.ss_pin = CONF_WINC_SPI_CS_PIN; + spi_attach_slave(&slave_inst, &slave_config); + + /* Configure the SPI master. */ + spi_get_config_defaults(&config); + config.mux_setting = CONF_WINC_SPI_SERCOM_MUX; + config.pinmux_pad0 = CONF_WINC_SPI_PINMUX_PAD0; + config.pinmux_pad1 = CONF_WINC_SPI_PINMUX_PAD1; + config.pinmux_pad2 = CONF_WINC_SPI_PINMUX_PAD2; + config.pinmux_pad3 = CONF_WINC_SPI_PINMUX_PAD3; + config.master_slave_select_enable = false; + + config.mode_specific.master.baudrate = CONF_WINC_SPI_CLOCK; + if (spi_init(&master, CONF_WINC_SPI_MODULE, &config) != STATUS_OK) { + return M2M_ERR_BUS_FAIL; + } + + /* Enable the SPI master. */ + spi_enable(&master); + +#ifdef CONF_WINC_SPI_DMA + { + struct dma_resource_config dma_config; + spi_dma_tx_done = false; + spi_dma_rx_done = false; + dma_get_config_defaults(&dma_config); + dma_config.peripheral_trigger = CONF_WINC_SPI_DMA_PERIPHERAL_TRIGGER_RX; + dma_config.trigger_action = DMA_TRIGGER_ACTON_BEAT; + dma_allocate(&dma_res_rx, &dma_config); + dma_add_descriptor(&dma_res_rx, &dma_dsc_rx); + dma_register_callback(&dma_res_rx, spi_dma_rx_completion_callback, DMA_CALLBACK_TRANSFER_DONE); + dma_enable_callback(&dma_res_rx, DMA_CALLBACK_TRANSFER_DONE); + + dma_get_config_defaults(&dma_config); + dma_config.peripheral_trigger = CONF_WINC_SPI_DMA_PERIPHERAL_TRIGGER_TX; + dma_config.trigger_action = DMA_TRIGGER_ACTON_BEAT; + dma_allocate(&dma_res_tx, &dma_config); + dma_add_descriptor(&dma_res_tx, &dma_dsc_tx); + dma_register_callback(&dma_res_tx, spi_dma_tx_completion_callback, DMA_CALLBACK_TRANSFER_DONE); + dma_enable_callback(&dma_res_tx, DMA_CALLBACK_TRANSFER_DONE); + + dma_descriptor_get_config_defaults(&dma_cfg_rx); + dma_descriptor_get_config_defaults(&dma_cfg_tx); + dma_cfg_tx.destination_address = (uint32_t)(&master.hw->SPI.DATA.reg); + dma_cfg_tx.dst_increment_enable = false; + dma_cfg_rx.source_address = (uint32_t)(&master.hw->SPI.DATA.reg); + dma_cfg_rx.src_increment_enable = false; + } +#endif + + nm_bsp_reset(); + nm_bsp_sleep(1); +#endif + return result; +} + +/* +* @fn nm_bus_ioctl +* @brief send/receive from the bus +* @param[IN] u8Cmd +* IOCTL command for the operation +* @param[IN] pvParameter +* Arbitrary parameter depenging on IOCTL +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @note For SPI only, it's important to be able to send/receive at the same time +*/ +sint8 nm_bus_ioctl(uint8 u8Cmd, void* pvParameter) +{ + sint8 s8Ret = 0; + switch(u8Cmd) + { +#ifdef CONF_WINC_USE_I2C + case NM_BUS_IOCTL_R: { + tstrNmI2cDefault *pstrParam = (tstrNmI2cDefault *)pvParameter; + s8Ret = nm_i2c_read(pstrParam->pu8Buf, pstrParam->u16Sz); + } + break; + case NM_BUS_IOCTL_W: { + tstrNmI2cDefault *pstrParam = (tstrNmI2cDefault *)pvParameter; + s8Ret = nm_i2c_write(pstrParam->pu8Buf, pstrParam->u16Sz); + } + break; + case NM_BUS_IOCTL_W_SPECIAL: { + tstrNmI2cSpecial *pstrParam = (tstrNmI2cSpecial *)pvParameter; + s8Ret = nm_i2c_write_special(pstrParam->pu8Buf1, pstrParam->u16Sz1, pstrParam->pu8Buf2, pstrParam->u16Sz2); + } + break; +#elif defined CONF_WINC_USE_SPI + case NM_BUS_IOCTL_RW: { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = nm_spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + } + break; +#endif + default: + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + + return s8Ret; +} + +/* +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +*/ +sint8 nm_bus_deinit(void) +{ + sint8 result = M2M_SUCCESS; + struct port_config pin_conf; + + port_get_config_defaults(&pin_conf); + /* Configure control pins as input no pull up. */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_NONE; + +#ifdef CONF_WINC_USE_I2C + i2c_master_disable(&i2c_master_instance); + port_pin_set_config(CONF_WINC_I2C_SCL, &pin_conf); + port_pin_set_config(CONF_WINC_I2C_SDA, &pin_conf); +#endif /* CONF_WINC_USE_I2C */ +#ifdef CONF_WINC_USE_SPI + nm_bsp_deinit(); + + spi_disable(&master); + port_pin_set_config(CONF_WINC_SPI_MOSI, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_MISO, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_SCK, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_SS, &pin_conf); + + //port_pin_set_output_level(CONF_WINC_SPI_MOSI, false); + //port_pin_set_output_level(CONF_WINC_SPI_MISO, false); + //port_pin_set_output_level(CONF_WINC_SPI_SCK, false); + //port_pin_set_output_level(CONF_WINC_SPI_SS, false); +#endif /* CONF_WINC_USE_SPI */ + return result; +} +/* +* @fn nm_bus_reinit +* @brief re-initialize the bus wrapper +* @param [in] void *config +* re-init configuration data +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_reinit(void* config) +{ + return M2M_SUCCESS; +} + diff --git a/AudioConsole.X/Source/winc3400/common/include/nm_common.h b/AudioConsole.X/Source/winc3400/common/include/nm_common.h new file mode 100644 index 0000000..619957a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/common/include/nm_common.h @@ -0,0 +1,242 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup COMMON COMMON +*/ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_debug.h" + +/**@defgroup COMMONDEF Defines + * @ingroup COMMON + */ +/**@{*/ +#define M2M_TIME_OUT_DELAY 10000 + +/*states*/ +#define M2M_SUCCESS ((sint8)0) +#define M2M_ERR_SEND ((sint8)-1) +#define M2M_ERR_RCV ((sint8)-2) +#define M2M_ERR_MEM_ALLOC ((sint8)-3) +#define M2M_ERR_TIME_OUT ((sint8)-4) +#define M2M_ERR_INIT ((sint8)-5) +#define M2M_ERR_BUS_FAIL ((sint8)-6) +#define M2M_NOT_YET ((sint8)-7) +#define M2M_ERR_FIRMWARE ((sint8)-8) +#define M2M_SPI_FAIL ((sint8)-9) +#define M2M_ERR_FIRMWARE_bURN ((sint8)-10) +#define M2M_ACK ((sint8)-11) +#define M2M_ERR_FAIL ((sint8)-12) +#define M2M_ERR_FW_VER_MISMATCH ((sint8)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((sint8)-14) +/* +Invalid argument +*/ +#define M2M_ERR_INVALID_ARG ((sint8)-15) + +/*i2c MAASTER ERR*/ +#define I2C_ERR_LARGE_ADDRESS 0xE1UL /*!< the address exceed the max addressing mode in i2c flash*/ +#define I2C_ERR_TX_ABRT 0xE2UL /*!< NO ACK from slave*/ +#define I2C_ERR_OVER_SIZE 0xE3UL /**/ +#define ERR_PREFIX_NMIS 0xE4UL /*!< wrong first four byte in flash NMIS*/ +#define ERR_FIRMEWARE_EXCEED_SIZE 0xE5UL /*!< Total size of firmware exceed the max size 256k*/ +/**/ +#define PROGRAM_START 0x26961735UL +#define BOOT_SUCCESS 0x10add09eUL +#define BOOT_START 0x12345678UL + + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +/*! Maximum of two values */ +#define M2M_MAX(A,B) ((A) > (B) ? (A) : (B)) +/*! Choose one of three values */ +#define M2M_SEL(x,m1,m2,m3) ((x>1)?((x>2)?(m3):(m2)):(m1)) +/*! Align to next multiple of 4 */ +#define WORD_ALIGN(val) (((val) & 0x03) ? ((val) + 4 - ((val) & 0x03)) : (val)) + + + +#define DATA_PKT_OFFSET 4 + +#ifndef BIG_ENDIAN +/*! Most significant byte of 32bit word (LE) */ +#define BYTE_0(word) ((uint8)(((word) >> 0 ) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (LE) */ +#define BYTE_1(word) ((uint8)(((word) >> 8 ) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (LE) */ +#define BYTE_2(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (LE) */ +#define BYTE_3(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#else +/*! Most significant byte of 32bit word (BE) */ +#define BYTE_0(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (BE) */ +#define BYTE_1(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (BE) */ +#define BYTE_2(word) ((uint8)(((word) >> 8 ) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (BE) */ +#define BYTE_3(word) ((uint8)(((word) >> 0 ) & 0x000000FFUL)) +#endif +/**@}*/ + +#ifdef __cplusplus + extern "C" { + #endif +/**@defgroup COMMONAPI Functions + * @ingroup COMMON + */ +/**@{*/ + +/*! + * @fn void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz); + * @brief Copy specified number of bytes from source buffer to destination buffer + * @param [in] sz + * number of data bytes to copy + * @param [in] pSrc + * source buffer + * @param [out] pDst + * destination buffer +* @return None + */ +NMI_API void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz); +/*! + * @fn void m2m_memset(uint8* pBuf,uint8 val,uint32 sz); + * @brief Set specified number of data bytes in specified data buffer to specified value + * @param [in] sz + * number of data bytes (in specified data buffer whose values are to be set to the specified value) + * @param [in] val + * the specified value (to which data bytes in data buffer will be set) + * @param [out] pBuf + * the specified data buffer (whose data bytes will be set to the specified value) + * @return None + */ +NMI_API void m2m_memset(uint8* pBuf,uint8 val,uint32 sz); +/*! + * @fn uint16 m2m_strlen(uint8 * pcStr); + * @brief Returns the string length of a null terminated string buffer + * @param [in] pcStr + * null terminated string buffer + * @return length of the string in the specified string buffer + */ +NMI_API uint16 m2m_strlen(uint8 * pcStr); +/*! + * @fn sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size); + * @brief Compare specified number of data bytes in pu8Buff1 and pu8Buff2 and decide if they all match. + * @param [in] u32Size + * number of data bytes to compare + * @param [in] pu8Buff1 + * one of two data buffers for the comparison + * @param [in] pu8Buff2 + * one of two data buffers for the comparison + * @return zero if matched, one if not matched + */ +NMI_API sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size); +/*! + * @fn uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); + * @brief Compare specified number of data bytes in string buffers pcS1 and pcS2 + * @param [in] u16Len + * Number of data bytes to compare + * @param [in] pcS1 + * first of two string buffers for the comparison + * @param [in] pcS2 + * second of two string buffers for the comparison + * @return 0 if matched, -1 if the first non-matching byte in pcS1 is smaller than that in pcS2, +1 if it is bigger + */ +NMI_API uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); +/*! + * @fn uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr); + * @brief Find the occurrence of pcStr string in pcIn string + * @param [in] pcStr + * one of two string buffers + * @param [in] pcIn + * one of two string buffers + * @return If pcStr string is part of pcIn string return a valid pointer to the start of pcStr within pcIn. If not a NULL Pointer is returned + */ +NMI_API uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr); +/*! + * @fn uint8 m2m_checksum(uint8* buf, int sz); + * @brief calculates checksum for the specified number of data bytes in specified data buffer + * @param [in] sz + * number of data bytes used in the checksum calculation + * @param [in] buf + * the specified data buffer (whose data bytes will be used to calculate the checksum) + * @return the calculated checksum + */ +NMI_API uint8 m2m_checksum(uint8* buf, int sz); + +/*! + * @fn void (*at_sb_printf)(const char *_format, ...); + * @brief chooses which function to use in order to output debug + */ +NMI_API void (*at_sb_printf)(const char *_format, ...); +/**@}*/ +#ifdef __cplusplus +} + #endif +#endif /*_NM_COMMON_H_*/ diff --git a/AudioConsole.X/Source/winc3400/common/include/nm_debug.h b/AudioConsole.X/Source/winc3400/common/include/nm_debug.h new file mode 100644 index 0000000..28b14ff --- /dev/null +++ b/AudioConsole.X/Source/winc3400/common/include/nm_debug.h @@ -0,0 +1,108 @@ +/** + * + * \file + * + * \brief This module contains debug APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + +#include "bsp/include/nm_bsp.h" +#include "bsp/include/nm_bsp_internal.h" + +#define M2M_LOG_NONE 0 +#define M2M_LOG_ERROR 1 +#define M2M_LOG_INFO 2 +#define M2M_LOG_REQ 3 +#define M2M_LOG_DBG 4 + + +#define M2M_LOG_LEVEL M2M_LOG_DBG + +/**/ +#if !((defined __MSP430FR5739)||(defined __MCF964548__)) + +#define M2M_ERR(...) +#define M2M_INFO(...) +#define M2M_REQ(...) +#define M2M_DBG(...) + +#if (CONF_WINC_DEBUG == 1) +#define M2M_PRINT(...) do{CONF_WINC_PRINTF(__VA_ARGS__);}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_ERROR) +#undef M2M_ERR +#define M2M_ERR(...) do{CONF_WINC_PRINTF("(APP)(ERR)[%s][%d]",__FUNCTION__,__LINE__); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_INFO) +#undef M2M_INFO +#define M2M_INFO(...) do{CONF_WINC_PRINTF("(APP)(INFO)"); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_REQ) +#undef M2M_REQ +#define M2M_REQ(...) do{CONF_WINC_PRINTF("(APP)(R)"); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_DBG) +#undef M2M_DBG +#define M2M_DBG(...) do{CONF_WINC_PRINTF("(APP)(DBG)[%s][%d]",__FUNCTION__,__LINE__); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#endif +#endif +#endif +#endif +#else +#define M2M_ERR(...) +#define M2M_DBG(...) +#define M2M_REQ(...) +#define M2M_INFO(...) +#define M2M_PRINT(...) +#endif +#else +#if (!defined __MCF964548__)||(!defined __SAMD21J18A__) +static void M2M_ERR(const char *_format, ...) //__attribute__ ((__format__ (M2M_ERR, 1, 2))) +{ +} +static void M2M_DBG(const char *_format, ...) //__attribute__ ((__format__ (M2M_DBG, 1, 2))) +{ +} +static void M2M_REQ(const char *_format, ...) //__attribute__ ((__format__ (M2M_DBG, 1, 2))) +{ +} +static void M2M_INFO(const char *_format, ...) // __attribute__ ((__format__ (M2M_INFO, 1, 2))) +{ + +} +static void M2M_PRINT(const char *_format, ...) // __attribute__ ((__format__ (M2M_INFO, 1, 2))) +{ + +} +static void CONF_WINC_PRINTF(const char *_format, ...) +{ +} +#endif +#endif + +#endif /* _NM_DEBUG_H_ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/common/source/nm_common.c b/AudioConsole.X/Source/winc3400/common/source/nm_common.c new file mode 100644 index 0000000..6c3e99f --- /dev/null +++ b/AudioConsole.X/Source/winc3400/common/source/nm_common.c @@ -0,0 +1,129 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz) +{ + if(sz == 0) return; + do + { + *pDst = *pSrc; + pDst++; + pSrc++; + }while(--sz); +} +uint8 m2m_checksum(uint8* buf, int sz) +{ + uint8 cs = 0; + while(--sz) + { + cs ^= *buf; + buf++; + } + + return cs; +} + +void m2m_memset(uint8* pBuf,uint8 val,uint32 sz) +{ + if(sz == 0) return; + do + { + *pBuf = val; + pBuf++; + }while(--sz); +} + +uint16 m2m_strlen(uint8 * pcStr) +{ + uint16 u16StrLen = 0; + while(*pcStr) + { + u16StrLen ++; + pcStr++; + } + return u16StrLen; +} + +uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len) +{ + for ( ; u16Len > 0; pcS1++, pcS2++, --u16Len) + if (*pcS1 != *pcS2) + return ((*(uint8 *)pcS1 < *(uint8 *)pcS2) ? -1 : +1); + else if (*pcS1 == '\0') + return 0; + return 0; +} + +/* Finds the occurance of pcStr in pcIn. +If pcStr is part of pcIn it returns a valid pointer to the start of pcStr within pcIn. +Otherwise a NULL Pointer is returned. +*/ +uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr) +{ + uint8 u8c; + uint16 u16StrLen; + + u8c = *pcStr++; + if (!u8c) + return (uint8 *) pcIn; // Trivial empty string case + + u16StrLen = m2m_strlen(pcStr); + do { + uint8 u8Sc; + + do { + u8Sc = *pcIn++; + if (!u8Sc) + return (uint8 *) 0; + } while (u8Sc != u8c); + } while (m2m_strncmp(pcIn, pcStr, u16StrLen) != 0); + + return (uint8 *) (pcIn - 1); +} + +sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size) +{ + uint32 i; + sint8 s8Result = 0; + for(i = 0 ; i < u32Size ; i++) + { + if(pu8Buff1[i] != pu8Buff2[i]) + { + s8Result = 1; + break; + } + } + return s8Result; +} diff --git a/AudioConsole.X/Source/winc3400/driver/include/ecc_types.h b/AudioConsole.X/Source/winc3400/driver/include/ecc_types.h new file mode 100644 index 0000000..1e50b71 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/ecc_types.h @@ -0,0 +1,238 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + +#if 0 +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +#endif +/*!< +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve{ + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +}tenuEcNamedCurve; + + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint{ + uint8 X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8 Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16 u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16 u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +}tstrECPoint; + + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam{ + uint32 p[ECC_POINT_MAX_SIZE_WORDS]; + uint32 a[ECC_POINT_MAX_SIZE_WORDS]; + uint32 b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +}tstrECDomainParam; + + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct{ + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +}tstrEllipticCurve; + + +typedef enum{ + ECC_REQ_NONE, + ECC_REQ_CLIENT_ECDH, + ECC_REQ_SERVER_ECDH, + ECC_REQ_GEN_KEY, + ECC_REQ_SIGN_GEN, + ECC_REQ_SIGN_VERIFY +}tenuEccREQ; + + +typedef struct{ + tstrECPoint strPubKey; + uint8 au8Key[ECC_POINT_MAX_SIZE]; +}tstrEcdhReqInfo; + + +typedef struct{ + uint32 u32nSig; +}tstrEcdsaVerifyReqInfo; + + +typedef struct{ + uint16 u16CurveType; + uint16 u16HashSz; +}tstrEcdsaSignReqInfo; + + +typedef struct{ + uint16 u16REQ; + uint16 u16Status; + uint32 u32UserData; + uint32 u32SeqNo; + union{ + tstrEcdhReqInfo strEcdhREQ; + tstrEcdsaSignReqInfo strEcdsaSignREQ; + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + }; +}tstrEccReqInfo; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#if 0 +static tstrEllipticCurve gastrECCSuppList[] = { + { + EC_SECP256R1, + { + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0x27D2604B, 0x3BCE3C3E, 0xCC53B0F6, 0x651D06B0, 0x769886BC, 0xB3EBBD55, 0xAA3A93E7, 0x5AC635D8}, + { + { + 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, 0x63, 0xA4, 0x40, 0xF2, + 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 + }, + { + 0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A, 0x7C, 0x0F, 0x9E, 0x16, + 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5 + }, + 32 + } + } + } +}; +#endif + +/*!< + List of supported Elliptic Curves ordered by security level (most secure curve is at index ZERO). +*/ + + + +#endif /* __ECC_TYPES_H__ */ diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_ate_mode.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_ate_mode.h new file mode 100644 index 0000000..a68e14d --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_ate_mode.h @@ -0,0 +1,580 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ + +#ifndef _M2M_ATE_MODE_H_ +#define _M2M_ATE_MODE_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_ATE_MAX_NUM_OF_RATES (20) +/*!< Maximum number of all rates (b,g and n) + */ +#define M2M_ATE_MAX_FRAME_LENGTH (1024) +/*!< Maximum number of length for each frame + */ +#define M2M_ATE_MIN_FRAME_LENGTH (1) +/*!< Minimum number of length for each frame + */ + + +#define M2M_ATE_SUCCESS (M2M_SUCCESS) +/*!< No Error and operation has been completed successfully. +*/ +#define M2M_ATE_ERR_VALIDATE (M2M_ERR_FAIL) +/*!< Error in parameters passed to functions. + */ +#define M2M_ATE_ERR_TX_ALREADY_RUNNING (-1) +/*!< This means that TX case is already running and RX or even TX can't start without stopping it first. + */ +#define M2M_ATE_ERR_RX_ALREADY_RUNNING (-2) +/*!< This means that RX case is already running and TX or even RX can't start without stopping it first. + */ +#define M2M_ATE_ERR_UNHANDLED_CASE (-3) +/*!< Invalid case. + */ +#define M2M_ATE_RX_DISABLE_DA 0x0 +#define M2M_ATE_RX_ENABLE_DA 0x1 + +#define M2M_ATE_RX_DISABLE_SA 0x0 +#define M2M_ATE_RX_ENABLE_SA 0x1 + +#define M2M_ATE_DISABLE_SELF_MACADDR 0x0 +#define M2M_ATE_SET_SELF_MACADDR 0x1 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! + *@enum tenuM2mAteFwState + *@brief Enumeration used for change ATE firmware state + */ +typedef enum { + M2M_ATE_FW_STATE_STOP = 0x00, + /*!< State to stop ATE firmware + */ + M2M_ATE_FW_STATE_RUN = 0x01, + /*!< State to run ATE firmware + */ +}tenuM2mAteFwState; + +/*! + *@enum tenuM2mAteTxRates + *@brief Used to get value of rate referenced by this index + */ +typedef enum { + M2M_ATE_TX_RATE_1_Mbps_INDEX = 0x00, + M2M_ATE_TX_RATE_2_Mbps_INDEX = 0x01, + M2M_ATE_TX_RATE_55_Mbps_INDEX = 0x02, + M2M_ATE_TX_RATE_11_Mbps_INDEX = 0x03, + /*!< B-Rates + */ + M2M_ATE_TX_RATE_6_Mbps_INDEX = 0x04, + M2M_ATE_TX_RATE_9_Mbps_INDEX = 0x05, + M2M_ATE_TX_RATE_12_Mbps_INDEX = 0x06, + M2M_ATE_TX_RATE_18_Mbps_INDEX = 0x07, + M2M_ATE_TX_RATE_24_Mbps_INDEX = 0x08, + M2M_ATE_TX_RATE_36_Mbps_INDEX = 0x09, + M2M_ATE_TX_RATE_48_Mbps_INDEX = 0x0A, + M2M_ATE_TX_RATE_54_Mbps_INDEX = 0x0B, + /*!< G-Rates + */ + M2M_ATE_TX_RATE_MCS_0_INDEX = 0x0C, + M2M_ATE_TX_RATE_MCS_1_INDEX = 0x0D, + M2M_ATE_TX_RATE_MCS_2_INDEX = 0x0E, + M2M_ATE_TX_RATE_MCS_3_INDEX = 0x0F, + M2M_ATE_TX_RATE_MCS_4_INDEX = 0x10, + M2M_ATE_TX_RATE_MCS_5_INDEX = 0x11, + M2M_ATE_TX_RATE_MCS_6_INDEX = 0x12, + M2M_ATE_TX_RATE_MCS_7_INDEX = 0x13, + /*!< N-Rates + */ +}tenuM2mAteTxIndexOfRates; + +/*! + *@enum tenuM2mAteTxDutyCycle + *@brief Values of duty cycle + */ +typedef enum { + M2M_ATE_TX_DUTY_1 = 0x01, + M2M_ATE_TX_DUTY_2 = 0x02, + M2M_ATE_TX_DUTY_3 = 0x03, + M2M_ATE_TX_DUTY_4 = 0x04, + M2M_ATE_TX_DUTY_5 = 0x05, + M2M_ATE_TX_DUTY_6 = 0x06, + M2M_ATE_TX_DUTY_7 = 0x07, + M2M_ATE_TX_DUTY_8 = 0x08, + M2M_ATE_TX_DUTY_9 = 0x09, + M2M_ATE_TX_DUTY_10 = 0xA0, +}tenuM2mAteTxDutyCycle; + + +#define M2M_ATE_TX_DUTY_MAX_VALUE M2M_ATE_TX_DUTY_1 +/*!< The maximum value of duty cycle +*/ +#define M2M_ATE_TX_DUTY_MIN_VALUE M2M_ATE_TX_DUTY_10 +/*!< The minimum value of duty cycle +*/ + +/*! + *@enum tenuM2mAteTxDpdControl + *@brief Allowed values for DPD control + */ +typedef enum { + M2M_ATE_TX_DPD_DYNAMIC = 0x00, + M2M_ATE_TX_DPD_BYPASS = 0x01, + M2M_ATE_TX_DPD_ENABLED = 0x02, +}tenuM2mAteTxDpdControl; + +/*! + *@enum tenuM2mAteTxGainSetting + *@brief Options for TX gain selection mode + */ +typedef enum { + M2M_ATE_TX_GAIN_DYNAMIC = 0x00, + M2M_ATE_TX_GAIN_BYPASS = 0x01, + M2M_ATE_TX_GAIN_FCC = 0x02, + M2M_ATE_TX_GAIN_TELEC = 0x03, +}tenuM2mAteTxGainSetting; + +/*! + *@enum tenuM2mAtePMUSetting + *@brief Used to Enable PMU or disable it + */ +typedef enum { + M2M_ATE_PMU_DISBLE = 0x00, + M2M_ATE_PMU_ENABLE = 0x01, +}tenuM2mAtePMUSetting; + +/*! + *@enum tenuM2mAteTxSource + *@brief Used to define if enable PHY continues mode or MAC + */ +typedef enum { + M2M_ATE_TX_SRC_MAC = 0x00, + M2M_ATE_TX_SRC_PHY = 0x01, +}tenuM2mAteTxSource; + +/*! + *@enum tenuM2mAteTxMode + *@brief Used to define type of TX mode either normal or CW(Continuous Wave) TX sequence + */ +typedef enum { + M2M_ATE_TX_MODE_NORM = 0x00, + M2M_ATE_TX_MODE_CW = 0x01, +}tenuM2mAteTxMode; + +/*! + *@enum tenuM2mAteChannels + *@brief Available channels for TX and RX + */ +typedef enum { + M2M_ATE_CHANNEL_1 = 0x01, + M2M_ATE_CHANNEL_2 = 0x02, + M2M_ATE_CHANNEL_3 = 0x03, + M2M_ATE_CHANNEL_4 = 0x04, + M2M_ATE_CHANNEL_5 = 0x05, + M2M_ATE_CHANNEL_6 = 0x06, + M2M_ATE_CHANNEL_7 = 0x07, + M2M_ATE_CHANNEL_8 = 0x08, + M2M_ATE_CHANNEL_9 = 0x09, + M2M_ATE_CHANNEL_10 = 0x0A, + M2M_ATE_CHANNEL_11 = 0x0B, + M2M_ATE_CHANNEL_12 = 0x0C, + M2M_ATE_CHANNEL_13 = 0x0D, + M2M_ATE_CHANNEL_14 = 0x0E, +}tenuM2mAteChannels; + +/*! + *@struct tstrM2mAteRxStatus + *@brief Used to save statistics of RX case + */ +typedef struct { + uint32 num_rx_pkts; + /*!< Number of total RX packet + */ + uint32 num_err_pkts; + /*!< Number of RX failed packets + */ + uint32 num_good_pkts; + /*!< Number of RX packets actually received + */ +} tstrM2mAteRxStatus; + +/*! + *@struct tstrM2mAteTx + *@brief Used as data source in case of enabling TX test case + */ +typedef struct { + uint32 num_frames; + /*!< Number of frames to be sent where maximum number allowed is 4294967295 ul, and ZERO means infinite number of frames + */ + uint32 data_rate; + /*!< Rate to sent packets over to select rate use value of \ref tenuM2mAteTxIndexOfRates and pass it to \ref m2m_ate_get_tx_rate + */ + uint8 channel_num; + /*!< Channel number \ref tenuM2mAteChannels + */ + uint8 duty_cycle; + /*!< Duty cycle value between from 1 to 10, where maximum = 1, minimum = 10 \ref tenuM2mAteTxDutyCycle + */ + uint16 frame_len; + /*!< Use \ref M2M_ATE_MAX_FRAME_LENGTH (1024) as the maximum value while \ref M2M_ATE_MIN_FRAME_LENGTH (1) is the minimum value + */ + uint8 tx_gain_sel; + /*!< TX gain mode selection value \ref tenuM2mAteTxGainSetting + */ + uint8 dpd_ctrl; + /*!< DPD mode value\ref tenuM2mAteTxDpdControl + */ + uint8 use_pmu; + /*!< This is 0 if PMU is not used otherwise it must be be 1 \ref tenuM2mAtePMUSetting + */ + uint8 phy_burst_tx; + /*!< Source of Burst TX either PHY or MAC\ref tenuM2mAteTxSource + */ + uint8 cw_tx; + /*!< Mode of Burst TX either normal TX sequence or CW(Continuous Wave) TX sequence \ref tenuM2mAteTxMode + */ + uint32 xo_offset_x1000; + /*!< Signed XO offset value in PPM (Part Per Million) multiplied by 1000. + */ + uint8 use_efuse_xo_offset; + /*!< Set to 0 to use the XO offset provided in xo_offset_x1000. Set to 1 to use XO offset programmed on WINC efuse. + */ + uint8 peer_mac_addr[6]; + /*!< Set peer address to send directed frames to a certain address. + */ +} tstrM2mAteTx; + +/*! + *@struct tstrM2mAteRx + *@brief Used as data source in case of enabling RX test case + */ +typedef struct { + uint8 channel_num; + /*!< Channel number \ref tenuM2mAteChannels + */ + uint8 use_pmu; + /*!< This is 0 if PMU is not used otherwise it must be be 1 \ref tenuM2mAtePMUSetting + */ + uint32 xo_offset_x1000; + /*!< Signed XO offset value in PPM (Part Per Million) multiplied by 1000. + */ + uint8 use_efuse_xo_offset; + /*!< Set to 0 to use the XO offset provided in xo_offset_x1000. Set to 1 to use XO offset programmed on WINC efuse. + */ + uint8 self_mac_addr[6]; + /*!< Set to the self mac address required to be overriden. + */ + uint8 sa_mac_addr[6]; + /*!< Set to the source mac address expected to filter frames from. + */ + uint8 mac_filter_en_da; + /*!< Flag set to enable or disable reception with destination address as a filter. + */ + uint8 mac_filter_en_sa; + /*!< Flag set to enable or disable reception with source address as a filter. + */ + uint8 override_self_mac_addr; + /*!< Flag set to enable or disable self mac address feature. + */ +} tstrM2mAteRx; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(uint32 req_serial_number); + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void); + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8); + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void); + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8); + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void); + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx *); + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void); + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void); + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx *); + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void); + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *); + +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB); + +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * pdGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * pdGaindB + The retrieved digital gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double * pdGaindB); + +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(uint32 *paGain) + +@brief + This function is used to get the pa gain + +@param [out] uint32 *paGain + The retrieved pa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(uint32 * paGain); + +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) + +@brief + This function is used to get the ppa gain + +@param [out] uint32 * ppaGain + The retrieved ppa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain); + +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * pTotGaindB) + +@brief + This function is used to get the total gain + +@param [out] double * pTotGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, pa and ppa gain values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double * pTotGaindB); + + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_CONFIG_MODE_H_ */ + +#endif //_M2M_ATE_FW_ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_crypto.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_crypto.h new file mode 100644 index 0000000..f173e0d --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_crypto.h @@ -0,0 +1,212 @@ +/** + * + * \file + * + * \brief WINC3400 Crypto API + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_CRYPTO_H__ +#define __M2M_CRYPTO_H__ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_SHA256_CONTEXT_BUFF_LEN 128 +#define M2M_SHA256_DIGEST_LEN 32 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrM2mSha256Ctxt + +@brief + SHA256 context data +*/ +typedef struct sha256ctxt{ + uint32 au32Sha256CtxtBuff[M2M_SHA256_CONTEXT_BUFF_LEN/sizeof(uint32)]; +} tstrM2mSha256Ctxt; + + +/*! +@enum \ + tenuRsaSignStatus + +@brief + RSA Signature status: pass or fail. +*/ +typedef enum{ + M2M_RSA_SIGN_OK, + M2M_RSA_SIGN_FAIL +} tenuRsaSignStatus; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@fn \ + sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + +@brief SHA256 hash initialization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. +*/ +sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + + +/*! +@fn \ + sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + +@brief SHA256 hash update + +@param [in] psha256Ctxt + Pointer to the sha256 context. + +@param [in] pu8Data + Buffer holding the data submitted to the hash. + +@param [in] u16DataLength + Size of the data bufefr in bytes. +*/ +sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + + +/*! +@fn \ + sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + +@brief SHA256 hash finalization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. + +@param [in] pu8Sha256Digest + Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less than M2M_SHA256_DIGEST_LEN. +*/ +sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + + + + +/*! +@fn \ + sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Verification + + The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed message shall be + compressed to the corresponding hash algorithm before calling this function. + The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8E + RSA public exponent. + +@param[in] u16ESize + Size of the RSA public exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Signature value to be verified. +*/ +sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature); + + +/*! +@fn \ + sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Generation + + The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed message shall be + compressed to the corresponding hash algorithm before calling this function. + The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8d + RSA private exponent. + +@param[in] u16dSize + Size of the RSA private exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Pointer to a user buffer allocated by teh caller shall hold the generated signature. +*/ +sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature); +#ifdef __cplusplus +} +#endif + + +#endif /* __M2M_CRYPTO_H__ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_flash.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_flash.h new file mode 100644 index 0000000..258664c --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_flash.h @@ -0,0 +1,511 @@ +/** + * + * \file + * + * \brief WINC3400 Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup FLASHAPI FLASH +*/ + +#ifndef __M2M_FLASH_H__ +#define __M2M_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/**@defgroup FlashDefs Defines + * @ingroup FLASHAPI + * @{*/ + + +/*! Bit 0 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to write new firmware image to WINC inactive partition. */ +#define FLASH_UPDATEIMAGE_OPTION_UPDATE NBIT0 +/*! Bit 1 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to mark image in WINC inactive partition as valid. If set along with + * @ref FLASH_UPDATEIMAGE_OPTION_UPDATE, the image is not marked valid if the writing fails. */ +#define FLASH_UPDATEIMAGE_OPTION_VALIDATE NBIT1 +/*! Bit 2 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to switch the WINC active/inactive partitions. Use this to switch to a new image or to + * revert to an old one. The switch only succeeds if the image has been marked valid. */ +#define FLASH_UPDATEIMAGE_OPTION_SWITCH NBIT2 + +/*! Return success, transfer succeeded. */ +#define FLASH_SUCCESS 0 +/*! Return error. The parameters provided by the MCU application failed sanity checks. */ +#define FLASH_ERR_PARAM (-1) +/*! Return error. An MCU application function of type @ref tpfDataAccessFn returned failure. */ +#define FLASH_ERR_LOCAL_ACCESS (-2) +/*! Return error. There was an error while accessing WINC flash, or contents of WINC flash were not as expected. */ +#define FLASH_ERR_WINC_ACCESS (-3) +/*! Return error. The transfer destination location was too small for the size of data to be transferred. */ +#define FLASH_ERR_SIZE (-4) +/*! Return error. The data provided by the MCU application caused a failure. For example:\n + * - An item could not be added to a WINC flash store because the identifier matched an existing item. + * - An item could not be read or removed from a WINC flash store because the identifier did not match an existing item. + * - A firmware image could not be written to WINC flash because it did not match the format of WINC firmware images. */ +#define FLASH_ERR_WINC_CONFLICT (-5) +/*! Return error. The MCU application did not call @ref m2m_flash_init during Wi-Fi initialization. */ +#define FLASH_ERR_UNINIT (-6) +/*! Return error. The module hit an internal error, such as insufficient heap memory. */ +#define FLASH_ERR_INTERNAL (-7) + + /**@} + */ +/**@defgroup FlashEnums Enumeration/Typedefs + * @ingroup FLASHAPI + * @{*/ + +/*! +@enum tenuFlashDataFnCtl + +@brief Control parameter for @ref tpfDataAccessFn. + */ +typedef enum { + /*! Data access about to start. Check and save parameters as required, ready for subsequent + * data accesses. */ + FLASH_DATA_FN_INITIALIZE, + /*! Sequential data access, using parameters previously provided by FLASH_DATA_FN_INITIALIZE. */ + FLASH_DATA_FN_DATA, + /*! Data access aborted. Did not complete and will not be continued. */ + FLASH_DATA_FN_TERMINATE, + /*! Data access complete. */ + FLASH_DATA_FN_COMPLETE +}tenuFlashDataFnCtl; + +/*! +@enum tenuDataFnRW + +@brief Indicates whether data is to be read or written + */ +typedef enum { + /*! Read data from application memory. */ + FLASH_DATA_FN_READ, + /*! Write data to application memory. */ + FLASH_DATA_FN_WRITE +}tenuDataFnRW; + +/*! +@enum tenuImageId + +@brief Indicates which image to access in WINC flash + */ +typedef enum { + /*! Access the image in the inactive partition. */ + FLASH_IMAGE_INACTIVE, + /*! Access the image in the active partition. */ + FLASH_IMAGE_ACTIVE +}tenuImageId; + + +/*! +@typedef \ + tpfDataAccessFn + +@brief + A function of this type is used for local data access. It can be implemented to handle simple + RAM access with pointer/length, or it can be implemented to handle access to external memory. + Functions of this type are provided to the module via various function APIs. +@see m2m_flash_rootcert_add +@see m2m_flash_rootcert_read +@see m2m_flash_rootcert_readidx +@see m2m_flash_updateimage +@see m2m_flash_readimage + +@param [in] enuCtl + Control parameter. +@param [in] pvStr + Generic pointer to structure. The structure type depends on enuCtl: + - @ref tstrDataAccessInitParamsApp if enuCtl is @ref FLASH_DATA_FN_INITIALIZE. + - @ref tstrDataAccessParamsApp if enuCtl is @ref FLASH_DATA_FN_DATA. + - @ref NULL if enuCtl is @ref FLASH_DATA_FN_TERMINATE or @ref FLASH_DATA_FN_COMPLETE. + +@note The function is typically called by the module multiple times during a data transfer: + Once with @ref FLASH_DATA_FN_INITIALIZE, then multiple times with @ref FLASH_DATA_FN_DATA, then + once with @ref FLASH_DATA_FN_COMPLETE. + +@return Zero for success. Non-zero otherwise. + +\section FlashExample1 Example +This example illustrates an implementation of a function of type @ref tpfDataAccessFn. \n +This example assumes the application's data buffer is in RAM, so we can use memcpy. Alternatively +memcpy can be replaced by dedicated functions which read/write the application buffer. + +gpu8DataLocation is a pointer to the data buffer in RAM, set by the application. \n +gu32DataSize is the size of the data buffer, set by the application. + +@code{.c} +sint8 data_access_ptr(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + // Return value. + sint8 s8Ret = -1; + // Fixed variables, set in case FLASH_DATA_FN_INITIALIZE, reset in case FLASH_DATA_FN_COMPLETE. + static tenuDataFnRW enuRW; + static uint8 *pu8Location = NULL; + static uint32 u32BytesRemaining = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + if (pvStr != NULL) + { + tstrDataAccessInitParamsApp *init_params = (tstrDataAccessInitParamsApp*)pvStr; + if (init_params->u32TotalSize > gu32DataSize) + break; + // Set fixed variables. + enuRW = init_params->enuRW; + pu8Location = gpu8DataLocation; + u32BytesRemaining = init_params->u32TotalSize; + s8Ret = 0; + } + break; + case FLASH_DATA_FN_DATA: + if ((pvStr != NULL) && (pu8Location != NULL)) + { + tstrDataAccessParamsApp *params = (tstrDataAccessParamsApp*)pvStr; + // Some sanity checks which should never fail. + if (u32BytesRemaining < params->u32DataSize) + break; + if (params->pu8Data == NULL) + break; + switch (enuRW) + { + case FLASH_DATA_FN_WRITE: + memcpy(pu8Location, params->pu8Data, params->u32DataSize); + s8Ret = 0; + break; + case FLASH_DATA_FN_READ: + memcpy(params->pu8Data, pu8Location, params->u32DataSize); + s8Ret = 0; + break; + } + // Update fixed variables for sequential access. + pu8Location += params->u32DataSize; + u32BytesRemaining -= params->u32DataSize; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + // Reset fixed variables. + pu8Location = NULL; + u32BytesRemaining = 0; + s8Ret = 0; + break; + } + return s8Ret; +} +@endcode +*/ +typedef sint8 (*tpfDataAccessFn) (tenuFlashDataFnCtl enuCtl, void *pvStr); + +/*! +@struct \ + tstrDataAccessInitParamsApp +@brief + This structure contains parameters for initializing a local data access (read or write). + +@see tpfDataAccessFn. + */ +typedef struct { + /*! Total size of data to be accessed in data location. */ + uint32 u32TotalSize; + /*! Flags indicating type of data access (read or write). */ + tenuDataFnRW enuRW; +}tstrDataAccessInitParamsApp; + +/*! +@struct \ + tstrDataAccessParamsApp +@brief + This structure contains data for local data access (read or write). +@see tpfDataAccessFn. + */ +typedef struct { + /*! Buffer to be written from or read to. */ + uint8 *pu8Data; + /*! Size of data to be written or read. */ + uint32 u32DataSize; +}tstrDataAccessParamsApp; + +/*! +@struct \ + tstrFlashState +@brief + This structure contains information about an attempted transfer. +@see m2m_flash_init + */ +typedef struct { + /*! Last access attempt. Identifier provided by MCU application. 0 if info not available. */ + uint16 u16LastAccessId; + /*! Was the last access attempt successful? */ + uint8 u8Success; + /*! Did the last access attempt result in modified WINC flash? */ + uint8 u8Changed; + /*! Has the module been initialized? */ + uint8 u8Init; + /*! Has the module been initialized more recently than the module last reset the WINC? */ + uint8 u8Reset; +}tstrFlashState; + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup FLASHFUNCTIONS Functions +* @ingroup FLASHAPI +*/ + +/**@{*/ +/*! +@fn \ + sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); + +@brief Write/validate/switch a WINC firmware image. + +@param [in] u8Options + Flags indicating the required combination of write / validate / switch. +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfSourceFn + Function for the module to call to obtain the image from the MCU application. +@param [in] u32SourceSize + Size of the image being provided by the MCU application. + +@see FLASH_UPDATEIMAGE_OPTION_UPDATE +@see FLASH_UPDATEIMAGE_OPTION_VALIDATE +@see FLASH_UPDATEIMAGE_OPTION_SWITCH + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); +/*! +@fn \ + sint8 m2m_flash_readimage(tenuImageId enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize); + +@brief Read a WINC firmware image. + +@param [in] enuImageId + Which partition to read image from. +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the image to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the image. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_readimage(tenuImageId enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize); +/*! +@fn \ +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); + +@brief Add an entry to the WINC TLS root certificate store. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfSourceFn + Function for the module to call to obtain the certificate entry from the MCU application. +@param [in] u32SourceSize + Size of the certificate entry being provided by the MCU application. + +@note The data location to be accessed via pfSourceFn + contains the entry to be added. The format of a TLS root certificate entry is: + @code{.c} + Name Offset Length Contents + Header 0 36 tstrRootCertEntryHeader + Key 36 KeyLength Public key and padding + Padding 36+KeyLength PadLength 0xFF + @endcode + For RSA public keys, the format of Key is: + @code{.c} + Name Offset Length + Modulus 36 ModLength RSA modulus, with leading 0s stripped off + Exponent 36+ModLength ExpLength Public exponent, with leading 0s stripped off + @endcode + In this case PadLength is the amount of padding that would be required for 4-byte alignment of Modulus + plus the amount of padding that would be required for 4-byte alignment of Exponent.\n + For ECDSA public keys, the format of Key is: + @code{.c} + Name Offset Length + X Coord 36 CoordLength Public key X-coordinate + Y Coord 36+CoordLength CoordLength Public key Y-coordinate + @endcode + In this case PadLength is the amount of padding that would be required for 4-byte alignment of X Coord + plus the amount of padding that would be required for 4-byte alignment of Y Coord. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfFn, uint32 u32Size); + +/*! +@fn \ +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz); + +@brief Remove an entry from the WINC TLS root certificate store. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pu8Identifier + Identifier for the entry to be removed. This is the SHA1 digest of the certificate issuer name. +@param [in] u32IdentifierSz + Size of the identifier (20). + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz); +/*! +@fn \ + sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz); + +@brief Read an entry from the WINC TLS root certificate store, referenced by entry identifier. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the certificate entry to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the entry. +@param [in] pu8Identifier + Identifier for the entry to be read. This is the SHA1 digest of the certificate issuer name. +@param [in] u32IdentifierSz + Size of the identifier (20). + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz); +/*! +@fn \ + sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index); + +@brief Read an entry from the WINC TLS root certificate store, referenced by entry index. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the certificate entry to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the entry. +@param [in] u8Index + Zero-based index of the entry to be read. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index); + +/*! +@fn \ + void m2m_flash_get_state(tstrFlashState *pstrState); + +@brief Get information about the module current state and about the most recent access attempt. + +@param [out] pstrState + Module state and most recent access attempt info. + +@return None. +*/ +void m2m_flash_get_state(tstrFlashState *pstrState); + + +/*! +@fn \ + sint8 m2m_flash_init(void); + +@brief Initialize the module. + +@warning This API must be called at a particular point during MCU application initialization. + +@see m2m_wifi_init +@see m2m_wifi_init_hold +@see m2m_wifi_init_start + +\section FlashExample2 Example +This example demonstrates how to add @ref m2m_flash_init and @ref m2m_flash_get_state +to MCU application initialization code. + +Original code: +@code{.c} +{ + tstrWifiInitParam param = {...} + sint8 status = 0; + + status = m2m_wifi_init(param); + if (status != 0) + { + // Wifi init failed. + } +} +@endcode +New code: +@code{.c} +{ + tstrWifiInitParam param = {...} + sint8 status = 0; + + status = m2m_wifi_init_hold(); + if (status == 0) + { + tstrFlashState strFlashState; + + m2m_flash_get_state(&strFlashState); + printf("FlashAccess:%x:%d%d\n", strFlashState.u16LastAccessId, strFlashState.u8Success, strFlashState.u8Changed); + + switch (strFlashState.u16LastAccessId) + { + // Application code dependent on meaning of u16LastAccessId. + } + m2m_flash_init(); + status = m2m_wifi_init_start(param); + } + if (status != 0) + { + // Wifi init failed. + } +} +@endcode + +@return Zero for successful initialization of module. Negative value otherwise. +*/ +sint8 m2m_flash_init(void); + + /**@}*/ +#endif /* __M2M_FLASH_H__ */ diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_ota.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_ota.h new file mode 100644 index 0000000..f532024 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_ota.h @@ -0,0 +1,383 @@ +/** + * + * \file + * + * \brief WINC3400 IoT OTA Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup OTAAPI OTA +*/ + +#ifndef __M2M_OTA_H__ +#define __M2M_OTA_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" + +/** +* @addtogroup OTATYPEDEF +*/ +/**@{*/ + +/*! +@typedef \ + void (*tpfOtaNotifCb) (tstrOtaUpdateInfo *); + +@brief A callback to get notification about a potential OTA update. + +@param[in] pstrOtaUpdateInfo A structure to provide notification payload. + +@sa + tstrOtaUpdateInfo +@warning + The notification is not supported (Not implemented yet) + +*/ +typedef void (*tpfOtaNotifCb) (tstrOtaUpdateInfo * pstrOtaUpdateInfo); + + +/*! +@typedef \ + void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); + +@brief + A callback to get OTA status update, the callback provides the download status, + the switch to the downloaded firmware status and roll-back status. + +@param[in] u8OtaUpdateStatusType Possible values are listed in \ref tenuOtaUpdateStatusType. Possible types are: +- [DL_STATUS](@ref DL_STATUS) +- [SW_STATUS](@ref SW_STATUS) +- [RB_STATUS](@ref RB_STATUS) + +@param[in] u8OtaUpdateStatus Possible values are listed in \ref tenuOtaUpdateStatus. + +@see + tenuOtaUpdateStatusType + tenuOtaUpdateStatus + */ +typedef void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); + /**@} + */ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup OTAFUNCTIONS Functions + * @ingroup OTAAPI + */ +#ifdef __cplusplus + extern "C" { +#endif + + /**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb); + * Synchronous initialization function for the OTA layer by registering the update callback. + * The notification callback is not supported at the current version. Calling this API is a + * prerequisite for all other OTA API's. +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + * Set the OTA notification server URL, the functions need to be called before any check for update. + * This functionality is not supported by WINC firmware. + +@param [in] u8Url + Set the OTA notification server URL, the functions need to be called before any check for update. +@warning + This functionality is not supported by WINC firmware. + +@see + m2m_ota_init +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + * Synchronous function to check for the OTA update using the Notification Server + * URL. This functionality is not supported by WINC firmware. +@warning + This functionality is not supported by WINC firmware. + +@sa + m2m_ota_init + m2m_ota_notif_set_url +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); +* Schedule OTA notification Server check for update request after specific number of days. +* This functionality is not supported by WINC firmware. + +@param [in] u32Period + Period in days + +@warning + This functionality is not supported by WINC firmware. + +@sa + m2m_ota_init + m2m_ota_notif_check_for_update + m2m_ota_notif_set_url +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + Request OTA start update using the downloaded URL. + The firmware OTA module will download the OTA image, ensure integrity of the image, and update the validity of the image in + the control structure. + On completion, a callback of type @ref tpfOtaUpdateCb is called (callback previously provided via @ref m2m_ota_init()). + Switching to the updated image additionally requires completion of @ref m2m_ota_switch_firmware(), and system_reset(). + +@param [in] u8DownloadUrl + The download firmware URL, according to the application server. + +@warning + Calling this API does not guarantee OTA WINC image update; it depends on the connection with the download server and the validity + of the image. + Calling this API invalidates the previous rollback image. The current image will become the rollback image after + @ref m2m_ota_switch_firmware(). + +@pre + @ref m2m_ota_init() must have been called before using @ref m2m_ota_start_update(). +@sa + @ref m2m_ota_init() + @ref m2m_ota_switch_firmware() + @ref tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + Note that successful operation in this context means the OTA update request has reached the firmware OTA module. It does not + indicate whether or not the image update succeeded. + +\section OTAExample Example + This example shows how an OTA image update and switch is carried out. + It demonstrates use of the following OTA APIs: + @ref m2m_ota_init() + @ref tpfOtaUpdateCb + @ref m2m_ota_start_update() + @ref m2m_ota_switch_firmware() + @ref m2m_ota_rollback() + It also makes use of @ref m2m_wifi_check_ota_rb() in order to inform OTA decisions. + +@code +static void OtaUpdateCb(uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus) +{ + sint8 s8tmp; + tstrM2mRev strtmp; + + M2M_INFO("%d %d\n", u8OtaUpdateStatusType, u8OtaUpdateStatus); + + switch(u8OtaUpdateStatusType) { + case DL_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { + M2M_INFO("OTA download succeeded\n"); + s8tmp = m2m_wifi_check_ota_rb(); + if(s8tmp == M2M_ERR_FW_VER_MISMATCH) { + // In this case the application SHOULD update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver would lead to severely limited functionality (i.e. OTA rollback only). + } + else if(s8tmp == M2M_SUCCESS) { + // In this case the application MAY WANT TO update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver may lead to suboptimal functionality. + } + else { + M2M_INFO("Cannot recognize downloaded image\n"); + // In this case the application MUST NOT update the host driver if such an update would change the + // driver HIF Major field. Firmware switch @ref using m2m_ota_switch_firmware() is blocked. + break; + } + M2M_INFO("Now switching active partition...\n"); + s8tmp = m2m_ota_switch_firmware(); + } + break; + case SW_STATUS: + case RB_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { + M2M_INFO("Switch/Rollback succeeded\n"); + M2M_INFO("Now resetting the system...\n"); + system_reset(); + } + break; + } +} +static void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) +{ + // ... + case M2M_WIFI_REQ_DHCP_CONF: + { + //After successful connection, start the OTA upgrade. + m2m_ota_start_update(OTA_URL); + } + break; + // ... +} +int main (void) +{ + sint8 ret = M2M_SUCCESS; + tstrWifiInitParam param; + bool rollback_required = FALSE; + + // ... system init etc here ... + + //Initialize the WINC Driver. + m2m_memset((uint8*)¶m, 0, sizeof(param)); + param.pfAppWifiCb = wifi_event_cb; + + ret = m2m_wifi_init(¶m); + if(ret == M2M_ERR_FW_VER_MISMATCH) { + ret = m2m_wifi_check_ota_rb(); + if(ret == M2M_SUCCESS) { + // In this case the image in the inactive partition has compatible HIF. We will switch/rollback to it + // after initializing the OTA module. + rollback_required = TRUE; + } + } + if(ret != M2M_SUCCESS) { + M2M_ERR("Driver Init Failed <%d>\n",ret); + while(1); + } + + //Initialize the OTA module. + m2m_ota_init(OtaUpdateCb, NULL); + + if(rollback_required) { + // We need to call either @ref m2m_ota_rollback() or @ref m2m_ota_switch_firmware() (functionally equivalent). + m2m_ota_rollback(); + } else { + // Connect to AP that provides connection to the OTA server + m2m_wifi_default_connect(); + } + + while(1) { + // Handle the app state machine plus the WINC event handler. + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + } + } +} +@endcode + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + Request rollback to the old (inactive) WINC image. The WINC firmware will check the validity of + the inactive image and activate it if it is valid. + On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously + have provided the callback via @ref m2m_ota_init()). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If rollback will necessitate a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this + API. + In the event of system reset with incompatible driver/firmware, compatibility can be recovered + by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + Abort an ota in progress (eg if server has stalled) and clean up +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + Request switch to the updated WINC image. The WINC firmware will check the validity of the + inactive image and activate it if it is valid. + On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously + have provided the callback via @ref m2m_ota_init()). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If switch will necessitate a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this + API. + In the event of system reset with incompatible driver/firmware, compatibility can be recovered + by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void); + +#if 0 +NMI_API sint8 m2m_ota_test(void); +#endif + /**@}*/ +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_periph.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_periph.h new file mode 100644 index 0000000..6e109dd --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_periph.h @@ -0,0 +1,310 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + INCLUDES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + MACROS + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + DATA TYPES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @struct \ + tstrPerphInitParam + + @brief + Peripheral module initialization parameters. + */ +typedef struct { + void * arg; +} tstrPerphInitParam; + + +/*! + @enum \ + tenuGpioNum + + @brief + A list of GPIO numbers configurable through the m2m_periph module. + */ +typedef enum { + M2M_PERIPH_GPIO3, + M2M_PERIPH_GPIO4, + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + + +/*! + @enum \ + tenuI2cMasterSclMuxOpt + + @brief + Allowed pin multiplexing options for I2C master SCL signal. + */ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is avaiable on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is avaiable on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is avaiable on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is avaiable on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is avaiable on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! + @enum \ + tenuI2cMasterSdaMuxOpt + + @brief + Allowed pin multiplexing options for I2C master SDA signal. + */ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK , /*!< I2C master SDA is avaiable on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is avaiable on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is avaiable on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is avaiable on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is avaiable on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + + +/*! + @struct \ + tstrI2cMasterInitParam + + @brief + I2C master configuration parameters. + @sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt + */ +typedef struct { + uint8 enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8 enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8 u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! + @enum \ + tenuI2cMasterFlags + + @brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read + @sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read + */ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! + @enum \ + tenuPullupMask + + @brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. + @sa + m2m_periph_pullup_ctrl + + */ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 8), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_RXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 12), +} tenuPullupEnable1Mask; +typedef enum { + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_GPIO_38 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_39 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_40 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_42 = (1ul << 29), +} tenuPullupEnable2Mask; +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + FUNCTION PROTOTYPES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + /*! + @fn \ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + + @brief + Initialize the NMC1500 peripheral driver module. + + @param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tstrPerphInitParam + */ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + + @brief + Configure a specific NMC1500 pad as a GPIO and sets its direction (input or output). + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + + @brief + Set an NMC1500 GPIO output level high or low. + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + + @brief + Read an NMC1500 GPIO input level. + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + + /*! + @fn \ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + + @brief + Control the programmable pull-up resistor on the chip pads . + + + @param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. + + @param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuPullupMask + */ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +#ifdef __cplusplus +} +#endif + + +#endif /* _M2M_PERIPH_H_ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_ssl.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_ssl.h new file mode 100644 index 0000000..1f4ed13 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_ssl.h @@ -0,0 +1,175 @@ +/** + * + * \file + * + * \brief WINC3400 SSL Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup SSLAPI SSL +*/ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" +#include "ecc_types.h" +#include "socket/include/socket.h" + +/**@defgroup SSLEnums Enumeration/Typedefs + * @ingroup SSLAPI + * @{*/ + +/*! +@typedef \ + void (*tpfAppSSLCb) (uint8 u8MsgType, void * pvMsg); + +@brief A callback to get SSL notifications. + +@param[in] u8MsgType +@param[in] pvMsg A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb) (uint8 u8MsgType, void * pvMsg); + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SSLFUNCTIONS Functions +* @ingroup SSLAPI +*/ + +/**@{*/ +/*! + @fn \ NMI_API sint8 m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! + @fn \ NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuff + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. The buffer format must match the format of @ref tstrTlsSrvSecHdr + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) + @brief Retrieve the ECDSA certificate to be verified from the WINC + @param [out] pu16CurveType + Pointer to the certificate curve type. + @param [out] pu8Hash + Pointer to the certificate hash. + @param [out] pu8Sig + Pointer to the certificate signature. + @param [out] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [out] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz); + +/*! + @fn \ NMI_API void m2m_ssl_stop_processing_certs(void) + @brief Allow ssl driver to tidy up in case application does not read all available certificates. + @warning This API must only be called if some certificates are left unread. + @return None. +*/ +NMI_API void m2m_ssl_stop_processing_certs(void); + +/*! + @fn \ NMI_API void m2m_ssl_ecc_process_done(void) + @brief Allow ssl driver to tidy up after application has finished processing ecc message. + @warning This API must be called after receiving a SSL callback with type @ref M2M_SSL_REQ_ECC + @return None. +*/ +NMI_API void m2m_ssl_ecc_process_done(void); + +/*! +@fn \ + NMI_API sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination, except for combinations involving both RSA + and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + + /**@}*/ +#endif /* __M2M_SSL_H__ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/include/m2m_types.h b/AudioConsole.X/Source/winc3400/driver/include/m2m_types.h new file mode 100644 index 0000000..3655a5b --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/include/m2m_types.h @@ -0,0 +1,2214 @@ +/** + * + * \file + * + * \brief WINC3400 IoT Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "common/include/nm_common.h" +#else +#include "m2m_common.h" +#endif +#endif + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup VERSION VERSION + */ +/**@defgroup VERSIONDEF Defines + @ingroup VERSION + */ + +/**@{*/ + +/* + Layout of HIF_LEVEL fields + | x x x x x x | x x x x x x x x | + | 13:8 | 7:0 | + | HIF_MAJOR | HIF_MINOR | + | HIF_LEVEL | + + HIF compatibility (checked by driver after wifi boot). + + Check Firmware HIF_MAJOR + |___ + | Does not match Driver - Recommend either: + | > checking compatibility of Cortus image stored in inactive partition + | (m2m_wifi_check_ota_rb()) then swapping to it using OTA rollback or switch. + | > updating Host with out of band method. + |___ + Matches Driver - All APIs can be attempted. + | - Cortus image can be updated (OTA download) + | - New Host image can be retrieved (socket recv) + | + Check Firmware HIF_MINOR + |___ + | Less than Driver - Driver may refuse to execute some APIs (API would return M2M_ERR_SEND). + | - Recommend updating Cortus image using OTA download to use newer Firmware. + |___ + | Equal to Driver - Driver supports all APIs. + |___ + Greater than Driver - Driver supports all APIs. + - Recommend reviewing potential benefit of updating Host to use newer Driver. + + When an OTA update involving HIF_MAJOR change is required, the following order is recommended: + 1. m2m_ota_start_update() to store new Cortus image in inactive partition. + 2. Socket recv() to retrieve new Host image (including new WINC Driver). + 3. Application code to make Host image available in host flash. + 4. m2m_ota_switch_firmware() to switch active/inactive partition (will take effect after system_reset()). + 5. system_reset() to restart with new WINC Driver / Firmware. + Note that in the event of (unintentional) system reset after step (3), the remaining steps (4) and (5) should still be + run after the reset. +*/ +/* Selection of HIF_INFO +*/ +#define M2M_HIF_INFO_SHIFT (0) +#define M2M_HIF_INFO_MASK (0xffff) +/* Subdivision of HIF_INFO +*/ +#define M2M_HIF_BLOCK_SHIFT (14) +#define M2M_HIF_BLOCK_MASK (0x3) +#define M2M_HIF_LEVEL_SHIFT (0) +#define M2M_HIF_LEVEL_MASK (0x3fff) +/* Subdivision of HIF_LEVEL +*/ +#define M2M_HIF_MAJOR_SHIFT (8) +#define M2M_HIF_MAJOR_MASK (0x3f) +#define M2M_HIF_MINOR_SHIFT (0) +#define M2M_HIF_MINOR_MASK (0xff) + +#define M2M_GET_HIF_INFO(hif_ver) ((uint16)(((hif_ver) >> M2M_HIF_INFO_SHIFT) & M2M_HIF_INFO_MASK)) +#define M2M_GET_HIF_BLOCK(hif_info) ((uint8)(((hif_info) >> M2M_HIF_BLOCK_SHIFT) & M2M_HIF_BLOCK_MASK)) +#define M2M_GET_HIF_LEVEL(hif_info) ((uint16)(((hif_info) >> M2M_HIF_LEVEL_SHIFT) & M2M_HIF_LEVEL_MASK)) +#define M2M_GET_HIF_MAJOR(hif_info) ((uint8)(((hif_info) >> M2M_HIF_MAJOR_SHIFT) & M2M_HIF_MAJOR_MASK)) +#define M2M_GET_HIF_MINOR(hif_info) ((uint8)(((hif_info) >> M2M_HIF_MINOR_SHIFT) & M2M_HIF_MINOR_MASK)) + +#define M2M_MAKE_HIF_INFO(hif_level) ( \ + (((uint16)(hif_level) & M2M_HIF_LEVEL_MASK) << M2M_HIF_LEVEL_SHIFT) | \ + (((uint16)M2M_HIF_BLOCK_VALUE & M2M_HIF_BLOCK_MASK) << M2M_HIF_BLOCK_SHIFT) ) + +/*======*======*======*======* + HIF LEVEL + *======*======*======*======*/ + +#define M2M_HIF_BLOCK_VALUE (2) +/*!< Drv/Fw blocking compatibility check. + */ +#define M2M_HIF_MAJOR_VALUE (1) +/*!< Drv/Fw major compatibility check. +*/ +#define M2M_HIF_MINOR_VALUE (3) +/*!< Drv/Fw minor compatibility check. +*/ +#define M2M_HIF_LEVEL ( \ + ((M2M_HIF_MAJOR_VALUE & M2M_HIF_MAJOR_MASK) << M2M_HIF_MAJOR_SHIFT) | \ + ((M2M_HIF_MINOR_VALUE & M2M_HIF_MINOR_MASK) << M2M_HIF_MINOR_SHIFT) \ + ) +/*!< HIF Level (Major/Minor) for Drv/Fw compatibility. +*/ + +/*======*======*======*======* + DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_DRIVER_VERSION_MAJOR_NO (1) +/*!< Driver Major release version number. +*/ +#define M2M_DRIVER_VERSION_MINOR_NO (0) +/*!< Driver Minor release version number. +*/ +#define M2M_DRIVER_VERSION_PATCH_NO (8) +/*!< Driver patch release version number. +*/ + +/**@}*/ + +/**@defgroup WLANDefines Defines + * @ingroup m2m_wifi + */ +/**@{*/ + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + + +#define M2M_MAC_ADDRES_LEN 6 +/*!< Size of the MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< Offset of the ethernet header within the WLAN Tx Buffer. + */ + + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the ethernet header in bytes. +*/ + + +#define M2M_MAX_SSID_LEN 33 +/*!< Maximum size for the Wi-Fi SSID including the NULL termination. + */ + + +#define M2M_MAX_PSK_LEN 65 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + + +#define M2M_1X_USR_NAME_MAX 21 +/*!< The maximum size of the user name including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + + +#define M2M_1X_PWD_MAX 41 +/*!< The maximum size of the password including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< Maximum size for the Information Element. +*/ + + +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the Host configuration commands opcodes. +*/ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the Station mode host commands opcodes. +*/ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. +*/ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. +*/ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. +*/ +#define M2M_SERVER_CMD_BASE 120 +/*!< The base value of all the Power Save mode host commands codes. +*/ + + +#define WEP_40_KEY_STRING_SIZE ((uint8)10) +/*!< Indicates the WEP key size for the 40 bit string passphrase. +*/ + +#define WEP_104_KEY_STRING_SIZE ((uint8)26) +/*!< Indicates the WEP key size for the 104 bit string passphrase. +*/ +#define WEP_KEY_MAX_INDEX ((uint8)4) +/*!< Indicates the maximum key index value for WEP authentication. +*/ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default number of scan slots used by the WINC board. +*/ +#define M2M_SCAN_DEFAULT_SLOT_TIME (20) +/*!< The active scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_PASSIVE_SLOT_TIME (300) +/*!< The passive scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default number of probes per slot. +*/ +#define M2M_FASTCONNECT_DEFAULT_RSSI_THRESH (-45) +/*!< The default threshold RSSI for fast reconnection to an AP. +*/ +#define M2M_SCAN_FAIL ((uint8)1) +/*!< Indicates the WINC board has failed to perform the scan operation. +*/ +#define M2M_JOIN_FAIL ((uint8)2) +/*!< Indicates the WINC board has failed to join the BSS. +*/ +#define M2M_AUTH_FAIL ((uint8)3) +/*!< Indicates the WINC board has failed to authenticate with the AP. +*/ +#define M2M_ASSOC_FAIL ((uint8)4) +/*!< Indicates the WINC board has failed to associate with the AP. +*/ + +#define M2M_SCAN_ERR_WIFI ((sint8)-2) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_IP ((sint8)-3) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_AP ((sint8)-4) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_P2P ((sint8)-5) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_WPS ((sint8)-6) +/*!< Currently not used. +*/ + +/*======*======*======*======* + MONTIORING MODE DEFINITIONS + *======*======*======*======*/ + +#define M2M_WIFI_FRAME_TYPE_ANY 0xFF +/*!< Receive any frame type when configured as Monitor Mode. +*/ +#define M2M_WIFI_FRAME_SUB_TYPE_ANY 0xFF +/*!< Receive frames with any sub type when configured as Monitor Mode. +*/ + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name. +*/ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. +*/ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. +*/ + +/**@}*/ + +/**@defgroup OTADEFINE Defines + * @ingroup OTAAPI + */ + /* @{ */ + +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value in the control structure for a valid image after ROLLBACK. +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value in the control structure for a invalid image after ROLLBACK. +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header. +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + SHA256 digest size in the OTA image. + The SHA256 digest is set at the beginning of image before the OTA header. +*/ + +#define OTA_SUCCESS (0) +/*!< + OTA success status. +*/ +#define OTA_ERR_WORKING_IMAGE_LOAD_FAIL ((sint8)-1) +/*!< + Failure to load the firmware image. +*/ +#define OTA_ERR_INVAILD_CONTROL_SEC ((sint8)-2) +/*!< + Control structure is being corrupted. +*/ +#define M2M_ERR_OTA_SWITCH_FAIL ((sint8)-3) +/*!< + Failure to switch to the updated image, due to this being invalid. +*/ +#define M2M_ERR_OTA_START_UPDATE_FAIL ((sint8)-4) +/*!< + Failure to start the OTA update. + This could be due to a connection failure or a problem with the integrity of the image. +*/ +#define M2M_ERR_OTA_ROLLBACK_FAIL ((sint8)-5) +/*!< + Invalid roll-back image. +*/ +#define M2M_ERR_OTA_INVAILD_FLASH_SIZE ((sint8)-6) +/*!< + The OTA Support requires 8MB flash size. This error indicates the current flash is less than 8M. +*/ +#define M2M_ERR_OTA_INVAILD_ARG ((sint8)-7) +/*!< + Invalid argument in any OTA Function +*/ +/**@}*/ + +/** +* @addtogroup WlanEnums +*/ + /**@{*/ + +/*! +@enum \ + tenuM2mReqGroup + +@brief +*/ +typedef enum{ + M2M_REQ_GROUP_MAIN = 0, + M2M_REQ_GROUP_WIFI, + M2M_REQ_GROUP_IP, + M2M_REQ_GROUP_HIF, + M2M_REQ_GROUP_OTA, + M2M_REQ_GROUP_SSL, + M2M_REQ_GROUP_SIGMA +}tenuM2mReqGroup; + +/*! +@enum \ + tenuM2mReqpkt + +@brief +*/ +typedef enum{ + M2M_REQ_CONFIG_PKT, + M2M_REQ_DATA_PKT = 0x80 /*BIT7*/ +}tenuM2mReqpkt; + +/*! +@enum \ + tenuM2mWepKeyIndex + +@brief + +*/ +typedef enum { + M2M_WIFI_WEP_KEY_INDEX_1 = ((uint8) 1), + /*!< Index 1 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_2, + /*!< Index 2 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_3, + /*!< Index 3 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_4, + /*!< Index 4 for WEP key Authentication */ +}tenuM2mWepKeyIndex; + +/*! +@enum \ + tenuM2mDefaultConnErrcode + +@brief + +*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((sint8)-23), + /*!< Failure response due to another connection being already in progress */ + M2M_DEFAULT_CONN_FAIL, + /*!< Failure to connect to the cached network */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< Failure to find any of the cached networks in the scan results. */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< Failure due to empty network list. */ +}tenuM2mDefaultConnErrcode; + + +/*! +@enum \ + tenuM2mConnChangedErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_SCAN_FAIL = ((uint8)1), + /*!< Failure to perform the scan operation. */ + M2M_ERR_JOIN_FAIL, + /*!< Failure to join the BSS. */ + M2M_ERR_AUTH_FAIL, + /*!< Failure to authenticate with the AP. */ + M2M_ERR_ASSOC_FAIL, + /*!< Failure to associate with the AP. */ + M2M_ERR_CONN_INPROGRESS, + /*!< Failure due to another connection being in progress. */ +}tenuM2mConnChangedErrcode; + + +/*! +@enum \ + tenuM2mSetGainsErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_GAIN_TABLE_INVALID = ((sint8)-10), + /*!< Failure response due to trying to use an invalid table */ + M2M_ERR_READ_GAIN_TABLE, + /*!< Failure to read gains from flash */ +}tenuM2mSetGainsErrcode; + +/*! +@enum \ + tenuM2mPwrMode + +@brief + +*/ +typedef enum { + PWR_AUTO = ((uint8) 1), + /*!< Automatic power mode. */ + PWR_LOW1, + /*!< Low power mode #1. RX current 60mA.*/ + PWR_LOW2, + /*!< Low power mode #2, RX current 55mA, sensitivity is less by 3dBm*/ + PWR_HIGH, + /*!< High power mode: RX current 100mA.*/ +}tenuM2mPwrMode; + +/*! +@enum \ + tenuM2mTxPwrLevel + +@brief + +*/ +typedef enum { + TX_PWR_HIGH = ((uint8) 1), + /*!< PPA Gain 6dbm PA Gain 18dbm */ + TX_PWR_MED, + /*!< PPA Gain 6dbm PA Gain 12dbm */ + TX_PWR_LOW, + /*!< PPA Gain 6dbm PA Gain 6dbm */ +}tenuM2mTxPwrLevel; + +/*! +@enum \ + tenuM2mConfigCmd + +@brief + This enum contains all the host commands used to configure the WINC board. + +*/ +typedef enum { + M2M_WIFI_REQ_RESTART = M2M_CONFIG_CMD_BASE, + /*!< Restart the WINC MAC layer, it's doesn't restart the IP layer. */ + M2M_WIFI_REQ_SET_MAC_ADDRESS, + /*!< Set the WINC mac address (not possible for production effused boards). */ + M2M_WIFI_REQ_CURRENT_RSSI, + /*!< Request the current connected AP RSSI. */ + M2M_WIFI_RESP_CURRENT_RSSI, + /*!< Response to M2M_WIFI_REQ_CURRENT_RSSI with the RSSI value. */ + M2M_WIFI_REQ_RESTRICT_BLE, + /*!< Request restrict ble. */ + M2M_WIFI_REQ_UNRESTRICT_BLE, + /*!< Request unrestrict ble. */ + M2M_WIFI_REQ_GET_CONN_INFO, + /*!< Request connection information. */ + M2M_WIFI_RESP_CONN_INFO, + /*!< Response to M2M_WIFI_REQ_GET_CONN_INFO with the connection information. */ + M2M_WIFI_REQ_SET_DEVICE_NAME, + /*!< Request to set WINC device name property. */ + M2M_WIFI_REQ_START_PROVISION_MODE, + /*!< Request to start provisioning mode. */ + M2M_WIFI_RESP_PROVISION_INFO, + /*!< Response to the host with the provisioning information.*/ + M2M_WIFI_REQ_STOP_PROVISION_MODE, + /*!< Request to stop provision mode. */ + M2M_WIFI_REQ_SET_SYS_TIME, + /*!< Request to set system time. */ + M2M_WIFI_REQ_ENABLE_SNTP_CLIENT, + /*!< Request to enable the simple network time protocol to get the + time from the Internet. This is required for security purposes. */ + M2M_WIFI_REQ_DISABLE_SNTP_CLIENT, + /*!< Request to disable the simple network time protocol for applications that + do not need it. */ + M2M_WIFI_RESP_MEMORY_RECOVER, + /*!< Reserved for debuging */ + M2M_WIFI_REQ_CUST_INFO_ELEMENT, + /*!< Request to add custom information to the Beacons IE. */ + M2M_WIFI_REQ_SCAN, + /*!< Request scan command. */ + M2M_WIFI_RESP_SCAN_DONE, + /*!< Response to notify scan complete. */ + M2M_WIFI_REQ_SCAN_RESULT, + /*!< Request for scan results. */ + M2M_WIFI_RESP_SCAN_RESULT, + /*!< Response to provide the scan results. */ + M2M_WIFI_REQ_SET_SCAN_OPTION, + /*!< Request to set scan options "slot time, slot number .. etc". */ + M2M_WIFI_REQ_SET_SCAN_REGION, + /*!< Request to set scan region. */ + M2M_WIFI_REQ_SET_POWER_PROFILE, + /*!< Request to set the Power Profile. */ + M2M_WIFI_REQ_SET_TX_POWER, + /*!< Request to set the TX Power. */ + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + /*!< Request to set the Battery Voltage. */ + M2M_WIFI_REQ_SET_ENABLE_LOGS, + /*!< Request to enable logs. */ + M2M_WIFI_REQ_GET_SYS_TIME, + /*!< Request to get system time. */ + M2M_WIFI_RESP_GET_SYS_TIME, + /*!< Response to retrieve the system time. */ + M2M_WIFI_REQ_SEND_ETHERNET_PACKET, + /*!< Request to send Ethernet packet in bypass mode. */ + M2M_WIFI_RESP_ETHERNET_RX_PACKET, + /*!< Response to receive an Ethernet packet in bypass mode. */ + M2M_WIFI_REQ_SET_MAC_MCAST, + /*!< Request to set multicast filters. */ + M2M_WIFI_REQ_BLE_API_SEND, + /*!< Request to send an Encapsulated BLE API MSG */ + M2M_WIFI_RESP_BLE_API_RECV, + /*!< Response to receive an Encapsulated BLE API MSG */ + M2M_WIFI_REQ_SET_GAIN_TABLE, + /*!< Request to use Gain table from Flash */ + M2M_WIFI_RESP_SET_GAIN_TABLE, + /*!< Response to fail to use Gain table from Flash */ + M2M_WIFI_REQ_PASSIVE_SCAN, + /*!< Request a passive scan. + */ + M2M_WIFI_MAX_CONFIG_ALL +}tenuM2mConfigCmd; + +/*! +@enum \ + tenuM2mStaCmd + +@brief + This enum contains all the WINC commands while in Station mode. +*/ +typedef enum { + M2M_WIFI_REQ_CONNECT = M2M_STA_CMD_BASE, + /*!< Request to connect with an specified AP. */ + M2M_WIFI_REQ_DEFAULT_CONNECT, + /*!< Request to connect with a cached AP. */ + M2M_WIFI_RESP_DEFAULT_CONNECT, + /*!< Response for the default connect.*/ + M2M_WIFI_REQ_DISCONNECT, + /*!< Request to disconnect from the AP. */ + M2M_WIFI_RESP_CON_STATE_CHANGED, + /*!< Response to indicate a change in the connection state. */ + M2M_WIFI_REQ_SLEEP, + /*!< Request to sleep. */ + M2M_WIFI_REQ_WPS_SCAN, + /*!< Request to WPS scan. */ + M2M_WIFI_REQ_WPS, + /*!< Request to start WPS. */ + M2M_WIFI_REQ_START_WPS, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_DISABLE_WPS, + /*!< Request to disable WPS. */ + M2M_WIFI_REQ_DHCP_CONF, + /*!< Response to indicate the obtained IP address.*/ + M2M_WIFI_RESP_IP_CONFIGURED, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_RESP_IP_CONFLICT, + /*!< Response to indicate a conflict in obtained IP address. + The user should re attempt the DHCP request. */ + M2M_WIFI_REQ_ENABLE_MONITORING, + /*!< Request to enable monitor mode. */ + M2M_WIFI_REQ_DISABLE_MONITORING, + /*!< Request to disable monitor mode. */ + M2M_WIFI_RESP_WIFI_RX_PACKET, + /*!< Response to indicate a packet was received in monitor mode. */ + M2M_WIFI_REQ_SEND_WIFI_PACKET, + /*!< Request to send a packet in monitor mode. */ + M2M_WIFI_REQ_LSN_INT, + /*!< Request to set the listen interval. */ + M2M_WIFI_REQ_DOZE, + /*!< Request to doze */ + M2M_WIFI_REQ_GET_PRNG, + /*!< Request PRNG. */ + M2M_WIFI_RESP_GET_PRNG, + /*!< Response for PRNG. */ + M2M_WIFI_MAX_STA_ALL, +} tenuM2mStaCmd; + +/*! +@enum \ + tenuM2mApCmd + +@brief + This enum contains all the WINC commands while in AP mode. +*/ +typedef enum { + M2M_WIFI_REQ_ENABLE_AP = M2M_AP_CMD_BASE, + /*!< Request to enable AP mode. */ + M2M_WIFI_REQ_DISABLE_AP, + /*!< Request to disable AP mode. */ + M2M_WIFI_MAX_AP_ALL, +}tenuM2mApCmd; + +/*! +@enum \ + tenuM2mP2pCmd + +@brief + This enum contains all the WINC commands while in P2P mode. +*/ +typedef enum { + M2M_WIFI_REQ_P2P_INT_CONNECT = M2M_P2P_CMD_BASE, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_ENABLE_P2P, + /*!< Request to enable P2P mode.*/ + M2M_WIFI_REQ_DISABLE_P2P, + /*!< Request to disable P2P mode. */ + M2M_WIFI_REQ_P2P_REPOST, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. + */ + M2M_WIFI_MAX_P2P_ALL, +}tenuM2mP2pCmd; + + +/*! +@enum \ + tenuM2mServerCmd + +@brief + These commands are currently not supported. +*/ +typedef enum { + M2M_WIFI_REQ_CLIENT_CTRL = M2M_SERVER_CMD_BASE, + /*!< Currently not supported.*/ + M2M_WIFI_RESP_CLIENT_INFO, + /*!< Currently not supported.*/ + M2M_WIFI_REQ_SERVER_INIT, + /*!< Currently not supported.*/ + M2M_WIFI_MAX_SERVER_ALL +}tenuM2mServerCmd; + + + + +/*! +@enum \ + tenuM2mIpCmd + +@brief + This enum contains all the WINC commands related to IP. +*/ +typedef enum { + M2M_IP_REQ_STATIC_IP_CONF = ((uint8) 10), + /*!< Request to set static IP.*/ + M2M_IP_REQ_ENABLE_DHCP, + /*!< Request to enable DHCP.*/ + M2M_IP_REQ_DISABLE_DHCP + /*!< Request to disable DHCP.*/ +} tenuM2mIpCmd; + +/*! +@enum \ + tenuM2mSigmaCmd + +@brief + This enum contains all the WINC commands related to Sigma. +*/ +typedef enum { + M2M_SIGMA_ENABLE = ((uint8) 3), + /*!< Enable Sigma.*/ + M2M_SIGMA_TA_START, + /*!< Start the traffic agent.*/ + M2M_SIGMA_TA_STATS, + /*!< Get traffic stadistics.*/ + M2M_SIGMA_TA_RECEIVE_STOP, + /*!< Stop receiving from the traffic agent.*/ + M2M_SIGMA_ICMP_ARP, + /*!< Send ARP.*/ + M2M_SIGMA_ICMP_RX, + /*!< Receive ICMP.*/ + M2M_SIGMA_ICMP_TX, + /*!< Transmit ICMP.*/ + M2M_SIGMA_UDP_TX, + /*!< Transmit UDP.*/ + M2M_SIGMA_UDP_TX_DEFER, + /*!< Transmit UDP defer.*/ + M2M_SIGMA_SECURITY_POLICY, + /*!< Set security policy.*/ + M2M_SIGMA_SET_SYSTIME + /*!< Set system time.*/ +} tenuM2mSigmaCmd; + +/*! +@enum \ + tenuM2mSslCmd + +@brief + This enum contains WINC commands related to TLS handshake. +*/ +typedef enum{ + M2M_SSL_REQ_CERT_VERIF, + M2M_SSL_REQ_ECC, + M2M_SSL_RESP_ECC, + M2M_SSL_RSV, + M2M_SSL_REQ_WRITE_OWN_CERTS, + M2M_SSL_REQ_SET_CS_LIST, + M2M_SSL_RESP_SET_CS_LIST, + M2M_SSL_RESP_WRITE_OWN_CERTS +}tenuM2mSslCmd; + + +/*! +@enum \ + tenuM2mConnState + +@brief + This enum contains all the Wi-Fi connection states. +*/ +typedef enum { + M2M_WIFI_DISCONNECTED = 0, + /*!< Wi-Fi state is disconnected. */ + M2M_WIFI_CONNECTED, + /*!< Wi-Fi state is connected. */ + M2M_WIFI_UNDEF = 0xff + /*!< Undefined Wi-Fi State. */ +}tenuM2mConnState; + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi security types. +*/ +typedef enum { + M2M_WIFI_SEC_INVALID = 0, + /*!< Invalid security type. */ + M2M_WIFI_SEC_OPEN, + /*!< Wi-Fi network is not secured. */ + M2M_WIFI_SEC_WPA_PSK, + /*!< Wi-Fi network is secured with WPA/WPA2 personal(PSK). */ + M2M_WIFI_SEC_WEP, + /*!< Security type WEP (40 or 104) OPEN OR SHARED. */ + M2M_WIFI_SEC_802_1X + /*!< Wi-Fi network is secured with WPA/WPA2 Enterprise.IEEE802.1x user-name/password authentication. */ +}tenuM2mSecType; + + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi SSID types. +*/ +typedef enum { + SSID_MODE_VISIBLE = 0, + /*!< SSID is visible to others. */ + SSID_MODE_HIDDEN + /*!< SSID is hidden. */ +}tenuM2mSsidMode; + +/*! +@enum \ + tenuM2mScanCh + +@brief + This enum contains all the Wi-Fi RF channels. +*/ +typedef enum { + M2M_WIFI_CH_1 = ((uint8) 1), + /*!< Channel 1. */ + M2M_WIFI_CH_2, + /*!< Channel 2. */ + M2M_WIFI_CH_3, + /*!< Channel 3. */ + M2M_WIFI_CH_4, + /*!< Channel 4. */ + M2M_WIFI_CH_5, + /*!< Channel 5. */ + M2M_WIFI_CH_6, + /*!< Channel 6. */ + M2M_WIFI_CH_7, + /*!< Channel 7. */ + M2M_WIFI_CH_8, + /*!< Channel 8. */ + M2M_WIFI_CH_9, + /*!< Channel 9. */ + M2M_WIFI_CH_10, + /*!< Channel 10. */ + M2M_WIFI_CH_11, + /*!< Channel 11. */ + M2M_WIFI_CH_12, + /*!< Channel 12. */ + M2M_WIFI_CH_13, + /*!< Channel 13. */ + M2M_WIFI_CH_14, + /*!< Channel 14. */ + M2M_WIFI_CH_ALL = ((uint8) 255) +}tenuM2mScanCh; + +/*! +@enum \ + tenuM2mScanRegion + +@brief + This enum contains all the Wi-Fi channel regions. +*/ +typedef enum { + REG_CH_1 = ((uint16) 1 << 0), + /*!< Region channel 1. */ + REG_CH_2 = ((uint16) 1 << 1), + /*!< Region channel 2. */ + REG_CH_3 = ((uint16) 1 << 2), + /*!< Region channel 3. */ + REG_CH_4 = ((uint16) 1 << 3), + /*!< Region channel 4. */ + REG_CH_5 = ((uint16) 1 << 4), + /*!< Region channel 5. */ + REG_CH_6 = ((uint16) 1 << 5), + /*!< Region channel 6. */ + REG_CH_7 = ((uint16) 1 << 6), + /*!< Region channel 7. */ + REG_CH_8 = ((uint16) 1 << 7), + /*!< Region channel 8. */ + REG_CH_9 = ((uint16) 1 << 8), + /*!< Region channel 9. */ + REG_CH_10 = ((uint16) 1 << 9), + /*!< Region channel 10. */ + REG_CH_11 = ((uint16) 1 << 10), + /*!< Region channel 11. */ + REG_CH_12 = ((uint16) 1 << 11), + /*!< Region channel 12. */ + REG_CH_13 = ((uint16) 1 << 12), + /*!< Region channel 13. */ + REG_CH_14 = ((uint16) 1 << 13), + /*!< Region channel 14. */ + REG_CH_ALL = ((uint16) 0x3FFF), + /*!< Region for all channels. */ + NORTH_AMERICA = ((uint16) 0x7FF), + /*!< North America region with 11 channels*/ + EUROPE = ((uint16) 0x1FFF), + /*!u8Status == M2M_SUCCESS) + { + m2m_wifi_connect((char*)pstrProvInfo->au8SSID, (uint8)strlen(pstrProvInfo->au8SSID), pstrProvInfo->u8SecType, + pstrProvInfo->au8Password, M2M_WIFI_CH_ALL); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8 bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 bEnableHttpRedirect); + +/*! +@fn \ + sint8 m2m_wifi_stop_provision_mode(void); + +@brief + Synchronous API for terminating provisioning mode on the WINC IC. + +@details + This function will terminate any currently active provisioning mode on the WINC IC, returning the + IC to idle. + +@return + The function returns ZERO for success and a negative value otherwise. + +@pre + An active provisioning session must be active before it is terminated through this function. +@see + m2m_wifi_start_provision_mode +*/ +NMI_API sint8 m2m_wifi_stop_provision_mode(void); + +/*! +@fn \ + sint8 m2m_wifi_get_connection_info(void); + +@brief + Asynchronous API for retrieving the WINC IC's connection status. + +@details + Requests the connection status from the WINC IC including information regarding any access + point to which it is currently connected, or any non-AP station that is connected to the WINC. + All information will be returned to the application via the Wi-Fi notifiction callback and the + event @ref M2M_WIFI_RESP_CONN_INFO. + + The connection info can be retrieved using the structure @ref tstrM2MConnInfo which contains: + - Connection Security + - Connection RSSI + - Remote MAC address + - Remote IP address + - SSID of the network (in cases where the WINC is in non-AP mode) + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the initialization + @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the + requested connection info. + +@warning + - In case of WINC AP mode or P2P mode, the SSID field shall be a NULL string. + +@see + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +\section WIFIExample2 Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API sint8 m2m_wifi_get_connection_info(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +@brief + Synchronous API for assigning a MAC address to the WINC IC. + +@details + This function is intended to allow non-production software to assign a MAC address to the WINC IC. + +@param [in] au8MacAddress + MAC Address to be provisioned to the WINC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is intended for development use only and not for use in production software. +*/ +NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char * pcPinNumber); + +@brief + Asynchronous API to engage the WINC IC's Wi-Fi Protected Setup (enrolee) function. + +@details + This function can be called to make the WINC enter WPS (Wi-Fi Protected Setup) mode. The result + is passed to the Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + +@param [in] u8TriggerType + WPS Trigger method. This may be: + - [WPS_PIN_TRIGGER](@ref WPS_PIN_TRIGGER) Push button method + - [WPS_PBC_TRIGGER](@ref WPS_PBC_TRIGGER) Pin method + +@param [in] pcPinNumber + Valid only if the u8TriggerType is WPS_PIN_TRIGGER, this parameter contains the PIN number. + The number must follow the format as given in the WSC1.0 specification. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is not supported in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the + [m2m_wifi_init](@ref m2m_wifi_init). + - The event [M2M_WIFI_REQ_WPS](@ref M2M_WIFI_REQ_WPS) must be handled in the callback to receive + the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be + performed. + - The [m2m_wifi_handle_events](@ref m2m_wifi_handle_events) MUST be called to receive the responses + in the callback. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +\section WIFIExample3 Example + The code snippet shows an example of how wifi WPS is triggered . +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch + 1); + + // establish Wi-Fi connection + m2m_wifi_connect((char*)pstrWPS->au8SSID, (uint8)m2m_strlen(pstrWPS->au8SSID), + pstrWPS->u8AuthType, pstrWPS->au8PSK, pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ + + +NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx); +/*! +@fn \ + NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx); + +@brief + Asynchronous API that notifies the WINC with the Gain Table index from Flash that should use to configure the WiFi and BLE gains. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char *pcPinNumber); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps_disable(void); + +@brief + Synchronous API that disables Wi-Fi Protected Setup mode in the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_wps_disable(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +@brief + Asynchronous API for enabling Wi-Fi Direct (P2P) mode in the WINC IC. + +@param [in] u8Channel + P2P Listen RF channel. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF + must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + - This function is not available in the WINC 3400 + - This function is not allowed in AP or STA modes. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +\section WIFIExample4 Example + The code snippet shows an example of how the p2p mode operates. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? "CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("P2P IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p_disconnect(void); + +@brief + Synchronous API to disable Wi-Fi Direct (P2P) Mode on the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_p2p +*/ +NMI_API sint8 m2m_wifi_p2p_disconnect(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC IC + +@details + The WINC IC supports the ability to operate as an access point with the limitation that: + - only 1 station may be associated at any one time + - open system and WEP are the only security suites supported. + +@param [in] pstrM2MAPConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +\section WIFIExample5 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_disable_ap(void); + +@brief + Synchronous API to disable access point mode on the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_enable_ap +*/ +NMI_API sint8 m2m_wifi_disable_ap(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@brief + Synchronous API to manually assign a (static) IP address to the WINC IC. + +@details + Typically an infrastructure access point will be able to provide an IP address to all clients + after they associate. The WINC will request configuration via DHCP automatically after + successfully connecting to an access point. This function should only be called in the event + that the network has no DHCP server and the application knows the specifics of the network. + +@param [in] pstrStaticIPConf + Pointer to a structure holding the static IP Configurations (IP, Gateway, subnet mask and + DNS address). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + The application must first call @ref m2m_wifi_enable_dhcp to request that DHCP functionality is + disabled prior to calling this function. + +@warning + Exercise caution using this function. DHCP is the preferred method for configuring IP addresses. + +@see + tstrM2MIPConfig +*/ +NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +@brief + Legacy (deprecated) Asynchronous API for starting a DHCP client on the WINC IC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC IC. + +@return + This function always returns @ref M2M_SUCCESS. + +@warning + - This function has been deprecated. DHCP is used automatically when the WINC IC connects. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +@brief + Legacy (deprecated) Asynchronous function to start a DHCP client on the WINC IC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC IC. + +@param [in] addr The address to issue to a connected client (only one client is supported) + +@return + This function always returns @ref M2M_SUCCESS. + +@warning + - This function has been deprecated. DHCP is used automatically when the WINC IC connects. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + +@brief + Asynchronous function to control the DHCP client functionality within the WINC IC. + +@details + This function allows the application to control the behaviour of the DHCP client function within + the WINC IC once it has associated with an access point. DHCP client functionality is enabled by + default. + +@param [in] u8DhcpEn + The state of the DHCP client feature after successful association with an access point: + - 0: DHCP client will be disabled after connection. + - 1: DHCP client will be enabled after connection. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@warning + - DHCP client is enabled by default + - This Function should be called to disable DHCP client operation before using @ref m2m_wifi_set_static_ip + +@see + m2m_wifi_set_static_ip() +*/ +NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + + +/*! +@fn \ + sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) + +@brief + Synchronous API for configuring the behaviour of the WINC IC's network scanning functions. + +@details + This function allows the application to tune the scanning behaviour of the WINC IC using the + parameters described in @ref tstrM2MScanOption. + +@param [in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption +*/ +NMI_API sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption); + +/*! +@fn \ + sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) + +@brief + Synchronous API for configuring the regulatory restrictions that may affect the WINC ICs + scanning behaviour. + +@details + This function sets a property called the scan region, a parameter that affects the range of + channels that the WINC IC may legally scan given a geographic region. + +@param [in] ScanRegion + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tenuM2mScanRegion + m2m_wifi_request_scan + +*/ +NMI_API sint8 m2m_wifi_set_scan_region(uint16 ScanRegion); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +@brief + Asynchronous API to request the WINC IC perform a scan for networks. + +@details + Scan statuses are delivered to the application via the Wi-Fi event callback (@ref tpfAppWifiCb) in + three stages. The first step involves the event @ref M2M_WIFI_RESP_SCAN_DONE which, if successful, + provides the number of detected networks (access points). The application must then read the list + of access points via multiple calls to the asynchronous @ref m2m_wifi_req_scan_result API. For + each call to this function, the application will receive (step three) the event + @ref M2M_WIFI_RESP_SCAN_RESULT. + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This API is valid only for STA mode, it may be called regardless of connection state (connected + or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registration of the callback is done via @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in + the (tpfAppWifiCb) callback. + - The @ref m2m_wifi_handle_events function must be called to receive the responses in the + callback. + +@see M2M_WIFI_RESP_SCAN_DONE +@see M2M_WIFI_RESP_SCAN_RESULT +@see tpfAppWifiCb +@see tstrM2mWifiscanResult +@see tenuM2mScanCh +@see m2m_wifi_init +@see m2m_wifi_handle_events +@see m2m_wifi_req_scan_result + +\section WIFIExample6 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +/*! +@fn \ + sint8 m2m_wifi_request_scan_passive(uint8 ch); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see m2m_wifi_request_scan +@see M2M_WIFI_RESP_SCAN_DONE +@see M2M_WIFI_RESP_SCAN_RESULT +@see tpfAppWifiCb +@see tstrM2MScanOption +@see tstrM2mWifiscanResult +@see tenuM2mScanCh +@see m2m_wifi_init +@see m2m_wifi_handle_events +@see m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_request_scan_passive(uint8 ch); + +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +@brief + Synchronous API to retrieve the number of AP's found during the last scan operation. + +@details + This function allows the application to recover the number of access points discovered during + the most recent scan activity. This is achieved via a global variable in the WINC driver that + is populated when receiving the M2M_WIFI_RESP_SCAN_DONE event. + +@return + Return the number of AP's found in the last Scan Request. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + +@pre + - m2m_wifi_request_scan must be called first to ensure up to date results are available. + +@warning + - This function must be called only in the wi-fi callback function when the events + @ref M2M_WIFI_RESP_SCAN_DONE or @ref M2M_WIFI_RESP_SCAN_RESULT are received. Calling this + function in any other place may result in undefined/outdated numbers. + +\section WIFIExample7 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); + +@brief + Asynchronous API to request the information of an access point discovered via scanning. + +@details + This function allows the information of any discovered access point to be retrieved. When a + scan is completed, the application is informed of the number of networks (access points) + discovered. Calling this function with an index, N, will return the information for the Nth + access point. The information will be returned to the application via a + @ref M2M_WIFI_RESP_SCAN_RESULT event, and the response data may be obtained through casting + the pointer (pvMsg) to @ref tstrM2mWifiscanResult. + +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre + - @ref m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb must be implemented and registered + in order to receive scan data after calling this function. Registration of the callback + is done via the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the + requested connection information. + +@warning + - This API is valid only for STA mode, it may be called regardless of connection state (connected + or disconnected). + - Calling this function without first issuing a scan request may lead to stale data being + recovered. + - Application code should refrain from introducing significant delays between issuing the scan + request and scan result requests. + +\section WIFIExample8 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); + +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); + +@brief + Asynchronous API to request the current Receive Signal Strength (RSSI) of the current connection. + +@details + This function will result in the application receiving the RSSI via a + @ref M2M_WIFI_RESP_CURRENT_RSSI event. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback. + +\section WIFIExample9 Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of event received in the callback. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + sint8 *rssi = (sint8*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_curr_rssi(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_restrict_ble(void); + +@brief + Asynchronous API to request restricting of BLE functionality by placing the BLE processor in a low power state. + It is recommended to do this if it is know that BLE functionality will not be used for any significant length of time. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + +*/ +NMI_API sint8 m2m_wifi_req_restrict_ble(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_unrestrict_ble(void); + +@brief + Asynchronous API to request un-restricting of BLE functionality by reverting the BLE processor to full power mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + +*/ +NMI_API sint8 m2m_wifi_req_unrestrict_ble(void); + +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +@brief + Synchronous API to query the MAC address programmed into the WINC ICs OTP memory + +@details + This function attempts to read the device's MAC address from the One Time Programmable (OTP) + memory on the IC. The presence (yes or no) of a MAC address in the OTP memory and, in the case + of it being present, its value are returned via RAM pointed to by the input arguments. + +@param [out] pu8MacAddr + Output MAC address buffer 6 bytes in size. This is valid only if *pu8Valid equals 1. + +@param [out] pu8IsValid + A boolean value set by the callee to indicate the validity of pu8MacAddr in OTP. If no MAC has + been programmed in the OTP the value of this parameter will be zero; otherwise it will be + non-zero. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_get_mac_address + +*/ +NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) + +@brief + Synchronous API to retrieve the MAC address currently in use on the device. + +@details + This function obtains the MAC address that is currently in use by the device. If the function + returns with @ref M2M_SUCCESS then the content of the memory referenced by pu8MacAddr will be + populated with the 6 byte MAC address; otherwise, that memory will be left unchanged. + +@param [out] pu8MacAddr + Pointer to a buffer in memory containing a 6-byte MAC address (provided function returns + MEM_SUCCESS) + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + m2m_wifi_get_otp_mac_address +*/ +NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr); + +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); + +@brief + Synchronous API to set the power-save mode of the WINC IC. + +@param [in] PsTyp + Desired power saving mode. Supported types are defined in @ref tenuPowerSaveModes. + +@param [in] BcastEn + Broadcast reception enable flag. + - If set to 1, the WINC IC will wake for each DTIM beacon to ensure broadcast traffic can be + received. + - If set to 0, the WINC IC will not wakeup at the DTIM beacon, instead it will wake every N + beacon periods as per the negotiated Listen Interval. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + tenuPowerSaveModes + m2m_wifi_get_sleep_mode +*/ +NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); + +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); + +@brief + Asynchronous API to place the WINC IC into sleep mode for a specified period of time. + +@details + This function allows a WINC IC that is running in M2M_PS_MANUAL mode to be placed into sleep + state for a specified period of time (measured in milliseconds). + +@param [in] u32SlpReqTime + The time in ms that the WINC IC should sleep for + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + - This API is currently unsupported on the WINC3400 + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); + +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); + +@brief + Synchronous API to retrieve the current power save mode of the WINC IC. + +@return + The current operating power saving mode. The value will be one of those from the enumerated type + @ref tenuPowerSaveModes. + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +NMI_API uint8 m2m_wifi_get_sleep_mode(void); + +#if 0 +/* + * These two functions are for a mode in which two WINC ICs communicate with each other + * via probe request and probe response frames. This mode is not supported in WINC fw. + */ +NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +#endif + +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); + +@brief + Asynchronous API to set the Wi-Fi Direct "Device Name" of the WINC IC + +@param [in] pu8DeviceName + Buffer holding the device name. + +@param [in] u8DeviceNameLength + Length of the device name. Should not exceed the maximum device name's length M2M_DEVICE_NAME_MAX. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); + +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@brief + Asynchronous API to set Wi-Fi listen interval for power save operation. + +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + The function @ref m2m_wifi_set_sleep_mode shall be called first + +@see + - tstrM2mLsnInt + - m2m_wifi_set_sleep_mode +*/ +NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8 *, uint16 , uint16); + +@brief + Asynchronous call to enable Wi-Fi monitoring (promiscuous receive) mode. + +@details + This function places the reciver into a mode where all frames (or those matching a set of filter + criteria) received on air are passed to the application. + + A dedicated callback function, @ref tpfAppMonCb, must be registered to handle frames received in + promiscuous mode. This is done via an instance of a @ref tstrWifiInitParam structure and a call to + the @ref m2m_wifi_init function. + +@param [in] pstrMtrCtrl + Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the Filtering parameters. + +@param [in] pu8PayloadBuffer + Pointer to a Buffer allocated by the application. The buffer SHALL hold the Data field of + the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + be discarded by the monitoring driver. + +@param [in] u16BufferSize + The total size of the pu8PayloadBuffer in bytes. + +@param [in] u16DataOffset + Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + in reading specific information from the received packet. It must assign the offset to the starting + position of it relative to the DATA payload start.\n + \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ + \e packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This mode available as sniffer ONLY, you can not be connected in any modes (Station, Access Point, + or P2P). + + @see + - tstrM2MWifiMonitorModeCtrl + - tstrM2MWifiRxPacketInfo + - tstrWifiInitParam + - tenuM2mScanCh + - m2m_wifi_disable_monitoring_mode + +\section WIFIExample10 Example + The example demonstrates the main function where-by the monitoring enable function is called after + the initialization of the driver and the packets are handled in the callback function. + +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + //Declare receive buffer + uint8 gmgmt[1600]; + + //Callback functions + void wifi_cb(uint8 u8WiFiEvent, void * pvMsg) + { + ; + } + + void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize) + { + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } + } + + int main() + { + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; + } +@endcode +*/ +NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset); + +/*! +@fn NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + +@brief + Asynchronous API to disable Wi-Fi monitoring (promiscuous receive) mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + */ +NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + +/*! +@fn NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *, uint16, uint16); + +@brief + Asynchronous API to queue a raw Wi-Fi packet for transmission by the WINC IC. + +@param [in] pu8WlanPacket + Pointer to a buffer holding the whole WIFI frame. + +@param [in] u16WlanHeaderLength + The size of the WIFI packet header ONLY. + +@param [in] u16WlanPktSize + The size of the whole bytes in packet. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_monitoring_mode + - m2m_wifi_disable_monitoring_mode + +@warning + This function is only available in builds supporting monitoring mode. +*/ +NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize); + +/*! +@fn NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) + +@brief + Asynchronous API to queue an Ethernet packet for transmission by the WINC IC. + +@param [in] pu8Packet + Pointer to a buffer holding the whole Ethernet frame. + +@param [in] u16PacketSize + The size of the whole bytes in packet. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_monitoring_mode + - m2m_wifi_disable_monitoring_mode + +@warning + This function is only available in builds supporting monitoring mode. +*/ +NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_sntp(uint8); + +@brief + Asynchronous API to enable or disable the SNTP client running on the WINC IC. + +@details + The SNTP client is enabled by default during chip initialisation. This function can be used to + disable or subsequently re-enable the service. + + The service is capable of syncrhonising the WINC's system clock to the UTC time from a well-known + (and trusted) time server, for example "time.nist.gov". By default the SNTP client will update the + system time once every 24 hours. The ability to track the time accurately is important for various + applications such as checking expiry of X509 certificates during TLS session establishment. + + It is highly recommended to leave SNTP enabled if there is no alternative source of timing + information. For systems including an RTC device, SNTP may not be needed and the WINC IC's time + may be set using the @ref m2m_wifi_set_sytem_time function. + +@param [in] bEnable + Enables or disables the SNTP service + - '0' : disable SNTP + - '1' : enable SNTP + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see m2m_wifi_set_sytem_time + */ +NMI_API sint8 m2m_wifi_enable_sntp(uint8 bEnable); + +/*! +@fn NMI_API sint8 m2m_wifi_set_sytem_time(uint32); + +@brief + Asynchronous function for setting the system time within the WINC IC. + +@param [in] u32UTCSeconds + UTC value in seconds. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_sntp + - tstrSystemTime + +@note + If there is an RTC on the host MCU, the SNTP may be disabled and the host may set the system + time within the firmware using the API @ref m2m_wifi_set_sytem_time. + */ +NMI_API sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds); + +/*! +@fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + +@brief + Asynchronous API to obtain the system time in use by the WINC IC. + +@details + This function will request that the WINC IC send it's current system time to the application. The + information will arrive at the application via the @ref tpfAppWifiCb and event @ref + M2M_WIFI_RESP_GET_SYS_TIME. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + - The event @ref M2M_WIFI_RESP_GET_SYS_TIME must be handled in the callback. + +@see + - m2m_wifi_enable_sntp + - tstrSystemTime + */ +NMI_API sint8 m2m_wifi_get_sytem_time(void); + +/*! +@fn NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8*); + +@brief + Asynchronous API to add or remove a user-defined Information Element + +@details + This function allows the application to provide a custom Information Element to the WINC IC that will + be included in all beacon and probe response frames. + +@param [in] pau8M2mCustInfoElement + Pointer to Buffer containing the IE to be used. If null, this removes any current custom IE. If + non-null, the pointer must reference data in the following format: + +@verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- ---------------------- + | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- --------|-----------|------------------| + | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- ---------------------- +@endverbatim + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + - Size of All elements combined must not exceed 255 byte.\n + - Used in Access Point Mode \n + +\section WIFIExample11 Example + The example demonstrates how the information elements are set using this function. +@code + char elementData[21]; + static char state = 0; // To Add, Append, and Delete + if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; + } else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; + } else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; + } + m2m_wifi_set_cust_InfoElement(elementData); +@endcode + */ +NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8* pau8M2mCustInfoElement); + +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); + +@brief Change the power profile mode + +@param [in] u8PwrMode + Change the WINC power profile to one of the modes: PWR_LOW1, PWR_LOW2, PWR_HIGH, PWR_AUTO. + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mPwrMode + +@warning + May only be called after initialization, before any connection request, and may not be used to change + the power mode thereafter. +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); + +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); + +@brief set the TX power tenuM2mTxPwrLevel + +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@sa tenuM2mTxPwrLevel +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); + +@brief + Enable or Disable logs in run time (Disable Firmware logs will enhance the firmware start-up time + and performance) + +@param [in] u8Enable + Set 1 to enable the logs 0 for disable + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint8 u8BattVolt) + +@brief + Set the battery voltage to update the firmware calculations + +@param [in] dbBattVolt + Battery Voltage + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); + +/*! +@fn NMI_API sint8 m2m_wifi_ble_api_send(const uint8* const msg, const uint32 len); + +@brief + Asynchronous API to send an encapsulated Atmel BLE message over the Wifi Host Interface + +@param [in] msg + Pointer to the start of the BLE message to transfer down to the WINC + +@param [in] len + The length of the message in octets + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_ble_api_send(uint8* msg, uint32 len); + + +/*! +@fn NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *, uint8); + +@brief + Asynchronous API to add or remove MAC addresses in the multicast filter + +@details + This function allows the application to configure the capability of the WINC IC to receive multicast + packets when operating in bypass mode. + +@param [in] pu8MulticastMacAddress + Pointer to MAC address + +@param [in] u8AddRemove + A flag to add or remove the MAC ADDRESS, based on the following values: + - 0 : remove MAC address + - 1 : add MAC address + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@note + Maximum number of MAC addresses that could be added is 8. + +@warning + This functionality is not supported by current WINC firmware. + */ +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove); + +/*! +@fn NMI_API sint8 m2m_wifi_set_receive_buffer(void *, uint16); + +@brief + Asynchronous API to set or change the size of the WINC IC's receive buffer + +@param [in] pvBuffer + Pointer to Buffer to receive data. A NULL pointer causes a negative error @ref M2M_ERR_FAIL. + +@param [in] u16BufferLen + Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + defined as @ref SOCKET_BUFFER_MAX_LENGTH + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This functionality is not supported by current WINC firmware. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +/**@}*/ + +/**@defgroup VERSIONAPI Functions + @ingroup VERSION + */ +/**@{*/ + + +/*! +@fn uint32 m2m_wifi_get_chipId(void) + +@brief + Synchronous API to obtain the firmware WINC chip ID + +@return + The function SHALL return chipID > 0 or 0 for failure. +*/ +uint32 m2m_wifi_get_chipId(void); +/*! +@fn sint8 m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +sint8 m2m_wifi_check_ota_rb(void); +/*! +@fn sint8 m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +/**@}*/ + +/*! + * @fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PRNGBuff,uint16 u16PRNGSize) + * @param [in] pu8PrngBuff + * Pointer to Buffer to receive data. + * Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + * causes a negative error @ref M2M_ERR_FAIL. + * @param [in] u16PrngSize + request size in bytes + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ + diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_ate_mode.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_ate_mode.c new file mode 100644 index 0000000..0f2964a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_ate_mode.c @@ -0,0 +1,771 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherials Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_ate_mode.h" +#include "driver/source/nmasic.h" +#include "driver/source/nmdrv.h" +#include "m2m_hif.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define rInterrupt_CORTUS_0 (0x10a8) +#define rInterrupt_CORTUS_1 (0x10ac) +#define rInterrupt_CORTUS_2 (0x10b0) + +#define rBurstTx_NMI_TX_RATE (0x161d00) +#define rBurstTx_NMI_NUM_TX_FRAMES (0x161d04) +#define rBurstTx_NMI_TX_FRAME_LEN (0x161d08) +#define rBurstTx_NMI_TX_CW_PARAM (0x161d0c) +#define rBurstTx_NMI_TX_GAIN (0x161d10) +#define rBurstTx_NMI_TX_DPD_CTRL (0x161d14) +#define rBurstTx_NMI_USE_PMU (0x161d18) +#define rBurstTx_NMI_TEST_CH (0x161d1c) +#define rBurstTx_NMI_TX_PHY_CONT (0x161d20) +#define rBurstTx_NMI_TX_CW_MODE (0x161d24) +#define rBurstTx_NMI_TEST_XO_OFF (0x161d28) +#define rBurstTx_NMI_USE_EFUSE_XO_OFF (0x161d2c) + +#define rBurstTx_NMI_MAC_FILTER_ENABLE_DA (0x161d30) +#define rBurstTx_NMI_MAC_ADDR_LO_PEER (0x161d34) +#define rBurstTx_NMI_MAC_ADDR_LO_SELF (0x161d38) +#define rBurstTx_NMI_MAC_ADDR_HI_PEER (0x161d3c) +#define rBurstTx_NMI_MAC_ADDR_HI_SELF (0x161d40) +#define rBurstTx_NMI_RX_PKT_CNT_SUCCESS (0x161d44) +#define rBurstTx_NMI_RX_PKT_CNT_FAIL (0x161d48) +#define rBurstTx_NMI_SET_SELF_MAC_ADDR (0x161d4c) +#define rBurstTx_NMI_MAC_ADDR_LO_SA (0x161d50) +#define rBurstTx_NMI_MAC_ADDR_HI_SA (0x161d54) +#define rBurstTx_NMI_MAC_FILTER_ENABLE_SA (0x161d58) + +#define rBurstRx_NMI_RX_ALL_PKTS_CONT (0x9898) +#define rBurstRx_NMI_RX_ERR_PKTS_CONT (0x988c) + +#define TX_DGAIN_MAX_NUM_REGS (4) +#define TX_DGAIN_REG_BASE_ADDRESS (0x1240) +#define TX_GAIN_CODE_MAX_NUM_REGS (3) +#define TX_GAIN_CODE_BASE_ADDRESS (0x1250) +#define TX_PA_MAX_NUM_REGS (3) +#define TX_PA_BASE_ADDRESS (0x1e58) +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +VARIABLES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +volatile static uint8 gu8AteIsRunning = 0; /*!< ATE firmware status, 1 means ATE is running otherwise stopped */ +volatile static uint8 gu8RxState = 0; /*!< RX status, 1 means Rx is running otherwise stopped */ +volatile static uint8 gu8TxState = 0; /*!< TX status, 1 means Tx is running otherwise stopped */ +volatile static uint32 gaAteFwTxRates[M2M_ATE_MAX_NUM_OF_RATES] = +{ + 0x01, 0x02, 0x05, 0x0B, /*B-Rats*/ + 0x06, 0x09, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x36, /*G-Rats*/ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 /*N-Rats*/ +}; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static void m2m_ate_set_rx_status(uint8 u8Value) +{ + gu8RxState = u8Value; +} + +static void m2m_ate_set_tx_status(uint8 u8Value) +{ + gu8TxState = u8Value; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(uint32 req_serial_number) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_CONFIG; + + s8Ret = nm_drv_init(&u8WifiMode, req_serial_number); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void) +{ + return nm_drv_deinit(NULL); +} + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8 u8State) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32_t u32Val = 0; + + if((M2M_ATE_FW_STATE_STOP == u8State) && (M2M_ATE_FW_STATE_STOP != gu8AteIsRunning)) + { + u32Val = nm_read_reg(rNMI_GLB_RESET); + u32Val &= ~(1 << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + gu8AteIsRunning = M2M_ATE_FW_STATE_STOP; + } + else if((M2M_ATE_FW_STATE_RUN == u8State) && (M2M_ATE_FW_STATE_RUN != gu8AteIsRunning)) + { + /* 0x1118[0]=0 at power-on-reset: pad-based control. */ + /* Switch cortus reset register to register control. 0x1118[0]=1. */ + u32Val = nm_read_reg(rNMI_BOOT_RESET_MUX); + u32Val |= (1 << 0); + s8Ret = nm_write_reg(rNMI_BOOT_RESET_MUX, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + /** + Write the firmware download complete magic value 0x10ADD09E at + location 0xFFFF000C (Cortus map) or C000C (AHB map). + This will let the boot-rom code execute from RAM. + **/ + s8Ret = nm_write_reg(0xc0000, 0x71); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + + u32Val = nm_read_reg(rNMI_GLB_RESET); + if((u32Val & (1ul << 10)) == (1ul << 10)) + { + u32Val &= ~(1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + } + + u32Val |= (1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + gu8AteIsRunning = M2M_ATE_FW_STATE_RUN; + } + else + { + s8Ret = M2M_ATE_ERR_UNHANDLED_CASE; + } + +__EXIT: + if((M2M_SUCCESS == s8Ret) && (M2M_ATE_FW_STATE_RUN == gu8AteIsRunning)) + { + nm_bsp_sleep(500); /*wait for ATE firmware start up*/ + } + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void) +{ + return gu8AteIsRunning; +} + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8 u8Index) +{ + if(M2M_ATE_MAX_NUM_OF_RATES <= u8Index) + { + return 0; + } + return gaAteFwTxRates[u8Index]; +} + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void) +{ + return gu8TxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx * strM2mAteTx) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8LoopCntr = 0; + uint32_t val32; + + + if(NULL == strM2mAteTx) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if(0 != m2m_ate_get_rx_status()) + { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if( (strM2mAteTx->channel_num < M2M_ATE_CHANNEL_1) || + (strM2mAteTx->channel_num > M2M_ATE_CHANNEL_14) || + (strM2mAteTx->tx_gain_sel < M2M_ATE_TX_GAIN_DYNAMIC) || + (strM2mAteTx->tx_gain_sel > M2M_ATE_TX_GAIN_TELEC) || + (strM2mAteTx->frame_len > M2M_ATE_MAX_FRAME_LENGTH) || + (strM2mAteTx->frame_len < M2M_ATE_MIN_FRAME_LENGTH) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if( (strM2mAteTx->duty_cycle < M2M_ATE_TX_DUTY_MAX_VALUE /*1*/) || + (strM2mAteTx->duty_cycle > M2M_ATE_TX_DUTY_MIN_VALUE /*10*/ ) || + (strM2mAteTx->dpd_ctrl < M2M_ATE_TX_DPD_DYNAMIC) || + (strM2mAteTx->dpd_ctrl > M2M_ATE_TX_DPD_ENABLED) || + (strM2mAteTx->use_pmu < M2M_ATE_PMU_DISBLE) || + (strM2mAteTx->use_pmu > M2M_ATE_PMU_ENABLE) || + (strM2mAteTx->phy_burst_tx < M2M_ATE_TX_SRC_MAC) || + (strM2mAteTx->phy_burst_tx > M2M_ATE_TX_SRC_PHY) || + (strM2mAteTx->cw_tx < M2M_ATE_TX_MODE_NORM) || + (strM2mAteTx->cw_tx > M2M_ATE_TX_MODE_CW) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + for(u8LoopCntr=0; u8LoopCntrdata_rate) + { + break; + } + } + + if(M2M_ATE_MAX_NUM_OF_RATES == u8LoopCntr) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + + + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteTx->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_PHY_CONT, strM2mAteTx->phy_burst_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_NUM_TX_FRAMES, strM2mAteTx->num_frames); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_GAIN, strM2mAteTx->tx_gain_sel); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteTx->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_FRAME_LEN, strM2mAteTx->frame_len); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_PARAM, strM2mAteTx->duty_cycle); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_DPD_CTRL, strM2mAteTx->dpd_ctrl); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_RATE, strM2mAteTx->data_rate); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_MODE, strM2mAteTx->cw_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteTx->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteTx->use_efuse_xo_offset); + + val32 = strM2mAteTx->peer_mac_addr[5] << 0; + val32 |= strM2mAteTx->peer_mac_addr[4] << 8; + val32 |= strM2mAteTx->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_PEER, val32 ); + + val32 = strM2mAteTx->peer_mac_addr[2] << 0; + val32 |= strM2mAteTx->peer_mac_addr[1] << 8; + val32 |= strM2mAteTx->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_PEER, val32 ); + + if(M2M_SUCCESS == s8Ret) + { + s8Ret += nm_write_reg(rInterrupt_CORTUS_0, 1); /*Interrupt Cortus*/ + m2m_ate_set_tx_status(1); + nm_bsp_sleep(200); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_write_reg(rInterrupt_CORTUS_1, 1); + if(M2M_SUCCESS == s8Ret) + { + m2m_ate_set_tx_status(0); + } + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void) +{ + return gu8RxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx * strM2mAteRxStr) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32 val32; + if(NULL == strM2mAteRxStr) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if(0 != m2m_ate_get_rx_status()) + { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if( (strM2mAteRxStr->channel_num < M2M_ATE_CHANNEL_1) || + (strM2mAteRxStr->channel_num > M2M_ATE_CHANNEL_14)|| + (strM2mAteRxStr->use_pmu < M2M_ATE_PMU_DISBLE) || + (strM2mAteRxStr->use_pmu > M2M_ATE_PMU_ENABLE) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteRxStr->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteRxStr->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteRxStr->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteRxStr->use_efuse_xo_offset); + + if(strM2mAteRxStr->override_self_mac_addr) + { + val32 = strM2mAteRxStr->self_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SELF, val32 ); + + val32 = strM2mAteRxStr->self_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SELF, val32 ); + } + + if(strM2mAteRxStr->mac_filter_en_sa) + { + val32 = strM2mAteRxStr->sa_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->sa_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->sa_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SA, val32 ); + + val32 = strM2mAteRxStr->sa_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->sa_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->sa_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SA, val32 ); + } + + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA, strM2mAteRxStr->mac_filter_en_da); + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA, strM2mAteRxStr->mac_filter_en_sa); + nm_write_reg(rBurstTx_NMI_SET_SELF_MAC_ADDR, strM2mAteRxStr->override_self_mac_addr); + + if(M2M_SUCCESS == s8Ret) + { + s8Ret += nm_write_reg(rInterrupt_CORTUS_2, 1); /*Interrupt Cortus*/ + m2m_ate_set_rx_status(1); + nm_bsp_sleep(10); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void) +{ + m2m_ate_set_rx_status(0); + nm_bsp_sleep(200); /*Recommended*/ + return M2M_SUCCESS; +} + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *strM2mAteRxStatus) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(NULL == strM2mAteRxStatus) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA) || nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA)) + { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS) + nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + strM2mAteRxStatus->num_good_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + } + else + { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstRx_NMI_RX_ALL_PKTS_CONT) + nm_read_reg(0x989c); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstRx_NMI_RX_ERR_PKTS_CONT); + strM2mAteRxStatus->num_good_pkts = strM2mAteRxStatus->num_rx_pkts - strM2mAteRxStatus->num_err_pkts; + } + +__EXIT: + return s8Ret; +} +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB) +{ + uint32_t dGain, val32; + dGain = (uint32_t)(pow(10, dGaindB/20.0) * 1024.0); + + val32 = nm_read_reg(0x160cd0); + val32 &= ~(0x1ffful << 0); + val32 |= (((uint32_t)dGain) << 0); + nm_write_reg(0x160cd0, val32); + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * pdGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * pdGaindB + The retrieved digital gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double * pdGaindB) +{ + uint32 dGain, val32; + + if(!pdGaindB) return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x160cd0); + + dGain = (val32 >> 0) & 0x1ffful; + *pdGaindB = 20.0*log10((double)dGain / 1024.0); + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(uint32 *paGain) + +@brief + This function is used to get the pa gain + +@param [out] uint32 *paGain + The retrieved pa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(uint32 *paGain) +{ + uint32 val32; + + if(!paGain) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1e9c); + + * paGain = (val32 >> 8) & 0x3f; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) + +@brief + This function is used to get the ppa gain + +@param [out] uint32 * ppaGain + The retrieved ppa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) +{ + uint32 val32; + + if(!ppaGain) return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1ea0); + + * ppaGain = (val32 >> 5) & 0x7; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * pTotGaindB) + +@brief + This function is used to calculate the total gain + +@param [out] double * pTotGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, pa and ppa gain values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double * pTotGaindB) +{ + double totGaindB, dGaindB; + uint32 paGain,ppaGain,m_cmbPAGainStep,m_cmbPPAGainStep; + + + m2m_ate_get_pa_gain(&paGain); + m2m_ate_get_ppa_gain(&ppaGain); + m2m_ate_get_dig_gain(&dGaindB); + + switch(paGain){ + case 0x1: + m_cmbPAGainStep = 5; + break; + case 0x3: + m_cmbPAGainStep = 4; + break; + case 0x7: + m_cmbPAGainStep = 3; + break; + case 0xf: + m_cmbPAGainStep = 2; + break; + case 0x1f: + m_cmbPAGainStep = 1; + break; + case 0x3f: + m_cmbPAGainStep = 0; + break; + default: + m_cmbPAGainStep = 0; + break; + } + + + switch(ppaGain){ + case 0x1: + m_cmbPPAGainStep = 2; + break; + case 0x3: + m_cmbPPAGainStep = 1; + break; + case 0x7: + m_cmbPPAGainStep = 0; + break; + default: + m_cmbPPAGainStep = 3; + break; + } + + totGaindB = dGaindB + 18 - m_cmbPAGainStep*3; + totGaindB += 9 - m_cmbPPAGainStep*3; + + *pTotGaindB = totGaindB; + + return M2M_SUCCESS; +} +#endif //_M2M_ATE_FW_ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_crypto.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_crypto.c new file mode 100644 index 0000000..620d6ee --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_crypto.c @@ -0,0 +1,686 @@ +/** + * + * \file m2m_crypto.c + * + * \brief WINC Crypto module. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_crypto.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +#ifdef CONF_CRYPTO + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*======*======*======*======*======*=======* +* WINC SHA256 HW Engine Register Definition * +*======*======*======*======*======*========*/ + +#define SHA_BLOCK_SIZE (64) + +#define SHARED_MEM_BASE (0xd0000) + + +#define SHA256_MEM_BASE (0x180000UL) +#define SHA256_ENGINE_ADDR (0x180000ul) + +/* SHA256 Registers */ +#define SHA256_CTRL (SHA256_MEM_BASE+0x00) +#define SHA256_CTRL_START_CALC_MASK (NBIT0) +#define SHA256_CTRL_START_CALC_SHIFT (0) +#define SHA256_CTRL_PREPROCESS_MASK (NBIT1) +#define SHA256_CTRL_PREPROCESS_SHIFT (1) +#define SHA256_CTRL_HASH_HASH_MASK (NBIT2) +#define SHA256_CTRL_HASH_HASH_SHIFT (2) +#define SHA256_CTRL_INIT_SHA256_STATE_MASK (NBIT3) +#define SHA256_CTRL_INIT_SHA256_STATE_SHIFT (3) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_MASK (NBIT4) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_SHIFT (4) +#define SHA256_CTRL_FORCE_SHA256_QUIT_MASK (NBIT5) +#define SHA256_CTRL_FORCE_SHA256_QUIT_SHIFT (5) + +#define SHA256_REGS_SHA256_CTRL_AHB_BYTE_REV_EN (NBIT6) +#define SHA256_REGS_SHA256_CTRL_RESERVED (NBIT7) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO (NBIT8+ NBIT9+ NBIT10) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_MASK (NBIT2+ NBIT1+ NBIT0) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_SHIFT (8) +#define SHA256_REGS_SHA256_CTRL_RESERVED_11 (NBIT11) +#define SHA256_REGS_SHA256_CTRL_SHA1_CALC (NBIT12) +#define SHA256_REGS_SHA256_CTRL_PBKDF2_SHA1_CALC (NBIT13) + + +#define SHA256_START_RD_ADDR (SHA256_MEM_BASE+0x04UL) +#define SHA256_DATA_LENGTH (SHA256_MEM_BASE+0x08UL) +#define SHA256_START_WR_ADDR (SHA256_MEM_BASE+0x0cUL) +#define SHA256_COND_CHK_CTRL (SHA256_MEM_BASE+0x10) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_MASK (NBIT1 | NBIT0) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_SHIFT (0) +#define SHA256_COND_CHK_CTRL_STEP_VAL_MASK (NBIT6 | NBIT5 | NBIT4 | NBIT3 | NBIT2) +#define SHA256_COND_CHK_CTRL_STEP_VAL_SHIFT (2) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_MASK (NBIT7) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_SHIFT (7) + +#define SHA256_MOD_DATA_RANGE (SHA256_MEM_BASE+0x14) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_MASK (NBIT24-1) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_SHIFT (0) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_MASK (NBIT24 | NBIT25| NBIT26) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_SHIFT (24) + + +#define SHA256_COND_CHK_STS_1 (SHA256_MEM_BASE+0x18) +#define SHA256_COND_CHK_STS_2 (SHA256_MEM_BASE+0x1c) +#define SHA256_DONE_INTR_ENABLE (SHA256_MEM_BASE+0x20) +#define SHA256_DONE_INTR_STS (SHA256_MEM_BASE+0x24) +#define SHA256_TARGET_HASH_H1 (SHA256_MEM_BASE+0x28) +#define SHA256_TARGET_HASH_H2 (SHA256_MEM_BASE+0x2c) +#define SHA256_TARGET_HASH_H3 (SHA256_MEM_BASE+0x30) +#define SHA256_TARGET_HASH_H4 (SHA256_MEM_BASE+0x34) +#define SHA256_TARGET_HASH_H5 (SHA256_MEM_BASE+0x38) +#define SHA256_TARGET_HASH_H6 (SHA256_MEM_BASE+0x3c) +#define SHA256_TARGET_HASH_H7 (SHA256_MEM_BASE+0x40) +#define SHA256_TARGET_HASH_H8 (SHA256_MEM_BASE+0x44) + +/*======*======*======*======*======*=======* +* WINC BIGINT HW Engine Register Definition * +*======*======*======*======*======*========*/ + + +#define BIGINT_ENGINE_ADDR (0x180080ul) +#define BIGINT_VERSION (BIGINT_ENGINE_ADDR + 0x00) + +#define BIGINT_MISC_CTRL (BIGINT_ENGINE_ADDR + 0x04) +#define BIGINT_MISC_CTRL_CTL_START (NBIT0) +#define BIGINT_MISC_CTRL_CTL_RESET (NBIT1) +#define BIGINT_MISC_CTRL_CTL_MSW_FIRST (NBIT2) +#define BIGINT_MISC_CTRL_CTL_SWAP_BYTE_ORDER (NBIT3) +#define BIGINT_MISC_CTRL_CTL_FORCE_BARRETT (NBIT4) +#define BIGINT_MISC_CTRL_CTL_M_PRIME_VALID (NBIT5) + +#define BIGINT_M_PRIME (BIGINT_ENGINE_ADDR + 0x08) + +#define BIGINT_STATUS (BIGINT_ENGINE_ADDR + 0x0C) +#define BIGINT_STATUS_STS_DONE (NBIT0) + +#define BIGINT_CLK_COUNT (BIGINT_ENGINE_ADDR + 0x10) +#define BIGINT_ADDR_X (BIGINT_ENGINE_ADDR + 0x14) +#define BIGINT_ADDR_E (BIGINT_ENGINE_ADDR + 0x18) +#define BIGINT_ADDR_M (BIGINT_ENGINE_ADDR + 0x1C) +#define BIGINT_ADDR_R (BIGINT_ENGINE_ADDR + 0x20) +#define BIGINT_LENGTH (BIGINT_ENGINE_ADDR + 0x24) + +#define BIGINT_IRQ_STS (BIGINT_ENGINE_ADDR + 0x28) +#define BIGINT_IRQ_STS_DONE (NBIT0) +#define BIGINT_IRQ_STS_CHOOSE_MONT (NBIT1) +#define BIGINT_IRQ_STS_M_READ (NBIT2) +#define BIGINT_IRQ_STS_X_READ (NBIT3) +#define BIGINT_IRQ_STS_START (NBIT4) +#define BIGINT_IRQ_STS_PRECOMP_FINISH (NBIT5) + +#define BIGINT_IRQ_MASK (BIGINT_ENGINE_ADDR + 0x2C) +#define BIGINT_IRQ_MASK_CTL_IRQ_MASK_START (NBIT4) + +#define ENABLE_FLIPPING 1 + + + + +#define GET_UINT32(BUF,OFFSET) (((uint32)((BUF)[OFFSET])) | ((uint32)(((BUF)[OFFSET + 1]) << 8)) | \ +((uint32)(((BUF)[OFFSET + 2]) << 16)) | ((uint32)(((BUF)[OFFSET + 3]) << 24))) + +#define PUTU32(VAL32,BUF,OFFSET) \ +do \ +{ \ + (BUF)[OFFSET ] = BYTE_3((VAL32)); \ + (BUF)[OFFSET +1 ] = BYTE_2((VAL32)); \ + (BUF)[OFFSET +2 ] = BYTE_1((VAL32)); \ + (BUF)[OFFSET +3 ] = BYTE_0((VAL32)); \ +}while(0) + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrHashContext + +@brief +*/ +typedef struct{ + uint32 au32HashState[M2M_SHA256_DIGEST_LEN/4]; + uint8 au8CurrentBlock[64]; + uint32 u32TotalLength; + uint8 u8InitHashFlag; +}tstrSHA256HashCtxt; + + + +/*======*======*======*======*======*=======* +* SHA256 IMPLEMENTATION * +*======*======*======*======*======*========*/ + +sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt) +{ + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + m2m_memset((uint8*)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt)); + pstrSHA256->u8InitHashFlag = 1; + } + return 0; +} + +sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint32 u32ResidualBytes; + uint32 u32NBlocks; + uint32 u32Offset; + uint32 u32CurrentBlock = 0; + uint8 u8IsDone = 0; + + /* Get the remaining bytes from the previous update (if the length is not block aligned). */ + u32ResidualBytes = pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE; + + /* Update the total data length. */ + pstrSHA256->u32TotalLength += u16DataLength; + + if(u32ResidualBytes != 0) + { + if((u32ResidualBytes + u16DataLength) >= SHA_BLOCK_SIZE) + { + u32Offset = SHA_BLOCK_SIZE - u32ResidualBytes; + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u32Offset); + pu8Data += u32Offset; + u16DataLength -= u32Offset; + + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + u32CurrentBlock = 1; + } + else + { + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u16DataLength); + u16DataLength = 0; + } + } + + /* Get the number of HASH BLOCKs and the residual bytes. */ + u32NBlocks = u16DataLength / SHA_BLOCK_SIZE; + u32ResidualBytes = u16DataLength % SHA_BLOCK_SIZE; + + if(u32NBlocks != 0) + { + nm_write_block(u32Addr, pu8Data, (uint16)(u32NBlocks * SHA_BLOCK_SIZE)); + pu8Data += (u32NBlocks * SHA_BLOCK_SIZE); + } + + u32NBlocks += u32CurrentBlock; + if(u32NBlocks != 0) + { + uint32 u32RegVal = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if(pstrSHA256->u8InitHashFlag) + { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + u32ReadAddr = u32WriteAddr + (u32NBlocks * SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u32NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + + u32RegVal &= ~(0x7 << 8); + u32RegVal |= (2 << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while(!u8IsDone) + { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + } + if(u32ResidualBytes != 0) + { + m2m_memcpy(pstrSHA256->au8CurrentBlock, pu8Data, u32ResidualBytes); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + + +sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint16 u16Offset; + uint16 u16PaddingLength; + uint16 u16NBlocks = 1; + uint32 u32RegVal = 0; + uint32 u32Idx,u32ByteIdx; + uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4]; + uint8 u8IsDone = 0; + + nm_write_reg(SHA256_CTRL,u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL,u32RegVal); + + if(pstrSHA256->u8InitHashFlag) + { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + /* Calculate the offset of the last data byte in the current block. */ + u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE); + + /* Add the padding byte 0x80. */ + pstrSHA256->au8CurrentBlock[u16Offset ++] = 0x80; + + /* Calculate the required padding to complete + one Hash Block Size. + */ + u16PaddingLength = SHA_BLOCK_SIZE - u16Offset; + m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength); + + /* If the padding count is not enough to hold 64-bit representation of + the total input message length, one padding block is required. + */ + if(u16PaddingLength < 8) + { + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE); + u16NBlocks ++; + } + + /* pack the length at the end of the padding block */ + PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4)); + + u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE); + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK; + u32RegVal &= ~(0x7UL << 8); + u32RegVal |= (0x2UL << 8); + + nm_write_reg(SHA256_CTRL,u32RegVal); + + + /* 5. Wait for done_intr */ + while(!u8IsDone) + { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + nm_read_block(u32ReadAddr, (uint8*)au32Digest, 32); + + /* Convert the output words to an array of bytes. + */ + u32ByteIdx = 0; + for(u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx ++) + { + pu8Sha256Digest[u32ByteIdx ++] = BYTE_3(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_2(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_1(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_0(au32Digest[u32Idx]); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + + +/*======*======*======*======*======*=======* +* RSA IMPLEMENTATION * +*======*======*======*======*======*========*/ + +static void FlipBuffer(uint8 *pu8InBuffer, uint8 *pu8OutBuffer, uint16 u16BufferSize) +{ + uint16 u16Idx; + for(u16Idx = 0; u16Idx < u16BufferSize; u16Idx ++) + { +#if ENABLE_FLIPPING == 1 + pu8OutBuffer[u16Idx] = pu8InBuffer[u16BufferSize - u16Idx - 1]; +#else + pu8OutBuffer[u16Idx] = pu8InBuffer[u16Idx]; +#endif + } +} + +void BigInt_ModExp +( + uint8 *pu8X, uint16 u16XSize, + uint8 *pu8E, uint16 u16ESize, + uint8 *pu8M, uint16 u16MSize, + uint8 *pu8R, uint16 u16RSize + ) +{ + uint32 u32Reg; + uint8 au8Tmp[780] = {0}; + uint32 u32XAddr = SHARED_MEM_BASE; + uint32 u32MAddr; + uint32 u32EAddr; + uint32 u32RAddr; + uint8 u8EMswBits = 32; + uint32 u32Mprime = 0x7F; + uint16 u16XSizeWords,u16ESizeWords; + uint32 u32Exponent; + + u16XSizeWords = (u16XSize + 3) / 4; + u16ESizeWords = (u16ESize + 3) / 4; + + u32MAddr = u32XAddr + (u16XSizeWords * 4); + u32EAddr = u32MAddr + (u16XSizeWords * 4); + u32RAddr = u32EAddr + (u16ESizeWords * 4); + + /* Reset the core. + */ + u32Reg = 0; + u32Reg |= BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + + nm_write_block(u32RAddr,au8Tmp, u16RSize); + + /* Write Input Operands to Chip Memory. + */ + /*------- X -------*/ + FlipBuffer(pu8X,au8Tmp,u16XSize); + nm_write_block(u32XAddr,au8Tmp,u16XSizeWords * 4); + + /*------- E -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8E, au8Tmp, u16ESize); + nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4); + u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4); + while((u32Exponent & NBIT31)== 0) + { + u32Exponent <<= 1; + u8EMswBits --; + } + + /*------- M -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8M, au8Tmp, u16XSize); + nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4); + + /* Program the addresses of the input operands. + */ + nm_write_reg(BIGINT_ADDR_X, u32XAddr); + nm_write_reg(BIGINT_ADDR_E, u32EAddr); + nm_write_reg(BIGINT_ADDR_M, u32MAddr); + nm_write_reg(BIGINT_ADDR_R, u32RAddr); + + /* Mprime. + */ + nm_write_reg(BIGINT_M_PRIME,u32Mprime); + + /* Length. + */ + u32Reg = (u16XSizeWords & 0xFF); + u32Reg += ((u16ESizeWords & 0xFF) << 8); + u32Reg += (u8EMswBits << 16); + nm_write_reg(BIGINT_LENGTH,u32Reg); + + /* CTRL Register. + */ + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg ^= BIGINT_MISC_CTRL_CTL_START; + u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT; + //u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID; +#if ENABLE_FLIPPING == 0 + u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST; +#endif + nm_write_reg(BIGINT_MISC_CTRL,u32Reg); + + /* Wait for computation to complete. */ + while(1) + { + u32Reg = nm_read_reg(BIGINT_IRQ_STS); + if(u32Reg & BIGINT_IRQ_STS_DONE) + { + break; + } + } + nm_write_reg(BIGINT_IRQ_STS,0); + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + nm_read_block(u32RAddr, au8Tmp, u16RSize); + FlipBuffer(au8Tmp, pu8R, u16RSize); +} + + + +#define MD5_DIGEST_SIZE (16) +#define SHA1_DIGEST_SIZE (20) + +static const uint8 au8TEncodingMD5[] = +{ + 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, + 0x04 +}; +/*!< Fixed part of the Encoding T for the MD5 hash algorithm. +*/ + + +static const uint8 au8TEncodingSHA1[] = +{ + 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, + 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04 +}; +/*!< Fixed part of the Encoding T for the SHA-1 hash algorithm. +*/ + + +static const uint8 au8TEncodingSHA2[] = +{ + 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, + 0x00, 0x04 +}; +/*!< Fixed part of the Encoding T for the SHA-2 hash algorithm. +*/ + + +sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if((pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) + { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if(u16HashLength == MD5_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } + else if(u16HashLength == SHA1_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } + else + { + pu8T = (uint8*)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if(u16NSize >= (u16TLength + 11)) + { + uint32 u32PSLength,u32Idx = 0; + + /* + RSA verification + */ + BigInt_ModExp(pu8RsaSignature, u16NSize, pu8E, u16ESize, pu8N, u16NSize, au8EM, u16NSize); + + u32PSLength = u16NSize - u16TLength - 3; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + if((au8EM[0] == 0x00) && (au8EM[1] == 0x01)) + { + for(u32Idx = 2; au8EM[u32Idx] == 0xFF; u32Idx ++); + if(u32Idx == (u32PSLength + 2)) + { + if(au8EM[u32Idx ++] == 0x00) + { + if(!m2m_memcmp(&au8EM[u32Idx], pu8T, u16TEncodingLength)) + { + u32Idx += u16TEncodingLength; + if(au8EM[u32Idx ++] == u16HashLength) + s8Ret = m2m_memcmp(&au8EM[u32Idx], pu8SignedMsgHash, u16HashLength); + } + } + } + } + } + } + return s8Ret; +} + + +sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) + { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if(u16HashLength == MD5_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } + else if(u16HashLength == SHA1_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } + else + { + pu8T = (uint8*)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if(u16NSize >= (u16TLength + 11)) + { + uint16 u16PSLength = 0; + uint16 u16Offset = 0; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + au8EM[u16Offset ++] = 0; + au8EM[u16Offset ++] = 1; + u16PSLength = u16NSize - u16TLength - 3; + m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength); + u16Offset += u16PSLength; + au8EM[u16Offset ++] = 0; + m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength); + u16Offset += u16TEncodingLength; + au8EM[u16Offset ++] = u16HashLength; + m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength); + + /* + RSA Signature Generation + */ + BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize); + s8Ret = M2M_RSA_SIGN_OK; + } + } + return s8Ret; +} + +#endif /* CONF_CRYPTO */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_flash.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_flash.c new file mode 100644 index 0000000..e3ff7ea --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_flash.c @@ -0,0 +1,550 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_flash.h" +#include "driver/include/m2m_wifi.h" +#include "driver/source/nmflash.h" +#include "driver/source/m2m_hif.h" +#include "spi_flash/include/spi_flash.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfDataAccessFn gpfAppFn = NULL; +static uint8 gau8ItemIdentifier[20] = {0}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static sint8 transfer_init(void) +{ + sint8 ret = FLASH_RETURN_OK; + + /* Check module was initialized. */ + if (gu8Init == 0) + ret = FLASH_ERR_UNINIT; + return ret; +} +static sint8 init_access(void) +{ + sint8 ret = FLASH_RETURN_OK; + + gu8Reset = 0; + if (m2m_wifi_reinit_hold() != M2M_SUCCESS) + ret = FLASH_ERR_WINC_ACCESS; + + return ret; +} +static sint8 commit_access(tstrFlashAccess *pstrFlashAccess) +{ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_ERR_FAIL; + tstrFlashAccessPersistent *pstrPersistentInfo = &pstrFlashAccess->strPersistentInfo; + + /* + * To begin with, flash is unchanged. Later, when first flash erase/write occurs, this flag + * will be cleared. + */ + pstrPersistentInfo->u8ModeFlags |= FLASH_MODE_FLAGS_UNCHANGED; + if (pstrPersistentInfo->u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + { + uint8 target = 0; + if (image_get_target(&target) != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + if (target > 0) + pstrPersistentInfo->u8ModeFlags |= FLASH_MODE_FLAGS_CS_SWITCH_TARGET; + } + + status = spi_flash_read((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + if (status == M2M_SUCCESS) + { + if ((pstrPersistentInfo->u32Signature != FLASH_SIGNATURE) || (pstrPersistentInfo->enuTransferStatus != FLASH_STATUS_EMPTY)) + status = spi_flash_erase(HOST_CONTROL_FLASH_OFFSET, HOST_CONTROL_FLASH_SZ); + } + if (status == M2M_SUCCESS) + { + pstrPersistentInfo->u32Signature = FLASH_SIGNATURE; + pstrPersistentInfo->enuTransferStatus = FLASH_STATUS_NOT_ACTIVE; + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + if (status == M2M_SUCCESS) + { + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + if (status == M2M_SUCCESS) + { + pstrPersistentInfo->enuTransferStatus = FLASH_STATUS_ACTIVE; + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + gu16LastAccessId = pstrPersistentInfo->u16AppId; + gu8Success = 0; + gu8Changed = 0; + } + } + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + ret = transfer_run(pstrFlashAccess); +ERR: + return ret; +} +static sint8 register_app_fn(tpfDataAccessFn pfFn) +{ + sint8 ret = FLASH_RETURN_OK; + if (pfFn == NULL) + ret = FLASH_ERR_PARAM; + gpfAppFn = pfFn; + return ret; +} +static sint8 app_data_access(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + tstrDataAccessInitParamsApp init_params_app; + tstrDataAccessParamsApp params_app; + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + init_params_app.u32TotalSize = init_params->u32TotalSize; + if (init_params->u8Flags & FLASH_FN_FLAGS_READ) + init_params_app.enuRW = FLASH_DATA_FN_READ; + else if (init_params->u8Flags & FLASH_FN_FLAGS_WRITE) + init_params_app.enuRW = FLASH_DATA_FN_WRITE; + pvStr = &init_params_app; + } + break; + case FLASH_DATA_FN_DATA: + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + params_app.pu8Data = params->pu8Buf + params->u32DataOffset; + params_app.u32DataSize = params->u32DataSize; + pvStr = ¶ms_app; + } + break; + case FLASH_DATA_FN_COMPLETE: + case FLASH_DATA_FN_TERMINATE: + break; + } + return gpfAppFn(enuCtl, pvStr); +} +sint8 m2m_flash_readimage(uint8 enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize) +{ + sint8 ret = FLASH_RETURN_OK; + + M2M_INFO("FA RdImage %d\n", enuImageId); + ret = transfer_init(); + if (ret < 0) + goto ERR; + ret = register_app_fn(pfDestFn); + if (ret < 0) + goto ERR; + if (u32DestSize < OTA_IMAGE_SIZE) + { + ret = FLASH_ERR_SIZE; + goto ERR; + } + if (enuImageId > FLASH_IMAGE_INACTIVE) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer. */ + tstrFlashAccess strFlashAccess; + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + + strFlashAccess.pfDestinationFn = app_data_access; + switch (enuImageId) + { + case FLASH_IMAGE_ACTIVE: + set_internal_info(&strFlashAccess.pfSourceFn, MEM_ID_WINC_ACTIVE); + break; + case FLASH_IMAGE_INACTIVE: + set_internal_info(&strFlashAccess.pfSourceFn, MEM_ID_WINC_INACTIVE); + break; + } + strFlashAccess.u32Size = OTA_IMAGE_SIZE; + + ret = commit_access(&strFlashAccess); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} + +sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize) +{ + sint8 ret = FLASH_RETURN_OK; + + M2M_INFO("FA Image %d\n", u8Options); + ret = transfer_init(); + if (ret < 0) + goto ERR; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_UPDATE) + { + uint8 au8ImageStart[4]; + uint8 au8ImageCheck[] = {'N','M','I','S'}; + tstrDataAccessInitParams init_params = {sizeof(au8ImageStart), FLASH_FN_FLAGS_READ}; + sint8 status = M2M_SUCCESS; + + /* Check input parameters. */ + ret = register_app_fn(pfSourceFn); + if (ret < 0) + goto ERR; + if (u32SourceSize != OTA_IMAGE_SIZE) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + status = app_data_access(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + { + tstrDataAccessParams params = {au8ImageStart, sizeof(au8ImageStart), 0, sizeof(au8ImageStart)}; + status = app_data_access(FLASH_DATA_FN_DATA, ¶ms); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + goto ERR; + } + if (m2m_memcmp(au8ImageStart, au8ImageCheck, sizeof(au8ImageStart))) + { + ret = FLASH_ERR_WINC_CONFLICT; + goto ERR; + } + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer. */ + tstrFlashAccess strFlashAccess; + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_UPDATE) + { + strFlashAccess.strPersistentInfo.u8AccessFlags = FLASH_ACCESS_WINC_MASK | FLASH_ACCESS_OPTION_ERASE_FIRST; + + strFlashAccess.pfSourceFn = app_data_access; + set_internal_info(&strFlashAccess.pfDestinationFn, MEM_ID_WINC_INACTIVE); + strFlashAccess.u32Size = OTA_IMAGE_SIZE; + } + else + strFlashAccess.u32Size = 0; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_VALIDATE) + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_SWITCH) + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS_SWITCH; + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS; + + ret = commit_access(&strFlashAccess); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} + +static sint8 m2m_flash_rootcert_access(tenuFlashAccessItemMode enuMode, uint8 u8ModeOptions, uint8 u8AccessOptions, uint16 u16Id, tpfDataAccessFn pfFn, uint32 u32Size) +{ + sint8 ret = FLASH_RETURN_OK; + tstrRootCertEntryHeader strRootCertEntry; + uint16 u16EntrySz = 0; + + M2M_INFO("FA Rootcert %d\n", enuMode); + ret = transfer_init(); + if (ret < 0) + goto ERR; + + switch (enuMode) + { + case FLASH_ITEM_ADD: + { + sint8 status = M2M_SUCCESS; + tstrDataAccessInitParams init_params = {sizeof(strRootCertEntry), FLASH_FN_FLAGS_READ}; + + // Read the entry header + if (u32Size < sizeof(strRootCertEntry)) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + { + tstrDataAccessParams params = {(uint8*)&strRootCertEntry, sizeof(strRootCertEntry), 0, sizeof(strRootCertEntry)}; + status = pfFn(FLASH_DATA_FN_DATA, ¶ms); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + goto ERR; + } + // Check source size matches size calculated from entry header. + status = rootcert_get_size(&strRootCertEntry, &u16EntrySz); + if ((status != M2M_SUCCESS) || (u32Size != u16EntrySz)) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + } + break; + case FLASH_ITEM_READ: + case FLASH_ITEM_REMOVE: + m2m_memcpy(strRootCertEntry.au8SHA1NameHash, gau8ItemIdentifier, sizeof(gau8ItemIdentifier)); + m2m_memset(gau8ItemIdentifier, 0, sizeof(gau8ItemIdentifier)); + break; + case FLASH_ITEM_READIDX: + // Hack strRootCertEntry to carry the index from u8ModeOptions. + *(uint32*)&strRootCertEntry = u8ModeOptions; + break; + default: + /* No other item modes supported. */ + ret = FLASH_ERR_PARAM; + goto ERR; + break; + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Now we can access the items in flash. */ + uint8 *pu8Buff = malloc(M2M_TLS_ROOTCER_FLASH_SZ); + uint32 u32Offset = 0; + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto ERR; + } + ret = rootcert_access(enuMode, &strRootCertEntry, &u16EntrySz, pu8Buff, &u32Offset); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer, according to enuMode. */ + sint8 status = M2M_SUCCESS; + tstrDataAccessInitParams init_params = {u16EntrySz, 0}; + tstrDataAccessParams data_params = {pu8Buff + u32Offset, u16EntrySz, 0, u16EntrySz}; + tstrFlashAccess strFlashAccess; + + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + strFlashAccess.strPersistentInfo.u8AccessFlags = u8AccessOptions; + + switch (enuMode) + { + case FLASH_ITEM_ADD: + init_params.u8Flags = FLASH_FN_FLAGS_READ; + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + status = pfFn(FLASH_DATA_FN_DATA, &data_params); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + pfFn(FLASH_DATA_FN_TERMINATE, NULL); + break; + } + u32Offset += u16EntrySz; + // intentional fallthrough. + case FLASH_ITEM_REMOVE: + status = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if (status == M2M_SUCCESS) + status = winc_flash_write_verify(pu8Buff, M2M_BACKUP_FLASH_OFFSET, u32Offset); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + set_internal_info(NULL, M2M_TLS_ROOTCER_FLASH_OFFSET); + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_DATA_IN_BACKUP; + break; + case FLASH_ITEM_READ: + case FLASH_ITEM_READIDX: + // Check source size is sufficient for reading entry. + if (u32Size < u16EntrySz) + { + ret = FLASH_ERR_SIZE; + break; + } + init_params.u8Flags = FLASH_FN_FLAGS_WRITE; + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + status = pfFn(FLASH_DATA_FN_DATA, &data_params); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + pfFn(FLASH_DATA_FN_TERMINATE, NULL); + break; + } + break; + } + if (ret == 0) + { + ret = commit_access(&strFlashAccess); + if (enuMode != FLASH_ITEM_REMOVE) + pfFn(FLASH_DATA_FN_COMPLETE, NULL); + } + } + free(pu8Buff); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfSourceFn); + if (ret == FLASH_RETURN_OK) + ret = m2m_flash_rootcert_access(FLASH_ITEM_ADD, 0, FLASH_ACCESS_OPTION_COMPARE_AFTER, u16Id, app_data_access, u32SourceSize); + return ret; +} +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz) +{ + sint8 ret = FLASH_ERR_PARAM; + + if ((pu8Identifier != NULL) && (u32IdentifierSz == 20)) + { + m2m_memcpy(gau8ItemIdentifier, pu8Identifier, u32IdentifierSz); + ret = m2m_flash_rootcert_access(FLASH_ITEM_REMOVE, 0, FLASH_ACCESS_OPTION_COMPARE_AFTER, u16Id, NULL, 0); + } + return ret; +} +sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfDestFn); + if (ret == FLASH_RETURN_OK) + { + ret = FLASH_ERR_PARAM; + if ((pu8Identifier != NULL) && (u32IdentifierSz == 20)) + { + m2m_memcpy(gau8ItemIdentifier, pu8Identifier, u32IdentifierSz); + ret = m2m_flash_rootcert_access(FLASH_ITEM_READ, 0, 0, u16Id, app_data_access, u32DestSize); + } + } + return ret; +} +sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfDestFn); + if (ret == FLASH_RETURN_OK) + ret = m2m_flash_rootcert_access(FLASH_ITEM_READIDX, u8Index, 0, u16Id, app_data_access, u32DestSize); + return ret; +} + +void m2m_flash_get_state(tstrFlashState *pstrState) +{ + if (gu8Reset == 0) + { + sint8 status = M2M_ERR_FAIL; + tstrFlashAccessPersistent strSavedFlashAccess; + + status = spi_flash_read((uint8*)&strSavedFlashAccess, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + if ((status == M2M_SUCCESS) && (strSavedFlashAccess.u32Signature == FLASH_SIGNATURE)) + { + switch (strSavedFlashAccess.enuTransferStatus) + { + case FLASH_STATUS_ACTIVE: + if (strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + { + // Check to see if switch happened before we were interrupted. If so we had actually completed. + uint8 target; + if (image_get_target(&target) == M2M_SUCCESS) + { + if ((target == 0) && (strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH_TARGET)) + gu8Success = 1; + if ((target > 0) && !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH_TARGET)) + gu8Success = 1; + } + } + gu16LastAccessId = strSavedFlashAccess.u16AppId; + gu8Changed = !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED); + if (gu8Success == 1) + { + strSavedFlashAccess.enuTransferStatus = FLASH_STATUS_DONE; + winc_flash_write_verify((uint8*)&strSavedFlashAccess, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + } + break; + case FLASH_STATUS_DONE: + gu16LastAccessId = strSavedFlashAccess.u16AppId; + gu8Changed = !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED); + gu8Success = 1; + break; + default: + break; + } + } + } + m2m_memset((uint8*)pstrState, 0, sizeof(tstrFlashState)); + if (gu16LastAccessId) + { + pstrState->u16LastAccessId = gu16LastAccessId; + pstrState->u8Success = gu8Success; + pstrState->u8Changed = gu8Changed; + } + pstrState->u8Init = gu8Init; + pstrState->u8Reset = gu8Reset; +} +sint8 m2m_flash_init(void) +{ + if (gu8Reset == 0) + { + // WINC backup recovery may be needed. + if (recover_backup() == FLASH_RETURN_OK) + { + gu8Init = 1; + gu8Reset = 1; + return M2M_SUCCESS; + } + } + return M2M_ERR_FAIL; +} diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.c new file mode 100644 index 0000000..2c40087 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.c @@ -0,0 +1,878 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmdrv.h" +#include "bsp/include/nm_bsp.h" +#include "m2m_hif.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_periph.h" + +#if (defined NM_EDGE_INTERRUPT)&&(defined NM_LEVEL_INTERRUPT) +#error "only one type of interrupt NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#if !((defined NM_EDGE_INTERRUPT)||(defined NM_LEVEL_INTERRUPT)) +#error "define interrupt type NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#ifndef CORTUS_APP +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WAKE_VALUE (0x5678) +#define SLEEP_VALUE (0x4321) +#define WAKE_REG (0x1074) + +#define INTERRUPT_CORTUS_0_3000D0 (0x10a8) +#define INTERRUPT_CORTUS_1_3000D0 (0x10ac) +#define INTERRUPT_CORTUS_2_3000D0 (0x10b0) +#define INTERRUPT_CORTUS_3_3000D0 (0x10b4) + + +static volatile uint8 gu8ChipMode = 0; +static volatile uint8 gu8ChipSleep = 0; +static volatile uint8 gu8HifSizeDone = 0; +static volatile uint8 gu8Interrupt = 0; +static volatile uint8 gu8Yield = 0; + +/* + Special codes for managing HIF restriction to OTA rollback/switch only +*/ +#define HIF_OTA_RB_ONLY 0xFFFF +#define HIFCODE_OTA_RB ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_ROLLBACK) +#define HIFCODE_OTA_SW ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_SWITCH_FIRMWARE) +#define HIFCODE_SSL_WRITECERT ((M2M_REQ_GROUP_SSL << 8) | M2M_SSL_REQ_WRITE_OWN_CERTS) +#define HIFCODE_WIFI_PASSIVESCAN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_PASSIVE_SCAN) +/* + List of new HIF messages (since last HIF major increase) + Each entry is formed of ((GroupId << 8) | OpCode) + Additionally, entry 0 used to indicate OTA RB/SW only. +*/ +#define NEW_HIF_LIST HIF_OTA_RB_ONLY, HIFCODE_SSL_WRITECERT, HIFCODE_WIFI_PASSIVESCAN +/* + Array of HIF messages which are not supported by Firmware. + During hif_init() this array is rebased using an offset determined by Firmware HIF level. +*/ +static uint16 gau16HifBlacklist[] = {NEW_HIF_LIST}; +#define HIF_BLACKLIST_SZ (sizeof(gau16HifBlacklist)/sizeof(gau16HifBlacklist[0])) +static uint8 gu8HifBlOffset = 0; + +tpfHifCallBack pfWifiCb = NULL; /*!< pointer to Wi-Fi call back function */ +tpfHifCallBack pfIpCb = NULL; /*!< pointer to Socket call back function */ +tpfHifCallBack pfOtaCb = NULL; /*!< pointer to OTA call back function */ +tpfHifCallBack pfSigmaCb = NULL; +tpfHifCallBack pfHifCb = NULL; +tpfHifCallBack pfSSLCb = NULL; + +static void isr(void) +{ + gu8Interrupt++; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(0); +#endif +} + +static sint8 hif_set_rx_done(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; +#ifdef NM_EDGE_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif + + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_0_3000D0,1); + if(ret != M2M_SUCCESS)goto ERR1; + } else { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + //reg &= ~(1<<0); + + /* Set RX Done */ + reg |= (1<<1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif +ERR1: + return ret; + +} +/** +* @fn static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @author +* @date +* @version 1.0 +*/ +static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + + +} +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief To Wakeup the chip. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + if(gu8ChipSleep == 0) + { + if((gu8ChipMode == M2M_PS_DEEP_AUTOMATIC)||(gu8ChipMode == M2M_PS_MANUAL)) + { + ret = nm_clkless_wake(); + if(ret != M2M_SUCCESS)goto ERR1; + ret = nm_write_reg(WAKE_REG, WAKE_VALUE); + if(ret != M2M_SUCCESS)goto ERR1; + } + else + { + } + } + gu8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8 u8Pstype) +{ + gu8ChipMode = u8Pstype; +} +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8 hif_get_sleep_mode(void) +{ + return gu8ChipMode; +} +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief To make the chip sleep. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_chip_sleep(void) +{ + + sint8 ret = M2M_SUCCESS; + + if(gu8ChipSleep >= 1) + { + gu8ChipSleep--; + } + + if(gu8ChipSleep == 0) + { + if((gu8ChipMode == M2M_PS_DEEP_AUTOMATIC)||(gu8ChipMode == M2M_PS_MANUAL)) + { + uint32 reg = 0; + ret = nm_write_reg(WAKE_REG, SLEEP_VALUE); + if(ret != M2M_SUCCESS)goto ERR1; + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(0x1, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg&0x2) + { + reg &=~(1 << 1); + ret = nm_write_reg(0x1, reg); + } + } + else + { + } + } +ERR1: + return ret; +} +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_init(void * arg) +{ + pfWifiCb = NULL; + pfIpCb = NULL; + + gu8ChipSleep = 0; + gu8ChipMode = M2M_NO_PS; + + gu8Interrupt = 0; + nm_bsp_register_isr(isr); + + gu8HifBlOffset = 0; + hif_register_cb(M2M_REQ_GROUP_HIF,m2m_hif_cb); + + return M2M_SUCCESS; +} +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +sint8 hif_deinit(void * arg) +{ + sint8 ret = M2M_SUCCESS; +#if 0 + uint32 reg = 0, cnt=0; + while (reg != M2M_DISABLE_PS) + { + nm_bsp_sleep(1); + reg = nm_read_reg(STATE_REG); + if(++cnt > 1000) + { + M2M_DBG("failed to stop power save\n"); + break; + } + } +#endif + ret = hif_chip_wake(); + + gu8ChipMode = 0; + gu8ChipSleep = 0; + gu8HifSizeDone = 0; + gu8Interrupt = 0; + + pfWifiCb = NULL; + pfIpCb = NULL; + pfOtaCb = NULL; + pfHifCb = NULL; + + return ret; +} +/** +* @fn sint8 hif_check_compatibility(uint16 u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +sint8 hif_check_compatibility(uint16 u16HifInfo) +{ + sint8 ret = M2M_ERR_FW_VER_MISMATCH; + if((M2M_GET_HIF_BLOCK(u16HifInfo) == M2M_HIF_BLOCK_VALUE) && (M2M_GET_HIF_MAJOR(u16HifInfo) == M2M_HIF_MAJOR_VALUE)) + { + ret = M2M_SUCCESS; + } + return ret; +} +/** +* @fn sint8 hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +sint8 hif_enable_access(void) +{ + sint8 ret = M2M_SUCCESS; + uint16 fw_hif_info = 0; + + ret = nm_get_hif_info(&fw_hif_info, NULL); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(fw_hif_info); + if(ret == M2M_SUCCESS) + { + switch(M2M_GET_HIF_MINOR(fw_hif_info)) + { + case 0: + gu8HifBlOffset = 1; + break; + case 1: + gu8HifBlOffset = 2; + break; + case 2: + gu8HifBlOffset = 2; + break; + case 3: + gu8HifBlOffset = 3; + break; + // Additional case to be added each time hif minor increments. + // All additional cases to be removed in the event of a hif major increment. + // Default catches all cases in which hif minor is greater in Firmware than in Driver. + default: + gu8HifBlOffset = HIF_BLACKLIST_SZ; + break; + } + } + else + { + gu8HifBlOffset = 0; + M2M_ERR("HIF access limited to OTA Switch/Rollback only\n"); + } + } + return ret; +} +/** +* @fn sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode) +{ + uint8 u8BlId; + uint16 u16HifCode = ((uint16)u8Gid<<8) | u8OpCode; + if((u16HifCode == HIFCODE_OTA_RB) || (u16HifCode == HIFCODE_OTA_SW)) + { + return M2M_SUCCESS; + } + if(gu8HifBlOffset == 0) + { + M2M_ERR("HIF OTA rb/sw only\n"); + return M2M_ERR_SEND; + } + for(u8BlId = gu8HifBlOffset; u8BlId < HIF_BLACKLIST_SZ; u8BlId++) + { + if(u16HifCode == gau16HifBlacklist[u8BlId]) + { + M2M_ERR("HIF message unsupported\n"); + return M2M_ERR_SEND; + } + } + return M2M_SUCCESS; +} +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +{ + sint8 ret = M2M_ERR_SEND; + volatile tstrHifHdr strHif; + + strHif.u8Opcode = u8Opcode&(~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + if(pu8DataBuf != NULL) + { + strHif.u16Length += u16DataOffset + u16DataSize; + } + else + { + strHif.u16Length += u16CtrlBufSize; + } + + ret = hif_check_code(strHif.u8Gid, strHif.u8Opcode); + if(ret != M2M_SUCCESS) + { + goto ERR1; + } + + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + volatile uint32 reg, dma_addr = 0; + volatile uint16 cnt = 0; + + reg = 0UL; + reg |= (uint32)u8Gid; + reg |= ((uint32)u8Opcode<<8); + reg |= ((uint32)strHif.u16Length<<16); + ret = nm_write_reg(NMI_STATE_REG,reg); + if(M2M_SUCCESS != ret) goto ERR1; + + reg = 0; + reg |= (1<<1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + + if (ISNMC3400(nmi_get_chipid())) { + + ret = nm_write_reg(INTERRUPT_CORTUS_1_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + + dma_addr = 0; + + //nm_bsp_interrupt_ctrl(0); + + for(cnt = 0; cnt < 1000*5; cnt ++) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2,(uint32 *)®); + if(ret != M2M_SUCCESS) + break; + + if (!(reg & 0x2)) + { + ret = nm_read_reg_with_ret(0x150400,(uint32 *)&dma_addr); + if(ret != M2M_SUCCESS) { + /*in case of read error clear the dma address and return error*/ + dma_addr = 0; + } + /*in case of success break */ + break; + } + //If we are struggling to get a response, start waiting longer + if (cnt>=1000) + nm_bsp_sleep(5); + } + //nm_bsp_interrupt_ctrl(1); + + if (dma_addr != 0) + { + volatile uint32 u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length); + M2M_DBG("Writing into %lx %ld\n", dma_addr, strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8*)&strHif, M2M_HIF_HDR_OFFSET); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if(pu8CtrlBuf != NULL) + { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + u32CurrAddr += (u16DataOffset - u16CtrlBufSize); + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + + /* MERGEBUG: TODO: Following line of code is to generate the interrupt which + is not needed for 3400, need to check if there are any side effects of keeping it + */ + reg |= (1 << 1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if(M2M_SUCCESS != ret) + goto ERR1; + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_2_3000D0, 1); + if(M2M_SUCCESS != ret) + goto ERR1; + } + } + else + { + M2M_DBG("Failed to alloc rx size\n"); + ret = M2M_ERR_MEM_ALLOC; + goto ERR1; + } + + } + else + { + M2M_ERR("(HIF)Fail to wakup the chip\n"); + goto ERR1; + } + ret = hif_chip_sleep(); + +ERR1: + return ret; +} +/** +* @fn hif_isr +* @brief Host interface interrupt service routine +* @author M. Abdelmawla +* @date 15 July 2012 +* @return 1 in case of interrupt received else 0 will be returned +* @version 1.0 +*/ +static sint8 hif_isr(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg; + volatile tstrHifHdr strHif; + + + //if(ret == M2M_SUCCESS) + { + ret = nm_read_reg_with_ret(0x1070, ®); + if(M2M_SUCCESS == ret) + { + if(reg & 0x1) /* New interrupt has been received */ + { + uint16 size; + + nm_bsp_interrupt_ctrl(0); + /*Clearing RX interrupt*/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + reg &= ~(1<<0); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg); + if(ret != M2M_SUCCESS)goto ERR1; + /* read the rx size */ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_0 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + gu8HifSizeDone = 0; + size = (uint16)((reg >> 2) & 0xfff); + if (size > 0) { + uint32 address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + ret = nm_read_block(address, (uint8*)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) address bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + if(strHif.u16Length != size) + { + if((size - strHif.u16Length) > 4) + { + M2M_ERR("(hif) Corrupted packet Size = %u \n", + size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode); + nm_bsp_interrupt_ctrl(1); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + + if(M2M_REQ_GROUP_WIFI == strHif.u8Gid) + { + if(pfWifiCb) + pfWifiCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + + } + else if(M2M_REQ_GROUP_IP == strHif.u8Gid) + { + if(pfIpCb) + pfIpCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_OTA == strHif.u8Gid) + { + if(pfOtaCb) + pfOtaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid) + { + if(pfSigmaCb) + pfSigmaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_SSL == strHif.u8Gid) + { + if(pfSSLCb) + pfSSLCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else + { + M2M_ERR("(hif) invalid group ID\n"); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + #ifndef ENABLE_UNO_BOARD + if(!gu8HifSizeDone) + { + M2M_ERR("(hif) host app didn't set RX Done\n"); + ret = hif_set_rx_done(); + } + #endif + } + else + { + ret = M2M_ERR_RCV; + M2M_ERR("(hif) Wrong Size\n"); + goto ERR1; + } + } + else + { +#ifndef WIN32 + M2M_ERR("(hif) False interrupt %lx",reg); +#endif + } + } + else + { + M2M_ERR("(hif) Fail to Read interrupt reg\n"); + } + } + +ERR1: + return ret; +} + +/** +* @fn hif_handle_isr(void) +* @brief Handle interrupt received from NMC1500 firmware. +* @return The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_yield(void) +{ + gu8Yield = 1; +} + +sint8 hif_handle_isr(void) +{ + sint8 ret = M2M_SUCCESS; + + if (gu8Interrupt) { + ret = hif_chip_wake(); +// Sleep(10); + if(ret == M2M_SUCCESS) + { + gu8Yield = 0; + while (gu8Interrupt && !gu8Yield) { + /*must be at that place because of the race of interrupt increment and that decrement*/ + /*when the interrupt enabled*/ + gu8Interrupt--; + while(1) + { + ret = hif_isr(); + if(ret == M2M_SUCCESS/* || gu8Interrupt == 0*/) { //JFM: WTF un while(1)!!!!! + /*we will try forever until we get that interrupt*/ + /*Fail return errors here due to bus errors (reading expected values)*/ + break; + } else { + M2M_ERR("(HIF) Fail to handle interrupt %d try Again..\n",ret); + } + } + } + ret = hif_chip_sleep(); + } + else { + M2M_ERR("(hif) FAIL to wakeup the chip\n"); + } + } + return ret; +} +/* +* @fn hif_receive +* @brief Host interface interrupt service routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone) +{ + uint32 address, reg; + uint16 size; + sint8 ret = M2M_SUCCESS; + + if(u32Addr == 0 || pu8Buf == NULL || u16Sz == 0) + { + if(isDone) + { + gu8HifSizeDone = 1; + + /* set RX done */ + ret = hif_set_rx_done(); + + if((u32Addr == 0) && (pu8Buf == NULL) && (u16Sz == 0)) + return M2M_SUCCESS; + } + + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\n"); + goto ERR1; + } + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + + + size = (uint16)((reg >> 2) & 0xfff); + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1,&address); + if(ret != M2M_SUCCESS)goto ERR1; + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if(ret != M2M_SUCCESS)goto ERR1; + + if(u16Sz > size) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the recived buffer size <%d><%d>\n",u16Sz, size); + goto ERR1; + } + if((u32Addr < address)||((u32Addr + u16Sz)>(address+size))) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the recived buffer address and length\n"); + goto ERR1; + } + + /* check if this is the last packet */ + if(isDone || (((address+size) - (u32Addr+u16Sz)) == 0) || + ((4 - ((u32Addr+u16Sz) & 3)) == ((address+size) - (u32Addr+u16Sz)))) /* Length in the RCV CTRL 0 register is rounded off to 4 by the firmware, + but length inside the HIF header is not, Hence consider done if number + of rounding bytes equal to length left to read */ + { + gu8HifSizeDone = 1; + + /* set RX done */ + ret = hif_set_rx_done(); + } + + + +ERR1: + return ret; +} + +/** +* @fn hif_register_cb +* @brief To set Callback function for every component +* @param [in] u8Grp +* Group to which the Callback function should be set. +* @param [in] fn +* function to be set +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_register_cb(uint8 u8Grp,tpfHifCallBack fn) +{ + sint8 ret = M2M_SUCCESS; + switch(u8Grp) + { + case M2M_REQ_GROUP_IP: + pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + pfHifCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + pfSSLCb = fn; + break; + default: + M2M_ERR("GRp ? %d\n",u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +#endif diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.h b/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.h new file mode 100644 index 0000000..5095005 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_hif.h @@ -0,0 +1,270 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +/*!< Include depends on UNO Board is used or not*/ +#ifdef ENABLE_UNO_BOARD +#include "m2m_uno_hif.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. +*/ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + + +/** +* @struct tstrHifHdr +* @brief Structure to hold HIF header +*/ +typedef struct +{ + uint8 u8Gid; /*!< Group ID */ + uint8 u8Opcode; /*!< OP code */ + uint16 u16Length; /*!< Payload length */ +}tstrHifHdr; + +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_init(void * arg); +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_deinit(void * arg); +/** +* @fn sint8 hif_check_compatibility(uint16 u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +sint8 hif_check_compatibility(uint16 u16HifInfo); +/** +* @fn sint8 hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +sint8 hif_enable_access(void); +/** +* @fn sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset); +/** +* @fn hif_receive +* @brief Host interface interrupt serviece routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_register_cb(uint8 u8Grp,tpfHifCallBack fn); +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep(void); +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_chip_wake(void); +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API void hif_set_sleep_mode(uint8 u8Pstype); +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +NMI_API uint8 hif_get_sleep_mode(void); + +#ifdef CORTUS_APP +/** +* @fn hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize) +* @brief + Response handler for HIF layer. + +* @param [in] pu8Buffer + Pointer to the buffer. + +* @param [in] u16BufferSize + Buffer size. + +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize); +#endif + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +NMI_API void hif_yield(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from NMC1500 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_ota.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_ota.c new file mode 100644 index 0000000..d9f0b0a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_ota.c @@ -0,0 +1,357 @@ +/** + * + * \file + * + * \brief WINC3400 IoT OTA Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/include/m2m_ota.h" +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; +static tpfOtaNotifCb gpfOtaNotifCb = NULL; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** +* @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +* @author +* @date +* @version 1.0 +*/ +static void m2m_ota_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + if(u8OpCode == M2M_OTA_RESP_NOTIF_UPDATE_INFO) + { + tstrOtaUpdateInfo strOtaUpdateInfo; + m2m_memset((uint8*)&strOtaUpdateInfo,0,sizeof(tstrOtaUpdateInfo)); + ret = hif_receive(u32Addr,(uint8*)&strOtaUpdateInfo,sizeof(tstrOtaUpdateInfo),0); + if(ret == M2M_SUCCESS) + { + if(gpfOtaNotifCb) + gpfOtaNotifCb(&strOtaUpdateInfo); + } + } + else if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) + { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + m2m_memset((uint8*)&strOtaUpdateStatusResp,0,sizeof(tstrOtaUpdateStatusResp)); + ret = hif_receive(u32Addr, (uint8*) &strOtaUpdateStatusResp,sizeof(tstrOtaUpdateStatusResp), 0); + if(ret == M2M_SUCCESS) + { + if(gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType,strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } + else + { + M2M_ERR("Invaild OTA resp %d ?\n",u8OpCode); + } + +} +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb); + +@brief + Initialize the OTA layer. + +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb) +{ + sint8 ret = M2M_SUCCESS; + + if(pfOtaUpdateCb){ + gpfOtaUpdateCb = pfOtaUpdateCb; + }else{ + M2M_ERR("Invaild Ota update cb\n"); + } + if(pfOtaNotifCb){ + gpfOtaNotifCb = pfOtaNotifCb; + }else{ + M2M_ERR("Invaild Ota notify cb\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA,m2m_ota_cb); + + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + +@brief + Set the OTA url + +@param [in] u8Url + The url server address + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16UrlSize = m2m_strlen(u8Url) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_START_UPDATE,u8Url,u16UrlSize,NULL,0,0); + return ret; + +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + +@brief + check for ota update + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE,NULL,0,NULL,0,0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); + +@brief + Schedule OTA update + +@param [in] u32Period + Period in days + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE,NULL,0,NULL,0,0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + +@brief + Request OTA start update using the downloaded url + +@param [in] u8DownloadUrl + The download firmware url, you get it from device info + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_START_UPDATE,u8DownloadUrl,u16DurlSize,NULL,0,0); + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@brief + Request OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_ROLLBACK,NULL,0,NULL,0,0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@brief + Request OTA Abort + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_ABORT,NULL,0,NULL,0,0); + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@brief + Switch to the upgraded Firmware + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_SWITCH_FIRMWARE,NULL,0,NULL,0,0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} +#if 0 +#define M2M_OTA_FILE "../../../m2m_ota.dat" +NMI_API sint8 m2m_ota_test(void) +{ + uint32 page = 0; + uint8 buffer[1500]; + uint32 u32Sz = 0; + sint8 ret = M2M_SUCCESS; + FILE *fp =NULL; + fp = fopen(M2M_OTA_FILE,"rb"); + if(fp) + { + fseek(fp, 0L, SEEK_END); + u32Sz = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + while(u32Sz > 0) + { + { + page = (rand()%1400); + + if((page<100)||(page>1400)) page = 1400; + } + + if(u32Sz>page) + { + u32Sz-=page; + } + else + { + page = u32Sz; + u32Sz = 0; + } + printf("page %d\n", (int)page); + fread(buffer,page,1,fp); + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_TEST|M2M_REQ_DATA_PKT,NULL,0,(uint8*)&buffer,page,0); + if(ret != M2M_SUCCESS) + { + M2M_ERR("\n"); + } + nm_bsp_sleep(1); + } + + } + else + { + M2M_ERR("nO err\n"); + } + return ret; +} +#endif + diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_periph.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_periph.c new file mode 100644 index 0000000..3adb31f --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_periph.c @@ -0,0 +1,143 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherials Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_periph.h" +#include "driver/source/nmasic.h" +#include "m2m_hif.h" + +#ifdef CONF_PERIPH + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static sint8 get_gpio_idx(uint8 u8GpioNum) +{ + if(u8GpioNum >= M2M_PERIPH_GPIO_MAX) return -1; + if(u8GpioNum == M2M_PERIPH_GPIO3) + { + return 3; + } + else if(u8GpioNum == M2M_PERIPH_GPIO4) + { + return 4; + } + else if(u8GpioNum == M2M_PERIPH_GPIO15) + { + return 15; + } + else if(u8GpioNum == M2M_PERIPH_GPIO16) + { + return 16; + } + else if(u8GpioNum == M2M_PERIPH_GPIO18) + { + return 18; + } + else + { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static sint8 gpio_ioctl(uint8 op, uint8 u8GpioNum, uint8 u8InVal, uint8 * pu8OutVal) +{ + sint8 ret, gpio; + + ret = hif_chip_wake(); + if(ret != M2M_SUCCESS) goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if(gpio < 0) goto _EXIT1; + + if(op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8)gpio, u8InVal); + } else if(op == GPIO_OP_SET) { + ret = set_gpio_val((uint8)gpio, u8InVal); + } else if(op == GPIO_OP_GET) { + ret = get_gpio_val((uint8)gpio, pu8OutVal); + } + if(ret != M2M_SUCCESS) goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +sint8 m2m_periph_init(tstrPerphInitParam * param) +{ + return M2M_SUCCESS; +} + +sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable) +{ + return pullup_ctrl(pinmask, enable); +} +#endif /* CONF_PERIPH */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_ssl.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_ssl.c new file mode 100644 index 0000000..cb53396 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_ssl.c @@ -0,0 +1,406 @@ +/** + * + * \file + * + * \brief WINC SSL Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_ssl.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" +#include + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32 gu32HIFAddr = 0; +static tenuTlsFlashStatus genuStatus = TLS_FLASH_ERR_UNKNOWN; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @fn \ m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + @brief SSL callback function + @param [in] u8OpCode + HIF Opcode type. + @param [in] u16DataSize + HIF data length. + @param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 s8tmp = M2M_SUCCESS; + switch(u8OpCode) + { + case M2M_SSL_REQ_ECC: + { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8*)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if(s8tmp == M2M_SUCCESS) + { + if (gpfAppSSLCb) + { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } + break; + case M2M_SSL_RESP_SET_CS_LIST: + { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8*)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if(s8tmp == M2M_SUCCESS) + { + if (gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } + break; + case M2M_SSL_RESP_WRITE_OWN_CERTS: + { + tstrTlsSrvChunkHdr strTlsSrvChunkRsp; + uint8 bCallApp = 1; + + s8tmp = hif_receive(u32Addr, (uint8*)&strTlsSrvChunkRsp, sizeof(tstrTlsSrvChunkHdr), 0); + if(s8tmp == M2M_SUCCESS) + { + uint16 offset = strTlsSrvChunkRsp.u16Offset32; + uint16 chunk_size = strTlsSrvChunkRsp.u16Size32; + uint16 total_size = strTlsSrvChunkRsp.u16TotalSize32; + tenuTlsFlashStatus status = (tenuTlsFlashStatus)(strTlsSrvChunkRsp.u16Sig); + + /* If first chunk, reset status. */ + if (offset == 0) + genuStatus = TLS_FLASH_OK_NO_CHANGE; + /* Only send status to app when processing last chunk. */ + if (offset + chunk_size != total_size) + bCallApp = 0; + + switch (status) + { + case TLS_FLASH_OK: + // Good flash write. Update status if no errors yet. + if (genuStatus == TLS_FLASH_OK_NO_CHANGE) + genuStatus = status; + break; + case TLS_FLASH_OK_NO_CHANGE: + // No change, don't update status. + break; + case TLS_FLASH_ERR_CORRUPT: + // Corrupt. Always update status. + genuStatus = status; + break; + case TLS_FLASH_ERR_NO_CHANGE: + // Failed flash write. Update status if no more serious error. + if ((genuStatus != TLS_FLASH_ERR_CORRUPT) && (genuStatus != TLS_FLASH_ERR_UNKNOWN)) + genuStatus = status; + break; + default: + // Don't expect any other case. Ensure we don't mask a previous corrupt error. + if (genuStatus != TLS_FLASH_ERR_CORRUPT) + genuStatus = TLS_FLASH_ERR_UNKNOWN; + break; + } + } + if (bCallApp && gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_WRITE_OWN_CERTS, &genuStatus); + } + break; + } + if(s8tmp != M2M_SUCCESS) + { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + + +/*! + @fn \ m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), (uint8*)strECCResp, sizeof(tstrEccReqInfo), pu8RspDataBuff, u16RspDataSz, sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_send_certs_to_winc(uint8* sector_buffer, uint32 sector_size) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) +{ + sint8 s8Ret = M2M_SUCCESS; + #define TXLIMIT (256 * 6) + + if(u32BufferSz <= TXLIMIT) + { + // set chunk header for one chunk + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)pu8Buffer; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = (u32BufferSz + 3) >> 2; + pchkhdr->u16Offset32 = 0; + pchkhdr->u16Size32 = (u32BufferSz + 3) >> 2; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + M2M_INFO("Transferred %u bytes of cert data NON-CHUNKED\n", u32BufferSz); + } + else + { + // chunk it + // We are sneaking in a header - tstrTlsSrvChunkHdr + #define CHUNKHDRSZ (sizeof(tstrTlsSrvChunkHdr)) + #define CHUNKSZ (TXLIMIT - 256) // divisible by 4 + uint8 saveblob[CHUNKHDRSZ]; + uint32 ofs = 0; + uint32 thischunksz = 0; + + // first is special - over writing our header + m2m_memcpy(saveblob, &pu8Buffer[ofs], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ,u32BufferSz-ofs); // no need to round up to quad words this time + + tstrTlsSrvChunkHdr* pchkhdr = (tstrTlsSrvChunkHdr*)&pu8Buffer[ofs]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs], thischunksz, 0); + M2M_INFO("Transferred %u bytes of cert data CHUNKED to offset %u total %u\n", thischunksz, ofs, u32BufferSz); + m2m_memcpy(&pu8Buffer[ofs], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + + while (ofs < u32BufferSz) + { + // Subsequent chunks write header before and send a little more + m2m_memcpy(saveblob, &pu8Buffer[ofs-CHUNKHDRSZ], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ,u32BufferSz-ofs); + thischunksz = (thischunksz + 3) & 0xFFFFFFFC; // needs to round up to quad word length + pchkhdr = (tstrTlsSrvChunkHdr*)&pu8Buffer[ofs - CHUNKHDRSZ]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs - CHUNKHDRSZ], thischunksz + CHUNKHDRSZ, 0); + M2M_INFO("Transferred %u bytes of cert data CHUNKED to offset %u total %u\n", thischunksz, ofs, u32BufferSz); + m2m_memcpy(&pu8Buffer[ofs - CHUNKHDRSZ], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + } + } + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_cert(uint32 u32ReadAddr, uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) +{ + uint8 bSetRxDone = 1; + uint16 u16HashSz, u16SigSz, u16KeySz; + sint8 s8Ret = M2M_SUCCESS; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(hif_receive(gu32HIFAddr, (uint8*)pu16CurveType, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16HashSz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16SigSz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + (*pu16CurveType)= _htons((*pu16CurveType)); + pu8Key->u16Size = _htons(u16KeySz); + u16HashSz = _htons(u16HashSz); + u16SigSz = _htons(u16SigSz); + + if(hif_receive(gu32HIFAddr, pu8Key->X, pu8Key->u16Size * 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += (pu8Key->u16Size * 2); + + if(hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16HashSz; + + if(hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16SigSz; + + bSetRxDone = 0; + +__ERR: + if(bSetRxDone) + { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_hash(uint32 u32ReadAddr, uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) +{ + uint8 bSetRxDone = 1; + sint8 s8Ret = M2M_SUCCESS; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + + bSetRxDone = 0; + +__ERR: + if(bSetRxDone) + { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_stop_processing_certs(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_stop_processing_certs(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! + @fn \ m2m_ssl_ecc_process_done(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn \ + m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination, except for combinations involving both RSA + and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP) +{ + sint8 s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8*)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + sint8 s8Ret = M2M_SUCCESS; + + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + genuStatus = TLS_FLASH_ERR_UNKNOWN; + + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL,m2m_ssl_cb); + if (s8Ret != M2M_SUCCESS) + { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/source/m2m_wifi.c b/AudioConsole.X/Source/winc3400/driver/source/m2m_wifi.c new file mode 100644 index 0000000..6e63116 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/m2m_wifi.c @@ -0,0 +1,1482 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" +#include + +static volatile uint8 gu8ChNum; +static tpfAppWifiCb gpfAppWifiCb = NULL; + + +#ifdef ETH_MODE +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8* gau8ethRcvBuf=NULL; +static uint16 gu16ethRcvBufSize ; +#endif + +//#define CONF_MGMT + +#ifdef CONF_MGMT +static tpfAppMonCb gpfAppMonCb = NULL; +static struct _tstrMgmtCtrl +{ + uint8* pu8Buf; + uint16 u16Offset; + uint16 u16Sz; +} +gstrMgmtCtrl = {NULL, 0 , 0}; +#endif +/** +* @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +* @author +* @date +* @version 1.0 +*/ +static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + uint8 rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) + { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8*) &strState,sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) + { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8*) &strSysTime,sizeof(tstrSystemTime), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } + else if(u8OpCode == M2M_WIFI_RESP_CONN_INFO) + { + tstrM2MConnInfo strConnInfo; + if(hif_receive(u32Addr, (uint8*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) + { +#if 0 + if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) + { + tstrM2mWifiStateChanged strState; + m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); + if (app_wifi_recover_cb) + app_wifi_recover_cb(strState.u8CurrState); + } +#endif + } + else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) + { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig); + } + } + else if (u8OpCode == M2M_WIFI_REQ_WPS) + { + tstrM2MWPSInfo strWps; + m2m_memset((uint8*)&strWps,0,sizeof(tstrM2MWPSInfo)); + if(hif_receive(u32Addr, (uint8*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } + else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) + { + uint32 u32ConflictedIP; + if(hif_receive(u32Addr, (uint8 *)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) + { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \" \n", + BYTE_0(u32ConflictedIP),BYTE_1(u32ConflictedIP),BYTE_2(u32ConflictedIP),BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) + { + tstrM2mScanDone strState; + if(hif_receive(u32Addr, (uint8*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) + { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) + { + tstrM2mWifiscanResult strScanResult; + if(hif_receive(u32Addr, (uint8*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } + else if(u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) + { + tstrM2MProvisionInfo strProvInfo; + if(hif_receive(u32Addr, (uint8*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } + else if(u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) + { + tstrM2MDefaultConnResp strResp; + if(hif_receive(u32Addr, (uint8*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_BLE_API_RECV) + { + //Read the length + if(hif_receive(u32Addr, rx_buf, 2, 0) == M2M_SUCCESS) + { + uint16 u16BleMsgLen = (rx_buf[1] << 8) + rx_buf[0]; + tstrM2mBleApiMsg* bleRx = (tstrM2mBleApiMsg*)malloc(u16BleMsgLen + sizeof(tstrM2mBleApiMsg)); + + if(bleRx != NULL) + { + bleRx->u16Len = u16BleMsgLen; + + //Read the rest of the message + if (hif_receive(u32Addr+2, bleRx->data, bleRx->u16Len, 1)== M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_BLE_API_RECV, bleRx); + } + free(bleRx); + } + } + } + else if(u8OpCode == M2M_WIFI_RESP_GET_PRNG) + { + tstrPrng strPrng; + if(hif_receive(u32Addr, (uint8*)&strPrng,sizeof(tstrPrng), 0) == M2M_SUCCESS) + { + if(hif_receive(u32Addr + sizeof(tstrPrng),strPrng.pu8RngBuff,strPrng.u16PrngSize, 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) { + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG,&strPrng); + } + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_SET_GAIN_TABLE) + { + tstrM2MGainTableRsp strGainRsp; + if (hif_receive(u32Addr, (uint8*) &strGainRsp,sizeof(tstrM2MGainTableRsp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SET_GAIN_TABLE, &strGainRsp); + } + } +#ifdef ETH_MODE + else if(u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) + { + if(hif_receive(u32Addr, rx_buf ,sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) + { + tstrM2mIpRsvdPkt * pstrM2MIpRxPkt = (tstrM2mIpRsvdPkt*)rx_buf; + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16 u16Offset = pstrM2MIpRxPkt->u16PktOffset; + + strM2mIpCtrlBuf.u16RemainigDataSize = pstrM2MIpRxPkt->u16PktSz; + if((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) + { + while (strM2mIpCtrlBuf.u16RemainigDataSize > 0) + { + if(strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) + { + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; + } + else + { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; + } + if(hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) + { + strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } + else + { + break; + } + } + } + } + } +#endif + +#ifdef CONF_MGMT + else if(u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) + { + tstrM2MWifiRxPacketInfo strRxPacketInfo; + if(u16DataSize >= sizeof(tstrM2MWifiRxPacketInfo)) { + if(hif_receive(u32Addr, (uint8*)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) + { + u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); + if(u16DataSize > 0 && gstrMgmtCtrl.pu8Buf != NULL) + { + if(u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) + { + u16DataSize = gstrMgmtCtrl.u16Sz; + } + u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; + if(hif_receive(u32Addr , gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) + { + u16DataSize = 0; + } + } + if(gpfAppMonCb) + gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf,u16DataSize); + } + } else { + M2M_ERR("Incorrect mon data size %u\n", u16DataSize); + } + } +#endif + else + { + M2M_ERR("REQ Not defined %d\n",u8OpCode); + } +} + +sint8 m2m_wifi_download_mode() +{ + sint8 ret = M2M_SUCCESS; + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(0); + if(ret != M2M_SUCCESS) goto _EXIT0; + + + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static sint8 m2m_validate_ap_parameters(CONST tstrM2MAPConfig* pstrM2MAPConfig) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if(pstrM2MAPConfig == NULL) + { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if((m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) >= M2M_MAX_SSID_LEN)) + { + M2M_ERR("INVALID SSID\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if(pstrM2MAPConfig->u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPConfig->u8ListenChannel < M2M_WIFI_CH_1) + { + M2M_ERR("INVALID CH\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if(!(pstrM2MAPConfig->au8DHCPServerIP[0] || pstrM2MAPConfig->au8DHCPServerIP[1])) + { + if(!(pstrM2MAPConfig->au8DHCPServerIP[2])) + { + M2M_ERR("INVALID DHCP SERVER IP\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_OPEN) + { + goto ERR1; + } + else if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WEP) + { + /* Check for WEP Key index */ + if((pstrM2MAPConfig->u8KeyIndx <= 0) || (pstrM2MAPConfig->u8KeyIndx > WEP_KEY_MAX_INDEX)) + { + M2M_ERR("INVALID KEY INDEX\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if( (pstrM2MAPConfig->u8KeySz != WEP_40_KEY_STRING_SIZE) && + (pstrM2MAPConfig->u8KeySz != WEP_104_KEY_STRING_SIZE) + ) + { + M2M_ERR("INVALID KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key */ + if((pstrM2MAPConfig->au8WepKey == NULL) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) > WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID WEP KEY\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + else + { + M2M_ERR("INVALID AUTHENTICATION MODE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} +static sint8 m2m_validate_scan_options(tstrM2MScanOption* ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if(ptstrM2MScanOption == NULL) + { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + } + else + { + /* Check for valid No of slots */ + if(ptstrM2MScanOption->u8NumOfSlot == 0) + { + M2M_ERR("INVALID No of scan slots!\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid time of slots */ + if((ptstrM2MScanOption->u8SlotTime < 10) || (ptstrM2MScanOption->u8SlotTime > 250)) + { + M2M_ERR("INVALID scan slot time!\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid No of probe requests per slot */ + if((ptstrM2MScanOption->u8ProbesPerSlot == 0) || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) + { + M2M_ERR("INVALID No of probe requests per scan slot\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid RSSI threshold */ + if(ptstrM2MScanOption->s8RssiThresh >= 0) + { + M2M_ERR("INVALID RSSI threshold %d \n",ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + } + return s8Ret; +} + +NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MGainTable strGainTable = {0}; + + strGainTable.u8GainTable = table_idx; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_GAIN_TABLE, (uint8 *)&strGainTable, sizeof(tstrM2MGainTable), NULL, 0, 0); + return s8Ret; +} + + +sint8 m2m_wifi_init_hold(void) +{ + sint8 ret = M2M_ERR_FAIL; + + /* Apply device specific initialization. */ + ret = nm_drv_init_hold(0); + + return ret; +} +sint8 m2m_wifi_init_start(tstrWifiInitParam * param) +{ + tstrM2mRev strtmp; + sint8 ret = M2M_SUCCESS; + + if(param == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = param->pfAppWifiCb; + +#ifdef ETH_MODE + gpfAppEthCb = param->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = param->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = param->strEthInitParam.u16ethRcvBufSize; +#endif + +#ifdef CONF_MGMT + gpfAppMonCb = param->pfAppMonCb; +#endif + + /* Apply device specific initialization. */ + ret = nm_drv_init_start(NULL); + if(ret != M2M_SUCCESS) goto _EXIT0; + /* Initialize host interface module */ + ret = hif_init(NULL); + if(ret != M2M_SUCCESS) goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI,m2m_wifi_cb); + + M2M_INFO("Curr driver ver: %u.%u.%u\n", M2M_DRIVER_VERSION_MAJOR_NO, M2M_DRIVER_VERSION_MINOR_NO, M2M_DRIVER_VERSION_PATCH_NO); + M2M_INFO("Curr driver HIF Level: (%u) %u.%u\n", M2M_HIF_BLOCK_VALUE, M2M_HIF_MAJOR_VALUE, M2M_HIF_MINOR_VALUE); + ret = m2m_wifi_get_firmware_version(&strtmp); + m2m_ota_get_firmware_version(&strtmp); + + if(ret == M2M_SUCCESS) + { + ret = hif_enable_access(); + if(ret == M2M_SUCCESS) + { + m2m_wifi_ble_set_gain_table(param->GainTableIndex); + } + } + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); +_EXIT0: + return ret; +} +sint8 m2m_wifi_init(tstrWifiInitParam * param) +{ + sint8 ret = M2M_SUCCESS; + + ret = m2m_wifi_init_hold(); + if (ret == M2M_SUCCESS) + { + ret = m2m_wifi_init_start(param); + } + return ret; +} +sint8 m2m_wifi_deinit(void * arg) +{ + + hif_deinit(NULL); + + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} +sint8 m2m_wifi_reinit_hold(void) +{ + m2m_wifi_deinit(NULL); + return m2m_wifi_init_hold(); +} +sint8 m2m_wifi_reinit_start(tstrWifiInitParam * param) +{ + return m2m_wifi_init_start(param); +} +sint8 m2m_wifi_reinit(tstrWifiInitParam * param) +{ + sint8 ret = M2M_ERR_FAIL; + ret = m2m_wifi_reinit_hold(); + if(ret == M2M_SUCCESS) { + ret = m2m_wifi_reinit_start(param); + } + return ret; +} + +void m2m_wifi_yield(void) +{ + hif_yield(); +} + +sint8 m2m_wifi_handle_events(void * arg) +{ + return hif_handle_isr(); +} + +sint8 m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0,NULL, 0,0); +} + +sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch,0); +} +sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, uint8 u8NoSaveCred) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mWifiConnect strConnect; + tstrM2MWifiSecInfo *pstrAuthInfo; + + if(u8SecType != M2M_WIFI_SEC_OPEN) + { + if(pvAuthInfo == NULL) + { + M2M_ERR("Key is not valid\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + if((u8SecType == M2M_WIFI_SEC_WPA_PSK) && (m2m_strlen(pvAuthInfo) == (M2M_MAX_PSK_LEN-1))) + { + uint8 i = 0; + uint8* pu8Psk = (uint8*)pvAuthInfo; + while(i < (M2M_MAX_PSK_LEN-1)) + { + if(pu8Psk[i]<'0' || (pu8Psk[i]>'9' && pu8Psk[i] < 'A')|| (pu8Psk[i]>'F' && pu8Psk[i] < 'a') || pu8Psk[i] > 'f') + { + M2M_ERR("Invalid Key\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + i++; + } + } + } + if((u8SsidLen<=0)||(u8SsidLen>=M2M_MAX_SSID_LEN)) + { + M2M_ERR("SSID LEN INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + if(u16Ch < M2M_WIFI_CH_1 || u16Ch > M2M_WIFI_CH_14) + { + if(u16Ch!=M2M_WIFI_CH_ALL) + { + M2M_ERR("CH INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + } + + m2m_memcpy(strConnect.au8SSID, (uint8*)pcSsid, u8SsidLen); + strConnect.au8SSID[u8SsidLen] = 0; + strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); + /* Credentials will be Not be saved if u8NoSaveCred is set */ + strConnect.u8NoSaveCred = u8NoSaveCred ? 1:0; + pstrAuthInfo = &strConnect.strSec; + pstrAuthInfo->u8SecType = u8SecType; + + if(u8SecType == M2M_WIFI_SEC_WEP) + { + tstrM2mWifiWepParams * pstrWepParams = (tstrM2mWifiWepParams*)pvAuthInfo; + tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; + pstrWep->u8KeyIndx =pstrWepParams->u8KeyIndx-1; + + if(pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) + { + M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); + ret = M2M_ERR_FAIL; + goto ERR1; + } + pstrWep->u8KeySz = pstrWepParams->u8KeySz-1; + if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE)&& (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy((uint8*)pstrWep->au8WepKey,(uint8*)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); + pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; + + } + + + else if(u8SecType == M2M_WIFI_SEC_WPA_PSK) + { + uint16 u16KeyLen = m2m_strlen((uint8*)pvAuthInfo); + if((u16KeyLen <= 0)||(u16KeyLen >= M2M_MAX_PSK_LEN)) + { + M2M_ERR("Incorrect PSK key length\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8*)pvAuthInfo, u16KeyLen + 1); + } + else if(u8SecType == M2M_WIFI_SEC_802_1X) + { + m2m_memcpy((uint8*)&pstrAuthInfo->uniAuth.strCred1x, (uint8*)pvAuthInfo, sizeof(tstr1xAuthCredentials)); + } + else if(u8SecType == M2M_WIFI_SEC_OPEN) + { + + } + else + { + M2M_ERR("undefined sec type\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8*)&strConnect, sizeof(tstrM2mWifiConnect),NULL, 0,0); + +ERR1: + return ret; +} + +sint8 m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0,0); +} +sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + m2m_memcpy((uint8*) strTmp.au8Mac, (uint8*) au8MacAddress, 6); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, + (uint8*) &strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0,0); +} + +sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32( + pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32( + pstrStaticIPConf->u32SubnetMask); + return hif_send(M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, + (uint8*) pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0,0); +} + +sint8 m2m_wifi_request_dhcp_client(void) +{ + /*legacy API should be removed */ + return 0; +} +sint8 m2m_wifi_request_dhcp_server(uint8* addr) +{ + /*legacy API should be removed */ + return 0; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); +@brief Set the Wi-Fi listen interval for power save operation. It is represented in units + of AP Beacon periods. +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tstrM2mLsnInt , m2m_wifi_set_sleep_mode +@pre m2m_wifi_set_sleep_mode shall be called first +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ) +{ + + uint8 u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); + + +} + +sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt* pstrM2mLsnInt) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8*)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +sint8 m2m_wifi_set_cust_InfoElement(uint8* pau8M2mCustInfoElement) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CUST_INFO_ELEMENT, (uint8*)pau8M2mCustInfoElement, pau8M2mCustInfoElement[0]+1, NULL, 0, 0); +} + +sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if(m2m_validate_scan_options (ptstrM2MScanOption) == M2M_SUCCESS) + { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_OPTION, (uint8*)ptstrM2MScanOption, sizeof(tstrM2MScanOption),NULL, 0,0); + } + return s8Ret; +} +sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_REGION, (uint8*)&strScanRegion, sizeof(tstrM2MScanRegion),NULL, 0,0); + return s8Ret; +} +sint8 m2m_wifi_request_scan(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_passive(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} +sint8 m2m_wifi_wps(uint8 u8TriggerType,const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + m2m_memcpy ((uint8*)strtmp.acPinNumber,(uint8*) pcPinNumber,8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8*)&strtmp,sizeof(tstrM2MWPSConnect), NULL, 0,0); +} + +sint8 m2m_wifi_wps_disable(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL,0, NULL, 0, 0); + return ret; +} + +#if 0 +/* + * These two functions m2m_wifi_req_client_ctrl and m2m_wifi_req_server_init are for a mode in which two WINC ICs + * communicate with each other via probe request and probe response frames. This mode is not supported in WINC fw. + */ +sint8 m2m_wifi_req_client_ctrl(uint8 u8Cmd) +{ + + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2Mservercmd strCmd; + strCmd.u8cmd = u8Cmd; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CLIENT_CTRL, (uint8*)&strCmd, sizeof(tstrM2Mservercmd), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +sint8 m2m_wifi_req_server_init(uint8 ch) +{ + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2mServerInit strServer; + strServer.u8Channel = ch; + ret = hif_send(M2M_REQ_GROUP_WIFI,M2M_WIFI_REQ_SERVER_INIT, (uint8*)&strServer, sizeof(tstrM2mServerInit), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +#endif + +sint8 m2m_wifi_p2p(uint8 u8Channel) +{ + sint8 ret = M2M_SUCCESS; + if((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) + { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8*)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0,0); + } + else + { + M2M_ERR("Listen channel should only be 1, 6 or 11\n"); + ret = M2M_ERR_FAIL; + } + return ret; +} +sint8 m2m_wifi_p2p_disconnect(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig) +{ + sint8 ret = M2M_ERR_FAIL; + if(M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPConfig)) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig), NULL, 0, 0); + } + return ret; +} +sint8 m2m_wifi_disable_ap(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_req_curr_rssi(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL,0, 0); + return ret; +} + +sint8 m2m_wifi_req_restrict_ble(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_RESTRICT_BLE,NULL, 0, NULL, 0, 0); + return ret; +} + +sint8 m2m_wifi_req_unrestrict_ble(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_UNRESTRICT_BLE,NULL, 0, NULL, 0, 0); + return ret; +} + +sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) +{ + sint8 s8Ret = -1; + if((pu8Packet != NULL)&&(u16PacketSize>0)) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8Packet, u16PacketSize, M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8* pu8IsValid) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + if(ret == M2M_SUCCESS) + { + ret = hif_chip_sleep(); + } + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nmi_get_mac_address(pu8MacAddr); + if(ret == M2M_SUCCESS) + { + ret = hif_chip_sleep(); + } + } + + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +sint8 m2m_wifi_req_scan_result(uint8 index) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_RESULT, (uint8*) &strReqScanRlt, sizeof(tstrM2mReqScanResult), NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8 m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8 m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@brief Set the power saving mode for the WINC3400. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC3400 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC3400 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8*) &strPs,sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\n",PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(void) +@brief Request from WINC3400 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning This API is currently unsupported on the WINC3400 +*/ +sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime) +{ + sint8 ret = M2M_SUCCESS; + uint8 psType; + psType = hif_get_sleep_mode(); + if(psType == M2M_PS_MANUAL) + { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8*) &strPs,sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@brief Set the WINC3400 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if(u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) + { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + //pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength ++; + m2m_memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8*)&strDeviceName, sizeof(tstrM2MDeviceNameConfig), NULL, 0,0); +} +/*! +@fn \ + uint32 m2m_wifi_get_chipId(void) + +@brief + Get the WINC Chip ID. + +@return + The function SHALL return chipID >0 or 0 for failure. +*/ +uint32 m2m_wifi_get_chipId(void) +{ + return nmi_get_chipid(); +} +/*! +@fn sint8 m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +/*! +@fn sint8 m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +sint8 m2m_wifi_check_ota_rb(void) +{ + sint8 ret = M2M_SUCCESS; + uint16 ota_hif_info = 0; + + ret = nm_get_hif_info(NULL, &ota_hif_info); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(ota_hif_info); + } + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev * pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#ifdef CONF_MGMT +sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset) +{ + sint8 s8Ret = -1; + if((pstrMtrCtrl->u8ChannelID >= M2M_WIFI_CH_1) && (pstrMtrCtrl->u8ChannelID <= M2M_WIFI_CH_14)) + { + gstrMgmtCtrl.pu8Buf = pu8PayloadBuffer; + gstrMgmtCtrl.u16Sz = u16BufferSize; + gstrMgmtCtrl.u16Offset = u16DataOffset; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_MONITORING, + (uint8*)pstrMtrCtrl, sizeof(tstrM2MWifiMonitorModeCtrl), NULL, 0,0); + } + return s8Ret; +} +sint8 m2m_wifi_disable_monitoring_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_MONITORING, NULL, 0, NULL, 0,0); +} + +sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize) +{ + sint8 s8Ret = -1; + if(pu8WlanPacket != NULL) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16WlanPktSize; + strTxPkt.u16HeaderLength = u16WlanHeaderLength; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_WIFI_PACKET | M2M_REQ_DATA_PKT, + (uint8*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8WlanPacket, u16WlanPktSize, sizeof(tstrM2MWifiTxPacketInfo)); + } + return s8Ret; +} +#endif + +sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 bEnableHttpRedirect) +{ + sint8 s8Ret = M2M_ERR_FAIL; + + if((pstrAPConfig != NULL)) + { + tstrM2MProvisionModeConfig strProvConfig; + if(M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPConfig)) + { + m2m_memcpy((uint8*)&strProvConfig.strApConfig, (uint8*)pstrAPConfig, sizeof(tstrM2MAPConfig)); + if((m2m_strlen((uint8 *)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) + { + M2M_ERR("INVALID DOMAIN NAME\n"); + goto ERR1; + } + m2m_memcpy((uint8*)strProvConfig.acHttpServerDomainName, (uint8*)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); + } + else + { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +sint8 m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8*)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_get_sytem_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL,0, NULL, 0, 0); +} + +sint8 m2m_wifi_enable_sntp(uint8 bEnable) +{ + uint8 u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief Change the power profile mode +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_POWER_PROFILE, (uint8*)&strM2mPwrMode,sizeof(tstrM2mPwrMode), NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_TX_POWER, (uint8*)&strM2mTxPwrLevel,sizeof(tstrM2mTxPwrLevel), NULL, 0, 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_ENABLE_LOGS, (uint8*)&strM2mEnableLogs,sizeof(tstrM2mEnableLogs), NULL, 0, 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, (uint8*)&strM2mBattVol,sizeof(tstrM2mBatteryVoltage), NULL, 0, 0); + return ret; +} +/*! +@fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +*/ +sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +{ + sint8 ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)))&&(pu8PrngBuff != NULL)) + { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_PRNG|M2M_REQ_DATA_PKT,(uint8 *)&strRng, sizeof(tstrPrng),NULL,0, 0); + } + else + { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\n",u16PrngSize); + } + return ret; +} +#ifdef ETH_MODE +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) +{ + sint8 s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if(pu8MulticastMacAddress != NULL ) + { + strMulticastMac.u8AddRemove = u8AddRemove; + m2m_memcpy(strMulticastMac.au8macaddress,pu8MulticastMacAddress,M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n",strMulticastMac.au8macaddress[0],strMulticastMac.au8macaddress[1],strMulticastMac.au8macaddress[2],strMulticastMac.au8macaddress[3],strMulticastMac.au8macaddress[4],strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_MCAST, (uint8 *)&strMulticastMac,sizeof(tstrM2MMulticastMac),NULL,0,0); + } + + return s8ret; + +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +@brief + set the ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen) +{ + sint8 s8ret = M2M_SUCCESS; + if(pvBuffer != NULL) + { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize= u16BufferLen; + } + else + { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} +#endif + +/*! +@fn \ + NMI_API sint8 m2m_wifi_ble_api_send(const uint8* const msg, const uint32 len); + +@brief + Send an encapsulated Atmel BLE API message + +@param [in] msg + Pointer to the Atmel BLE API message raw bytes +@param [in] len + Length of the msg + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_ble_api_send(uint8* msg, uint32 len) +{ + tstrM2mBleApiMsg bleTx; + bleTx.u16Len = len; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_BLE_API_SEND | M2M_REQ_DATA_PKT, + (uint8*)&bleTx, sizeof(tstrM2mBleApiMsg), msg, len, sizeof(tstrM2mBleApiMsg)); +} diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmasic.c b/AudioConsole.X/Source/winc3400/driver/source/nmasic.c new file mode 100644 index 0000000..7a6c4a6 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmasic.c @@ -0,0 +1,741 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 ASIC specific internal APIs. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmasic.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32)X[1+Y]<<8) + ((uint32)X[2+Y]<<16) +((uint32)X[3+Y]<<24)) + + + + +#define TIMEOUT (2000) +#define M2M_DISABLE_PS 0xD0UL + +/* Assume initially we're dealing with D0 - we will try other addresses if this + * fails - the addresses are as follows: + * 0x13 - for D0 + * 0x0F - for B0 + * 0x0E - for A0 + */ +static uint32 clk_status_reg_adr = 0x13; + +sint8 chip_apply_conf(uint32 u32Conf) +{ + sint8 ret = M2M_SUCCESS; + uint32 val32 = u32Conf; + +#ifdef __ENABLE_PMU__ + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if(val32 != 0) { + uint32 reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if(ret == M2M_SUCCESS) { + if(reg == val32) + break; + } + } else { + break; + } + } while(1); + + return M2M_SUCCESS; +} +/** +* @fn nm_clkless_wake +* @brief Wakeup the chip using clockless registers +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 06 June 2014 +* @version 1.0 +*/ +sint8 nm_clkless_wake(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg, clk_status_reg,trials = 0; + uint32 keeptrying = 200; + /* wait 1ms, spi data read */ + nm_bsp_sleep(1); + ret = nm_read_reg_with_ret(0x1, ®); + if(ret != M2M_SUCCESS) { + M2M_ERR("Bus error (1). Wake up failed\n"); + return ret; + } + + /* + * At this point, I am not sure whether it is B0 or A0 + * If B0, then clks_enabled bit exists in register 0xf + * If A0, then clks_enabled bit exists in register 0xe + */ + do + { + /* Set bit 1 */ + nm_write_reg(0x1, reg | (1 << 1)); + + // Search for the correct (clock status) register address + do + { + if (keeptrying) --keeptrying; + + /* wait 1ms, spi data read */ + nm_bsp_sleep(1); + ret = nm_read_reg_with_ret(clk_status_reg_adr, &clk_status_reg); + if (ret != M2M_SUCCESS || (ret == M2M_SUCCESS && clk_status_reg == 0)) { + switch (clk_status_reg_adr) { + case 0x13: clk_status_reg_adr = 0x0F; break; + case 0x0F: clk_status_reg_adr = 0x0E; break; + default: clk_status_reg_adr = 0x00; break; + } + } + else + break; // we have found the correct register, break out of the search + } while (clk_status_reg_adr && keeptrying); + + if (0 == clk_status_reg_adr) { + M2M_ERR("Bus error (2). Wake up failed\n"); + return ret; + } + + // in case of clocks off, wait 2ms, and check it again. + // if still off, wait for another 2ms, for a total wait of 6ms. + // If still off, redo the wake up sequence + trials = 0; + while( ((clk_status_reg & 0x4) == 0) && (((++trials) %3) == 0) && keeptrying) + { + --keeptrying; + + /* Wait for the chip to stabilize*/ + nm_bsp_sleep(2); + + // Make sure chip is awake. This is an extra step that can be removed + // later to avoid the bus access overhead + nm_read_reg_with_ret(clk_status_reg_adr, &clk_status_reg); + + if ((clk_status_reg & 0x4) == 0) + { + M2M_ERR("clocks still OFF. Wake up failed\n"); + } + } + // in case of failure, Reset the wakeup bit to introduce a new edge on the next loop + if((clk_status_reg & 0x4) == 0) + { + // Reset bit 0 + nm_write_reg(0x1, reg | (1 << 1)); + } + } while((clk_status_reg & 0x4) == 0 && keeptrying); + + if (!keeptrying) + { + M2M_ERR("Wake up failed - out of retries\n"); + ret = M2M_ERR_INIT; + } + + return ret; +} +void chip_idle(void) +{ + uint32 reg =0; + nm_read_reg_with_ret(0x1, ®); + if(reg&0x2) + { + reg &=~(1 << 1); + nm_write_reg(0x1, reg); + } +} + +void enable_rf_blocks(void) +{ + nm_write_reg(0x6, 0xdb); + nm_write_reg(0x7, 0x6); + nm_bsp_sleep(10); + nm_write_reg(0x1480, 0); + nm_write_reg(0x1484, 0); + nm_bsp_sleep(10); + + nm_write_reg(0x6, 0x0); + nm_write_reg(0x7, 0x0); +} + +sint8 enable_interrupts(void) +{ + uint32 reg; + sint8 ret; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32) 1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32) 1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + return M2M_SUCCESS; +} + +sint8 cpu_start(void) { + uint32 reg; + sint8 ret; + + /** + reset regs + */ + nm_write_reg(BOOTROM_REG,0); + nm_write_reg(NMI_STATE_REG,0); + nm_write_reg(NMI_REV_REG,0); + + /** + Go... + **/ + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret = nm_write_reg(0x150014, 0x1); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + return ret; +} + +uint32 nmi_get_chipid(void) +{ + static uint32 chipid = 0; + + if (chipid == 0) { + uint32 rfrevid; + + if((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if(chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if(chipid == 0x1002b0) { + if(rfrevid == 3) { /* 1002B0 */ + } else if(rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if(chipid == 0x1000f0) { + /* For 3400, the WiFi chip ID register reads 0x1000f0. + * Therefore using BT chip ID register here which should read 0x3000D0 + */ +#define rBT_CHIP_ID_REG (0x3b0000) + if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if(chipid == 0x3000d0) { + if(rfrevid == 6) { + chipid = 0x3000d1; + } + else if(rfrevid == 2) { + chipid = 0x3000d2; + } + } + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if(chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if((chipid & 0xf00000) == 0x300000) { + if(flashid == 0x1440ef) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } + } else { + if(flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if(flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } + } +#else + /*M2M is by default have SPI flash*/ + if((chipid & 0xf00000) == 0x300000) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } else { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32 nmi_get_rfrevid(void) +{ + uint32 rfrevid; + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + return 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if(REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32 pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); + +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32 val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} +sint8 chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_clkless_wake(); + if(ret != M2M_SUCCESS) return ret; + +// enable_rf_blocks(); MERGEBUG: TEMPORARILY DISABLING + + return ret; +} +sint8 chip_reset_and_cpu_halt(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0; + + ret = chip_wake(); + if(ret != M2M_SUCCESS) { + return ret; + } + chip_reset(); + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } +#if 0 + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); +#endif + nm_write_reg(BOOTROM_REG,0); + nm_write_reg(NMI_STATE_REG,0); + nm_write_reg(NMI_REV_REG,0); + nm_write_reg(NMI_PIN_MUX_0, 0x11111000); + return ret; +} +sint8 chip_reset(void) +{ + sint8 ret = M2M_SUCCESS; + +#if 0 + // MERGEBUG: TODO: This causes serial trace from the chip to be garbled - investigate +#ifndef CONF_WINC_USE_UART + nmi_set_sys_clk_src_to_xo(); +#endif +#endif + + ret += nm_write_reg(NMI_GLB_RESET_0, 0); + nm_bsp_sleep(50); +#ifndef CONF_WINC_USE_UART + restore_pmu_settings_after_global_reset(); +#endif + return ret; +} + +sint8 wait_for_bootrom(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + + reg = 0; + while(1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if(reg == 0) + { + reg = 0; + while(reg != M2M_FINISH_BOOT_ROM) + { + nm_bsp_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if(++cnt > TIMEOUT) + { + M2M_DBG("failed to load firmware from flash.\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if(2 == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + } else { + /*bypass this step*/ + } + + if(REV(nmi_get_chipid()) == REV_3A0) + { + chip_apply_conf(rHAVE_USE_PMU_BIT); + } + else + { + chip_apply_conf(0); + } + + nm_write_reg(BOOTROM_REG,M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +sint8 wait_for_firmware_start(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + volatile uint32 regAddress = NMI_STATE_REG; + volatile uint32 checkValue = M2M_FINISH_INIT_STATE; + + if(2 == arg) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) + { + nm_bsp_sleep(2); /* TODO: Why bus error if this delay is not here. */ + M2M_DBG("%x %x %x\n",(unsigned int)nm_read_reg(0x108c),(unsigned int)nm_read_reg(0x108c),(unsigned int)nm_read_reg(0x14A0)); + if (nm_read_reg_with_ret(regAddress, ®) != M2M_SUCCESS) + { + // ensure reg != checkValue + reg = !checkValue; + } + if(++cnt > TIMEOUT) + { + M2M_DBG("Time out for wait firmware Run\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if(M2M_FINISH_INIT_STATE == checkValue) + { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +sint8 chip_deinit(void) +{ + uint32 reg = 0; + sint8 ret; + uint8 timeout = 10; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while writing reg\n"); + return ret; + } + + do { + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while reading reg\n"); + return ret; + } + /*Workaround to ensure that the chip is actually reset*/ + if ((reg & (1 << 10))) { + M2M_DBG("Bit 10 not reset retry %d\n", timeout); + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + timeout--; + } else { + break; + } + + } while (timeout); + + return ret; +} + +#ifdef CONF_PERIPH + +sint8 set_gpio_dir(uint8 gpio, uint8 dir) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +sint8 set_gpio_val(uint8 gpio, uint8 val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +sint8 get_gpio_val(uint8 gpio, uint8* val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + *val = (uint8)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable) +{ + sint8 s8Ret; + uint32 val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if(s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\n"); + goto _EXIT; + } + if(enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if(s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} +#endif /* CONF_PERIPH */ + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if(!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\n"); + m2m_memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\n"); + u32RegValue >>=16; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + m2m_memcpy(pu8MacAddr,mac,6); + if(pu8IsValid) *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if(pu8IsValid) *pu8IsValid = 0; + return ret; +} + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &=0x0000ffff; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + + return ret; + +_EXIT_ERR: + return ret; +} diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmasic.h b/AudioConsole.X/Source/winc3400/driver/source/nmasic.h new file mode 100644 index 0000000..ca32b3a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmasic.h @@ -0,0 +1,141 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 ASIC specific internal APIs. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "common/include/nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define CHIP_ID_3000D (0x3000D0) + +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) (((id & 0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) (((id & 0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3400(id) (((id & 0xfff0f000) == 0x300000) ? 1 : 0) +#define REV(id) ( ((id) & 0x00000fff ) ) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) + +typedef struct{ + uint32 u32Mac_efuse_mib; + uint32 u32Firmware_Ota_rev; +}tstrGpRegs; + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_clkless_wake +* @brief Wakeup the chip using clockless registers +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +*/ +sint8 nm_clkless_wake(void); + +sint8 chip_wake(void); + +void chip_idle(void); + +void enable_rf_blocks(void); + +sint8 enable_interrupts(void); + +sint8 cpu_start(void); + +uint32 nmi_get_chipid(void); + +uint32 nmi_get_rfrevid(void); + +void restore_pmu_settings_after_global_reset(void); + +void nmi_update_pll(void); + +void nmi_set_sys_clk_src_to_xo(void); + +sint8 chip_reset(void); + +sint8 wait_for_bootrom(uint8); + +sint8 wait_for_firmware_start(uint8); + +sint8 chip_deinit(void); + +sint8 chip_reset_and_cpu_halt(void); + +sint8 set_gpio_dir(uint8 gpio, uint8 dir); + +sint8 set_gpio_val(uint8 gpio, uint8 val); + +sint8 get_gpio_val(uint8 gpio, uint8* val); + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable); + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr); + +sint8 chip_apply_conf(uint32 u32conf); + +#ifdef __cplusplus + } + #endif + +#endif /*_NMASIC_H_*/ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmbus.c b/AudioConsole.X/Source/winc3400/driver/source/nmbus.c new file mode 100644 index 0000000..fbecaac --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmbus.c @@ -0,0 +1,275 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef CORTUS_APP + +#include "nmbus.h" +#include "nmi2c.h" +#include "nmspi.h" +#include "nmuart.h" + +#define MAX_TRX_CFG_SZ 8 + +/** +* @fn nm_bus_iface_init +* @brief Initialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bus_iface_init(uint8 *pvInitVal, uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal, req_serial_number); + + return ret; +} + +/** +* @fn nm_bus_iface_deinit +* @brief Deinitialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 07 April 2014 +* @version 1.0 +*/ +sint8 nm_bus_iface_deinit(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** +* @fn nm_bus_iface_reconfigure +* @brief reconfigure bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Viswanathan Murugesan +* @date 22 Oct 2014 +* @version 1.0 +*/ +sint8 nm_bus_iface_reconfigure(void *ptr) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART + if(ptr) + ret = nm_uart_reconfigure(ptr); + else + ret = M2M_ERR_BUS_FAIL; +#endif + return ret; +} +/* +* @fn nm_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_read_reg(uint32 u32Addr) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg(u32Addr); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_reg(u32Addr); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_reg(u32Addr); +#else +#error "Plesae define bus usage" +#endif + +} + +/* +* @fn nm_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg_with_ret(u32Addr,pu32RetVal); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_reg_with_ret(u32Addr,pu32RetVal); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_reg_with_ret(u32Addr,pu32RetVal); +#else +#error "Plesae define bus usage" +#endif +} + +/* +* @fn nm_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_reg(u32Addr,u32Val); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_write_reg(u32Addr,u32Val); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_write_reg(u32Addr,u32Val); +#else +#error "Plesae define bus usage" +#endif +} + +static inline sint8 p_nm_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_block(u32Addr,puBuf,u16Sz); +#else +#error "Plesae define bus usage" +#endif + +} +/* +* @fn nm_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u32Sz +* Number of bytes to read. The buffer size must be >= u32Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } + else + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static inline sint8 p_nm_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_write_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_write_block(u32Addr,puBuf,u16Sz); +#else +#error "Plesae define bus usage" +#endif + +} +/** +* @fn nm_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u32Sz +* Number of bytes to write. The buffer size must be >= u32Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } + else + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +#endif + diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmbus.h b/AudioConsole.X/Source/winc3400/driver/source/nmbus.h new file mode 100644 index 0000000..44d1159 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmbus.h @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + + + +#ifdef __cplusplus +extern "C"{ +#endif +/** +* @fn nm_bus_iface_init +* @brief Initialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_init(uint8 *pvInitVal, uint32 req_serial_number); + + +/** +* @fn nm_bus_iface_deinit +* @brief Deinitialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_deinit(void); + +/** +* @fn nm_bus_iface_reconfigure +* @brief reconfigure bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_reconfigure(void *ptr); + +/** +* @fn nm_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_read_reg(uint32 u32Addr); + +/** +* @fn nm_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u32Sz +* Number of bytes to read. The buffer size must be >= u32Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +/** +* @fn nm_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u32Sz +* Number of bytes to write. The buffer size must be >= u32Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmdrv.c b/AudioConsole.X/Source/winc3400/driver/source/nmdrv.c new file mode 100644 index 0000000..a6afce4 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmdrv.c @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 M2M driver APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmdrv.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" + +#ifdef CONF_WINC_USE_SPI +#include "driver/source/nmspi.h" +#endif + +/** +* @fn nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +* @brief Get Hif info of images in both partitions (Firmware and Ota). +* @param [out] pu16FwHifInfo +* Pointer holding Hif info of image in the active partition. +* @param [out] pu16OtaHifInfo +* Pointer holding Hif info of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + if(ret == M2M_SUCCESS) + { + if(pu16FwHifInfo != NULL) + { + *pu16FwHifInfo = (uint16)reg; + } + if(pu16OtaHifInfo) + { + *pu16OtaHifInfo = (uint16)(reg>>16); + } + } + return ret; +} +/** +* @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters +* @version 1.0 +*/ +sint8 nm_get_firmware_full_info(tstrM2mRev* pstrRev) +{ + uint16 fw_hif_info = 0; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev)); + nm_get_hif_info(&fw_hif_info, NULL); + + M2M_INFO("Fw HIF: %04x\n", fw_hif_info); + if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("Firmware HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("Firmware ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("Firmware Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(fw_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent Firmware Version\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_ERR("Unknown Firmware Version\n"); + } + return ret; +} +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +{ + uint16 ota_hif_info = 0; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev)); + nm_get_hif_info(NULL, &ota_hif_info); + + M2M_INFO("Ota HIF: %04x\n", ota_hif_info); + if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("OTA HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("OTA ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("OTA Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(ota_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent OTA Version\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_INFO("No valid Ota image\n"); + } + return ret; +} + +/* +* @fn nm_drv_init_download_mode +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Generic argument +* @author Viswanathan Murugesan +* @date 10 Oct 2014 +* @version 1.0 +*/ +sint8 nm_drv_init_download_mode(uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL, req_serial_number); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + + +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300,0); + +ERR1: + return ret; +} + +sint8 nm_drv_init_hold(uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL, req_serial_number); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + + ret = chip_wake(); + nm_bsp_sleep(10); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\n"); + goto ERR2; + } + /** + Go... + + **/ + //JFM 2021-02-07 + //chip_reset disbled because it failed. Probably because not RTC installed on the board + //retry when available... + +// ret = chip_reset(); +// if (M2M_SUCCESS != ret) { +// goto ERR2; +// } + + + + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + /*return power save to default value*/ + chip_idle(); + + return ret; +ERR2: + nm_bus_iface_deinit(); +ERR1: + return ret; +} + +sint8 nm_drv_init_start(void * arg) +{ + sint8 ret = M2M_SUCCESS; + uint8 u8Mode = M2M_WIFI_MODE_NORMAL; + + if(NULL != arg) { + if(M2M_WIFI_MODE_CONFIG == *((uint8 *)arg)) { + u8Mode = M2M_WIFI_MODE_CONFIG; + } else { + /*continue running*/ + } + } else { + /*continue running*/ + } + + ret = cpu_start(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if(M2M_WIFI_MODE_CONFIG == u8Mode) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\n"); + goto ERR2; + } + + return ret; +ERR2: + nm_bus_iface_deinit(); +#ifdef CONF_WINC_USE_SPI + nm_spi_deinit(); +#endif +ERR1: + return ret; +} + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg - Generic argument passed on to nm_drv_init_start +* @author M. Abdelmawla +* @date 15 July 2012 +* @version 1.0 +*/ +sint8 nm_drv_init(void * arg, uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_drv_init_hold(req_serial_number); + + if(ret == M2M_SUCCESS) + ret = nm_drv_init_start(arg); + + return ret; +} + +/* +* @fn nm_drv_deinit +* @brief Deinitialize NMC1000 driver +* @author M. Abdelmawla +* @date 17 July 2012 +* @version 1.0 +*/ +sint8 nm_drv_deinit(void * arg) +{ + sint8 ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\n"); + goto ERR1; + } +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); +#endif + +ERR1: + return ret; +} + + +/** +* @fn nm_cpu_start(void) +* @brief Start CPU from the WINC module +* @return ZERO in case of success and Negative error code in case of failure +*/ + +sint8 nm_cpu_start(void) +{ + sint8 ret; + + ret = cpu_start(); + return ret; +} \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmdrv.h b/AudioConsole.X/Source/winc3400/driver/source/nmdrv.h new file mode 100644 index 0000000..089c222 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmdrv.h @@ -0,0 +1,147 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 M2M driver APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "common/include/nm_common.h" + +/** +* @struct tstrM2mRev +* @brief Structure holding firmware version parameters and build date/time +*/ +typedef struct { + uint16 u16FirmwareHifInfo; /* Fw HIF Info */ + uint8 u8FirmwareMajor; /* Version Major Number */ + uint8 u8FirmwareRsvd; /* Reserved */ + uint8 u8FirmwareMinor; /* Version Minor */ + uint8 u8FirmwarePatch; /* Patch Number */ + uint8 BuildDate[sizeof(__DATE__)]; // 12 bytes + uint8 BuildTime[sizeof(__TIME__)]; // 9 bytes +} tstrM2mRev; + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +* @brief Get Hif info of images in both partitions (Firmware and Ota). +* @param [out] pu16FwHifInfo +* Pointer holding Hif info of image in the active partition. +* @param [out] pu16OtaHifInfo +* Pointer holding Hif info of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +/** +* @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] pstrRev +* Pointer holds address of structure @ref tstrM2mRev that contains the version parameters +* of image in the active partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_firmware_full_info(tstrM2mRev* pstrRev); +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] pstrRev +* Pointer holds address of structure @ref tstrM2mRev that contains the version parameters +* of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev* pstrRev); +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_download_mode(uint32 req_serial_number); + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg - Generic argument passed on to nm_drv_init_start +* @param [in] req_serial_number +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init(void * arg, uint32 req_serial_number); + +/* +* @fn nm_drv_init_hold +* @brief First part of nm_drv_init, up to the point of initializing spi for flash access. +* @see nm_drv_init +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] req_serial_number +* Parameter inherited from nm_drv_init +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_hold(uint32 req_serial_number); + +/* +* @fn nm_drv_init_start +* @brief Second part of nm_drv_init, continuing from where nm_drv_init_hold left off. +* @see nm_drv_init +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Parameter inherited from nm_drv_init +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_start(void * arg); + +/** +* @fn nm_drv_deinit +* @brief Deinitialize NMC1000 driver +* @author M. Abdelmawla +* @param [in] arg - Generic argument unused. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_deinit(void * arg); + +/** +* @fn nm_cpu_start(void) +* @brief Start CPU from the WINC module +* @return ZERO in case of success and Negative error code in case of failure +*/ + +sint8 nm_cpu_start(void); + +#ifdef __cplusplus + } + #endif + +#endif /*_NMDRV_H_*/ + + diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmflash.c b/AudioConsole.X/Source/winc3400/driver/source/nmflash.c new file mode 100644 index 0000000..726b857 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmflash.c @@ -0,0 +1,873 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_flash.h" +#include "driver/source/nmflash.h" +#include "spi_flash/include/spi_flash.h" +#include "nmdrv.h" +//#include "main.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static uint32 gu32LocationId = MEM_ID_NONE; +static uint8 *gpu8Location = NULL; + +uint16 gu16LastAccessId = 0; +uint8 gu8Success = 0; +uint8 gu8Changed = 0; +uint8 gu8Init = 0; +uint8 gu8Reset = 0; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static sint8 winc_flash_compare(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size) +{ + sint8 ret = M2M_SUCCESS; + uint8 buf[128]; + uint32 offset = 0; + + while (offset < u32Size) + { + uint32 chunk_sz = sizeof(buf); + if (chunk_sz > u32Size - offset) + chunk_sz = u32Size - offset; + ret = spi_flash_read(buf, u32Offset + offset, chunk_sz); + if (ret != M2M_SUCCESS) + break; + ret = m2m_memcmp(buf, pu8Buf + offset, chunk_sz); + if (ret != 0) + break; + offset += chunk_sz; + } + return ret; +} + +sint8 winc_flash_write_verify(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size) +{ + sint8 ret = M2M_ERR_FAIL; + uint8 count = 20; + + while ((ret != M2M_SUCCESS) && (count-- > 0)) + { + ret = spi_flash_write(pu8Buf, u32Offset, u32Size); + if (ret == M2M_SUCCESS) + ret = winc_flash_compare(pu8Buf, u32Offset, u32Size); + } + return ret; +} +static sint8 set_changed_flag(tstrFlashAccessPersistent *pstrPersistentInfo) +{ + sint8 ret = FLASH_RETURN_OK; + if (pstrPersistentInfo->u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED) + { + pstrPersistentInfo->u8ModeFlags &= ~FLASH_MODE_FLAGS_UNCHANGED; + if (winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)) == M2M_SUCCESS) + gu8Changed = 1; + else + ret = FLASH_ERR_WINC_ACCESS; + } + return ret; +} + +static uint8 crc7(uint8 crc, const uint8 *buff, uint16 len) +{ + uint8 reg = crc; + uint16 i; + for(i = 0; i < len; i++) + { + uint16 g; + for(g = 0; g < 8; g++) + { + uint8 inv = (((buff[i] << g) & 0x80) >> 7) ^ ((reg >> 6) & 1); + reg = ((reg << 1) & 0x7f) ^ (9 * inv); + } + } + return reg; +} +static sint8 read_control_sector(tstrOtaControlSec *pstrControlSec, uint32 u32Offset) +{ + sint8 s8Ret = spi_flash_read((uint8*)pstrControlSec, u32Offset, sizeof(tstrOtaControlSec)); + if (s8Ret == M2M_SUCCESS) + { + if (pstrControlSec->u32OtaMagicValue != OTA_MAGIC_VALUE) + s8Ret = M2M_ERR_FAIL; + if (pstrControlSec->u32OtaControlSecCrc != crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4)) + s8Ret = M2M_ERR_FAIL; + } + return s8Ret; +} +static sint8 update_control_sector(tstrOtaControlSec *pstrControlSec) +{ + sint8 ret = M2M_ERR_FAIL; + + ret = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if (ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8*)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if (ret == M2M_SUCCESS) + { + ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if (ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8*)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + } + return ret; +} +static sint8 access_control_sector(tenuCSOp enuOp, uint32 *param) +{ + static tstrOtaControlSec strControlSec = {0}; + sint8 s8Ret = M2M_SUCCESS; + uint8 bUpdate = false; + + if ((enuOp != CS_INITIALIZE) && (strControlSec.u32OtaMagicValue != OTA_MAGIC_VALUE)) + { + if (param != NULL) + *param = 0; + return M2M_ERR_FAIL; + } + + switch (enuOp) + { + case CS_INITIALIZE: + s8Ret = read_control_sector(&strControlSec, M2M_CONTROL_FLASH_OFFSET); + if (s8Ret != M2M_SUCCESS) + { + s8Ret = read_control_sector(&strControlSec, M2M_BACKUP_FLASH_OFFSET); + if (s8Ret == M2M_SUCCESS) + { + /* + * Reinstate the control sector from backup. + */ + s8Ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if (s8Ret == M2M_SUCCESS) + s8Ret = winc_flash_write_verify((uint8*)&strControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + break; + case CS_INVALIDATE_RB: + // Update trashes the backup sector, so we need to avoid unnecessary updates. + if (strControlSec.u32OtaRollbackImageValidStatus != OTA_STATUS_INVALID) + { + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_INVALID; + bUpdate = true; + } + break; + case CS_VALIDATE_RB: + // Update trashes the backup sector, so we need to avoid unnecessary updates. + if (strControlSec.u32OtaRollbackImageValidStatus != OTA_STATUS_VALID) + { + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_VALID; + bUpdate = true; + } + break; + case CS_VALIDATE_SWITCH: + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_VALID; + // intentional fallthrough. + case CS_SWITCH: + if (strControlSec.u32OtaRollbackImageValidStatus == OTA_STATUS_VALID) + { + uint32 tmp = strControlSec.u32OtaCurrentworkingImagOffset; + strControlSec.u32OtaCurrentworkingImagOffset = strControlSec.u32OtaRollbackImageOffset; + strControlSec.u32OtaRollbackImageOffset = tmp; + bUpdate = true; + } + else + s8Ret = M2M_ERR_FAIL; + break; + case CS_GET_ACTIVE: + if (param == NULL) + s8Ret = M2M_ERR_FAIL; + else + *param = strControlSec.u32OtaCurrentworkingImagOffset; + break; + case CS_GET_INACTIVE: + if (param == NULL) + s8Ret = M2M_ERR_FAIL; + else + *param = strControlSec.u32OtaRollbackImageOffset; + break; + case CS_DEINITIALIZE: + m2m_memset((uint8*)&strControlSec, 0, sizeof(tstrOtaControlSec)); + break; + default: + s8Ret = M2M_ERR_FAIL; + } + if (bUpdate) + { + s8Ret = update_control_sector(&strControlSec); + M2M_INFO("CS update:%d %s\n", enuOp, (s8Ret==M2M_SUCCESS)?"":"Failed"); + } + return s8Ret; +} +static sint8 local_access_ptr(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + sint8 s8Ret = M2M_ERR_FAIL; + static uint8 *pu8Location = NULL; + static uint8 u8Flags = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + u8Flags = init_params->u8Flags; + pu8Location = gpu8Location; + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_DATA: + if (pu8Location != NULL) + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + if (u8Flags & FLASH_FN_FLAGS_WRITE) + m2m_memcpy(pu8Location, params->pu8Buf + params->u32DataOffset, params->u32DataSize); + if (u8Flags & FLASH_FN_FLAGS_READ) + m2m_memcpy(params->pu8Buf + params->u32DataOffset, pu8Location, params->u32DataSize); + pu8Location += params->u32DataSize; + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + u8Flags = 0; + pu8Location = NULL; + s8Ret = M2M_SUCCESS; + break; + } + return s8Ret; +} +static sint8 winc_flash_access(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + sint8 s8Ret = M2M_ERR_FAIL; + static uint32 u32CurrentAddr = 0; + static uint8 u8Flags = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + printf("FA Init: 0x%lx Fg 0x%02x Sz 0x%lx \n", gu32LocationId, init_params->u8Flags, init_params->u32TotalSize); + u8Flags = init_params->u8Flags; + switch (gu32LocationId) + { + case MEM_ID_WINC_FLASH: + u32CurrentAddr = 0; + break; + case MEM_ID_WINC_ACTIVE: + s8Ret = access_control_sector(CS_GET_ACTIVE, &u32CurrentAddr); + break; + case MEM_ID_WINC_INACTIVE: + s8Ret = access_control_sector(CS_GET_INACTIVE, &u32CurrentAddr); + /* If we're about to write to the inactive partition, mark it as invalid. */ + if ((s8Ret == M2M_SUCCESS) && (u8Flags & (FLASH_FN_FLAGS_WRITE | FLASH_FN_FLAGS_ERASE))) + s8Ret = access_control_sector(CS_INVALIDATE_RB, NULL); + break; + case MEM_ID_NONE: + s8Ret = M2M_ERR_FAIL; + break; + default: + u32CurrentAddr = gu32LocationId; + break; + } + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + { + init_params->u32AlignmentSize = FLASH_SECTOR_SZ; + init_params->u32StartAlignment = u32CurrentAddr & (FLASH_SECTOR_SZ - 1); + } + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_DATA: + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + if (u8Flags & FLASH_FN_FLAGS_COMPARE_BEFORE) + { + printf("c-"); + // If contents match already, return success + s8Ret = winc_flash_compare(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret == M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + { + uint32 prefill_sz = params->u32DataOffset; + uint32 postfill_sz = params->u32BufSize - (params->u32DataOffset + params->u32DataSize); + if (prefill_sz > 0) + { + printf("r-"); + s8Ret = spi_flash_read(params->pu8Buf, u32CurrentAddr - prefill_sz, prefill_sz); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (postfill_sz > 0) + { + printf("-r"); + s8Ret = spi_flash_read(params->pu8Buf + params->u32BufSize - postfill_sz, u32CurrentAddr + params->u32DataSize, postfill_sz); + if (s8Ret != M2M_SUCCESS) + goto END; + } + } + if (u8Flags & FLASH_FN_FLAGS_BACKUP) + { + if (params->u32BufSize > params->u32DataSize) + { + printf("b"); + s8Ret = winc_flash_write_verify(params->pu8Buf, M2M_BACKUP_FLASH_OFFSET, params->u32BufSize); + if (s8Ret == M2M_SUCCESS) + s8Ret = prepare_backup(u32CurrentAddr - params->u32DataOffset); + if (s8Ret != M2M_SUCCESS) + goto END; + } + } + if (u8Flags & FLASH_FN_FLAGS_ERASE) + { + printf("e"); + s8Ret = spi_flash_erase(u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_WRITE) + { + printf("W"); + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + s8Ret = spi_flash_write(params->pu8Buf, u32CurrentAddr - params->u32DataOffset, params->u32BufSize); + else + s8Ret = spi_flash_write(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_COMPARE_AFTER) + { + printf("-c"); + // If contents do not match, return failure + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + s8Ret = winc_flash_compare(params->pu8Buf, u32CurrentAddr - params->u32DataOffset, params->u32BufSize); + else + s8Ret = winc_flash_compare(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_READ) + { + printf("R"); + s8Ret = spi_flash_read(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } +END: + u32CurrentAddr += params->u32DataSize; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + printf(" FA End 0x%lx\n", u32CurrentAddr); + u8Flags = 0; + u32CurrentAddr = 0; + s8Ret = M2M_SUCCESS; + break; + } + return s8Ret; +} + +void set_internal_info_ptr(tpfDataAccessFn *ppfFn, uint8 *pu8Ptr) +{ + if (ppfFn != NULL) + *ppfFn = local_access_ptr; + gpu8Location = pu8Ptr; +} +void set_internal_info(tpfDataAccessFn *ppfFn, uint32 u32LocationId) +{ + if (ppfFn != NULL) + *ppfFn = winc_flash_access; + gu32LocationId = u32LocationId; +} +uint8 is_internal_info(tpfDataAccessFn pfFn) +{ + if (pfFn == winc_flash_access) + return true; + return false; +} +sint8 recover_backup(void) +{ + sint8 ret = FLASH_RETURN_OK; + uint32 u32BackupAddr = FLASH_BACKUP_STORE_OFFSET; + tstrBackup strBackup; + + while (u32BackupAddr < FLASH_BACKUP_STORE_OFFSET + FLASH_BACKUP_STORE_SZ) + { + sint8 status = spi_flash_read((uint8*)&strBackup, u32BackupAddr, sizeof(tstrBackup)); + if ((status == M2M_SUCCESS) && (strBackup.enuTransferStatus == BACKUP_STATUS_ACTIVE)) + { + uint8 *pu8Buff = malloc(strBackup.u32Size); + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto ERR; + } + status = spi_flash_read(pu8Buff, strBackup.u32SourceAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + status = spi_flash_erase(strBackup.u32DestinationAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + status = winc_flash_write_verify(pu8Buff, strBackup.u32DestinationAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + strBackup.enuTransferStatus = BACKUP_STATUS_DONE; + status = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + } + } + } + free(pu8Buff); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + u32BackupAddr += sizeof(tstrBackup); + } +ERR: + return ret; +} +sint8 prepare_backup(uint32 u32Target) +{ + sint8 s8Ret = M2M_ERR_FAIL; + uint32 u32BackupAddr = FLASH_BACKUP_STORE_OFFSET; + tenuBackupStatus enuStatus = BACKUP_STATUS_EMPTY; + + s8Ret = spi_flash_read((uint8*)&enuStatus, u32BackupAddr, sizeof(enuStatus)); + if ((s8Ret != M2M_SUCCESS) || (enuStatus != BACKUP_STATUS_EMPTY)) + { + u32BackupAddr += sizeof(tstrBackup); + s8Ret = spi_flash_read((uint8*)&enuStatus, u32BackupAddr, sizeof(enuStatus)); + if ((s8Ret == M2M_SUCCESS) && (enuStatus != BACKUP_STATUS_EMPTY)) + s8Ret = M2M_ERR_FAIL; + } + if (s8Ret == M2M_SUCCESS) + { + tstrBackup strBackup = {BACKUP_STATUS_NOT_ACTIVE, u32Target, M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ}; + s8Ret = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = winc_flash_write_verify((uint8*)&strBackup, u32BackupAddr, sizeof(strBackup)); + if (s8Ret == M2M_SUCCESS) + { + strBackup.enuTransferStatus = BACKUP_STATUS_ACTIVE; + s8Ret = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + } + } + } + return s8Ret; +} +sint8 image_get_target(uint8 *pu8Target) +{ + sint8 s8Ret = M2M_ERR_FAIL; + uint32 u32OffsetActive = 0; + uint32 u32OffsetInactive = 0; + + s8Ret = access_control_sector(CS_INITIALIZE, NULL); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = access_control_sector(CS_GET_ACTIVE, &u32OffsetActive); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = access_control_sector(CS_GET_INACTIVE, &u32OffsetInactive); + if (s8Ret == M2M_SUCCESS) + *pu8Target = (u32OffsetInactive > u32OffsetActive) ? 1 : 0; + } + access_control_sector(CS_DEINITIALIZE, NULL); + } + return s8Ret; +} +sint8 rootcert_get_size(tstrRootCertEntryHeader *pstrHdr, uint16 *pu16Size) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if ((pstrHdr == NULL) || (pu16Size == NULL)) + goto ERR; + + /* Set default size out to maximum. */ + *pu16Size = 0xFFFF; + switch (pstrHdr->strPubKey.u32PubKeyType) + { + case ROOT_CERT_PUBKEY_RSA: + if (pstrHdr->strPubKey.strRsaKeyInfo.u16NSz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + if (pstrHdr->strPubKey.strRsaKeyInfo.u16ESz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + *pu16Size = sizeof(tstrRootCertEntryHeader) + ((pstrHdr->strPubKey.strRsaKeyInfo.u16NSz + 0x3) & ~0x3) + ((pstrHdr->strPubKey.strRsaKeyInfo.u16ESz + 0x3) & ~0x3); + s8Ret = M2M_SUCCESS; + break; + case ROOT_CERT_PUBKEY_ECDSA: + if (pstrHdr->strPubKey.strEcsdaKeyInfo.u16KeySz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + *pu16Size = sizeof(tstrRootCertEntryHeader) + ((pstrHdr->strPubKey.strEcsdaKeyInfo.u16KeySz + 0x3) & ~0x3) * 2; + s8Ret = M2M_SUCCESS; + break; + case 0xFFFFFFFF: + // Invalid. May indicate end of list. Fail with size set to 0. + *pu16Size = 0; + break; + default: + // Corrupt header. + break; + } +ERR: + return s8Ret; +} +sint8 rootcert_access(tenuFlashAccessItemMode enuMode, tstrRootCertEntryHeader *pstrReferenceHdr, uint16 *pu16EntrySize, uint8 *pu8Buff, uint32 *pu32Offset) +{ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_SUCCESS; + uint8 au8RootCertSig[] = M2M_TLS_ROOTCER_FLASH_SIG; + tstrRootCertEntryHeader strEntryHeader; + /* Previous version used 0-identifiers to indicate removed entries. Use last 20 bytes of pu8Buff to help us check for them. */ + uint8 *pu8Zero = pu8Buff + M2M_TLS_ROOTCER_FLASH_SZ - sizeof(pstrReferenceHdr->au8SHA1NameHash); + uint32 u32StoreOffset = 0; + uint32 u32Entries = 0; + + m2m_memset(pu8Zero, 0, sizeof(pstrReferenceHdr->au8SHA1NameHash)); + /* Use pu8SectionBuffer to read signature. */ + status = spi_flash_read(pu8Buff, M2M_TLS_ROOTCER_FLASH_OFFSET, sizeof(au8RootCertSig)); + if ((status != M2M_SUCCESS) || m2m_memcmp(pu8Buff, au8RootCertSig, sizeof(au8RootCertSig))) + { + /* + * Root certificate section is not initialized. We could try to initialize it + * here, but for now just fail. + */ + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + + /* + * By default assume we'll get to the end of the flash store without finding what we need + * (matching entry or space to add new entry). If we break while loop before reaching end of + * store then we'll change ret accordingly. */ + if (enuMode == FLASH_ITEM_ADD) + ret = FLASH_ERR_SIZE; + else + ret = FLASH_ERR_WINC_CONFLICT; + + u32StoreOffset = *pu32Offset = sizeof(tstrRootCertFlashHeader); + while (u32StoreOffset + sizeof(tstrRootCertEntryHeader) < M2M_TLS_ROOTCER_FLASH_SZ) + { + uint16 u16EntrySize = 0; + status = spi_flash_read((uint8*)&strEntryHeader, M2M_TLS_ROOTCER_FLASH_OFFSET + u32StoreOffset, sizeof(tstrRootCertEntryHeader)); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + status = rootcert_get_size(&strEntryHeader, &u16EntrySize); + if (status != M2M_SUCCESS) + { + // Found the end of the list. We are done. If we are adding an entry, check the space here. + if ((enuMode == FLASH_ITEM_ADD) && ((*pu32Offset + *pu16EntrySize) <= M2M_TLS_ROOTCER_FLASH_SZ)) + { + u32Entries++; + ret = FLASH_RETURN_OK; + } + break; + } + + // If we are here we know that u32EntrySize is sane. + if (m2m_memcmp(pu8Zero, (uint8*)pstrReferenceHdr, sizeof(strEntryHeader.au8SHA1NameHash))) + { + // Entry is not empty. + status = spi_flash_read(pu8Buff + *pu32Offset, M2M_TLS_ROOTCER_FLASH_OFFSET + u32StoreOffset, u16EntrySize); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + if (enuMode == FLASH_ITEM_READIDX) + { + if (u32Entries == *(uint32*)pstrReferenceHdr) + { + // Found entry. pu16EntrySize is used to output size. + *pu16EntrySize = u16EntrySize; + ret = FLASH_RETURN_OK; + break; + } + } + else if (!m2m_memcmp(strEntryHeader.au8SHA1NameHash, (uint8*)pstrReferenceHdr, sizeof(strEntryHeader.au8SHA1NameHash))) + { + if (enuMode == FLASH_ITEM_ADD) + { + // Found a match. Cannot add. + ret = FLASH_ERR_WINC_CONFLICT; + break; + } + if (enuMode == FLASH_ITEM_READ) + { + // Found a match. pu16EntrySize is used to output size. + *pu16EntrySize = u16EntrySize; + ret = FLASH_RETURN_OK; + break; + } + if (enuMode == FLASH_ITEM_REMOVE) + { + // Found a match. Continue, to complete entry count. + ret = FLASH_RETURN_OK; + // Cancel out increment of u32BuffOffset. + *pu32Offset -= u16EntrySize; + } + } + *pu32Offset += u16EntrySize; + u32Entries++; + } + u32StoreOffset += u16EntrySize; + } + if (ret == FLASH_RETURN_OK) + ((tstrRootCertFlashHeader*)pu8Buff)->u32nCerts = u32Entries; +ERR: + return ret; +} + +sint8 transfer_run(tstrFlashAccess *pstrFlashAccess) +{ + /* + * Errors before start of first transfer will be reported as parameter errors. + * This means the information is insufficient to allow us to begin. + */ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_ERR_FAIL; + + tpfDataAccessFn pfWriteFn = pstrFlashAccess->pfDestinationFn; + tpfDataAccessFn pfReadFn = pstrFlashAccess->pfSourceFn; + tstrDataAccessInitParams read_init_params = {pstrFlashAccess->u32Size, FLASH_FN_FLAGS_READ, 0, 0}; + tstrDataAccessInitParams write_init_params = {pstrFlashAccess->u32Size, FLASH_FN_FLAGS_WRITE, 0, 0}; + uint32 u32BytesTransferred = 0; + uint32 u32BytesRemaining = pstrFlashAccess->u32Size; + uint8 *pu8Buff = NULL; + + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_COMPARE_BEFORE) + write_init_params.u8Flags |= FLASH_FN_FLAGS_COMPARE_BEFORE; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_ERASE_FIRST) + { + write_init_params.u8Flags |= FLASH_FN_FLAGS_ERASE; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_KEEP_SURROUNDING) + { + write_init_params.u8Flags |= FLASH_FN_FLAGS_READ_SURROUNDING; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_USE_BACKUP) + write_init_params.u8Flags |= FLASH_FN_FLAGS_BACKUP; + } + } + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_COMPARE_AFTER) + write_init_params.u8Flags |= FLASH_FN_FLAGS_COMPARE_AFTER; + + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_DATA_IN_BACKUP) + { + if (prepare_backup(gu32LocationId) != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + set_changed_flag(&pstrFlashAccess->strPersistentInfo); + ret = recover_backup(); + if (ret < 0) + goto ERR; + } + /* + * Initialize control sector. Even if we don't need to access it, this at + * least ensures that the control sector is not relying on the flash backup sector. + */ + status = access_control_sector(CS_INITIALIZE, NULL); + if (status != M2M_SUCCESS && (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS)) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + + if (pfReadFn != NULL) + { + /* Prepare for read. */ + + status = pfReadFn(FLASH_DATA_FN_INITIALIZE, &read_init_params); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfReadFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + pfReadFn(FLASH_DATA_FN_TERMINATE, NULL); + goto ERR; + } + } + if (pfWriteFn != NULL) + { + /* Prepare for write. */ + status = pfWriteFn(FLASH_DATA_FN_INITIALIZE, &write_init_params); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfWriteFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + goto TERMINATE; + } + } + if (u32BytesRemaining > 0) + { + if (u32BytesRemaining > FLASH_SECTOR_SIZE) + pu8Buff = malloc(FLASH_SECTOR_SIZE); + else if (write_init_params.u32AlignmentSize > 1) + pu8Buff = malloc(write_init_params.u32AlignmentSize); + else + pu8Buff = malloc(u32BytesRemaining); + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto TERMINATE; + } + } + + while (u32BytesRemaining > 0) + { + tstrDataAccessParams params = {pu8Buff, FLASH_SECTOR_SIZE, 0, FLASH_SECTOR_SIZE}; + + if (u32BytesTransferred > 0) + write_init_params.u32StartAlignment = 0; + if (write_init_params.u32AlignmentSize > 1) + { + params.u32DataOffset = write_init_params.u32StartAlignment & (write_init_params.u32AlignmentSize-1); + params.u32DataSize = write_init_params.u32AlignmentSize - params.u32DataOffset; + } + + if (params.u32DataSize > u32BytesRemaining) + params.u32DataSize = u32BytesRemaining; + + /* Read. */ + if (pfReadFn != NULL) + { + status = pfReadFn(FLASH_DATA_FN_DATA, ¶ms); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfReadFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + break; + } + } + + /* Write. */ + if (pfWriteFn != NULL) + { + if (is_internal_info(pfWriteFn)) + { + ret = set_changed_flag(&pstrFlashAccess->strPersistentInfo); + if (ret < 0) + break; + } + status = pfWriteFn(FLASH_DATA_FN_DATA, ¶ms); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfWriteFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + break; + } + } + + u32BytesTransferred += params.u32DataSize; + u32BytesRemaining -= params.u32DataSize; + } + + if (u32BytesRemaining > 0) + { +TERMINATE: + if (pfReadFn != NULL) + pfReadFn(FLASH_DATA_FN_TERMINATE, NULL); + if (pfWriteFn != NULL) + pfWriteFn(FLASH_DATA_FN_TERMINATE, NULL); + goto ERR; + } + else + { + if (pfReadFn != NULL) + pfReadFn(FLASH_DATA_FN_COMPLETE, NULL); + if (pfWriteFn != NULL) + pfWriteFn(FLASH_DATA_FN_COMPLETE, NULL); + } + + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & (FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE | FLASH_MODE_FLAGS_CS_SWITCH)) + { + tenuCSOp enuOp; + ret = set_changed_flag(&pstrFlashAccess->strPersistentInfo); + if (ret < 0) + goto ERR; + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE) + { + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + enuOp = CS_VALIDATE_SWITCH; + else + enuOp = CS_VALIDATE_RB; + } + else + enuOp = CS_SWITCH; + status = access_control_sector(enuOp, NULL); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + } + + pstrFlashAccess->strPersistentInfo.enuTransferStatus = FLASH_STATUS_DONE; + status = winc_flash_write_verify((uint8*)pstrFlashAccess, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + gu8Success = 1; +ERR: + if (pu8Buff != NULL) + free(pu8Buff); + access_control_sector(CS_DEINITIALIZE, NULL); + return ret; +} diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmflash.h b/AudioConsole.X/Source/winc3400/driver/source/nmflash.h new file mode 100644 index 0000000..8dceaf9 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmflash.h @@ -0,0 +1,284 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + +#ifndef __NM_FLASH_H__ +#define __NM_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +#define FLASH_RETURN_OK 0 +#define FLASH_SECTOR_SIZE FLASH_SECTOR_SZ +#define FLASH_SIGNATURE HOST_CONTROL_FLASH_SIG +#define BACKUP_SIGNATURE 0x424b5550 + +#define FLASH_MODE_FLAGS_CS NBIT0 +#define FLASH_MODE_FLAGS_CS_SWITCH NBIT1 +#define FLASH_MODE_FLAGS_CS_SWITCH_TARGET NBIT2 +#define FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE NBIT3 +#define FLASH_MODE_FLAGS_UNCHANGED NBIT4 +#define FLASH_MODE_FLAGS_DATA_IN_BACKUP NBIT5 + +/*! Bit 0 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Compare buffer against existing data, to avoid unnecessary operation. */ +#define FLASH_FN_FLAGS_COMPARE_BEFORE NBIT0 +/*! Bit 1 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Fill uninitialized portion of buffer with existing data to avoid losing it in subsequent erase. + * Typically not set unless @ref FLASH_FN_FLAGS_ERASE is set. */ +#define FLASH_FN_FLAGS_READ_SURROUNDING NBIT1 +/*! Bit 2 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Save buffer to a backup persistent location in case of power loss after subsequent erase. + * A (persistent) record of the backup status must also be kept. + * Typically not set unless @ref FLASH_FN_FLAGS_READ_SURROUNDING and @ref FLASH_FN_FLAGS_ERASE are both set. */ +#define FLASH_FN_FLAGS_BACKUP NBIT2 +/*! Bit 3 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Erase existing data before writing. */ +#define FLASH_FN_FLAGS_ERASE NBIT3 +/*! Bit 4 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Write buffer. */ +#define FLASH_FN_FLAGS_WRITE NBIT4 +/*! Bit 5 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Compare buffer against written data, to provide verification. + * Typically not set unless @ref FLASH_FN_FLAGS_WRITE is set. */ +#define FLASH_FN_FLAGS_COMPARE_AFTER NBIT5 +/*! Bit 6 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Read data to buffer. Typically this would be the only flag set, meaning read the existing data. + * However, if other flags are set, the read should be performed at the end. */ +#define FLASH_FN_FLAGS_READ NBIT6 + +/*! Bit 0 of u8AccessOptions parameter of various function APIs.\n + * Request to erase existing data before writing.\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_ERASE will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_ERASE_FIRST NBIT0 +/*! Bit 1 of u8AccessOptions parameter of various function APIs.\n + * When set with @ref FLASH_ACCESS_OPTION_ERASE_FIRST, this is a request to do + * read-modify-erase-write (eg if MCU application is storing received data in flash).\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_READ_SURROUNDING may be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_KEEP_SURROUNDING NBIT1 +/*! Bit 2 of u8AccessOptions parameter of various function APIs.\n + * When set with @ref FLASH_ACCESS_OPTION_ERASE_FIRST and @ref FLASH_ACCESS_OPTION_KEEP_SURROUNDING, + * this is a request to keep a persistent backup of modified contents during read-modify-erase-write.\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_BACKUP may be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_USE_BACKUP NBIT2 +/*! Bit 3 of u8AccessOptions parameter of various function APIs.\n + * Request to compare new data against existing data before erasing/writing, to avoid unnecessary operations.\n + * Applies to data transfer in either direction.\n + * If set, @ref FLASH_FN_FLAGS_COMPARE_BEFORE will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_COMPARE_BEFORE NBIT3 +/*! Bit 4 of u8AccessOptions parameter of various function APIs.\n + * Request for byte-wise verification of write.\n + * Applies to data transfer in either direction.\n + * If set, @ref FLASH_FN_FLAGS_COMPARE_AFTER will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_COMPARE_AFTER NBIT4 +/*! When modifying WINC flash contents, the module determines most options internally. Only two + * options are taken from the u8AccessOptions parameter.\n + * When providing data to the MCU application, the module takes all options from the + * u8AccessOptions parameter. */ +#define FLASH_ACCESS_WINC_MASK (FLASH_ACCESS_OPTION_COMPARE_BEFORE | FLASH_ACCESS_OPTION_COMPARE_AFTER) + + +typedef enum { + CS_INITIALIZE, + CS_INVALIDATE_RB, + CS_VALIDATE_RB, + CS_SWITCH, + CS_VALIDATE_SWITCH, + CS_GET_ACTIVE, + CS_GET_INACTIVE, + CS_DEINITIALIZE +}tenuCSOp; + +typedef enum { + /* + * Status values arranged so that status can be updated without any erase operation. + */ + FLASH_STATUS_EMPTY = 0xFFFFFFFF, + FLASH_STATUS_NOT_ACTIVE = 0xFFFFFF00, + FLASH_STATUS_ACTIVE = 0xFFFF0000, + FLASH_STATUS_DONE = 0xFF000000 +}tenuFlashAccessStatus; + +typedef enum { + /* + * Status values arranged so that status can be updated without any erase operation. + */ + BACKUP_STATUS_EMPTY = 0xFFFFFFFF, + BACKUP_STATUS_NOT_ACTIVE = BACKUP_SIGNATURE | 0xFFFFFF00, + BACKUP_STATUS_ACTIVE = BACKUP_SIGNATURE, + BACKUP_STATUS_DONE = 0x00000000 +}tenuBackupStatus; + +typedef enum { + /* + * Special location ID values. If top bit is not set, the location ID is interpreted as flash address. + */ + MEM_ID_WINC_FLASH = 0x80000000, + MEM_ID_WINC_ACTIVE, + MEM_ID_WINC_INACTIVE, + MEM_ID_NONE = 0xFFFFFFFF +}tenuMemId; + +/*! +@enum tenuFlashAccessItemMode + +@brief Transfer modes available for accessing items in WINC flash stores such as TLS root + certificate store. +@see m2m_flash_rootcert_access + */ +typedef enum { + /*! Add an item to the relevant WINC flash store. */ + FLASH_ITEM_ADD, + /*! Remove an item from the relevant WINC flash store. */ + FLASH_ITEM_REMOVE, + /*! Read an item from the relevant WINC flash store, using an identifier. */ + FLASH_ITEM_READ, + /*! Read an item from the relevant WINC flash store, using an index. */ + FLASH_ITEM_READIDX +}tenuFlashAccessItemMode; + + +typedef struct { + uint32 u32Signature; + tenuFlashAccessStatus enuTransferStatus; + uint16 u16AppId; + uint8 u8AccessFlags; // These correspond bitwise to application access options. + uint8 u8ModeFlags; // These are set internally, with reference to application mode options. +}tstrFlashAccessPersistent; +#define FLASH_SIG_SZ (sizeof(uint32)) +#define FLASH_STA_SZ (sizeof(tenuFlashAccessStatus)) +#define FLASH_SIG_STA_SZ (FLASH_SIG_SZ+FLASH_STA_SZ) + +typedef struct { + tstrFlashAccessPersistent strPersistentInfo; + tpfDataAccessFn pfDestinationFn; + tpfDataAccessFn pfSourceFn; + uint32 u32Size; +}tstrFlashAccess; + +typedef struct { + tenuBackupStatus enuTransferStatus; + uint32 u32DestinationAddr; + uint32 u32SourceAddr; + uint32 u32Size; +}tstrBackup; +#define FLASH_BACKUP_STA_SZ sizeof(tenuBackupStatus) +#define FLASH_BACKUP_STORE_SZ (2*sizeof(tstrBackup)) +#define FLASH_BACKUP_STORE_OFFSET (HOST_CONTROL_FLASH_OFFSET + HOST_CONTROL_FLASH_SZ - FLASH_BACKUP_STORE_SZ) + +/*! +@struct \ + tstrDataAccessInitParams +@brief + This structure contains parameters for initializing a local data access (read, erase or write). + +@see tpfDataAccessFn. +@see FLASH_FN_FLAGS_COMPARE_BEFORE +@see FLASH_FN_FLAGS_READ_SURROUNDING +@see FLASH_FN_FLAGS_BACKUP +@see FLASH_FN_FLAGS_ERASE +@see FLASH_FN_FLAGS_WRITE +@see FLASH_FN_FLAGS_COMPARE_AFTER +@see FLASH_FN_FLAGS_READ + */ +typedef struct { + /*! Total size of data to be accessed in data location. \n + * This field is set by the module in a call to @ref tpfDataAccessFn. */ + uint32 u32TotalSize; + /*! Flags indicating type of data access. \n + * This field is set by the module in a call to @ref tpfDataAccessFn. */ + uint8 u8Flags; + /*! Block size, to assist with alignment. \n + * This field can be set by the local memory access function @ref tpfDataAccessFn. Defaults to 0 if not set. + * Recommended values are:\n + * - 4096 if accessing flash memory with erase block size <= 4096.\n + * - 0 if accessing normal memory. */ + uint32 u32AlignmentSize; + /*! Offset of access start address, relative to u32AlignmentSize. \n + * This field can be set by the local memory access function @ref tpfDataAccessFn. The field is ignored if u32AlignmentSize < 2. */ + uint32 u32StartAlignment; +}tstrDataAccessInitParams; + +/*! +@struct \ + tstrDataAccessParams +@brief + This structure contains data for local data access (read, erase or write). +@see tpfDataAccessFn. + */ +typedef struct { + /*! Buffer to be written to or read from. */ + uint8 *pu8Buf; + /*! Total size of the buffer. */ + uint32 u32BufSize; + /* Offset of data within the buffer. */ + uint32 u32DataOffset; + /* Size of data to be written or read. */ + uint32 u32DataSize; +}tstrDataAccessParams; + +extern uint16 gu16LastAccessId; +extern uint8 gu8Success; +extern uint8 gu8Changed; +extern uint8 gu8Init; +extern uint8 gu8Reset; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +sint8 winc_flash_write_verify(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size); +void set_internal_info(tpfDataAccessFn *ppfFn, uint32 u32LocationId); +void set_internal_info_ptr(tpfDataAccessFn *ppfFn, uint8 *pu8Ptr); +uint8 is_internal_info(tpfDataAccessFn pfFn); +sint8 recover_backup(void); +sint8 prepare_backup(uint32 u32Target); +sint8 image_get_target(uint8 *pu8Target); +sint8 rootcert_get_size(tstrRootCertEntryHeader *pstrHdr, uint16 *pu16Size); +sint8 rootcert_access(tenuFlashAccessItemMode enuMode, tstrRootCertEntryHeader *pstrReferenceHdr, uint16 *pu16EntrySize, uint8 *pu8Buff, uint32 *pu32Offset); +sint8 transfer_run(tstrFlashAccess *pstrFlashAccess); + + +#endif /* __NM_FLASH_H__ */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmi2c.c b/AudioConsole.X/Source/winc3400/driver/source/nmi2c.c new file mode 100644 index 0000000..dcde7ae --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmi2c.c @@ -0,0 +1,262 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 I2C protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_I2C + +#include "nmi2c.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + + +/* +* @fn nm_i2c_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ + sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ + uint8 b[6]; + uint8 rsz; + tstrNmI2cDefault strI2c; + sint8 s8Ret = M2M_SUCCESS; + + if(u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x09; + b[1] = (uint8)(u32Addr); + rsz = 1; + strI2c.u16Sz = 2; + } else { + b[0] = 0x80; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)(u32Addr); + b[5] = 0x04; + rsz = 4; + strI2c.u16Sz = 6; + } + + strI2c.pu8Buf = b; + + if(M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + strI2c.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) + { + //M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + if (rsz == 1) { + *pu32RetVal = b[0]; + } else { + *pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24); + } + return s8Ret; +} + +/* +* @fn nm_i2c_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_i2c_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_i2c_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* +* @fn nm_i2c_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmI2cDefault strI2c; + uint8 b[16]; + sint8 s8Ret = M2M_SUCCESS; + + if(u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x19; + b[1] = (uint8)(u32Addr); + b[2] = (uint8)(u32Val); + strI2c.u16Sz = 3; + } else { + b[0] = 0x90; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)u32Addr; + b[5] = 0x04; + b[6] = (uint8)u32Val; + b[7] = (uint8)(u32Val >> 8); + b[8] = (uint8)(u32Val >> 16); + b[9] = (uint8)(u32Val >> 24); + strI2c.u16Sz = 10; + } + + strI2c.pu8Buf = b; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +/* +* @fn nm_i2c_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmI2cDefault strI2c; + uint8 au8Buf[7]; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x02; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr >> 0); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf = au8Buf; + strI2c.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + strI2c.pu8Buf = pu8Buf; + strI2c.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + + return s8Ret; +} + +/* +* @fn nm_i2c_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + uint8 au8Buf[7]; + tstrNmI2cSpecial strI2c; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x12; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf1 = au8Buf; + strI2c.pu8Buf2 = pu8Buf; + strI2c.u16Sz1 = sizeof(au8Buf); + strI2c.u16Sz2 = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W_SPECIAL, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +#endif +/* EOF */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmi2c.h b/AudioConsole.X/Source/winc3400/driver/source/nmi2c.h new file mode 100644 index 0000000..a9048cc --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmi2c.h @@ -0,0 +1,97 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 I2C protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMI2C_H_ +#define _NMI2C_H_ + +#include "common/include/nm_common.h" + +/** +* @fn nm_i2c_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_i2c_read_reg(uint32 u32Addr); + +/** +* @fn nm_i2c_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_i2c_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_i2c_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_i2c_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#endif /* _NMI2C_H_ */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmspi.c b/AudioConsole.X/Source/winc3400/driver/source/nmspi.c new file mode 100644 index 0000000..43150b3 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmspi.c @@ -0,0 +1,910 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 SPI protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_SPI + +#define USE_OLD_SPI_SW + +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "nmspi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +//#define CMD_DMA_WRITE 0xc1 +//#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +//#define CMD_TERMINATE 0xc5 +//#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 0 +#define N_FAIL -1 +#define N_RESET -2 +#define N_RETRY -3 + + +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8 gu8Crc_off = 0; +#if (defined __SAMG55J19__) || (defined __SAM4SD32C__) || (defined __SAME70Q21__) || (defined __SAME70Q21B__) +static sint8 nmi_spi_read(uint8* b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = NULL; + spi.pu8OutBuf = b; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_write(uint8* b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = b; + spi.pu8OutBuf = NULL; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_writeread(uint8* bw, uint8* br, uint16 sz) +{ + nmi_spi_write(bw, sz); + return nmi_spi_read(br, sz); +} +#else +static inline sint8 nmi_spi_read(uint8* b, uint16 sz) +{ + return nm_spi_rw(NULL, b, sz); +} +static inline sint8 nmi_spi_write(uint8* b, uint16 sz) +{ + return nm_spi_rw(b, NULL, sz); +} +static sint8 nmi_spi_writeread(uint8* bw, uint8* br, uint16 sz) +{ + return nm_spi_rw(bw, br, sz); +} +#endif +/******************************************** + + Crc7 + +********************************************/ + +static const uint8 crc7_syndrome_table[256] = { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, + 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, + 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, + 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, + 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, + 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, + 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, + 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, + 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, + 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, + 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, + 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, + 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, + 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, + 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, + 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, + 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, + 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, + 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, + 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, + 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, + 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, + 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, + 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, + 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, + 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, + 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, + 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, + 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 +}; + + +static inline uint8 crc7_byte(uint8 crc, uint8 data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static inline uint8 crc7(uint8 crc, const uint8 *buffer, uint32 len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + +/******************************************** + + Spi protocol Function + +********************************************/ + +static sint8 spi_cmd(uint8 cmd, uint32 adr, uint32 u32data, uint32 sz,uint8 clockless) +{ + uint8 bc[9]; + uint8 len = 5; + sint8 result = N_OK; + + bc[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8)adr; + bc[3] = 0x00; + len = 5; + break; +#if defined(CMD_TERMINATE) + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif +#if defined(CMD_REPEAT) + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; +#if defined(CMD_DMA_WRITE) || defined(CMD_DMA_READ) + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 8); + bc[5] = (uint8)(sz); + len = 7; + break; +#endif + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 16); + bc[5] = (uint8)(sz >> 8); + bc[6] = (uint8)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8)(adr); + bc[3] = (uint8)(u32data >> 24); + bc[4] = (uint8)(u32data >> 16); + bc[5] = (uint8)(u32data >> 8); + bc[6] = (uint8)(u32data); + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)(adr); + bc[4] = (uint8)(u32data >> 24); + bc[5] = (uint8)(u32data >> 16); + bc[6] = (uint8)(u32data >> 8); + bc[7] = (uint8)(u32data); + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result == N_OK) { + if (!gu8Crc_off) + bc[len-1] = (crc7(0x7f, (const uint8 *)&bc[0], len-1)) << 1; + else + len-=1; + + if (M2M_SUCCESS != nmi_spi_write(bc, len)) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + } + } + + return result; +} + +static sint8 spi_cmd_rsp(uint8 cmd) +{ + uint8 rsp; + sint8 result = N_OK; + sint8 s8RetryCnt; + + /** + Command/Control response + **/ +#if defined(CMD_TERMINATE) + if (cmd == CMD_TERMINATE) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } +#endif +#if defined(CMD_REPEAT) + if (cmd == CMD_REPEAT) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } +#endif + + /* wait for response */ + s8RetryCnt = 10; + do + { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while((rsp != cmd) && (s8RetryCnt-- >0)); + if (s8RetryCnt < 0) + { + M2M_ERR("[nmi spi]: Failed cmd response read\n"); + result = N_FAIL; + goto _fail_; + } + /** + State response + **/ + /* wait for response */ + s8RetryCnt = 10; + do + { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while((rsp != 0x00) && (s8RetryCnt-- >0)); + if (s8RetryCnt < 0) + { + M2M_ERR("[nmi spi]: Failed cmd response read\n"); + result = N_FAIL; + goto _fail_; + } +_fail_: + + return result; +} + +static sint8 spi_reset(void) +{ + M2M_INFO("Reset Spi\n"); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + + if (spi_cmd_rsp(CMD_RESET) != N_OK) { + // Reset command failed, need to send repeated 1's until reset occurs + // TODO This catchall reset code has not yet been tested. + uint8 w_buf[8] = {0xFF}; + uint8 r_buf[8]; + M2M_ERR("[nmi spi]: Failed rst cmd response\n"); + nmi_spi_writeread(w_buf, r_buf, 8); + if (r_buf[7] != 0xFF) + { + M2M_ERR("[nmi spi]: Failed repeated reset\n"); + return N_FAIL; + } + } + // TODO: May need to call spi_init() here + return N_OK; +} + +static sint8 spi_data_read(uint8 *b, uint16 sz,uint8 clockless) +{ + sint16 retry, ix, nbytes; + sint8 result = N_OK; + uint8 crc[2]; + uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Response header + **/ + retry = 10; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + //if (((rsp >> 4) & 0xf) == 0xf) + if ((rsp & 0xf0) == 0xf0) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Failed data response read...(%02x)\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (M2M_SUCCESS != nmi_spi_read(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + if(!clockless) + { + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_read(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static sint8 spi_data_write(uint8 *b, uint16 sz) +{ + sint16 ix = 0; + uint16 nbytes; + sint8 result = N_OK; + uint8 cmd, order, crc[2] = {0}; + //uint8 rsp; + + /** + Data + **/ + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } else { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + cmd |= order; + if (M2M_SUCCESS != nmi_spi_write(&cmd, 1)) { + M2M_ERR("[nmi spi]: Failed data block cmd write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (M2M_SUCCESS != nmi_spi_write(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_write(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc write, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } while (sz); + + + return result; +} + +/******************************************** + + Spi Internal Read/Write Function + +********************************************/ + +/******************************************** + + Spi interfaces + +********************************************/ + +/* +* @fn nm_spi_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_write_reg(uint32 addr, uint32 u32data) +{ + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_WRITE; + uint8 clockless = 0; + if (addr <= 0x30) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } + //else + //{ + // cmd = CMD_SINGLE_WRITE; + // clockless = 0; + //} + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, write reg (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + return N_OK; +#else + + result = spi_cmd_complete(cmd, addr, (uint8*)&u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, write reg (%08x)...\n", addr); + } + + return result; + +#endif +} + + +/* +* @fn nm_spi_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_write_block(uint32 addr, uint8 *buf, uint16 size) +{ + sint8 result; + uint8 cmd = CMD_DMA_EXT_WRITE; + + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + + //Workaround hardware problem with single byte transfers over SPI bus + if (size == 1) + size = 2; + + result = spi_cmd(cmd, addr, 0, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi ]: Failed cmd response, write block (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, NULL, size, 0); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, write block (%08x)...\n", addr); + return N_FAIL; + } +#endif + + /** + Data + **/ + result = spi_data_write(buf, size); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + spi_reset(); + return N_FAIL; + } + + return N_OK; +} + +/* +* @fn nm_spi_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_read_reg_with_ret(uint32 addr, uint32 *u32data) +{ + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_READ; + uint8 tmp[4]; + uint8 clockless = 0; + + if (addr <= 0xff) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } + //else + //{ + // cmd = CMD_SINGLE_READ; + // clockless = 0; + //} + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, 0, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read reg (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + /* to avoid endianess issues */ + result = spi_data_read(tmp, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed data read...\n"); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, (uint8*)&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, read reg (%08x)...\n", addr); + return N_FAIL; + } + +#endif + + *u32data = tmp[0] | + ((uint32)tmp[1] << 8) | + ((uint32)tmp[2] << 16) | + ((uint32)tmp[3] << 24); + + return N_OK; +} + +/* +* @fn nm_spi_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_read_block(uint32 addr, uint8 *buf, uint16 size) +{ + uint8 cmd = CMD_DMA_EXT_READ; + sint8 result; + +#if defined USE_OLD_SPI_SW + uint8 tmp[2]; + uint8 single_byte_workaround = 0; +#endif + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + if (size == 1) + { + //Workaround hardware problem with single byte transfers over SPI bus + size = 2; + single_byte_workaround = 1; + } + result = spi_cmd(cmd, addr, 0, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read block (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + /** + Data + **/ + if (single_byte_workaround) + { + result = spi_data_read(tmp, size,0); + buf[0] = tmp[0]; + } + else + result = spi_data_read(buf, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data read...\n"); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, buf, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", addr); + return N_FAIL; + } +#endif + + return N_OK; +} + +/******************************************** + + Bus interfaces + +********************************************/ + +static void spi_init_pkt_sz(void) +{ + uint32 val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE+0x24); + val32 &= ~(0x7 << 4); + switch(DATA_PKT_SZ) + { + case 256: val32 |= (0 << 4); break; + case 512: val32 |= (1 << 4); break; + case 1024: val32 |= (2 << 4); break; + case 2048: val32 |= (3 << 4); break; + case 4096: val32 |= (4 << 4); break; + case 8192: val32 |= (5 << 4); break; + + } + nm_spi_write_reg(SPI_BASE+0x24, val32); +} + +/* +* @fn nm_spi_init +* @brief Initialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_init(void) +{ + uint32 chipid; + uint32 reg =0; + + /** + configure protocol + **/ + gu8Crc_off = 0; + + // TODO: We can remove the CRC trials if there is a definite way to reset + // the SPI to it's initial value. + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nmi spi]: Failed internal read protocol with CRC on, retyring with CRC off...\n"); + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS){ + // Read failed with both CRC on and off, something went bad + M2M_ERR( "[nmi spi]: Failed internal read protocol...\n"); + return M2M_ERR_BUS_FAIL; + } + } + if(gu8Crc_off == 0) + { + reg &= ~0xc; /* disable crc checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + if (nm_spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg) != M2M_SUCCESS) { + M2M_ERR( "[nmi spi]: Failed internal write protocol reg...\n"); + return M2M_ERR_BUS_FAIL; + } + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (nm_spi_read_reg_with_ret(0x1000, &chipid) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Fail cmd read chip id...\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nmi spi]: chipid (%08x)\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_init +* @brief DeInitialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 27 Feb 2015 +* @version 1.0 +*/ +sint8 nm_spi_deinit(void) +{ + gu8Crc_off = 0; + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_spi_read_reg(uint32 u32Addr) +{ + uint32 u32Val; + + nm_spi_read_reg_with_ret(u32Addr, &u32Val); + + return u32Val; +} + +#endif diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmspi.h b/AudioConsole.X/Source/winc3400/driver/source/nmspi.h new file mode 100644 index 0000000..740f581 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmspi.h @@ -0,0 +1,119 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 SPI protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "common/include/nm_common.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** +* @fn nm_spi_init +* @brief Initialize the SPI +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_init(void); + +/** +* @fn nm_spi_deinit +* @brief DeInitialize the SPI +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_deinit(void); + +/** +* @fn nm_spi_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_spi_read_reg(uint32 u32Addr); + +/** +* @fn nm_spi_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_spi_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_spi_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_spi_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#ifdef __cplusplus + } +#endif + +#endif /* _NMSPI_H_ */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmuart.c b/AudioConsole.X/Source/winc3400/driver/source/nmuart.c new file mode 100644 index 0000000..48ed613 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmuart.c @@ -0,0 +1,585 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 UART protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_UART + +#include "driver/source/nmuart.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#define HDR_SZ 12 + +static uint8 get_cs(uint8* b, uint8 sz){ + int i; + uint8 cs = 0; + for(i = 0; i < sz; i++) + cs ^= b[i]; + return cs; +} + +/* +* @fn nm_uart_sync_cmd +* @brief Check COM Port +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_sync_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_ERR_BUS_FAIL; + uint8 b [HDR_SZ+1]; + uint8 onchip = 0; + int escape = 3; + + // send query char up to 3 times + while (escape-- && (s8Ret != M2M_SUCCESS)) + { + b[0] = 0x12; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + // then read back all chars in the buffer if any, is last char what we are looking for + s8Ret = nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart); + if (M2M_SUCCESS == s8Ret) + { + uint8 lastchar; + + // drain buffer + while (M2M_SUCCESS == s8Ret) + { + lastchar = b[0]; + s8Ret = nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart); + } + + switch (lastchar) + { + case 0x5a: + onchip = 1; + M2M_INFO("Built-in WINCxx00 UART Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x5b: + onchip = 0; + M2M_INFO("WINCxx00 Serial Bridge Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x5c: + onchip = 2; + M2M_INFO("WINCxx00 Serial Bridge + AT CMD app Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x12: + M2M_INFO("failed to read Serial Bridge ID response\n"); + s8Ret = M2M_ERR_BUS_FAIL; + break; + default: + M2M_INFO("Non Serial Bridge Found\n"); + s8Ret = M2M_ERR_BUS_FAIL; + break; + } + } + else + { + M2M_ERR("failed to send Serial Bridge ID Query\n"); + } + } + + if(s8Ret == M2M_SUCCESS) + s8Ret = (sint8)onchip; + + return s8Ret; +} + +/* +* @fn nm_uart_reboot_cmd +* @brief Sends a command to the MCU to force reboot +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @version 1.0 +*/ + +sint8 nm_uart_reboot_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + uint8 onchip = 0; + + /*read reg*/ + b[0] = 0x13; + + rsz = 1; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("failed to send reboot cmd\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + return s8Ret; +} + + + sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b [HDR_SZ+1]; + uint8 rsz; + + /*read reg*/ + b[0] = 0xa5; + b[1] = 0; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + b[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + b[8] = (uint8)((u32Addr & 0xff000000)>>24); + b[9] = 0; + b[10] = 0; + b[11] = 0; + b[12] = 0; + + b[2] = get_cs(&b[1],HDR_SZ); + + rsz = 4; + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + if(!nm_bus_get_chip_type()) + { + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the command\n"); + strUart.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + else + { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + *pu32RetVal = ((uint32)b[0] << 24) | ((uint32)b[1] << 16) | ((uint32)b[2] << 8) | b[3]; + + return s8Ret; +} + +/* +* @fn nm_uart_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +uint32 nm_uart_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_uart_read_reg_with_ret(u32Addr , &val); + return val; +} + +/* +* @fn nm_uart_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ+1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 1; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + b[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + b[8] = (uint8)((u32Addr & 0xff000000)>>24); + b[9] = (uint8)(u32Val & 0x000000ff); + b[10] = (uint8)((u32Val & 0x0000ff00)>>8); + b[11] = (uint8)((u32Val & 0x00ff0000)>>16); + b[12] = (uint8)((u32Val & 0xff000000)>>24); + + b[2] = get_cs(&b[1],HDR_SZ); + + get_cs(&b[1],HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the reg write command\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + + +/** +* @fn nm_uart_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 au8Buf[HDR_SZ+1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 2; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00)>>8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000)>>24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1],HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the block read command\n"); + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + M2M_ERR("write error (Error sending the block read command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** +* @fn nm_uart_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + static uint8 au8Buf[HDR_SZ+1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 3; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00)>>8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000)>>24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1],HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the block Write command\n"); + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + //check for the ack from the SAMD21 for the payload reception. + strUart.pu8Buf = au8Buf; + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the data payload\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + else + { + M2M_ERR("write error (Error sending the block write command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + return s8Ret; +} + +/** +* @fn nm_uart_reconfigure +* @brief Reconfigures the UART interface +* @param [in] ptr +* Pointer to a DWORD containing baudrate at this moment. +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Viswanathan Murugesan +* @date 22 OCT 2014 +* @version 1.0 +*/ +sint8 nm_uart_reconfigure(void *ptr) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ+1]; + + if (ptr == NULL) + { + M2M_ERR("port not open\n"); + return M2M_ERR_BUS_FAIL; + } + + /*write reg*/ + b[0] = 0xa5; + b[1] = 5; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + b[8] = 0; + b[9] = (uint8)((*(unsigned long *)ptr) & 0x000000ff); + b[10] = (uint8)(((*(unsigned long *)ptr) & 0x0000ff00)>>8); + b[11] = (uint8)(((*(unsigned long *)ptr) & 0x00ff0000)>>16); + b[12] = (uint8)(((*(unsigned long *)ptr) & 0xff000000)>>24); + + b[2] = get_cs(&b[1],HDR_SZ); + + get_cs(&b[1],HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the UART reconfigure command\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} +#endif +/* EOF */ diff --git a/AudioConsole.X/Source/winc3400/driver/source/nmuart.h b/AudioConsole.X/Source/winc3400/driver/source/nmuart.h new file mode 100644 index 0000000..2fdf9e5 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/driver/source/nmuart.h @@ -0,0 +1,119 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 UART protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMUART_H_ +#define _NMUART_H_ + +#include "common/include/nm_common.h" + +/* +* @fn nm_uart_sync_cmd +* @brief Check COM Port +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_sync_cmd(void); +/** +* @fn nm_uart_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_uart_read_reg(uint32 u32Addr); + +/** +* @fn nm_uart_reboot_cmd +* @brief Sends a command to the MCU to force the reboot of the WINC +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @version 1.0 +*/ +sint8 nm_uart_reboot_cmd(void); + +/** +* @fn nm_uart_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_uart_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_uart_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_uart_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_uart_reconfigure +* @brief Reconfigures the UART interface +* @param [in] ptr +* Pointer to a DWORD containing baudrate at this moment. +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_reconfigure(void *ptr); +#endif /* _NMI2C_H_ */ diff --git a/AudioConsole.X/Source/winc3400/programmer/programmer.h b/AudioConsole.X/Source/winc3400/programmer/programmer.h new file mode 100644 index 0000000..cbde6f7 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/programmer/programmer.h @@ -0,0 +1,53 @@ +/** + * + * \file + * + * \brief Programmer. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef IMAGE_DOWNLOADER_H_ +#define IMAGE_DOWNLOADER_H_ + +/** +* Include +*/ +#include "spi_flash_map.h" +#include "spi_flash/include/spi_flash.h" +#include "programmer_apis.h" + +#define ROOT_CERT_SIZE M2M_TLS_ROOTCER_FLASH_SZ + +#define programmer_get_flash_size() (((spi_flash_get_size()*1024)/8)*1024) +#define programmer_write(pu8Buf, u32Offset, u32Sz) spi_flash_write(pu8Buf, u32Offset, u32Sz) +#define programmer_erase(u32Offset, u32Sz) spi_flash_erase(u32Offset, u32Sz) +#define programmer_eraseall() programmer_erase(0, programmer_get_flash_size()) +#define programmer_read(pu8Buf, u32Offset, u32Sz) spi_flash_read(pu8Buf, u32Offset, u32Sz) + +#endif /* IMAGE_DOWNLOADER_H_ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/socket/include/m2m_socket_host_if.h b/AudioConsole.X/Source/winc3400/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..daf42b4 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/socket/include/m2m_socket_host_if.h @@ -0,0 +1,412 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "socket/include/socket.h" +#else +#include "driver/include/m2m_types.h" +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef _FIRMWARE_ +#define HOSTNAME_MAX_SIZE (100) +#endif + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + + + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invlaid Socket command value. +*/ + + +#define SOCKET_CMD_BIND 0x41 +/*!< + Socket Binding command value. +*/ + + +#define SOCKET_CMD_LISTEN 0x42 +/*!< + Socket Listening command value. +*/ + + +#define SOCKET_CMD_ACCEPT 0x43 +/*!< + Socket Accepting command value. +*/ + + +#define SOCKET_CMD_CONNECT 0x44 +/*!< + Socket Connecting command value. +*/ + + +#define SOCKET_CMD_SEND 0x45 +/*!< + Socket send command value. +*/ + + +#define SOCKET_CMD_RECV 0x46 +/*!< + Socket Recieve command value. +*/ + + +#define SOCKET_CMD_SENDTO 0x47 +/*!< + Socket sendTo command value. +*/ + + +#define SOCKET_CMD_RECVFROM 0x48 +/*!< + Socket RecieveFrom command value. +*/ + + +#define SOCKET_CMD_CLOSE 0x49 +/*!< + Socket Close command value. +*/ + + +#define SOCKET_CMD_DNS_RESOLVE 0x4A +/*!< + Socket DNS Resolve command value. +*/ + + +#define SOCKET_CMD_SSL_CONNECT 0x4B +/*!< + SSL-Socket Connect command value. +*/ + + +#define SOCKET_CMD_SSL_SEND 0x4C +/*!< + SSL-Socket Send command value. +*/ + + +#define SOCKET_CMD_SSL_RECV 0x4D +/*!< + SSL-Socket Recieve command value. +*/ + + +#define SOCKET_CMD_SSL_CLOSE 0x4E +/*!< + SSL-Socket Close command value. +*/ + + +#define SOCKET_CMD_SET_SOCKET_OPTION 0x4F +/*!< + Set Socket Option command value. +*/ + + +#define SOCKET_CMD_SSL_CREATE 0x50 +/*!< +*/ + + +#define SOCKET_CMD_SSL_SET_SOCK_OPT 0x51 + + +#define SOCKET_CMD_PING 0x52 + + + + + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct{ + uint16 u16Family; + uint16 u16Port; + uint32 u32IPAddr; +}tstrSockAddr; + + +//typedef sint8 SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + + + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct{ + char acHostName[HOSTNAME_MAX_SIZE]; + uint32 u32HostIP; +}tstrDnsReply; + + +/*! +@brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +}tstrBindCmd; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +}tstrBindReply; + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8BackLog; + uint16 u16SessionID; +}tstrListenCmd; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct{ + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +}tstrListenReply; + + +/*! +* @brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16 u16Void; +}tstrAcceptReply; + + +/*! +* @brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8SslFlags; + uint16 u16SessionID; +}tstrConnectCmd; + + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct{ + SOCKET sock; + sint8 s8Error; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +}tstrConnectReply; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Void; + uint16 u16DataSize; + tstrSockAddr strAddr; + uint16 u16SessionID; + uint16 u16Void; +}tstrSendCmd; + + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct{ + SOCKET sock; + uint8 u8Void; + sint16 s16SentBytes; + uint16 u16SessionID; + uint16 u16Void; +}tstrSendReply; + + +/*! +* @brief +*/ +typedef struct{ + uint32 u32Timeoutmsec; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; + uint16 u16BufLen; +}tstrRecvCmd; + + +/*! +@struct \ + tstrRecvReply +@brief +*/ +typedef struct{ + tstrSockAddr strRemoteAddr; + sint16 s16RecvStatus; + uint16 u16DataOffset; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +}tstrRecvReply; + + +/*! +* @brief +*/ +typedef struct{ + uint32 u32OptionValue; + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; +}tstrSetSocketOptCmd; + + +typedef struct{ + SOCKET sslSock; + uint8 __PAD24__[3]; +}tstrSSLSocketCreateCmd; + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; + uint32 u32OptLen; + uint8 au8OptVal[SSL_MAX_OPT_LEN]; +}tstrSSLSetSockOptCmd; + + +/*! +*/ +typedef struct{ + uint32 u32DestIPAddr; + uint32 u32CmdPrivate; + uint16 u16PingCount; + uint8 u8TTL; + uint8 __PAD8__; +}tstrPingCmd; + + +typedef struct{ + uint32 u32IPAddr; + uint32 u32CmdPrivate; + uint32 u32RTT; + uint16 u16Success; + uint16 u16Fail; + uint8 u8ErrorCode; + uint8 __PAD24__[3]; +}tstrPingReply; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/AudioConsole.X/Source/winc3400/socket/include/socket.h b/AudioConsole.X/Source/winc3400/socket/include/socket.h new file mode 100644 index 0000000..6463d94 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/socket/include/socket.h @@ -0,0 +1,1740 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup SOCKETAPI SOCKET + */ + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SOCKETDEF Defines + * @ingroup SOCKETAPI + * The following list of macros are used to define constants used throughout the socket layer, and SSL Socket options. + * @{ */ + +#define HOSTNAME_MAX_SIZE 100 +/*!< + Maximum allowed size for a host domain name passed to the function gethostbyname @ref gethostbyname. + command value. Used with the setsocketopt function. + +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in structure. + (It is the only supported type for the current implementation.) +*/ + + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag shall be passed to the socket API for SSL session. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks. + Used with the @ref setsockopt function. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value. + Used with the @ref setsockopt function. +*/ + + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value. + Used with the @ref setsockopt function. +*/ + + +// SSL Socket options + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate + verification process. + It is highly recommended NOT to use this socket option in production + software applications. It is intended for debugging and testing + purposes only.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The + SNI is a NULL terminated string containing the server name + associated with the connection. It must not exceed the size + of HOSTNAME_MAX_SIZE. If the SNI is not a null string, then + TLS Client Hello messages will include the SNI extension. +*/ + + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + Allow the TLS to cache the session information for fast + TLS session establishment in future connections using the + TLS Protocol session resume features.\n + The option value should be cast to int type and it is handled + as a boolean flag. + +*/ + +#define SO_SSL_ENABLE_CERTNAME_VALIDATION 0x04 +/*!< + Enable internal validation of server name against the server's + certificate subject common name. If there is no server name + provided (via the SO_SSL_SNI option), setting this option does + nothing.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Legacy name for @ref SO_SSL_ENABLE_CERTNAME_VALIDATION.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + //@} + +/** @defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + + +#define SSL_ECC_ONLY_CIPHERS \ +(\ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ +) +/*!< + All supported ECC Ciphers. These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ + + +#define SSL_DEFAULT_CIPHERS \ +(\ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ +) +/*!< + All supported Non-ECC Ciphers. This is the default active group after startup. + Note that firmware may support only a subset of these. +*/ + //@} + +/**@defgroup SOCKETBYTEORDER Byte Order + * @ingroup SOCKETAPI + * The following list of macros are used to convert between host representation and network byte order. + * @{ */ +#ifdef _NM_BSP_BIG_END +#define _htonl(m) (m) +/*!< + Convert a 4-byte integer from the Host representation to Network byte order (Host is BE). +*/ +#define _htons(A) (A) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is BE). +*/ +#else +#define _htonl(m) \ + (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) | ((uint32)(((uint32)m) >> 24))) +/*!< + Convert a 4-byte integer from Host representation to Network byte order (Host is LE). +*/ + +#define _htons(A) (uint16)((((uint16) (A)) << 8) | (((uint16) (A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is LE). +*/ +#endif + + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from Network byte order to Host representation. +*/ + + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from Network byte order to Host representation. +*/ + //@} + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SOCKETAPI + * The following list of macros are used to define the possible error codes. + * Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation. This code is also used with event @ref SOCKET_MSG_RECV if a socket connection is closed. + In that case, the application should call @ref close(). +*/ + + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a valid address + For example: bind is called without specifying a port number +*/ + + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. Only one IP address per socket, and one socket per IP address is permitted - + any attempt for a new socket to bind with an IP address already bound to another open socket will return the following error code. +*/ + + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through TCP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed. +*/ + + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through UDP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed +*/ + + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a socket function. Identifies that @ref socket operation failed +*/ + + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies that @ref listen operation failed. +*/ + + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be completed. + The @ref sendto function requires a destination address to send data. +*/ + + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed (reset) by the peer. If this error is received, the application should call @ref close(). +*/ + + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has timed out. The socket remains open. +*/ + + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ + + //@} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** @defgroup SocketEnums Enumeration/Typedefs + * @ingroup SOCKETAPI + * Specific Enumeration-typedefs used for socket operations + * @{ */ +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + The ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef sint8 SOCKET; + //@} + +/*! +@struct \ + in_addr + +@brief + IPv4 address representation. + + This structure is used as a placeholder for IPV4 address in other structures. +@see + sockaddr_in +*/ +typedef struct{ + uint32 s_addr; + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ +}in_addr; + + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see \ + sockaddr_in +*/ +struct sockaddr{ + uint16 sa_family; + /*!< +Socket address family. + */ + uint8 sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + sockaddr_in + +@brief + Socket address structure for IPV4 addresses. Used to specify socket address information to connect to. + Can be cast to @ref sockaddr structure. +*/ +struct sockaddr_in{ + uint16 sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16 sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + Must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. + */ + uint8 sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; + +/**@addtogroup SocketEnums + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs make use of callback functions in-order to return back the results once the corresponding socket operation is completed. + Hence resuming the normal execution of the application code while the socket operation returns the results. + Callback functions expect event messages to be passed in, in-order to identify the operation they're returning the results for. + The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback functions, + a function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket operation. + +@see bind +@see listen +@see accept +@see connect +@see send +@see recv + +*/ +typedef enum{ + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + Sendto socket event. + */ + SOCKET_MSG_RECVFROM + /*!< + Recvfrom socket event. + */ +}tenuSocketCallbackMsgType; +// @} + + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind + +*/ +typedef struct{ + sint8 status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +}tstrSocketBindMsg; + + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen function. + This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback function. +@see + listen +*/ +typedef struct{ + sint8 status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +}tstrSocketListenMsg; + + + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept function. + This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback function. +*/ +typedef struct{ + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with the remote peer. + Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +}tstrSocketAcceptMsg; + + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to the asynchronous call to the @ref connect socket function. + This structure together with the event @ref SOCKET_MSG_CONNECT are passed-in parameters to the callback function. + If the application receives this structure with a negative value in s8Error, the application should call @ref close(). +*/ +typedef struct{ + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the connect function call. + */ + sint8 s8Error; + /*!< + Connect error code. + Holding a value of ZERO for a successful connect or otherwise a negative + error code corresponding to the type of error. + */ +}tstrSocketConnectMsg; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the recv or recvfrom socket functions. + This structure together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM are passed-in parameters to the callback function. +@remark + In case the received data from the remote peer is larger than the USER buffer size defined during the asynchronous call to the @ref recv function, + only data up to the buffer size is delivered to the user. The user must call @ref recv again in order to receive the remaining data. + A negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref close(). + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref close(). + @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. +*/ +typedef struct{ + uint8 *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + sint16 s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16 u16RemainingSize; + /*!< + The number of bytes remaining in the current @ref recv operation. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +}tstrSocketRecvMsg; + +/**@addtogroup SocketEnums + * @{ */ +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application callback through this function by calling @ref registerSocketCallback. + In response to events received, the following callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is received in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb) (SOCKET sock, uint8 u8Msg, void * pvMsg); + + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref registerSocketCallback. + The following callback is triggered in response to an asynchronous call to the @ref gethostbyname function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in Network byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb) (uint8* pu8DomainName, uint32 u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + @ref m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32 u32IPAddr, uint32 u32RTT, uint8 u8ErrorCode); + + /**@}*/ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SocketAPI Functions + * @ingroup SOCKETAPI + */ + + /**@{*/ +/*! +@fn \ + NMI_API void socketInit(void); + The function performs the necessary initialization for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent reseting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based on the maximum number of + sockets @ref MAX_SOCKET which is tuned to the systems capability. +\section SocketExample1 Example +This example demonstrates the use of the socketInit for socket initialization for an mqtt chat application. + \code + tstrWifiInitParam param; + int8_t ret; + char topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + m2m_wifi_connect((char *)DEFAULT_SSID, sizeof(DEFAULT_SSID), + DEFAULT_AUTH, (char *)DEFAULT_KEY, M2M_WIFI_CH_ALL); + +\endcode +*/ +NMI_API void socketInit(void); + +/*! +@fn \ + NMI_API void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked only after all desired socket operations have been performed on any active sockets. +*/ +NMI_API void socketDeinit(void); +/*! +@fn \ + NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering function. + The registered callback functions are used to retrieve information in response to the asynchronous socket functions called. +@param [in] socket_cb + Assignment of callback function to the global callback @ref tpfAppSocketCb gpfAppSocketCb. Delivers + socket messages to the host application. In response to the asynchronous function calls, such as @ref bind + @ref listen @ref accept @ref connect + +@param [in] resolve_cb + Assignment of callback function to the global callback @ref tpfAppResolveCb gpfAppResolveCb. + Used for DNS resolving functionality. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when DNS resolution is not required. + +@return void +@remarks + If any of the socket functionality is not to be used, NULL is passed in as a parameter. + It must be invoked after @ref socketInit and before other socket layer operations. + +\section SocketExample2 Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS resolution CB set to null + for a simple UDP server example. + \code + tstrWifiInitParam param; + int8_t ret; + struct sockaddr_in addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + m2m_wifi_connect((char *)DEFAULT_SSID, sizeof(DEFAULT_SSID), DEFAULT_AUTH, (char *)DEFAULT_KEY, M2M_WIFI_CH_ALL); + \endcode +*/ +NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); +/*! +@fn \ + NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and their possible types are either TCP or a UDP sockets. + The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + +@param [in] u8Flags + Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets, + or [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) if the socket is used for SSL session. The use of the flag + [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) has no meaning in case of UDP sockets. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket handler. + before any call to the socket function can be made. + +@see + connect + bind + listen + accept + recv + recvfrom + send + sendto + close + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of available sockets. + +@remarks + The socket function must be called before any other related socket functions "e.g. send, recv, close ..etc" +\section SocketExample3 Example + This example demonstrates the use of the socket function to allocate the socket, returning the socket handler to be used for other +socket operations. Socket creation is dependent on the socket type. +\subsection sub1 UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0)); +@endcode +*/ +NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); +/*! +\fn \ + NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + Asynchronous bind function associates the provided address and local port to the socket. + The function can be used with both TCP and UDP sockets. It is mandatory to call the @ref bind function before starting any UDP or TCP server operation. + Upon socket bind completion, the application will receive a @ref SOCKET_MSG_BIND message in the socket callback. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see socket +@see connect +@see listen +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section SocketExample4 Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET,SOCK_DGRAM,0); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(UDP_SERVER_PORT); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret == 0) + printf("Bind success!\n"); + else + { + printf("Bind Failed. Error code = %d\n",ret); + close(udpServerSocket); + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint8 listen(SOCKET sock, uint8 backlog); + + After successfully binding a socket to an IP address and port on the system, start listening passively for incoming connections. + The socket must be bound on a local port or the listen operation fails. + Upon the call to the asynchronous listen function, response is received through the event @ref SOCKET_MSG_LISTEN + in the socket callback. + + A successful listen means the TCP server operation is active. If a connection is accepted, then the application socket callback function is + notified with the new connected socket through the event @ref SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function + after calling @ref listen. + + After a connection is accepted, the user is then required to call @ref recv to receive any packets transmitted by the remote host or to recieve notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see bind +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating invalid arguments were passed, such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section SocketExample5 Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8 u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +NMI_API sint8 listen(SOCKET sock, uint8 backlog); +/*! +@fn \ + NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + The function has no current implementation. An empty deceleration is used to prevent errors when legacy application code is used. + As it has no effect, it can be safely removed from any application using it. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); +/*! +@fn \ + NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of the result of the connection attempt through the event @ref SOCKET_MSG_CONNECT, + along with a structure @ref tstrSocketConnectMsg. + If socket connection fails, the application should call @ref close(). + A successful connect means the TCP session is active. The application is then required to make a call to the @ref recv function + to receive any packets transmitted by the remote server, unless the application is interrupted by a notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section SocketExample6 Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through the main function and how the + callback function handles the @ref SOCKET_MSG_CONNECT event. +\subsection sub3 Main Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,0); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub4 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8 acBuffer[GROWL_MSG_SIZE]; + uint16 u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + close(pstrNotification->Socket); + } + } +@endcode +*/ +NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + + An asynchrnonous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the two socket events + [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the socket is already connected to a remote + host. + The application receives the required data in response to this asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the + socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref close(). + - @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref close(). + - @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see socket +@see connect +@see bind +@see listen +@see recvfrom +@see close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Recieve buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket recieve failure. +\section SocketExample7 Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification of the accept or connect events, and the parsing of the + received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + close(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/*! +@fn \ + NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + Receives data from a UDP Scoket. + + The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + with successful status in the socket callback). + + Upon calling the recvfrom function with a successful return code, the application is expected to receive a notification + in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + + Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error @ref SOCK_ERR_TIMEOUT + + The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref bind function. + +@see + socket + bind + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample8 Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon notification of a successful bind event, and the parsing of the + received data when the SOCKET_MSG_RECVFROM event is received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16 u16port = pstrRx->strRemoteAddr.sin_port; + uint32 strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Received frame with size = %d.\tHost address=%x, Port number = %d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + ret = close(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/*! +@fn \ + NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + Asynchronous sending function, used to send data on a TCP/UDP socket. + + Called by the application code when there is outgoing data available required to be sent on a specific socket handler. + The only difference between this function and the similar @ref sendto function, is the type of socket the data is sent on and the parameters passed in. + @ref send function is most commonly called for sockets in a connected state. + After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the data). + Hence this function is expected to be called after a successful socket connect operation(in client case or accept in the + the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order to send outgoing data + using the @ref send function, at least one successful call must be made to the @ref sendto function before consecutive calls to the @ref send function, + to ensure that the destination address is saved in the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifer through the aprior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + + +@return + The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); +/*! +@fn \ + NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); + + Asynchronous sending function, used to send data on a UDP socket. + Called by the application code when there is data required to be sent on a UDP socket. + The application code is expected to receive data from a successfully bound socket node. + The only difference between this function and the similar @ref send function, is the type of socket the data is received on. This function works + only with UDP sockets. + After the data is sent, the socket callback function registered using @ref registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SENDTO. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + +@param [in] flags + Not used in the current implementation + +@param [in] pstrDestAddr + The destination address. + +@param [in] u8AddrLen + Destination address length in bytes. + Not used in the current implementation, only included for BSD compatibility. +@pre + Sockets must be initialized using socketInit. + +@see + socketInit + recvfrom + sendto + socket + connect + accept + send + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket (returned from socket ). + A valid buffer pointer must be used (not NULL). \n + Successful completion of a call to sendto() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint8 close(SOCKET sock); + + Synchronous close function, releases all the socket assigned resources. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@pre + Sockets must be initialized through the call of the socketInit function. + @ref close is called only for valid socket identifiers created through the @ref socket function. + +@warning + If @ref close is called while there are still pending messages (sent or received ) they will be discarded. + +@see + socketInit + socket + +@return + The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint8 close(SOCKET sock); +/*! +@fn \ + NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + + Synchronous function which returns a BSD socket compliant Internet Protocol (IPv4) socket address. + This IPv4 address in the input string parameter could either be specified as a hostname, or as a numeric string representation like n.n.n.n known as the IPv4 dotted-decimal format + (i.e. "192.168.10.1"). + This function is used whenever an ip address needs to be set in the proper format + (i.e. for the @ref tstrM2MIPConfig structure). + +@param [in] pcIpAddr + A null terminated string containing the IP address in IPv4 dotted-decimal address. + +@return + Unsigned 32-bit integer representing the IP address in Network byte order + (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + +*/ +NMI_API uint32 nmi_inet_addr(char *pcIpAddr); +/*! +@fn \ + NMI_API sint8 gethostbyname(uint8 * pcHostName); + Asynchronous DNS resolving function. This function uses DNS to resolve a domain name to the corresponding IP address. + A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS callback function registered using registerSocketCallback() + +@param [in] pcHostName + NULL terminated string containing the domain name for the remote host. + Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + +@see + registerSocketCallback + +@warning + Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + a negative return value indicates only locally-detected errors + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint8 gethostbyname(uint8 * pcHostName); + +/*! +@fn \ + NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); + + The setsockopt() function shall set the option specified by the option_name + argument, at the protocol level specified by the level argument, to the value + pointed to by the option_value argument for the socke specified by the socket argument. + + Possible Options: + SO_SET_UDP_SEND_CALLBACK: + Enable/Disable callback messages for sendto().Since UDP is unreliable by default the user maybe interested (or not) + in receiving a message of /ref SOCKET_MSG_SENDTO for each call of sendto(). + Enabled if option_value equals /ref BTRUE Disabled otherwise. + IP_ADD_MEMBERSHIP: + valid for UDP sockets,this option is used to receive frames sent to a multicast group. + option_value shall be a pointer to Unsigned 32 bit integer containing the Multicast ipv4 address. + IP_DROP_MEMBERSHIP: + valid for UDP sockets,this option is used to Stop receiving frames sent to a multicast group. + option_value shall be a pointer to Unsigned 32 bit integer containing the Multicast ipv4 address. + + Possible values for s32Level: + This argument is ignored. + +@param [in] socket + Socket handler. + +@param [in] u8Level + protocol level. always SOL_SOCKET for now. + +@param [in] option_name + option to be set. + +@param [in] option_value + pointer to user provided value. + +@param [in] u16OptionLen + length of the option value. +@warning + -Note that sending IGMP packets to Join/Leave multicast groups is not currently implemented. \n + Calling this function will Pass/Filter packets sent to the Multicast address provided in the option_value +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +*/ +NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); +/*! +@fn \ + sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 * pu8OptLen); + Get socket options retrieves + This Function isn't implemented yet but this is the form that will be released later. +@brief + + +@param [in] sock + Socket Identifie. +@param [in] u8Level + The protocol level of the option. +@param [in] u8OptName + The u8OptName argument specifies a single option to get. +@param [out] pvOptValue + The pvOptValue argument contains pointer to a buffer containing the option value. +@param [out] pu8OptLen + Option value buffer length. +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8* pu8OptLen); +/*! + * @fn NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); + * The function request to send ping request to the given IP Address. + * + * @param [in] u32DstIP + * Target Destination IP Address for the ping request. It must be represented in Network + * byte order. + * The function nmi_inet_addr could be used to translate the dotted decimal notation IP + * to its Network bytes order integer represntative. + * + * @param [in] u8TTL + * IP TTL value for the ping request. If set to ZERO, the default value SHALL be used. + * + * @param [in] fpPingCb + * Callback will be called to deliver the ping statistics. + * + * @see nmi_inet_addr + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); +/**@}*/ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/AudioConsole.X/Source/winc3400/socket/source/socket.c b/AudioConsole.X/Source/winc3400/socket/source/socket.c new file mode 100644 index 0000000..e6371a9 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/socket/source/socket.c @@ -0,0 +1,1266 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "bsp/include/nm_bsp.h" +#include "socket/include/socket.h" +#include "driver/source/m2m_hif.h" +#include "socket/source/socket_internal.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_CHECK_CERTNAME NBIT6 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Dummy; + uint16 u16SessionID; +}tstrCloseCmd; + + +/*! +* @brief +*/ +typedef struct{ + uint8 *pu8UserBuffer; + uint16 u16UserBufferSize; + uint16 u16SessionID; + uint16 u16DataOffset; + uint8 bIsUsed; + uint8 u8SSLFlags; + uint8 bIsRecvPending; +}tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile sint8 gsockerrno; +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint8 gu8OpCode; +volatile uint16 gu16BufferSize; +volatile uint16 gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8 gbSocketInit = 0; +volatile tpfPingCb gfpPingCb; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the NMC1500 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv,uint8 u8SocketMsg, + uint32 u32StartAddress,uint16 u16ReadCount) +{ + uint32 u32Address = u32StartAddress; + uint16 u16Read; + sint16 s16Diff; + + pstrRecv->u16RemainingSize = u16ReadCount; + if((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) && (gastrSockets[sock].bIsUsed == 1)) + { + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if(s16Diff > 0) + u16Read = gastrSockets[sock].u16UserBufferSize; + + if(hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, 1) == M2M_SUCCESS) + { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + gastrSockets[sock].u16UserBufferSize -= u16Read; + if(gastrSockets[sock].u16UserBufferSize == 0) + gastrSockets[sock].pu8UserBuffer = NULL; + + if (gpfAppSocketCb) + gpfAppSocketCb(sock,u8SocketMsg, pstrRecv); + } + else + { + M2M_INFO("(ERRR)Current <%d>\n", u16ReadCount); + } + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +static void m2m_ip_cb(uint8 u8OpCode, uint16 u16BufferSize,uint32 u32Address) +{ + if(u8OpCode == SOCKET_CMD_BIND) + { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if(hif_receive(u32Address, (uint8*)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) + { + strBind.status = strBindReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock,SOCKET_MSG_BIND,&strBind); + } + } + else if(u8OpCode == SOCKET_CMD_LISTEN) + { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if(hif_receive(u32Address, (uint8*)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) + { + strListen.status = strListenReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock,SOCKET_MSG_LISTEN, &strListen); + } + } + else if(u8OpCode == SOCKET_CMD_ACCEPT) + { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if(hif_receive(u32Address, (uint8*)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) + { + if(strAcceptReply.sConnectedSock >= 0) + { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags = 0; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n",strAcceptReply.sConnectedSock , gu16SessionID ); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if(gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } + else if((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT)) + { + tstrConnectReply strConnectReply; + tstrSocketConnectMsg strConnMsg; + if(hif_receive(u32Address, (uint8*)&strConnectReply, sizeof(tstrConnectReply), 0) == M2M_SUCCESS) + { + strConnMsg.sock = strConnectReply.sock; + strConnMsg.s8Error = strConnectReply.s8Error; + if(strConnectReply.s8Error == SOCK_ERR_NO_ERROR) + { + gastrSockets[strConnectReply.sock].u16DataOffset = strConnectReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + } + if(gpfAppSocketCb) + gpfAppSocketCb(strConnectReply.sock,SOCKET_MSG_CONNECT, &strConnMsg); + } + } + else if(u8OpCode == SOCKET_CMD_DNS_RESOLVE) + { + tstrDnsReply strDnsReply; + if(hif_receive(u32Address, (uint8*)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) + { + strDnsReply.u32HostIP = strDnsReply.u32HostIP; + if(gpfAppResolveCb) + gpfAppResolveCb((uint8*)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } + else if((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) || (u8OpCode == SOCKET_CMD_SSL_RECV)) + { + SOCKET sock; + sint16 s16RecvStatus; + tstrRecvReply strRecvReply; + uint16 u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8 u8CallbackMsgID = SOCKET_MSG_RECV; + uint16 u16DataOffset; + + if(u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if(hif_receive(u32Address, (uint8*)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) + { + uint16 u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n",u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) + { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. If the buffer is smaller than the received data, + the data is passed to the application in chunks according to its buffer size. + */ + u16ReadSize = (uint16)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } + else + { + /* Don't tidy up here. Application must call close(). + */ + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if(gpfAppSocketCb) + gpfAppSocketCb(sock,u8CallbackMsgID, &strRecvMsg); + } + } + else + { + M2M_DBG("Discard recv callback %d %d \r\n",u16SessionID , gastrSockets[sock].u16SessionID); + if(u16ReadSize < u16BufferSize) + hif_receive(0, NULL, 0, 1); + } + } + } + else if((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) + { + SOCKET sock; + sint16 s16Rcvd; + tstrSendReply strReply; + uint8 u8CallbackMsgID = SOCKET_MSG_SEND; + + if(u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if(hif_receive(u32Address, (uint8*)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) + { + uint16 u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n",u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if(gpfAppSocketCb) + gpfAppSocketCb(sock,u8CallbackMsgID, &s16Rcvd); + } + else + { + M2M_DBG("Discard send callback %d %d \r\n",u16SessionID , gastrSockets[sock].u16SessionID); + } + } + } + else if(u8OpCode == SOCKET_CMD_PING) + { + tstrPingReply strPingReply; + if(hif_receive(u32Address, (uint8*)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) + { + gfpPingCb = (void (*)(uint32 , uint32 , uint8))strPingReply.u32CmdPrivate; + if(gfpPingCb != NULL) + { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); +} + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void socketInit(void) +{ + if(gbSocketInit==0) + { + m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP,m2m_ip_cb); + gbSocketInit=1; + gu16SessionID = 0; + } +} + +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. + +Author + Samer Sarhan + +Version + 1.0 + +Date + 27 Feb 2015 +*********************************************************************/ +void socketDeinit(void) +{ + m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} + + +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. + +Author + Ahmed Ezzat + +Versio + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags) +{ + SOCKET sock = -1; + uint8 u8SockID; + uint8 u8Count; + volatile tstrSocket *pstrSock; + static volatile uint8 u8NextTcpSock = 0; + static volatile uint8 u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if(u16Domain == AF_INET) + { + if(u8Type == SOCK_STREAM) + { + for(u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)u8SockID; + break; + } + } + } + else if(u8Type == SOCK_DGRAM) + { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for(u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + break; + } + } + } + + if(sock >= 0) + { + m2m_memset((uint8*)pstrSock, 0, sizeof(tstrSocket)); + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n",sock, gu16SessionID ); + + if(u8Flags & SOCKET_FLAGS_SSL) + { + tstrSSLSocketCreateCmd strSSLCreate; + strSSLCreate.sslSock = sock; + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + } + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((pstrAddr != NULL) && (sock >= 0) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrBindCmd strBind; + + /* Build the bind request. */ + strBind.sock = sock; + m2m_memcpy((uint8 *)&strBind.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strBind.strAddr.u16Family = strBind.strAddr.u16Family; + strBind.strAddr.u16Port = strBind.strAddr.u16Port; + strBind.strAddr.u32IPAddr = strBind.strAddr.u32IPAddr; + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(SOCKET_CMD_BIND, (uint8*)&strBind,sizeof(tstrBindCmd) , NULL , 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 listen(SOCKET sock, uint8 backlog) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) + { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8*)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1) ) + { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrConnectCmd strConnect; + uint8 u8Cmd = SOCKET_CMD_CONNECT; + if((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + m2m_memcpy((uint8 *)&strConnect.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strConnect,sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + uint16 u16DataOffset; + tstrSendCmd strSend; + uint8 u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if(sock >= TCP_SOCK_MAX) + { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd|M2M_REQ_DATA_PKT, (uint8*)&strSend, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, u16DataOffset); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + tstrSendCmd strSendTo; + + m2m_memset((uint8*)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if(pstrDestAddr != NULL) + { + struct sockaddr_in *pstrAddr; + pstrAddr = (void*)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8*)&strSendTo, sizeof(tstrSendCmd), + pvSendBuffer, u16SendLength, UDP_TX_PACKET_OFFSET); + + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + uint8 u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strRecv, sizeof(tstrRecvCmd), NULL , 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + close + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 close(SOCKET sock) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + M2M_INFO("Sock to delete <%d>\n", sock); + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) + { + uint8 u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strclose, sizeof(tstrCloseCmd), NULL,0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + m2m_memset((uint8*)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_NO_ERROR; + if((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8*)&strRecv, sizeof(tstrRecvCmd), NULL , 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } + else + { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + nmi_inet_addr + +Description + +Return + Unsigned 32-bit integer representing the IP address in Network + byte order. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +uint32 nmi_inet_addr(char *pcIpAddr) +{ + uint8 tmp; + uint32 u32IP = 0; + uint8 au8IP[4]; + uint8 c; + uint8 i, j; + + tmp = 0; + + for(i = 0; i < 4; ++i) + { + j = 0; + do + { + c = *pcIpAddr; + ++j; + if(j > 4) + { + return 0; + } + if(c == '.' || c == 0) + { + au8IP[i] = tmp; + tmp = 0; + } + else if(c >= '0' && c <= '9') + { + tmp = (tmp * 10) + (c - '0'); + } + else + { + return 0; + } + ++pcIpAddr; + } while(c != '.' && c != 0); + } + m2m_memcpy((uint8*)&u32IP, au8IP, 4); + return u32IP; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 gethostbyname(uint8 * pcHostName) +{ + sint8 s8Err = SOCK_ERR_INVALID_ARG; + uint8 u8HostNameSize = (uint8)m2m_strlen(pcHostName); + if(u8HostNameSize <= HOSTNAME_MAX_SIZE) + { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8*)pcHostName, u8HostNameSize + 1, NULL,0, 0); + if(s8Err != SOCK_ERR_NO_ERROR) + { + s8Err = SOCK_ERR_INVALID; + } + } + return s8Err; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +static sint8 sslSetSockOpt(SOCKET sock, uint8 u8Opt, const void *pvOptVal, uint16 u16OptLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if(sock < TCP_SOCK_MAX) + { + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + if(u8Opt == SO_SSL_BYPASS_X509_VERIF) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_BYPASS_X509; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_BYPASS_X509; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_ENABLE_SESSION_CACHING) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CACHE_SESSION; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CACHE_SESSION; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_ENABLE_CERTNAME_VALIDATION) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CHECK_CERTNAME; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CHECK_CERTNAME; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_SNI) + { + if(u16OptLen < HOSTNAME_MAX_SIZE) + { + uint8 *pu8SNI = (uint8*)pvOptVal; + tstrSSLSetSockOptCmd strCmd; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + m2m_memcpy(strCmd.au8OptVal, pu8SNI, HOSTNAME_MAX_SIZE); + + if(SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8*)&strCmd, sizeof(tstrSSLSetSockOptCmd), + 0, 0, 0) == M2M_ERR_MEM_ALLOC) + { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else + { + M2M_ERR("SNI Exceeds Max Length\n"); + } + } + else + { + M2M_ERR("Unknown SSL Socket Option %d\n",u8Opt); + } + } + else + { + M2M_ERR("Not SSL Socket\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +sint8 setsockopt(SOCKET sock, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) + { + if(u8Level == SOL_SSL_SOCKET) + { + if((option_name == SO_SSL_SNI) || (u16OptionLen == sizeof(int))) + { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + } + else + { + if(u16OptionLen == sizeof(uint32)) + { + uint8 u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option=option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32*)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL,0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 24 August 2014 +*********************************************************************/ +sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8* pu8OptLen) +{ + // This is not implemented so return a value that will cause failure should this be used. + return SOCK_ERR_INVALID_ARG; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2015 +*********************************************************************/ +sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if((u32DstIP != 0) && (fpPingCb != NULL)) + { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = (uint32)fpPingCb; + strPingCmd.u8TTL = u8TTL; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8*)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} diff --git a/AudioConsole.X/Source/winc3400/socket/source/socket_internal.h b/AudioConsole.X/Source/winc3400/socket/source/socket_internal.h new file mode 100644 index 0000000..e5c1896 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/socket/source/socket_internal.h @@ -0,0 +1,61 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef __SOCKET_INTERNAL_H__ +#define __SOCKET_INTERNAL_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket/include/socket.h" +#include "socket/include/m2m_socket_host_if.h" + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv,uint8 u8SocketMsg, + uint32 u32StartAddress,uint16 u16ReadCount); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash.h b/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..44c360a --- /dev/null +++ b/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash.h @@ -0,0 +1,192 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/** @defgroup SPIFLASHAPI SPI FLASH + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "driver/source/nmbus.h" +#include "spi_flash_map.h" + +/** @defgroup SPIFLASHFUNCTIONS Functions + * @ingroup SPIFLASHAPI + */ + + /**@{*/ +/*! + * @fn uint32 spi_flash_get_size(void); + * @brief Returns with \ref uint32 value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32 spi_flash_get_size(void); + +/*! + * @fn sint8 spi_flash_read(uint8 *, uint32, uint32); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will be filled with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz); + +/*! + * @fn sint8 spi_flash_write(uint8 *, uint32, uint32); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the data to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and comparing it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase that section first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_write(uint8* pu8Buf, uint32 u32Offset, uint32 u32Sz); + +/*! + * @fn sint8 spi_flash_erase(uint32, uint32); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Total number of bytes required to be erased. + * @note It is blocking function \n +* @warning +* - Address (offset) plus size of data must not exceed flash size.\n +* - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * \section SPIFLASHExample Example + * @code{.c} + * #include "spi_flash/include/spi_flash.h" + * + * #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + * + * int main() + * { + * uint8 au8FlashContent[FLASH_SECTOR_SZ] = {0}; + * uint32 u32FlashTotalSize = 0; + * uint32 u32FlashOffset = 0; + * + * ret = m2m_wifi_download_mode(); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to enter download mode\r\n"); + * } + * else + * { + * u32FlashTotalSize = spi_flash_get_size(); + * } + * + * while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + * { + * ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to read SPI sector\r\n"); + * break; + * } + * memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + * + * ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to erase SPI sector\r\n"); + * break; + * } + * + * ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to write SPI sector\r\n"); + * break; + * } + * u32FlashOffset += FLASH_SECTOR_SZ; + * } + * + * if(M2M_SUCCESS == ret) + * { + * printf("Successful operations\r\n"); + * } + * else + * { + * printf("Failed operations\r\n"); + * } + * + * while(1); + * return M2M_SUCCESS; + * } + * @endcode + */ + +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz); + + +/**@} + */ + + +#endif //__SPI_FLASH_H__ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash_map.h b/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..40ea38d --- /dev/null +++ b/AudioConsole.X/Source/winc3400/spi_flash/include/spi_flash_map.h @@ -0,0 +1,267 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ +#define BT_IMAGE_PRESENT + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! M2M_OTA_IMAGE2_OFFSET) +#error "Exceed Flash Size" +#endif /* ((FLASH_COMMON_SZ + OTA_IMAGE_SIZE + HOST_CONTROL_FLASH_SZ) > M2M_OTA_IMAGE2_OFFSET) */ +#if ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) +#error "OTA Exceed Flash Size" +#endif /* ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/AudioConsole.X/Source/winc3400/spi_flash/source/spi_flash.c b/AudioConsole.X/Source/winc3400/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..ad91e04 --- /dev/null +++ b/AudioConsole.X/Source/winc3400/spi_flash/source/spi_flash.c @@ -0,0 +1,677 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef PROFILING +#include "windows.h" +#endif +#include "spi_flash/include/spi_flash.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +//#define DISABLE_UNSED_FLASH_FUNCTIONS + +#define HOST_SHARE_MEM_BASE (0xd0000UL) +#define CORTUS_SHARE_MEM_BASE (0x60000000UL) +#define NMI_SPI_FLASH_ADDR (0x111c) +/*********************************************************** +SPI Flash DMA +***********************************************************/ +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32)X[1+Y]<<8) + ((uint32)X[2+Y]<<16) +((uint32)X[3+Y]<<24)) +#define SPI_FLASH_BASE (0x10200) +#define SPI_FLASH_MODE (SPI_FLASH_BASE + 0x00) +#define SPI_FLASH_CMD_CNT (SPI_FLASH_BASE + 0x04) +#define SPI_FLASH_DATA_CNT (SPI_FLASH_BASE + 0x08) +#define SPI_FLASH_BUF1 (SPI_FLASH_BASE + 0x0c) +#define SPI_FLASH_BUF2 (SPI_FLASH_BASE + 0x10) +#define SPI_FLASH_BUF_DIR (SPI_FLASH_BASE + 0x14) +#define SPI_FLASH_TR_DONE (SPI_FLASH_BASE + 0x18) +#define SPI_FLASH_DMA_ADDR (SPI_FLASH_BASE + 0x1c) +#define SPI_FLASH_MSB_CTL (SPI_FLASH_BASE + 0x20) +#define SPI_FLASH_TX_CTL (SPI_FLASH_BASE + 0x24) + +/*********************************************/ +/* STATIC FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read_status_reg +* @brief Read status register +* @param[OUT] val + value of status reg +* @return Status of execution +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_read_status_reg(uint8 * val) +{ + sint8 ret = M2M_SUCCESS; + uint8 cmd[1]; + uint32 reg; + + cmd[0] = 0x05; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + *val = reg & 0xff; + return ret; +} + +#ifdef DISABLE_UNSED_FLASH_FUNCTIONS +/** +* @fn spi_flash_read_security_reg +* @brief Read security register +* @return Security register value +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static uint8 spi_flash_read_security_reg(void) +{ + uint8 cmd[1]; + uint32 reg; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x2b; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 1); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + + return (sint8)reg & 0xff; +} + +/** +* @fn spi_flash_gang_unblock +* @brief Unblock all flash area +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_gang_unblock(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x98; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_clear_security_flags +* @brief Clear all security flags +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_clear_security_flags(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x30; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} +#endif + +/** +* @fn spi_flash_load_to_cortus_mem +* @brief Load data from SPI flash into cortus memory +* @param[IN] u32MemAdr +* Cortus load address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_load_to_cortus_mem(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[5]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x0b; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_sector_erase +* @brief Erase sector (4KB) +* @param[IN] u32FlashAdr +* Any memory address within the sector +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_sector_erase(uint32 u32FlashAdr) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_enable +* @brief Send write enable command to SPI flash +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_write_enable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_disable +* @brief Send write disable command to SPI flash +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_write_disable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_page_program +* @brief Write data (less than page size) from cortus memory to SPI flash +* @param[IN] u32MemAdr +* Cortus data address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_page_program(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7) | ((u32Sz & 0xfffff) << 8)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_read_internal +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32Addr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Data size must be < 64KB (limitation imposed by the bus wrapper) +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_read_internal(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if(M2M_SUCCESS != ret) goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** +* @fn spi_flash_pp +* @brief Program data of size less than a page (256 bytes) at the SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_pp(uint32 u32Offset, uint8 *pu8Buf, uint16 u16Sz) +{ + sint8 ret = M2M_SUCCESS; + uint8 tmp; + spi_flash_write_enable(); + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + ret += spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz); + do + { + if(ret != M2M_SUCCESS) goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } + while(tmp & 0x01); + ret += spi_flash_write_disable(); +ERR: + return ret; +} + +/** +* @fn spi_flash_rdid +* @brief Read SPI Flash ID +* @return SPI FLash ID +* @author M.S.M +* @version 1.0 +*/ +static uint32 spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32 reg = 0; + uint32 cnt = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + if(++cnt > 500) + { + ret = M2M_ERR_INIT; + break; + } + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + M2M_PRINT("Flash ID %x \n",(unsigned int)reg); + return reg; +} + +/** +* @fn spi_flash_unlock +* @brief Unlock SPI Flash +* @author M.S.M +* @version 1.0 +*/ +#if 0 +static void spi_flash_unlock(void) +{ + uint8 tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif + +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32offset +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32offset, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + if(u32Sz > FLASH_BLOCK_SIZE) + { + do + { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if(M2M_SUCCESS != ret) goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while(u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** +* @fn spi_flash_write +* @brief Proram SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_write(uint8* pu8Buf, uint32 u32Offset, uint32 u32Sz) +{ +#ifdef PROFILING + unsigned long long t1 = 0; + uint32 percent =0; + uint32 tpercent =0; +#endif + sint8 ret = M2M_SUCCESS; + uint32 u32wsz; + uint32 u32off; + uint32 u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz/u32Blksz)+((u32Sz%u32Blksz)>0); + t1 = GetTickCount64(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if(u32Sz<=0) + { + M2M_ERR("Data size = %d",(int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if (u32off)/*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if(spi_flash_pp(u32Offset, pu8Buf, (uint16)BSP_MIN(u32Sz, u32wsz))!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + if (u32Sz < u32wsz) goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while (u32Sz > 0) + { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if(spi_flash_pp(u32Offset, pu8Buf, (uint16)u32wsz)!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r",((percent*100)/tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r",(GetTickCount64() - t1)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_erase +* @brief Erase from data from SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz) +{ + uint32 i = 0; + sint8 ret = M2M_SUCCESS; + uint8 tmp = 0; +#ifdef PROFILING + unsigned long long t; + t = GetTickCount64(); +#endif + M2M_DBG("\r\n>Start erasing...\r\n"); + for(i = u32Offset; i < (u32Sz +u32Offset); i += (16*FLASH_PAGE_SZ)) + { + ret += spi_flash_write_enable(); + ret += spi_flash_read_status_reg(&tmp); + ret += spi_flash_sector_erase(i); + ret += spi_flash_read_status_reg(&tmp); + do + { + if(ret != M2M_SUCCESS) goto ERR; + ret += spi_flash_read_status_reg(&tmp); + }while(tmp & 0x01); + + } + M2M_DBG("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (GetTickCount64()-t)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_get_size +* @brief Get size of SPI Flash +* @return Size of Flash +* @author M.S.M +* @version 1.0 +*/ +uint32 spi_flash_get_size(void) +{ + uint32 u32FlashId = 0, u32FlashPwr = 0; + static uint32 gu32InernalFlashSize= 0; + + if(!gu32InernalFlashSize) + { + u32FlashId = spi_flash_rdid();//spi_flash_probe(); + if(u32FlashId != 0xffffffff) + { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId>>16)&0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InernalFlashSize = 1< + +//extern void set_winc_spi_descriptor(struct spi_m_sync_descriptor *spi_inst); + +/* + * \brief Initialize Wifi library + */ +void wifi_init(tstrWifiInitParam *params) +{ + tstrWifiInitParam param; + int8_t ret; + + //set_winc_spi_descriptor(&WINC_SPI); //JFM + + /* Initialize the BSP. */ + nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = params->pfAppWifiCb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + while (1) { + } + } +} diff --git a/AudioConsole.X/Source/winc3400/winc_init.h b/AudioConsole.X/Source/winc3400/winc_init.h new file mode 100644 index 0000000..dce666c --- /dev/null +++ b/AudioConsole.X/Source/winc3400/winc_init.h @@ -0,0 +1,14 @@ +#ifndef WINC1500_MAIN_H +#define WINC1500_MAIN_H + +//#include "atmel_start.h" + +#include "driver/include/m2m_wifi.h" + +//#define CONF_WINC_PIN_CHIP_SELECT WINC_PIN_CHIP_SELECT +//#define CONF_WINC_PIN_CHIP_ENABLE WINC_PIN_CHIP_ENABLE +//#define CONF_WINC_PIN_RESET WINC_PIN_RESET + +void wifi_init(tstrWifiInitParam *params); + +#endif diff --git a/AudioConsole.X/Source/winc3400_142/bsp/include/nm_bsp.h b/AudioConsole.X/Source/winc3400_142/bsp/include/nm_bsp.h new file mode 100644 index 0000000..a22ad5c --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/bsp/include/nm_bsp.h @@ -0,0 +1,85 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains WINC3400 BSP APIs declarations. + + Description: + This module contains WINC3400 BSP APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup nm_bsp BSP + @brief + Description of the BSP (Board Support Package) module. + @{ + @defgroup DataT Data Types + @defgroup BSPDefine Defines + @defgroup BSPAPI Functions + @brief + Lists the available BSP (Board Support Package) APIs. + @} + */ + +/**@addtogroup BSPDefine + @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) +/*!< + * Computes the minimum value between \b x and \b y. + */ +/**@}*/ //BSPDefine + +/** + * @addtogroup BSPDefine + * @{ + */ + +#ifdef _NM_BSP_BIG_END +/*! Switch endianness of 32bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_32(x) \ +((((x) & 0x000000FF) << 24) + \ +(((x) & 0x0000FF00) << 8) + \ +(((x) & 0x00FF0000) >> 8) + \ +(((x) & 0xFF000000) >> 24)) +/*! Switch endianness of 16bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_16(x) \ +((((x) & 0x00FF) << 8) + \ +(((x) & 0xFF00) >> 8)) +#else +/*! Retain endianness of 32bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_32(x) (x) +/*! Retain endianness of 16bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_16(x) (x) +#endif +/**@}*/ //BSPDefine + +#endif /*_NM_BSP_H_*/ diff --git a/AudioConsole.X/Source/winc3400_142/common/include/nm_common.h b/AudioConsole.X/Source/winc3400_142/common/include/nm_common.h new file mode 100644 index 0000000..fd420dd --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/common/include/nm_common.h @@ -0,0 +1,172 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains common APIs declarations. + + Description: + This module contains common APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup COMMON Common + @{ + @defgroup COMMONDEF Defines + @defgroup COMMONAPI Functions + @} + */ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include +#include "define.h" +#include "nm_bsp.h" +#include "nm_debug.h" + +/**@addtogroup COMMONDEF + * @{ + */ + +/*states*/ +#define M2M_SUCCESS ((int8_t)0) +#define M2M_ERR_SEND ((int8_t)-1) +#define M2M_ERR_RCV ((int8_t)-2) +#define M2M_ERR_MEM_ALLOC ((int8_t)-3) +#define M2M_ERR_TIME_OUT ((int8_t)-4) +#define M2M_ERR_INIT ((int8_t)-5) +#define M2M_ERR_BUS_FAIL ((int8_t)-6) +#define M2M_NOT_YET ((int8_t)-7) +#define M2M_ERR_FIRMWARE ((int8_t)-8) +#define M2M_SPI_FAIL ((int8_t)-9) +#define M2M_ERR_FIRMWARE_bURN ((int8_t)-10) +#define M2M_ACK ((int8_t)-11) +#define M2M_ERR_FAIL ((int8_t)-12) +#define M2M_ERR_FW_VER_MISMATCH ((int8_t)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((int8_t)-14) +#define M2M_ERR_INVALID_ARG ((int8_t)-15) + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +#ifndef BIG_ENDIAN +/*! Most significant byte of 32bit word (LE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (LE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (LE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (LE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +#else +/*! Most significant byte of 32bit word (BE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (BE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (BE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (BE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +#endif +/**@}*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * @ingroup COMMONAPI + * @fn int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + * @brief Converts a string of hex characters to bytes. + * @param[out] pu8Out + * Output buffer (eg {0x11, 0x12, 0x13,...}) + * @param[in] pu8In + * Input buffer (eg {0x31, 0x31, 0x31, 0x32, 0x31, 0x33, ...}) + * @param[in] u8SizeOut + * Length of output buffer (should be half of the length of the input buffer). + * @return @ref M2M_SUCCESS if successful, M2M_ERR_INVALID_ARG otherwise (eg unrecognised hexchar in input). + */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + +/*! + * @fn void nm_sleep(uint32_t u32TimeMsec); + * @brief Used to put the host to sleep for the specified duration (in milliseconds). + * Forcing the host to sleep for extended period may lead to host not being able to respond + * to WINC board events. It is important to be considerate while choosing the sleep period. + * @param [in] u32TimeMsec + * Time unit in milliseconds. + * @pre Initialize @ref nm_bsp_init first. + * @note Implementation of this function is host dependent. + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds. + * @see nm_bsp_init + * @return None + */ +void nm_sleep(uint32_t u32TimeMsec); + +/*! + * @ingroup COMMONAPI + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void); +/**@}*/ +#ifdef __cplusplus +} +#endif +#endif /*_NM_COMMON_H_*/ diff --git a/AudioConsole.X/Source/winc3400_142/common/include/nm_debug.h b/AudioConsole.X/Source/winc3400_142/common/include/nm_debug.h new file mode 100644 index 0000000..1a5ee88 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/common/include/nm_debug.h @@ -0,0 +1,60 @@ +/******************************************************************************* + File Name: + nm_debug.h + + Summary: + This module contains debug API declarations. + + Description: + This module contains debug API declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + + +//#include "wdrv_winc_debug.h" //JFM replaced include by direct definitions below +#define WDRV_DBG_VERBOSE_PRINT(...) +#define WDRV_DBG_TRACE_PRINT(...) +#define WDRV_DBG_INFORM_PRINT(...) +#define WDRV_DBG_ERROR_PRINT(...) + +/** + * @defgroup DebugDefines DebugDefines + * @ingroup WlanDefines + */ + +/**@{*/ + +#define M2M_ERR(...) WDRV_DBG_ERROR_PRINT(__VA_ARGS__) +#define M2M_INFO(...) WDRV_DBG_INFORM_PRINT(__VA_ARGS__) +#define M2M_DBG(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) +#define M2M_PRINT(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) + +/**@}*/ + +#endif /* _NM_DEBUG_H_ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/common/source/nm_common.c b/AudioConsole.X/Source/winc3400_142/common/source/nm_common.c new file mode 100644 index 0000000..1900671 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/common/source/nm_common.c @@ -0,0 +1,114 @@ +/******************************************************************************* + File Name: + nm_common.c + + Summary: + This module contains common APIs implementations. + + Description: + This module contains common APIs implementations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "timer.h" +#include "BoardCfg.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_gpio.h" + + + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + //JFM WINC LOW LEVEL + //JFM à valider si ça fuck pas la patente vu qu'on est en interrupt... + //m2m_wifi_handle_events(); + + IFS0bits.INT0IF = 0; +} + +/*! + * @fn nm_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_sleep(uint32_t u32TimeMsec) +{ + Sleep(u32TimeMsec); +} + +/*! + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void) +{ + //JFM WINC LOW LEVEL + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(100); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(150); + WIFI_CHP_RST_PIN = 1; +} + +/* Convert hexchar to value 0-15 */ +static uint8_t hexchar_2_val(uint8_t ch) +{ + ch -= 0x30; + if (ch <= 9) + return ch; + ch |= 0x20; + ch -= 0x31; + if (ch <= 5) + return ch + 10; + return 0xFF; +} + +/* Convert hexstring to bytes */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut) +{ + while(u8SizeOut--) + { + uint8_t u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out = u8Out * 0x10; + u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out += u8Out; + pu8Out++; + } + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/ecc_types.h b/AudioConsole.X/Source/winc3400_142/driver/include/ecc_types.h new file mode 100644 index 0000000..51d4065 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/ecc_types.h @@ -0,0 +1,300 @@ +/******************************************************************************* + File Name: + ecc_types.h + + Summary: + Elliptic Curve Cryptography Module Interface. + + Description: + Elliptic Curve Cryptography Module Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + + +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +/*!< +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/**@addtogroup SSLEnums + * @{ + */ +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve{ + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +}tenuEcNamedCurve; + + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint{ + uint8_t X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8_t Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16_t u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16_t u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +}tstrECPoint; + + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam{ + uint32_t p[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t a[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +}tstrECDomainParam; + + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct{ + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +}tstrEllipticCurve; + +/*! +@enum \ + tenuEccREQ + +@brief ECC operations that may be requested by WINC. + + These are passed in the u16REQ field of @ref tstrEccReqInfo, which is used in both the request + from the WINC and the response to the WINC. +*/ +typedef enum{ + ECC_REQ_NONE, + /*!< */ + ECC_REQ_CLIENT_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as client. + */ + ECC_REQ_SERVER_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as server. + */ + ECC_REQ_GEN_KEY, + /*!< + Generate a key pair to be used in ECDHE key exchange as server. + */ + ECC_REQ_SIGN_GEN, + /*!< + Generate the signature for a given curve and value. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ + ECC_REQ_SIGN_VERIFY + /*!< + Verify a list of signatures. Each set of value/signature/key/curve information needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tenuEccREQ; + +/*! +@struct \ + tstrEcdhReqInfo + +@brief Information relating to operations of type @ref ECC_REQ_CLIENT_ECDH, @ref ECC_REQ_GEN_KEY + and @ref ECC_REQ_SERVER_ECDH. +*/ +typedef struct{ + tstrECPoint strPubKey; + /*!< + Public key. Usage depends on type of operation. + */ + uint8_t au8Key[ECC_POINT_MAX_SIZE]; + /*!< + Pre master secret generated during operations of type @ref ECC_REQ_CLIENT_ECDH and + @ref ECC_REQ_SERVER_ECDH. + */ +}tstrEcdhReqInfo; + +/*! +@struct \ + tstrEcdsaVerifyReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_VERIFY. +*/ +typedef struct{ + uint32_t u32nSig; + /*!< + Number of sets of value/signature/key/curve information for verifying. Each set needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tstrEcdsaVerifyReqInfo; + +/*! +@struct \ + tstrEcdsaSignReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_GEN. +*/ +typedef struct{ + uint16_t u16CurveType; + /*!< + The named curve to be used for signing, to be cast to type @ref tenuEcNamedCurve. + */ + uint16_t u16HashSz; + /*!< + The size of the value to be signed. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ +}tstrEcdsaSignReqInfo; + +/*! +@struct \ + tstrEccReqInfo + +@brief Information relating to ECC operations. + + This is used in both the request from the WINC and the response to the WINC. +*/ +typedef struct{ + uint16_t u16REQ; + /*!< + The requested ECC operation, to be cast to type @ref tenuEccREQ. + */ + uint16_t u16Status; + /*!< + The status of the operation: zero for success; non-zero for failure. + This field should be used in responses and ignored in requests. + */ + uint32_t u32UserData; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + uint32_t u32SeqNo; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + union{ + tstrEcdhReqInfo strEcdhREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_CLIENT_ECDH, + @ref ECC_REQ_GEN_KEY or @ref ECC_REQ_SERVER_ECDH. + */ + tstrEcdsaSignReqInfo strEcdsaSignREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_GEN. + This field is used in requests and ignored in responses. + */ + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_VERIFY. + This field is used in requests and ignored in responses. + */ + }; +}tstrEccReqInfo; +/**@}*/ //SSLEnums + +#endif /* __ECC_TYPES_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_flash.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_flash.h new file mode 100644 index 0000000..b279933 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_flash.h @@ -0,0 +1,188 @@ +/******************************************************************************* + WINC Flash Interface. + + File Name: + m2m_flash.h + + Summary: + WINC Flash Interface + + Description: + WINC Flash Interface + +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup FLASHAPI Flash +*/ + +#ifndef __M2M_FLASH_H__ +#define __M2M_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "nm_common.h" +#include "m2m_types.h" + +/**@defgroup FlashEnums Enumeration/Typedefs + * @ingroup FLASHAPI + * @{*/ + +/*! +@enum tenuWincFlashRegion + +@brief The regions of WINC flash available for accessing. +*/ +typedef enum +{ + /*! Access to the entire flash address space. */ + WINC_FLASH_REGION_RAW, + /*! Access to the active firmware region. */ + WINC_FLASH_REGION_FIRMWARE_ACTIVE, + /*! Access to the inactive firmware region. */ + WINC_FLASH_REGION_FIRMWARE_INACTIVE, + /*! Access to PLL table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_PLL_TABLE, + /*! Access to gain table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_GAIN_TABLE, + /*! Access to PLL and gain tables region. Erase is supported for this region. */ + WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + /*! Access to TLS root certificate region. */ + WINC_FLASH_REGION_ROOT_CERTS, + /*! Access to TLS local certificate region. */ + WINC_FLASH_REGION_LOCAL_CERTS, + /*! Access to connection parameters region. */ + WINC_FLASH_REGION_CONN_PARAM, + /*! Access to HTTP files region. This region is also erased/written by erase/write of firmware regions. */ + WINC_FLASH_REGION_HTTP_FILES, + /*! Number of regions. */ + WINC_FLASH_NUM_REGIONS +} tenuWincFlashRegion; + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup FLASHFUNCTIONS Functions +* @ingroup FLASHAPI +*/ +/**@{*/ + +/*! +@fn \ + int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +@brief Erase one or more sectors within a WINC flash region. + +@param [in] enuRegion + Region of flash in which to erase. +@param [in] u8StartSector + Sector offset (within region) of first sector to erase. +@param [in] u8NumSectors + Number of sectors to erase. + +@return M2M_SUCCESS - The erase completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +/*! +@fn \ + int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Write the number of bytes specified to a WINC flash location. + +@param [in] enuRegion + Region of flash in which to write. +@param [in] pvBuffer + Pointer to buffer containing the data to write. +@param [in] u32Offset + Byte offset (within region) of write location. +@param [in] u32Size + Number of bytes to write. + +@return M2M_SUCCESS - The write completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +@warning The write operation does not erase the flash device first, therefore the user + must ensure the flash region has been erased first. +*/ +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Read the number of bytes specified from a WINC flash location. + +@param [in] enuRegion + Region of flash from which to read. +@param [out] pvBuffer + Pointer to buffer to populate with the data being read. +@param [in] u32Offset + Byte offset (within region) of read location. +@param [in] u32Size + Number of bytes to read. + +@return M2M_SUCCESS - The read completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. +*/ +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_switch_firmware(void); + +@brief Switch the active and inactive firmware images. + +@return M2M_SUCCESS - The firmware switch completed successfully. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_switch_firmware(void); + +/**@}*/ +#endif /* __M2M_FLASH_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_hif.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_hif.h new file mode 100644 index 0000000..4728429 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_hif.h @@ -0,0 +1,243 @@ +/******************************************************************************* + File Name: + m2m_hif.h + + Summary: + This module contains M2M host interface API definitions. + + Description: + This module contains M2M host interface API definitions. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. +*/ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + + +/** +* @struct tstrHifHdr +* @brief Structure to hold HIF header +*/ +typedef struct +{ + uint8_t u8Gid; /*!< Group ID */ + uint8_t u8Opcode; /*!< OP code */ + uint16_t u16Length; /*!< Payload length */ +} tstrHifHdr; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +/** +* @fn int8_t hif_init(void *arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_init(void *arg); +/** +* @fn int8_t hif_deinit(void *arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_deinit(void *arg); +/** +* @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +int8_t hif_check_compatibility(uint16_t u16HifInfo); +/** +* @fn int8_t hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +int8_t hif_enable_access(void); +/** +* @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +/** +* @fn int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset); +/** +* @fn hif_receive +* @brief Host interface interrupt service routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn); +/** +* @fn int8_t hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_chip_sleep(void); +/** +* @fn int8_t hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_chip_wake(void); +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype); +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8_t hif_get_sleep_mode(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from WINC3400 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ota.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ota.h new file mode 100644 index 0000000..d6466d8 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ota.h @@ -0,0 +1,370 @@ +/******************************************************************************* + WINC3400 OTA Upgrade API Interface + + File Name: + m2m_ota.h + + Summary: + WINC3400 OTA Upgrade API Interface + + Description: + WINC3400 OTA Upgrade API Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup OTAAPI OTA + @brief + The WINC supports OTA (Over-The-Air) updates. Using the APIs described in this module, + it is possible to request an ATWINC15x0 to update its firmware, or safely rollback to + the previous firmware version.\n There are also APIs to download files and store them in + the WINC's Flash (supported by ATWINC1510 only), which can be used for Host MCU OTA + updates or accessing information stored remotely. + @{ + @defgroup OTACALLBACKS Callbacks + @brief + Lists the different callbacks that can be used during OTA updates.\n + Callbacks of type @ref tpfOtaNotifCb and @ref tpfOtaUpdateCb should be passed + onto @ref m2m_ota_init at system initialization. Other callbacks are provided + to handle the various steps of Host File Download. + + @defgroup OTADEFINE Defines + @brief + Specifies the macros and defines used by the OTA APIs. + + @defgroup OTATYPEDEF Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the OTA APIs. + + @defgroup OTAFUNCTIONS Functions + @brief + Lists the full set of available APIs to manage OTA updates and Host File Downloads. + @} +*/ + +#ifndef __M2M_OTA_H__ +#define __M2M_OTA_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); + +@brief + A callback to get OTA status update, the callback provides the status type and its status.\n + The OTA callback provides the download status, the switch to the downloaded firmware status + and roll-back status. + +@param[in] u8OtaUpdateStatusType + Possible values are listed in @ref tenuOtaUpdateStatusType. + +@param[in] u8OtaUpdateStatus + Possible values are listed as enumerated by @ref tenuOtaUpdateStatus. + +@note + Executes other callbacks passed to the OTA module. + +@see + tenuOtaUpdateStatusType + tenuOtaUpdateStatus + */ +typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); +/**@}*/ // OTACALLBACKS + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +@brief + Synchronous initialization function for the OTA layer by registering the update callback.\n + The notification callback is not supported at the current version. Calling this API is a + MUST for all the OTA API's. + +@param[in] pfOtaUpdateCb + OTA Update callback function. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl); + +@brief + Request OTA start update using the download URL. The OTA module will download the OTA image, ensure integrity of the image + and update the validity of the image in the control structure. On completion, a callback of type @ref tpfOtaUpdateCb is called + (callback previously provided via @ref m2m_ota_init). Switching to the updated image additionally requires completion of + @ref m2m_ota_switch_firmware, followed by a WINC reset. + +@param[in] pcDownloadUrl + The download firmware URL, according to the application server. + +@warning + Calling this API does not guarantee OTA WINC image update, it depends on the connection with the + download server and the validity of the image.\n + Calling this API invalidates any previous valid rollback image, irrespective of the result, but when + the OTA succeeds, the current image will become the rollback image after @ref m2m_ota_switch_firmware. + +@pre + @ref m2m_ota_init is a prerequisite and must have been called before using @ref m2m_ota_start_update.\n + Switching to the newly downloaded image requires calling @ref m2m_ota_switch_firmware API. + +@sa + @ref m2m_ota_init + @ref m2m_ota_switch_firmware + @ref tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + Note that successful operation in this context means the OTA update request has reached the firmware OTA module. + It does not indicate whether or not the image update succeeded. + +@section OTAExample Example + This example shows how an OTA image update and switch is carried out. + It demonstrates use of the following OTA APIs: + - @ref m2m_ota_init + - @ref tpfOtaUpdateCb + - @ref m2m_ota_start_update + - @ref m2m_ota_switch_firmware + - @ref m2m_ota_rollback + + It also makes use of @ref m2m_wifi_check_ota_rb in order to inform OTA decisions. +@code +static void OtaUpdateCb(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus) +{ + int8_t s8tmp; + tstrM2mRev strtmp; + M2M_INFO("%d %d\n", u8OtaUpdateStatusType, u8OtaUpdateStatus); + switch(u8OtaUpdateStatusType) + { + case DL_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("OTA download succeeded\n"); + s8tmp = m2m_wifi_check_ota_rb(); + if(s8tmp == M2M_ERR_FW_VER_MISMATCH) + { + // In this case the application SHOULD update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver would lead to severely limited functionality (i.e. OTA rollback only). + } + else if(s8tmp == M2M_SUCCESS) + { + // In this case the application MAY WANT TO update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without + // updating host driver may lead to suboptimal functionality. + } + else + { + M2M_INFO("Cannot recognize downloaded image\n"); + // In this case the application MUST NOT update the host driver if such an update would change the + // driver HIF Major field. Firmware switch @ref using m2m_ota_switch_firmware() is blocked. + break; + } + // Switch to the upgraded firmware + M2M_INFO("Now switching active partition...\n"); + s8tmp = m2m_ota_switch_firmware(); + } + break; + case SW_STATUS: + case RB_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("Switch/Rollback succeeded\n"); + + // Start the host SW upgrade if required, then system reset is required (Reinitialize the driver) + + M2M_INFO("Now resetting the system...\n"); + system_reset(); + } + break; + } +} + +static void wifi_event_cb(uint8_t u8WiFiEvent, void *pvMsg) +{ + // ... + case M2M_WIFI_REQ_DHCP_CONF: + { + // After successful connection, start the OTA upgrade + m2m_ota_start_update(OTA_URL); + } + break; + default: + break; + // ... +} + +int main(void) +{ + tstrWifiInitParam param; + int8_t s8Ret = M2M_SUCCESS; + bool rollback_required = FALSE; + + // System init, etc should be here... + + memset((uint8_t *)¶m, 0, sizeof(param)); + param.pfAppWifiCb = wifi_event_cb; + + // Initialize the WINC Driver + s8Ret = m2m_wifi_init(¶m); + if(s8Ret == M2M_ERR_FW_VER_MISMATCH) + { + M2M_ERR("Firmware version mismatch\n"); + s8Ret = m2m_wifi_check_ota_rb(); + if(s8Ret == M2M_SUCCESS) + { + // In this case the image in the inactive partition has compatible HIF. We will switch/rollback to it + // after initializing the OTA module. + rollback_required = TRUE; + } + } + if(M2M_SUCCESS != s8Ret) + { + M2M_ERR("Driver Init Failed <%d>\n", s8Ret); + while(1); + } + // Initialize the OTA module + m2m_ota_init(OtaUpdateCb, NULL); + if(rollback_required) + { + // We need to call either @ref m2m_ota_rollback() or @ref m2m_ota_switch_firmware() (functionally equivalent). + m2m_ota_rollback(); + } + else + { + // Connect to AP that provides connection to the OTA server + m2m_wifi_default_connect(); + } + while(1) + { + // Handle the app state machine plus the WINC event handler + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + } + } +} +@endcode + */ +int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_rollback(void); + +@brief + Request OTA Roll-back to the old (inactive) WINC image, the WINC firmware will check the validity of the inactive image + and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously have + provided the callback via @ref m2m_ota_init). If the callback indicates successful activation, the newly-activated image + will start running after next system reset. + +@warning + If rollback requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_rollback(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_abort(void); + +@brief + Request the WINC to abort an OTA in progress.\n + If no download is in progress, the API will respond with failure. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for a successful operation and a negative value otherwise. + */ +int8_t m2m_ota_abort(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_switch_firmware(void); + +@brief + Request switch to the updated WINC image. The WINC firmware will check the validity of the + inactive image and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb + is called (application must previously have provided the callback via @ref m2m_ota_init). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If switch requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_switch_firmware(void); + + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_periph.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_periph.h new file mode 100644 index 0000000..27d1051 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_periph.h @@ -0,0 +1,307 @@ +/******************************************************************************* + WINC3400 Peripherals Application Interface. + + File Name: + m2m_periph.h + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrPerphInitParam + +@brief + Peripheral module initialization parameters. +*/ +typedef struct { + void *arg; +} tstrPerphInitParam; + +/*! +@enum \ + tenuGpioNum + +@brief + A list of GPIO numbers configurable through the m2m_periph module. +*/ +typedef enum { + M2M_PERIPH_GPIO3, + M2M_PERIPH_GPIO4, + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + +/*! +@enum \ + tenuI2cMasterSclMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SCL signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is available on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is available on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is available on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is available on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is available on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! +@enum \ + tenuI2cMasterSdaMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SDA signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK, /*!< I2C master SDA is available on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is available on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is available on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is available on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is available on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + +/*! +@struct \ + tstrI2cMasterInitParam + +@brief + I2C master configuration parameters. +@sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt +*/ +typedef struct { + uint8_t enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8_t enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8_t u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! +@enum \ + tenuI2cMasterFlags + +@brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read +@sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read +*/ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! +@enum \ + tenuPullupMask + +@brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. +@sa + m2m_periph_pullup_ctrl + +*/ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 8), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_RXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 12), +} tenuPullupEnable1Mask; +typedef enum { + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_GPIO_38 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_39 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_40 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_42 = (1ul << 29), +} tenuPullupEnable2Mask; +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@fn \ + int8_t m2m_periph_init(tstrPerphInitParam * param); + +@brief + Initialize the WINC3400 peripheral driver module. + +@param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrPerphInitParam +*/ +int8_t m2m_periph_init(tstrPerphInitParam *param); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +@brief + Configure a specific WINC3400 pad as a GPIO and sets its direction (input or output). + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +@brief + Set an WINC3400 GPIO output level high or low. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t * pu8GpioVal); + +@brief + Read an WINC3400 GPIO input level. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +@brief + Control the programmable pull-up resistor on the chip pads . + + +@param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. + +@param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuPullupMask +*/ +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_PERIPH_H_ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ssl.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ssl.h new file mode 100644 index 0000000..df22ef7 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_ssl.h @@ -0,0 +1,255 @@ +/******************************************************************************* + File Name: + m2m_ssl.h + + Summary: + WINC SSL Interface. + + Description: + WINC SSL Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup SSLAPI SSL + @brief + Provides a description of the SSL Layer. + @{ + @defgroup SSLCallbacks Callbacks + @brief + Provides detail on the available callbacks for the SSL Layer. + + @defgroup SSLEnums Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the SSL APIs. + + @defgroup SSLFUNCTIONS Functions + @brief + Provides detail on the available APIs for the SSL Layer. + @} +*/ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" +#include "ecc_types.h" +#include "socket.h" + +/*! +@ingroup SSLCallbacks +@typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void* pvMsg); +@brief A callback to get SSL notifications. +@param[in] u8MsgType + The type of the message received. +@param[in] pvMsg + A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void *pvMsg); + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); +@brief Initializes the SSL layer. +@param[in] pfAppSSLCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz); +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t* pu8Buffer, uint32_t u32BufferSz); +@brief Sends certificates to the WINC. +@param[in] pu8Buffer + Pointer to the certificates. The buffer format must match the format of @ref tstrTlsSrvSecHdr. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void); + +/*! +@ingroup SSLFUNCTIONS +@fn NMI_API void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by + the caller in the form of a bitmap containing the required ciphers to be on.\n + There is no need to call this function if the application will not change the default ciphersuites. +@param[in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); + +#endif /* __M2M_SSL_H__ */ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/m2m_types.h b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_types.h new file mode 100644 index 0000000..8b9015e --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/m2m_types.h @@ -0,0 +1,2745 @@ +/******************************************************************************* + File Name: + m2m_types.h + + Summary: + WINC3400 Application Interface Internal Types + + Description: + WINC3400 Application Interface Internal Types + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup VERSION Version + */ +/**@defgroup VERSIONDEF Defines + * @ingroup VERSION + * @{ + */ + +/* + Layout of HIF_LEVEL fields + | x x x x x x | x x x x x x x x | + | 13:8 | 7:0 | + | HIF_MAJOR | HIF_MINOR | + | HIF_LEVEL | + + HIF compatibility (checked by driver after wifi boot). + + Check Firmware HIF_MAJOR + |___ + | Does not match Driver - Recommend either: + | > checking compatibility of Cortus image stored in inactive partition + | (m2m_wifi_check_ota_rb()) then swapping to it using OTA rollback or switch. + | > updating Host with out of band method. + |___ + Matches Driver - All APIs can be attempted. + | - Cortus image can be updated (OTA download) + | - New Host image can be retrieved (socket recv) + | + Check Firmware HIF_MINOR + |___ + | Less than Driver - Driver may refuse to execute some APIs (API would return M2M_ERR_SEND). + | - Recommend updating Cortus image using OTA download to use newer Firmware. + |___ + | Equal to Driver - Driver supports all APIs. + |___ + Greater than Driver - Driver supports all APIs. + - Recommend reviewing potential benefit of updating Host to use newer Driver. + + When an OTA update involving HIF_MAJOR change is required, the following order is recommended: + 1. m2m_ota_start_update() to store new Cortus image in inactive partition. + 2. Socket recv() to retrieve new Host image (including new WINC Driver). + 3. Application code to make Host image available in host flash. + 4. m2m_ota_switch_firmware() to switch active/inactive partition (will take effect after system_reset()). + 5. system_reset() to restart with new WINC Driver / Firmware. + Note that in the event of (unintentional) system reset after step (3), the remaining steps (4) and (5) should still be + run after the reset. +*/ +/* Selection of HIF_INFO +*/ +#define M2M_HIF_INFO_SHIFT (0) +#define M2M_HIF_INFO_MASK (0xffff) +/* Subdivision of HIF_INFO +*/ +#define M2M_HIF_BLOCK_SHIFT (14) +#define M2M_HIF_BLOCK_MASK (0x3) +#define M2M_HIF_LEVEL_SHIFT (0) +#define M2M_HIF_LEVEL_MASK (0x3fff) +/* Subdivision of HIF_LEVEL +*/ +#define M2M_HIF_MAJOR_SHIFT (8) +#define M2M_HIF_MAJOR_MASK (0x3f) +#define M2M_HIF_MINOR_SHIFT (0) +#define M2M_HIF_MINOR_MASK (0xff) + +#define M2M_GET_HIF_INFO(hif_ver) ((uint16_t)(((hif_ver) >> M2M_HIF_INFO_SHIFT) & M2M_HIF_INFO_MASK)) +#define M2M_GET_HIF_BLOCK(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_BLOCK_SHIFT) & M2M_HIF_BLOCK_MASK)) +#define M2M_GET_HIF_LEVEL(hif_info) ((uint16_t)(((hif_info) >> M2M_HIF_LEVEL_SHIFT) & M2M_HIF_LEVEL_MASK)) +#define M2M_GET_HIF_MAJOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MAJOR_SHIFT) & M2M_HIF_MAJOR_MASK)) +#define M2M_GET_HIF_MINOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MINOR_SHIFT) & M2M_HIF_MINOR_MASK)) + +#define M2M_MAKE_HIF_INFO(hif_level) ( \ + (((uint16_t)(hif_level) & M2M_HIF_LEVEL_MASK) << M2M_HIF_LEVEL_SHIFT) | \ + (((uint16_t)M2M_HIF_BLOCK_VALUE & M2M_HIF_BLOCK_MASK) << M2M_HIF_BLOCK_SHIFT) ) + +/*======*======*======*======* + HIF LEVEL + *======*======*======*======*/ + +#define M2M_HIF_BLOCK_VALUE (2) +/*!< Drv/Fw blocking compatibility check. + */ +#define M2M_HIF_MAJOR_VALUE (1) +/*!< Drv/Fw major compatibility check. +*/ +#define M2M_HIF_MINOR_VALUE (5) +/*!< Drv/Fw minor compatibility check. +*/ + +#define M2M_HIF_LEVEL ( \ + ((M2M_HIF_MAJOR_VALUE & M2M_HIF_MAJOR_MASK) << M2M_HIF_MAJOR_SHIFT) | \ + ((M2M_HIF_MINOR_VALUE & M2M_HIF_MINOR_MASK) << M2M_HIF_MINOR_SHIFT) \ + ) +/*!< HIF Level (Major/Minor) for Drv/Fw compatibility. +*/ + +/*======*======*======*======* + DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_DRIVER_VERSION_MAJOR_NO (1) +/*!< Driver Major release version number. +*/ +#define M2M_DRIVER_VERSION_MINOR_NO (2) +/*!< Driver Minor release version number. +*/ +#define M2M_DRIVER_VERSION_PATCH_NO (0) +/*!< Driver patch release version number. +*/ + +/**@}*/ // VERSIONDEF + +/**@addtogroup WlanDefines + * @ingroup m2m_wifi + */ +/**@{*/ + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + +#define M2M_MAC_ADDRES_LEN 6 +/*!< The size of the 802 MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< The offset of the Ethernet header within the WLAN Tx Buffer. + */ + + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the Ethernet header in bytes. +*/ + + +#define M2M_MAX_SSID_LEN 33 +/*!< 1 more than the max SSID length. + This matches the size of SSID buffers (max SSID length + 1-byte length field). + */ + + +#define M2M_MAX_PSK_LEN 65 +/*!< 1 more than the WPA PSK length (in ASCII format). + This matches the size of the WPA PSK/Passphrase buffer (max ASCII contents + 1-byte length field). + Alternatively it matches the WPA PSK length (in ASCII format) + 1 byte NULL termination. + */ + +#define M2M_MIN_PSK_LEN 9 +/*!< 1 more than the minimum WPA PSK Passphrase length. + It matches the minimum WPA PSK Passphrase length + 1 byte NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + +#define M2M_NTP_MAX_SERVER_NAME_LENGTH 32 +/*!< Maximum NTP server name length +*/ + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + +#define MAX_HIDDEN_SITES 4 +/*!< + max number of hidden SSID supported by scan request +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< The maximum size of IE (Information Element). +*/ + +#define M2M_CRED_STORE_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be stored in WINC flash. +*/ +#define M2M_CRED_ENCRYPT_FLAG 0x02 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be encrypted when stored in WINC flash. +*/ +#define M2M_CRED_IS_STORED_FLAG 0x10 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are stored in WINC flash. May only be set by WINC firmware. +*/ +#define M2M_CRED_IS_ENCRYPTED_FLAG 0x20 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are encrypted in WINC flash. May only be set by WINC firmware. +*/ + +#define M2M_WIFI_CONN_BSSID_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredCmn to indicate that Wi-Fi connection + must be restricted to an AP with a certain BSSID. +*/ + +#define M2M_AUTH_1X_USER_LEN_MAX 100 +/*!< The maximum length (in ASCII characters) of domain name + username (including '@' or '\') + for authentication with Enterprise methods. +*/ +#define M2M_AUTH_1X_PASSWORD_LEN_MAX 256 +/*!< The maximum length (in ASCII characters) of password for authentication with Enterprise MSCHAPv2 methods. +*/ +#define M2M_AUTH_1X_PRIVATEKEY_LEN_MAX 256 +/*!< The maximum length (in bytes) of private key modulus for authentication with Enterprise TLS methods. + Private key exponent must be the same length as modulus, pre-padded with 0s if necessary. +*/ +#define M2M_AUTH_1X_CERT_LEN_MAX 1584 +/*!< The maximum length (in bytes) of certificate for authentication with Enterprise TLS methods. +*/ + +#define M2M_802_1X_UNENCRYPTED_USERNAME_FLAG 0x80 +/*!< Flag to indicate that the 802.1x user-name should be sent (unencrypted) in the initial EAP + identity response. Intended for use with EAP-TLS only. +*/ +#define M2M_802_1X_PREPEND_DOMAIN_FLAG 0x40 +/*!< Flag to indicate that the 802.1x domain name should be prepended to the user-name: + "Domain\Username". If the flag is not set then domain name is appended to the user-name: + "Username@Domain". (Note that the '@' or '\' must be included in the domain name.) +*/ +#define M2M_802_1X_MSCHAP2_FLAG 0x01 +/*!< Flag to indicate 802.1x MsChapV2 credentials: domain/user-name/password. +*/ +#define M2M_802_1X_TLS_FLAG 0x02 +/*!< Flag to indicate 802.1x TLS credentials: domain/user-name/private-key/certificate. +*/ + +#define M2M_802_1X_TLS_CLIENT_CERTIFICATE 1 +/*!< Info type used in @ref tstrM2mWifiAuthInfoHdr to indicate Enterprise TLS client certificate. +*/ +#define PSK_CALC_LEN 40 +/*!< PSK is 32 bytes generated either: + - from 64 ASCII characters + - by SHA1 operations on up to 63 ASCII characters + 40 byte array is required during SHA1 operations, so we define PSK_CALC_LEN as 40. +*/ + +/********************* + * + * WIFI GROUP requests + */ +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the Host configuration commands opcodes. +*/ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the Station mode host commands opcodes. +*/ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. +*/ +/**@cond P2P_DOC + */ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. +*/ +/**@endcond*/ //P2P_DOC +#define M2M_SERVER_CMD_BASE 100 +/*!< The base value of all the Power Save mode host commands codes. +*/ +#define M2M_GEN_CMD_BASE 105 +/*!< The base value of additional host wifi command opcodes. + * Usage restrictions (eg STA mode only) should always be made clear at the API layer in any case. +*/ +/********************** + * OTA GROUP requests + */ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. + * The OTA messages have their own group so op codes can extended from 1 to M2M_MAX_GRP_NUM_REQ. +*/ + +#define M2M_MAX_GRP_NUM_REQ (127) +/*!< max number of request in one group equal to 127 as the last bit reserved for config or data pkt +*/ + +#define WEP_40_KEY_SIZE ((uint8_t)5) +/*!< The size in bytes of a 40-bit wep key. +*/ +#define WEP_104_KEY_SIZE ((uint8_t)13) +/*!< The size in bytes of a 104-bit wep key. +*/ + +#define WEP_40_KEY_STRING_SIZE ((uint8_t)10) +/*!< The string length of a 40-bit wep key. +*/ +#define WEP_104_KEY_STRING_SIZE ((uint8_t)26) +/*!< The string length of a 104-bit wep key. +*/ + +#define WEP_KEY_MAX_INDEX ((uint8_t)4) +/*!< WEP key index is in the range 1 to 4 inclusive. (This is decremented to + * result in an index in the range 0 to 3 on air.) +*/ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default number of scan slots used by the WINC board. +*/ +#define M2M_SCAN_DEFAULT_SLOT_TIME (20) +/*!< The active scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_PASSIVE_SLOT_TIME (300) +/*!< The passive scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default number of probes per slot. +*/ +#define M2M_FASTCONNECT_DEFAULT_RSSI_THRESH (-45) +/*!< The default threshold RSSI for fast reconnection to an AP. +*/ +#define M2M_SCAN_FAIL ((uint8_t)1) +/*!< Indicates the WINC board has failed to perform the scan operation. +*/ +#define M2M_JOIN_FAIL ((uint8_t)2) +/*!< Indicates the WINC board has failed to join the BSS. +*/ +#define M2M_AUTH_FAIL ((uint8_t)3) +/*!< Indicates the WINC board has failed to authenticate with the AP. +*/ +#define M2M_ASSOC_FAIL ((uint8_t)4) +/*!< Indicates the WINC board has failed to associate with the AP. +*/ + +#define M2M_SCAN_ERR_WIFI ((int8_t)-2) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_IP ((int8_t)-3) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_AP ((int8_t)-4) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_P2P ((int8_t)-5) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_WPS ((int8_t)-6) +/*!< Currently not used. +*/ + +/*======*======*======*======* + MONITORING MODE DEFINITIONS + *======*======*======*======*/ + +#define M2M_WIFI_FRAME_TYPE_ANY 0xFF +/*!< Receive any frame type when configured as Monitor Mode. +*/ +#define M2M_WIFI_FRAME_SUB_TYPE_ANY 0xFF +/*!< Receive frames with any sub type when configured as Monitor Mode. +*/ + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name. +*/ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. +*/ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. +*/ + +/**@}*/ // WLANDefines + +/**@addtogroup OTADEFINE + * @{ + */ + +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value in the control structure for a valid image after ROLLBACK. +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value in the control structure for a invalid image after ROLLBACK. +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header. +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + SHA256 digest size in the OTA image. + The SHA256 digest is set at the beginning of image before the OTA header. +*/ +/**@}*/ // OTADEFINE + +/** +* @addtogroup WlanEnums +*/ +/**@{*/ + +/*! +@enum \ + tenuM2mReqGroup + +@brief +*/ +typedef enum { + M2M_REQ_GROUP_MAIN = 0, + M2M_REQ_GROUP_WIFI, + M2M_REQ_GROUP_IP, + M2M_REQ_GROUP_HIF, + M2M_REQ_GROUP_OTA, + M2M_REQ_GROUP_SSL, + M2M_REQ_GROUP_SIGMA, + M2M_REQ_GROUP_INTERNAL, +} tenuM2mReqGroup; + +/*! +@enum \ + tenuM2mReqpkt + +@brief +*/ +typedef enum { + M2M_REQ_CONFIG_PKT, + M2M_REQ_DATA_PKT = 0x80 /*BIT7*/ +} tenuM2mReqpkt; + +/*! +@enum \ + tenuM2mWepKeyIndex + +@brief + +*/ +typedef enum { + M2M_WIFI_WEP_KEY_INDEX_1 = ((uint8_t) 1), + /*!< Index 1 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_2, + /*!< Index 2 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_3, + /*!< Index 3 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_4, + /*!< Index 4 for WEP key Authentication */ +} tenuM2mWepKeyIndex; + +/*! +@enum \ + tenuM2mDefaultConnErrcode + +@brief + +*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((int8_t)-23), + /*!< Failure response due to another connection being already in progress */ + M2M_DEFAULT_CONN_FAIL, + /*!< Failure to connect to the cached network */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< Failure to find any of the cached networks in the scan results. */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< Failure due to empty network list. */ +} tenuM2mDefaultConnErrcode; + + +/*! +@enum \ + tenuM2mConnChangedErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_SCAN_FAIL = ((uint8_t)1), + /*!< Failure to perform the scan operation. */ + M2M_ERR_JOIN_FAIL, + /*!< Failure to join the BSS. */ + M2M_ERR_AUTH_FAIL, + /*!< Failure to authenticate with the AP. */ + M2M_ERR_ASSOC_FAIL, + /*!< Failure to associate with the AP. */ + M2M_ERR_CONN_INPROGRESS, + /*!< Failure due to another connection being in progress. */ +} tenuM2mConnChangedErrcode; + + +/*! +@enum \ + tenuM2mSetGainsErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_GAIN_TABLE_INVALID = ((int8_t)-10), + /*!< Failure response due to trying to use an invalid table */ + M2M_ERR_READ_GAIN_TABLE, + /*!< Failure to read gains from flash */ +} tenuM2mSetGainsErrcode; + +/*! +@enum \ + tenuM2mPwrMode + +@brief + +*/ +typedef enum { + PWR_AUTO = ((uint8_t) 1), + /*!< Automatic power mode. */ + PWR_LOW1, + /*!< Low power mode #1. RX current 60mA.*/ + PWR_LOW2, + /*!< Low power mode #2, RX current 55mA, sensitivity is less by 3dBm*/ + PWR_HIGH, + /*!< High power mode: RX current 100mA.*/ +} tenuM2mPwrMode; + +/*! +@enum \ + tenuM2mTxPwrLevel + +@brief + +*/ +typedef enum { + TX_PWR_HIGH = ((uint8_t) 1), + /*!< PPA Gain 6dbm PA Gain 18dbm */ + TX_PWR_MED, + /*!< PPA Gain 6dbm PA Gain 12dbm */ + TX_PWR_LOW, + /*!< PPA Gain 6dbm PA Gain 6dbm */ +} tenuM2mTxPwrLevel; + +/*! +@enum \ + tenuM2mConfigCmd + +@brief + This enum contains host commands used to configure the WINC board. + +*/ +typedef enum { + M2M_WIFI_REQ_RESTART = M2M_CONFIG_CMD_BASE, + /*!< Restart the WINC MAC layer, it's doesn't restart the IP layer. */ + M2M_WIFI_REQ_SET_MAC_ADDRESS, + /*!< Set the WINC mac address (not possible for production effused boards). */ + M2M_WIFI_REQ_CURRENT_RSSI, + /*!< Request the current connected AP RSSI. */ + M2M_WIFI_RESP_CURRENT_RSSI, + /*!< Response to M2M_WIFI_REQ_CURRENT_RSSI with the RSSI value. */ + M2M_WIFI_REQ_RESTRICT_BLE, + /*!< Request restrict ble. */ + M2M_WIFI_REQ_UNRESTRICT_BLE, + /*!< Request unrestrict ble. */ + M2M_WIFI_REQ_GET_CONN_INFO, + /*!< Request connection information. */ + M2M_WIFI_RESP_CONN_INFO, + /*!< Response to M2M_WIFI_REQ_GET_CONN_INFO with the connection information. */ + M2M_WIFI_REQ_SET_DEVICE_NAME, + /*!< Request to set WINC device name property. */ + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY, + /*!< Request to start provisioning mode. */ + M2M_WIFI_RESP_PROVISION_INFO, + /*!< Response to the host with the provisioning information.*/ + M2M_WIFI_REQ_STOP_PROVISION_MODE, + /*!< Request to stop provision mode. */ + M2M_WIFI_REQ_SET_SYS_TIME, + /*!< Request to set system time. */ + M2M_WIFI_REQ_ENABLE_SNTP_CLIENT, + /*!< Request to enable the simple network time protocol to get the + time from the Internet. This is required for security purposes. */ + M2M_WIFI_REQ_DISABLE_SNTP_CLIENT, + /*!< Request to disable the simple network time protocol for applications that + do not need it. */ + M2M_WIFI_RESP_MEMORY_RECOVER, + /*!< Reserved for debugging */ + M2M_WIFI_REQ_CUST_INFO_ELEMENT, + /*!< Request to add custom information to the Beacons IE. */ + M2M_WIFI_REQ_SCAN, + /*!< Request scan command. */ + M2M_WIFI_RESP_SCAN_DONE, + /*!< Response to notify scan complete. */ + M2M_WIFI_REQ_SCAN_RESULT, + /*!< Request for scan results. */ + M2M_WIFI_RESP_SCAN_RESULT, + /*!< Response to provide the scan results. */ + M2M_WIFI_REQ_SET_SCAN_OPTION, + /*!< Request to set scan options "slot time, slot number .. etc". */ + M2M_WIFI_REQ_SET_SCAN_REGION, + /*!< Request to set scan region. */ + M2M_WIFI_REQ_SET_POWER_PROFILE, + /*!< Request to set the Power Profile. */ + M2M_WIFI_REQ_SET_TX_POWER, + /*!< Request to set the TX Power. */ + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + /*!< Request to set the Battery Voltage. */ + M2M_WIFI_REQ_SET_ENABLE_LOGS, + /*!< Request to enable logs. */ + M2M_WIFI_REQ_GET_SYS_TIME, + /*!< Request to get system time. */ + M2M_WIFI_RESP_GET_SYS_TIME, + /*!< Response to retrieve the system time. */ + M2M_WIFI_REQ_SEND_ETHERNET_PACKET, + /*!< Request to send Ethernet packet in bypass mode. */ + M2M_WIFI_RESP_ETHERNET_RX_PACKET, + /*!< Response to receive an Ethernet packet in bypass mode. */ + M2M_WIFI_REQ_SET_MAC_MCAST, + /*!< Request to set multicast filters. */ + M2M_WIFI_REQ_BLE_API_SEND, + /*!< Request to send an Encapsulated BLE API MSG */ + M2M_WIFI_RESP_BLE_API_RECV, + /*!< Response to receive an Encapsulated BLE API MSG */ + M2M_WIFI_REQ_SET_GAIN_TABLE, + /*!< Request to use Gain table from Flash */ + M2M_WIFI_RESP_SET_GAIN_TABLE, + /*!< Response to fail to use Gain table from Flash */ + M2M_WIFI_REQ_PASSIVE_SCAN, + /*!< Request a passive scan. */ + M2M_WIFI_REQ_CONFIG_SNTP, + /*!< Configure NTP servers. */ + M2M_WIFI_REQ_START_PROVISION_MODE, + /*!< Request to start provisioning mode. */ + + /* This enum is now 'full' in the sense that (M2M_WIFI_REQ_START_PROVISION_MODE+1) == M2M_STA_CMD_BASE. + * Any new config values should be placed in tenuM2mGenCmd. */ + M2M_WIFI_MAX_CONFIG_ALL +} tenuM2mConfigCmd; + +/*! +@enum \ + tenuM2mStaCmd + +@brief + This enum contains WINC commands while in Station mode. +*/ +typedef enum { + M2M_WIFI_REQ_CONNECT = M2M_STA_CMD_BASE, + /*!< Request to connect with a specified AP. This command is deprecated in favour of @ref M2M_WIFI_REQ_CONN. + */ + M2M_WIFI_REQ_DEFAULT_CONNECT, + /*!< Request to connect with a cached AP. */ + M2M_WIFI_RESP_DEFAULT_CONNECT, + /*!< Response for the default connect.*/ + M2M_WIFI_REQ_DISCONNECT, + /*!< Request to disconnect from the AP. */ + M2M_WIFI_RESP_CON_STATE_CHANGED, + /*!< Response to indicate a change in the connection state. */ + M2M_WIFI_REQ_SLEEP, + /*!< Request to sleep. */ + M2M_WIFI_REQ_WPS_SCAN, + /*!< Request to WPS scan. */ + M2M_WIFI_REQ_WPS, + /*!< Request to start WPS. */ + M2M_WIFI_REQ_START_WPS, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_DISABLE_WPS, + /*!< Request to disable WPS. */ + M2M_WIFI_REQ_DHCP_CONF, + /*!< Response to indicate the obtained IP address.*/ + M2M_WIFI_RESP_IP_CONFIGURED, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_RESP_IP_CONFLICT, + /*!< Response to indicate a conflict in obtained IP address. + The user should re attempt the DHCP request. */ + M2M_WIFI_REQ_ENABLE_MONITORING, + /*!< Request to enable monitor mode. */ + M2M_WIFI_REQ_DISABLE_MONITORING, + /*!< Request to disable monitor mode. */ + M2M_WIFI_RESP_WIFI_RX_PACKET, + /*!< Response to indicate a packet was received in monitor mode. */ + M2M_WIFI_REQ_SEND_WIFI_PACKET, + /*!< Request to send a packet in monitor mode. */ + M2M_WIFI_REQ_LSN_INT, + /*!< Request to set the listen interval. */ + M2M_WIFI_REQ_DOZE, + /*!< Request to doze */ + M2M_WIFI_REQ_GET_PRNG, + /*!< Request PRNG. */ + M2M_WIFI_RESP_GET_PRNG, + /*!< Response for PRNG. */ + M2M_WIFI_REQ_CONN, + /*!< New command to connect with AP. + This replaces M2M_WIFI_REQ_CONNECT. (Firmware continues to handle + M2M_WIFI_REQ_CONNECT for backwards compatibility purposes.) + */ + M2M_WIFI_IND_CONN_PARAM, + /*!< Provide extra information (such as Enterprise client certificate) required for connection. */ + M2M_WIFI_MAX_STA_ALL +} tenuM2mStaCmd; + +/*! +@enum \ + tenuM2mApCmd + +@brief + This enum contains WINC commands while in AP mode. +*/ +typedef enum { + M2M_WIFI_REQ_ENABLE_AP_LEGACY = M2M_AP_CMD_BASE, + /*!< Request to enable AP mode. */ + M2M_WIFI_REQ_DISABLE_AP, + /*!< Request to disable AP mode. */ + M2M_WIFI_REQ_ENABLE_AP, + /*!< Request to enable AP mode. */ + M2M_WIFI_MAX_AP_ALL, +} tenuM2mApCmd; + +/*! +@enum \ + tenuM2mP2pCmd + +@brief + This enum contains WINC commands while in P2P mode. +*/ +typedef enum { + M2M_WIFI_REQ_P2P_INT_CONNECT = M2M_P2P_CMD_BASE, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_ENABLE_P2P, + /*!< Request to enable P2P mode.*/ + M2M_WIFI_REQ_DISABLE_P2P, + /*!< Request to disable P2P mode. */ + M2M_WIFI_REQ_P2P_REPOST, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. + */ + M2M_WIFI_MAX_P2P_ALL, +} tenuM2mP2pCmd; + + +/*! +@enum \ + tenuM2mServerCmd + +@brief + These commands are currently not supported. +*/ +typedef enum { + M2M_WIFI_REQ_CLIENT_CTRL = M2M_SERVER_CMD_BASE, + /*!< Currently not supported.*/ + M2M_WIFI_RESP_CLIENT_INFO, + /*!< Currently not supported.*/ + M2M_WIFI_REQ_SERVER_INIT, + /*!< Currently not supported.*/ + M2M_WIFI_MAX_SERVER_ALL +} tenuM2mServerCmd; + +/*! +@enum \ + tenuM2mGenCmd + +@brief + This enum contains additional WINC commands (overflow of previous enums). +*/ +typedef enum { + M2M_WIFI_REQRSP_DELETE_APID = M2M_GEN_CMD_BASE, + /*!< Request/response to delete security credentials from WINC flash. + (Processing matches @ref tenuM2mConfigCmd.) */ + M2M_WIFI_REQ_ROAMING, + /*!< Request to enable/disable wifi roaming. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_REQ_SCAN_SSID_LIST, + /*!< Request scan with list of hidden SSID plus the broadcast scan. + */ + M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, + /*!< Set Scan option to stop on first result. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_MAX_GEN_ALL +} tenuM2mGenCmd; + + +/*! +@enum \ + tenuM2mIpCmd + +@brief + This enum contains all the WINC commands related to IP. +*/ +typedef enum { + M2M_IP_REQ_STATIC_IP_CONF = ((uint8_t) 10), + /*!< Request to set static IP.*/ + M2M_IP_REQ_ENABLE_DHCP, + /*!< Request to enable DHCP.*/ + M2M_IP_REQ_DISABLE_DHCP + /*!< Request to disable DHCP.*/ +} tenuM2mIpCmd; + +/*! +@enum \ + tenuM2mSockCmd + +@brief + This enum contains all the WINC commands related to Sockets. +*/ +typedef enum { + SOCKET_CMD_BIND = 0x41, + /*!< Socket Binding command value. */ + SOCKET_CMD_LISTEN, + /*!< Socket Listening command value. */ + SOCKET_CMD_ACCEPT, + /*!< Socket Accepting command value. */ + SOCKET_CMD_CONNECT, + /*!< Socket Connecting command value. */ + SOCKET_CMD_SEND, + /*!< Socket send command value. */ + SOCKET_CMD_RECV, + /*!< Socket Receive command value. */ + SOCKET_CMD_SENDTO, + /*!< Socket sendTo command value. */ + SOCKET_CMD_RECVFROM, + /*!< Socket ReceiveFrom command value. */ + SOCKET_CMD_CLOSE, + /*!< Socket Close command value. */ + SOCKET_CMD_DNS_RESOLVE, + /*!< Socket DNS Resolve command value. */ + SOCKET_CMD_SSL_CONNECT, + /*!< SSL-Socket Connect command value. */ + SOCKET_CMD_SSL_SEND, + /*!< SSL-Socket Send command value. */ + SOCKET_CMD_SSL_RECV, + /*!< SSL-Socket Receive command value. */ + SOCKET_CMD_SSL_CLOSE, + /*!< SSL-Socket Close command value. */ + SOCKET_CMD_SET_SOCKET_OPTION, + /*!< Set Socket Option command value. */ + SOCKET_CMD_SSL_CREATE, + SOCKET_CMD_SSL_SET_SOCK_OPT, + SOCKET_CMD_PING, + SOCKET_CMD_SSL_CONNECT_ALPN, + /*!< SSL-Socket Connect with ALPN command value. */ + SOCKET_CMD_RAW_SET_SOCK_OPT, + SOCKET_CMD_SECURE + /*!< Make secure a previously opened socket. */ +} tenuM2mSockCmd; + +/*! +@enum \ + tenuM2mSigmaCmd + +@brief + This enum contains all the WINC commands related to Sigma. +*/ +typedef enum { + M2M_SIGMA_ENABLE = ((uint8_t) 3), + /*!< Enable Sigma.*/ + M2M_SIGMA_TA_START, + /*!< Start the traffic agent.*/ + M2M_SIGMA_TA_STATS, + /*!< Get traffic statistics.*/ + M2M_SIGMA_TA_RECEIVE_STOP, + /*!< Stop receiving from the traffic agent.*/ + M2M_SIGMA_ICMP_ARP, + /*!< Send ARP.*/ + M2M_SIGMA_ICMP_RX, + /*!< Receive ICMP.*/ + M2M_SIGMA_ICMP_TX, + /*!< Transmit ICMP.*/ + M2M_SIGMA_UDP_TX, + /*!< Transmit UDP.*/ + M2M_SIGMA_UDP_TX_DEFER, + /*!< Transmit UDP defer.*/ + M2M_SIGMA_SECURITY_POLICY, + /*!< Set security policy.*/ + M2M_SIGMA_SET_SYSTIME + /*!< Set system time.*/ +} tenuM2mSigmaCmd; + +/*! +@enum \ + tenuM2mConnState + +@brief + This enum contains all the Wi-Fi connection states. +*/ +typedef enum { + M2M_WIFI_DISCONNECTED = 0, + /*!< Wi-Fi state is disconnected. */ + M2M_WIFI_CONNECTED, + /*!< Wi-Fi state is connected. */ + M2M_WIFI_ROAMED, + /*!< Wi-Fi state is roamed to new AP. */ + M2M_WIFI_UNDEF = 0xff + /*!< Undefined Wi-Fi State. */ +} tenuM2mConnState; + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi security types. +*/ +typedef enum { + M2M_WIFI_SEC_INVALID = 0, + /*!< Invalid security type. */ + M2M_WIFI_SEC_OPEN, + /*!< Wi-Fi network is not secured. */ + M2M_WIFI_SEC_WPA_PSK, + /*!< Wi-Fi network is secured with WPA/WPA2 personal(PSK). */ + M2M_WIFI_SEC_WEP, + /*!< Security type WEP (40 or 104) OPEN OR SHARED. */ + M2M_WIFI_SEC_802_1X, + /*!< Wi-Fi network is secured with WPA/WPA2 Enterprise.IEEE802.1x. */ + M2M_WIFI_NUM_AUTH_TYPES + /*!< Upper limit for enum value. */ +} tenuM2mSecType; + + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi SSID types. +*/ +typedef enum { + SSID_MODE_VISIBLE = 0, + /*!< SSID is visible to others. */ + SSID_MODE_HIDDEN + /*!< SSID is hidden. */ +} tenuM2mSsidMode; + +/*! +@enum \ + tenuM2mScanCh + +@brief + This enum contains all the Wi-Fi RF channels. +*/ +typedef enum { + M2M_WIFI_CH_1 = ((uint8_t) 1), + /*!< Channel 1. */ + M2M_WIFI_CH_2, + /*!< Channel 2. */ + M2M_WIFI_CH_3, + /*!< Channel 3. */ + M2M_WIFI_CH_4, + /*!< Channel 4. */ + M2M_WIFI_CH_5, + /*!< Channel 5. */ + M2M_WIFI_CH_6, + /*!< Channel 6. */ + M2M_WIFI_CH_7, + /*!< Channel 7. */ + M2M_WIFI_CH_8, + /*!< Channel 8. */ + M2M_WIFI_CH_9, + /*!< Channel 9. */ + M2M_WIFI_CH_10, + /*!< Channel 10. */ + M2M_WIFI_CH_11, + /*!< Channel 11. */ + M2M_WIFI_CH_12, + /*!< Channel 12. */ + M2M_WIFI_CH_13, + /*!< Channel 13. */ + M2M_WIFI_CH_14, + /*!< Channel 14. */ + M2M_WIFI_CH_ALL = ((uint8_t) 255) +} tenuM2mScanCh; + +/*! +@enum \ + tenuM2mScanRegion + +@brief + This enum contains all the Wi-Fi channel regions. +*/ +typedef enum { + REG_CH_1 = ((uint16_t) 1 << 0), + /*!< Region channel 1. */ + REG_CH_2 = ((uint16_t) 1 << 1), + /*!< Region channel 2. */ + REG_CH_3 = ((uint16_t) 1 << 2), + /*!< Region channel 3. */ + REG_CH_4 = ((uint16_t) 1 << 3), + /*!< Region channel 4. */ + REG_CH_5 = ((uint16_t) 1 << 4), + /*!< Region channel 5. */ + REG_CH_6 = ((uint16_t) 1 << 5), + /*!< Region channel 6. */ + REG_CH_7 = ((uint16_t) 1 << 6), + /*!< Region channel 7. */ + REG_CH_8 = ((uint16_t) 1 << 7), + /*!< Region channel 8. */ + REG_CH_9 = ((uint16_t) 1 << 8), + /*!< Region channel 9. */ + REG_CH_10 = ((uint16_t) 1 << 9), + /*!< Region channel 10. */ + REG_CH_11 = ((uint16_t) 1 << 10), + /*!< Region channel 11. */ + REG_CH_12 = ((uint16_t) 1 << 11), + /*!< Region channel 12. */ + REG_CH_13 = ((uint16_t) 1 << 12), + /*!< Region channel 13. */ + REG_CH_14 = ((uint16_t) 1 << 13), + /*!< Region channel 14. */ + REG_CH_ALL = ((uint16_t) 0x3FFF), + /*!< Region for all channels. */ + NORTH_AMERICA = ((uint16_t) 0x7FF), + /*!< North America region with 11 channels*/ + EUROPE = ((uint16_t) 0x1FFF), + /*!u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +@brief + Asynchronous API for control of Wi-Fi provisioning functionality with extended options. + +@details + This function allows the application to start the WINC in 'provisioning mode', a special mode + that triggers the WINC to create a Wi-Fi access point, DHCP server, and HTTP server. + + The HTTP server presents a provisioning page to a connected client which lists the access points + detected in the vicinity of the WINC, and allows one of these to be selected and any appropriate + credentials to be entered. This allows a headless system to be provisioned (configured to + connect with an access point). + + Provisioning status is returned in an event @ref M2M_WIFI_RESP_PROVISION_INFO. + +@param[in] pstrAPModeConfig + AP configuration parameters as defined in @ref tstrM2MAPModeConfig configuration structure. + A NULL value passed in, will result in a negative error @ref M2M_ERR_FAIL. + +@param[in] pcHttpServerDomainName + Domain name of the HTTP Provision WEB server which others will use to load the provisioning Home page. + The domain name can have one of the following 3 forms: + - 1. "wincprov.com" + - 2. "http://wincprov.com" + - 3. "https://wincprov.com" + + The forms 1 and 2 are equivalent, they both will start a plain http server, while form 3 + will start a secure HTTP provisioning Session (HTTP over SSL connection). + +@param[in] bEnableHttpRedirect + A flag to enable/disable the HTTP redirect feature. If Secure provisioning is enabled (i.e. the server + domain name uses "https" prefix) this flag is ignored (no meaning for redirect in HTTPS). + Possible values are: + - Zero: DO NOT use HTTP Redirect. In this case the associated device could open the + provisioning page ONLY when the HTTP Provision URL of the WINC HTTP Server is + correctly written on the browser. + - Non-Zero: Use HTTP Redirect. In this case, all http traffic (http://URL) from the + associated device (Phone, PC, ...etc) will be redirected to the WINC HTTP + Provisioning Home page. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. + Registering the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + +@warning + Do not use ".local" in the pcHttpServerDomainName. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_PROVISION_INFO + m2m_wifi_stop_provision_mode + tstrM2MAPModeConfig + +@section WIFIExample12 Example + The example demonstrates a code snippet for how provisioning is triggered and the response event + received accordingly. + +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo*)pvMsg; + if(pstrProvInfo->u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apModeConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + m2m_wifi_start_provision_mode_ext(&apModeConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_stop_provision_mode(void); + +@brief + Synchronous API for terminating provisioning mode on the WINC. + +@details + This function will terminate any currently active provisioning mode on the WINC, returning the WINC to idle. + +@pre + An active provisioning session must be active before it is terminated through this function. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_start_provision_mode +*/ +int8_t m2m_wifi_stop_provision_mode(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_get_connection_info(void); + +@brief + Asynchronous API for retrieving the WINC connection status. + +@details + Requests the connection status from the WINC including information regarding any access + point to which it is currently connected, or any non-AP station that is connected to the WINC. + All information will be returned to the application via the Wi-Fi notification callback through + the event @ref M2M_WIFI_RESP_CONN_INFO. + + The connection info can be retrieved using the structure @ref tstrM2MConnInfo which contains: + - Connection Security + - Connection RSSI + - Remote MAC address + - Remote IP address + - SSID of the network (in cases where the WINC is in non-AP mode) + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the initialization + @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the + requested connection info. + +@warning + - In case the WINC is operating in AP mode or P2P mode, the SSID field will be returned as a NULL string. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +@section WIFIExample2 Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_get_connection_info(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +@brief + Asynchronous API for assigning a MAC address to the WINC. + +@details + This function is intended to allow non-production software to assign a MAC address to the WINC. + +@warning + This function is intended for development use only and not for use in production software. + +@param[in] au8MacAddress + MAC Address to be provisioned to the WINC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps(uint8_t u8TriggerType,const char * pcPinNumber); + +@brief + Asynchronous API to engage the WINC Wi-Fi Protected Setup (enrollee) function. + +@details + This function can be called to make the WINC enter WPS (Wi-Fi Protected Setup) mode. The result + is passed to the Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + +@param[in] u8TriggerType + WPS Trigger method. This may be: + - @ref WPS_PIN_TRIGGER Push button method + - @ref WPS_PBC_TRIGGER Pin method + +@param[in] pcPinNumber + Valid only if the u8TriggerType is @ref WPS_PIN_TRIGGER, this parameter contains the PIN number. + The number must follow the format as given in the WSC1.0 specification. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_WPS must be handled in the callback to receive the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be performed. + - The @ref m2m_wifi_handle_events MUST be called periodically to receive + the responses in the callback. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +@section WIFIExample3 Example + The code snippet shows an example of how wi-fi WPS is triggered . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + // establish Wi-Fi connection + tstrNetworkId strNetworkId = {NULL, pstrWPS->au8SSID, (uint8_t)strlen((char*)(pstrWPS->au8SSID)), pstrWPS->u8Ch}; + if(pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN) + { + m2m_wifi_connect_open(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId); + } + else + { + tstrAuthPsk strAuthPsk = {NULL, pstrWPS->au8PSK, (uint8_t)strlen((char*)(pstrWPS->au8PSK))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + } + + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps_disable(void); + +@brief + Asynchronous API that disables Wi-Fi Protected Setup mode in the WINC. + +@pre + WINC should be already in WPS mode using @ref m2m_wifi_wps. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_wps +*/ +int8_t m2m_wifi_wps_disable(void); + +/**@cond P2P_DOC + */ +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p(uint8_t u8Channel); + +@brief + Asynchronous API for enabling Wi-Fi Direct (P2P) mode in the WINC. + +@param[in] u8Channel + P2P Listen RF channel. According to the P2P standard, it must hold only one of the following values 1, 6 or 11. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + - This function is not available in the WINC 3400 + - This function is not allowed in AP or STA modes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +@section WIFIExample4 Example + The code snippet shows an example of how the p2p mode operates. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? "CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("P2P IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_p2p(uint8_t u8Channel); + +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p_disconnect(void); + +@brief + Synchronous API to disable Wi-Fi Direct (P2P) Mode on the WINC. + +@pre + The p2p mode must be enabled and active before a disconnect can be called. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_p2p +*/ +int8_t m2m_wifi_p2p_disconnect(void); +/**@endcond*/ //P2P_DOC + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig* pstrM2MAPConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +@section WIFIExample5 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC with extended options. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPModeConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPModeConfig + +@section WIFIExample13 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + + strcpy(apModeConfig.strApConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + // Trigger AP + m2m_wifi_enable_ap_ext(&apModeConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_disable_ap(void); + +@brief + Synchronous API to disable access point mode on the WINC. + +@details + Must be called only when the AP is enabled through the @ref m2m_wifi_enable_ap + function. Otherwise the call to this function will not be useful. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_ap +*/ +int8_t m2m_wifi_disable_ap(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@brief + Asynchronous API to manually assign a (static) IP address to the WINC. + +@details + Assigns a static IP address to the WINC. + Typically an infrastructure access point will be able to provide an IP address to all clients + after they associate. The WINC will request configuration via DHCP automatically after + successfully connecting to an access point. + This function should only be called in the event that the network has no DHCP server or in case the application + wants to assign a predefined known IP address and the application. + This function can be used to assign a static IP address in case the application knows the specifics of the network. + The user must keep in mind that assigning a static IP address might + result in an IP address conflict. In case of an IP address conflict observed + by the WINC the user will get a response of @ref M2M_WIFI_RESP_IP_CONFLICT + in the wifi callback. The application is then responsible to either solve the + conflict or assign another IP address. + +@pre + The application must first call @ref m2m_wifi_enable_dhcp to request that DHCP functionality is + disabled prior to calling this function. + +@warning + Exercise caution using this function. + DHCP is the preferred method for configuring IP addresses. + +@param[in] pstrStaticIPConf + Pointer to a structure holding the static IP configuration (IP, Gateway, subnet mask and DNS address). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MIPConfig +*/ +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_client(void); + +@brief + Legacy (deprecated) Asynchronous API for starting a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@warning + This function has been deprecated. DHCP is used automatically when the WINC connects. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_client(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_server(uint8_t* addr); + +@brief + Legacy (deprecated) asynchronous function to start a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@param[in] addr + The address to issue to a connected client (only one client is supported) + +@warning + This function is legacy and exists only for compatibility with older applications. + DHCP server is started automatically when enabling the AP mode. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_server(uint8_t *addr); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +@brief + Asynchronous function to control the DHCP client functionality within the WINC. + +@details + This function allows the application to control the behaviour of the DHCP client function within + the WINC once it has associated with an access point. DHCP client functionality is enabled by + default. + +@param[in] u8DhcpEn + The state of the DHCP client feature after successful association with an access point: + - 1: Enables DHCP client after connection. + - 0: Disables DHCP client after connection. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + DHCP client is enabled by default. + This Function should be called to disable DHCP client operation before using @ref m2m_wifi_set_static_ip. + +@see + m2m_wifi_set_static_ip +*/ +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption); + +@brief + Synchronous API for configuring the behaviour of the WINC network scanning functions. + +@details + This function allows the application to tune the scanning behaviour of the WINC using the + parameters described in @ref tstrM2MScanOption. + +@param[in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption +*/ +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +@brief + Synchronous API for enabling/disabling the stop scan on first result of the WINC IC's network scanning functions. + +@details + Allows for enabling/disabling of stop scan on first result. When enabled, the WINC will stop the scan as soon as + it detects a network and return the results to the host. Setting is persistent and will need to be explicitly + reverted back by the application if it no longer wishes for it to be enabled. + +@param[in] u8StopScanOption; + Setting for enabling or disabling Stopping Scan on first result. + 1 = Enabled, 0 = Disabled (Default) + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + tstrM2MScanOption + tstrM2MStopScanOption + m2m_wifi_request_scan + m2m_wifi_set_scan_options +*/ +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +@brief + Synchronous API for configuring the regulatory restrictions that may affect the WINC scanning behaviour. + +@details + This function sets a property called the scan region, a parameter that affects the range of + channels that the WINC may legally scan given a geographic region. + + For 2.4GHz, supported in the current release, the requested scan region cannot exceed the + maximum number of channels (14). + +@param[in] ScanRegion + @ref ASIA + @ref EUROPE + @ref NORTH_AMERICA + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanRegion + m2m_wifi_request_scan +*/ +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan(uint8_t ch); + +@brief + Asynchronous API to request the WINC to scan for networks. + +@details + Scan statuses are delivered to the application via the Wi-Fi event callback (@ref tpfAppWifiCb) in + three stages. The first step involves the event @ref M2M_WIFI_RESP_SCAN_DONE which, if successful, + provides the number of detected networks (access points). The application must then read the list + of access points via multiple calls to the asynchronous @ref m2m_wifi_req_scan_result API. For + each call to this function, the application will receive (step three) the event + @ref M2M_WIFI_RESP_SCAN_RESULT. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registration of the callback is done via @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in + the (@ref tpfAppWifiCb) callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the + callback. + +@warning + This API is valid only for STA mode, it may be called regardless of connection state (connected or disconnected states). + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@section WIFIExample6 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult = (tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +@brief + Similar to @ref m2m_wifi_request_scan but performs passive scanning instead of active scanning. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2MScanOption + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_request_scan + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8SsidList); + +@brief + Asynchronous wi-fi scan request on the given channel and the hidden scan list. + +@details + The scan status is delivered in the wi-fi event callback and then the application + is to read the scan results sequentially. + The number of APs found (N) is returned in event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found + APs. + The application could read the list of APs by calling the function @ref m2m_wifi_req_scan_result N times. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + +@param[in] u8SsidList + u8SsidList is a buffer containing a list of hidden SSIDs to + include during the scan. The first byte in the buffer, u8SsidList[0], + is the number of SSIDs encoded in the string. The number of hidden SSIDs + cannot exceed @ref MAX_HIDDEN_SITES. All SSIDs are concatenated in the following + bytes and each SSID is prefixed with a one-byte header containing its length. + The total number of bytes in u8SsidList buffer, including length byte, cannot + exceed 133 bytes (MAX_HIDDEN_SITES SSIDs x 32 bytes each, which is max SSID length). + For instance, encoding the two hidden SSIDs "DEMO_AP" and "TEST" + results in the following buffer content: + +@code + uint8_t u8SsidList[14]; + u8SsidList[0] = 2; // Number of SSIDs is 2 + u8SsidList[1] = 7; // Length of the string "DEMO_AP" without NULL termination + memcpy(&u8SsidList[2], "DEMO_AP", 7); // Bytes index 2-9 containing the string DEMO_AP + u8SsidList[9] = 4; // Length of the string "TEST" without NULL termination + memcpy(&u8SsidList[10], "TEST", 4); // Bytes index 10-13 containing the string TEST +@endcode + +@note + It works with STA/AP mode (connected or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +\section WIFIExample6b Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +static void request_scan_hidden_demo_ap(void); + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + request_scan_hidden_demo_ap(); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +static void request_scan_hidden_demo_ap(void) +{ + uint8_t list[9]; + char ssid[] = "DEMO_AP"; + uint8 len = (uint8_t)(sizeof(ssid)-1); + + list[0] = 1; + list[1] = len; + memcpy(&list[2], ssid, len); // copy 7 bytes + // Scan all channels + m2m_wifi_request_scan_ssid_list(M2M_WIFI_CH_ALL, list); +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + request_scan_hidden_demo_ap(); + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist); + +/*! +@ingroup WLANSCAN +@fn \ + uint8_t m2m_wifi_get_num_ap_found(void); + +@brief + Synchronous function to retrieve the number of AP's found during the last scan operation. + +@details + This function allows the application to recover the number of access points discovered during + the most recent scan activity. This is achieved via a global variable in the WINC driver that + is populated when receiving the @ref M2M_WIFI_RESP_SCAN_DONE event. + Function to be used in STA mode only. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + +@pre + m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_RESP_SCAN_DONE must be handled in the callback to receive the requested scan information. + +@warning + This function must be called only in the wi-fi callback function when the events + @ref M2M_WIFI_RESP_SCAN_DONE or @ref M2M_WIFI_RESP_SCAN_RESULT are received. + Calling this function in any other place will result in undefined/outdated numbers. + +@return + Returns the number of AP's found in the last Scan Request. + +@section WIFIExample7 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +uint8_t m2m_wifi_get_num_ap_found(void); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_req_scan_result(uint8_t index); + +@brief + Asynchronous API to request the information of an access point discovered via scanning. + +@details + This function allows the information of any discovered access point to be retrieved. When a + scan is completed, the application is informed of the number of networks (access points) + discovered. Calling this function with an index, N, will return the information for the Nth + access point. The information will be returned to the application via a + @ref M2M_WIFI_RESP_SCAN_RESULT event, and the response data may be obtained through casting + the pointer (pvMsg) to @ref tstrM2mWifiscanResult. + +@param[in] index + Index for the requested result, the index range start from 0 till number of AP's found. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre + - @ref m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + in order to receive scan data after calling this function. Registration of the callback + is done via the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the + requested scan information. + +@warning + - This API is valid only for STA mode, it may be called regardless of the connection state (connected or disconnected). + - Calling this function without first issuing a scan request may lead to stale data being recovered. + - Application code should refrain from introducing significant delays between issuing the scan + request and scan result requests. + +@section WIFIExample8 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and + the handling of the events received in the response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_scan_result(uint8_t index); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_req_curr_rssi(void); + +@brief + Asynchronous API to request the current Receive Signal Strength (RSSI) of the current connection. + +@details + This function will result in the application receiving the RSSI via a + @ref M2M_WIFI_RESP_CURRENT_RSSI event. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done through passing it to @ref m2m_wifi_init + via the @ref tstrWifiInitParam initialization structure. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback to receive the requested Rssi information. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@section WIFIExample9 Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of the event received in the callback. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + int8_t *rssi = (int8_t*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_curr_rssi(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +@brief + Synchronous API to query the MAC address programmed into the WINC OTP memory. + +@details + This function attempts to read the device's MAC address from the One Time Programmable (OTP) + memory on the WINC. The presence (yes or no) of a MAC address in the OTP memory and, in the case + of it being present, its value is returned via RAM pointed to by the input arguments. + + Request the MAC address stored on the One Time Programmable(OTP) memory of the device. + The function is blocking until the response is received. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Output MAC address buffer 6 bytes in size. Valid only if *pu8Valid=1. + +@param[out] pu8IsValid + A boolean value set by the callee to indicate the validity of pu8MacAddr in OTP. If no MAC has + been programmed in the OTP the value of this parameter will be zero; otherwise it will be non-zero. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_get_mac_address +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) + +@brief + Synchronous API to retrieve the MAC address currently in use by the device. + +@details + This function obtains the MAC address that is currently in use by the device. If the function + returns with @ref M2M_SUCCESS then the content of the memory referenced by pu8MacAddr will be + populated with the 6 byte MAC address; otherwise, that memory will be left unchanged. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Pointer to a buffer in memory containing a 6-byte MAC address (provided function returns @ref M2M_SUCCESS). + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + m2m_wifi_get_otp_mac_address +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +@brief + Synchronous API to set the power-save mode of the WINC. + +@details + This is one of the two synchronous power-save setting functions that allow the host MCU application + to tweak the system power consumption. Such tweaking can be done through one of two ways: + - 1) Changing the power save mode, to one of the allowed power save modes (see @ref tenuPowerSaveModes). This is done by setting the first parameter. + - 2) Configuring DTIM monitoring: Configuring beacon monitoring parameters by enabling or disabling the reception of broadcast/multicast data. + This is done by setting the second parameter. + +@param[in] PsTyp + Desired power saving mode. Supported types are enumerated in @ref tenuPowerSaveModes. + +@param[in] BcastEn + Broadcast reception enable flag. + If set to 1, the WINC will wake for each DTIM beacon to ensure broadcast traffic can be received. + If set to 0, the WINC will not wakeup at the DTIM beacon, ignoring broadcast traffic, instead it will + wake every N beacon periods, as per the negotiated Listen Interval. + +@warning + The function called once after initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + tenuPowerSaveModes + m2m_wifi_get_sleep_mode + m2m_wifi_set_lsn_int +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +@brief + Asynchronous API to place the WINC into sleep mode for a specified period of time. + +@details + Power-save sleep request function, which requests the WINC device to sleep in the currently configured + power save mode, as set using @ref m2m_wifi_set_sleep_mode, for a specific time as defined by the parameter + u32SlpReqTime (measured in milliseconds). + This function should be used when the WINC is running in @ref M2M_PS_MANUAL power save mode only. + A wake up request is automatically performed by the WINC device when any host driver API function, e.g. Wi-Fi or socket operation is called. + +@param[in] u32SlpReqTime + Request sleep time in ms.\n + The best recommended sleep duration is left to be determined by the application. + Taking into account that if the application sends notifications very rarely, + sleeping for a long time can be a power-efficient decision. + In contrast, applications that are sensitive for long periods of absence can experience + performance degradation in the connection if long sleeping times are used. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + - This API is currently unsupported on the WINC3400 + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +/*! +@ingroup WLANPS +@fn \ + uint8_t m2m_wifi_get_sleep_mode(void); + +@brief + Synchronous API to retrieve the current power save mode of the WINC. + +@return + The current operating power saving mode. The value will be one of those from the enumerated type @ref tenuPowerSaveModes. + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +@brief + Asynchronous API to set the Wi-Fi Direct "Device Name" of the WINC. + +@details + Sets the WINC device name. The name string is used as a device name in DHCP + hostname (option 12). + If a device is not set through this function a default name is assigned. + The default name is WINC-XX-YY, where XX and YY are the last 2 octets of the OTP + MAC address. If OTP (eFuse) is programmed, then the default name is WINC-00-00. + +@warning + The function called once after initialization.\n + Used for DHCP client hostname option (12).\n + Device name shall contain only characters allowed in valid internet host name as + defined in RFC 952 and 1123. + +@param[in] pu8DeviceName + Buffer holding the device name. Device name is a null terminated C string. + +@param[in] u8DeviceNameLength + Length of the device name. Should not exceed the maximum device name's + length @ref M2M_DEVICE_NAME_MAX (including null character). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +@brief + Configures what NTP server the SNTP client should use. + +@details + Configures what NTP server the SNTP client should use. Only 1 server name can be provided, if the configured server name begins with an asterisk then it will be treated as a server pool. + The SNTP client can also use the NTP server provided by the DHCP server through option 42. + By default the NTP server provided by DHCP will be tried first, then the built-in default NTP server (time.nist.gov) will be used. + +@param[in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). + +@param[in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH. + +@param[in] useDHCP + Explicity tell the WINC if it should use the NTP server provided by the DHCP server or not. + +@warning + SNTP should be configured before the connection takes place. If SNTP is configured after the device connects to a + network, the new configuration can take a minimum of 24h to be applied. However, it can take even longer since it is + triggered by DHCP renewal. + Currently there is also a known issue in which if the WINC obtains the NTP server from DHCP and then connects to a + different network, it will still use the NTP from the previous network. + Configuring a server name will overwrite the built-in default server until next reboot. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@brief + Asynchronous API to set Wi-Fi listen interval for power save operation. + +@details + This is one of the two synchronous power-save setting functions that + allow the host MCU application to tweak the system power consumption. Such tweaking can be done by modifying the + Wi-Fi listen interval. The listen interval is how many beacon periods the station can sleep before it wakes up to receive data buffered in the AP. + It is represented in units of AP beacon periods(100ms). + +@warning + The function should be called once after initialization. + +@param[in] pstrM2mLsnInt + Structure holding the listen interval configuration. + +@pre + The function @ref m2m_wifi_set_sleep_mode shall be called first, to set the power saving mode required. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mLsnInt + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); + +/**@cond MON_DOC + */ +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8_t *, uint16_t , uint16_t); + +@brief + Asynchronous call to enable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Wi-Fi monitoring mode (Promiscuous mode) enabling function. + This function enables the monitoring mode, thus allowing two operations to be + performed: + 1) Transmission of manually configured frames, through using the + @ref m2m_wifi_send_wlan_pkt function. + 2) Reception of frames based on a defined filtering criteria. + + Enabling monitoring mode allows for reception of all frames that satisfy the filter criteria in the input parameter and are received on the current wireless channel. + All packets that meet the filtering criteria are passed to the application layer, to + be handled by the assigned monitoring callback function. + The monitoring callback function must be implemented before starting the monitoring mode, + in-order to handle the packets received. + + A dedicated callback function, @ref tpfAppMonCb, must be registered to handle frames received in + promiscuous mode. This is done via an instance of a @ref tstrWifiInitParam structure and a call to + the @ref m2m_wifi_init function. + +@param[in] pstrMtrCtrl + Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the filtering parameters. + +@param[in] pu8PayloadBuffer + Pointer to a Buffer allocated by the application. The buffer SHALL hold the Data field of + the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + be discarded by the monitoring driver. + +@param[in] u16BufferSize + The total size of the pu8PayloadBuffer in bytes. + +@param[in] u16DataOffset + Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + in reading specific information from the received packet. It must assign the offset to the starting + position of it relative to the DATA payload start.\n + \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ + \e packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + +@warning + This mode is available as sniffer ONLY, the WINC cannot be connected in any modes (Station, Access Point or P2P). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MWifiMonitorModeCtrl + tstrM2MWifiRxPacketInfo + tstrWifiInitParam + tenuM2mScanCh + m2m_wifi_disable_monitoring_mode + m2m_wifi_send_wlan_pkt + m2m_wifi_send_ethernet_pkt + +@section WIFIExample10 Example + The example demonstrates the main function where-by the monitoring enable function is called after + the initialization of the driver and the packets are handled in the callback function. + +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +//Declare receive buffer +uint8_t gmgmt[1600]; + +//Callback functions +void wifi_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + ; +} + +void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8_t *pu8Payload, uint16_t u16PayloadSize) +{ + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } +} + +int main() +{ + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; +} +@endcode +*/ +int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8_t *pu8PayloadBuffer, + uint16_t u16BufferSize, uint16_t u16DataOffset); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_disable_monitoring_mode(void); + +@brief + Asynchronous API to disable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Disable Wi-Fi monitoring mode (Promiscuous mode). Expected to be called if the monitoring mode is already enabled, + but if it was called without enabling it, no negative impact will reside. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + */ +int8_t m2m_wifi_disable_monitoring_mode(void); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_send_wlan_pkt(uint8_t *, uint16_t, uint16_t); + +@brief + Asynchronous API to queue a raw Wi-Fi packet for transmission by the WINC. + +@pre + Enable Monitoring mode first using @ref m2m_wifi_enable_monitoring_mode + +@note + The application is responsible for the packets. + +@warning + This function is only useful when operating in monitoring mode. + +@param[in] pu8WlanPacket + Pointer to a buffer holding the whole WIFI frame. + +@param[in] u16WlanHeaderLength + The size of the WIFI packet header ONLY. + +@param[in] u16WlanPktSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + m2m_wifi_disable_monitoring_mode +*/ +int8_t m2m_wifi_send_wlan_pkt(uint8_t *pu8WlanPacket, uint16_t u16WlanHeaderLength, uint16_t u16WlanPktSize); +/**@endcond*/ //MON_DOC + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_send_ethernet_pkt(uint8_t* pu8Packet,uint16_t u16PacketSize); + +@brief + Asynchronous API to queue an Ethernet packet for transmission by the WINC. + +@details + Transmit a packet directly in ETHERNET/bypass mode where the TCP/IP stack is disabled + and the implementation of this packet is left to the application developer. + The Ethernet packet composition is left to the application developer. + +@note + Packets are the user's responsibility. + +@warning + This function available in ETHERNET/Bypass mode ONLY. Make sure that application defines ETH_MODE. + +@param[in] pu8Packet + Pointer to a buffer holding the whole Ethernet frame. + +@param[in] u16PacketSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_set_receive_buffer +*/ +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_enable_sntp(uint8_t); + +@brief + Asynchronous API to enable or disable the native Simple Network Time Protocol(SNTP) client running on the WINC. + +@details + The SNTP client is enabled by default during chip initialization. This function can be used to + disable or subsequently re-enable the service. + + The service is capable of synchronizing the WINC system clock to the UTC time from a well-known + (and trusted) time server, for example "time.nist.gov". By default the SNTP client will update the + system time once every 24 hours. The ability to track the time accurately is important for various + applications such as checking expiry of X509 certificates during TLS (Transport Layer Security) + session establishment. + + It is highly recommended to leave SNTP enabled if there is no alternative source of timing + information. For systems including an RTC device, SNTP may not be needed and the WINC's time + may be set using the @ref m2m_wifi_set_system_time function. + +@param[in] bEnable + Enables or disables the SNTP service + '0' :disable SNTP + '1' :enable SNTP + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_system_time + */ +int8_t m2m_wifi_enable_sntp(uint8_t bEnable); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_set_system_time(uint32_t); + +@brief + Asynchronous function for setting the system time within the WINC. + +@details + Function for setting the system time in time/date format (@ref uint32_t). + The @ref tstrSystemTime structure can be used as a reference to the time values that + should be set and pass its value as @ref uint32_t. + +@param[in] u32UTCSeconds + Seconds elapsed since January 1, 1900 (NTP Timestamp). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + +@note + If there is an RTC on the host MCU, the SNTP may be disabled and the host may set the system + time within the firmware using the API @ref m2m_wifi_set_system_time. + */ +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_get_system_time(void); + +@brief + Asynchronous API to obtain the system time in use by the WINC. + +@details + This function will request the WINC to report its current system time to the application. The + information will arrive at the application via the @ref tpfAppWifiCb and event @ref M2M_WIFI_RESP_GET_SYS_TIME. + Response time retrieved is parsed into the members defined in the structure @ref tstrSystemTime. + +@note + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. + - The event @ref M2M_WIFI_RESP_GET_SYS_TIME must be handled in the callback. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + */ +int8_t m2m_wifi_get_system_time(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_cust_InfoElement(uint8_t*); + +@brief + Asynchronous API to add or remove a user-defined Information Element. + +@details + This function allows the application to provide a custom Information Element to the + WINC that will be included in all beacon and probe response frames, while in Access Point mode. + If it is required to delete these IEs, fill the buffer with zeros. + +@param[in] pau8M2mCustInfoElement + Pointer to Buffer containing the IE to be used. It is the application developer's + responsibility to ensure on the correctness of the information element's ordering + passed in. + If the pointer is null, this removes any current custom IE. If non-null, the pointer + must reference data in the following format: + +@verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- + | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- --------|-----------|---------------------| + | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- +@endverbatim + +@warning + Size of All elements combined must not exceed 255 byte. + Used in Access Point Mode. + +@note + IEs Format will follow the above format. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + +@section WIFIExample11 Example + The example demonstrates how the information elements are set using this function. +@code +char elementData[21]; +static char state = 0; // To Add, Append, and Delete +if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; +} else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; +} else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; +} +m2m_wifi_set_cust_InfoElement(elementData); +@endcode + */ +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +@brief + Change the power profile mode. + +@param[in] u8PwrMode + Change the WINC power profile to different mode based on the enumeration @ref tenuM2mPwrMode.\n + Not implemented in WINC3400 firmware. + +@warning + May only be called after initialization, before any connection request, and may not be used to change + the power mode thereafter. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mPwrMode + m2m_wifi_init +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +@brief + Set the TX power tenuM2mTxPwrLevel. + +@param[in] u8TxPwrLevel + Change the TX power based on the enumeration @ref tenuM2mTxPwrLevel. + +@pre + Must be called after the initialization and before any connection request and can't be changed in runtime. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mTxPwrLevel + m2m_wifi_init +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +/*! +@ingroup WLANLOG +@fn \ + int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +@brief + Enable or Disable logs in run time. + +@details + Enable or Disable logs in run time (Disable Firmware logs will enhance the firmware start-up time and performance). + +@param[in] u8Enable + Set 1 to enable the logs, 0 for disable. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +@brief + Set the battery voltage to update the firmware calculations.\n + Not implemented in WINC3400 firmware. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@param [in] u16BattVoltx100 + Battery voltage multiplied by 100 + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +@brief + Asynchronous API to add or remove MAC addresses to the multicast filter. + +@details + This function will configure the WINC to receive/ignore multicast packets from certain + MAC address groups when operating in bypass mode. + This function requests the given MAC addresses to be added/removed from the multicast filter. + +@param[in] pu8MulticastMacAddress + Pointer to MAC address + +@param[in] u8AddRemove + A flag to add or remove the MAC ADDRESS, based on the following values: + - 0 : remove MAC address + - 1 : add MAC address + +@note + Maximum number of MAC addresses that could be added is 8. + +@warning + This function is available in ETHERNET/bypass mode ONLY. + Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_receive_buffer + m2m_wifi_send_ethernet_pkt + */ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +@brief + Synchronous function for setting or modifying the receiver buffer's length. + +@details + Synchronous function for setting or modifying the receiver buffer's length. + In the ETHERNET/bypass mode the application should define a callback of type + @ref tpfAppEthCb, through which the application handles the received + ethernet frames. It is through this callback function that the user can + dynamically modify the length of the currently used receiver buffer. + +@param[in] pvBuffer + Pointer to Buffer to receive data. + NULL pointer causes a negative error @ref M2M_ERR_FAIL. + +@param[in] u16BufferLen + Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + defined as @ref SOCKET_BUFFER_MAX_LENGTH + +@warning + This function is available in the Ethernet/bypass mode ONLY. Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_send_ethernet_pkt +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +/*! +@ingroup WLANCRYPTO +@fn \ + int8_t m2m_wifi_prng_get_random_bytes(uint8_t* pu8PrngBuff,uint16_t u16PrngSize); + +@brief + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes. + +@details + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes as specified in the size passed in as a parameter. + The registered wifi-cb function retrieves the random bytes through the response @ref M2M_WIFI_RESP_GET_PRNG + +@param[in] pu8PrngBuff + Pointer to a buffer to receive data. + +@param[in] u16PrngSize + Request size in bytes + +@warning + Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + causes a negative error @ref M2M_ERR_FAIL. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +@brief + Enable WiFi STA roaming. + +@details + m2m_wifi_enable_roaming enables the firmware to trigger the roaming algorithm/steps on link loss with the current AP. + If roaming is successful, the @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_ROAMED is sent to the host. + Additionally a @ref M2M_WIFI_REQ_DHCP_CONF message with new DHCP lease details is sent to host (only if bEnableDhcp=1). + If roaming is unsuccessful, a @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_DISCONNECTED is sent to host. + +@param[in] bEnableDhcp + 0 : Disables DHCP client execution after roaming to new AP + 1 : Enables DHCP client execution after roaming to new AP + +@pre + Must be called after the initialization. + The roaming algorithm/procedure is internal to the firmware. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_disable_roaming(void); + +@brief + Disable WiFi STA roaming. + +@pre + Must be called after the initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_disable_roaming(void); + +/*! +@ingroup WLANINIT +@fn \ + uint8_t m2m_wifi_get_state(void); + +@brief + Get the wifi state. + +@return + The function returns the current wifi state (see @ref tenuWifiState for the possible states). + +@note + Check the WINC state. See @ref tenuWifiState for possible states.\n + @ref WIFI_STATE_INIT state represents WINC initialized but not started, this is a suitable state + for safe flash access. + +@sa + m2m_wifi_init + m2m_wifi_download_mode +*/ +uint8_t m2m_wifi_get_state(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Asynchronous API to send an encapsulated Atmel BLE message over the Wifi Host Interface. + +@param[in] msg + Pointer to the start of the BLE message to transfer down to the WINC. + +@param[in] len + The length of the message in octets. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + */ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +@brief + Asynchronous API that notifies the WINC with the Gain Table index from Flash that should use to configure the WiFi and BLE gains. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_restrict_ble(void); + +@brief + Asynchronous API to request restricting of BLE functionality by placing the BLE processor in a low power state. + It is recommended to do this if it is known that BLE functionality will not be used for any significant length of time. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_restrict_ble(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_unrestrict_ble(void); + +@brief + Asynchronous API to request un-restricting of BLE functionality by reverting the BLE processor to full power mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_unrestrict_ble(void); + +/** @defgroup VERSION Version + @brief + Describes the APIs for reading the version information of the WINC firmware. + @{ + @defgroup VERSIONDEF Defines + @brief + Specifies the macros and defines used by the version APIs. + + @defgroup VERSIONAPI Functions + @brief + Lists the APIs for reading the version information of the WINC firmware. + @} + */ + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev); + +@brief + Synchronous API to obtain the firmware version currently running on the WINC. + +@details + Get the Firmware version info from the active partition, as defined in the structure @ref tstrM2mRev. + +@param[out] pstrRev + Pointer to a variable of type @ref tstrM2mRev, which contains the firmware version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@sa + m2m_wifi_init +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@param[out] pstrRev + Pointer to variable of type @ref tstrM2mRev which contains the ota fw version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Synchronous API to obtain the firmware WINC chip ID. + +@return + The function returns chipID > 0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void); + +/*! +@ingroup OTAFUNCTIONS +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@return + The function returns @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ + diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/nmasic.h b/AudioConsole.X/Source/winc3400_142/driver/include/nmasic.h new file mode 100644 index 0000000..5b20c40 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/nmasic.h @@ -0,0 +1,148 @@ +/******************************************************************************* + This module contains WINC3400 ASIC specific internal APIs. + + File Name: + nmasic.h + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define CHIP_ID_3000D (0x3000D0) + +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) (((id & 0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) (((id & 0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3400(id) (((id & 0xfff0f000) == 0x300000) ? 1 : 0) +#define REV(id) ( ((id) & 0x00000fff ) ) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) +#define rHAVE_ETHERNET_MODE_BIT (NBIT7) + +typedef struct { + uint32_t u32Mac_efuse_mib; + uint32_t u32Firmware_Ota_rev; +} tstrGpRegs; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_clkless_wake + * @brief Wakeup the chip using clockless registers + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_clkless_wake(void); + +int8_t chip_wake(void); + +int8_t chip_sleep(void); + +void chip_idle(void); + +void enable_rf_blocks(void); + +int8_t enable_interrupts(void); + +int8_t cpu_start(void); + +uint32_t nmi_get_chipid(void); + +uint32_t nmi_get_rfrevid(void); + +void restore_pmu_settings_after_global_reset(void); + +void nmi_update_pll(void); + +void nmi_set_sys_clk_src_to_xo(void); + +int8_t chip_reset(void); + +int8_t wait_for_bootrom(uint8_t); + +int8_t wait_for_firmware_start(uint8_t); + +int8_t chip_deinit(void); + +int8_t chip_reset_and_cpu_halt(void); + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir); + +int8_t set_gpio_val(uint8_t gpio, uint8_t val); + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val); + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable); + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr); + +int8_t chip_apply_conf(uint32_t u32conf); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMASIC_H_*/ diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/nmbus.h b/AudioConsole.X/Source/winc3400_142/driver/include/nmbus.h new file mode 100644 index 0000000..dd13e9a --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/nmbus.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.h + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal); + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void); + +/** + * @fn nm_bus_reset + * @brief Reset bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void); + +/** + * @fn nm_bus_iface_reconfigure + * @brief Reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr); + +/** + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr); + +/** + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/nmdrv.h b/AudioConsole.X/Source/winc3400_142/driver/include/nmdrv.h new file mode 100644 index 0000000..063e624 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/nmdrv.h @@ -0,0 +1,176 @@ +/******************************************************************************* + This module contains WINC3400 M2M driver APIs declarations. + + File Name: + nmdrv.h + + Summary: + This module contains WINC3400 M2M driver APIs declarations. + + Description: + This module contains WINC3400 M2M driver APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "nm_common.h" + +/*! +@enum \ + tenuNmState +@brief + Enumeration for WINC state + The following is used to track the state of the WINC (not initialized, initialized or started) + +@remarks + This is useful when putting the WINC in "download mode" to access the flash via SPI. By using + @ref nm_get_state and checking against the desired state, it is possible to validate whether + it is safe to proceed with SPI Flash access. +*/ +typedef enum { + NM_STATE_DEINIT, + /*!< WINC is not initialized */ + NM_STATE_INIT, + /*!< WINC has been initialized. SPI flash access is possible. */ + NM_STATE_START, + /*!< WINC has started */ +} tenuNmState; + +/** +* @struct tstrM2mRev +* @brief Structure holding firmware version parameters and build date/time +*/ +typedef struct { + uint16_t u16FirmwareHifInfo; /* Fw HIF Info */ + uint8_t u8FirmwareMajor; /* Version Major Number */ + uint8_t u8FirmwareRsvd; /* Reserved */ + uint8_t u8FirmwareMinor; /* Version Minor */ + uint8_t u8FirmwarePatch; /* Patch Number */ + uint8_t BuildDate[sizeof(__DATE__)]; // 12 bytes + uint8_t BuildTime[sizeof(__TIME__)]; // 9 bytes +} tstrM2mRev; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the active partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_firmware_full_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void); + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg); + +/** + * @fn nm_drv_init_hold + * @brief First part of nm_drv_init, up to the point of initializing spi for flash access. + * @see nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_hold(void); + +/** + * @fn nm_drv_init_start + * @brief Second part of nm_drv_init, continuing from where nm_drv_init_hold left off. + * @see nm_drv_init + * @param[in] arg + * Parameter inherited from nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_start(void* arg); + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @param[in] arg + * Generic argument unused. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_deinit(void* arg); + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void); + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMDRV_H_*/ + + diff --git a/AudioConsole.X/Source/winc3400_142/driver/include/nmspi.h b/AudioConsole.X/Source/winc3400_142/driver/include/nmspi.h new file mode 100644 index 0000000..75fd0e8 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/include/nmspi.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.h + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @fn nm_spi_init + * @brief Initialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_init(void); + +/** +* @fn nm_spi_lock_init +* @brief Initialize the SPI lock +* @return None +*/ +void nm_spi_lock_init(void); + +/** + * @fn nm_spi_reset + * @brief Reset the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_reset(void); + +/** + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_deinit(void); + +/** + * @fn nm_spi_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_spi_read_reg(uint32_t u32Addr); + +/** + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_spi_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_spi_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +/** + * @fn nm_spi_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMSPI_H_ */ diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_flash.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_flash.c new file mode 100644 index 0000000..3ff97dc --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_flash.c @@ -0,0 +1,354 @@ +/******************************************************************************* + File Name: + m2m_flash.c + + Summary: + This module contains the WINC flash interface. + + Description: + This module contains the WINC flash interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "m2m_flash.h" +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +TYPEDEFS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +typedef struct +{ + uint32_t address; + uint32_t size; +} tstrFlashMapEntry; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static const tstrFlashMapEntry flashMap[] = +{ + {0 , 0 }, // WINC_FLASH_REGION_RAW, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_ACTIVE, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_INACTIVE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ }, // WINC_FLASH_REGION_PLL_TABLE, + {M2M_GAIN_FLASH_OFFSET , M2M_GAIN_FLASH_SZ }, // WINC_FLASH_REGION_GAIN_TABLE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ+M2M_GAIN_FLASH_SZ}, // WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + {M2M_TLS_ROOTCER_FLASH_OFFSET , M2M_TLS_ROOTCER_FLASH_SZ }, // WINC_FLASH_REGION_ROOT_CERTS, + {M2M_TLS_SERVER_FLASH_OFFSET , M2M_TLS_SERVER_FLASH_SZ }, // WINC_FLASH_REGION_LOCAL_CERTS, + {M2M_CACHED_CONNS_FLASH_OFFSET , M2M_CACHED_CONNS_FLASH_SZ }, // WINC_FLASH_REGION_CONN_PARAM, + {0 , M2M_HTTP_MEM_FLASH_SZ }, // WINC_FLASH_REGION_HTTP_FILES, +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static int8_t winc_flash_compare(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_SUCCESS; + uint8_t buf[128]; + uint32_t offset = 0; + + while(offset < u32Size) + { + uint32_t chunk_sz = sizeof(buf); + if(chunk_sz > u32Size - offset) + chunk_sz = u32Size - offset; + ret = spi_flash_read(buf, u32Offset + offset, chunk_sz); + if(ret != M2M_SUCCESS) + break; + ret = memcmp(buf, pu8Buf + offset, chunk_sz); + if(ret != 0) + break; + offset += chunk_sz; + } + return ret; +} +static int8_t winc_flash_write_verify(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_ERR_FAIL; + uint8_t count = 20; + + while((ret != M2M_SUCCESS) && (count-- > 0)) + { + ret = spi_flash_write(pu8Buf, u32Offset, u32Size); + if(ret == M2M_SUCCESS) + ret = winc_flash_compare(pu8Buf, u32Offset, u32Size); + } + return ret; +} + +/* Some internal functions for accessing the control structure. */ +static uint8_t crc7(uint8_t crc, const uint8_t *buff, uint16_t len) +{ + uint8_t reg = crc; + uint16_t i; + for(i = 0; i < len; i++) + { + uint16_t g; + for(g = 0; g < 8; g++) + { + uint8_t inv = (((buff[i] << g) & 0x80) >> 7) ^ ((reg >> 6) & 1); + reg = ((reg << 1) & 0x7f) ^ (9 * inv); + } + } + return reg; +} +static int8_t verify_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret = M2M_SUCCESS; + + if(pstrControlSec->u32OtaMagicValue != OTA_MAGIC_VALUE) + s8Ret = M2M_ERR_FAIL; + if(pstrControlSec->u32OtaControlSecCrc != crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4)) + s8Ret = M2M_ERR_FAIL; + + return s8Ret; +} +static int8_t read_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret; + + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + + if(s8Ret != M2M_SUCCESS) + { + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + } + + return s8Ret; +} +static int8_t update_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t ret = M2M_ERR_FAIL; + + ret = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(ret == M2M_SUCCESS) + { + ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + } + return ret; +} + +static bool find_flash_section(tenuWincFlashRegion enuRegion, uint32_t *pu32StartAddr, uint32_t *pu32Size) +{ + /* Ensure the pointers and region are valid. */ + if((NULL == pu32StartAddr) || (NULL == pu32Size) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return false; + + /* For the raw region resolve the full flash space, otherwise lookup + the region location and size from the flexible flash map. */ + switch(enuRegion) + { + case WINC_FLASH_REGION_RAW: + *pu32StartAddr = 0; + *pu32Size = spi_flash_get_size() << 17; + break; + case WINC_FLASH_REGION_FIRMWARE_ACTIVE: + case WINC_FLASH_REGION_FIRMWARE_INACTIVE: + case WINC_FLASH_REGION_HTTP_FILES: + { + /* In these cases we need to read the control structure to find the appropriate flash address. */ + tstrOtaControlSec strControl; + + /* Check the WINC is initialised and not running. */ + if (NM_STATE_INIT != nm_get_state()) + return false; + + /* Read control structure from flash. */ + if (M2M_SUCCESS != read_control_structure(&strControl)) + return false; + + if (WINC_FLASH_REGION_FIRMWARE_INACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaRollbackImageOffset; + else if (WINC_FLASH_REGION_FIRMWARE_ACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset; + else if (WINC_FLASH_REGION_HTTP_FILES == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset + (M2M_HTTP_MEM_FLASH_OFFSET - M2M_OTA_IMAGE1_OFFSET); + + *pu32Size = flashMap[enuRegion].size; + break; + } + default: + *pu32StartAddr = flashMap[enuRegion].address; + *pu32Size = flashMap[enuRegion].size; + break; + } + + M2M_INFO("Flash lookup %2d: 0x%06" PRIx32 " %0" PRId32 "\r\n", enuRegion, *pu32StartAddr, *pu32Size); + + return true; +} + +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the region is valid. */ + if(enuRegion >= WINC_FLASH_NUM_REGIONS) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Erase is only supported for regions which begin on a sector boundary. */ + if(flashAddress & (FLASH_SECTOR_SZ-1)) + return M2M_ERR_INVALID_ARG; + + /* Check requested size fits within region size. */ + if((((uint32_t)u8StartSector + u8NumSectors) * FLASH_SECTOR_SZ) > flashRegionSize) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += (u8StartSector * FLASH_SECTOR_SZ); + + /* Erase the requested sectors. */ + if(M2M_SUCCESS != spi_flash_erase(flashAddress, u8NumSectors * FLASH_SECTOR_SZ)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Write data to flash. */ + if(M2M_SUCCESS != spi_flash_write(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Read data from flash. */ + if(M2M_SUCCESS != spi_flash_read(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_switch_firmware(void) +{ + tstrOtaControlSec strControl; + uint32_t u32Tmp; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Read control structure from flash. */ + if(M2M_SUCCESS != read_control_structure(&strControl)) + return M2M_ERR_FAIL; + + /* Switch active and inactive. */ + u32Tmp = strControl.u32OtaRollbackImageOffset; + strControl.u32OtaRollbackImageOffset = strControl.u32OtaCurrentWorkingImagOffset; + strControl.u32OtaCurrentWorkingImagOffset = u32Tmp; + + /* Ensure the inactive image is marked as invalid. This protects m2m_ota_switch_firmware from + switching to an image whose validity is unknown. Switching remains possible via this API. */ + strControl.u32OtaRollbackImageValidStatus = OTA_STATUS_INVALID; + + if(M2M_SUCCESS != update_control_structure(&strControl)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_hif.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_hif.c new file mode 100644 index 0000000..774645b --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_hif.c @@ -0,0 +1,857 @@ +/******************************************************************************* + File Name: + m2m_hif.c + + Summary: + This module contains M2M host interface API implementations. + + Description: + This module contains M2M host interface API implementations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nmdrv.h" +#include "nm_bsp.h" +#include "m2m_hif.h" +#include "m2m_types.h" +#include "nmasic.h" +#include "m2m_periph.h" +//#include "wdrv_winc_common.h" +//#include "osal/osal.h" + +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WIFI_HOST_RCV_CTRL_4 (0x150400) + + +#define INTERRUPT_CORTUS_0_3000D0 (0x10a8) +#define INTERRUPT_CORTUS_1_3000D0 (0x10ac) +#define INTERRUPT_CORTUS_2_3000D0 (0x10b0) +#define INTERRUPT_CORTUS_3_3000D0 (0x10b4) + +//static OSAL_SEM_HANDLE_TYPE hifSemaphore; + +typedef struct { + uint8_t u8ChipMode; + uint8_t u8ChipSleep; + uint8_t u8HifRXDone; + uint8_t u8Interrupt; + uint32_t u32RxAddr; + uint32_t u32RxSize; + tpfHifCallBack pfWifiCb; + tpfHifCallBack pfIpCb; + tpfHifCallBack pfOtaCb; + tpfHifCallBack pfSigmaCb; + tpfHifCallBack pfHifCb; + //tpfHifCallBack pfCryptoCb; + tpfHifCallBack pfSslCb; +} tstrHifContext; + +volatile tstrHifContext gstrHifCxt; + +/* + Special codes for managing HIF restriction to OTA rollback/switch only +*/ +#define HIF_OTA_RB_ONLY 0xFFFF +#define HIFCODE_OTA_RB ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_ROLLBACK) +#define HIFCODE_OTA_SW ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_SWITCH_FIRMWARE) +/* + Codes for new HIF messages (since last HIF major increase). + Only need ones which are host->winc. + Each entry is formed of ((GroupId << 8) | OpCode) +*/ +#define HIFCODE_SSL_WRITECERT ((M2M_REQ_GROUP_SSL << 8) | M2M_SSL_REQ_WRITE_OWN_CERTS) +#define HIFCODE_WIFI_PASSIVESCAN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_PASSIVE_SCAN) +#define HIFCODE_WIFI_CONN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_CONN) +#define HIFCODE_WIFI_CONN_PARAM ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_IND_CONN_PARAM) +#define HIFCODE_WIFI_DELETE_CRED ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQRSP_DELETE_APID) +#define HIFCODE_WIFI_START_PROV_MODE ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_START_PROVISION_MODE) +#define HIFCODE_WIFI_ENABLE_AP ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ENABLE_AP) +#define HIFCODE_IP_RAW_SOCK_OPT ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_RAW_SET_SOCK_OPT) +#define HIFCODE_WIFI_ROAMING ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ROAMING) +#define HIFCODE_IP_SECURE ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_SECURE) +#define HIFCODE_WIFI_SCAN_SSID_LIST ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SCAN_SSID_LIST) +#define HIFCODE_WIFI_SET_STOP_SCAN_OPTION ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SET_STOP_SCAN_OPTION) + +/* + List of new HIF messages (since last HIF major increase). + Only need to list ones which are host->winc. + Additionally, entry 0 used to indicate OTA RB/SW only. +*/ +#define NEW_HIF_LIST \ + HIF_OTA_RB_ONLY, \ + HIFCODE_SSL_WRITECERT, \ + HIFCODE_WIFI_PASSIVESCAN, \ + HIFCODE_WIFI_CONN, \ + HIFCODE_WIFI_CONN_PARAM, \ + HIFCODE_WIFI_DELETE_CRED, \ + HIFCODE_WIFI_START_PROV_MODE, \ + HIFCODE_WIFI_ENABLE_AP, \ + HIFCODE_IP_RAW_SOCK_OPT, \ + HIFCODE_WIFI_ROAMING, \ + HIFCODE_IP_SECURE, \ + HIFCODE_WIFI_SCAN_SSID_LIST, \ + HIFCODE_WIFI_SET_STOP_SCAN_OPTION +/* + Array of HIF messages which are not supported by Firmware. + During hif_init() this array is rebased using an offset determined by Firmware HIF level. +*/ +static uint16_t gau16HifBlacklist[] = {NEW_HIF_LIST}; +#define HIF_BLACKLIST_SZ (sizeof(gau16HifBlacklist)/sizeof(gau16HifBlacklist[0])) +static uint8_t gu8HifBlOffset = 0; + + +static int8_t hif_set_rx_done(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + gstrHifCxt.u8HifRXDone = 0; + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_0_3000D0, 1); + if(ret != M2M_SUCCESS)goto ERR1; + } else { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + + /* Set RX Done */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +/** + * @fn static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) + * @brief WiFi call back function + * @param[in] u8OpCode + * HIF Opcode type. + * @param[in] u16DataSize + * HIF data length. + * @param[in] u32Addr + * HIF address. + */ +static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ +} + +/** + * @fn int8_t hif_chip_wake(void); + * @brief To Wakeup the chip. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + if(gstrHifCxt.u8HifRXDone) + { + /* chip already wake for the rx not done no need to send wake request */ + return ret; + } + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + { + ret = chip_wake(); + if(ret != M2M_SUCCESS)goto ERR1; + } + } + gstrHifCxt.u8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype) +{ + gstrHifCxt.u8ChipMode = u8Pstype; +} + +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ +uint8_t hif_get_sleep_mode(void) +{ + return gstrHifCxt.u8ChipMode; +} + +/** + * @fn int8_t hif_chip_sleep_sc(void); + * @brief To clear the chip sleep but keep the chip sleep + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +static int8_t hif_chip_sleep_sc(void) +{ + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + return M2M_SUCCESS; +} + + +/** + * @fn int8_t hif_chip_sleep(void); + * @brief To make the chip sleep. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_sleep(void) +{ + int8_t ret = M2M_SUCCESS; + + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + ret = chip_sleep(); + } + return ret; +} + +/** + * @fn int8_t hif_init(void * arg); + * @brief To initialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_init(void *arg) +{ + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + +// if (OSAL_RESULT_TRUE != OSAL_SEM_Create(&hifSemaphore, OSAL_SEM_TYPE_BINARY, 1, 1)) +// return M2M_ERR_INIT; + + hif_register_cb(M2M_REQ_GROUP_HIF, m2m_hif_cb); + return hif_chip_sleep(); +} + +/** + * @fn int8_t hif_deinit(void * arg); + * @brief To Deinitialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_deinit(void *arg) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + return ret; +} + +/** + * @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); + * @brief + * To check the compatibility of an image with the current driver. + * @param [in] u16HifInfo + * HIF info of image to be checked. + * @return The function shall return ZERO for compatible image and a negative value otherwise. + */ +int8_t hif_check_compatibility(uint16_t u16HifInfo) +{ + int8_t ret = M2M_ERR_FW_VER_MISMATCH; + if((M2M_GET_HIF_BLOCK(u16HifInfo) == M2M_HIF_BLOCK_VALUE) && (M2M_GET_HIF_MAJOR(u16HifInfo) == M2M_HIF_MAJOR_VALUE)) + { + ret = M2M_SUCCESS; + } + return ret; +} + +/** + * @fn int8_t hif_enable_access(void); + * @brief + * To enable access to HIF layer, based on HIF level of Firmware. + * This function reads HIF level directly from a register written by Firmware. + * @return The function shall return ZERO for full match operation and a negative value if operation is restricted. + */ +int8_t hif_enable_access(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t fw_hif_info = 0; + + ret = nm_get_hif_info(&fw_hif_info, NULL); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(fw_hif_info); + if(ret == M2M_SUCCESS) + { + switch(M2M_GET_HIF_MINOR(fw_hif_info)) + { + case 0: + gu8HifBlOffset = 1; + break; + case 1: + gu8HifBlOffset = 2; + break; + case 2: + gu8HifBlOffset = 2; + break; + case 3: + gu8HifBlOffset = 3; + break; + case 4: + gu8HifBlOffset = 10; + break; + case 5: + gu8HifBlOffset = 13; + break; + // Additional case to be added each time hif minor increments. + // All additional cases to be removed in the event of a hif major increment. + // Default catches all cases in which hif minor is greater in Firmware than in Driver. + default: + gu8HifBlOffset = HIF_BLACKLIST_SZ; + break; + } + } + else + { + gu8HifBlOffset = 0; + M2M_ERR("HIF access limited to OTA Switch/Rollback only\r\n"); + } + } + return ret; +} + +/** + * @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); + * @brief + * To check that a particular hif message is supported with the current driver/firmware pair. + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise. + */ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode) +{ + uint8_t u8BlId; + uint16_t u16HifCode = ((uint16_t)u8Gid<<8) | u8OpCode; + if((u16HifCode == HIFCODE_OTA_RB) || (u16HifCode == HIFCODE_OTA_SW)) + { + return M2M_SUCCESS; + } + if(gu8HifBlOffset == 0) + { + M2M_ERR("HIF OTA rb/sw only\r\n"); + return M2M_ERR_SEND; + } + for(u8BlId = gu8HifBlOffset; u8BlId < HIF_BLACKLIST_SZ; u8BlId++) + { + if(u16HifCode == gau16HifBlacklist[u8BlId]) + { + M2M_ERR("HIF message unsupported\r\n"); + return M2M_ERR_SEND; + } + } + return M2M_SUCCESS; +} + +/** + * @fn int8_t hif_send(uint8_t u8Gid,uint8_t u8Opcode,uint8_t *pu8CtrlBuf,uint16_t u16CtrlBufSize, + * uint8_t *pu8DataBuf,uint16_t u16DataSize, uint16_t u16DataOffset) + * @brief Send packet using host interface. + * + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @param[in] pu8CtrlBuf + * Pointer to the Control buffer. + * @param[in] u16CtrlBufSize + * Control buffer size. + * @param[in] u16DataOffset + * Packet Data offset. + * @param[in] pu8DataBuf + * Packet buffer Allocated by the caller. + * @param[in] u16DataSize + * Packet buffer size (including the HIF header). + * @return The function shall return @ref M2M_SUCCESS for successful operation and a negative value otherwise. + */ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +{ + int8_t ret = M2M_ERR_SEND; + tstrHifHdr strHif; + uint32_t u32CtrlDataGap = u16DataOffset; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + strHif.u8Opcode = u8Opcode&(~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + + if(pu8CtrlBuf != NULL) + { + if(u16CtrlBufSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%dB) exceeds max (%dB)\n", "Ctrl", u16CtrlBufSize, M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u16CtrlBufSize; + u32CtrlDataGap -= u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + if((uint32_t)u16DataOffset + u16DataSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%luB) exceeds max (%luB)\n", "Data", (uint32_t)u16DataOffset + u16DataSize, (uint32_t)M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u32CtrlDataGap + u16DataSize; + } + + ret = hif_check_code(strHif.u8Gid, strHif.u8Opcode); + if(ret != M2M_SUCCESS) + { + goto ERR2; + } + + if(strHif.u16Length <= M2M_HIF_MAX_PACKET_SIZE) + { + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + volatile uint32_t reg, dma_addr = 0; + volatile uint16_t cnt = 0; + + reg = 0UL; + reg |= (uint32_t)u8Gid; + reg |= ((uint32_t)u8Opcode<<8); + reg |= ((uint32_t)strHif.u16Length<<16); + ret = nm_write_reg(NMI_STATE_REG, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + reg = 0UL; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + + if (ISNMC3400(nmi_get_chipid())) { + + ret = nm_write_reg(INTERRUPT_CORTUS_1_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + + dma_addr = 0; + + for(cnt = 0; cnt < 1000*5; cnt ++) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2, (uint32_t *)®); + if(ret != M2M_SUCCESS) break; + /* + * If it takes too long to get a response, the slow down to + * avoid back-to-back register read operations. + */ + if(cnt >= 1000) { + if(cnt == 1000) { + M2M_INFO("Slowing down...\n"); + } + nm_sleep(5); + } + if(!(reg & NBIT1)) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4, (uint32_t *)&dma_addr); + if(ret != M2M_SUCCESS) { + /*in case of read error clear the DMA address and return error*/ + dma_addr = 0; + goto ERR1; + } + /*in case of success break */ + break; + } + } + + if (dma_addr != 0) + { + volatile uint32_t u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length); + M2M_DBG("Writing into %" PRIx32 " %d\r\n", dma_addr, strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8_t*)&strHif, M2M_HIF_HDR_OFFSET); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if(pu8CtrlBuf != NULL) + { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + u32CurrAddr += u32CtrlDataGap; + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + + /* Following line of code is to generate the interrupt which is not strictly needed for 3400, + but has no noticeable side effects + */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_2_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + } + else + { + ret = hif_chip_sleep(); + M2M_DBG("Failed to alloc rx size\r\n"); + ret = M2M_ERR_MEM_ALLOC; + goto ERR2; + } + } + else + { + M2M_ERR("(HIF)Failed to wakeup the chip\r\n"); + goto ERR2; + } + } + else + { + M2M_ERR("HIF message length (%d) exceeds max length (%d)\r\n", strHif.u16Length, M2M_HIF_MAX_PACKET_SIZE); + ret = M2M_ERR_SEND; + goto ERR2; + } +// OSAL_SEM_Post(&hifSemaphore); + /*actual sleep ret = M2M_SUCCESS*/ + ret = hif_chip_sleep(); + return ret; +ERR1: + /*reset the count but no actual sleep as it already bus error*/ + hif_chip_sleep_sc(); +ERR2: + /*logical error*/ +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} +/** + * @fn hif_isr + * @brief Host interface interrupt service routine + * @return @ref M2M_SUCCESS in case of success or a negative vale otherwise + */ +static int8_t hif_isr(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg; + volatile tstrHifHdr strHif; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS == ret) + { + if(reg & 0x1) /* New interrupt has been received */ + { + uint16_t size; + + /*Clearing RX interrupt*/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + reg &= ~NBIT0; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + /* read the rx size */ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_0 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u8HifRXDone = 1; + size = (uint16_t)((reg >> 2) & 0xfff); + if (size > 0) { + uint32_t address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u32RxAddr = address; + gstrHifCxt.u32RxSize = size; + ret = nm_read_block(address, (uint8_t*)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) address bus fail\r\n"); + goto ERR1; + } + if(strHif.u16Length != size) + { + if((size - strHif.u16Length) > 4) + { + M2M_ERR("(hif) Corrupted packet Size = %u \r\n", + size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + +// OSAL_SEM_Post(&hifSemaphore); + + if(M2M_REQ_GROUP_WIFI == strHif.u8Gid) + { + if(gstrHifCxt.pfWifiCb) + gstrHifCxt.pfWifiCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("WIFI callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_IP == strHif.u8Gid) + { + if(gstrHifCxt.pfIpCb) + gstrHifCxt.pfIpCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Socket callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_OTA == strHif.u8Gid) + { + if(gstrHifCxt.pfOtaCb) + gstrHifCxt.pfOtaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("OTA callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid) + { + if(gstrHifCxt.pfSigmaCb) + gstrHifCxt.pfSigmaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Sigma callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SSL == strHif.u8Gid) + { + if(gstrHifCxt.pfSslCb) + gstrHifCxt.pfSslCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("SSL callback is not registered\r\n"); + } + else + { + M2M_ERR("(hif) invalid group ID\r\n"); + return M2M_ERR_BUS_FAIL; + } + if(gstrHifCxt.u8HifRXDone) + { + M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode); + return hif_set_rx_done(); + } + + return M2M_SUCCESS; + } + else + { + ret = M2M_ERR_RCV; + M2M_ERR("(hif) Wrong Size\r\n"); + goto ERR1; + } + } + else + { + M2M_ERR("(hif) False interrupt %lx\r\n",reg); + ret = M2M_ERR_FAIL; + } + } + else + { + M2M_ERR("(hif) Failed to read interrupt reg\r\n"); + } + +ERR1: +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} + +/** +* @fn hif_handle_isr(void) +* @brief Handle interrupt received from WINC3400 firmware. +* @return The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = hif_isr(); + if (M2M_SUCCESS != ret) + { + M2M_ERR("(hif) Failed to handle interrupt %d try Again..\r\n",ret); + } + + return ret; +} + +/** + * @fn hif_receive + * @brief Host interface interrupt service routine + * @param[in] u32Addr + * Receive start address + * @param[out] pu8Buf + * Pointer to receive buffer. Allocated by the caller + * @param[in] u16Sz + * Receive buffer size + * @param[in] isDone + * If you don't need any more packets send True otherwise send false + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone) +{ + int8_t ret = M2M_SUCCESS; + + if((u32Addr == 0) || (pu8Buf == NULL) || (u16Sz == 0)) + { + if(isDone) + { + ret = hif_set_rx_done(); + } + else + { + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\r\n"); + } + goto ERR1; + } + + if(u16Sz > gstrHifCxt.u32RxSize) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the received buffer size <%d><%" PRId32 ">\r\n", u16Sz, gstrHifCxt.u32RxSize); + goto ERR1; + } + if((u32Addr < gstrHifCxt.u32RxAddr)||((u32Addr + u16Sz)>(gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize))) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the received buffer address and length\r\n"); + goto ERR1; + } + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if(ret != M2M_SUCCESS)goto ERR1; + + /* check if this is the last packet */ + if( + isDone + || (((gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize) - (u32Addr+u16Sz)) <= 3) + /* Length in the RCV CTRL 0 register is rounded off to 4 by the firmware, + but length inside the HIF header is not, hence consider done if fewer than + 4 bytes left to read */ + ) + { + /* set RX done */ + ret = hif_set_rx_done(); + } +ERR1: + return ret; +} + +/** + * @fn hif_register_cb + * @brief To set Callback function for every component + * @param[in] u8Grp + * Group to which the Callback function should be set. + * @param[in] fn + * function to be set + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn) +{ + int8_t ret = M2M_SUCCESS; + switch(u8Grp) + { + case M2M_REQ_GROUP_IP: + gstrHifCxt.pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + gstrHifCxt.pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + gstrHifCxt.pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + gstrHifCxt.pfHifCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + gstrHifCxt.pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + gstrHifCxt.pfSslCb = fn; + break; + default: + M2M_ERR("GRp ? %d\r\n", u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ota.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ota.c new file mode 100644 index 0000000..a38285d --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ota.c @@ -0,0 +1,190 @@ +/******************************************************************************* + WINC3400 IoT OTA Interface. + + File Name: + m2m_ota.c + + Summary: + WINC3400 IoT OTA Interface + + Description: + WINC3400 IoT OTA Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "nm_common.h" +#include "m2m_types.h" +#include "m2m_ota.h" +#include "m2m_wifi.h" +#include "m2m_hif.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** +@fn m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +@brief Internal OTA call back function. +@param[in] u8OpCode + HIF Opcode type. +@param[in] u16DataSize + HIF data length. +@param[in] u32Addr + HIF address. +*/ +static void m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + int8_t s8Ret = M2M_SUCCESS; + if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) + { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + memset((uint8_t*)&strOtaUpdateStatusResp, 0, sizeof(tstrOtaUpdateStatusResp)); + s8Ret = hif_receive(u32Addr, (uint8_t*)&strOtaUpdateStatusResp, sizeof(tstrOtaUpdateStatusResp), 0); + if(s8Ret == M2M_SUCCESS) + { + if(gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType, strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } + else + { + M2M_ERR("Invalid OTA resp %d ?\r\n", u8OpCode); + } +} + +/*! +@fn int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb) +@brief Initialize the OTA layer. +@param[in] pfOtaUpdateCb + OTA Update callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb) +{ + int8_t ret = M2M_SUCCESS; + + if (pfOtaUpdateCb) { + gpfOtaUpdateCb = pfOtaUpdateCb; + } else { + M2M_ERR("Invalid OTA update callback\r\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA, m2m_ota_cb); + + return ret; +} + +/*! +@fn int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl) +@brief Request OTA start update using the downloaded URL. +@param[in] pcDownloadUrl + The download firmware URL, you get it from device info. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl) +{ + int8_t ret = M2M_SUCCESS; + uint16_t u16DurlSize = strlen((char*)pcDownloadUrl) + 1; + + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_UPDATE, pcDownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_ota_rollback(void) +@brief Request OTA Rollback image. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_rollback(void) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK, NULL, 0, NULL, 0, 0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + +/*! +@fn int8_t m2m_ota_abort(void) +@brief Request OTA Abort. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_abort(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ABORT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_ota_switch_firmware(void) +@brief Switch to the upgraded Firmware. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_switch_firmware(void) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_FIRMWARE, NULL, 0, NULL, 0, 0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_periph.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_periph.c new file mode 100644 index 0000000..c524ebd --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_periph.c @@ -0,0 +1,144 @@ +/******************************************************************************* + WINC3400 Peripherials Application Interface. + + File Name: + m2m_periph.c + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_periph.h" +#include "nmasic.h" +#include "m2m_hif.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static int8_t get_gpio_idx(uint8_t u8GpioNum) +{ + if(u8GpioNum >= M2M_PERIPH_GPIO_MAX) return -1; + else if(u8GpioNum == M2M_PERIPH_GPIO3) + { + return 3; + } + else if(u8GpioNum == M2M_PERIPH_GPIO4) + { + return 4; + } + if(u8GpioNum == M2M_PERIPH_GPIO15) + { + return 15; + } + else if(u8GpioNum == M2M_PERIPH_GPIO16) + { + return 16; + } + else if(u8GpioNum == M2M_PERIPH_GPIO18) + { + return 18; + } + else + { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static int8_t gpio_ioctl(uint8_t op, uint8_t u8GpioNum, uint8_t u8InVal, uint8_t *pu8OutVal) +{ + int8_t ret, gpio; + + ret = hif_chip_wake(); + if(ret != M2M_SUCCESS) goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if(gpio < 0) goto _EXIT1; + + if(op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_SET) { + ret = set_gpio_val((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_GET) { + ret = get_gpio_val((uint8_t)gpio, pu8OutVal); + } + if(ret != M2M_SUCCESS) goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +int8_t m2m_periph_init(tstrPerphInitParam *param) +{ + return M2M_SUCCESS; +} + +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + return pullup_ctrl(pinmask, enable); +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ssl.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ssl.c new file mode 100644 index 0000000..f4a5f44 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_ssl.c @@ -0,0 +1,495 @@ +/******************************************************************************* + File Name: + m2m_ssl.c + + Summary: + WINC SSL Interface. + + Description: + WINC SSL Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_ssl.h" +#include "m2m_hif.h" +#include "nmasic.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32_t gu32HIFAddr = 0; +static tenuTlsFlashStatus genuStatus = TLS_FLASH_ERR_UNKNOWN; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@fn void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +@brief Internal SSL callback function. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + int8_t s8tmp = M2M_SUCCESS; + switch(u8OpCode) + { + case M2M_SSL_REQ_ECC: + { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } + break; + case M2M_SSL_RESP_SET_CS_LIST: + { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } + break; + case M2M_SSL_RESP_WRITE_OWN_CERTS: + { + tstrTlsSrvChunkHdr strTlsSrvChunkRsp; + uint8_t bCallApp = 1; + + s8tmp = hif_receive(u32Addr, (uint8_t *)&strTlsSrvChunkRsp, sizeof(tstrTlsSrvChunkHdr), 0); + if(s8tmp == M2M_SUCCESS) + { + uint16_t offset = strTlsSrvChunkRsp.u16Offset32; + uint16_t chunk_size = strTlsSrvChunkRsp.u16Size32; + uint16_t total_size = strTlsSrvChunkRsp.u16TotalSize32; + tenuTlsFlashStatus status = (tenuTlsFlashStatus)(strTlsSrvChunkRsp.u16Sig); + + /* If first chunk, reset status. */ + if(offset == 0) + genuStatus = TLS_FLASH_OK_NO_CHANGE; + /* Only send status to app when processing last chunk. */ + if(offset + chunk_size != total_size) + bCallApp = 0; + + switch(status) + { + case TLS_FLASH_OK: + // Good flash write. Update status if no errors yet. + if(genuStatus == TLS_FLASH_OK_NO_CHANGE) + genuStatus = status; + break; + case TLS_FLASH_OK_NO_CHANGE: + // No change, don't update status. + break; + case TLS_FLASH_ERR_CORRUPT: + // Corrupt. Always update status. + genuStatus = status; + break; + case TLS_FLASH_ERR_NO_CHANGE: + // Failed flash write. Update status if no more serious error. + if((genuStatus != TLS_FLASH_ERR_CORRUPT) && (genuStatus != TLS_FLASH_ERR_UNKNOWN)) + genuStatus = status; + break; + default: + // Don't expect any other case. Ensure we don't mask a previous corrupt error. + if(genuStatus != TLS_FLASH_ERR_CORRUPT) + genuStatus = TLS_FLASH_ERR_UNKNOWN; + break; + } + } + if(bCallApp && gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_WRITE_OWN_CERTS, &genuStatus); + } + break; + } + if(s8tmp != M2M_SUCCESS) + { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + +/*! +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +@brief Initializes the SSL layer. +@param [in] pfAppSslCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + int8_t s8Ret = M2M_SUCCESS; + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + genuStatus = TLS_FLASH_ERR_UNKNOWN; + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL, m2m_ssl_cb); + if(s8Ret != M2M_SUCCESS) + { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz) +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz) +{ + int8_t s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), (uint8_t *)strECCResp, sizeof(tstrEccReqInfo), pu8RspDataBuff, u16RspDataSz, sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +@brief Sends certificates to the WINC +@param[in] pu8Buffer + Pointer to the certificates. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +{ + int8_t s8Ret = M2M_SUCCESS; +#define TXLIMIT (256 * 6) + + if(u32BufferSz <= TXLIMIT) + { + // set chunk header for one chunk + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)pu8Buffer; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = (u32BufferSz + 3) >> 2; + pchkhdr->u16Offset32 = 0; + pchkhdr->u16Size32 = (u32BufferSz + 3) >> 2; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data NON-CHUNKED\r\n", u32BufferSz); + } + else + { + // chunk it + // We are sneaking in a header - tstrTlsSrvChunkHdr +#define CHUNKHDRSZ (sizeof(tstrTlsSrvChunkHdr)) +#define CHUNKSZ (TXLIMIT - 256) // divisible by 4 + uint8_t saveblob[CHUNKHDRSZ]; + uint32_t ofs = 0; + uint32_t thischunksz = 0; + + // first is special - over writing our header + memcpy(saveblob, &pu8Buffer[ofs], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); // no need to round up to quad words this time + + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs], thischunksz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\r\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + + while(ofs < u32BufferSz) + { + // Subsequent chunks write header before and send a little more + memcpy(saveblob, &pu8Buffer[ofs-CHUNKHDRSZ], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); + thischunksz = (thischunksz + 3) & 0xFFFFFFFC; // needs to round up to quad word length + pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs - CHUNKHDRSZ]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs - CHUNKHDRSZ], thischunksz + CHUNKHDRSZ, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs - CHUNKHDRSZ], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + } + } + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey) +{ + int8_t s8Ret = M2M_ERR_FAIL; + uint16_t u16HashSz, u16SigSz, u16KeySz; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if((NULL == penuCurve) || (NULL == pu8Value) || (NULL == pu16ValueSz) || (NULL == pu8Sig) || (NULL == pu16SigSz) || (NULL == pstrKey)) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + *penuCurve = _htons(u16KeySz); + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16KeySz = _htons(u16KeySz); + if(u16KeySz > sizeof(pstrKey->X)) goto __ERR; + pstrKey->u16Size = u16KeySz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16HashSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16HashSz = _htons(u16HashSz); + if(u16HashSz > *pu16ValueSz) goto __ERR; + *pu16ValueSz = u16HashSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16SigSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16SigSz = _htons(u16SigSz); + if(u16SigSz > *pu16SigSz) goto __ERR; + *pu16SigSz = u16SigSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, pstrKey->X, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + if(hif_receive(gu32HIFAddr, pstrKey->Y, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + + if(hif_receive(gu32HIFAddr, pu8Value, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16HashSz; + + if(hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16SigSz; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey) +{ + uint16_t u16ValueSz = 32, u16SigSz = 64; + + return m2m_ssl_retrieve_next_for_verifying((tenuEcNamedCurve *)pu16Curve, pu8Value, &u16ValueSz, pu8Sig, &u16SigSz, pstrKey); +} + +/*! +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(NULL == pu8Value) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, pu8Value, u16ValueSz, 0) != M2M_SUCCESS) goto __ERR; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! +@fn void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void) +{ + m2m_ssl_stop_retrieving(); +} + +/*! +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. + +@return + - @ref SOCK_ERR_NO_ERROR + - @ref SOCK_ERR_INVALID_ARG +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +{ + int8_t s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/m2m_wifi.c b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_wifi.c new file mode 100644 index 0000000..45d2b13 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/m2m_wifi.c @@ -0,0 +1,2061 @@ +/******************************************************************************* + File Name: + m2m_wifi.c + + Summary: + This module contains M2M Wi-Fi APIs implementation. + + Description: + This module contains M2M Wi-Fi APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "m2m_wifi.h" +#include "m2m_hif.h" +#include "nmasic.h" + +#define WIFI_1X_TLS_HS_FLAGS_PEER_AUTH NBIT1 +#define WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK NBIT2 +#define WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME NBIT3 +#define WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING NBIT4 +#define WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT NBIT6 + +#define WIFI_1X_TLS_HS_FLAGS_DEFAULT ( \ + WIFI_1X_TLS_HS_FLAGS_PEER_AUTH \ + | WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK \ + | WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING \ +) + +static volatile uint8_t gu8ChNum; +static tpfAppWifiCb gpfAppWifiCb = NULL; + +static uint32_t gu321xTlsHsFlags = WIFI_1X_TLS_HS_FLAGS_DEFAULT; +static uint8_t gau81xRootSha1[20] = {0}; + +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8_t *gau8ethRcvBuf = NULL; +static uint16_t gu16ethRcvBufSize; + +/** +* @fn m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr, uint8_t grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +*/ +static void m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + uint8_t rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) + { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) + { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8_t*)&strSysTime, sizeof(tstrSystemTime), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CONN_INFO) + { + tstrM2MConnInfo strConnInfo; + if (hif_receive(u32Addr, (uint8_t*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) + { + } + else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) + { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8_t*)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8_t*)&strIpConfig); + } + } + else if (u8OpCode == M2M_WIFI_REQ_WPS) + { + tstrM2MWPSInfo strWps; + memset((uint8_t*)&strWps, 0, sizeof(tstrM2MWPSInfo)); + if (hif_receive(u32Addr, (uint8_t*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } + else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) + { + uint32_t u32ConflictedIP; + if (hif_receive(u32Addr, (uint8_t*)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) + { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \"\r\n", + BYTE_0(u32ConflictedIP), BYTE_1(u32ConflictedIP), BYTE_2(u32ConflictedIP), BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) + { + tstrM2mScanDone strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) + { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) + { + tstrM2mWifiscanResult strScanResult; + if (hif_receive(u32Addr, (uint8_t*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) + { + tstrM2MProvisionInfo strProvInfo; + if (hif_receive(u32Addr, (uint8_t*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) + { + tstrM2MDefaultConnResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_REQRSP_DELETE_APID) + { + tstrM2MGenericResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MGenericResp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQRSP_DELETE_APID, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_BLE_API_RECV) + { + //Read the length + if (hif_receive(u32Addr, rx_buf, 2, 0) == M2M_SUCCESS) + { + uint16_t u16BleMsgLen = (rx_buf[1] << 8) + rx_buf[0]; + tstrM2mBleApiMsg bleRx;// = (tstrM2mBleApiMsg*)OSAL_Malloc(u16BleMsgLen + sizeof(tstrM2mBleApiMsg)); + + // if (bleRx == NULL) + // M2M_ERR("No Mem for BLE msg\r\n"); + // else + { + bleRx.u16Len = u16BleMsgLen; + + //Read the rest of the message + if (hif_receive(u32Addr+2, bleRx.data, bleRx.u16Len, 1)== M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_BLE_API_RECV, &bleRx); + } + // OSAL_Free(bleRx); + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_PRNG) + { + tstrPrng strPrng; + if (hif_receive(u32Addr, (uint8_t*)&strPrng, sizeof(tstrPrng), 0) == M2M_SUCCESS) + { + if (hif_receive(u32Addr + sizeof(tstrPrng), strPrng.pu8RngBuff, strPrng.u16PrngSize, 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) { + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG, &strPrng); + } + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_SET_GAIN_TABLE) + { + tstrM2MGainTableRsp strGainRsp; + if (hif_receive(u32Addr, (uint8_t*)&strGainRsp, sizeof(tstrM2MGainTableRsp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SET_GAIN_TABLE, &strGainRsp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) + { + tstrM2mIpRsvdPkt strM2mRsvd; + if (hif_receive(u32Addr, (uint8_t*)&strM2mRsvd, sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) + { + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16_t u16Offset = strM2mRsvd.u16PktOffset; + + strM2mIpCtrlBuf.u16RemainingDataSize = strM2mRsvd.u16PktSz; + if ((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) + { + while (strM2mIpCtrlBuf.u16RemainingDataSize > 0) + { + if (strM2mIpCtrlBuf.u16RemainingDataSize > gu16ethRcvBufSize) + { + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; + } + else + { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainingDataSize; + } + + if (hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) + { + strM2mIpCtrlBuf.u16RemainingDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } + else + { + break; + } + } + } + } + } + else + { + M2M_ERR("REQ Not defined %d\r\n", u8OpCode); + } +} + +int8_t m2m_wifi_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(); + if (ret != M2M_SUCCESS) goto _EXIT0; + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static int8_t m2m_validate_ap_parameters(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (pstrM2MAPModeConfig == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if ((strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) >= M2M_MAX_SSID_LEN)) + { + M2M_ERR("INVALID SSID\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if (pstrM2MAPModeConfig->strApConfig.u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPModeConfig->strApConfig.u8ListenChannel < M2M_WIFI_CH_1) + { + M2M_ERR("INVALID CH\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[0] || pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[1])) + { + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[2])) + { + M2M_ERR("INVALID DHCP SERVER IP\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_OPEN) + { + goto ERR1; + } + else if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_WEP) + { + /* Check for WEP Key index */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeyIndx == 0) || (pstrM2MAPModeConfig->strApConfig.u8KeyIndx > WEP_KEY_MAX_INDEX)) + { + M2M_ERR("INVALID KEY INDEX\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_40_KEY_STRING_SIZE) && + (pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID KEY SIZE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key */ + if ((pstrM2MAPModeConfig->strApConfig.au8WepKey == NULL) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) > WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID WEP KEY\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + else + { + M2M_ERR("INVALID AUTHENTICATION MODE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} + +static int8_t m2m_validate_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (ptstrM2MScanOption == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + } + else + { + /* Check for valid No of slots */ + if (ptstrM2MScanOption->u8NumOfSlot == 0) + { + M2M_ERR("INVALID No of scan slots!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid time of slots */ + if ((ptstrM2MScanOption->u8SlotTime < 10) || (ptstrM2MScanOption->u8SlotTime > 250)) + { + M2M_ERR("INVALID scan slot time!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid No of probe requests per slot */ + if ((ptstrM2MScanOption->u8ProbesPerSlot == 0) || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) + { + M2M_ERR("INVALID No of probe requests per scan slot\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid RSSI threshold */ + if (ptstrM2MScanOption->s8RssiThresh >= 0) + { + M2M_ERR("INVALID RSSI threshold %d\r\n", ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + } + return s8Ret; +} + +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MGainTable strGainTable = {0}; + + strGainTable.u8GainTable = table_idx; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_GAIN_TABLE, (uint8_t*)&strGainTable, sizeof(tstrM2MGainTable), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_init_hold(void) +{ + int8_t ret = M2M_ERR_FAIL; + + /* Apply device specific initialization. */ + ret = nm_drv_init_hold(); + + return ret; +} + +int8_t m2m_wifi_init_start(tstrWifiInitParam *pWifiInitParam) +{ + tstrM2mRev strtmp; + int8_t ret = M2M_SUCCESS; + uint8_t u8WifiMode = M2M_WIFI_MODE_NORMAL; + + if (pWifiInitParam == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = pWifiInitParam->pfAppWifiCb; + + gpfAppEthCb = pWifiInitParam->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = pWifiInitParam->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = pWifiInitParam->strEthInitParam.u16ethRcvBufSize; + u8WifiMode = pWifiInitParam->strEthInitParam.u8EthernetEnable; + + if (pWifiInitParam->strEthInitParam.u8EthernetEnable) + u8WifiMode = M2M_WIFI_MODE_ETHERNET; + + + /* Initialize host interface module */ + /* Do this before bringing up the WINC as it can send HIF messages very quickly from bootup and we need to be ready */ + ret = hif_init(NULL); + if (ret != M2M_SUCCESS) goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI, m2m_wifi_cb); + + /* Apply device specific initialization. */ + ret = nm_drv_init_start(&u8WifiMode); + if (ret != M2M_SUCCESS) goto _EXIT0; + + M2M_INFO("Curr driver ver: %u.%u.%u\r\n", M2M_DRIVER_VERSION_MAJOR_NO, M2M_DRIVER_VERSION_MINOR_NO, M2M_DRIVER_VERSION_PATCH_NO); + M2M_INFO("Curr driver HIF Level: (%u) %u.%u\r\n", M2M_HIF_BLOCK_VALUE, M2M_HIF_MAJOR_VALUE, M2M_HIF_MINOR_VALUE); + ret = m2m_wifi_get_firmware_version(&strtmp); + m2m_ota_get_firmware_version(&strtmp); + + if (ret == M2M_SUCCESS) + { + ret = hif_enable_access(); + if (ret == M2M_SUCCESS) + { + m2m_wifi_ble_set_gain_table(pWifiInitParam->GainTableIndex); + } + } + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); + +_EXIT0: + return ret; +} + +int8_t m2m_wifi_init(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_SUCCESS; + + ret = m2m_wifi_init_hold(); + if (ret == M2M_SUCCESS) + { + ret = m2m_wifi_init_start(pWifiInitParam); + } + return ret; +} + +int8_t m2m_wifi_deinit(void *arg) +{ + hif_deinit(NULL); + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_reinit_hold(void) +{ + m2m_wifi_deinit(NULL); + return m2m_wifi_init_hold(); +} + +int8_t m2m_wifi_reinit_start(tstrWifiInitParam *pWifiInitParam) +{ + return m2m_wifi_init_start(pWifiInitParam); +} + +int8_t m2m_wifi_reinit(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_ERR_FAIL; + ret = m2m_wifi_reinit_hold(); + if (ret == M2M_SUCCESS) { + ret = m2m_wifi_reinit_start(pWifiInitParam); + } + return ret; +} + +uint8_t m2m_wifi_get_state(void) +{ + switch(nm_get_state()) + { + case NM_STATE_DEINIT: + return WIFI_STATE_DEINIT; + case NM_STATE_INIT: + return WIFI_STATE_INIT; + case NM_STATE_START: + return WIFI_STATE_START; + } + return WIFI_STATE_DEINIT; +} + +int8_t m2m_wifi_handle_events(void) +{ + if(WIFI_STATE_START == m2m_wifi_get_state()) + return hif_handle_isr(); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_delete_sc(char *pcSsid, uint8_t u8SsidLen) +{ + tstrM2mWifiApId strApId; + memset((uint8_t*)&strApId, 0, sizeof(strApId)); + strApId.au8SSID[0] = 0xFF; // Special value used to cause fw to delete all entries. + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQRSP_DELETE_APID, (uint8_t*)&strApId, sizeof(tstrM2mWifiApId), NULL, 0, 0); +} + +int8_t m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0, NULL, 0, 0); +} + +/*************************************************************************************************/ +/* WIFI CONNECT INTERNAL FUNCTIONS */ +/*************************************************************************************************/ +static int8_t m2m_wifi_connect_prepare_msg( + tenuCredStoreOption enuCredStoreOption, + tenuM2mSecType enuAuthType, + uint16_t u16AuthSize, + tstrNetworkId *pstrNetworkId, + tstrM2mWifiConnHdr *pstrWifiConn +) +{ + int8_t ret = M2M_ERR_FAIL; + uint16_t u16CredSize = sizeof(tstrM2mConnCredCmn) + u16AuthSize; + /* Check application params. */ + if ( + (pstrNetworkId == NULL) + || (pstrNetworkId->pu8Ssid == NULL) + || (pstrNetworkId->u8SsidLen >= M2M_MAX_SSID_LEN) + ) + goto INVALID_ARG; + + if (pstrWifiConn != NULL) + { + tstrM2mConnCredHdr *pstrHdr = &pstrWifiConn->strConnCredHdr; + tstrM2mConnCredCmn *pstrCmn = &pstrWifiConn->strConnCredCmn; + + memset((uint8_t*)pstrWifiConn, 0, sizeof(tstrM2mWifiConnHdr)); + + pstrHdr->u16CredSize = u16CredSize; + switch(enuCredStoreOption) + { + case WIFI_CRED_SAVE_ENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_ENCRYPT_FLAG; + // intentional fall through... + case WIFI_CRED_SAVE_UNENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_STORE_FLAG; + // intentional fall through... + case WIFI_CRED_DONTSAVE: + break; + default: + goto INVALID_ARG; + } + + if (pstrNetworkId->enuChannel == M2M_WIFI_CH_ALL) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel); + else if ((pstrNetworkId->enuChannel <= M2M_WIFI_CH_14) && (pstrNetworkId->enuChannel >= M2M_WIFI_CH_1)) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel) - 1; + else + goto INVALID_ARG; + + if ((enuAuthType == M2M_WIFI_SEC_INVALID) || (enuAuthType >= M2M_WIFI_NUM_AUTH_TYPES)) + goto INVALID_ARG; + pstrCmn->u8AuthType = (uint8_t)enuAuthType; + + pstrCmn->u8SsidLen = pstrNetworkId->u8SsidLen; + memcpy(pstrCmn->au8Ssid, pstrNetworkId->pu8Ssid, pstrNetworkId->u8SsidLen); + if (pstrNetworkId->pu8Bssid != NULL) + { + pstrCmn->u8Options = M2M_WIFI_CONN_BSSID_FLAG; + memcpy(pstrCmn->au8Bssid, pstrNetworkId->pu8Bssid, M2M_MAC_ADDRES_LEN); + } + /* Everything is ok, set return value. */ + ret = M2M_SUCCESS; + } + return ret; +INVALID_ARG: + return M2M_ERR_INVALID_ARG; +} + +static int8_t legacy_connect_prepare_msg(tstrM2mWifiConnHdr *pstrConnHdr, tstrM2mWifiConnectLegacy_1_2 *pstrConnect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ( + !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_ENCRYPT_FLAG) + && !(pstrConnHdr->strConnCredCmn.u8Options & M2M_WIFI_CONN_BSSID_FLAG) + ) + { + memset((uint8_t*)pstrConnect, 0, sizeof(tstrM2mWifiConnectLegacy_1_2)); + memcpy(pstrConnect->au8SSID, pstrConnHdr->strConnCredCmn.au8Ssid, pstrConnHdr->strConnCredCmn.u8SsidLen); + pstrConnect->au8SSID[pstrConnHdr->strConnCredCmn.u8SsidLen] = 0; + pstrConnect->u16Ch = pstrConnHdr->strConnCredHdr.u8Channel; + pstrConnect->u8NoSaveCred = !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_STORE_FLAG); + pstrConnect->strSec.u8SecType = pstrConnHdr->strConnCredCmn.u8AuthType; + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +/*************************************************************************************************/ +/* WIFI CONNECT APIS */ +/*************************************************************************************************/ +int8_t m2m_wifi_connect_open( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, M2M_WIFI_SEC_OPEN, 0, pstrNetworkId, &strConnHdr); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN, + (uint8_t*)&strConnHdr, sizeof(strConnHdr), + NULL, 0, 0); + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_wep( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthWep *pstrAuthWep +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if ( + (pstrAuthWep != NULL) && (pstrAuthWep->pu8WepKey != NULL) + && (pstrAuthWep->u8KeyIndx > 0) && (pstrAuthWep->u8KeyIndx <= WEP_KEY_MAX_INDEX) + && ((pstrAuthWep->u8KeySz == WEP_104_KEY_STRING_SIZE) || (pstrAuthWep->u8KeySz == WEP_40_KEY_STRING_SIZE)) + ) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WEP, + sizeof(tstrM2mWifiWep), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWep pstrWep;// = (tstrM2mWifiWep *)OSAL_Malloc(sizeof(tstrM2mWifiWep)); + // if (pstrWep == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + pstrWep.u8KeyIndex = pstrAuthWep->u8KeyIndx - 1; + pstrWep.u8KeyLen = pstrAuthWep->u8KeySz/2; + hexstr_2_bytes(pstrWep.au8WepKey, (pstrAuthWep->pu8WepKey), pstrWep.u8KeyLen); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrWep, sizeof(tstrM2mWifiWep), sizeof(tstrM2mWifiConnHdr)); +// OSAL_Free(pstrWep); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWepParamsLegacy_1_2 *pstrWepLegacy = &strConnectLegacy.strSec.uniAuth.strWepInfo; + pstrWepLegacy->u8KeyIndx = pstrAuthWep->u8KeyIndx - 1; + pstrWepLegacy->u8KeySz = pstrAuthWep->u8KeySz; + memcpy(pstrWepLegacy->au8WepKey, pstrAuthWep->pu8WepKey, pstrAuthWep->u8KeySz); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_psk( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthPsk *pstrAuthPsk +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if (pstrAuthPsk != NULL) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WPA_PSK, + sizeof(tstrM2mWifiPsk), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiPsk pstrPsk;// = (tstrM2mWifiPsk *)OSAL_Malloc(sizeof(tstrM2mWifiPsk)); + // if (pstrPsk == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + memset((uint8_t*)&pstrPsk, 0, sizeof(tstrM2mWifiPsk)); + if (pstrAuthPsk->pu8Psk != NULL) + { + if (pstrAuthPsk->pu8Passphrase != NULL) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = M2M_MAX_PSK_LEN-1; + /* Use hexstr_2_bytes to verify pu8Psk input. */ + if (M2M_SUCCESS != hexstr_2_bytes(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen/2)) + ret = M2M_ERR_INVALID_ARG; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen); + } + } + else if (pstrAuthPsk->pu8Passphrase != NULL) + { + if (pstrAuthPsk->u8PassphraseLen > M2M_MAX_PSK_LEN-1) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = pstrAuthPsk->u8PassphraseLen; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Passphrase, pstrPsk.u8PassphraseLen); + } + } + else + ret = M2M_ERR_INVALID_ARG; + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrPsk, sizeof(tstrM2mWifiPsk), sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstrPsk); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + uint8_t *pu8PskLegacy = strConnectLegacy.strSec.uniAuth.au8PSK; + memcpy(pu8PskLegacy, pstrAuthPsk->pu8Passphrase, pstrAuthPsk->u8PassphraseLen); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_1x_set_option(tenu1xOption enuOptionName, const void *pOptionValue, size_t OptionLen) +{ + if((pOptionValue == NULL) && (OptionLen > 0)) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + case 0: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_TIME_VERIF_MODE: + if(OptionLen != sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + switch(*(tenuTlsCertExpSettings*)pOptionValue) + { + case TLS_CERT_EXP_CHECK_DISABLE: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_ENABLE: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SESSION_CACHING: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + switch(OptionLen) + { + case 20: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memcpy(gau81xRootSha1, (uint8_t*)pOptionValue, sizeof(gau81xRootSha1)); + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memset(gau81xRootSha1, 0, sizeof(gau81xRootSha1)); + default: + return M2M_ERR_INVALID_ARG; + } + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_1x_get_option(tenu1xOption enuOptionName, void *pOptionValue, size_t *pOptionLen) +{ + if(pOptionValue == NULL) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_AUTH) ? 0 : 1; + break; + case WIFI_1X_TIME_VERIF_MODE: + if(*pOptionLen < sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(tenuTlsCertExpSettings); + if(!(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK)) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_DISABLE; + else if(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_ENABLE; + else + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME; + break; + case WIFI_1X_SESSION_CACHING: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING) ? 1 : 0; + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + if (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT) + { + if (*pOptionLen < sizeof(gau81xRootSha1)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(gau81xRootSha1); + memcpy((uint8_t*)pOptionValue, gau81xRootSha1, sizeof(gau81xRootSha1)); + } + else + *pOptionLen = 0; + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_connect_1x_mschap2( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xMschap2 *pstrAuth1xMschap2 +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xMschap2 != NULL) + { + if (pstrAuth1xMschap2->pu8Domain == NULL) + pstrAuth1xMschap2->u16DomainLen = 0; + if ( + (pstrAuth1xMschap2->pu8UserName != NULL) + && (pstrAuth1xMschap2->pu8Password != NULL) + && ((uint32_t)(pstrAuth1xMschap2->u16DomainLen) + pstrAuth1xMschap2->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xMschap2->u16PasswordLen <= M2M_AUTH_1X_PASSWORD_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xMschap2->u16DomainLen + + pstrAuth1xMschap2->u16UserNameLen + + pstrAuth1xMschap2->u16PasswordLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16AuthSize); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16AuthSize); + + pstr1xHdr.u8Flags = M2M_802_1X_MSCHAP2_FLAG; + if (pstrAuth1xMschap2->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xMschap2->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xMschap2->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xMschap2->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xMschap2->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xMschap2->u16PasswordLen; + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Password, pstr1xHdr.u16PrivateKeyLength); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16AuthSize, + sizeof(tstrM2mWifiConnHdr)); + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_1x_tls( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xTls *pstrAuth1xTls +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xTls != NULL) + { + if (pstrAuth1xTls->pu8Domain == NULL) + pstrAuth1xTls->u16DomainLen = 0; + if ( + (pstrAuth1xTls->pu8UserName != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Mod != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Exp != NULL) + && (pstrAuth1xTls->pu8Certificate != NULL) + && ((uint32_t)(pstrAuth1xTls->u16DomainLen) + pstrAuth1xTls->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xTls->u16PrivateKeyLen <= M2M_AUTH_1X_PRIVATEKEY_LEN_MAX) + && (pstrAuth1xTls->u16CertificateLen <= M2M_AUTH_1X_CERT_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xTls->u16DomainLen + + pstrAuth1xTls->u16UserNameLen + + (2 * pstrAuth1xTls->u16PrivateKeyLen) + + pstrAuth1xTls->u16CertificateLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + uint16_t u16Payload1Size = u16AuthSize - pstrAuth1xTls->u16CertificateLen; + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16Payload1Size); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + tstrM2mWifiAuthInfoHdr strInfoHdr = {0}; + + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16Payload1Size); + + pstr1xHdr.u8Flags = M2M_802_1X_TLS_FLAG; + if (pstrAuth1xTls->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xTls->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xTls->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xTls->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xTls->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xTls->u16PrivateKeyLen; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Mod, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Exp, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + + pstr1xHdr.u16CertificateOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16CertificateLength = pstrAuth1xTls->u16CertificateLen; + + strInfoHdr.u8Type = M2M_802_1X_TLS_CLIENT_CERTIFICATE; + strInfoHdr.u16InfoPos = pstr1xHdr.u16CertificateOffset; + strInfoHdr.u16InfoLen = pstr1xHdr.u16CertificateLength; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_IND_CONN_PARAM | M2M_REQ_DATA_PKT, + (uint8_t*)&strInfoHdr, sizeof(tstrM2mWifiAuthInfoHdr), + pstrAuth1xTls->pu8Certificate, pstrAuth1xTls->u16CertificateLen, + sizeof(tstrM2mWifiAuthInfoHdr)); + + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16Payload1Size, + sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch, 0); +} + +int8_t m2m_wifi_connect_sc(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch, uint8_t u8NoSaveCred) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + tstrNetworkId strNetworkId = {NULL, (uint8_t*)pcSsid, u8SsidLen, (tenuM2mScanCh)u16Ch}; + tenuCredStoreOption enuCredStoreOption = u8NoSaveCred ? WIFI_CRED_DONTSAVE : WIFI_CRED_SAVE_ENCRYPTED; + + /* This API does not support SSIDs which contain '\0'. If there is a '\0' character within the + * first u8SsidLen characters, then assume that the input u8SsidLen was incorrect - set length + * to strlen(pcSsid) and continue. This is to avoid a change from the behaviour of previously + * released drivers. */ + if (u8SsidLen < M2M_MAX_SSID_LEN) + while(u8SsidLen--) + if (strNetworkId.pu8Ssid[u8SsidLen] == 0) + strNetworkId.u8SsidLen = u8SsidLen; + + switch((tenuM2mSecType)u8SecType) + { + case M2M_WIFI_SEC_OPEN: + s8Ret = m2m_wifi_connect_open(enuCredStoreOption, &strNetworkId); + break; + case M2M_WIFI_SEC_WPA_PSK: + if (pvAuthInfo != NULL) + { + tstrAuthPsk strAuthPsk = {NULL, NULL, 0}; + uint16_t len = strlen((const char*)pvAuthInfo); + + if (len == M2M_MAX_PSK_LEN-1) + { + strAuthPsk.pu8Psk = (uint8_t*)pvAuthInfo; + } + else + { + strAuthPsk.pu8Passphrase = (uint8_t*)pvAuthInfo; + strAuthPsk.u8PassphraseLen = len; + } + s8Ret = m2m_wifi_connect_psk(enuCredStoreOption, &strNetworkId, &strAuthPsk); + } + break; + case M2M_WIFI_SEC_WEP: + if (pvAuthInfo != NULL) + { + tstrM2mWifiWepParams *pstrWepParams = (tstrM2mWifiWepParams *)pvAuthInfo; + tstrAuthWep strAuthWep = {pstrWepParams->au8WepKey, pstrWepParams->u8KeySz-1, pstrWepParams->u8KeyIndx}; + + s8Ret = m2m_wifi_connect_wep(enuCredStoreOption, &strNetworkId, &strAuthWep); + } + break; + default: + break; + } + return s8Ret; +} + +int8_t m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + memcpy((uint8_t*)strTmp.au8Mac, (uint8_t*)au8MacAddress, 6); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, + (uint8_t*)&strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0, 0); +} + +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32( + pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32( + pstrStaticIPConf->u32SubnetMask); + return hif_send(M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, + (uint8_t*)pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0, 0); +} + +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn) +{ + uint8_t u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8_t*)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CUST_INFO_ELEMENT, (uint8_t*)pau8M2mCustInfoElement, pau8M2mCustInfoElement[0]+1, NULL, 0, 0); +} + +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + if (m2m_validate_scan_options(ptstrM2MScanOption) == M2M_SUCCESS) + { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_OPTION, (uint8_t*)ptstrM2MScanOption, sizeof(tstrM2MScanOption), NULL, 0, 0); + } + return s8Ret; +} + +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + tstrM2MStopScanOption StopScanOption = { 0 }; + + if(1 >= u8StopScanOption) + { + StopScanOption.u8StopOnFirstResult = u8StopScanOption; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, (uint8_t*)&StopScanOption, sizeof(tstrM2MStopScanOption), NULL, 0, 0); + + M2M_INFO("Scan will %sstop on first result.\r\n", StopScanOption.u8StopOnFirstResult ? "" : "NOT "); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + + return s8Ret; +} + +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_REGION, (uint8_t*)&strScanRegion, sizeof(tstrM2MScanRegion), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_request_scan(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_passive(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL))&&(u8Ssidlist != NULL)) + { + tstrM2MScan strtmp; + uint16_t u16Lsize = 0; + uint8_t u8Apnum = u8Ssidlist[u16Lsize]; + if(u8Apnum <= MAX_HIDDEN_SITES) + { + u16Lsize++; + while(u8Apnum) + { + if(u8Ssidlist[u16Lsize] >= M2M_MAX_SSID_LEN) { + goto EXIT; + } else { + u16Lsize += u8Ssidlist[u16Lsize] + 1; + u8Apnum--; + } + } + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_SSID_LIST|M2M_REQ_DATA_PKT, (uint8_t*)&strtmp, sizeof(tstrM2MScan), u8Ssidlist, u16Lsize, sizeof(tstrM2MScan)); + } + } +EXIT: + return s8Ret; +} +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + memcpy((uint8_t*)strtmp.acPinNumber, (uint8_t*)pcPinNumber, 8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8_t*)&strtmp, sizeof(tstrM2MWPSConnect), NULL, 0, 0); +} + +int8_t m2m_wifi_wps_disable(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_p2p(uint8_t u8Channel) +{ + int8_t ret = M2M_SUCCESS; + if ((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) + { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8_t*)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0, 0); + } + else + { + M2M_ERR("Listen channel should only be 1, 6 or 11\r\n"); + ret = M2M_ERR_FAIL; + } + return ret; +} + +int8_t m2m_wifi_p2p_disconnect(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_enable_ap_ext(&strM2MAPModeConfig); +} + +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t ret = M2M_ERR_FAIL; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPModeConfig)) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8_t*)pstrM2MAPModeConfig, sizeof(tstrM2MAPModeConfig), NULL, 0, 0); + + if (ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. + ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_ENABLE_AP_LEGACY, + (uint8_t*)&pstrM2MAPModeConfig->strApConfig, + sizeof(tstrM2MAPConfig), + NULL, + 0, + 0 + ); + } + } + return ret; +} + +int8_t m2m_wifi_disable_ap(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn int8_t m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_req_curr_rssi(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_restrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_RESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_unrestrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_UNRESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize) +{ + int8_t s8Ret = -1; + if ((pu8Packet != NULL)&&(u16PacketSize>0)) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8_t*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8Packet, u16PacketSize, M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_mac_address(pu8MacAddr); + hif_chip_sleep(); + } + + return ret; +} + +/*! +@fn int8_t m2m_wifi_req_scan_result(uint8_t index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +int8_t m2m_wifi_req_scan_result(uint8_t index) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_RESULT, (uint8_t*)&strReqScanRlt, sizeof(tstrM2mReqScanResult), NULL, 0, 0); + return ret; +} + +/*! +@fn uint8_t m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8_t m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} + +/*! +@fn uint8_t m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} + +/*! +@fn int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); +@brief Set the power saving mode for the WINC3400. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC3400 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC3400 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8_t*)&strPs, sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\r\n", PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} + +/*! +@fn int8_t m2m_wifi_request_sleep(void) +@brief Request from WINC3400 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning This API is currently unsupported on the WINC3400 +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime) +{ + int8_t ret = M2M_SUCCESS; + uint8_t psType; + psType = hif_get_sleep_mode(); + if (psType == M2M_PS_MANUAL) + { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8_t*)&strPs, sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); +@brief Set the WINC3400 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if (u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) + { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + //pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength ++; + memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8_t*)&strDeviceName, sizeof(tstrM2MDeviceNameConfig), NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); +@brief Configures what NTP server the SNTP client should use. +@param [in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). +@param [in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH +@param [in] useDHCP + Should the NTP server provided by the DHCP server be used. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP) +{ + tstrM2MSNTPConfig strSNTPConfig; + if (u8NTPServerNameLength > M2M_NTP_MAX_SERVER_NAME_LENGTH) + return M2M_ERR_FAIL; + + memcpy((uint8_t*)strSNTPConfig.acNTPServer, pu8NTPServerName, u8NTPServerNameLength); + strSNTPConfig.acNTPServer[u8NTPServerNameLength] = '\0'; + + strSNTPConfig.enuUseDHCP = useDHCP; + + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONFIG_SNTP, + (uint8_t*)&strSNTPConfig, sizeof(tstrM2MSNTPConfig), NULL, 0, 0); +} + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Get the WINC Chip ID. + +@return + The function SHALL return chipID >0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void) +{ + return nmi_get_chipid(); +} + +/*! +@fn int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t ota_hif_info = 0; + + ret = nm_get_hif_info(NULL, &ota_hif_info); + if (ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(ota_hif_info); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrM2MAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_start_provision_mode_ext(&strM2MAPModeConfig, pcHttpServerDomainName, bEnableHttpRedirect); +} + +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ((pstrAPModeConfig != NULL)) + { + tstrM2MProvisionModeConfig strProvConfig; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPModeConfig)) + { + memcpy((uint8_t*)&strProvConfig.strApConfig, (uint8_t*)&pstrAPModeConfig->strApConfig, sizeof(tstrM2MAPConfig)); + memcpy((uint8_t*)&strProvConfig.strApConfigExt, (uint8_t*)&pstrAPModeConfig->strApConfigExt, sizeof(tstrM2MAPConfigExt)); + if ((strlen((const char*)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) + { + M2M_ERR("INVALID DOMAIN NAME\r\n"); + goto ERR1; + } + memcpy((uint8_t*)strProvConfig.acHttpServerDomainName, (uint8_t*)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); + + if (s8Ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. We can use the same structure here as + // the firmware only uses to the HIF message to determine whether or not the + // structure contains a tstrM2MAPConfigExt structure. + s8Ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, + sizeof(tstrM2MProvisionModeConfig), + NULL, + 0, + 0 + ); + } + } + else + { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +int8_t m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8_t*)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} + +/*! + * @fn int8_t m2m_wifi_get_system_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_system_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_wifi_get_system_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_enable_sntp(uint8_t bEnable) +{ + uint8_t u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); +@brief Change the power profile mode\n + Not implemented in WINC3400 firmware. +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_POWER_PROFILE, (uint8_t*)&strM2mPwrMode, sizeof(tstrM2mPwrMode), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_TX_POWER, (uint8_t*)&strM2mTxPwrLevel, sizeof(tstrM2mTxPwrLevel), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_ENABLE_LOGS, (uint8_t*)&strM2mEnableLogs, sizeof(tstrM2mEnableLogs), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); +@brief Set the battery voltage to update the firmware calculations. \n + Not implemented in WINC3400 firmware. +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, (uint8_t*)&strM2mBattVol, sizeof(tstrM2mBatteryVoltage), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_prng_get_random_bytes(uint8_t * pu8PrngBuff,uint16_t u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize) +{ + int8_t ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if ((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)))&&(pu8PrngBuff != NULL)) + { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_PRNG|M2M_REQ_DATA_PKT, (uint8_t*)&strRng, sizeof(tstrPrng), NULL, 0, 0); + } + else + { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\r\n", u16PrngSize); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t* pu8MulticastMacAddress, uint8_t u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove) +{ + int8_t s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if (pu8MulticastMacAddress != NULL) + { + strMulticastMac.u8AddRemove = u8AddRemove; + memcpy(strMulticastMac.au8macaddress, pu8MulticastMacAddress, M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n", strMulticastMac.au8macaddress[0], strMulticastMac.au8macaddress[1], strMulticastMac.au8macaddress[2], strMulticastMac.au8macaddress[3], strMulticastMac.au8macaddress[4], strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_MCAST, (uint8_t*)&strMulticastMac, sizeof(tstrM2MMulticastMac), NULL, 0, 0); + } + + return s8ret; +} + +/*! +@fn \ + int8_t m2m_wifi_set_receive_buffer(void* pvBuffer,uint16_t u16BufferLen); + +@brief + set the Ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the Ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen) +{ + int8_t s8ret = M2M_SUCCESS; + if (pvBuffer != NULL) + { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize= u16BufferLen; + } + else + { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} + +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 1; + if (0 == bEnableDhcp || 1 == bEnableDhcp) + { + strWiFiRoaming.u8EnableDhcp = bEnableDhcp; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, + (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); + } + else + { + return M2M_ERR_INVALID_ARG; + } +} + +int8_t m2m_wifi_disable_roaming(void) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 0; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); +} + +/*! +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Send an encapsulated Atmel BLE API message + +@param [in] msg + Pointer to the Atmel BLE API message raw bytes +@param [in] len + Length of the msg + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len) +{ + tstrM2mBleApiMsg bleTx; + bleTx.u16Len = len; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_BLE_API_SEND | M2M_REQ_DATA_PKT, + (uint8_t*)&bleTx, sizeof(tstrM2mBleApiMsg), msg, len, sizeof(tstrM2mBleApiMsg)); +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/nmasic.c b/AudioConsole.X/Source/winc3400_142/driver/source/nmasic.c new file mode 100644 index 0000000..5ea608b --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/nmasic.c @@ -0,0 +1,706 @@ +/******************************************************************************* + File Name: + nmasic.c + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmasic.h" +#include "m2m_types.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) + +#define CORT_HOST_COMM (0x14) +#define HOST_CORT_COMM (0x0e) +#define WAKE_CLK_REG (0x1) +#define CLOCKS_EN_REG (0x13) + +#define TIMEOUT (2000) +#define WAKEUP_TRIALS (4) + +int8_t chip_apply_conf(uint32_t u32Conf) +{ + int8_t ret = M2M_SUCCESS; + uint32_t val32 = u32Conf; + +#ifdef __ENABLE_PMU__ + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if(val32 != 0) { + uint32_t reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if(ret == M2M_SUCCESS) { + if(reg == val32) + break; + } + } else { + break; + } + } while(1); + + return M2M_SUCCESS; +} + +void chip_idle(void) +{ + uint32_t reg =0; + nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(reg&NBIT1) + { + reg &=~NBIT1; + nm_write_reg(WAKE_CLK_REG, reg); + } +} + +void enable_rf_blocks(void) +{ + nm_write_reg(0x6, 0xdb); + nm_write_reg(0x7, 0x6); + nm_sleep(10); + nm_write_reg(0x1480, 0); + nm_write_reg(0x1484, 0); + nm_sleep(10); + + nm_write_reg(0x6, 0x0); + nm_write_reg(0x7, 0x0); +} + +int8_t enable_interrupts(void) +{ + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + return M2M_SUCCESS; +} + +int8_t cpu_start(void) { + uint32_t reg = 0; + int8_t ret; + + /** + reset regs + */ + ret = nm_write_reg(BOOTROM_REG, 0); + ret += nm_write_reg(NMI_STATE_REG, 0); + ret += nm_write_reg(NMI_REV_REG, 0); + + /** + Go... + **/ + ret += nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= NBIT0; + ret += nm_write_reg(0x1118, reg); + ret = nm_write_reg(0x150014, 0x1); //DTODO WHY IS THIS HERE?? + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_sleep(1); /* Removing this can cause a bus error. */ + return ret; +} + +uint32_t nmi_get_chipid(void) +{ + static uint32_t chipid = 0; + + if (chipid == 0) { + uint32_t rfrevid; + + if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if (chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if (chipid == 0x1002b0) { + if (rfrevid == 3) { /* 1002B0 */ + } else if (rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if(chipid == 0x1000f0) { + /* For 3400, the WiFi chip ID register reads 0x1000f0. + * Therefore using BT chip ID register here which should read 0x3000D0 + */ +#define rBT_CHIP_ID_REG (0x3b0000) + if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if(chipid == 0x3000d0) { + if(rfrevid == 6) { + chipid = 0x3000d1; + } + else if(rfrevid == 2) { + chipid = 0x3000d2; + } + } + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if(chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if((chipid & 0xf00000) == 0x300000) { + if(flashid == 0x1440ef) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } + } else { + if(flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if(flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } + } +#else + /*M2M is by default have SPI flash*/ + if((chipid & 0xf00000) == 0x300000) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } else { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32_t nmi_get_rfrevid(void) +{ + uint32_t rfrevid; + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if(REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32_t pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); + +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32_t val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} + +int8_t chip_sleep(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + + while(1) + { + ret = nm_read_reg_with_ret(CORT_HOST_COMM, ®); + if(ret != M2M_SUCCESS) goto ERR1; + if((reg & NBIT0) == 0) break; + } + + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT1) + { + reg &=~NBIT1; + ret = nm_write_reg(WAKE_CLK_REG, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT0) + { + reg &= ~NBIT0; + ret = nm_write_reg(HOST_CORT_COMM, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +int8_t chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, clk_status_reg = 0, trials = 0; + + nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + + if(!(reg & NBIT0)) + { + /*USE bit 0 to indicate host wakeup*/ + ret = nm_write_reg(HOST_CORT_COMM, reg|NBIT0); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + } + + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + + /* Set bit 1 */ + if(!(reg & NBIT1)) + { + ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + } + + do + { + ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + if(ret != M2M_SUCCESS) { + M2M_ERR("Bus error (5).%d %" PRIx32 "\n", ret, clk_status_reg); + goto _WAKE_EXIT; + } + if (clk_status_reg & NBIT2) { + break; + } + nm_sleep(2); + trials++; + if (trials > WAKEUP_TRIALS) + { + M2M_ERR("Failed to wakeup the chip\n"); + ret = M2M_ERR_TIME_OUT; + goto _WAKE_EXIT; + } + } while(1); + /* Workaround sometimes spi fail to read clock regs after reading/writing clockless registers */ + //nm_bus_reset(); +_WAKE_EXIT: + return ret; +} + +int8_t chip_reset_and_cpu_halt(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = chip_wake(); + if (ret != M2M_SUCCESS) { + return ret; + } + chip_reset(); + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } + nm_write_reg(BOOTROM_REG, 0); + nm_write_reg(NMI_STATE_REG, 0); + nm_write_reg(NMI_REV_REG, 0); + nm_write_reg(NMI_PIN_MUX_0, 0x11111000); + return ret; +} +int8_t chip_reset(void) +{ + int8_t ret = M2M_SUCCESS; + + ret += nm_write_reg(NMI_GLB_RESET_0, 0); + nm_sleep(50); + return ret; +} + +int8_t wait_for_bootrom(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + uint32_t u32GpReg1 = 0; + + reg = 0; + while(1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_sleep(1); /* Removing this can cause a bus error. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if(reg == 0) + { + while(reg != M2M_FINISH_BOOT_ROM) + { + nm_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if (++cnt > TIMEOUT) + { + M2M_DBG("failed to load firmware from flash.\r\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if (M2M_WIFI_MODE_CONFIG == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + } else if (M2M_WIFI_MODE_ETHERNET == arg) { + u32GpReg1 = rHAVE_ETHERNET_MODE_BIT; + } else { + /*bypass this step*/ + } + + if (REV(nmi_get_chipid()) == REV_3A0) + { + chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT); + } + else + { + chip_apply_conf(u32GpReg1); + } + + nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +int8_t wait_for_firmware_start(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + volatile uint32_t regAddress = NMI_STATE_REG; + volatile uint32_t checkValue = M2M_FINISH_INIT_STATE; + + if(M2M_WIFI_MODE_CONFIG == arg) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_START_VALUE;//M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) + { + nm_sleep(2); /* Removing this can cause a bus error. */ + M2M_DBG("%x %x %x\r\n", (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x14A0)); + if (nm_read_reg_with_ret(regAddress, ®) != M2M_SUCCESS) + { + // ensure reg != checkValue + reg = !checkValue; + } + if (++cnt > TIMEOUT) + { + M2M_DBG("Time out for wait firmware Run\r\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if (M2M_FINISH_INIT_STATE == checkValue) + { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +int8_t chip_deinit(void) +{ + uint32_t reg = 0; + int8_t ret; + uint8_t timeout = 10; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\r\n"); + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while writing reg\r\n"); + return ret; + } + + do { + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while reading reg\r\n"); + return ret; + } + /*Workaround to ensure that the chip is actually reset*/ + if ((reg & (1 << 10))) { + M2M_DBG("Bit 10 not reset retry %d\r\n", timeout); + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + timeout--; + } else { + break; + } + } while (timeout); + + return ret; +} + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +int8_t set_gpio_val(uint8_t gpio, uint8_t val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + *val = (uint8_t)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + int8_t s8Ret; + uint32_t val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\r\n"); + goto _EXIT; + } + if (enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\r\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8_t*)&strgp,sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if (!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\r\n"); + memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\r\n"); + u32RegValue >>=16; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + if (pu8IsValid) *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if (pu8IsValid) *pu8IsValid = 0; + return ret; +} + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &=0x0000ffff; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + +_EXIT_ERR: + return ret; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/nmbus.c b/AudioConsole.X/Source/winc3400_142/driver/source/nmbus.c new file mode 100644 index 0000000..60bcada --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/nmbus.c @@ -0,0 +1,248 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.c + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +#include "nmbus.h" +#include "nmspi.h" + +#define MAX_TRX_CFG_SZ 8 +#define NM_BUS_MAX_TRX_SZ 256 + +/** +* @struct tstrNmBusCapabilities +* @brief Structure holding bus capabilities information +* @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI +*/ +typedef struct +{ + uint16_t u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +tstrNmBusCapabilities egstrNmBusCapabilities = +{ + NM_BUS_MAX_TRX_SZ +}; + +/* +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +static int8_t nm_bus_init(void *pvinit) +{ + nm_reset(); + nm_sleep(1); + return M2M_SUCCESS; +} + +/* +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +*/ +static int8_t nm_bus_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal); + + return ret; +} + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void) +{ + return nm_spi_reset(); +} + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr) +{ + int8_t ret = M2M_SUCCESS; + return ret; +} +/* + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr) +{ + return nm_spi_read_reg(u32Addr); +} + +/* + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + return nm_spi_read_reg_with_ret(u32Addr, pu32RetVal); +} + +/* + * @fn nm_write_reg + * @brief write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + return nm_spi_write_reg(u32Addr, u32Val); +} + +static inline int8_t p_nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_read_block(u32Addr, puBuf, u16Sz); +} +/* + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static inline int8_t p_nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_write_block(u32Addr, puBuf, u16Sz); +} +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/nmdrv.c b/AudioConsole.X/Source/winc3400_142/driver/source/nmdrv.c new file mode 100644 index 0000000..421638a --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/nmdrv.c @@ -0,0 +1,410 @@ +/******************************************************************************* + File Name: + nmdrv.c + + Summary: + This module contains WINC3400 M2M driver APIs implementation. + + Description: + This module contains WINC3400 M2M driver APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmdrv.h" +#include "nmasic.h" +#include "m2m_types.h" + +#include "nmspi.h" + +static tenuNmState genuNmState = NM_STATE_DEINIT; +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + if(ret == M2M_SUCCESS) + { + if(pu16FwHifInfo != NULL) + { + *pu16FwHifInfo = (uint16_t)reg; + } + if(pu16OtaHifInfo) + { + *pu16OtaHifInfo = (uint16_t)(reg>>16); + } + } + return ret; +} + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_firmware_full_info(tstrM2mRev *pstrRev) +{ + uint16_t fw_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(&fw_hif_info, NULL); + + M2M_INFO("Fw HIF: %04x\r\n", fw_hif_info); + if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("Firmware HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("Firmware ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("Firmware Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(fw_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent Firmware Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_ERR("Unknown Firmware Version\r\n"); + } + return ret; +} +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev *pstrRev) +{ + uint16_t ota_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(NULL, &ota_hif_info); + + M2M_INFO("OTA HIF: %04x\r\n", ota_hif_info); + if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("OTA HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("OTA ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("OTA Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(ota_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent OTA Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_INFO("No valid OTA image\r\n"); + } + return ret; +} + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + + nm_spi_lock_init(); + + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300, 0); + + genuNmState = NM_STATE_INIT; +ERR1: + return ret; +} + +int8_t nm_drv_init_hold(void) +{ + int8_t ret = M2M_SUCCESS; + + nm_spi_lock_init(); + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + +#ifdef NO_HW_CHIP_EN + ret = chip_wake(); + nm_sleep(10); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\r\n"); + goto ERR2; + } + + /** + Go... + **/ + ret = chip_reset(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } +#endif + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + /*return power save to default value*/ + chip_idle(); + + genuNmState = NM_STATE_INIT; + + return ret; +#ifdef NO_HW_CHIP_EN +ERR2: + nm_bus_iface_deinit(); +#endif +ERR1: + return ret; +} + +int8_t nm_drv_init_start(void * arg) +{ + int8_t ret = M2M_SUCCESS; + uint8_t u8Mode = M2M_WIFI_MODE_NORMAL; + + if(NULL != arg) + { + u8Mode = *((uint8_t *)arg); + if(u8Mode < M2M_WIFI_MODE_NORMAL || u8Mode >= M2M_WIFI_MODE_MAX) + u8Mode = M2M_WIFI_MODE_NORMAL; + } + + ret = cpu_start(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if(M2M_WIFI_MODE_CONFIG == u8Mode) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\r\n"); + goto ERR2; + } + + genuNmState = NM_STATE_START; + + return ret; +ERR2: + nm_bus_iface_deinit(); + nm_spi_deinit(); +ERR1: + return ret; +} + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_drv_init_hold(); + + if(ret == M2M_SUCCESS) + ret = nm_drv_init_start(arg); + + return ret; +} + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + */ +int8_t nm_drv_deinit(void* arg) +{ + int8_t ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\r\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\r\n"); + goto ERR1; + } + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); + +ERR1: + genuNmState = NM_STATE_DEINIT; + + return ret; +} + + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void) +{ + int8_t ret; + + ret = cpu_start(); + return ret; +} + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void) +{ + return genuNmState; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/driver/source/nmspi.c b/AudioConsole.X/Source/winc3400_142/driver/source/nmspi.c new file mode 100644 index 0000000..abea122 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/driver/source/nmspi.c @@ -0,0 +1,978 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.c + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* + * Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. + * + * Subject to your compliance with these terms, you may use Microchip software + * and any derivatives exclusively with Microchip products. It is your + * responsibility to comply with third party license terms applicable to your + * use of third party software (including open source software) that may + * accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER + * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED + * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND + * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS + * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE + * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN + * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + *******************************************************************************/ + +//#include "osal/osal.h" +#include "nm_common.h" + +#include "nmspi.h" +#include "spi.h" +#include "BoardCfg.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_spi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c) +#define NMI_SPI_MISC_CTRL (NMI_SPI_REG_BASE+0x48) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +//#define CMD_DMA_WRITE 0xc1 +//#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +//#define CMD_TERMINATE 0xc5 +//#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 0 +#define N_FAIL -1 +#define N_RESET -2 +#define N_RETRY -3 + +#define SPI_RESP_RETRY_COUNT (10) +#define SPI_RETRY_COUNT (10) +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8_t gu8Crc_off = 0; +unsigned char mWifiSPIBaudrate; + +//static OSAL_MUTEX_HANDLE_TYPE s_spiLock = 0; + +static inline int8_t spi_read(uint8_t *b, uint16_t sz) +{ + //JFM WINC Low Level + int i; + WIFI_SPI_SS_PIN = 0; + for(i = 0; i < sz; i++) + { + *b++ = SPITransaction(0xAA,mWifiSPIBaudrate); + } + WIFI_SPI_SS_PIN = 1; + + + return N_OK; + +} + +static inline int8_t spi_write(uint8_t *b, uint16_t sz) +{ + + //JFM WINC Low Level + int i; + WIFI_SPI_SS_PIN = 0; + for(i = 0; i < sz; i++) + { + SPITransaction(*b++,mWifiSPIBaudrate); + } + WIFI_SPI_SS_PIN = 1; + + return N_OK; +} + +/******************************************** + + Crc7 + + ********************************************/ + +static const uint8_t crc7_syndrome_table[256] = { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, + 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, + 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, + 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, + 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, + 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, + 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, + 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, + 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, + 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, + 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, + 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, + 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, + 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, + 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, + 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, + 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, + 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, + 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, + 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, + 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, + 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, + 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, + 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, + 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, + 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, + 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, + 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, + 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 +}; + +static uint8_t crc7_byte(uint8_t crc, uint8_t data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static uint8_t crc7(uint8_t crc, const uint8_t *buffer, uint32_t len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + +/******************************************** + + Spi protocol Function + + ********************************************/ + +static int8_t spi_cmd(uint8_t cmd, uint32_t adr, uint32_t u32data, uint32_t sz, uint8_t clockless) +{ + uint8_t bc[9]; + uint8_t len = 5; + + bc[0] = cmd; + switch (cmd) + { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + len = 5; + break; + + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8_t)adr; + bc[3] = 0x00; + len = 5; + break; +#ifdef CMD_TERMINATE + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif +#ifdef CMD_REPEAT + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; +#if defined(CMD_DMA_WRITE) || defined(CMD_DMA_READ) + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 8); + bc[5] = (uint8_t)(sz); + len = 7; + break; +#endif + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 16); + bc[5] = (uint8_t)(sz >> 8); + bc[6] = (uint8_t)(sz); + len = 8; + break; + + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8_t)(adr); + bc[3] = (uint8_t)(u32data >> 24); + bc[4] = (uint8_t)(u32data >> 16); + bc[5] = (uint8_t)(u32data >> 8); + bc[6] = (uint8_t)(u32data); + len = 8; + break; + + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)(adr); + bc[4] = (uint8_t)(u32data >> 24); + bc[5] = (uint8_t)(u32data >> 16); + bc[6] = (uint8_t)(u32data >> 8); + bc[7] = (uint8_t)(u32data); + len = 9; + break; + + default: + return N_FAIL; + } + + if (!gu8Crc_off) + { + bc[len-1] = (crc7(0x7f, (const uint8_t *)&bc[0], len-1)) << 1; + } + else + { + len -= 1; + } + + if (N_OK != spi_write(bc, len)) + { + M2M_ERR("[spi_cmd]: Failed cmd write, bus error...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_cmd_rsp(uint8_t cmd) +{ + uint8_t rsp; + int8_t s8RetryCnt; + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) +#ifdef CMD_TERMINATE + || (cmd == CMD_TERMINATE) +#endif +#ifdef CMD_REPEAT + || (cmd == CMD_REPEAT) +#endif + ) + { + if (N_OK != spi_read(&rsp, 1)) + return N_FAIL; + } + + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != cmd) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + /** + State response + **/ + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != 0x00) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_reset(void) +{ + nm_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + nm_sleep(1); +} + +/******************************************** + + Spi Internal Read/Write Function + + ********************************************/ + +static int8_t spi_data_read(uint8_t *b, uint16_t sz,uint8_t clockless) +{ + int16_t retry, ix, nbytes; + int8_t result = N_OK; + uint8_t crc[2]; + uint8_t rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Response header + **/ + retry = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_data_read]: Failed data response read, bus error...\r\n"); + result = N_FAIL; + break; + } + if ((rsp & 0xf0) == 0xf0) + break; + } + while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) + { + M2M_ERR("[spi_data_read]: Failed data response read...(%02x)\r\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (N_OK != spi_read(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_read]: Failed data block read, bus error...\r\n"); + result = N_FAIL; + break; + } + if(!clockless) + { + /** + Read Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_read(crc, 2)) + { + M2M_ERR("[spi_data_read]: Failed data block CRC read, bus error...\r\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static int8_t spi_data_write(uint8_t *b, uint16_t sz) +{ + int16_t ix = 0; + uint16_t nbytes; + int8_t result = N_OK; + uint8_t cmd, order, crc[2] = {0}; + //uint8_t rsp; + + /** + Data + **/ + do + { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } + else + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + + cmd |= order; + if (N_OK != spi_write(&cmd, 1)) + { + M2M_ERR("[spi_data_write]: Failed data block cmd write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (N_OK != spi_write(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_write]: Failed data block write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_write(crc, 2)) + { + M2M_ERR("[spi_data_write]: Failed data block CRC write, bus error...\r\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } + while (sz); + + return result; +} + +/******************************************** + + Spi interfaces + + ********************************************/ + +static int8_t spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t cmd = CMD_SINGLE_WRITE; + uint8_t clockless = 0; + + if (u32Addr <= 0x30) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, u32Val, 4, clockless) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd response, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t len; + uint8_t rsp[3]; + + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_WRITE, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_WRITE) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd response, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_write(puBuf, u16Sz) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed block data write...\r\n"); + return N_FAIL; + } + /** + Data RESP + **/ + if (!gu8Crc_off) + len = 2; + else + len = 3; + + if (N_OK != spi_read(&rsp[0], len)) + { + M2M_ERR("[spi_write_block]: Failed bus error...\r\n"); + return N_FAIL; + } + + if((rsp[len-1] != 0) || (rsp[len-2] != 0xC3)) + { + M2M_ERR("[spi_write_block]: Failed data response read, %x %x %x\r\n", rsp[0], rsp[1], rsp[2]); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_read_reg(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t cmd = CMD_SINGLE_READ; + uint8_t tmp[4]; + uint8_t clockless = 0; + + if (u32Addr <= 0xff) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, 0, 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd response, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /* to avoid endianess issues */ + if (spi_data_read(&tmp[0], 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed data read...\r\n"); + return N_FAIL; + } + + *pu32RetVal = ((uint32_t)tmp[0]) | + ((uint32_t)tmp[1] << 8) | + ((uint32_t)tmp[2] << 16) | + ((uint32_t)tmp[3] << 24); + + return N_OK; +} + +static int8_t spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_READ, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_READ) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd response, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_read(puBuf, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed block data read...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_init_pkt_sz(void) +{ + uint32_t val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE+0x24); + val32 &= ~(0x7 << 4); + switch(DATA_PKT_SZ) + { + case 256: val32 |= (0 << 4); break; + case 512: val32 |= (1 << 4); break; + case 1024: val32 |= (2 << 4); break; + case 2048: val32 |= (3 << 4); break; + case 4096: val32 |= (4 << 4); break; + case 8192: val32 |= (5 << 4); break; + } + nm_spi_write_reg(SPI_BASE+0x24, val32); +} + +/******************************************** + + Bus interfaces + + ********************************************/ + +int8_t nm_spi_reset(void) +{ + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; +} + +void nm_spi_lock_init(void) +{ + // OSAL_MUTEX_Create(&s_spiLock); +} + +/* + * @fn nm_spi_init + * @brief Initialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_init(void) +{ + uint32_t chipid; + uint32_t reg = 0; + + mWifiSPIBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, WIFI_MODULE_SPI_BAUDRATE); + + /** + configure protocol + **/ + gu8Crc_off = 0; + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nm_spi_init]: Failed internal read protocol with CRC on, retrying with CRC off...\r\n"); + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + // Reaad failed with both CRC on and off, something went bad + M2M_ERR("[nm_spi_init]: Failed internal read protocol...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + } + if(gu8Crc_off == 0) + { + reg &= ~0xc; /* disable CRC checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + + if (nm_spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Failed internal write protocol reg...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (nm_spi_read_reg_with_ret(0x1000, &chipid) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Fail cmd read chip id...\r\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nm_spi_init]: chipid (%08x)\r\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_deinit(void) +{ + gu8Crc_off = 0; + // OSAL_MUTEX_Delete(&s_spiLock); + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_spi_read_reg(uint32_t u32Addr) +{ + uint32_t u32Val; + + nm_spi_read_reg_with_ret(u32Addr, &u32Val); + + return u32Val; +} + +/* + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_read_reg(u32Addr, pu32RetVal) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 "\r\n", retry, u32Addr); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_write_reg(u32Addr, u32Val) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %" PRIx32 "\r\n", retry, u32Addr, u32Val); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + uint8_t tmpBuf[2] = {0,0}; + uint8_t *puTmpBuf; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + if (u16Sz == 1) + { + u16Sz = 2; + puTmpBuf = tmpBuf; + } + else + { + puTmpBuf = puBuf; + } + + while(retry--) + { + if (spi_read_block(u32Addr, puTmpBuf, u16Sz) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + if (puTmpBuf == tmpBuf) + *puBuf = *tmpBuf; + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + //Workaround hardware problem with single byte transfers over SPI bus + if (u16Sz == 1) + u16Sz = 2; + + while(retry--) + { + if (spi_write_block(u32Addr, puBuf, u16Sz) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h b/AudioConsole.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..8ca7251 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h @@ -0,0 +1,347 @@ +/******************************************************************************* + BSD compatible socket interface internal types. + + File Name: + m2m_socket_host_if.h + + Summary: + + Description: + +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + +#define ALPN_LIST_MIN_SIZE 4 +#define ALPN_LIST_MAX_SIZE 32 +/*!< + Maximum length of ALPN list that can be specified by the application. + The list is in the following format: + @verbatim + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + @endverbatim +*/ + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invalid Socket command value. +*/ + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + uint16_t u16Family; + uint16_t u16Port; + uint32_t u32IPAddr; +} tstrSockAddr; + + +//typedef int8_t SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + + + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct { + char acHostName[HOSTNAME_MAX_SIZE]; + uint32_t u32HostIP; +} tstrDnsReply; + + +/*! +@brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrBindCmd; + + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrBindReply; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8BackLog; + uint16_t u16SessionID; +} tstrListenCmd; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrListenReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16_t u16Void; +} tstrAcceptReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8SslFlags; + uint16_t u16SessionID; +} tstrConnectCmd; + + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct { + SOCKET sock; + int8_t s8Error; + /*!< + 0 for successful connection, in which case u16AppDataOffset is valid. + Negative for failed connection, in which case u8ErrorType and u8ErrorDetail may give more info. + */ + union { + uint16_t u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ + struct { + uint8_t u8ErrSource; + /*!< + 0: No detail + 1: TLS Alert received from peer + 2: TLS Alert generated locally + */ + uint8_t u8ErrCode; + /*!< + For TLS Alerts, this is the Alert ID. + */ + }; + }; +} tstrConnectReply; + + +/*! +@struct \ + tstrConnectAlpnReply + +@brief + Connect Reply, contains sock number, error value and index of negotiated application protocol. +*/ +typedef struct{ + tstrConnectReply strConnReply; + uint8_t u8AppProtocolIdx; + /*!< + 1-based index of application-layer protocol negotiated during TLS handshake. + */ + uint8_t __PAD24__[3]; +}tstrConnectAlpnReply; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + uint8_t u8Void; + uint16_t u16DataSize; + tstrSockAddr strAddr; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendCmd; + + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct { + SOCKET sock; + uint8_t u8Void; + int16_t s16SentBytes; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32Timeoutmsec; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; + uint16_t u16BufLen; +} tstrRecvCmd; + + +/*! +@struct \ + tstrRecvReply +@brief +*/ +typedef struct { + tstrSockAddr strRemoteAddr; + int16_t s16RecvStatus; + uint16_t u16DataOffset; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrRecvReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32OptionValue; + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; +} tstrSetSocketOptCmd; + + +typedef struct { + SOCKET sslSock; + uint8_t __PAD24__[3]; +} tstrSSLSocketCreateCmd; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; + uint32_t u32OptLen; + uint8_t au8OptVal[SSL_MAX_OPT_LEN]; +} tstrSSLSetSockOptCmd; + + +/*! +*/ +typedef struct { + uint32_t u32DestIPAddr; + uint32_t u32CmdPrivate; + uint16_t u16PingCount; + uint8_t u8TTL; + uint8_t __PAD8__; +} tstrPingCmd; + + +typedef struct { + uint32_t u32IPAddr; + uint32_t u32CmdPrivate; + uint32_t u32RTT; + uint16_t u16Success; + uint16_t u16Fail; + uint8_t u8ErrorCode; + uint8_t __PAD24__[3]; +} tstrPingReply; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/socket/include/netinet_in.h b/AudioConsole.X/Source/winc3400_142/socket/include/netinet_in.h new file mode 100644 index 0000000..b4b4e2f --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/include/netinet_in.h @@ -0,0 +1,95 @@ +/******************************************************************************* + Company: + Microchip Technology Inc. + + File Name: + netinet_in.h + + Summary: + + Description: + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NETINET_IN_H +#define _NETINET_IN_H + +#include +#include + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + extern "C" { +#endif +// DOM-IGNORE-END + +typedef uint32_t in_addr_t; + +struct in_addr { + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ + in_addr_t s_addr; +}; + +struct sockaddr_in{ + uint16_t sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16_t sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + Must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + struct in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. + */ + uint8_t sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; + +const char *inet_ntop(int af, const void *src, char *dst, size_t size); +in_addr_t inet_addr(const char *cp); + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +// DOM-IGNORE-END + +#endif /* _NETINET_IN_H */ diff --git a/AudioConsole.X/Source/winc3400_142/socket/include/socket.h b/AudioConsole.X/Source/winc3400_142/socket/include/socket.h new file mode 100644 index 0000000..38d97bc --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/include/socket.h @@ -0,0 +1,2074 @@ +/******************************************************************************* + File Name: + socket.h + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup SOCKETAPI Socket + * BSD compatible socket interface between the host layer and the network + * protocol stacks in the firmware. + * These functions are used by the host application to send or receive + * packets and to do other socket operations. + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" +#include "netinet_in.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SOCKETDEF Defines + * @ingroup SOCKETAPI + * The following list of macros are used to define constants used throughout the socket layer, and SSL Socket options. + */ + +/**@defgroup IPDefines TCP/IP Defines + * @ingroup SOCKETDEF + * The following list of macros are used to define constants used throughout the socket layer. + * @{ + */ +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/m2m_socket_host_if.h + * The two definitions must match. +*/ +#define HOSTNAME_MAX_SIZE 100 +/*!< + Maximum allowed size for a host domain name passed to the function @ref gethostbyname. + command value. Used with the @ref setsockopt function. +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in structure. + (It is the only supported type for the current implementation.) +*/ + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_RAW 3 +/*!< + Socket type used for sending and receiving raw frames. + Raw socket expects and returns IP header. + Please note that SO_BROADCAST socket option is not currently supported when using RAW socket. + Similarly to SOCK_DGRAM it is oriented towards unreliable connectionless communication. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_SSL_ON instead. +*/ + +#define SOCKET_FLAGS_IPPROTO_RAW 0x02 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_RAW), to allow the Application to use a + socket of type raw to send/receive frames.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_IPPROTO_RAW instead. +*/ + +#define SOCKET_CONFIG_DEFAULT 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket to create + a socket with default configuration. +*/ + +#define SOCKET_CONFIG_SSL_OFF 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a socket not capable of + TLS. +*/ +#define SOCKET_CONFIG_SSL_ON 1 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2. +*/ +#define SOCKET_CONFIG_SSL_DELAY 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TCP socket which has the + potential to upgrade to a TLS socket later (by calling @ref secure).\n + Note that the total number of TLS sockets and potential TLS sockets is + limited to 2. +*/ + +#define SOCKET_CONFIG_IPPROTO_RAW 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the u8Type parameter is + @ref SOCK_RAW), to allow the Application to use a socket of type raw to send/receive frames. + This assumes that the application will fill the IP and protocol (UDP, TCP, ICMP) headers. + Typically, when sending ICMP frames via RAW socket, there are two options that can be used: + - IPPROTO_RAW - Raw IP packets, implies that IP_HDRINCL is enabled and therefore + the host application should fill in the corresponding protocol header checksum. + - IPPROTO_ICMP - ICMP packets, the WINC would fill in the ICMP header checksum (not supported). + @warning + Please note that only SOCKET_CONFIG_IPPROTO_RAW is currently supported. + Raw sockets can be used to send TCP/UDP/ICMP packets, however, the current implementation only + supports receiving Raw ICMP frames, which also requires @ref SO_ICMP_FILTER to be set appropriately. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define RAW_SOCK_MAX 1 +/*!< + Maximum number of simultaneous RAW sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX + RAW_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + +#define SOL_RAW 255 +/*!< + Raw Socket option level. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable UDP send callbacks.\n + 1: enable UDP send callbacks.\n + Default setting is enable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value. + Used with the @ref setsockopt function. +*/ + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value. + Used with the @ref setsockopt function. +*/ + +#define SO_TCP_KEEPALIVE 0x04 +/*!< + Socket option to enable or disable TCP keep-alive.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable TCP keep-alive.\n + 1: enable TCP keep-alive.\n + Default setting is disable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPIDLE 0x05 +/*!< + Socket option to set the time period after which the socket will trigger keep-alive transmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 2^32 - 1. + Default setting is 120 (60 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPINTVL 0x06 +/*!< + Socket option to set the time period between keep-alive retransmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 255. + Default setting is 1 (0.5 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPCNT 0x07 +/*!< + Socket option to set the number of keep-alive retransmissions to be carried out before declaring that the remote end is not available.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Maximum 255. + Default setting is 20. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_ICMP_FILTER 0x01 +/*!< + Socket option to set the ICMP filter for raw sockets when receiving.\n + Current implementation allows for a filter none (0) or filter all (anything else). + Filter none means that all ICMP frames will be delivered to the host via raw socket. + Filter all means that all ICMP frames will NOT be delivered to host and handled internally by the WINC (please note that fragmentation is not supported by the WINC). + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Default setting is 0 (filter none). + + @warning @ref bind and @ref shutdown will cause this setting to be lost, + so the application should only set this option after @ref bind. +*/ + +#define RAW_SOCK_ID (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Socket number to be used for RAW socket. +*/ + +/**@}*/ //IPDefines + + +/**@addtogroup TLSDefines + * @{ + */ +#define ALPN_LIST_MAX_APP_LENGTH 30 +/*!< + Maximum length of ALPN list that can be specified by the application. + This length includes separators (spaces) and terminator (NUL). +*/ +/**@}*/ // TLSDefines + +/** + * @defgroup TLSDefines TLS Defines + * @ingroup SOCKETDEF + * @ingroup SSLAPI +*/ + +/**@defgroup SSLSocketOptions TLS Socket Options + * @ingroup TLSDefines + * The following list of macros are used to define SSL Socket options. + * @{ + * @sa setsockopt + */ + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate verification + process. + It is recommended NOT to use this socket option in production software + applications. It is supported for debugging and testing purposes.\n + The option value should be casted to int type.\n + 0: do not bypass the X509 certificate verification process (default, + recommended).\n + 1: bypass the X509 certificate verification process.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The SNI is a NULL- + terminated string containing the server name associated with the + connection. Its size must not exceed @ref HOSTNAME_MAX_SIZE. If the SNI is + not a null string, then TLS Client Hello messages will include the SNI + extension.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + This option allow the TLS to cache the session information for fast TLS + session establishment in future connections using the TLS Protocol session + resume features.\n + The option value should be casted to int type.\n + 0: disable TLS session caching (default).\n + 1: enable TLS session caching.\n + Note that TLS session caching is always enabled in TLS Server Mode and this + option is ignored.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_CERTNAME_VALIDATION 0x04 +/*!< + Enable internal validation of server name against the server's + certificate subject common name. If there is no server name + provided (via the @ref SO_SSL_SNI option), setting this option + does nothing.\n + The option value should be casted to int type.\n + 0: disable server certificate name validation (default).\n + 1: enable server certificate name validation (recommended).\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ALPN 0x05 +/*!< + Set the list to use for Application-Layer Protocol Negotiation + for an SSL socket.\n + This option is intended for internal use and should not be + used by the application. Applications should use the API @ref + set_alpn_list. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Legacy name for @ref SO_SSL_ENABLE_CERTNAME_VALIDATION.\n +*/ +/**@}*/ //SSLSocketOptions + +/**@defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + +#define SSL_ECC_ONLY_CIPHERS \ +(\ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ +) +/*!< + All supported ciphers which use ECDSA. +*/ + +#define SSL_DEFAULT_CIPHERS \ +(\ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ +) +/*!< + All supported Non-ECC Ciphers. This is the default active group after startup. + Note that firmware may support only a subset of these. +*/ +/**@}*/ // SSLCipherSuiteID + +/**@defgroup SOCKETBYTEORDER Byte Order + * @ingroup SOCKETAPI + * The following list of macros are used to convert between host representation and network byte order. + * @{ + */ + +#ifdef _NM_BSP_BIG_END +#define _htonl(m) (m) +/*!< + Convert a 4-byte integer from the Host representation to Network byte order (Host is BE). +*/ +#define _htons(A) (A) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is BE). +*/ +#else +#define _htonl(m) \ + (uint32_t)(((uint32_t)(m << 24)) | ((uint32_t)((m & 0x0000FF00) << 8)) | ((uint32_t)((m & 0x00FF0000) >> 8)) | ((uint32_t)(((uint32_t)m) >> 24))) +/*!< + Convert a 4-byte integer from Host representation to Network byte order (Host is LE). +*/ + +#define _htons(A) (uint16_t)((((uint16_t) (A)) << 8) | (((uint16_t) (A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is LE). +*/ +#endif + + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from Network byte order to Host representation. +*/ + + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from Network byte order to Host representation. +*/ +/**@}*/ // SOCKETBYTEORDER + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SOCKETAPI + * The following list of macros are used to define the possible error codes. + * Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation. This code is also used with event @ref SOCKET_MSG_RECV if a socket connection is closed. + In that case, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a valid address + For example: bind is called without specifying a port number +*/ + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. Only one IP address per socket, and one socket per IP address is permitted - + any attempt for a new socket to bind with an IP address already bound to another open socket will return the following error code. +*/ + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through TCP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed. +*/ + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through UDP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a socket function. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies that @ref listen operation failed. +*/ + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be completed. + The @ref sendto function requires a destination address to send data. +*/ + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed (reset) by the peer. If this error is received, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has timed out. The socket remains open. +*/ + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ +/**@}*/ // SocketErrorCode + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** @defgroup SocketEnums Enumeration/Typedefs + * @ingroup SOCKETAPI + * Specific Enumeration-typedefs used for socket operations + * @{ + */ +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + The ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef int8_t SOCKET; + +/*! +@enum \ + tenuSockErrSource + +@brief + Source of socket error (local, remote or unknown). + +@see tstrSockErr +*/ + +typedef enum { + SOCKET_ERR_UNKNOWN = 0, + /*!< + No detail available (also used when there is no error). + */ + SOCKET_ERR_TLS_REMOTE, + /*!< + TLS Error Alert received from peer. + */ + SOCKET_ERR_TLS_LOCAL + /*!< + TLS Error Alert generated locally. + */ +} tenuSockErrSource; + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see + sockaddr_in +*/ +struct sockaddr { + uint16_t sa_family; + /*!< + Socket address family. + */ + uint8_t sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + tstrSockErr + +@brief + Detail about socket failures. Used with @ref get_error_detail. +*/ +typedef struct { + tenuSockErrSource enuErrSource; + /*!< + Source of socket error (local, remote or unknown). + */ + uint8_t u8ErrCode; + /*!< + TLS Alert code as defined in + https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-6. + */ +} tstrSockErr; +/**@}*/ //SocketEnums + +/**@defgroup AsyncCallback Asynchronous Events + * @ingroup SocketEnums + * Specific Enumeration used for asynchronous operations + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs make use of callback functions in-order to return back the results once the corresponding socket operation is completed. + Hence resuming the normal execution of the application code while the socket operation returns the results. + Callback functions expect event messages to be passed in, in-order to identify the operation they're returning the results for. + The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback functions, + a function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket operation. + +@see bind +@see listen +@see accept +@see connect +@see send +@see recv +*/ + +typedef enum { + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + Sendto socket event. + */ + SOCKET_MSG_RECVFROM, + /*!< + Recvfrom socket event. + */ + SOCKET_MSG_SECURE +/*!< + Existing socket made secure event. +*/ +} tenuSocketCallbackMsgType; + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind +*/ +typedef struct { + int8_t status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketBindMsg; + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen function. + This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback function. +@see + listen +*/ +typedef struct { + int8_t status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketListenMsg; + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept function. + This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback function. +*/ +typedef struct { + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with the remote peer. + Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +} tstrSocketAcceptMsg; + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to an asynchronous call to the @ref connect socket function + or the @ref secure socket function. + This structure and the event @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_SECURE are passed in parameters to the callback function. + If the application receives this structure with a negative value in s8Error, the application should call @ref close(). +*/ +typedef struct { + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the @ref connect or @ref secure function call. + */ + int8_t s8Error; + /*!< + Connect error code:\n + - ZERO for a successful connect or successful secure. \n + - Otherwise a negative error code corresponding to the type of error. + */ +} tstrSocketConnectMsg; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the @ref recv or @ref recvfrom socket functions. + This structure, together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM, is passed-in parameters to the callback function. +@remark + After receiving this structure, the application should issue a new call to @ref recv or @ref recvfrom in order to receive subsequent data. + In the case of @ref SOCKET_MSG_RECVFROM (UDP), any further data in the same datagram is dropped, then subsequent datagrams are buffered on the WINC until the application provides a buffer via a new call to @ref recvfrom. + In the case of @ref SOCKET_MSG_RECV (TCP), all subsequent data is buffered on the WINC until the application provides a buffer via a new call to @ref recv. + A negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. +*/ +typedef struct { + uint8_t *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + int16_t s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16_t u16RemainingSize; + /*!< + This field is used internally by the driver. In normal operation, this field will be 0 when the application receives this structure. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +} tstrSocketRecvMsg; +/**@}*/ // AsyncCallback + +/**@defgroup SocketCallbacks Callbacks + * @ingroup SOCKETAPI + * @{ + */ +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application callback through this function by calling @ref registerSocketCallback. + In response to events received, the following callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is received in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + - @ref SOCKET_MSG_SECURE + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb)(SOCKET sock, uint8_t u8Msg, void *pvMsg); + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref registerSocketCallback. + The following callback is triggered in response to an asynchronous call to the @ref gethostbyname function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in Network byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb)(uint8_t *pu8DomainName, uint32_t u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + @ref m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32_t u32IPAddr, uint32_t u32RTT, uint8_t u8ErrorCode); +/**@}*/ //SocketCallbacks + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SocketAPI Functions + * @ingroup SOCKETAPI + * The function performs the necessary initializations for the socket library through the following steps: + * - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + * in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + * - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + * - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + * This facilitates handling all of the socket related functions received through interrupts from the firmware. + * @{ + */ +/*! + * @fn void socketInit(void); + The function performs the necessary initialization for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based on the maximum number of + sockets @ref MAX_SOCKET which is tuned to the systems capability. +\section SocketExample1 Example +This example demonstrates the use of the socketInit for socket initialization for an mqtt chat application. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + char topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +void socketInit(void); + +/*! +@fn \ + void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked only after all desired socket operations have been performed on any active sockets. +*/ +void socketDeinit(void); + +/*! +@fn \ + uint8_t IsSocketReady(void); + +@see socketInit + socketDeinit +@return If the socket has been initialized and is ready. + Should return 1 after @ref socketInit and 0 after @ref socketDeinit +*/ +uint8_t IsSocketReady(void); + +/*! +@fn \ + void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering function. + The registered callback functions are used to retrieve information in response to the asynchronous socket functions called. +@param [in] socket_cb + Assignment of callback function to the global callback @ref tpfAppSocketCb gpfAppSocketCb. Delivers + socket messages to the host application. In response to the asynchronous function calls, such as @ref bind + @ref listen @ref accept @ref connect + +@param [in] resolve_cb + Assignment of callback function to the global callback @ref tpfAppResolveCb gpfAppResolveCb. + Used for DNS resolving functionality. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when DNS resolution is not required. + +@return void +@remarks + If any of the socket functionality is not to be used, NULL is passed in as a parameter. + It must be invoked after @ref socketInit and before other socket layer operations. + +\section SocketExample2 Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS resolution CB set to null + for a simple UDP server example. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + struct sockaddr_in addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +//void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); +void registerSocketEventCallback(tpfAppSocketCb socket_cb); +void registerSocketResolveCallback(tpfAppResolveCb resolve_cb); + +/*! +@fn \ + SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); + Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and their possible types are either TCP or a UDP sockets. + The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + - [SOCK_RAW](@ref SOCK_RAW) + +@param[in] u8Config + Used to specify the socket configuration. The interpretation of + this parameter depends on the setting of u8Type.\n + - When u8Type is [SOCK_STREAM](@ref SOCK_STREAM) the following configuration values + are defined:\n + - [SOCKET_CONFIG_SSL_OFF](@ref SOCKET_CONFIG_SSL_OFF): The socket is not secured by + TLS.\n + - [SOCKET_CONFIG_SSL_ON](@ref SOCKET_CONFIG_SSL_ON): The socket is secured by TLS.\n + - [SOCKET_CONFIG_SSL_DELAY](@ref SOCKET_CONFIG_SSL_DELAY): The socket is not secured + by TLS, but may be secured later, by calling @ref secure.\n + - When u8Type is [SOCK_RAW](@ref SOCK_RAW), the following configuration values + are defined:\n + - [SOCKET_CONFIG_IPPROTO_RAW](@ref SOCKET_CONFIG_IPPROTO_RAW): The socket is to be + used for raw ICMP frames.\n + - For all values of u8Type, the following configuration values + are defined:\n + - [SOCKET_CONFIG_DEFAULT](@ref SOCKET_CONFIG_DEFAULT): The default configuration.\n + All other configuration values are reserved and should not be + used. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket handler. + before any call to the @ref socket function can be made. + +@see + connect + secure + bind + listen + accept + recv + recvfrom + send + sendto + shutdown + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of available sockets. + +@remarks + The socket function must be called before any other related socket functions "e.g. send, recv, shutdown ..etc" +\section SocketExample3 Example + This example demonstrates the use of the socket function to allocate the socket, returning the socket handler to be used for other +socket operations. Socket creation is dependent on the socket type. +\subsection sub1 UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, SOCKET_CONFIG_DEFAULT); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_DEFAULT)); +@endcode +*/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); +/*! +\fn \ + int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Asynchronous bind function associates the provided address and local port to the socket. + The function can be used with both TCP and UDP sockets. It is mandatory to call the @ref bind function before starting any UDP or TCP server operation. + Upon socket bind completion, the application will receive a @ref SOCKET_MSG_BIND message in the socket callback. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see socket +@see connect +@see listen +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section SocketExample4 Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET,SOCK_DGRAM,SOCKET_CONFIG_DEFAULT); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(UDP_SERVER_PORT); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret == 0) + printf("Bind success!\n"); + else + { + printf("Bind Failed. Error code = %d\n",ret); + shutdown(udpServerSocket); + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t listen(SOCKET sock, uint8_t backlog); + + After successfully binding a socket to an IP address and port on the system, start listening passively for incoming connections. + The socket must be bound on a local port or the listen operation fails. + Upon the call to the asynchronous listen function, response is received through the event @ref SOCKET_MSG_LISTEN + in the socket callback. + + A successful listen means the TCP server operation is active. If a connection is accepted, then the application socket callback function is + notified with the new connected socket through the event @ref SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function + after calling @ref listen. + + After a connection is accepted, the user is then required to call @ref recv to receive any packets transmitted by the remote host or to receive notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see bind +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating invalid arguments were passed, such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section SocketExample5 Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8_t u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +int8_t listen(SOCKET sock, uint8_t backlog); +/*! +@fn \ + int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); + The function has no current implementation. An empty declaration is used to prevent errors when legacy application code is used. + As it has no effect, it can be safely removed from any application using it. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); +/*! +@fn \ + int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of the result of the connection attempt through the event @ref SOCKET_MSG_CONNECT, + along with a structure @ref tstrSocketConnectMsg. + If socket connection fails, the application should call @ref shutdown(). + A successful connect means the TCP session is active. The application is then required to make a call to the @ref recv function + to receive any packets transmitted by the remote server, unless the application is interrupted by a notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section SocketExample6 Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through the main function and how the + callback function handles the @ref SOCKET_MSG_CONNECT event. +\subsection sub3 Main Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,SOCKET_CONFIG_DEFAULT); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub4 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8_t acBuffer[GROWL_MSG_SIZE]; + uint16_t u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + shutdown(pstrNotification->Socket); + } + } +@endcode +*/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t secure(SOCKET sock); + + Converts an (insecure) TCP connection with a remote server into a secure TLS-over-TCP connection. + It may be called after both of the following:\n + - a TCP socket has been created by the @ref socket function, with u8Config parameter set to + @ref SOCKET_CONFIG_SSL_DELAY.\n + - a successful connection has been made on the socket via the @ref connect function. + This is an asynchronous API; the application socket callback function is notified of the result + of the attempt to make the connection secure through the event @ref SOCKET_MSG_SECURE, along + with a structure @ref tstrSocketConnectMsg. + If the attempt to make the connection secure fails, the application should call @ref close(). + +@param[in] sock + Socket ID, corresponding to a connected TCP socket. + +@pre + @ref socket and @ref connect must be called to connect a TCP socket before passing the socket ID to this function. + Value @ref SOCKET_CONFIG_SSL_DELAY must have been set in the u8Config parameter that was passed to @ref socket. + +@see + socket + connect + +@return + The function returns SOCK_ERR_NO_ERROR for successful operations and a negative error value otherwise. + The possible error values are: + - @ref SOCK_ERR_INVALID_ARG + Indicating passing invalid arguments such as negative socket ID. + + - @ref SOCK_ERR_INVALID + Indicating failure to process the request. +*/ +int8_t secure(SOCKET sock); +/*! +@fn \ + int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); + + An asynchronous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the two socket events + [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the socket is already connected to a remote + host. + The application receives the required data in response to this asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the + socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + - @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + - @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see socket +@see connect +@see bind +@see listen +@see recvfrom +@see shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample7 Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification of the accept or connect events, and the parsing of the + received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32TimeoutSeconds); + Receives data from a UDP Socket. + + The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + with successful status in the socket callback). + + Upon calling the recvfrom function with a successful return code, the application is expected to receive a notification + in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + + Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error @ref SOCK_ERR_TIMEOUT + + The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref bind function. + +@see + socket + bind + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample8 Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon notification of a successful bind event, and the parsing of the + received data when the SOCKET_MSG_RECVFROM event is received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16_t u16port = pstrRx->strRemoteAddr.sin_port; + uint32_t strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Received frame with size = %d.\tHost address=%x, Port number = %d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + ret = shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + Asynchronous sending function, used to send data on a TCP/UDP socket. + + Called by the application code when there is outgoing data available required to be sent on a specific socket handler. + The only difference between this function and the similar @ref sendto function, is the type of socket the data is sent on and the parameters passed in. + @ref send function is most commonly called for sockets in a connected state. + After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the data). + Hence this function is expected to be called after a successful socket connect operation(in client case or accept in the + the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order to send outgoing data + using the @ref send function, at least one successful call must be made to the @ref sendto function before consecutive calls to the @ref send function, + to ensure that the destination address is saved in the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifier through the prior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + * @return The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value otherwise. + */ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + +/*! + * @fn int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + * @brief Asynchronous sending function, used to send data on a UDP socket. + * Called by the application code when there is data required to be sent on a UDP socket. + * @details The application code is expected to receive data from a successfully bound socket node. + * The only difference between this function and the similar @ref send function, is the type of socket the data is received on. + * This function works only with UDP sockets. + * After the data is sent, the socket callback function registered using @ref registerSocketCallback(), is expected to receive an + * event of type @ref SOCKET_MSG_SENDTO. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] pvSendBuffer + * Pointer to a buffer holding data to be transmitted. + * A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] u16SendLength + * The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + * @param[in] flags + * Not used in the current implementation + * @param[in] pstrDestAddr + * The destination address. + * @param[in] u8AddrLen + * Destination address length in bytes. + * Not used in the current implementation, only included for BSD compatibility. + * @pre Sockets must be initialized using @ref socketInit. + * @see + * socketInit + * recvfrom + * sendto + * socket + * connect + * accept + * send + * @warning + * u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH.\n + * Use a valid socket (returned from socket). + * A valid buffer pointer must be used (not NULL).\n + * Successful completion of a call to sendto does not guarantee delivery of the message, + * A negative return value indicates only locally-detected errors. + * @return The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + +/*! + * @fn int8_t shutdown(SOCKET sock); + * @brief Synchronous shutdown function, releases all the socket assigned resources. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @pre + * Sockets must be initialized through the call of the socketInit function. + * @ref shutdown is called only for valid socket identifiers created through the @ref socket function. + * @warning If @ref shutdown is called while there are still pending messages (sent or received ) they will be discarded. + * @see socketInit, socket + * @return The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. + */ +int8_t shutdown(SOCKET sock); + +/*! + * @fn int8_t gethostbyname(const char *pcHostName); + * Asynchronous DNS resolving function. This function uses DNS to resolve a domain name to the corresponding IP address. + * A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS callback + * function registered using registerSocketCallback. + * @param[in] pcHostName + * NULL terminated string containing the domain name for the remote host. + * Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + * @see registerSocketCallback + * @warning + * Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + * a negative return value indicates only locally-detected errors + * @return + * - @ref SOCK_ERR_NO_ERROR + * - @ref SOCK_ERR_INVALID_ARG + */ +int8_t gethostbyname(const char *pcHostName); + +/*! +@fn \ + int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + + The setsockopt() function shall set the option specified by the option_name + argument, at the protocol level specified by the level argument, to the value + pointed to by the option_value argument for the socket specified by the socket argument. + +@param[in] socket + Socket handler. + +@param[in] u8Level + Protocol level.\n + Supported protocol levels are @ref SOL_SOCKET, @ref SOL_SSL_SOCKET and @ref SOL_RAW. + +@param[in] option_name + Option to be set.\n + For protocol level @ref SOL_SOCKET, the supported option names are:\n + @ref SO_SET_UDP_SEND_CALLBACK\n + @ref SO_TCP_KEEPALIVE\n + @ref SO_TCP_KEEPIDLE\n + @ref SO_TCP_KEEPINTVL\n + @ref SO_TCP_KEEPCNT\n + For protocol level @ref SOL_SSL_SOCKET, the supported option names are:\n + @ref SO_SSL_BYPASS_X509_VERIF\n + @ref SO_SSL_SNI\n + @ref SO_SSL_ENABLE_SESSION_CACHING\n + @ref SO_SSL_ENABLE_CERTNAME_VALIDATION\n + @ref SO_SSL_ALPN\n + For protocol level @ref SOL_RAW, the supported option names are:\n + @ref SO_ICMP_FILTER\n + +@param[in] option_value + Pointer to user provided value. + +@param[in] u16OptionLen + Length of the option value in bytes. Refer to each option documentation for the required length. + +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +*/ +int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + +/*! + * @fn int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + * @brief Get socket options retrieves. + * This Function isn't implemented yet but this is the form that will be released later. + * @param[in] sock + * Socket Identifier. + * @param[in] u8Level + * The protocol level of the option. + * @param[in] u8OptName + * The u8OptName argument specifies a single option to get. + * @param[out] pvOptValue + * The pvOptValue argument contains pointer to a buffer containing the option value. + * @param[out] pu8OptLen + * Option value buffer length. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + +/*! + * @fn int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + * @brief The function request to send ping request to the given IP Address. + * @param[in] u32DstIP + * Target Destination IP Address for the ping request. It must be represented in Network byte order. + * The function @ref nmi_inet_addr could be used to translate the dotted decimal notation IP + * to its Network bytes order integer representative. + * @param[in] u8TTL + * IP TTL value for the ping request. If set to ZERO, the default value SHALL be used. + * @param[in] fpPingCb + * Callback will be called to deliver the ping statistics. + + * @warning This API should only be used to request one ping at a time; calling this API invalidates callbacks + * for previous ping requests. + * @see nmi_inet_addr + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + +/*! + * @fn int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); + * + * This function sets the protocol list used for application-layer protocol negotiation (ALPN). + * If used, it must be called after creating a SSL socket (using @ref socket) and before + * connecting/binding (using @ref connect or @ref bind) or securing (using @ref secure). + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN list applies. + * + * @param[in] pcProtocolList + * Pointer to the list of protocols available in the application. \n + * The entries in the list must: \n + * - be separated with ' ' (space). \n + * - not contain ' ' (space) or '\0' (NUL). \n + * - be non-zero length. \n + * . + * The list itself must: \n + * - be terminated with '\0' (NUL). \n + * - be no longer than @ref ALPN_LIST_MAX_APP_LENGTH, including separators (spaces) and terminator (NUL). \n + * - contain at least one entry. + * + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * + * \section SocketExample9 Example + * The example demonstrates an application using @ref set_alpn_list and @ref get_alpn_index to negotiate secure HTTP/2 + * (with fallback option of HTTP/1.1). + + * \subsection sub5 Main Function + * @code + * SOCKET TcpClientSocket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_SSL_ON); + * if (TcpClientSocket >= 0) + * { + * struct sockaddr_in Serv_Addr = { + * .sin_family = AF_INET, + * .sin_port = _htons(1234), + * .sin_addr.s_addr = inet_addr(SERVER) + * }; + * set_alpn_list(TcpClientSocket, "h2 http/1.1"); + * connect(TcpClientSocket, &Serv_Addr, sizeof(Serv_Addr)); + * } + * @endcode + * \subsection sub6 Socket Callback + * @code + * if(u8Msg == SOCKET_MSG_CONNECT) + * { + * tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + * if(pstrConnect->s8Error == 0) + * { + * uint8_t alpn_index = get_alpn_index(pstrConnect->sock); + * switch (alpn_index) + * { + * case 1: + * printf("Negotiated HTTP/2\n"); + * break; + * case 2: + * printf("Negotiated HTTP/1.1\n"); + * break; + * case 0: + * printf("Protocol negotiation did not occur\n"); + * break; + * } + * } + * } + * @endcode +*/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); +/*! + * @fn int8_t get_alpn_index(SOCKET sock); + * + * This function gets the index of the protocol negotiated via ALPN. + * It should be called when a SSL socket connection succeeds, in order to determine which + * application-layer protocol must be used. + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN applies. + * + * @return The function returns:\n + * - >0: 1-based index of negotiated protocol with respect to the list previously provided to @ref set_alpn_list.\n + * - 0: No negotiation occurred (eg TLS peer did not support ALPN).\n + * - <0: Invalid parameters (socket is not in use, or not an SSL socket).\n + * + * @see @ref SocketExample9 +*/ +int8_t get_alpn_index(SOCKET sock); + +/*! + *@fn int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); + * + * This function gets detail about a socket failure. The application can call this when notified + * of a socket failure via @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + * If used, it must be called before @ref shutdown. + + * @param[in] sock + * Socket ID obtained by a call to @ref socket. + * + * @param[out] pstrErr + * Pointer to structure to be populated with the details of the socket failure. + * + * @return The function returns @ref SOCK_ERR_NO_ERROR if the request is successful. In this case pstrErr + * has been populated. + * The function returns a negative value if the request is not successful. In this case pstrErr + * has not been populated. +*/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); +/**@}*/ // SocketAPI + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/socket/source/inet_addr.c b/AudioConsole.X/Source/winc3400_142/socket/source/inet_addr.c new file mode 100644 index 0000000..5c0b682 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/source/inet_addr.c @@ -0,0 +1,119 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_addr.c + + Summary: + Implementation of standard inet_addr function. + + Description: + Implementation of standard inet_addr function. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include +#include "socket.h" + +in_addr_t inet_addr(const char *cp) +{ + uint8_t i,l; + uint16_t t; + uint32_t ip; + char c; + + ip = 0; + + for (i=0; i<4; i++) + { + t = 0; + ip >>= 8; + + // Count non-delimiter or terminator characters + + for (l=0; l<4; l++) + { + c = cp[l]; + + if (('.' == c) || ('\0' == c)) + { + break; + } + } + + // There must be 1 to 3 characters + + if ((0 == l) || (4 == l)) + { + return 0; + } + + c = *cp++; + + // First digit can't be '0' unless it's the only one + + if ((l > 1) && (c == '0')) + { + return 0; + } + + while(l--) + { + // Each digit must be decimal + + if ((c < '0') || (c > '9')) + { + return 0; + } + + t = (t * 10) + (c - '0'); + + c = *cp++; + } + + // Total accumulated number must be less than 256 + + if (t > 255) + { + return 0; + } + + // Pack number into 32 bit IP address representation + + ip |= ((uint32_t)t << 24); + + // First three numbers must terminate with '.', last one with '\0's + + if ((('\0' == c) && (i != 3)) || (('\0' != c) && (i == 3))) + { + return 0; + } + } + + return ip; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/socket/source/inet_ntop.c b/AudioConsole.X/Source/winc3400_142/socket/source/inet_ntop.c new file mode 100644 index 0000000..bdc190a --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/source/inet_ntop.c @@ -0,0 +1,104 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_ntop.c + + Summary: + Implementation of standard inet_ntop function. + + Description: + Implementation of standard inet_ntop function. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include +#include +#include +#include "socket.h" + +const char *inet_ntop(int af, const void *src, char *dst, size_t size) +{ + uint8_t i, v, t, c, n; + char *rp = dst; + uint32_t ip = ((struct in_addr*)src)->s_addr; + + if ((NULL == src) || (NULL == dst) || (size < 16)) + { + return NULL; + } + + for (i=0; i<4; i++) + { + t = ip; + v = 100; + + // Check for zero + + if (t > 0) + { + n = 0; + + do + { + c = '0'; + while (t >= v) + { + c++; + t -= v; + } + v /= 10; + + if (('0' != c) || (n > 0)) + { + *dst++ = c; + + n++; + } + } + while (v > 0); + } + else + { + *dst++ = '0'; + } + + if (3 == i) + { + *dst++ = '\0'; + } + else + { + *dst++ = '.'; + } + + ip >>= 8; + } + + return rp; +} + +//DOM-IGNORE-END diff --git a/AudioConsole.X/Source/winc3400_142/socket/source/socket.c b/AudioConsole.X/Source/winc3400_142/socket/source/socket.c new file mode 100644 index 0000000..10e8e33 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/socket/source/socket.c @@ -0,0 +1,1261 @@ +/******************************************************************************* + File Name: + socket.c + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_bsp.h" +#include "socket.h" +#include "m2m_hif.h" +#include "m2m_socket_host_if.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_CHECK_CERTNAME NBIT6 +#define SSL_FLAGS_DELAY NBIT7 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Dummy; + uint16_t u16SessionID; +} tstrCloseCmd; + + +/*! +* @brief +*/ +typedef struct { + uint8_t *pu8UserBuffer; + uint16_t u16UserBufferSize; + uint16_t u16SessionID; + uint16_t u16DataOffset; + uint8_t bIsUsed; + uint8_t u8SSLFlags; + uint8_t bIsRecvPending; + uint8_t u8AlpnStatus; + uint8_t u8ErrSource; + uint8_t u8ErrCode; +} tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint16_t gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8_t gbSocketInit = 0; + +static tpfPingCb gfpPingCb = NULL; +static uint32_t gu32PingId = 0; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the WINC3400 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8_t u8SocketMsg, + uint32_t u32StartAddress, uint16_t u16ReadCount) +{ + uint32_t u32Address = u32StartAddress; + uint16_t u16Read; + int16_t s16Diff; + + pstrRecv->u16RemainingSize = u16ReadCount; + if((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) && (gastrSockets[sock].bIsUsed == 1)) + { + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if(s16Diff > 0) + { + /* We don't expect to be here. Firmware only sends data to the driver according to the application's buffer size. + * But it is worth keeping this check, eg in case the application calls recv again with a smaller buffer size, or in case of HIF hacking. */ + u16Read = gastrSockets[sock].u16UserBufferSize; + } + + if(hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, 1) == M2M_SUCCESS) + { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + gastrSockets[sock].u16UserBufferSize = 0; + gastrSockets[sock].pu8UserBuffer = NULL; + + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8SocketMsg, pstrRecv); + } + else + { + M2M_ERR("Current <%d>\r\n", u16ReadCount); + } + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void m2m_ip_cb(uint8_t u8OpCode, uint16_t u16BufferSize, uint32_t u32Address) +{ + if(u8OpCode == SOCKET_CMD_BIND) + { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if(hif_receive(u32Address, (uint8_t*)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) + { + strBind.status = strBindReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock, SOCKET_MSG_BIND, &strBind); + } + } + else if(u8OpCode == SOCKET_CMD_LISTEN) + { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if(hif_receive(u32Address, (uint8_t*)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) + { + strListen.status = strListenReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock, SOCKET_MSG_LISTEN, &strListen); + } + } + else if(u8OpCode == SOCKET_CMD_ACCEPT) + { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if(hif_receive(u32Address, (uint8_t*)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) + { + if((strAcceptReply.sConnectedSock >= 0) && (strAcceptReply.sConnectedSock < MAX_SOCKET)) + { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags = 0; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n", strAcceptReply.sConnectedSock, gu16SessionID); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if(gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } + else if((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT_ALPN)) + { + /* Note that for successful connections the fw always sends SOCKET_CMD_CONNECT, even for SSL connections. */ + tstrConnectAlpnReply strConnectAlpnReply = {{0}}; + tstrSocketConnectMsg strConnMsg; + uint16_t u16HifSz = sizeof(tstrConnectAlpnReply); + if(u8OpCode != SOCKET_CMD_SSL_CONNECT_ALPN) + u16HifSz = sizeof(tstrConnectReply); + if(hif_receive(u32Address, (uint8_t*)&strConnectAlpnReply, u16HifSz, 0) == M2M_SUCCESS) + { + if((strConnectAlpnReply.strConnReply.sock >= 0) && (strConnectAlpnReply.strConnReply.sock < MAX_SOCKET)) + { + uint8_t u8Msg = SOCKET_MSG_CONNECT; + + strConnMsg.sock = strConnectAlpnReply.strConnReply.sock; + strConnMsg.s8Error = strConnectAlpnReply.strConnReply.s8Error; + + /* If the SOCKET_CMD_SSL_CONNECT op code is received and the socket was already connected, then the + callback corresponds to an attempt to make the socket secure. */ + if(0 != gastrSockets[strConnMsg.sock].u16DataOffset) + { + u8Msg = SOCKET_MSG_SECURE; + } + if(strConnectAlpnReply.strConnReply.s8Error == SOCK_ERR_NO_ERROR) + { + gastrSockets[strConnMsg.sock].u16DataOffset = strConnectAlpnReply.strConnReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + gastrSockets[strConnMsg.sock].u8AlpnStatus = strConnectAlpnReply.u8AppProtocolIdx; + } + else + { + gastrSockets[strConnMsg.sock].u8ErrSource = strConnectAlpnReply.strConnReply.u8ErrSource; + gastrSockets[strConnMsg.sock].u8ErrCode = strConnectAlpnReply.strConnReply.u8ErrCode; + } + if(gpfAppSocketCb) + gpfAppSocketCb(strConnMsg.sock, u8Msg, &strConnMsg); + } + } + } + else if(u8OpCode == SOCKET_CMD_DNS_RESOLVE) + { + tstrDnsReply strDnsReply; + if(hif_receive(u32Address, (uint8_t*)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) + { + strDnsReply.u32HostIP = strDnsReply.u32HostIP; + if(gpfAppResolveCb) + gpfAppResolveCb((uint8_t*)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } + else if((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) || (u8OpCode == SOCKET_CMD_SSL_RECV)) + { + SOCKET sock; + int16_t s16RecvStatus; + tstrRecvReply strRecvReply; + uint16_t u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8_t u8CallbackMsgID = SOCKET_MSG_RECV; + uint16_t u16DataOffset; + + if(u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if(hif_receive(u32Address, (uint8_t*)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) + { + if((strRecvReply.sock >= 0) && (strRecvReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n", u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) + { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. Firmware only sends data up to + the size of the application buffer. For TCP, a new call to recv is needed + in order to retrieve any outstanding data from firmware. + */ + u16ReadSize = (uint16_t)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } + else + { + /* Don't tidy up here. Application must call shutdown(). + */ + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &strRecvMsg); + } + } + else + { + M2M_DBG("Discard recv callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + if(u16ReadSize < u16BufferSize) + hif_receive(0, NULL, 0, 1); + } + } + } + } + else if((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) + { + SOCKET sock; + int16_t s16Rcvd; + tstrSendReply strReply; + uint8_t u8CallbackMsgID = SOCKET_MSG_SEND; + + if(u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if(hif_receive(u32Address, (uint8_t*)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) + { + if((strReply.sock >=0) && (strReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n", u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &s16Rcvd); + } + else + { + M2M_DBG("Discard send callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + } + } + } + } + else if(u8OpCode == SOCKET_CMD_PING) + { + tstrPingReply strPingReply; + if(hif_receive(u32Address, (uint8_t*)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) + { + if((gu32PingId == strPingReply.u32CmdPrivate) && (gfpPingCb != NULL)) + { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); + } + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. +*********************************************************************/ +void socketInit(void) +{ + if(gbSocketInit==0) + { + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, m2m_ip_cb); + gbSocketInit=1; + gu16SessionID = 0; + } +} + +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. +*********************************************************************/ +void socketDeinit(void) +{ + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} + + +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} +void registerSocketEventCallback(tpfAppSocketCb pfAppSocketCb) +{ + gpfAppSocketCb = pfAppSocketCb; +} +void registerSocketResolveCallback(tpfAppResolveCb pfAppResolveCb) +{ + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. +*********************************************************************/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config) +{ + SOCKET sock = -1; + uint8_t u8SockID; + uint8_t u8Count; + volatile tstrSocket *pstrSock = NULL; + static volatile uint8_t u8NextTcpSock = 0; + static volatile uint8_t u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if(u16Domain == AF_INET) + { + if(u8Type == SOCK_STREAM) + { + for(u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)u8SockID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + /* In the current implementation, SSL flags only have meaning for the TCP socket case. */ + if(u8Config != SOCKET_CONFIG_SSL_OFF) + { + tstrSSLSocketCreateCmd strSSLCreate; + + strSSLCreate.sslSock = sock; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8_t*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE; + if(u8Config == SOCKET_CONFIG_SSL_DELAY) + pstrSock->u8SSLFlags |= SSL_FLAGS_DELAY; + } + break; + } + } + } + else if(u8Type == SOCK_DGRAM) + { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for(u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + break; + } + } + } + else if(u8Type == SOCK_RAW) + { + /* Only raw IP packets are supported */ + if(u8Config == SOCKET_CONFIG_IPPROTO_RAW) + { + pstrSock = &gastrSockets[RAW_SOCK_ID]; + if(!pstrSock->bIsUsed) + { + /* Socket identified by RAW_SOCK_ID is reserved */ + sock = (SOCKET)RAW_SOCK_ID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + } + } + } + + if(sock >= 0) + { + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n", sock, gu16SessionID); + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return +*********************************************************************/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((pstrAddr != NULL) && (sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrBindCmd strBind; + + /* Build the bind request. */ + strBind.sock = sock; + memcpy((uint8_t *)&strBind.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strBind.strAddr.u16Family = strBind.strAddr.u16Family; + strBind.strAddr.u16Port = strBind.strAddr.u16Port; + strBind.strAddr.u32IPAddr = strBind.strAddr.u32IPAddr; + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(SOCKET_CMD_BIND, (uint8_t*)&strBind, sizeof(tstrBindCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + + +Return +*********************************************************************/ +int8_t listen(SOCKET sock, uint8_t backlog) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8_t*)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return +*********************************************************************/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return +*********************************************************************/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrConnectCmd strConnect; + uint8_t u8Cmd = SOCKET_CMD_CONNECT; + if((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + memcpy((uint8_t *)&strConnect.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + secure + +Description + Make secure (TLS) an open TCP client connection. + +Return +*********************************************************************/ +int8_t secure(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY) + && (gastrSockets[sock].u16DataOffset != 0) + ) + { + tstrConnectCmd strConnect = {0}; + + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_DELAY; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + strConnect.sock = sock; + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SECURE, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return +*********************************************************************/ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + uint16_t u16DataOffset; + tstrSendCmd strSend; + uint8_t u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if(sock >= TCP_SOCK_MAX) + { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd|M2M_REQ_DATA_PKT, (uint8_t*)&strSend, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, u16DataOffset); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return +*********************************************************************/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + uint16_t u16MaxLength = (sock == RAW_SOCK_ID) ? (M2M_HIF_MAX_PACKET_SIZE - M2M_HIF_HDR_OFFSET - sizeof(tstrSendCmd)) : SOCKET_BUFFER_MAX_LENGTH; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= u16MaxLength) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrSendCmd strSendTo; + + memset((uint8_t*)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if(pstrDestAddr != NULL) + { + struct sockaddr_in *pstrAddr; + pstrAddr = (void*)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8_t*)&strSendTo, sizeof(tstrSendCmd), + pvSendBuffer, u16SendLength, (sock == RAW_SOCK_ID) ? IP_PACKET_OFFSET: UDP_TX_PACKET_OFFSET); + + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + +*********************************************************************/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + uint8_t u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + shutdown + +Description + +Return + None. +*********************************************************************/ +int8_t shutdown(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + M2M_INFO("Sock to delete <%d> (used %u)\r\n", sock, gastrSockets[sock].bIsUsed); + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + uint8_t u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strclose, sizeof(tstrCloseCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + memset((uint8_t*)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + +*********************************************************************/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_NO_ERROR; + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } + else + { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. +*********************************************************************/ +int8_t gethostbyname(const char *pcHostName) +{ + int8_t s8Err = SOCK_ERR_INVALID_ARG; + uint8_t u8HostNameSize = (uint8_t)strlen(pcHostName); + if(u8HostNameSize <= HOSTNAME_MAX_SIZE) + { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8_t*)pcHostName, u8HostNameSize + 1, NULL, 0, 0); + if(s8Err != SOCK_ERR_NO_ERROR) + { + s8Err = SOCK_ERR_INVALID; + } + } + return s8Err; +} + +/********************************************************************* +Function + rawSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t rawSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(RAW_SOCK_ID == sock) + { + if(u16OptLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_RAW_SET_SOCK_OPT; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option = u8Opt; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)pvOptVal; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + + return s8Ret; +} +/********************************************************************* +Function + sslSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t sslSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(sock < TCP_SOCK_MAX) + { + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + uint8_t sslFlag = 0; + + s8Ret = SOCK_ERR_NO_ERROR; + if(u16OptLen == sizeof(int)) + { + if(u8Opt == SO_SSL_BYPASS_X509_VERIF) + { + sslFlag = SSL_FLAGS_BYPASS_X509; + } + else if(u8Opt == SO_SSL_ENABLE_SESSION_CACHING) + { + sslFlag = SSL_FLAGS_CACHE_SESSION; + } + else if(u8Opt == SO_SSL_ENABLE_CERTNAME_VALIDATION) + { + sslFlag = SSL_FLAGS_CHECK_CERTNAME; + } + } + if(sslFlag) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= sslFlag; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~sslFlag; + } + } + else if( + ((u8Opt == SO_SSL_SNI) && (u16OptLen < HOSTNAME_MAX_SIZE)) + || ((u8Opt == SO_SSL_ALPN) && (u16OptLen <= ALPN_LIST_MAX_SIZE)) + ) + { + tstrSSLSetSockOptCmd strCmd = {0}; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + memcpy(strCmd.au8OptVal, (uint8_t*)pvOptVal, u16OptLen); + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + if(s8Ret == M2M_ERR_MEM_ALLOC) + { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + } + } + else + { + M2M_ERR("Unknown SSL Socket Option %d\r\n",u8Opt); + s8Ret = SOCK_ERR_INVALID_ARG; + } + } + else + { + M2M_ERR("Not SSL Socket\r\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t setsockopt(SOCKET sock, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) + { + if(u8Level == SOL_RAW) + { + s8Ret = rawSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SSL_SOCKET) + { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SOCKET) + { + if(u16OptionLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option=option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t* pu8OptLen) +{ + // This is not implemented so return a value that will cause failure should this be used. + return SOCK_ERR_INVALID_ARG; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return +*********************************************************************/ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((u32DstIP != 0) && (fpPingCb != NULL)) + { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = ++gu32PingId; + strPingCmd.u8TTL = u8TTL; + + gfpPingCb = fpPingCb; + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8_t*)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} +/********************************************************************* +Function + set_alpn_protocol_list + +Description + This function sets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*********************************************************************/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (sock < TCP_SOCK_MAX) && (pcProtocolList != NULL)) + { + uint8_t u8Length = strlen(pcProtocolList); + if ((u8Length > 0) && (u8Length < ALPN_LIST_MAX_APP_LENGTH)) + { + /* + ALPN socket option requires Alpn list in this format: + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + */ + uint8_t au8AlpnList[ALPN_LIST_MAX_SIZE] = {0}; + uint8_t *pu8Ptr = &au8AlpnList[3] + u8Length; + uint8_t u8Len = 0; + + memcpy(&au8AlpnList[3], pcProtocolList, u8Length); + u8Length++; + au8AlpnList[1] = u8Length; + au8AlpnList[2] = ' '; + + /* Convert space characters into length fields. */ + while (u8Length--) + { + if (*--pu8Ptr == ' ') + { + if (u8Len == 0) goto ERR; + *pu8Ptr = u8Len; + u8Len = 0; + } + else u8Len++; + } + s8Ret = setsockopt(sock, SOL_SSL_SOCKET, SO_SSL_ALPN, au8AlpnList, sizeof(au8AlpnList)); + } + } +ERR: + return s8Ret; +} +/********************************************************************* +Function + get_alpn_protocol_index + +Description + This function gets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns the index of the selected application-layer protocol. + Special values: + 0: no negotiation has occurred. + <0: error. +*********************************************************************/ +int8_t get_alpn_index(SOCKET sock) +{ + if (sock >= TCP_SOCK_MAX || sock < 0) + return SOCK_ERR_INVALID_ARG; + if (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) || !gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + return gastrSockets[sock].u8AlpnStatus; +} + +/********************************************************************* +Function + IsSocketReady + +Description + +Return + None. +*********************************************************************/ +uint8_t IsSocketReady(void) +{ + return gbSocketInit; +} + +/********************************************************************* +Function + get_error_detail + +Description + This function gets detail about a socket failure. + The application can call this when notified of a socket failure via + @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + If used, it must be called before @ref shutdown. + +Return + The function returns @ref SOCK_ERR_NO_ERROR if the request is successful + and a negative value otherwise. +*********************************************************************/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr) +{ + if ((sock >= TCP_SOCK_MAX) || (sock < 0) || (pstrErr == NULL)) + return SOCK_ERR_INVALID_ARG; + if (!gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + pstrErr->enuErrSource = gastrSockets[sock].u8ErrSource; + pstrErr->u8ErrCode = gastrSockets[sock].u8ErrCode; + return SOCK_ERR_NO_ERROR; +} diff --git a/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash.h b/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..0c879f5 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash.h @@ -0,0 +1,192 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.h + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/** @defgroup SPIFLASHAPI SPI FLASH + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ + +#include "nm_common.h" +#include "nmbus.h" +#include "spi_flash_map.h" + +/** @defgroup SPIFLASHFUNCTIONS Functions + * @ingroup SPIFLASHAPI + */ + +/**@{*/ +/*! + * @fn uint32_t spi_flash_get_size(void); + * @brief Returns with \ref uint32_t value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32_t spi_flash_get_size(void); + +/*! + * @fn int8_t spi_flash_read(uint8_t *, uint32_t, uint32_t); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will be filled with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_write(uint8_t *, uint32_t, uint32_t); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the data to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and comparing it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase that section first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_write(uint8_t* pu8Buf, uint32_t u32Offset, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_erase(uint32_t, uint32_t); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Total number of bytes required to be erased. + * @note It is blocking function \n + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * \section SPIFLASHExample Example + * @code{.c} + * #include "spi_flash.h" + * + * #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + * + * int main() + * { + * uint8_t au8FlashContent[FLASH_SECTOR_SZ] = {0}; + * uint32_t u32FlashTotalSize = 0; + * uint32_t u32FlashOffset = 0; + * + * ret = m2m_wifi_download_mode(); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to enter download mode\r\n"); + * } + * else + * { + * u32FlashTotalSize = spi_flash_get_size(); + * } + * + * while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + * { + * ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to read SPI sector\r\n"); + * break; + * } + * memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + * + * ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to erase SPI sector\r\n"); + * break; + * } + * + * ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to write SPI sector\r\n"); + * break; + * } + * u32FlashOffset += FLASH_SECTOR_SZ; + * } + * + * if(M2M_SUCCESS == ret) + * { + * printf("Successful operations\r\n"); + * } + * else + * { + * printf("Failed operations\r\n"); + * } + * + * while(1); + * return M2M_SUCCESS; + * } + * @endcode + */ + +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz); + +/**@} + */ + +#endif //__SPI_FLASH_H__ \ No newline at end of file diff --git a/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h b/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..ed2e961 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h @@ -0,0 +1,264 @@ +/******************************************************************************* + WINC3400 SPI Flash Map + + File Name: + spi_flash_map.h + + Summary: + WINC3400 SPI Flash Map + + Description: + WINC3400 SPI Flash Map + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + + +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ +#define BT_IMAGE_PRESENT + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! M2M_OTA_IMAGE2_OFFSET) +#error "Exceed Flash Size" +#endif /* ((FLASH_COMMON_SZ + OTA_IMAGE_SIZE) > M2M_OTA_IMAGE2_OFFSET) */ +#if ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) +#error "OTA Exceed Flash Size" +#endif /* ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/AudioConsole.X/Source/winc3400_142/spi_flash/source/spi_flash.c b/AudioConsole.X/Source/winc3400_142/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..1563f90 --- /dev/null +++ b/AudioConsole.X/Source/winc3400_142/spi_flash/source/spi_flash.c @@ -0,0 +1,599 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.c + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nm_common.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +#define MAX_PROG_CNT 2 +#define MAX_RETRY 4 +#define MAX_ATTEMPT_STATUS_READ 50000 + +#define HOST_SHARE_MEM_BASE (0xd0000UL) +#define CORTUS_SHARE_MEM_BASE (0x60000000UL) +#define NMI_SPI_FLASH_ADDR (0x111c) +/*********************************************************** +SPI Flash DMA +***********************************************************/ +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) +#define SPI_FLASH_BASE (0x10200) +#define SPI_FLASH_MODE (SPI_FLASH_BASE + 0x00) +#define SPI_FLASH_CMD_CNT (SPI_FLASH_BASE + 0x04) +#define SPI_FLASH_DATA_CNT (SPI_FLASH_BASE + 0x08) +#define SPI_FLASH_BUF1 (SPI_FLASH_BASE + 0x0c) +#define SPI_FLASH_BUF2 (SPI_FLASH_BASE + 0x10) +#define SPI_FLASH_BUF_DIR (SPI_FLASH_BASE + 0x14) +#define SPI_FLASH_TR_DONE (SPI_FLASH_BASE + 0x18) +#define SPI_FLASH_DMA_ADDR (SPI_FLASH_BASE + 0x1c) +#define SPI_FLASH_MSB_CTL (SPI_FLASH_BASE + 0x20) +#define SPI_FLASH_TX_CTL (SPI_FLASH_BASE + 0x24) + +/*********************************************/ +/* STATIC FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read_status_reg +* @brief Read status register +* @param[OUT] val + value of status reg +* @return Status of execution +* @note Compatible with MX25L6465E +*/ +static int8_t spi_flash_read_status_reg(uint8_t *val) +{ + int8_t ret = M2M_SUCCESS; + uint8_t cmd[1]; + uint32_t reg; + + cmd[0] = 0x05; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + *val = reg & 0xff; + return ret; +} + +/** +* @fn spi_flash_load_to_cortus_mem +* @brief Load data from SPI flash into cortus memory +* @param[IN] u32MemAdr +* Cortus load address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_load_to_cortus_mem(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[5]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x0b; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_sector_erase +* @brief Erase sector (4KB) +* @param[IN] u32FlashAdr +* Any memory address within the sector +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_sector_erase(uint32_t u32FlashAdr) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_enable +* @brief Send write enable command to SPI flash +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_enable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_disable +* @brief Send write disable command to SPI flash +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_disable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_page_program +* @brief Write data (less than page size) from cortus memory to SPI flash +* @param[IN] u32MemAdr +* Cortus data address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_page_program(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7) | ((u32Sz & 0xfffff) << 8)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_read_internal +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32Addr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Data size must be < 64KB (limitation imposed by the bus wrapper) +*/ +static int8_t spi_flash_read_internal(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if(M2M_SUCCESS != ret) goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** +* @fn spi_flash_pp +* @brief Program data of size less than a page (256 bytes) at the SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +static int8_t spi_flash_pp(uint32_t u32Offset, uint8_t *pu8Buf, uint16_t u16Sz) +{ + int8_t ret = M2M_SUCCESS; + uint8_t tmp; + int i; + int p; + int x; + + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + + for(i = 0, p = 0; (i < MAX_RETRY) && (p < MAX_PROG_CNT); i++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + ret = spi_flash_write_disable(); + + if(p < MAX_PROG_CNT) + { + ret = M2M_ERR_FAIL; + } + + return ret; +} + +/** +* @fn spi_flash_rdid +* @brief Read SPI Flash ID +* @return SPI FLash ID +*/ +static uint32_t spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32_t reg = 0; + uint32_t cnt = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + if(++cnt > 500) + { + ret = M2M_ERR_INIT; + break; + } + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + M2M_PRINT("Flash ID %x \n", (unsigned int)reg); + return reg; +} + +/** +* @fn spi_flash_unlock +* @brief Unlock SPI Flash +*/ +#if 0 +static void spi_flash_unlock(void) +{ + uint8_t tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif + +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32offset +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32offset, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + if(u32Sz > FLASH_BLOCK_SIZE) + { + do + { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if(M2M_SUCCESS != ret) goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while(u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** +* @fn spi_flash_write +* @brief Program SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +int8_t spi_flash_write(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Sz) +{ +#ifdef PROFILING + uint32_t t1 = 0; + uint32_t percent =0; + uint32_t tpercent =0; +#endif + int8_t ret = M2M_SUCCESS; + uint32_t u32wsz; + uint32_t u32off; + uint32_t u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz/u32Blksz)+((u32Sz%u32Blksz)>0); + t1 = nm_bsp_get_tick(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if(u32Sz<=0) + { + M2M_ERR("Data size = %d", (int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if(u32off) /*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)BSP_MIN(u32Sz, u32wsz))!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + if(u32Sz < u32wsz) goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while(u32Sz > 0) + { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)u32wsz)!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r", ((percent*100)/tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r", (nm_bsp_get_tick() - t1)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_erase +* @brief Erase from data from SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz) +{ + uint32_t i = 0; + uint8_t tmp = 0; + int p; + int j; + int x; + +#ifdef PROFILING + uint32_t t; + t = nm_bsp_get_tick(); +#endif + M2M_DBG("\r\n>Start erasing...\r\n"); + for(i = u32Offset; i < (u32Sz +u32Offset); i += (16*FLASH_PAGE_SZ)) + { + for(j = 0, p = 0; (j < MAX_RETRY) && (p < MAX_PROG_CNT); j++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS) && + (spi_flash_sector_erase(i) == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + if(p != MAX_PROG_CNT) + { + return M2M_ERR_FAIL; + } + } + M2M_DBG("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (nm_bsp_get_tick()-t)/1000.0); +#endif + return M2M_SUCCESS; +} + +/** +* @fn spi_flash_get_size +* @brief Get size of SPI Flash +* @return Size of Flash +*/ +uint32_t spi_flash_get_size(void) +{ + uint32_t u32FlashId = 0, u32FlashPwr = 0; + static uint32_t gu32InternalFlashSize= 0; + + if(!gu32InternalFlashSize) + { + u32FlashId = spi_flash_rdid();//spi_flash_probe(); + if(u32FlashId != 0xffffffff) + { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId>>16)&0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InternalFlashSize = 1<>> + +#include +// Basic configuration + +// Enable Wi-Fi Management +// Enable Wi-Fi Management +// wifi_mgmt_enable +#ifndef CONF_MGMT +#define CONF_MGMT 0 +#endif +#ifndef CONF_WINC_USE_SPI +#define CONF_WINC_USE_SPI 1 +#endif +#ifndef CONF_PERIPH +#define CONF_PERIPH 1 +#endif +#define CONF_WINC_DEBUG (0) +#define CONF_WINC_PRINTF printf + +#define NM_EDGE_INTERRUPT (1) +// + +// <<< end of configuration section >>> + +#endif // WINC1500_CONFIG_H diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o new file mode 100644 index 0000000..b723ea7 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o.d new file mode 100644 index 0000000..4a57f5c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o.d @@ -0,0 +1,19 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o: \ + Source/BatteryMonitor.c \ +Source/BatteryMonitor.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/ina219.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o new file mode 100644 index 0000000..048ff0b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o.d new file mode 100644 index 0000000..aff83ef --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o.d @@ -0,0 +1,24 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o: \ + Source/BootloaderInterface.c \ +Source/BootloaderInterface.h \ + Source/define.h \ +Source/BootloaderProtocol.h \ +Source/ProtocolDefs.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/WiFiCtrl.h \ +Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/SPI_Flash.h \ + Source/FlashMapping.h \ +Source/NetworkProtocol.h \ +Source/Syslog.h \ + Source/checksum.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o new file mode 100644 index 0000000..9df68e4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o.d new file mode 100644 index 0000000..0181d3c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o.d @@ -0,0 +1,16 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o: \ + Source/BootloaderProtocol.c \ +Source/define.h \ +Source/ProtocolDefs.h \ + Source/BootloaderProtocol.h \ +Source/BootloaderInterface.h \ + Source/WiFiCtrl.h \ +Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o new file mode 100644 index 0000000..ed57fdc Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o.d new file mode 100644 index 0000000..de6482c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o: \ + Source/ChaletPowerRelay.c \ +Source/ChaletPowerRelay.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o new file mode 100644 index 0000000..4821ba7 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o.d new file mode 100644 index 0000000..086f406 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o: \ + Source/ChaletduinoV2Board.c \ +Source/BoardCfg.h \ +Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o new file mode 100644 index 0000000..7740d6c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o.d new file mode 100644 index 0000000..3ebff4a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o: \ + Source/DigitalIO.c \ +Source/DigitalIO.h \ +Source/BoardCfg.h \ +Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o new file mode 100644 index 0000000..ad5fdfb Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o.d new file mode 100644 index 0000000..14f8fab --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o: \ + Source/HarakiriRelay.c \ +Source/HarakiriRelay.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o new file mode 100644 index 0000000..c7248e1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o.d new file mode 100644 index 0000000..3ceb0d6 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o: \ +Source/I2C.c \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o new file mode 100644 index 0000000..7a7f08e Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o.d new file mode 100644 index 0000000..e786050 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o: \ + Source/InternalUart.c \ +Source/define.h \ +Source/InternalUart.h \ + Source/uart.h \ +Source/digitalio.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/NetworkProtocol.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o new file mode 100644 index 0000000..3ccc273 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o.d new file mode 100644 index 0000000..7b2a24f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o.d @@ -0,0 +1,15 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o: \ + Source/LoraNetworkInterface.c \ +Source/LoraNetworkInterface.h \ + Source/ProtocolDefs.h \ +Source/NetworkProtocol.h \ +Source/InternalUart.h \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/Uart.h \ +Source/ChaletPowerRelay.h \ +Source/HarakiriRelay.h \ + Source/BatteryMonitor.h \ +Source/LedLightCtrl.h \ +Source/TemperatureSensor.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o new file mode 100644 index 0000000..f9d7f91 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o.d new file mode 100644 index 0000000..250df4f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o.d @@ -0,0 +1,8 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o: \ + Source/NetworkProtocol.c \ +Source/define.h \ +Source/NetworkProtocol.h \ + Source/Uart.h \ +Source/ProtocolDefs.h \ +Source/MasterCtrlInterface.h \ + Source/LoraNetworkInterface.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o new file mode 100644 index 0000000..03e7384 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o.d new file mode 100644 index 0000000..ab6cb0b --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o: \ +Source/SPI.c \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/SPI.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o new file mode 100644 index 0000000..85ed440 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o.d new file mode 100644 index 0000000..dde5907 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o: \ + Source/SPI_Flash.c \ +Source/SPI_Flash.h \ +Source/SPI.h \ +Source/BoardCfg.h \ + Source/define.h \ +Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o new file mode 100644 index 0000000..e4e94c9 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o.d new file mode 100644 index 0000000..6ca9e5f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o.d @@ -0,0 +1,16 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o: \ +Source/Syslog.c \ + Source/Syslog.h \ +Source/define.h \ +Source/terminal.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o new file mode 100644 index 0000000..345895b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o.d new file mode 100644 index 0000000..f0df2c9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o: \ +Source/TC77.c \ + Source/TC77.h \ +Source/define.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o new file mode 100644 index 0000000..c1fdf73 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o.d new file mode 100644 index 0000000..1212be7 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o.d @@ -0,0 +1,8 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o: \ + Source/TemperatureSensor.c \ +Source/TemperatureSensor.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/TC77.h \ + Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o new file mode 100644 index 0000000..9003727 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o.d new file mode 100644 index 0000000..1db4c38 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o.d @@ -0,0 +1,18 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o: \ +Source/Terminal.c \ + Source/terminal.h \ +Source/define.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/LedLightCtrl.h \ + Source/ChaletPowerRelay.h \ +Source/BatteryMonitor.h \ + Source/BootloaderInterface.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o new file mode 100644 index 0000000..3af579d Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o.d new file mode 100644 index 0000000..82a7072 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o: \ +Source/Uart.c \ + Source/define.h \ +Source/Uart.h \ +Source/Internaluart.h \ +Source/digitalio.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/terminal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o new file mode 100644 index 0000000..d82c7f4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o.d new file mode 100644 index 0000000..bf1ff2a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Util.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/Util.o: \ +Source/Util.c \ + Source/define.h \ +Source/Util.h \ +Source/PrintfServer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o new file mode 100644 index 0000000..c645bf4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o.d new file mode 100644 index 0000000..b83679d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o: \ +Source/Watchdog.c \ + Source/define.h \ +Source/Watchdog.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o new file mode 100644 index 0000000..4ae740a Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o.d new file mode 100644 index 0000000..05c1f2d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o.d @@ -0,0 +1,21 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o: \ +Source/WiFiCtrl.c \ + Source/WiFiCtrl.h \ +Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/source/nmasic.h \ +Source/define.h \ +Source/Terminal.h \ + Source/winc3400/driver/include/m2m_periph.h \ +Source/ProtocolDefs.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/BootloaderProtocol.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o new file mode 100644 index 0000000..2948241 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o.d new file mode 100644 index 0000000..52994d9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o: \ +Source/crc32.c \ + Source/checksum.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o new file mode 100644 index 0000000..1bda18c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o.d new file mode 100644 index 0000000..e10a8da --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o: \ + Source/exceptions.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o new file mode 100644 index 0000000..1952db1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o.d new file mode 100644 index 0000000..7e9b22c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o: \ +Source/ina219.c \ + Source/ina219.h \ +Source/define.h \ +Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o new file mode 100644 index 0000000..8b6e75f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o.d new file mode 100644 index 0000000..76a7cee --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o: \ + Source/interrupts.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o new file mode 100644 index 0000000..7ae16de Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o.d new file mode 100644 index 0000000..88cb6df --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/main.o.d @@ -0,0 +1,30 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/main.o: \ +Source/main.c \ + Source/define.h \ +Source/Uart.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ +Source/Watchdog.h \ + Source/main.h \ +Source/NetworkProtocol.h \ +Source/ChaletPowerRelay.h \ + Source/BatteryMonitor.h \ +Source/CurrentSensor.h \ +Source/I2C.h \ + Source/SPI_Flash.h \ +Source/TemperatureSensor.h \ + Source/BootloaderInterface.h \ +Source/Terminal.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/InternalUart.h \ + Source/Syslog.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o new file mode 100644 index 0000000..10e6124 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o.d new file mode 100644 index 0000000..b46f535 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/system.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/system.o: \ +Source/system.c \ + Source/system.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o new file mode 100644 index 0000000..0c6a702 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o.d new file mode 100644 index 0000000..bb21384 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/template.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/template.o: \ +Source/template.c \ + Source/define.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o new file mode 100644 index 0000000..5c1bf69 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o.d new file mode 100644 index 0000000..4e6ea87 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/timer.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/timer.o: \ +Source/timer.c \ + Source/timer.h \ +Source/define.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o new file mode 100644 index 0000000..8bffcb3 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o.d new file mode 100644 index 0000000..985bed9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o: \ + Source/winc3400/bsp/source/nm_bsp.c \ +Source/winc3400/bsp/include/nm_bsp.h \ + Source/winc3400_config.h \ +Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ +Source/timer.h \ + Source/define.h \ +Source/define.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o new file mode 100644 index 0000000..ad89b32 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d new file mode 100644 index 0000000..46073d4 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d @@ -0,0 +1,13 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o: \ + Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/define.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/SPI.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o new file mode 100644 index 0000000..1e2c84c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o.d new file mode 100644 index 0000000..5ec65a7 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o: \ + Source/winc3400/common/source/nm_common.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o new file mode 100644 index 0000000..afd00b1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o.d new file mode 100644 index 0000000..f99bdaf --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o: \ + Source/winc3400/driver/source/m2m_ate_mode.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o new file mode 100644 index 0000000..a8332e6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o.d new file mode 100644 index 0000000..b5502a1 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o: \ + Source/winc3400/driver/source/m2m_crypto.c \ + Source/winc3400/driver/include/m2m_crypto.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o new file mode 100644 index 0000000..ad8d678 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o.d new file mode 100644 index 0000000..faef877 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o.d @@ -0,0 +1,14 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o: \ + Source/winc3400/driver/source/m2m_hif.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/include/m2m_periph.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o new file mode 100644 index 0000000..997eb19 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o.d new file mode 100644 index 0000000..3aedc73 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o: \ + Source/winc3400/driver/source/m2m_ota.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/include/m2m_ota.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/driver/source/m2m_hif.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o new file mode 100644 index 0000000..ef5236b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o.d new file mode 100644 index 0000000..f1e87e5 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o: \ + Source/winc3400/driver/source/m2m_periph.c \ + Source/winc3400/driver/include/m2m_periph.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/source/m2m_hif.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o new file mode 100644 index 0000000..99e5113 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o.d new file mode 100644 index 0000000..dfc0fe9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o.d @@ -0,0 +1,15 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o: \ + Source/winc3400/driver/source/m2m_ssl.c \ + Source/winc3400/driver/include/m2m_ssl.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/include/ecc_types.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o new file mode 100644 index 0000000..3fb84d2 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o.d new file mode 100644 index 0000000..a6d3eb7 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o: \ + Source/winc3400/driver/source/m2m_wifi.c \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o new file mode 100644 index 0000000..88c04e1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o.d new file mode 100644 index 0000000..d744d41 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o.d @@ -0,0 +1,10 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o: \ + Source/winc3400/driver/source/nmasic.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o new file mode 100644 index 0000000..7e6fdce Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o.d new file mode 100644 index 0000000..2a94ac0 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o: \ + Source/winc3400/driver/source/nmbus.c \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmi2c.h \ + Source/winc3400/driver/source/nmspi.h \ + Source/winc3400/driver/source/nmuart.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o new file mode 100644 index 0000000..f04801f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o.d new file mode 100644 index 0000000..74ef630 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o.d @@ -0,0 +1,13 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o: \ + Source/winc3400/driver/source/nmdrv.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmspi.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o new file mode 100644 index 0000000..8e920d6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o.d new file mode 100644 index 0000000..5ecec7f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o: \ + Source/winc3400/driver/source/nmi2c.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o new file mode 100644 index 0000000..50f08b6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o.d new file mode 100644 index 0000000..95cb0ea --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o: \ + Source/winc3400/driver/source/nmspi.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmspi.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o new file mode 100644 index 0000000..fe081bb Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o.d new file mode 100644 index 0000000..54565dd --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o: \ + Source/winc3400/driver/source/nmuart.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o new file mode 100644 index 0000000..266830c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o.d new file mode 100644 index 0000000..4283ba4 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o: \ + Source/winc3400/socket/source/socket.c \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/socket/source/socket_internal.h \ + Source/winc3400/socket/include/m2m_socket_host_if.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o new file mode 100644 index 0000000..6e0f4f5 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o.d new file mode 100644 index 0000000..6b6dfaf --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o: \ + Source/winc3400/spi_flash/source/spi_flash.c \ + Source/winc3400/spi_flash/include/spi_flash.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/spi_flash/include/spi_flash_map.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o new file mode 100644 index 0000000..44ff159 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o.d new file mode 100644 index 0000000..15f4532 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o: \ + Source/winc3400/winc_init.c \ +Source/winc3400/winc_init.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o new file mode 100644 index 0000000..554f2c7 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o.d new file mode 100644 index 0000000..a65dc8a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o.d @@ -0,0 +1,19 @@ +build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o: \ + Source/BatteryMonitor.c \ +Source/BatteryMonitor.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/ina219.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o new file mode 100644 index 0000000..b4f35a7 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o.d new file mode 100644 index 0000000..25382dc --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o.d @@ -0,0 +1,24 @@ +build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o: \ + Source/BootloaderInterface.c \ +Source/BootloaderInterface.h \ + Source/define.h \ +Source/BootloaderProtocol.h \ +Source/ProtocolDefs.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/WiFiCtrl.h \ +Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/SPI_Flash.h \ + Source/FlashMapping.h \ +Source/NetworkProtocol.h \ +Source/Syslog.h \ + Source/checksum.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o new file mode 100644 index 0000000..04c1991 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o.d new file mode 100644 index 0000000..68f6e8f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o.d @@ -0,0 +1,17 @@ +build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o: \ + Source/BootloaderProtocol.c \ +Source/define.h \ +Source/ProtocolDefs.h \ + Source/BootloaderProtocol.h \ +Source/BootloaderInterface.h \ + Source/WiFiCtrl.h \ +Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/checksum.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o new file mode 100644 index 0000000..af5a77b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o.d new file mode 100644 index 0000000..416972a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o: \ + Source/ChaletPowerRelay.c \ +Source/ChaletPowerRelay.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o new file mode 100644 index 0000000..bb0f68f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o.d new file mode 100644 index 0000000..310cb54 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o: \ + Source/ChaletduinoV2Board.c \ +Source/BoardCfg.h \ +Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o new file mode 100644 index 0000000..e34d6b1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o.d new file mode 100644 index 0000000..8a4ac49 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o: \ + Source/DigitalIO.c \ +Source/DigitalIO.h \ +Source/BoardCfg.h \ +Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o new file mode 100644 index 0000000..775e7f9 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o.d new file mode 100644 index 0000000..db28d28 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o: \ + Source/HarakiriRelay.c \ +Source/HarakiriRelay.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o new file mode 100644 index 0000000..a30b6da Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o.d new file mode 100644 index 0000000..6cd6a00 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/I2C.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/production/Source/I2C.o: \ +Source/I2C.c \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o new file mode 100644 index 0000000..50fa223 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o.d new file mode 100644 index 0000000..5967a6e --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o: \ + Source/InternalUart.c \ +Source/define.h \ +Source/InternalUart.h \ + Source/uart.h \ +Source/digitalio.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/NetworkProtocol.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o new file mode 100644 index 0000000..5e4087f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o.d new file mode 100644 index 0000000..e8f0f79 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o.d @@ -0,0 +1,15 @@ +build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o: \ + Source/LoraNetworkInterface.c \ +Source/LoraNetworkInterface.h \ + Source/ProtocolDefs.h \ +Source/NetworkProtocol.h \ +Source/InternalUart.h \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/Uart.h \ +Source/ChaletPowerRelay.h \ +Source/HarakiriRelay.h \ + Source/BatteryMonitor.h \ +Source/LedLightCtrl.h \ +Source/TemperatureSensor.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o new file mode 100644 index 0000000..6a4413e Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o.d new file mode 100644 index 0000000..eb22847 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o.d @@ -0,0 +1,8 @@ +build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o: \ + Source/NetworkProtocol.c \ +Source/define.h \ +Source/NetworkProtocol.h \ + Source/Uart.h \ +Source/ProtocolDefs.h \ +Source/MasterCtrlInterface.h \ + Source/LoraNetworkInterface.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o new file mode 100644 index 0000000..1b1a894 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o.d new file mode 100644 index 0000000..b7485d4 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_775F512H_/production/Source/SPI.o: \ +Source/SPI.c \ + Source/define.h \ +Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/SPI.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o new file mode 100644 index 0000000..3111864 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o.d new file mode 100644 index 0000000..a5d0f65 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o: \ + Source/SPI_Flash.c \ +Source/SPI_Flash.h \ +Source/SPI.h \ +Source/BoardCfg.h \ + Source/define.h \ +Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o new file mode 100644 index 0000000..83469bd Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o.d new file mode 100644 index 0000000..6ae6a9f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o.d @@ -0,0 +1,16 @@ +build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o: \ +Source/Syslog.c \ + Source/Syslog.h \ +Source/define.h \ +Source/terminal.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o new file mode 100644 index 0000000..f9180da Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o.d new file mode 100644 index 0000000..b5d64cc --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TC77.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/TC77.o: \ +Source/TC77.c \ + Source/TC77.h \ +Source/define.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o new file mode 100644 index 0000000..f29fb36 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o.d new file mode 100644 index 0000000..3308b0b --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o.d @@ -0,0 +1,8 @@ +build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o: \ + Source/TemperatureSensor.c \ +Source/TemperatureSensor.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/TC77.h \ + Source/timer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o new file mode 100644 index 0000000..90d52f2 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o.d new file mode 100644 index 0000000..b195cda --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o.d @@ -0,0 +1,18 @@ +build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o: \ + Source/Terminal.c \ +Source/terminal.h \ +Source/define.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/LedLightCtrl.h \ + Source/ChaletPowerRelay.h \ +Source/BatteryMonitor.h \ + Source/BootloaderInterface.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o new file mode 100644 index 0000000..a6695a2 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o.d new file mode 100644 index 0000000..ea8e2e8 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Uart.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/production/Source/Uart.o: \ +Source/Uart.c \ + Source/define.h \ +Source/Uart.h \ +Source/Internaluart.h \ +Source/digitalio.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/terminal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o new file mode 100644 index 0000000..b959c4a Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o.d new file mode 100644 index 0000000..00be0c1 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Util.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/production/Source/Util.o: \ +Source/Util.c \ + Source/define.h \ +Source/Util.h \ +Source/PrintfServer.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o new file mode 100644 index 0000000..82f0a2e Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o.d new file mode 100644 index 0000000..49b53e3 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o: \ + Source/Watchdog.c \ +Source/define.h \ +Source/Watchdog.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o new file mode 100644 index 0000000..a978d97 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o.d new file mode 100644 index 0000000..9c4505f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o.d @@ -0,0 +1,21 @@ +build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o: \ + Source/WiFiCtrl.c \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/source/nmasic.h \ +Source/define.h \ +Source/Terminal.h \ + Source/winc3400/driver/include/m2m_periph.h \ +Source/ProtocolDefs.h \ + Source/BoardCfg.h \ +Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ + Source/BootloaderProtocol.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o new file mode 100644 index 0000000..94d2097 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o.d new file mode 100644 index 0000000..43c6c48 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/crc32.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/production/Source/crc32.o: \ +Source/crc32.c \ + Source/checksum.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o new file mode 100644 index 0000000..35b3bfe Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o.d new file mode 100644 index 0000000..187aa1f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o: \ + Source/exceptions.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o new file mode 100644 index 0000000..12a7a5e Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o.d new file mode 100644 index 0000000..ef15e86 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/ina219.o.d @@ -0,0 +1,5 @@ +build/ChaletDuinoV2_775F512H_/production/Source/ina219.o: \ +Source/ina219.c \ + Source/ina219.h \ +Source/define.h \ +Source/I2C.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o new file mode 100644 index 0000000..8b6e75f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o.d new file mode 100644 index 0000000..95982ed --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o: \ + Source/interrupts.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o new file mode 100644 index 0000000..cd4376c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o.d new file mode 100644 index 0000000..dc9731f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/main.o.d @@ -0,0 +1,30 @@ +build/ChaletDuinoV2_775F512H_/production/Source/main.o: \ +Source/main.c \ + Source/define.h \ +Source/Uart.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h \ +Source/timer.h \ +Source/Watchdog.h \ + Source/main.h \ +Source/NetworkProtocol.h \ +Source/ChaletPowerRelay.h \ + Source/BatteryMonitor.h \ +Source/CurrentSensor.h \ +Source/I2C.h \ + Source/SPI_Flash.h \ +Source/TemperatureSensor.h \ + Source/BootloaderInterface.h \ +Source/Terminal.h \ +Source/WiFiCtrl.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/socket/include/socket.h \ +Source/InternalUart.h \ + Source/Syslog.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o new file mode 100644 index 0000000..10e6124 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o.d new file mode 100644 index 0000000..c2b337c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/system.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/production/Source/system.o: \ +Source/system.c \ + Source/system.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o new file mode 100644 index 0000000..0c6a702 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o.d new file mode 100644 index 0000000..79379e8 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/template.o.d @@ -0,0 +1,3 @@ +build/ChaletDuinoV2_775F512H_/production/Source/template.o: \ + Source/template.c \ +Source/define.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o new file mode 100644 index 0000000..b837f75 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o.d new file mode 100644 index 0000000..4d17233 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/timer.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_775F512H_/production/Source/timer.o: \ +Source/timer.c \ + Source/timer.h \ +Source/define.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o new file mode 100644 index 0000000..32009b3 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o.d new file mode 100644 index 0000000..b9c37f3 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o: \ + Source/winc3400/bsp/source/nm_bsp.c \ +Source/winc3400/bsp/include/nm_bsp.h \ + Source/winc3400_config.h \ +Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ +Source/timer.h \ + Source/define.h \ +Source/define.h \ +Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o new file mode 100644 index 0000000..5dd1525 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d new file mode 100644 index 0000000..9ece0de --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o.d @@ -0,0 +1,13 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o: \ + Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ +Source/define.h \ + Source/BoardCfg.h \ +Source/define.h \ +Source/BoardCfg_ChaletduinoV2.h \ + Source/SPI.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o new file mode 100644 index 0000000..3b32278 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o.d new file mode 100644 index 0000000..bd8dc43 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o: \ + Source/winc3400/common/source/nm_common.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o new file mode 100644 index 0000000..afd00b1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o.d new file mode 100644 index 0000000..f5526cd --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o: \ + Source/winc3400/driver/source/m2m_ate_mode.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o new file mode 100644 index 0000000..a8332e6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o.d new file mode 100644 index 0000000..a59a00f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o: \ + Source/winc3400/driver/source/m2m_crypto.c \ + Source/winc3400/driver/include/m2m_crypto.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o new file mode 100644 index 0000000..54f0fd9 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o.d new file mode 100644 index 0000000..bd85a91 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o.d @@ -0,0 +1,14 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o: \ + Source/winc3400/driver/source/m2m_hif.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/include/m2m_periph.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o new file mode 100644 index 0000000..8def0fd Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o.d new file mode 100644 index 0000000..ac6b75a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o: \ + Source/winc3400/driver/source/m2m_ota.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/include/m2m_ota.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/driver/source/m2m_hif.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o new file mode 100644 index 0000000..2351ff0 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o.d new file mode 100644 index 0000000..a44daf0 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o: \ + Source/winc3400/driver/source/m2m_periph.c \ + Source/winc3400/driver/include/m2m_periph.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/source/m2m_hif.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o new file mode 100644 index 0000000..5c55482 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o.d new file mode 100644 index 0000000..1f2f7fc --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o.d @@ -0,0 +1,15 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o: \ + Source/winc3400/driver/source/m2m_ssl.c \ + Source/winc3400/driver/include/m2m_ssl.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/include/ecc_types.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o new file mode 100644 index 0000000..b1142b8 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o.d new file mode 100644 index 0000000..c777002 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o: \ + Source/winc3400/driver/source/m2m_wifi.c \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o new file mode 100644 index 0000000..08f402c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o.d new file mode 100644 index 0000000..c5cdb45 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o.d @@ -0,0 +1,10 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o: \ + Source/winc3400/driver/source/nmasic.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o new file mode 100644 index 0000000..ec93b78 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o.d new file mode 100644 index 0000000..f2d7419 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o: \ + Source/winc3400/driver/source/nmbus.c \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmi2c.h \ + Source/winc3400/driver/source/nmspi.h \ + Source/winc3400/driver/source/nmuart.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o new file mode 100644 index 0000000..2e1146d Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o.d new file mode 100644 index 0000000..e9f7f22 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o.d @@ -0,0 +1,13 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o: \ + Source/winc3400/driver/source/nmdrv.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/nmasic.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmspi.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o new file mode 100644 index 0000000..8e920d6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o.d new file mode 100644 index 0000000..b184c9a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o: \ + Source/winc3400/driver/source/nmi2c.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o new file mode 100644 index 0000000..908942c Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o.d new file mode 100644 index 0000000..6bb6671 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o: \ + Source/winc3400/driver/source/nmspi.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmspi.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o new file mode 100644 index 0000000..fe081bb Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o.d new file mode 100644 index 0000000..85eba9d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o.d @@ -0,0 +1,7 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o: \ + Source/winc3400/driver/source/nmuart.c \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o new file mode 100644 index 0000000..ca85f54 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o.d new file mode 100644 index 0000000..2b3aaa3 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o: \ + Source/winc3400/socket/source/socket.c \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/socket/include/socket.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/source/m2m_hif.h \ + Source/winc3400/socket/source/socket_internal.h \ + Source/winc3400/socket/include/m2m_socket_host_if.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o new file mode 100644 index 0000000..63ae9dc Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o.d new file mode 100644 index 0000000..73f975d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o: \ + Source/winc3400/spi_flash/source/spi_flash.c \ + Source/winc3400/spi_flash/include/spi_flash.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h \ + Source/winc3400/driver/source/nmbus.h \ + Source/winc3400/spi_flash/include/spi_flash_map.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o new file mode 100644 index 0000000..b1504bf Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o.d b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o.d new file mode 100644 index 0000000..852f2cb --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o.d @@ -0,0 +1,12 @@ +build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o: \ + Source/winc3400/winc_init.c \ +Source/winc3400/winc_init.h \ + Source/winc3400/driver/include/m2m_wifi.h \ + Source/winc3400/common/include/nm_common.h \ + Source/winc3400/bsp/include/nm_bsp.h \ +Source/winc3400_config.h \ + Source/winc3400/common/include/nm_debug.h \ + Source/winc3400/bsp/include/nm_bsp_internal.h \ + Source/winc3400/driver/include/m2m_types.h \ + Source/winc3400/driver/source/nmdrv.h \ + Source/winc3400/driver/source/nmasic.h diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o new file mode 100644 index 0000000..69b76c6 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o.d new file mode 100644 index 0000000..ecee19e --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o.d @@ -0,0 +1,61 @@ +build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o: \ + Source/BootloaderInterface.c Source/BootloaderInterface.h \ + Source/define.h Source/BootloaderProtocol.h Source/ProtocolDefs.h \ + Source/BoardCfg.h Source/BoardCfg_ChaletduinoV2.h Source/timer.h \ + Source/WiFiCtrl.h Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h Source/SPI_Flash.h \ + Source/FlashMapping.h Source/NetworkProtocol.h Source/Syslog.h \ + Source/checksum.h + +Source/BootloaderInterface.h: + +Source/define.h: + +Source/BootloaderProtocol.h: + +Source/ProtocolDefs.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: + +Source/timer.h: + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/SPI_Flash.h: + +Source/FlashMapping.h: + +Source/NetworkProtocol.h: + +Source/Syslog.h: + +Source/checksum.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o new file mode 100644 index 0000000..cf6a47f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o.d new file mode 100644 index 0000000..61b1cef --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o.d @@ -0,0 +1,44 @@ +build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o: \ + Source/BootloaderProtocol.c Source/define.h Source/ProtocolDefs.h \ + Source/BootloaderProtocol.h Source/BootloaderInterface.h \ + Source/WiFiCtrl.h Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h Source/checksum.h + +Source/define.h: + +Source/ProtocolDefs.h: + +Source/BootloaderProtocol.h: + +Source/BootloaderInterface.h: + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/checksum.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o new file mode 100644 index 0000000..cbed4ea Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o.d new file mode 100644 index 0000000..89fcc8e --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o.d @@ -0,0 +1,9 @@ +build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o: \ + Source/ChaletduinoV2Board.c Source/BoardCfg.h Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h + +Source/BoardCfg.h: + +Source/define.h: + +Source/BoardCfg_ChaletduinoV2.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o new file mode 100644 index 0000000..da05dba Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o.d new file mode 100644 index 0000000..985ae3d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o: \ + Source/DigitalIO.c Source/DigitalIO.h Source/BoardCfg.h Source/define.h \ + Source/BoardCfg_ChaletduinoV2.h + +Source/DigitalIO.h: + +Source/BoardCfg.h: + +Source/define.h: + +Source/BoardCfg_ChaletduinoV2.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o new file mode 100644 index 0000000..cf1ac36 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o.d new file mode 100644 index 0000000..90c63a0 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o.d @@ -0,0 +1,18 @@ +build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o: \ + Source/NetworkProtocol.c Source/define.h Source/NetworkProtocol.h \ + Source/ProtocolDefs.h Source/Uart.h Source/MasterCtrlInterface.h \ + Source/LoraNetworkInterface.h Source/LTENetworkInterface.h + +Source/define.h: + +Source/NetworkProtocol.h: + +Source/ProtocolDefs.h: + +Source/Uart.h: + +Source/MasterCtrlInterface.h: + +Source/LoraNetworkInterface.h: + +Source/LTENetworkInterface.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o new file mode 100644 index 0000000..9eb1c42 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o.d new file mode 100644 index 0000000..8382492 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI.o.d @@ -0,0 +1,11 @@ +build/ChaletDuinoV2_795F512H_/production/Source/SPI.o: Source/SPI.c \ + Source/define.h Source/BoardCfg.h Source/BoardCfg_ChaletduinoV2.h \ + Source/SPI.h + +Source/define.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: + +Source/SPI.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o new file mode 100644 index 0000000..04a2987 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o.d new file mode 100644 index 0000000..f14b27a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o.d @@ -0,0 +1,13 @@ +build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o: \ + Source/SPI_Flash.c Source/SPI_Flash.h Source/SPI.h Source/BoardCfg.h \ + Source/define.h Source/BoardCfg_ChaletduinoV2.h + +Source/SPI_Flash.h: + +Source/SPI.h: + +Source/BoardCfg.h: + +Source/define.h: + +Source/BoardCfg_ChaletduinoV2.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o new file mode 100644 index 0000000..31181d1 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o.d new file mode 100644 index 0000000..92d7cc9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o.d @@ -0,0 +1,44 @@ +build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o: Source/Syslog.c \ + Source/Syslog.h Source/define.h Source/terminal.h Source/WiFiCtrl.h \ + Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h Source/timer.h \ + Source/SIM7080GInterface.h + +Source/Syslog.h: + +Source/define.h: + +Source/terminal.h: + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/timer.h: + +Source/SIM7080GInterface.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o new file mode 100644 index 0000000..e75c151 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o.d new file mode 100644 index 0000000..e5d0bb5 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o.d @@ -0,0 +1,49 @@ +build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o: \ + Source/Terminal.c Source/terminal.h Source/define.h Source/WiFiCtrl.h \ + Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h Source/LedLightCtrl.h \ + Source/ChaletPowerRelay.h Source/BatteryMonitor.h \ + Source/BootloaderInterface.h Source/SIM7080GInterface.h + +Source/terminal.h: + +Source/define.h: + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/LedLightCtrl.h: + +Source/ChaletPowerRelay.h: + +Source/BatteryMonitor.h: + +Source/BootloaderInterface.h: + +Source/SIM7080GInterface.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o new file mode 100644 index 0000000..78c5445 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o.d new file mode 100644 index 0000000..aef12c3 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Util.o.d @@ -0,0 +1,8 @@ +build/ChaletDuinoV2_795F512H_/production/Source/Util.o: Source/Util.c \ + Source/define.h Source/Util.h Source/PrintfServer.h + +Source/define.h: + +Source/Util.h: + +Source/PrintfServer.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o new file mode 100644 index 0000000..7d368b3 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o.d new file mode 100644 index 0000000..93040da --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o.d @@ -0,0 +1,16 @@ +build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o: \ + Source/VolumeTransducer.c Source/VolumeTransducer.h Source/define.h \ + Source/BoardCfg.h Source/BoardCfg_ChaletduinoV2.h Source/timer.h \ + Source/Syslog.h + +Source/VolumeTransducer.h: + +Source/define.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: + +Source/timer.h: + +Source/Syslog.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o new file mode 100644 index 0000000..9bdf2a4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o.d new file mode 100644 index 0000000..d6d7a07 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o: \ + Source/Watchdog.c Source/define.h Source/Watchdog.h + +Source/define.h: + +Source/Watchdog.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o new file mode 100644 index 0000000..0f56870 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o.d new file mode 100644 index 0000000..0f56aec --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o.d @@ -0,0 +1,60 @@ +build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o: \ + Source/WiFiCtrl.c Source/WiFiCtrl.h \ + Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h \ + Source/winc3400_142/driver/include/nmasic.h Source/define.h \ + Source/Terminal.h Source/winc3400_142/driver/include/m2m_periph.h \ + Source/ProtocolDefs.h Source/BoardCfg.h Source/BoardCfg_ChaletduinoV2.h \ + Source/timer.h Source/BootloaderProtocol.h Source/SPI_Flash.h \ + Source/FlashMapping.h + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/winc3400_142/driver/include/nmasic.h: + +Source/define.h: + +Source/Terminal.h: + +Source/winc3400_142/driver/include/m2m_periph.h: + +Source/ProtocolDefs.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: + +Source/timer.h: + +Source/BootloaderProtocol.h: + +Source/SPI_Flash.h: + +Source/FlashMapping.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o new file mode 100644 index 0000000..02de317 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o.d new file mode 100644 index 0000000..3e57bb9 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/crc32.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_795F512H_/production/Source/crc32.o: Source/crc32.c \ + Source/checksum.h + +Source/checksum.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o new file mode 100644 index 0000000..267e6b4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o.d new file mode 100644 index 0000000..1567764 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o: \ + Source/exceptions.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o new file mode 100644 index 0000000..a7dc78a Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o.d new file mode 100644 index 0000000..49fa49c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o.d @@ -0,0 +1,2 @@ +build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o: \ + Source/interrupts.c diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o new file mode 100644 index 0000000..fd77ed0 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o.d new file mode 100644 index 0000000..625403c --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/main.o.d @@ -0,0 +1,93 @@ +build/ChaletDuinoV2_795F512H_/production/Source/main.o: Source/main.c \ + Source/define.h Source/Uart.h Source/BoardCfg.h \ + Source/BoardCfg_ChaletduinoV2.h Source/timer.h Source/Watchdog.h \ + Source/main.h Source/NetworkProtocol.h Source/ProtocolDefs.h \ + Source/ChaletPowerRelay.h Source/BatteryMonitor.h Source/CurrentSensor.h \ + Source/I2C.h Source/SPI_Flash.h Source/TemperatureSensor.h \ + Source/LoraWatchdog.h Source/LCDCtrl.h Source/SIM7080GInterface.h \ + Source/LTENetworkInterface.h Source/BootloaderInterface.h \ + Source/VolumeTransducer.h Source/hd44780.h Source/Terminal.h \ + Source/WiFiCtrl.h Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h Source/InternalUart.h \ + Source/Syslog.h Source/LoraNetworkInterface.h + +Source/define.h: + +Source/Uart.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: + +Source/timer.h: + +Source/Watchdog.h: + +Source/main.h: + +Source/NetworkProtocol.h: + +Source/ProtocolDefs.h: + +Source/ChaletPowerRelay.h: + +Source/BatteryMonitor.h: + +Source/CurrentSensor.h: + +Source/I2C.h: + +Source/SPI_Flash.h: + +Source/TemperatureSensor.h: + +Source/LoraWatchdog.h: + +Source/LCDCtrl.h: + +Source/SIM7080GInterface.h: + +Source/LTENetworkInterface.h: + +Source/BootloaderInterface.h: + +Source/VolumeTransducer.h: + +Source/hd44780.h: + +Source/Terminal.h: + +Source/WiFiCtrl.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/InternalUart.h: + +Source/Syslog.h: + +Source/LoraNetworkInterface.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o new file mode 100644 index 0000000..fec7d1b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o.d new file mode 100644 index 0000000..75da75e --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/system.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_795F512H_/production/Source/system.o: Source/system.c \ + Source/system.h + +Source/system.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o new file mode 100644 index 0000000..f4049b4 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o.d new file mode 100644 index 0000000..9bc8352 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/template.o.d @@ -0,0 +1,4 @@ +build/ChaletDuinoV2_795F512H_/production/Source/template.o: \ + Source/template.c Source/define.h + +Source/define.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o new file mode 100644 index 0000000..a0336f5 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o.d new file mode 100644 index 0000000..582268d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/timer.o.d @@ -0,0 +1,6 @@ +build/ChaletDuinoV2_795F512H_/production/Source/timer.o: Source/timer.c \ + Source/timer.h Source/define.h + +Source/timer.h: + +Source/define.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o new file mode 100644 index 0000000..133f7ff Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o.d new file mode 100644 index 0000000..65ec8a7 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o.d @@ -0,0 +1,22 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o: \ + Source/winc3400_142/common/source/nm_common.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h Source/timer.h \ + Source/define.h Source/BoardCfg.h Source/BoardCfg_ChaletduinoV2.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/timer.h: + +Source/define.h: + +Source/BoardCfg.h: + +Source/BoardCfg_ChaletduinoV2.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o new file mode 100644 index 0000000..23a2d6f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o.d new file mode 100644 index 0000000..2e6e183 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o.d @@ -0,0 +1,27 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o: \ + Source/winc3400_142/driver/source/m2m_flash.c \ + Source/winc3400_142/driver/include/m2m_flash.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h Source/spi_flash.h \ + Source/winc3400_142/spi_flash/include/spi_flash_map.h \ + Source/winc3400_142/driver/include/nmdrv.h + +Source/winc3400_142/driver/include/m2m_flash.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/spi_flash.h: + +Source/winc3400_142/spi_flash/include/spi_flash_map.h: + +Source/winc3400_142/driver/include/nmdrv.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o new file mode 100644 index 0000000..d492124 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o.d new file mode 100644 index 0000000..f1c85da --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o.d @@ -0,0 +1,34 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o: \ + Source/winc3400_142/driver/source/m2m_hif.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/nmbus.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/driver/include/m2m_hif.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmasic.h \ + Source/winc3400_142/driver/include/m2m_periph.h \ + Source/winc3400_142/driver/include/m2m_types.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/nmbus.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/driver/include/m2m_hif.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmasic.h: + +Source/winc3400_142/driver/include/m2m_periph.h: + +Source/winc3400_142/driver/include/m2m_types.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o new file mode 100644 index 0000000..f156014 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o.d new file mode 100644 index 0000000..a72e2a3 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o.d @@ -0,0 +1,31 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o: \ + Source/winc3400_142/driver/source/m2m_ota.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/m2m_ota.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/driver/include/m2m_hif.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/m2m_ota.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/driver/include/m2m_hif.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o new file mode 100644 index 0000000..7c5b489 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o.d new file mode 100644 index 0000000..b279a8f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o.d @@ -0,0 +1,25 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o: \ + Source/winc3400_142/driver/source/m2m_periph.c \ + Source/winc3400_142/driver/include/m2m_periph.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmasic.h \ + Source/winc3400_142/driver/include/m2m_hif.h + +Source/winc3400_142/driver/include/m2m_periph.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmasic.h: + +Source/winc3400_142/driver/include/m2m_hif.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o new file mode 100644 index 0000000..07b5c0b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o.d new file mode 100644 index 0000000..37f12e6 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o.d @@ -0,0 +1,40 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o: \ + Source/winc3400_142/driver/source/m2m_ssl.c \ + Source/winc3400_142/driver/include/m2m_ssl.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/driver/include/ecc_types.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/socket/include/netinet_in.h \ + Source/winc3400_142/driver/include/m2m_hif.h \ + Source/winc3400_142/driver/include/nmasic.h + +Source/winc3400_142/driver/include/m2m_ssl.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/driver/include/ecc_types.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/winc3400_142/driver/include/m2m_hif.h: + +Source/winc3400_142/driver/include/nmasic.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o new file mode 100644 index 0000000..00c2635 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o.d new file mode 100644 index 0000000..415a81d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o.d @@ -0,0 +1,28 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o: \ + Source/winc3400_142/driver/source/m2m_wifi.c \ + Source/winc3400_142/driver/include/m2m_wifi.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/driver/include/m2m_hif.h \ + Source/winc3400_142/driver/include/nmasic.h + +Source/winc3400_142/driver/include/m2m_wifi.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/driver/include/m2m_hif.h: + +Source/winc3400_142/driver/include/nmasic.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o new file mode 100644 index 0000000..8052a17 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o.d new file mode 100644 index 0000000..5dbc0bc --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o.d @@ -0,0 +1,22 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o: \ + Source/winc3400_142/driver/source/nmasic.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/nmbus.h \ + Source/winc3400_142/driver/include/nmasic.h \ + Source/winc3400_142/driver/include/m2m_types.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/nmbus.h: + +Source/winc3400_142/driver/include/nmasic.h: + +Source/winc3400_142/driver/include/m2m_types.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o new file mode 100644 index 0000000..7ae489b Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o.d new file mode 100644 index 0000000..4595ebe --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o.d @@ -0,0 +1,19 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o: \ + Source/winc3400_142/driver/source/nmbus.c \ + Source/winc3400_142/driver/include/nmbus.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/nmspi.h + +Source/winc3400_142/driver/include/nmbus.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/nmspi.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o new file mode 100644 index 0000000..4827f3a Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o.d new file mode 100644 index 0000000..630639a --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o.d @@ -0,0 +1,28 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o: \ + Source/winc3400_142/driver/source/nmdrv.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/nmbus.h \ + Source/winc3400_142/driver/include/nmdrv.h \ + Source/winc3400_142/driver/include/nmasic.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/driver/include/nmspi.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/nmbus.h: + +Source/winc3400_142/driver/include/nmdrv.h: + +Source/winc3400_142/driver/include/nmasic.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/driver/include/nmspi.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o new file mode 100644 index 0000000..cd00e15 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o.d new file mode 100644 index 0000000..a03969f --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o.d @@ -0,0 +1,25 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o: \ + Source/winc3400_142/driver/source/nmspi.c \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/driver/include/nmspi.h Source/spi.h \ + Source/BoardCfg.h Source/define.h Source/BoardCfg_ChaletduinoV2.h + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/driver/include/nmspi.h: + +Source/spi.h: + +Source/BoardCfg.h: + +Source/define.h: + +Source/BoardCfg_ChaletduinoV2.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o new file mode 100644 index 0000000..7320062 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o.d new file mode 100644 index 0000000..ef163fe --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o.d @@ -0,0 +1,22 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o: \ + Source/winc3400_142/socket/source/inet_addr.c \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/socket/include/netinet_in.h + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/socket/include/netinet_in.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o new file mode 100644 index 0000000..ebeda07 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o.d new file mode 100644 index 0000000..ffd1200 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o.d @@ -0,0 +1,22 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o: \ + Source/winc3400_142/socket/source/inet_ntop.c \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/socket/include/netinet_in.h + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/socket/include/netinet_in.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o new file mode 100644 index 0000000..a75a60f Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o.d new file mode 100644 index 0000000..fdd955d --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o.d @@ -0,0 +1,31 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o: \ + Source/winc3400_142/socket/source/socket.c \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/socket/include/socket.h \ + Source/winc3400_142/driver/include/m2m_types.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/common/include/nm_debug.h \ + Source/winc3400_142/socket/include/netinet_in.h \ + Source/winc3400_142/driver/include/m2m_hif.h \ + Source/winc3400_142/socket/include/m2m_socket_host_if.h \ + Source/winc3400_142/socket/include/socket.h + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/socket/include/socket.h: + +Source/winc3400_142/driver/include/m2m_types.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/common/include/nm_debug.h: + +Source/winc3400_142/socket/include/netinet_in.h: + +Source/winc3400_142/driver/include/m2m_hif.h: + +Source/winc3400_142/socket/include/m2m_socket_host_if.h: + +Source/winc3400_142/socket/include/socket.h: diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o new file mode 100644 index 0000000..ea005b3 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o differ diff --git a/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o.d b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o.d new file mode 100644 index 0000000..e39d737 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o.d @@ -0,0 +1,18 @@ +build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o: \ + Source/winc3400_142/spi_flash/source/spi_flash.c Source/spi_flash.h \ + Source/winc3400_142/spi_flash/include/spi_flash_map.h \ + Source/winc3400_142/common/include/nm_common.h Source/define.h \ + Source/winc3400_142/bsp/include/nm_bsp.h \ + Source/winc3400_142/common/include/nm_debug.h + +Source/spi_flash.h: + +Source/winc3400_142/spi_flash/include/spi_flash_map.h: + +Source/winc3400_142/common/include/nm_common.h: + +Source/define.h: + +Source/winc3400_142/bsp/include/nm_bsp.h: + +Source/winc3400_142/common/include/nm_debug.h: diff --git a/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o b/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o new file mode 100644 index 0000000..c251031 Binary files /dev/null and b/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o differ diff --git a/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o.d b/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o.d new file mode 100644 index 0000000..bcb60f0 --- /dev/null +++ b/AudioConsole.X/build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o.d @@ -0,0 +1,9 @@ +build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o: \ + Source/ChaletduinoBoard.c Source/BoardCfg.h Source/define.h \ + Source/BoardCfg_Chaletduino.h + +Source/BoardCfg.h: + +Source/define.h: + +Source/BoardCfg_Chaletduino.h: diff --git a/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf new file mode 100644 index 0000000..6bee864 Binary files /dev/null and b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf differ diff --git a/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map new file mode 100644 index 0000000..2d55783 --- /dev/null +++ b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map @@ -0,0 +1,5334 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o (malloc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + (_printf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (_printf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) (__floatunsisf) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +mBatteryCurrent 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +TerminalWorkString 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +gu16BufferSize 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mac_addr 0x6 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mRxData 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +mDeviceID 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o +ActualTemp 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +PowerRelayState 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o +param 0x1c build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +mModuleIPConfig 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +gsockerrno 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +astUartData 0x620 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +I2CSlaveBuffer 0xa build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +DataChunkWritten 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTxData 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mI2CWaitCounter 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +gastrSockets 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +at_sb_printf 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o +mTerminalTickState 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gfpPingCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gu8OpCode 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +astTimer 0xf0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d003800 0xbcd4 48340 App's exec code +.text._vfprintf_cdfFnop 0x9d00f4d4 0x13d4 5076 +.text 0x9d0108a8 0x7248 29256 App's exec code +.dinit 0x9d017af0 0xb50 2896 +.text 0x9d018640 0xb04 2820 App's exec code +.rodata 0x9d019144 0x990 2448 Read-only const +.text 0x9d019ad4 0x974 2420 App's exec code +.text._vfscanf_s 0x9d01a448 0x868 2152 +.text 0x9d01acb0 0x2a84 10884 App's exec code +.rodata 0x9d01d734 0x494 1172 Read-only const +.text 0x9d01dbc8 0x1108 4360 App's exec code +.rodata 0x9d01ecd0 0x404 1028 Read-only const +.text 0x9d01f0d4 0x1048 4168 App's exec code +.text.scale 0x9d02011c 0x2a0 672 +.text.fpsubadd 0x9d0203bc 0x278 632 +.text.malloc 0x9d020634 0x278 632 +.text 0x9d0208ac 0x26c 620 App's exec code +.rodata 0x9d020b18 0x268 616 Read-only const +.text 0x9d020d80 0x4a8 1192 App's exec code +.text.fp32div 0x9d021228 0x230 560 +.text.__floatdisf 0x9d021458 0x220 544 +.text.fp32mul 0x9d021678 0x1bc 444 +.text 0x9d021834 0x1a0 416 App's exec code +.text.realloc 0x9d0219d4 0x194 404 +.text._sbrk_init 0x9d021b68 0x194 404 +.text._filbuf 0x9d021cfc 0x188 392 +.text.read 0x9d021e84 0x174 372 +.text 0x9d021ff8 0x2d0 720 App's exec code +.text.fputc 0x9d0222c8 0x15c 348 +.text._flsbuf 0x9d022424 0x12c 300 +.text 0x9d022550 0x11c 284 App's exec code +.text.fgetc 0x9d02266c 0x108 264 +.rodata 0x9d022774 0x204 516 Read-only const +.text.setvbuf 0x9d022978 0xfc 252 +.rodata 0x9d022a74 0x4 4 Read-only const +.rodata 0x9d022a78 0xe0 224 Read-only const +.text.general_exception 0x9d022b58 0xdc 220 +.text 0x9d022c34 0x1ac 428 App's exec code +.rodata 0x9d022de0 0xc8 200 Read-only const +.text._sbrk 0x9d022ea8 0xc4 196 +.text 0x9d022f6c 0xa8 168 App's exec code +.text.atoi 0x9d023014 0xa8 168 +.text.range 0x9d0230bc 0xa0 160 +.text.fpcmp 0x9d02315c 0x9c 156 +.text.fflush 0x9d0231f8 0x94 148 +.text.write 0x9d02328c 0x94 148 +.text.libm 0x9d023320 0x88 136 +.text 0x9d0233a8 0x80 128 App's exec code +.text.fptoul 0x9d023428 0x7c 124 +.text.SoftReset 0x9d0234a4 0x78 120 +.text.fputs 0x9d02351c 0x78 120 +.text.strncmp 0x9d023594 0x78 120 +.text.ungetc 0x9d02360c 0x74 116 +.text 0x9d023680 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d023758 0x68 104 +.rodata 0x9d0237c0 0x68 104 Read-only const +.text.sitofp 0x9d023828 0x60 96 +.text.wspace 0x9d023888 0x60 96 +.text 0x9d0238e8 0x58 88 App's exec code +.text._sscanf_s 0x9d023940 0x54 84 +.text._bufallo 0x9d023994 0x54 84 +.text.sbrk 0x9d0239e8 0x50 80 +.text.main_entry 0x9d023a38 0x4c 76 +.text 0x9d023a84 0x4c 76 App's exec code +.text._bootstrap_except 0x9d023ad0 0x48 72 +.text 0x9d023b18 0x44 68 App's exec code +.text.puts 0x9d023b5c 0x44 68 +.text._printf_cdfFnopsu 0x9d023ba0 0x40 64 +.vector_default 0x9d023be0 0x38 56 +.rodata 0x9d023c18 0x30 48 Read-only const +.text.INTConfigureSyste 0x9d023c48 0x30 48 +.text.free 0x9d023c78 0x30 48 +.rodata 0x9d023ca8 0x2c 44 Read-only const +.text._stub_sbd_memlayo 0x9d023cd4 0x2c 44 +.rodata 0x9d023d00 0x28 40 Read-only const +.text.tolower 0x9d023d28 0x24 36 +.text.toupper 0x9d023d4c 0x24 36 +.text 0x9d023d70 0x20 32 App's exec code +.rodata 0x9d023d90 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d023dac 0x1c 28 +.text.setbuf 0x9d023dc8 0x1c 28 +.rodata 0x9d023de4 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d023dfc 0x18 24 +.text.CheKseg0CacheOn 0x9d023e14 0x18 24 +.text 0x9d023e2c 0x18 24 App's exec code +.text.isalnum 0x9d023e44 0x18 24 +.text.isalpha 0x9d023e5c 0x18 24 +.text.iscntrl 0x9d023e74 0x18 24 +.text.isdigit 0x9d023e8c 0x18 24 +.text.isgraph 0x9d023ea4 0x18 24 +.text.islower 0x9d023ebc 0x18 24 +.text.isprint 0x9d023ed4 0x18 24 +.text.ispunct 0x9d023eec 0x18 24 +.text.isspace 0x9d023f04 0x18 24 +.text.isupper 0x9d023f1c 0x18 24 +.text.isxdigit 0x9d023f34 0x18 24 +.text._buffree 0x9d023f4c 0x14 20 +.text.__exception_handl 0x9d023f60 0xc 12 +.rodata 0x9d023f6c 0x1c 28 Read-only const +.text.INTEnableInterrup 0x9d023f88 0x8 8 +.text.INTDisableInterru 0x9d023f90 0x8 8 +.text._on_reset 0x9d023f98 0x8 8 +.text._on_bootstrap 0x9d023fa0 0x8 8 +.text.isascii 0x9d023fa8 0x8 8 +.text.toascii 0x9d023fb0 0x8 8 +.text._tolower 0x9d023fb8 0x8 8 +.text._toupper 0x9d023fc0 0x8 8 +.text.getpagesize 0x9d023fc8 0x8 8 +.rodata 0x9d023fd0 0x8 8 Read-only const +.rodata 0x9d023fd8 0x4 4 Read-only const + Total kseg0_program_mem used : 0x207dc 133084 26.1% of 0x7c7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- + Total kseg0_boot_mem used : 0 0 <1% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d002180 0x10 16 General-Exception +.vector_0 0x9d002200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d002220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d002240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d002260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d002280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0022a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0022c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0022e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d002300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d002320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d002340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d002360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d002380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0023a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0023c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0023e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d002400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d002420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d002440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d002460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d002480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0024a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0024c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0024e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d002500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d002520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d002540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d002560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d002580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0025a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0025c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0025e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d002600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d002620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d002640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d002660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d002680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0026a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0026c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0026e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d002700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d002720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d002740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d002760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d002780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0027a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0027c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0027e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d002800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d002820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d002840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d002860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d002880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0028a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0028c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0028e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d002900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d002920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d002940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d002960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d002980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0029a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0029c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0029e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x1f0 496 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x200 512 43.8% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x20bec 134124 25.9% of 0x7e47f + -------------------------------------------------------------------------- + + +kseg0 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +reserve_data_0_kseg0 0x80000000 0x200 512 + Total kseg0_data_mem used : 0x200 512 100.0% of 0x200 + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +reserve_data_0_kseg1 0xa0000000 0x200 512 +.eh_frame 0xa0000200 0x30 48 +.sdata 0xa0000230 0x74 116 Small init data +.sbss 0xa00002a4 0x194 404 Small uninit data +.bss 0xa0000438 0x2e30 11824 Uninitialized data +.data 0xa0003268 0x4bc 1212 Initialized data +.bss 0xa0003724 0x800 2048 Uninitialized data +.data 0xa0003f24 0x2c4 708 Initialized data +.bss 0xa00041e8 0x74 116 Uninitialized data + Total kseg1_data_mem used : 0x425c 16988 25.9% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x445c 17500 26.5% of 0x10200 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa0004260 0x200 512 Reserved for heap +stack 0xa0004478 0xbb78 47992 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_data_mem 0x80000000 0x00000200 +kseg1_data_mem 0xa0000000 0x00010000 w !x +kseg0_boot_mem 0x9d003000 0x000007f0 +kseg1_boot_mem 0xbfc00000 0x00000490 +kseg0_program_mem 0x9d003800 0x0007c7ff xr +exception_mem 0x9d002000 0x00001000 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + + +reserve_data_0_kseg0 + 0x80000000 0x200 + 0x80000000 0x2 SHORT 0x0 + 0x000001fd . = 0x1fd + *fill* 0x80000002 0x1fb + 0x80000200 . = ALIGN (0x4) + *fill* 0x800001fd 0x3 + +reserve_data_0_kseg1 + 0xa0000000 0x200 + 0xa0000000 0x2 SHORT 0x0 + 0x000001fd . = 0x1fd + *fill* 0xa0000002 0x1fb + 0xa0000200 . = ALIGN (0x4) + *fill* 0xa00001fd 0x3 + +reserve_boot_0x1fc02000_kseg0 + 0x9fc02000 0xff0 + 0x9fc02000 0x2 SHORT 0x0 + 0x00000500 . = 0x500 + *fill* 0x9fc02002 0x4fe + 0x9fc02500 . = ALIGN (0x4) + 0x9fc02500 0x2 SHORT 0x0 + 0x00000ff0 . = 0xff0 + *fill* 0x9fc02502 0xaee + 0x9fc02ff0 . = ALIGN (0x4) + +reserve_boot_0x1fc02000_kseg1 + 0xbfc02000 0xff0 + 0xbfc02000 0x2 SHORT 0x0 + 0x00000500 . = 0x500 + *fill* 0xbfc02002 0x4fe + 0xbfc02500 . = ALIGN (0x4) + 0xbfc02500 0x2 SHORT 0x0 + 0x00000ff0 . = 0xff0 + *fill* 0xbfc02502 0xaee + 0xbfc02ff0 . = ALIGN (0x4) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Util.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/main.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/system.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/template.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/timer.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000001 __MPLAB_DEBUG = 0x1 + 0x00000001 __DEBUG = 0x1 + 0x00000001 __MPLAB_DEBUGGER_ICD3 = 0x1 + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d002000 _ebase_address = 0x9d002000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d002180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x1f0 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + *(.reset.startup) + .reset.startup + 0xbfc00008 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d002180 0x10 + *(.gen_handler) + .gen_handler 0x9d002180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d002200 0x8 + *(.vector_0) + .vector_0 0x9d002200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d002200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d002220 0x8 + *(.vector_1) + .vector_1 0x9d002220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d002220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d002240 0x8 + *(.vector_2) + .vector_2 0x9d002240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d002240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d002260 0x8 + *(.vector_3) + .vector_3 0x9d002260 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0x9d002260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d002280 0x8 + *(.vector_4) + .vector_4 0x9d002280 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0x9d002280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0022a0 0x8 + *(.vector_5) + .vector_5 0x9d0022a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0022a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0022c0 0x8 + *(.vector_6) + .vector_6 0x9d0022c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0022c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0022e0 0x8 + *(.vector_7) + .vector_7 0x9d0022e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0022e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d002300 0x8 + *(.vector_8) + .vector_8 0x9d002300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d002300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d002320 0x8 + *(.vector_9) + .vector_9 0x9d002320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d002320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d002340 0x8 + *(.vector_10) + .vector_10 0x9d002340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d002340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d002360 0x8 + *(.vector_11) + .vector_11 0x9d002360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d002360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d002380 0x8 + *(.vector_12) + .vector_12 0x9d002380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d002380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0023a0 0x8 + *(.vector_13) + .vector_13 0x9d0023a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0023a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0023c0 0x8 + *(.vector_14) + .vector_14 0x9d0023c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0023c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0023e0 0x8 + *(.vector_15) + .vector_15 0x9d0023e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0023e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d002400 0x8 + *(.vector_16) + .vector_16 0x9d002400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d002400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d002420 0x8 + *(.vector_17) + .vector_17 0x9d002420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d002420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d002440 0x8 + *(.vector_18) + .vector_18 0x9d002440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d002440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d002460 0x8 + *(.vector_19) + .vector_19 0x9d002460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d002460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d002480 0x8 + *(.vector_20) + .vector_20 0x9d002480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d002480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0024a0 0x8 + *(.vector_21) + .vector_21 0x9d0024a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0024a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0024c0 0x8 + *(.vector_22) + .vector_22 0x9d0024c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0024c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0024e0 0x8 + *(.vector_23) + .vector_23 0x9d0024e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0024e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d002500 0x8 + *(.vector_24) + .vector_24 0x9d002500 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d002500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d002520 0x8 + *(.vector_25) + .vector_25 0x9d002520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d002520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d002540 0x8 + *(.vector_26) + .vector_26 0x9d002540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d002540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d002560 0x8 + *(.vector_27) + .vector_27 0x9d002560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d002560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d002580 0x8 + *(.vector_28) + .vector_28 0x9d002580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d002580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0025a0 0x8 + *(.vector_29) + .vector_29 0x9d0025a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0025a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0025c0 0x8 + *(.vector_30) + .vector_30 0x9d0025c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0025c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0025e0 0x8 + *(.vector_31) + .vector_31 0x9d0025e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0025e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d002600 0x8 + *(.vector_32) + .vector_32 0x9d002600 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d002600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d002620 0x8 + *(.vector_33) + .vector_33 0x9d002620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d002620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d002640 0x8 + *(.vector_34) + .vector_34 0x9d002640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d002640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d002660 0x8 + *(.vector_35) + .vector_35 0x9d002660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d002660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d002680 0x8 + *(.vector_36) + .vector_36 0x9d002680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d002680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0026a0 0x8 + *(.vector_37) + .vector_37 0x9d0026a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0026a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0026c0 0x8 + *(.vector_38) + .vector_38 0x9d0026c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0026c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0026e0 0x8 + *(.vector_39) + .vector_39 0x9d0026e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0026e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d002700 0x8 + *(.vector_40) + .vector_40 0x9d002700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d002700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d002720 0x8 + *(.vector_41) + .vector_41 0x9d002720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d002720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d002740 0x8 + *(.vector_42) + .vector_42 0x9d002740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d002740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d002760 0x8 + *(.vector_43) + .vector_43 0x9d002760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d002760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d002780 0x8 + *(.vector_44) + .vector_44 0x9d002780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d002780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0027a0 0x8 + *(.vector_45) + .vector_45 0x9d0027a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0027a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0027c0 0x8 + *(.vector_46) + .vector_46 0x9d0027c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0027c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0027e0 0x8 + *(.vector_47) + .vector_47 0x9d0027e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0027e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d002800 0x8 + *(.vector_48) + .vector_48 0x9d002800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d002800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d002820 0x8 + *(.vector_49) + .vector_49 0x9d002820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d002820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d002840 0x8 + *(.vector_50) + .vector_50 0x9d002840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d002840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d002860 0x8 + *(.vector_51) + .vector_51 0x9d002860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d002860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d002880 0x8 + *(.vector_52) + .vector_52 0x9d002880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d002880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0028a0 0x8 + *(.vector_53) + .vector_53 0x9d0028a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0028a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0028c0 0x8 + *(.vector_54) + .vector_54 0x9d0028c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0028c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0028e0 0x8 + *(.vector_55) + .vector_55 0x9d0028e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0028e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d002900 0x8 + *(.vector_56) + .vector_56 0x9d002900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d002900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d002920 0x8 + *(.vector_57) + .vector_57 0x9d002920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d002920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d002940 0x8 + *(.vector_58) + .vector_58 0x9d002940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d002940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d002960 0x8 + *(.vector_59) + .vector_59 0x9d002960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d002960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d002980 0x8 + *(.vector_60) + .vector_60 0x9d002980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d002980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0029a0 0x8 + *(.vector_61) + .vector_61 0x9d0029a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0029a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0029c0 0x8 + *(.vector_62) + .vector_62 0x9d0029c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0029c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0029e0 0x8 + *(.vector_63) + .vector_63 0x9d0029e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0029e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup + *(.startup) + +.text 0x9d003800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d003800 . = ALIGN (0x4) + +.init 0x9d003800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d003800 . = ALIGN (0x4) + +.fini 0x9d003800 0x0 + *(.fini) + 0x9d003800 . = ALIGN (0x4) + +.preinit_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d003800 PROVIDE (__preinit_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.init_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d003800 PROVIDE (__init_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.fini_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d003800 PROVIDE (__fini_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.ctors 0x9d003800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d003800 . = ALIGN (0x4) + +.dtors 0x9d003800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d003800 . = ALIGN (0x4) + +.rodata 0x9d003800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d003800 . = ALIGN (0x4) + +.sdata2 0x9d003000 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d003000 . = ALIGN (0x4) + +.sbss2 0x9d003000 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d003000 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d003000 . = ALIGN (0x4) + +.dbg_data 0xa0000200 0x0 + 0xa0000200 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000200 0x0 + *(.jcr) + 0xa0000200 . = ALIGN (0x4) + +.eh_frame 0xa0000200 0x30 + *(.eh_frame) + .eh_frame 0xa0000200 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000230 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000230 . = ALIGN (0x4) + +.persist 0xa0000230 0x0 + 0xa0000230 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000230 . = ALIGN (0x4) + 0xa0000230 _persist_end = . + +.data 0xa0000230 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000230 . = ALIGN (0x4) + 0xa0000230 . = . + 0xa0008220 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000230 0x0 + *(.got.plt) + *(.got) + 0xa0000230 . = ALIGN (0x4) + +.sdata 0xa0000230 0x74 + 0xa0000230 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000230 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000230 egstrNmBusCapabilities + .sdata 0xa0000234 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .sdata 0xa000023c 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .sdata 0xa0000240 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .sdata 0xa0000244 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000244 State + *fill* 0xa0000246 0x2 + .sdata 0xa0000248 0xc build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .sdata 0xa0000254 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0xa0000254 gUartStrings + .sdata 0xa0000258 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .sdata 0xa0000260 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa0000267 TerminalSocket + 0xa0000268 TerminalServerSocket + 0xa0000269 SyslogSocket + 0xa000026a SyslogServerSocket + 0xa000026b NetworkSocket + 0xa000026c NetworkServerSocket + 0xa000026d BootloaderSocket + 0xa000026e BootloaderServerSocket + 0xa000026f mWiFiState + .sdata 0xa0000270 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + 0xa0000270 mLoraPreamble + .sdata 0xa0000274 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .sdata 0xa000027c 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .sdata 0xa0000284 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .sdata 0xa000028c 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa0000292 BootloaderState + 0xa0000294 BootloaderDataStartPtr + .sdata 0xa000029c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000029c _Files + .sdata 0xa00002a0 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa00002a0 __XC_UART + 0xa00002a4 . = ALIGN (0x4) + 0xa00002a4 _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa00002a4 . = ALIGN (0x4) + 0xa00002a4 _data_end = . + 0xa00002a4 _bss_begin = . + +.sbss 0xa00002a4 0x194 + 0xa00002a4 _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa00002a4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .sbss 0xa00002a8 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + 0xa00002b0 pfWifiCb + 0xa00002b4 pfIpCb + 0xa00002b8 pfOtaCb + 0xa00002bc pfSigmaCb + 0xa00002c0 pfHifCb + 0xa00002c4 pfSSLCb + .sbss 0xa00002c8 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .sbss 0xa00002d0 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .sbss 0xa00002d8 0x14 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .sbss 0xa00002ec 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .sbss 0xa00002f0 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + *fill* 0xa00002f1 0x1 + .sbss 0xa00002f2 0x6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa00002f2 gu16SessionID + 0xa00002f4 gbSocketInit + .sbss 0xa00002f8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .sbss 0xa00002fc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00002fc LoraData + .sbss 0xa0000300 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000300 DataSize + 0xa0000304 DataCtr + 0xa0000308 BufPtr + 0xa000030c RxPtr + 0xa000030d Command + 0xa000030e CRC + 0xa000030f SenderID + 0xa0000310 SenderAddress + 0xa0000311 Flags + 0xa0000312 IsUpdating + 0xa0000314 BmpDataPtr + .sbss 0xa0000318 0xc build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .sbss 0xa0000324 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa0000324 gu32HostIp + 0xa0000328 gu8RetryCount + 0xa0000338 mWiFiInitOK + .sbss 0xa000033c 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .sbss 0xa0000340 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0xa0000340 ina219_currentDivider_mA + 0xa0000344 ina219_powerDivider_mW + .sbss 0xa0000348 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + 0xa0000348 WatchdogTriggered + .sbss 0xa000034c 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa000034c BootloaderHeader + 0xa0000350 BootloaderDataSize + 0xa0000354 BootloaderDataCtr + 0xa0000358 BootloaderBufPtr + 0xa000035c BootloaderCRC + 0xa0000360 BootloaderCommand + .sbss 0xa0000364 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .sbss 0xa0000365 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0000365 _outdone + *fill* 0xa0000366 0x2 + .sbss 0xa0000368 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0000368 __allocp + 0xa000036c __alloct + 0xa0000370 __allocx + .sbss 0xa0000378 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa0000378 errno + .sbss 0xa000037c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa000037c _minbrk + 0xa0000380 _maxbrk + *(.scommon) + .scommon 0xa0000384 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0xa0000384 at_sb_printf + .scommon 0xa0000388 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000388 mWifiSPIBaudrate + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + *fill* 0xa0000389 0x3 + .scommon 0xa000038c 0x15 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa000038c gpfAppResolveCb + 0xa0000390 gu16BufferSize + 0xa0000394 gpfAppSocketCb + 0xa0000398 gsockerrno + 0xa000039c gfpPingCb + 0xa00003a0 gu8OpCode + .scommon 0xa00003a1 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .scommon 0xa00003a1 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + *fill* 0xa00003a1 0x3 + .scommon 0xa00003a4 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00003a4 acIntUartRxBuff + *fill* 0xa00003a6 0x2 + .scommon 0xa00003a8 0x14 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0xa00003a8 mTerminalOpened + 0xa00003ac TerminalDataPtr + 0xa00003b0 mTerminalPendingAction + 0xa00003b4 mHelpStringPtr + 0xa00003b8 mTerminalTickState + .scommon 0xa00003bc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0xa00003bc ActualTemp + .scommon 0xa00003c0 0xa build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa00003c0 u8IsMacAddrValid + 0xa00003c4 mac_addr + .scommon 0xa00003ca 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + *fill* 0xa00003ca 0x2 + .scommon 0xa00003cc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + 0xa00003cc PowerRelayState + .scommon 0xa00003d0 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + 0xa00003d0 mBatteryCurrent + 0xa00003d4 mVoltageMeanSum + 0xa00003d8 mVoltageMeanCount + 0xa00003dc mBatterySOC + 0xa00003e0 mBatteryVoltage + 0xa00003e4 mCurrentModuleOK + .scommon 0xa00003e8 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + 0xa00003e8 mLastTransactionOK + 0xa00003ec mI2CWaitCounter + .scommon 0xa00003f0 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0xa00003f0 mSPIFlashHighSpeedBaudrate + 0xa00003f1 mSPIFlashBaudrate + *fill* 0xa00003f2 0x2 + .scommon 0xa00003f4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0xa00003f4 mSyslogBufPtr + .scommon 0xa00003f8 0x38 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0xa00003f8 CurDataChunkSize + 0xa00003fc BootloaderFirmwareChunkWriteCount + 0xa0000400 BootloaderFlashWriteDataPtr + 0xa0000404 BootloaderFlashErased + 0xa0000408 BootloaderFlashWriteState + 0xa000040c BootloaderCurFlashWriteAddress + 0xa0000410 BooloaderFlashEraseState + 0xa0000414 BootloaderCurFlashEraseAddress + 0xa0000418 BootloaderFlashWritePollCount + 0xa000041c BootloaderInterfaceState + 0xa0000420 DataChunkWritten + 0xa0000424 BooloaderFlashErasePollCount + 0xa0000428 FirmwareUploaded + 0xa000042c CurDataChunkIndex + .scommon 0xa0000430 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .scommon 0xa0000430 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + 0xa0000430 mDeviceID + *fill* 0xa0000432 0x2 + .scommon 0xa0000434 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa0000434 BootloaderRxPtr + 0xa0000438 _sbss_end = . + 0xa0000438 . = ALIGN (0x4) + +.bss 0xa0000438 0x2e30 + *(.dynbss) + *(COMMON) + COMMON 0xa0000438 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa0000438 gastrSockets + COMMON 0xa00004e8 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00004e8 astInternalUartData + COMMON 0xa0000528 0x26e build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000528 mRxData + 0xa0000660 mTxData + *fill* 0xa0000796 0x2 + COMMON 0xa0000798 0x384 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0xa0000798 TerminalWorkString + 0xa00008c4 TerminalPrevDataBuf + 0xa00009f0 TerminalDataBuf + COMMON 0xa0000b1c 0x620 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0xa0000b1c astUartData + COMMON 0xa000113c 0xf0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0xa000113c astTimer + COMMON 0xa000122c 0xd04 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa000122c NetworkRxBuf + 0xa000162c TerminalRxBuf + 0xa0001a2c BootloaderRxBuf + 0xa0001e2c addr_in + 0xa0001e3c param + 0xa0001e58 mModuleIPConfig + 0xa0001e68 SyslogRxBuf + COMMON 0xa0001f30 0x16 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0xa0001f30 I2CSlaveBuffer + 0xa0001f3c I2CMasterBuffer + *fill* 0xa0001f46 0x2 + COMMON 0xa0001f48 0x1000 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0xa0001f48 mFlashSectorBuffer + COMMON 0xa0002f48 0x1f4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0xa0002f48 mSyslogBuffer + COMMON 0xa000313c 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0xa000313c BootloaderBuffer + 0xa0003268 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0003268 . = ALIGN (0x4) + 0xa0003268 _end = . + 0xa0003268 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0003268 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x248 + *(.comment) + .comment 0x00000000 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xaa8 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_aranges + 0x00000440 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_aranges + 0x00000460 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_aranges + 0x00000480 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_aranges + 0x000004a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_aranges + 0x000004c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_aranges + 0x000004e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_aranges + 0x00000500 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_aranges + 0x00000520 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_aranges + 0x00000540 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000560 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000688 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x000006a8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_aranges + 0x000006d8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x00000700 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000728 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000748 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_aranges + 0x00000768 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000788 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x000007a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000007c8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x000007f0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_aranges + 0x00000818 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000848 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000868 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000888 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x000008a8 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000948 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000968 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000988 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000009c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000009e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x00000a08 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000a28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000a48 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000a68 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_aranges + 0x00000a88 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_pubnames + 0x00000000 0x34e5 + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_pubnames + 0x00000030 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000050 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubnames + 0x000000f6 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubnames + 0x0000019c 0x8f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_pubnames + 0x0000022b 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubnames + 0x0000024e 0x173 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_pubnames + 0x000003c1 0xe5 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_pubnames + 0x000004a6 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_pubnames + 0x0000054c 0x104 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000650 0x6fd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000d4d 0x207 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_pubnames + 0x00000f54 0xcd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_pubnames + 0x00001021 0xee build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_pubnames + 0x0000110f 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_pubnames + 0x00001132 0xb8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_pubnames + 0x000011ea 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_pubnames + 0x0000120d 0x1ce build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_pubnames + 0x000013db 0x75 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubnames + 0x00001450 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_pubnames + 0x00001481 0x24 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_pubnames + 0x000014a5 0x125 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_pubnames + 0x000015ca 0x194 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_pubnames + 0x0000175e 0x174 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_pubnames + 0x000018d2 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_pubnames + 0x000019d3 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_pubnames + 0x00001aab 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_pubnames + 0x00001adc 0x49 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_pubnames + 0x00001b25 0xec build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_pubnames + 0x00001c11 0x347 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_pubnames + 0x00001f58 0x25 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_pubnames + 0x00001f7d 0x72 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001fef 0xca build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_pubnames + 0x000020b9 0x41 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_pubnames + 0x000020fa 0x13b build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_pubnames + 0x00002235 0x1af build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_pubnames + 0x000023e4 0x92 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_pubnames + 0x00002476 0x18a build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_pubnames + 0x00002600 0xa3 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_pubnames + 0x000026a3 0x71 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_pubnames + 0x00002714 0x3b9 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_pubnames + 0x00002acd 0x7d build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_pubnames + 0x00002b4a 0x5c build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_pubnames + 0x00002ba6 0x2fb build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002ea1 0x2f build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_pubnames + 0x00002ed0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002ef0 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x00002f2b 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x00002f54 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002f7e 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x00002fa9 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00002fd4 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x00003007 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x00003027 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x0000304b 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00003073 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00003090 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_pubnames + 0x000030c2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x000030e7 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x00003110 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x0000312e 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_pubnames + 0x00003158 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00003182 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x000031a2 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x000031be 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x000031ea 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_pubnames + 0x00003216 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x00003237 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x00003255 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00003271 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x0000328c 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x0000336d 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x0000338a 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x000033a8 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x00003404 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x0000341f 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x0000343b 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x0000345d 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x00003481 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x000034a1 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubnames + 0x000034c1 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_info 0x00000000 0x40fc7 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0xd2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_info 0x000000d2 0x37b0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_info 0x00003882 0x1cee build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_info 0x00005570 0x166e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_info 0x00006bde 0x406 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_info 0x00006fe4 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_info 0x00006fe4 0x146 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_info 0x0000712a 0x11ca build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_info 0x000082f4 0x9b1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_info 0x00008ca5 0x496 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_info 0x0000913b 0xc4d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_info 0x00009d88 0x3b2f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_info 0x0000d8b7 0xa67 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_info 0x0000e31e 0x55b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_info 0x0000e879 0x6a8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_info 0x0000ef21 0x141 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_info 0x0000f062 0x986 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_info 0x0000f9e8 0x142 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_info 0x0000fb2a 0x1e42 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_info 0x0001196c 0x825 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_info 0x00012191 0x55b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_info 0x000126ec 0x115d build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_info 0x00013849 0x3b5e build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_info 0x000173a7 0x1aba build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_info 0x00018e61 0x1977 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_info 0x0001a7d8 0x1a1a build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_info 0x0001c1f2 0x151d build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_info 0x0001d70f 0x127e build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_info 0x0001e98d 0x113f build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_info 0x0001facc 0x1a49 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_info 0x00021515 0x113b build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_info 0x00022650 0x113d build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_info 0x0002378d 0x217b build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_info 0x00025908 0x3219 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_info 0x00028b21 0x131c build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_info 0x00029e3d 0x1d7d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_info 0x0002bbba 0x17a9 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_info 0x0002d363 0x1305 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_info 0x0002e668 0x18a8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_info 0x0002ff10 0x15d0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_info 0x000314e0 0x1710 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_info 0x00032bf0 0x185c build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_info 0x0003444c 0x15aa build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_info 0x000359f6 0x1330 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_info 0x00036d26 0x2b79 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_info 0x0003989f 0x1314 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_info 0x0003abb3 0x14d2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_info 0x0003c085 0x1f95 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_info 0x0003e01a 0x2e4 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_info 0x0003e2fe 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003e3ac 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0003e467 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0003e515 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0003e5c5 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0003e677 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0003e729 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0003e80b 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0003e8c7 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0003e98b 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0003ea61 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0003ea61 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x0003eb16 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_info 0x0003ebfa 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0003ecbf 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0003ed8a 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0003ee41 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_info 0x0003ef03 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x0003efc6 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003f07e 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x0003f131 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0003f20b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0003f20b 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_info 0x0003f2f0 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003f3d0 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x0003f486 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x0003f539 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x0003f5ea 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x0003f5ea 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x0003f803 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x0003f803 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x0003f8b8 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0003f96e 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x0003fa83 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x0003fb2e 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x0003fbdb 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x0003fbdb 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x0003fca6 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x0003ff68 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x000406ea 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_info 0x00040ea2 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_abbrev 0x00000000 0x60e2 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_abbrev 0x00000025 0x1f2 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_abbrev 0x00000217 0x203 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_abbrev 0x0000041a 0x257 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_abbrev 0x00000671 0xd7 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_abbrev 0x00000748 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_abbrev 0x00000749 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_abbrev 0x0000079e 0x27a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_abbrev 0x00000a18 0x175 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_abbrev 0x00000b8d 0x123 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_abbrev 0x00000cb0 0x22a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_abbrev 0x00000eda 0x26f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_abbrev 0x00001149 0x1cb build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_abbrev 0x00001314 0x111 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_abbrev 0x00001425 0x162 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_abbrev 0x00001587 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_abbrev 0x000015dc 0x1b1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_abbrev 0x0000178d 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_abbrev 0x000017e2 0x2ae build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_abbrev 0x00001a90 0x140 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_abbrev 0x00001bd0 0xf7 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_abbrev 0x00001cc7 0x17b build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_abbrev 0x00001e42 0x2d9 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_abbrev 0x0000211b 0x295 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_abbrev 0x000023b0 0x2af build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_abbrev 0x0000265f 0x2e5 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_abbrev 0x00002944 0x26e build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_abbrev 0x00002bb2 0x1b1 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_abbrev 0x00002d63 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_abbrev 0x00002ec9 0x351 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_abbrev 0x0000321a 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_abbrev 0x00003380 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_abbrev 0x000034e6 0x226 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_abbrev 0x0000370c 0x343 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_abbrev 0x00003a4f 0x19d build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_abbrev 0x00003bec 0x281 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_abbrev 0x00003e6d 0x1c4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_abbrev 0x00004031 0x18e build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_abbrev 0x000041bf 0x22f build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_abbrev 0x000043ee 0x26b build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_abbrev 0x00004659 0x1e9 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_abbrev 0x00004842 0x298 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_abbrev 0x00004ada 0x233 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_abbrev 0x00004d0d 0x18c build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_abbrev 0x00004e99 0x2f7 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_abbrev 0x00005190 0x1b5 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_abbrev 0x00005345 0x1c1 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_abbrev 0x00005506 0x2b3 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_abbrev 0x000057b9 0xa9 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_abbrev 0x00005862 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x00005894 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x000058b7 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000058da 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x000058fd 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x00005920 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00005943 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x00005968 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x0000598d 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x000059b2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x000059d7 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x000059d8 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x000059fd 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_abbrev 0x00005a3e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x00005a63 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x00005a88 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00005aad 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_abbrev 0x00005ad2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x00005af7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x00005b1c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x00005b41 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x00005b8a 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x00005b8b 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_abbrev 0x00005bce 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x00005c04 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x00005c29 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00005c4e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00005c73 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x00005c74 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x00005c99 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00005c9a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00005cbf 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x00005ce4 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x00005d1c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x00005d41 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x00005d66 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x00005d67 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x00005d99 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x00005e12 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00005f44 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_abbrev 0x00006083 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_line 0x00000000 0x835d + *(.debug_line) + .debug_line 0x00000000 0x8a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_line 0x0000008a 0x20d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_line 0x00000297 0x251 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_line 0x000004e8 0x339 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_line 0x00000821 0x195 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_line 0x000009b6 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_line 0x000009b6 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_line 0x00000a30 0x3b2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_line 0x00000de2 0x22d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_line 0x0000100f 0x1e8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_line 0x000011f7 0x2cd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_line 0x000014c4 0x568 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_line 0x00001a2c 0x34b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_line 0x00001d77 0x207 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_line 0x00001f7e 0x27e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_line 0x000021fc 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_line 0x00002276 0x2db build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_line 0x00002551 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_line 0x000025cb 0x4ef build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_line 0x00002aba 0x2d3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_line 0x00002d8d 0x1f0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_line 0x00002f7d 0x156 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_line 0x000030d3 0x2c6 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_line 0x00003399 0x262 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_line 0x000035fb 0x3c5 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_line 0x000039c0 0x2ef build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_line 0x00003caf 0x25b build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_line 0x00003f0a 0x161 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_line 0x0000406b 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_line 0x0000416c 0x38e build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_line 0x000044fa 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_line 0x000045fb 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_line 0x000046fc 0x23b build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_line 0x00004937 0x574 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_line 0x00004eab 0x155 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_line 0x00005000 0x23d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_line 0x0000523d 0x1b9 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_line 0x000053f6 0x16d build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_line 0x00005563 0x2d8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_line 0x0000583b 0x23e build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_line 0x00005a79 0x1f5 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_line 0x00005c6e 0x29a build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_line 0x00005f08 0x2af build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_line 0x000061b7 0x165 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_line 0x0000631c 0x4ed build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_line 0x00006809 0x193 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_line 0x0000699c 0x19a build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_line 0x00006b36 0x3b6 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_line 0x00006eec 0x137 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_line 0x00007023 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x000070d4 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00007136 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x000071a7 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00007219 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x0000728c 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x000072ff 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x00007396 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x0000741a 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x000074a2 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x00007538 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00007538 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x000075a8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_line 0x00007618 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x00007686 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x000076f6 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x00007767 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_line 0x000077d7 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x00007848 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x000078b8 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x00007927 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x00007994 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x00007994 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_line 0x00007a04 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x00007a74 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00007ae4 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00007b53 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00007bc1 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00007bc1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00007c31 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x00007c31 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00007ca1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00007d11 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x00007d89 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00007e01 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00007e7a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00007e7a 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x00007f0d 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x00008012 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x0000817a 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_line 0x000082cf 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_frame 0x00000000 0x3788 + *(.debug_frame) + .debug_frame 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_frame 0x00000020 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_frame 0x0000004c 0xfc build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_frame 0x00000148 0x9c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_frame 0x000001e4 0xd4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_frame 0x000002b8 0x208 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_frame 0x000004c0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_frame 0x000005cc 0xd4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_frame 0x000006a0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_frame 0x000007ac 0x748 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_frame 0x00000ef4 0x294 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_frame 0x00001188 0x128 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_frame 0x000012b0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_frame 0x000013bc 0x20c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_frame 0x000015c8 0x25c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_frame 0x00001824 0x17c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_frame 0x000019a0 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_frame 0x000019cc 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_frame 0x000019f8 0x138 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_frame 0x00001b30 0x130 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_frame 0x00001c60 0xf4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_frame 0x00001d54 0x128 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_frame 0x00001e7c 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_frame 0x00001f88 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_frame 0x00001fb4 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_frame 0x00002018 0x148 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_frame 0x00002160 0x2b8 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_frame 0x00002418 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_frame 0x00002444 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_frame 0x000024a8 0xb8 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_frame 0x00002560 0x48 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_frame 0x000025a8 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_frame 0x00002680 0x198 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_frame 0x00002818 0x9c build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_frame 0x000028b4 0x160 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_frame 0x00002a14 0xa0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_frame 0x00002ab4 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_frame 0x00002b34 0x1b4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_frame 0x00002ce8 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_frame 0x00002d68 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_frame 0x00002dcc 0x198 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_frame 0x00002f64 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_frame 0x00002fc8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00002ff0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x00003020 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x00003040 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x00003060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00003080 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x000030a0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x000030c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x000030e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x00003108 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00003128 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00003154 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_frame 0x000031c0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x00003208 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x00003240 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00003260 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_frame 0x00003288 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x000032b4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x000032dc 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x00003308 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x00003340 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_frame 0x00003398 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x0000340c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00003434 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00003464 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00003484 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x000035a4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x000035c4 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x000035f4 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x00003680 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x000036ac 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x000036d4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x000036f4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00003720 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00003740 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_frame 0x00003760 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_str 0x00000000 0x3167 + *(.debug_str) + .debug_str 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_str 0x00000000 0x242 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_str 0x00000242 0x14a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_str 0x0000038c 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_str 0x000004d5 0xa build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_str 0x000004df 0x36 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_str 0x00000515 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_str 0x00000515 0xa build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_str 0x0000051f 0x25 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_str 0x00000544 0x178 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_str 0x000006bc 0x2d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_str 0x000006e9 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_str 0x0000071a 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_str 0x0000072c 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_str 0x0000072c 0x19 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_str 0x00000745 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_str 0x00000745 0x168 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_str 0x000008ad 0x2d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_str 0x000008da 0x16 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_str 0x000008f0 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_str 0x00000a1f 0x226 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_str 0x00000c45 0x14f build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_str 0x00000d94 0x1ac build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_str 0x00000f40 0x181 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_str 0x000010c1 0x145 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_str 0x00001206 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_str 0x00001335 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_str 0x00001464 0x14d build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_str 0x000015b1 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_str 0x000016e0 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_str 0x0000180f 0x17f build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_str 0x0000198e 0x281 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_str 0x00001c0f 0x146 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_str 0x00001d55 0x170 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_str 0x00001ec5 0x15b build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_str 0x00002020 0x138 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_str 0x00002158 0x1ac build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_str 0x00002304 0x18b build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_str 0x0000248f 0x17e build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_str 0x0000260d 0x193 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_str 0x000027a0 0x14b build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_str 0x000028eb 0x15e build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_str 0x00002a49 0x29e build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_str 0x00002ce7 0x13a build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_str 0x00002e21 0x159 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_str 0x00002f7a 0x1ed build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_str 0x00003167 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_loc 0x00000000 0xfec1 + *(.debug_loc) + .debug_loc 0x00000000 0x130 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_loc 0x00000130 0x168 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_loc 0x00000298 0x4b8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_loc 0x00000750 0x59d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_loc 0x00000ced 0xcb3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_loc 0x000019a0 0x48f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_loc 0x00001e2f 0x2e2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_loc 0x00002111 0x7ba build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_loc 0x000028cb 0x1f19 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_loc 0x000047e4 0xfbb build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_loc 0x0000579f 0x5e3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_loc 0x00005d82 0x685 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_loc 0x00006407 0xd65 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_loc 0x0000716c 0x12f2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_loc 0x0000845e 0xd61 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_loc 0x000091bf 0x6a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_loc 0x00009229 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_loc 0x00009255 0x5ee build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_loc 0x00009843 0x369 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_loc 0x00009bac 0x25f build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_loc 0x00009e0b 0x72a build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_loc 0x0000a535 0x6a1 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_loc 0x0000abd6 0x4b build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_loc 0x0000ac21 0x31e build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_loc 0x0000af3f 0x484 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_loc 0x0000b3c3 0xa0d build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_loc 0x0000bdd0 0x56 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_loc 0x0000be26 0x3e5 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_loc 0x0000c20b 0x108 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_loc 0x0000c313 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_loc 0x0000c36b 0x1bf build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_loc 0x0000c52a 0x412 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_loc 0x0000c93c 0x21a build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_loc 0x0000cb56 0x8a5 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_loc 0x0000d3fb 0x10e build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_loc 0x0000d509 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_loc 0x0000d5b9 0x7f8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_loc 0x0000ddb1 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_loc 0x0000de61 0xf4 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_loc 0x0000df55 0x812 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_loc 0x0000e767 0x2d1 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_loc 0x0000ea38 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x0000eb01 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x0000f4c4 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_loc 0x0000fe59 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x3431 + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x276 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000276 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubtypes + 0x000003bf 0x14c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubtypes + 0x0000050b 0x3c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_pubtypes + 0x00000547 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubtypes + 0x00000559 0x5e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_pubtypes + 0x000005b7 0xa2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000659 0x48 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_pubtypes + 0x000006a1 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubtypes + 0x000007ad 0x41c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00000bc9 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_pubtypes + 0x00000c09 0x56 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_pubtypes + 0x00000c5f 0x5a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_pubtypes + 0x00000cb9 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_pubtypes + 0x00000ccb 0x47 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_pubtypes + 0x00000d12 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_pubtypes + 0x00000d24 0x29d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_pubtypes + 0x00000fc1 0x3c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00000ffd 0xcf build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_pubtypes + 0x000010cc 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_pubtypes + 0x000011b3 0x1f8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_pubtypes + 0x000013ab 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_pubtypes + 0x000014e1 0x175 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_pubtypes + 0x00001656 0x155 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_pubtypes + 0x000017ab 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_pubtypes + 0x00001892 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_pubtypes + 0x00001979 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_pubtypes + 0x00001a60 0x13c build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_pubtypes + 0x00001b9c 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_pubtypes + 0x00001c83 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_pubtypes + 0x00001d6a 0x14e build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_pubtypes + 0x00001eb8 0x2dc build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002194 0xfc build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_pubtypes + 0x00002290 0x17e build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x0000240e 0x13f build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x0000254d 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_pubtypes + 0x0000264e 0x137 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_pubtypes + 0x00002785 0x121 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_pubtypes + 0x000028a6 0x119 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_pubtypes + 0x000029bf 0xf8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_pubtypes + 0x00002ab7 0x11a build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_pubtypes + 0x00002bd1 0xf8 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_pubtypes + 0x00002cc9 0x2d9 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_pubtypes + 0x00002fa2 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_pubtypes + 0x00003089 0x10d build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_pubtypes + 0x00003196 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_pubtypes + 0x000032df 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_pubtypes + 0x0000330b 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x0000334b 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x000033a4 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubtypes + 0x000033fd 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_ranges 0x00000000 0x290 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000050 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_ranges 0x00000080 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000098 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x00000100 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x00000118 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_ranges 0x00000130 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000160 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000170 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000180 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x00000210 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x00000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000230 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000280 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .gnu.attributes + 0x00000290 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .gnu.attributes + 0x000002a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .gnu.attributes + 0x000002b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .gnu.attributes + 0x000002c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .gnu.attributes + 0x000002d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .gnu.attributes + 0x000002e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .gnu.attributes + 0x000002f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .gnu.attributes + 0x00000300 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x00000560 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x00000570 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000580 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .gnu.attributes + 0x00000590 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0004478 0x400 + .stack 0xa0004478 0x400 stack + +.data 0xa0003268 0x4bc + .data 0xa0003268 0x4bc build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.bss 0xa0003724 0x800 + .bss 0xa0003724 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .bss 0xa0003b24 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + +.data 0xa0003f24 0x2c4 + .data 0xa0003f24 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003f24 _iob + .data 0xa0003fc4 0x6c build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .data 0xa0004030 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .data 0xa0004088 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .data 0xa00040e0 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .data 0xa0004138 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .data 0xa0004190 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.bss 0xa00041e8 0x74 + .bss 0xa00041e8 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa00041e8 _sibuf + 0xa0004208 _sobuf + .bss 0xa0004228 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa0004244 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0004244 __allocs + .bss 0xa0004254 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa0004258 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z23 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z24 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z40 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z41 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z43 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z44 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z60 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.bss%z61 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z62 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z63 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z64 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z65 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z66 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z67 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z68 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z69 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z70 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z71 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z72 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z73 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z74 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z75 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z76 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z77 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z78 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z79 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z80 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z81 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z82 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z83 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z84 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z85 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z86 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z87 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z88 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z89 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z90 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z91 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z92 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z93 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z94 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z95 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z96 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z97 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z98 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z99 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z100 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z101 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z102 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z103 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z104 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z105 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z106 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z107 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z108 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z109 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z110 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z111 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z112 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z113 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z114 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z115 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z116 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z117 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z118 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z119 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z120 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z121 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z122 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z123 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z124 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z125 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z126 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z127 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z128 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z129 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z130 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z131 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z132 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z133 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z134 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z135 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z136 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z137 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z138 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z139 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z140 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z141 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z142 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z143 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z144 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z145 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z146 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z147 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z148 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z149 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z150 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z151 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z152 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z153 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z154 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z155 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z156 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z157 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z158 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z159 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z160 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z161 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z162 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z163 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z164 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z165 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z166 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z167 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z168 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z169 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z170 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z171 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z172 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z173 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z174 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z175 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z176 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z177 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z178 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z179 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z180 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z181 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z182 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z183 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z184 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z185 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z186 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z187 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z188 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z189 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z190 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z191 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z192 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z193 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z194 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z195 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z196 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z197 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z198 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z199 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z200 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z201 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z202 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z203 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z204 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z205 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z208 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z212 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z213 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z214 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z215 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z216 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z217 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z218 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z219 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z220 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z221 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z222 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z229 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.bss%z231 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.data%z232 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.bss%z233 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + +.bss%z239 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.data%z240 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.bss%z241 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + +.data%z242 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + +.bss%z243 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + +.data%z244 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + +.bss%z245 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + +.data%z251 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + +.bss%z252 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + +.data%z253 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + +.bss%z254 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + +.data%z255 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + +.bss%z256 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.data%z257 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.bss%z258 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.data%z259 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.bss%z260 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.data%z262 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.bss%z263 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + +.data%z264 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + +.bss%z265 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + +.data%z266 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + +.bss%z267 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.data%z268 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.bss%z269 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + +.data%z275 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + +.bss%z276 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + +.data%z277 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + +.bss%z278 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + +.data%z279 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + +.bss%z280 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + +.data%z281 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + +.bss%z282 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.data%z283 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.bss%z284 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.data%z285 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.bss%z286 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.data%z287 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.bss%z288 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + +.data%z289 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + +.bss%z290 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + +.data%z291 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + +.bss%z292 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + +.data%z293 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + +.bss%z294 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + +.data%z295 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + +.bss%z296 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.data%z305 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.bss%z306 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.data%z307 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.bss%z308 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + +.data%z309 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + +.bss%z310 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.data%z311 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.bss%z312 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + +.data%z313 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + +.bss%z314 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + +.data%z315 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + +.bss%z316 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.data%z317 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.bss%z318 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z319 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.text 0x9d003800 0xbcd4 + .text 0x9d003800 0x2904 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + 0x9d003fb4 m2m_wifi_download_mode + 0x9d0042f4 m2m_wifi_ble_set_gain_table + 0x9d004368 m2m_wifi_init_hold + 0x9d0043ac m2m_wifi_init_start + 0x9d0044f8 m2m_wifi_init + 0x9d004554 m2m_wifi_deinit + 0x9d00459c m2m_wifi_reinit_hold + 0x9d0045d8 m2m_wifi_reinit_start + 0x9d004610 m2m_wifi_reinit + 0x9d004670 m2m_wifi_yield + 0x9d0046a0 m2m_wifi_handle_events + 0x9d0046d4 m2m_wifi_default_connect + 0x9d004720 m2m_wifi_connect + 0x9d004794 m2m_wifi_connect_sc + 0x9d004bd8 m2m_wifi_disconnect + 0x9d004c24 m2m_wifi_set_mac_address + 0x9d004c90 m2m_wifi_set_static_ip + 0x9d004d24 m2m_wifi_request_dhcp_client + 0x9d004d48 m2m_wifi_request_dhcp_server + 0x9d004d70 m2m_wifi_enable_dhcp + 0x9d004de8 m2m_wifi_set_lsn_int + 0x9d004e3c m2m_wifi_set_cust_InfoElement + 0x9d004e9c m2m_wifi_set_scan_options + 0x9d004f14 m2m_wifi_set_scan_region + 0x9d004f84 m2m_wifi_request_scan + 0x9d00502c m2m_wifi_request_scan_passive + 0x9d0050d4 m2m_wifi_wps + 0x9d005160 m2m_wifi_wps_disable + 0x9d0051b8 m2m_wifi_p2p + 0x9d005264 m2m_wifi_p2p_disconnect + 0x9d0052bc m2m_wifi_enable_ap + 0x9d005334 m2m_wifi_disable_ap + 0x9d00538c m2m_wifi_req_curr_rssi + 0x9d0053e4 m2m_wifi_req_restrict_ble + 0x9d00543c m2m_wifi_req_unrestrict_ble + 0x9d005494 m2m_wifi_send_ethernet_pkt + 0x9d005534 m2m_wifi_get_otp_mac_address + 0x9d0055b0 m2m_wifi_get_mac_address + 0x9d005624 m2m_wifi_req_scan_result + 0x9d005690 m2m_wifi_get_num_ap_found + 0x9d0056b8 m2m_wifi_get_sleep_mode + 0x9d0056e8 m2m_wifi_set_sleep_mode + 0x9d005774 m2m_wifi_request_sleep + 0x9d0057f8 m2m_wifi_set_device_name + 0x9d005894 m2m_wifi_get_chipId + 0x9d0058c4 m2m_wifi_get_firmware_version + 0x9d005928 m2m_wifi_check_ota_rb + 0x9d005994 m2m_ota_get_firmware_version + 0x9d0059f8 m2m_wifi_enable_monitoring_mode + 0x9d005aac m2m_wifi_disable_monitoring_mode + 0x9d005af8 m2m_wifi_send_wlan_pkt + 0x9d005b94 m2m_wifi_start_provision_mode + 0x9d005c8c m2m_wifi_stop_provision_mode + 0x9d005cd8 m2m_wifi_get_connection_info + 0x9d005d24 m2m_wifi_set_sytem_time + 0x9d005d78 m2m_wifi_get_sytem_time + 0x9d005dc4 m2m_wifi_enable_sntp + 0x9d005e3c m2m_wifi_set_power_profile + 0x9d005ea8 m2m_wifi_set_tx_power + 0x9d005f14 m2m_wifi_enable_firmware_logs + 0x9d005f80 m2m_wifi_set_battery_voltage + 0x9d005ff0 m2m_wifi_prng_get_random_bytes + 0x9d006090 m2m_wifi_ble_api_send + .text 0x9d006104 0x2140 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0x9d006104 Socket_ReadSocketData + 0x9d006a3c socketInit + 0x9d006ab0 socketDeinit + 0x9d006b10 registerSocketCallback + 0x9d006b48 socket + 0x9d006dd0 bind + 0x9d006f00 listen + 0x9d006fe8 accept + 0x9d00705c connect + 0x9d0071d4 send + 0x9d007378 sendto + 0x9d007510 recv + 0x9d0076f8 close + 0x9d007838 recvfrom + 0x9d007a28 nmi_inet_addr + 0x9d007b9c gethostbyname + 0x9d007fd4 setsockopt + 0x9d008160 getsockopt + 0x9d00819c m2m_ping_req + .text 0x9d008244 0x1a7c build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0x9d008244 InitUart + 0x9d0084f4 UartResetPort + 0x9d0087a8 UartOpenComPort + 0x9d008998 UartReceiveData + 0x9d008ae4 UartGetPendingDataSize + 0x9d008bdc UartTransmitData + 0x9d009320 DataSentNotification + 0x9d0095f4 UartTick + 0x9d009bcc UartBlockAndTick + 0x9d009c2c UartBlockUntillBufEmpty + .text 0x9d009cc0 0x18ac build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0x9d00a83c InitWiFi + 0x9d00ab14 TurnOFFWiFi + 0x9d00aba8 CloseSockets + 0x9d00ac94 GetWiFiSate + 0x9d00acb8 TickWiFi + 0x9d00ada4 OpenTerminalServer + 0x9d00ae60 SendTerminalData + 0x9d00aee8 SentTerminalByte + 0x9d00af64 OpenNetworkServer + 0x9d00b020 SendNetworkData + 0x9d00b0a8 SentNetworkByte + 0x9d00b124 OpenSyslogServer + 0x9d00b1e0 SendSyslogData + 0x9d00b258 SendSyslogByte + 0x9d00b2d4 IsSyslogClientConnected + 0x9d00b314 OpenBootloaderServer + 0x9d00b3d0 CloseBootloaderServer + 0x9d00b438 SendBootloaderData + 0x9d00b4b0 SendSBootloaderByte + 0x9d00b52c IsBootloaderClientConnected + .text 0x9d00b56c 0x15c0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0x9d00b56c BootloaderInterfaceInit + 0x9d00b5c0 BootloaderInterfaceTick + 0x9d00b5f8 BootloaderExecuteCmd + 0x9d00b834 BootloaderCRCError + 0x9d00b89c BootloaderInterfaceStateMachine + 0x9d00c100 BootloaderResetStateMachine + 0x9d00c15c BootloaderActivateBootloader + 0x9d00c19c BootloaderDeactivateBootloader + 0x9d00c1cc BootloaderFlashEraseStateMachine + 0x9d00c400 ResetBootloaderFlashEraseStateMachine + 0x9d00c434 BootloaderFlashWriteStateMachine + 0x9d00c660 BootloaderPrintFlashData + 0x9d00c680 BootloaderCheckFlashBootloaderData + 0x9d00ca34 ResetBootloaderFlashWriteStateMachine + 0x9d00ca74 BootloaderBytesToInt + .text 0x9d00cb2c 0x1584 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + 0x9d00cb2c chip_apply_conf + 0x9d00cbe0 nm_clkless_wake + 0x9d00ce20 chip_idle + 0x9d00ce94 enable_rf_blocks + 0x9d00cf34 enable_interrupts + 0x9d00d03c cpu_start + 0x9d00d1b8 nmi_get_chipid + 0x9d00d3d0 nmi_get_rfrevid + 0x9d00d428 restore_pmu_settings_after_global_reset + 0x9d00d47c nmi_update_pll + 0x9d00d4f0 nmi_set_sys_clk_src_to_xo + 0x9d00d54c chip_wake + 0x9d00d5a0 chip_reset_and_cpu_halt + 0x9d00d734 chip_reset + 0x9d00d79c wait_for_bootrom + 0x9d00d928 wait_for_firmware_start + 0x9d00da48 chip_deinit + 0x9d00db64 set_gpio_dir + 0x9d00dc38 set_gpio_val + 0x9d00dd0c get_gpio_val + 0x9d00dd98 pullup_ctrl + 0x9d00de50 nmi_get_otp_mac_address + 0x9d00dfb0 nmi_get_mac_address + .text 0x9d00e0b0 0x1424 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + 0x9d00e1e8 hif_chip_wake + 0x9d00e2b4 hif_set_sleep_mode + 0x9d00e2e4 hif_get_sleep_mode + 0x9d00e30c hif_chip_sleep + 0x9d00e430 hif_init + 0x9d00e49c hif_deinit + 0x9d00e4fc hif_check_compatibility + 0x9d00e574 hif_enable_access + 0x9d00e694 hif_check_code + 0x9d00e784 hif_send + 0x9d00f09c hif_yield + 0x9d00f0c4 hif_handle_isr + 0x9d00f190 hif_receive + 0x9d00f3ec hif_register_cb + +.text._vfprintf_cdfFnopsuxX + 0x9d00f4d4 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d00f4d4 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d00f4d4 _vfprintf_cdfFnopsuxX + 0x9d00f4d4 _vfprintf_cdfFnopuxX + 0x9d00f4d4 _vfprintf_cdnopsuxX + 0x9d00f4d4 _vfprintf_fF + 0x9d00f4d4 _vfprintf_cdnopuxX + +.text 0x9d0108a8 0x7248 + .text 0x9d0108a8 0x117c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + 0x9d0115a8 spi_flash_read + 0x9d011680 spi_flash_write + 0x9d011858 spi_flash_erase + 0x9d0119a4 spi_flash_get_size + .text 0x9d011a24 0x1108 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + 0x9d0124c0 nm_spi_write_reg + 0x9d012598 nm_spi_write_block + 0x9d0126a0 nm_spi_read_reg_with_ret + 0x9d0127ec nm_spi_read_block + 0x9d0129a8 nm_spi_init + 0x9d012ac0 nm_spi_deinit + 0x9d012ae8 nm_spi_read_reg + .text 0x9d012b2c 0xf40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d012b2c InternalUartInit + 0x9d012d04 OpenInternalPort + 0x9d012f24 SendInternalUartData + 0x9d013240 SendInternalUartDataBlocking + 0x9d013318 TickInternalUart + 0x9d0133f0 InternalUart1AInterrupt + 0x9d01362c InternalUart2Interrupt + 0x9d01384c ResetUart1 + 0x9d013954 ResetUart2 + 0x9d013a4c process + .text 0x9d013a6c 0xe68 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0x9d013a6c InitTerminal + 0x9d013aec TickTerminal + 0x9d013b48 RxTerminalBuf + 0x9d013bd4 RxTerminalData + 0x9d013d24 ParseNewBuffer + 0x9d014820 TerminalPrintString + 0x9d014874 TerminalPrintChar + 0x9d0148b4 TerminalStateMachine + .text 0x9d0148d4 0xda8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0x9d0148d4 InitSPIFlash + 0x9d014a48 SPIFlashCheckAndConfigure + 0x9d014b18 SPIFlashWriteEnable + 0x9d014b7c SPIFlashReadStatusReg + 0x9d014c24 SPIFlashCheckBusy + 0x9d014c80 SPIFlashCheckChipID + 0x9d014dbc SPIFlashReadBuffer + 0x9d014f3c SPIFlashEraseSector + 0x9d015064 SPIFlashErase64KSector + 0x9d0151b8 SPIFlashWriteSectorWorkingBuffer + 0x9d015374 SPIFlashWriteByte + 0x9d0154c8 SPIFlashWriteBuffer + .text 0x9d01567c 0xce8 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + 0x9d01567c SwapEndianShort + 0x9d0156c8 SwapEndianInt + 0x9d015724 ConvertIntToStrLeadingZero + 0x9d015b48 ConvertIntToStr + 0x9d015e9c ConvertCharToStrLeadingZero + 0x9d016004 ConvertStrToValue + 0x9d0161f0 ConvertCharToStr + 0x9d0162a8 Crc8 + 0x9d016340 Delay + .text 0x9d016364 0xbf4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + 0x9d016670 m2m_ssl_handshake_rsp + 0x9d0166e8 m2m_ssl_send_certs_to_winc + 0x9d016a30 m2m_ssl_retrieve_cert + 0x9d016d6c m2m_ssl_retrieve_hash + 0x9d016e2c m2m_ssl_stop_processing_certs + 0x9d016e6c m2m_ssl_ecc_process_done + 0x9d016e90 m2m_ssl_set_active_ciphersuites + 0x9d016ef8 m2m_ssl_init + .text 0x9d016f58 0xb98 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0x9d016f58 TimerInit + 0x9d017028 IsMilliSecTimerExpired + 0x9d017190 IsSecTimerExpired + 0x9d0172f4 IsTimerExpired + 0x9d0176a8 TimerStart + 0x9d0177d0 TimerStartSeconds + 0x9d017874 TimerReset + 0x9d0178f8 IsTimerRunning + 0x9d01793c TimerStop + 0x9d017980 Sleep + 0x9d0179dc Timer1MilliSecInterrupt + +.dinit 0x9d017af0 0xb50 + .dinit 0x9d017af0 0xb50 data_init + +.text 0x9d018640 0xb04 + .text 0x9d018640 0xb04 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0x9d018640 BootloaderProtocolInit + 0x9d018670 BootloaderProtocolStateMachine + 0x9d018a74 BootloaderProtocolProtocolAnalyzeNewData + 0x9d018af0 BootloaderProtocolResetStateMachine + 0x9d018b3c BootloaderProtocolSendFrame + 0x9d018cb4 BootloaderProtocolGetDataBufferPtr + 0x9d018cd8 BootloaderProtocolSendHeartbeat + 0x9d018d20 BootloaderProtocolSendACK + 0x9d018d74 BootloaderProtocolSendNACK + 0x9d018dc4 BootloaderProtocolSendInitUploadResponse + 0x9d018f24 BootloaderProtocolSendDataChunkResult + 0x9d019018 BootloaderProtocolSendBootloaderState + 0x9d01907c BootloaderProtocolSendFirmwareUploadResult + 0x9d0190e0 BootloaderProtocolSendFlashCheckResult + +.rodata 0x9d019144 0x990 + .rodata 0x9d019144 0x990 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + +.text 0x9d019ad4 0x974 + .text 0x9d019ad4 0x974 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0x9d019ad4 ProtocolInit + 0x9d019b04 StateMachine + 0x9d01a080 ProtocolAnalyzeNewData + 0x9d01a0c0 ResetStateMachine + 0x9d01a108 ProtocolExecCmd + 0x9d01a144 ProtocolAcknowledge + 0x9d01a1a8 ProtocolCalcCrc + 0x9d01a224 ProtocolIsReceiving + 0x9d01a264 ProtocolGetFrame + 0x9d01a420 ProtocolMsgDataPtr + +.text._vfscanf_s + 0x9d01a448 0x868 + .text._vfscanf_s + 0x9d01a448 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01a448 _vfscanf_s + 0x9d01a448 _vfscanf_0 + +.text 0x9d01acb0 0x2a84 + .text 0x9d01acb0 0x740 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + 0x9d01acb0 nm_get_hif_info + 0x9d01ad50 nm_get_firmware_full_info + 0x9d01aee4 nm_get_ota_firmware_info + 0x9d01b078 nm_drv_init_download_mode + 0x9d01b0f4 nm_drv_init_hold + 0x9d01b1a0 nm_drv_init_start + 0x9d01b2d4 nm_drv_init + 0x9d01b338 nm_drv_deinit + 0x9d01b3b8 nm_cpu_start + .text 0x9d01b3f0 0x6fc build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + 0x9d01b3f0 InitBoard + .text 0x9d01baec 0x674 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + 0x9d01baec ExecuteMasterCommand + 0x9d01c070 SendLoraNetworkCommand + 0x9d01c118 TestTx + .text 0x9d01c160 0x654 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0x9d01c368 ina219SetCalibration_13V_10A + 0x9d01c3cc ina219SetCalibration_32V_2A + 0x9d01c430 ina219SetCalibration_32V_1A + 0x9d01c494 ina219SetCalibration_16V_500mA + 0x9d01c4f8 ina219SetCalibration_16V_200mA + 0x9d01c55c ina219Init + 0x9d01c5dc ina219GetShuntVoltage + 0x9d01c620 ina219GetBusVoltage + 0x9d01c674 ina219GetPower + 0x9d01c6b8 ina219GetPower_mW + 0x9d01c714 ina219GetCurrent + 0x9d01c758 ina219GetCurrent_mA + .text 0x9d01c7b4 0x574 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + 0x9d01c7b4 I2CInit + 0x9d01c820 I2CWrite + 0x9d01c9e4 I2CTransmitByte + 0x9d01ca10 I2CRead + 0x9d01cd04 I2CWasLastTransactionOK + .text 0x9d01cd28 0x51c build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0x9d01cd28 main + 0x9d01d204 _mon_putc + .text 0x9d01d244 0x4f0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + 0x9d01d37c m2m_ota_init + 0x9d01d3f0 m2m_ota_notif_set_url + 0x9d01d464 m2m_ota_notif_check_for_update + 0x9d01d4bc m2m_ota_notif_sched + 0x9d01d518 m2m_ota_start_update + 0x9d01d58c m2m_ota_rollback + 0x9d01d634 m2m_ota_abort + 0x9d01d68c m2m_ota_switch_firmware + +.rodata 0x9d01d734 0x494 + .rodata 0x9d01d734 0x494 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.text 0x9d01dbc8 0x1108 + .text 0x9d01dbc8 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d01dbc8 __umoddi3 + .text 0x9d01e024 0x454 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + 0x9d01e024 nm_bus_iface_init + 0x9d01e070 nm_bus_iface_deinit + 0x9d01e0ac nm_bus_iface_reconfigure + 0x9d01e0d8 nm_read_reg + 0x9d01e110 nm_read_reg_with_ret + 0x9d01e150 nm_write_reg + 0x9d01e1e0 nm_read_block + 0x9d01e354 nm_write_block + .text 0x9d01e478 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01e478 __udivdi3 + .text 0x9d01e8c4 0x40c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + 0x9d01e8c4 m2m_memcpy + 0x9d01e948 m2m_checksum + 0x9d01e9b8 m2m_memset + 0x9d01ea30 m2m_strlen + 0x9d01ea8c m2m_strncmp + 0x9d01eb60 m2m_strstr + 0x9d01ec38 m2m_memcmp + +.rodata 0x9d01ecd0 0x404 + .rodata 0x9d01ecd0 0x404 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + 0x9d01ecd4 CRC8_TABLE + +.text 0x9d01f0d4 0x1048 + .text 0x9d01f0d4 0x390 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0x9d01f0d4 nm_spi_rw + 0x9d01f294 nm_bus_init + 0x9d01f380 nm_bus_ioctl + 0x9d01f414 nm_bus_deinit + 0x9d01f43c nm_bus_reinit + .text 0x9d01f464 0x380 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + 0x9d01f674 m2m_periph_init + 0x9d01f69c m2m_periph_gpio_set_dir + 0x9d01f6f4 m2m_periph_gpio_set_val + 0x9d01f74c m2m_periph_gpio_get_val + 0x9d01f79c m2m_periph_pullup_ctrl + .text 0x9d01f7e4 0x378 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + 0x9d01f7e4 TC77Configure + 0x9d01fa34 TC77GetActualTemp + 0x9d01fb38 TC77GetDeviceID + .text 0x9d01fb5c 0x2f8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + 0x9d01fb5c InitBatteryMonitor + 0x9d01fbcc BatteryMonitorTick + 0x9d01fd40 GetBatteryVoltage + 0x9d01fda8 GetSolarPanelCurrent + 0x9d01fdcc GetBatterySOC + 0x9d01fdf0 SendNetworkBatteryData + 0x9d01fe30 GetCurrentModuleOK + .text 0x9d01fe54 0x2c8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0x9d01fe54 chip_isr + 0x9d01ff84 nm_bsp_init + 0x9d01ffac nm_bsp_deinit + 0x9d01ffd0 nm_bsp_reset + 0x9d020058 nm_bsp_sleep + 0x9d020090 nm_bsp_register_isr + 0x9d0200bc nm_bsp_interrupt_ctrl + +.text.scale 0x9d02011c 0x2a0 + .text.scale 0x9d02011c 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d0203bc 0x278 + .text.fpsubadd + 0x9d0203bc 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d0203bc __subsf3 + 0x9d0203bc fpsub + 0x9d0203c4 __addsf3 + 0x9d0203c4 fpadd + +.text.malloc 0x9d020634 0x278 + .text.malloc 0x9d020634 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d020634 malloc + +.text 0x9d0208ac 0x26c + .text 0x9d0208ac 0x26c build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + 0x9d0208ac crc_32 + 0x9d0209a4 update_crc_32 + +.rodata 0x9d020b18 0x268 + .rodata 0x9d020b18 0x268 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + +.text 0x9d020d80 0x4a8 + .text 0x9d020d80 0x260 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + 0x9d020d80 InitChaletPowerRelay + 0x9d020ddc ChaletPowerRelayTick + 0x9d020ee0 ChaletPowerRelayKickTimer + 0x9d020f18 ChaletPowerRelayTurnOn + 0x9d020f68 ChaletPowerRelayTurnOff + 0x9d020fb8 GetChaletPowerRelayState + .text 0x9d020fe0 0x248 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0x9d020fe0 InitSyslog + 0x9d021034 SyslogTick + 0x9d0210d0 SyslogNewByte + 0x9d021174 SyslogNewString + 0x9d0211ec SyslogIsBufferEmpty + +.text.fp32div 0x9d021228 0x230 + .text.fp32div 0x9d021228 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d021228 fpdiv + 0x9d021228 __divsf3 + +.text.__floatdisf + 0x9d021458 0x220 + .text.__floatdisf + 0x9d021458 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d021458 __floatdisf + +.text.fp32mul 0x9d021678 0x1bc + .text.fp32mul 0x9d021678 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d021678 __mulsf3 + 0x9d021678 fpmul + +.text 0x9d021834 0x1a0 + .text 0x9d021834 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d021834 strcpy + +.text.realloc 0x9d0219d4 0x194 + .text.realloc 0x9d0219d4 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d0219d4 realloc + +.text._sbrk_init + 0x9d021b68 0x194 + .text._sbrk_init + 0x9d021b68 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d021b68 _sbrk_init + +.text._filbuf 0x9d021cfc 0x188 + .text._filbuf 0x9d021cfc 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d021cfc _filbuf + +.text.read 0x9d021e84 0x174 + .text.read 0x9d021e84 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d021e84 read + +.text 0x9d021ff8 0x2d0 + .text 0x9d021ff8 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d021ff8 memcpy + .text 0x9d022160 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d022160 strlen + +.text.fputc 0x9d0222c8 0x15c + .text.fputc 0x9d0222c8 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d0222c8 fputc + +.text._flsbuf 0x9d022424 0x12c + .text._flsbuf 0x9d022424 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d022424 _flsbuf + +.text 0x9d022550 0x11c + .text 0x9d022550 0x11c build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + 0x9d022550 InitTempSensor + 0x9d022594 TempSensorCheckAndConfigure + 0x9d0225f0 TempSensorGetTemp + 0x9d022614 TickTempSensor + +.text.fgetc 0x9d02266c 0x108 + .text.fgetc 0x9d02266c 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d02266c fgetc + +.rodata 0x9d022774 0x204 + .rodata 0x9d022774 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d022774 _ctype + .rodata 0x9d022878 0x100 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.text.setvbuf 0x9d022978 0xfc + .text.setvbuf 0x9d022978 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d022978 setvbuf + +.rodata 0x9d022a78 0xe0 + .rodata 0x9d022a78 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d022b58 0xdc + .text.general_exception + 0x9d022b58 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d022b58 _general_exception_context + +.text 0x9d022c34 0x1ac + .text 0x9d022c34 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + 0x9d022c34 InitWatchdog + 0x9d022c88 EnableWatchdog + 0x9d022cb4 DisableWatchdog + 0x9d022ce0 KickWatchdog + .text 0x9d022d0c 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d022d0c __floatundisf + +.rodata 0x9d022de0 0xc8 + .rodata 0x9d022de0 0xc8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.text._sbrk 0x9d022ea8 0xc4 + .text._sbrk 0x9d022ea8 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d022ea8 _sbrk + +.text 0x9d022f6c 0xa8 + .text 0x9d022f6c 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d022f6c memset + +.text.atoi 0x9d023014 0xa8 + .text.atoi 0x9d023014 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d023014 atoi + +.text.range 0x9d0230bc 0xa0 + .text.range 0x9d0230bc 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d02315c 0x9c + .text.fpcmp 0x9d02315c 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d02315c __eqsf2 + 0x9d02315c __lesf2 + 0x9d02315c __gtsf2 + 0x9d02315c __nesf2 + 0x9d02315c fpcmp + 0x9d02315c __gesf2 + 0x9d02315c __ltsf2 + +.text.fflush 0x9d0231f8 0x94 + .text.fflush 0x9d0231f8 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d0231f8 fflush + +.text.write 0x9d02328c 0x94 + .text.write 0x9d02328c 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d02328c write + +.text.libm 0x9d023320 0x88 + .text.libm 0x9d023320 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d023320 frexpf + 0x9d023320 fpfrexp + +.text 0x9d0233a8 0x80 + .text 0x9d0233a8 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + 0x9d0233a8 wifi_init + +.text.fptoul 0x9d023428 0x7c + .text.fptoul 0x9d023428 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d023428 fptoul + 0x9d023428 fptoui + 0x9d023428 __fixunssfsi + +.text.SoftReset + 0x9d0234a4 0x78 + .text.SoftReset + 0x9d0234a4 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d0234a4 SoftReset + +.text.fputs 0x9d02351c 0x78 + .text.fputs 0x9d02351c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d02351c fputs + +.text.strncmp 0x9d023594 0x78 + .text.strncmp 0x9d023594 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d023594 strncmp + +.text.ungetc 0x9d02360c 0x74 + .text.ungetc 0x9d02360c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d02360c ungetc + +.text 0x9d023680 0xd8 + .text 0x9d023680 0x70 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + 0x9d023680 SPITransaction + .text 0x9d0236f0 0x68 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + 0x9d0236f0 InitHarakiriRelay + 0x9d023720 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d023758 0x68 + .text._sprintf_cdfFnopuxX + 0x9d023758 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d023758 _sprintf_cdnopuxX + 0x9d023758 _sprintf_cdfFnopuxX + +.rodata 0x9d0237c0 0x68 + .rodata 0x9d0237c0 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d0237c0 _powers_f + 0x9d0237f4 _npowers_f + +.text.sitofp 0x9d023828 0x60 + .text.sitofp 0x9d023828 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d023828 sitofp + 0x9d023828 litofp + 0x9d023828 __floatsisf + +.text.wspace 0x9d023888 0x60 + .text.wspace 0x9d023888 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d0238e8 0x58 + .text 0x9d0238e8 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + 0x9d0238e8 _general_exception_handler + +.text._sscanf_s + 0x9d023940 0x54 + .text._sscanf_s + 0x9d023940 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d023940 _sscanf_s + 0x9d023940 _sscanf_0 + +.text._bufallo 0x9d023994 0x54 + .text._bufallo + 0x9d023994 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023994 _bufallo + +.text.sbrk 0x9d0239e8 0x50 + .text.sbrk 0x9d0239e8 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0239e8 sbrk + +.text.main_entry + 0x9d023a38 0x4c + .text.main_entry + 0x9d023a38 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d023a64 __crt0_exit + +.text 0x9d023a84 0x4c + .text 0x9d023a84 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d023a84 __floatunsisf + +.text._bootstrap_exception_handler + 0x9d023ad0 0x48 + .text._bootstrap_exception_handler + 0x9d023ad0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d023ad0 _bootstrap_exception_handler + +.text 0x9d023b18 0x44 + .text 0x9d023b18 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d023b18 __pic32_software_reset + +.text.puts 0x9d023b5c 0x44 + .text.puts 0x9d023b5c 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d023b5c puts + +.text._printf_cdfFnopsuxX + 0x9d023ba0 0x40 + .text._printf_cdfFnopsuxX + 0x9d023ba0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + 0x9d023ba0 _printf_cdnopsuxX + 0x9d023ba0 _printf_cdnopuxX + 0x9d023ba0 _printf_cdfFnopsuxX + 0x9d023ba0 _printf_fF + +.vector_default + 0x9d023be0 0x38 + .vector_default + 0x9d023be0 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d023be0 _DefaultInterrupt + +.rodata 0x9d023c18 0x30 + .rodata 0x9d023c18 0x30 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.text.INTConfigureSystem + 0x9d023c48 0x30 + .text.INTConfigureSystem + 0x9d023c48 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d023c48 INTConfigureSystem + +.text.free 0x9d023c78 0x30 + .text.free 0x9d023c78 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d023c78 free + +.rodata 0x9d023ca8 0x2c + .rodata 0x9d023ca8 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + +.text._stub_sbd_memlayout + 0x9d023cd4 0x2c + .text._stub_sbd_memlayout + 0x9d023cd4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023cd4 _sbd_memlayout + 0x9d023cd4 _stub_sbd_memlayout + +.rodata 0x9d023d00 0x28 + .rodata 0x9d023d00 0x28 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.text.tolower 0x9d023d28 0x24 + .text.tolower 0x9d023d28 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023d28 tolower + +.text.toupper 0x9d023d4c 0x24 + .text.toupper 0x9d023d4c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023d4c toupper + +.text 0x9d023d70 0x20 + .text 0x9d023d70 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + 0x9d023d70 InitDigitalIO + +.rodata 0x9d023d90 0x1c + .rodata 0x9d023d90 0x1c build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d023dac 0x1c + .text.INTRestoreInterrupts + 0x9d023dac 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d023dac INTRestoreInterrupts + +.text.setbuf 0x9d023dc8 0x1c + .text.setbuf 0x9d023dc8 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d023dc8 setbuf + +.rodata 0x9d023de4 0x18 + .rodata 0x9d023de4 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d023dfc 0x18 + .text.CheKseg0CacheOff + 0x9d023dfc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023dfc CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d023e14 0x18 + .text.CheKseg0CacheOn + 0x9d023e14 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023e14 CheKseg0CacheOn + +.text 0x9d023e2c 0x18 + .text 0x9d023e2c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d023e2c _nmi_handler + +.text.isalnum 0x9d023e44 0x18 + .text.isalnum 0x9d023e44 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e44 isalnum + +.text.isalpha 0x9d023e5c 0x18 + .text.isalpha 0x9d023e5c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e5c isalpha + +.text.iscntrl 0x9d023e74 0x18 + .text.iscntrl 0x9d023e74 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e74 iscntrl + +.text.isdigit 0x9d023e8c 0x18 + .text.isdigit 0x9d023e8c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e8c isdigit + +.text.isgraph 0x9d023ea4 0x18 + .text.isgraph 0x9d023ea4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ea4 isgraph + +.text.islower 0x9d023ebc 0x18 + .text.islower 0x9d023ebc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ebc islower + +.text.isprint 0x9d023ed4 0x18 + .text.isprint 0x9d023ed4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ed4 isprint + +.text.ispunct 0x9d023eec 0x18 + .text.ispunct 0x9d023eec 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023eec ispunct + +.text.isspace 0x9d023f04 0x18 + .text.isspace 0x9d023f04 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f04 isspace + +.text.isupper 0x9d023f1c 0x18 + .text.isupper 0x9d023f1c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f1c isupper + +.text.isxdigit 0x9d023f34 0x18 + .text.isxdigit + 0x9d023f34 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f34 isxdigit + +.text._buffree 0x9d023f4c 0x14 + .text._buffree + 0x9d023f4c 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023f4c _buffree + +.text.__exception_handler_break + 0x9d023f60 0xc + .text.__exception_handler_break + 0x9d023f60 0xc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + 0x9d023f60 __exception_handler_break + +.rodata 0x9d023f6c 0x1c + .rodata 0x9d023f6c 0xc build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .rodata 0x9d023f78 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .rodata 0x9d023f80 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d023f88 0x8 + .text.INTEnableInterrupts + 0x9d023f88 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d023f88 INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d023f90 0x8 + .text.INTDisableInterrupts + 0x9d023f90 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d023f90 INTDisableInterrupts + +.text._on_reset + 0x9d023f98 0x8 + .text._on_reset + 0x9d023f98 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d023f98 _on_reset + +.text._on_bootstrap + 0x9d023fa0 0x8 + .text._on_bootstrap + 0x9d023fa0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d023fa0 _on_bootstrap + +.text.isascii 0x9d023fa8 0x8 + .text.isascii 0x9d023fa8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fa8 isascii + +.text.toascii 0x9d023fb0 0x8 + .text.toascii 0x9d023fb0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fb0 toascii + +.text._tolower 0x9d023fb8 0x8 + .text._tolower + 0x9d023fb8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fb8 _tolower + +.text._toupper 0x9d023fc0 0x8 + .text._toupper + 0x9d023fc0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fc0 _toupper + +.text.getpagesize + 0x9d023fc8 0x8 + .text.getpagesize + 0x9d023fc8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023fc8 getpagesize + +.rodata 0x9d023fd0 0x8 + .rodata 0x9d023fd0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.rodata 0x9d022a74 0x4 + .rodata 0x9d022a74 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.rodata 0x9d023fd8 0x4 + .rodata 0x9d023fd8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z427 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.text%z428 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.text%z429 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.text%z430 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.text%z431 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.text%z432 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.text%z433 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.text%z434 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.text%z435 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf new file mode 100644 index 0000000..cde46a4 Binary files /dev/null and b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf differ diff --git a/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex new file mode 100644 index 0000000..ff6d7b9 --- /dev/null +++ b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex @@ -0,0 +1,8853 @@ +:020000040000fa +:020000041fc01b +:042ff400d9fff8ff0a +:020000040000fa +:020000041fc01b +:042ff800dbcc6cffc3 +:020000040000fa +:020000041fc01b +:042ffc00ffffff7f55 +:020000040000fa +:020000041fc01b +:100000000200f00f0000000000601a40c0045a7f98 +:100010000500401300000000029d1a3c2c405a27a6 +:10002000080040030000000001a01d3cf0ffbd27b8 +:1000300001a01c3c20809c27026009402058200120 +:10004000801e2a7d8449497d02608940c0000000ed +:1000500000e0dc4102608b40c0000000029d083cd3 +:100060008c41082509f800010000000000a0083cb0 +:10007000ac00082500a0093c7030292506000010be +:1000800000000000000000ad040000ad080000ad5d +:100090000c0000ad100008252b080901f9ff201401 +:1000a00000000000029d083cf48708250000098d2f +:1000b000180020110400082500000a8d04000825fe +:1000c00000000b8d090060110400082500000c9150 +:1000d000ffff4a250100082500002ca1fbff401569 +:1000e000010029250500001000000000000020a1eb +:1000f000ffff4a25fdff40150100292503000825c3 +:10010000fcff0a24244048010000098de7ff201568 +:10011000000000000000093c00002925100020110b +:10012000000000000100093c0000292588bf0a3cae +:1001300010204a25000049ad0100093c0000292596 +:1001400088bf0a3c20204a25000049ad0100093c37 +:100150000000292588bf0a3c30204a25000049ad0f +:1001600000488040ffff0a2400588a40009d093c57 +:1001700000202925017889400000093c010029253b +:1001800000000a2444492a7d01608a408000093c1d +:1001900000688940008008408005097d404c0900c6 +:1001a000006008405800013c24400101254028011e +:1001b00000608840029d083c9441082509f8000130 +:1001c0000000000000600840bfff013cffff213439 +:1001d0002440010100608840000084300000a53008 +:1001e000029d083c383c0825080000010000000082 +:020000040000fa +:020000041fc01b +:10038000029d1a3cd03c5a270800400300000000a0 +:020000040000fa +:020000041d00dd +:10218000029d1a3c582d5a27080040030000000009 +:020000040000fa +:020000041d00dd +:08220000788f400b0000000084 +:020000040000fa +:020000041d00dd +:08222000788f400b0000000064 +:020000040000fa +:020000041d00dd +:08224000788f400b0000000044 +:020000040000fa +:020000041d00dd +:082260001680400b0000000095 +:020000040000fa +:020000041d00dd +:08228000b861400b00000000f2 +:020000040000fa +:020000041d00dd +:0822a000788f400b00000000e4 +:020000040000fa +:020000041d00dd +:0822c000788f400b00000000c4 +:020000040000fa +:020000041d00dd +:0822e000788f400b00000000a4 +:020000040000fa +:020000041d00dd +:08230000788f400b0000000083 +:020000040000fa +:020000041d00dd +:08232000788f400b0000000063 +:020000040000fa +:020000041d00dd +:08234000788f400b0000000043 +:020000040000fa +:020000041d00dd +:08236000788f400b0000000023 +:020000040000fa +:020000041d00dd +:08238000788f400b0000000003 +:020000040000fa +:020000041d00dd +:0823a000788f400b00000000e3 +:020000040000fa +:020000041d00dd +:0823c000788f400b00000000c3 +:020000040000fa +:020000041d00dd +:0823e000788f400b00000000a3 +:020000040000fa +:020000041d00dd +:08240000788f400b0000000082 +:020000040000fa +:020000041d00dd +:08242000788f400b0000000062 +:020000040000fa +:020000041d00dd +:08244000788f400b0000000042 +:020000040000fa +:020000041d00dd +:08246000788f400b0000000022 +:020000040000fa +:020000041d00dd +:08248000788f400b0000000002 +:020000040000fa +:020000041d00dd +:0824a000788f400b00000000e2 +:020000040000fa +:020000041d00dd +:0824c000788f400b00000000c2 +:020000040000fa +:020000041d00dd +:0824e000788f400b00000000a2 +:020000040000fa +:020000041d00dd +:08250000174d400b0000000024 +:020000040000fa +:020000041d00dd +:08252000788f400b0000000061 +:020000040000fa +:020000041d00dd +:08254000788f400b0000000041 +:020000040000fa +:020000041d00dd +:08256000788f400b0000000021 +:020000040000fa +:020000041d00dd +:08258000788f400b0000000001 +:020000040000fa +:020000041d00dd +:0825a000788f400b00000000e1 +:020000040000fa +:020000041d00dd +:0825c000788f400b00000000c1 +:020000040000fa +:020000041d00dd +:0825e000788f400b00000000a1 +:020000040000fa +:020000041d00dd +:08260000a64d400b0000000094 +:020000040000fa +:020000041d00dd +:08262000788f400b0000000060 +:020000040000fa +:020000041d00dd +:08264000788f400b0000000040 +:020000040000fa +:020000041d00dd +:08266000788f400b0000000020 +:020000040000fa +:020000041d00dd +:08268000788f400b0000000000 +:020000040000fa +:020000041d00dd +:0826a000788f400b00000000e0 +:020000040000fa +:020000041d00dd +:0826c000788f400b00000000c0 +:020000040000fa +:020000041d00dd +:0826e000788f400b00000000a0 +:020000040000fa +:020000041d00dd +:08270000788f400b000000007f +:020000040000fa +:020000041d00dd +:08272000788f400b000000005f +:020000040000fa +:020000041d00dd +:08274000788f400b000000003f +:020000040000fa +:020000041d00dd +:08276000788f400b000000001f +:020000040000fa +:020000041d00dd +:08278000788f400b00000000ff +:020000040000fa +:020000041d00dd +:0827a000788f400b00000000df +:020000040000fa +:020000041d00dd +:0827c000788f400b00000000bf +:020000040000fa +:020000041d00dd +:0827e000788f400b000000009f +:020000040000fa +:020000041d00dd +:08280000788f400b000000007e +:020000040000fa +:020000041d00dd +:08282000788f400b000000005e +:020000040000fa +:020000041d00dd +:08284000788f400b000000003e +:020000040000fa +:020000041d00dd +:08286000788f400b000000001e +:020000040000fa +:020000041d00dd +:08288000788f400b00000000fe +:020000040000fa +:020000041d00dd +:0828a000788f400b00000000de +:020000040000fa +:020000041d00dd +:0828c000788f400b00000000be +:020000040000fa +:020000041d00dd +:0828e000788f400b000000009e +:020000040000fa +:020000041d00dd +:08290000788f400b000000007d +:020000040000fa +:020000041d00dd +:08292000788f400b000000005d +:020000040000fa +:020000041d00dd +:08294000788f400b000000003d +:020000040000fa +:020000041d00dd +:08296000788f400b000000001d +:020000040000fa +:020000041d00dd +:08298000788f400b00000000fd +:020000040000fa +:020000041d00dd +:0829a000788f400b00000000dd +:020000040000fa +:020000041d00dd +:0829c000788f400b00000000bd +:020000040000fa +:020000041d00dd +:0829e000788f400b000000009d +:020000040000fa +:020000041fc01b +:1004800000f89b40c0000000029d1b3c183d7b27ec +:10049000020060130000000000c09b4000f81b40f9 +:0c04a000c00000001f000042000000002f +:020000040000fa +:020000041d00dd +:1038000038ffbd27c400bfafc000beaf21f0a0038a +:10381000211880002110a000d000c6afc800c3a3ab +:10382000cc00c2a7c800c3932c0002241500621468 +:10383000000000002000c227d000c48f21284000d3 +:103840000400062421380000823c400f00000000e4 +:10385000d201401400000000c480828fcf014010cc +:1038600000000000c480828f2000c3272c000424a5 +:103870002128600009f8400000000000e70f400b1d +:1038800000000000c800c3931d000224150062144c +:10389000000000002400c227d000c48f212840006f +:1038a0000800062421380000823c400f0000000080 +:1038b000ba01401400000000c480828fb70140109c +:1038c00000000000c480828f2400c3271d00042450 +:1038d0002128600009f8400000000000e70f400bbd +:1038e00000000000c800c393080002241500621401 +:1038f000000000005400c227d000c48f21284000df +:103900003000062401000724823c400f0000000024 +:10391000a201401400000000c480828f9f0140106b +:1039200000000000c480828f5400c32708000424d4 +:103930002128600009f8400000000000e70f400b5c +:1039400000000000c800c39310000224930162101d +:1039500000000000c800c393320002241500621466 +:10396000000000002c00c227d000c48f2128400096 +:103970001000062421380000823c400f00000000a7 +:103980008601401400000000c480828f8301401033 +:1039900000000000c480828f2c00c3273200042462 +:1039a0002128600009f8400000000000e70f400bec +:1039b00000000000c800c3932f0002241b00621403 +:1039c000000000005400c2272120400021280000f0 +:1039d00068000624f27a400f000000005400c2275d +:1039e000d000c48f21284000680006242138000040 +:1039f000823c400f000000006801401400000000fd +:103a0000c480828f6501401000000000c480828f56 +:103a10005400c3272f0004242128600009f8400027 +:103a200000000000e70f400b00000000c800c39337 +:103a30003400022414006214000000003c00c2277d +:103a4000d000c48f21284000040006242138000043 +:103a5000823c400f000000005001401400000000b4 +:103a6000c480828f4d01401000000000c480828f0e +:103a7000340004242128000009f840000000000060 +:103a8000e70f400b00000000c800c393130002249e +:103a900017006214000000004000c227d000c48f4d +:103aa000212840000400062421380000823c400ff9 +:103ab0000000000039014014000000004000c293e3 +:103ac000c08082a3c480828f3401401000000000b7 +:103ad000c480828f4000c327130004242128600083 +:103ae00009f8400000000000e70f400b0000000054 +:103af000c800c393150002241500621400000000e2 +:103b00005400c227d000c48f212840002c00062476 +:103b100021380000823c400f000000001f014014cb +:103b200000000000c480828f1c01401000000000d3 +:103b3000c480828f5400c32715000424212860000c +:103b400009f8400000000000e70f400b00000000f3 +:103b5000c800c39304000224150062140000000092 +:103b60001800c227d000c48f21284000040006247a +:103b700021380000823c400f000000000701401483 +:103b800000000000c480828f04014010000000008b +:103b9000c480828f1800c3270400042421286000f9 +:103ba00009f8400000000000e70f400b0000000093 +:103bb000c800c393790002241500621400000000bd +:103bc0001800c227d000c48f21284000040006241a +:103bd00021380000823c400f00000000ef0040143c +:103be00000000000c480828fec0040100000000044 +:103bf000c480828f1800c327790004242128600024 +:103c000009f8400000000000e70f400b0000000032 +:103c1000c800c3930b0002241500621400000000ca +:103c20005400c227d000c48f21284000640006241d +:103c300001000724823c400f00000000d700401420 +:103c400000000000c480828fd400401000000000fb +:103c5000c480828f5400c3270b00042421286000f5 +:103c600009f8400000000000e70f400b00000000d2 +:103c7000c800c3932a00022415006214000000004b +:103c80004400c227d000c48f21284000040006242d +:103c900001000724823c400f00000000bf004014d8 +:103ca00000000000c480828fbc00401000000000b3 +:103cb000c480828f4400c3272a0004242128600086 +:103cc00009f8400000000000e70f400b0000000072 +:103cd000c800c393220002243600621400000000d2 +:103ce0001800c227d000c48f2128400002000624fb +:103cf00021380000823c400f00000000a700401463 +:103d0000000000001900c29300120200ffff4330c0 +:103d10001800c293211062001000c2a71000c297c1 +:103d200002004224212040000e82400f00000000cb +:103d30001400c2af1400c28f9800401000000000b1 +:103d40001400c28f1000c397000043a4d000c28f9c +:103d5000020044241400c28f020043241400c28fc6 +:103d60000000429421286000213040000100072417 +:103d7000823c400f000000000900401400000000d9 +:103d8000c480828f0600401000000000c480828f33 +:103d9000220004241400c58f09f840000000000030 +:103da0001400c48f9e8f400f00000000e70f400bef +:103db00000000000c800c3933c00022420006214ed +:103dc000000000004800c227d000c48f2128400016 +:103dd0000800062421380000823c400f000000004b +:103de0006e00401400000000d000c28f0800442480 +:103df0004800c38f4c00c29721286000213040004a +:103e000001000724823c400f0000000063004014c2 +:103e100000000000c480828f60004010000000009d +:103e2000c480828f4800c3273c00042421286000fe +:103e300009f8400000000000e70f400b0000000000 +:103e4000c800c3932400022415006214000000007f +:103e50005000c227d000c48f21284000040006244f +:103e600021380000823c400f000000004b0040144d +:103e700000000000c480828f480040100000000055 +:103e8000c480828f5000c3272400042421286000ae +:103e900009f8400000000000e70f400b00000000a0 +:103ea000c800c393370002243c00621400000000e5 +:103eb000cc00c2972400422c3800401400000000bf +:103ec0005400c227d000c48f2128400024000624bb +:103ed00021380000823c400f000000002f004014f9 +:103ee00000000000cc00c297dcff4224cc00c2a737 +:103ef000cc00c2971f00401000000000cc80828fd1 +:103f00001c00401000000000cc00c397d2808297b4 +:103f100021204000d0808297211082002a10430087 +:103f20000300401000000000d2808297cc00c2a79e +:103f3000d080829721184000d000c28f21106200eb +:103f400024004224d000c2afcc80838fcc00c29723 +:103f5000d000c48f212860002130400001000724d8 +:103f6000823c400f000000000200401000000000f2 +:103f7000cc00c0a7c880828f08004010000000005d +:103f8000c880828fcc80858fcc00c3975400c42713 +:103f90002130600009f840000000000021e8c00363 +:103fa000c400bf8fc000be8fc800bd270800e0035b +:103fb00000000000e0ffbd271c00bfaf1800beaf2f +:103fc00021f0a0031000c0a321200000a26c400f2c +:103fd000000000001000c2a31000c28305004014be +:103fe00000000000eb33400f00000000fe0f400b0c +:103ff00000000000000000001000c28321e8c003a0 +:104000001c00bf8f1800be8f2000bd270800e003f2 +:1040100000000000e0ffbd271c00bfaf1800beafce +:1040200021f0a0032000c4af1000c0a32000c28f65 +:104030000500401400000000f4ff02241000c2a399 +:104040008110400b000000002000c28f21204000a2 +:10405000107b400f0000000008004010000000002e +:104060002000c28f21204000107b400f0000000084 +:104070002100422c0500401400000000f4ff02243f +:104080001000c2a38110400b000000002000c28f6e +:10409000210042900f00422c05004010000000005b +:1040a0002000c28f21004290050040140000000053 +:1040b000f4ff02241000c2a38110400b0000000096 +:1040c0002000c28f410042900d004014000000000b +:1040d0002000c28f420042900900401400000000fe +:1040e0002000c28f430042900500401400000000f1 +:1040f000f4ff02241000c2a38110400b0000000056 +:104100002000c28f3f004390010002243c00621057 +:10411000000000002000c28f3f00439003000224f3 +:1041200033006214000000002000c28f2200429081 +:1041300006004010000000002000c28f22004290c4 +:104140000500422c0500401400000000f4ff02248a +:104150001000c2a38110400b000000002000c28f9d +:10416000230043900a0002240a00621000000000ad +:104170002000c28f230043901a0002240500621021 +:1041800000000000f4ff02241000c2a38110400bc5 +:10419000000000002000c28f2400422410004010c4 +:1041a000000000002000c28f240042242120400093 +:1041b000107b400f000000000900401000000000cc +:1041c0002000c28f2400422421204000107b400f99 +:1041d000000000001b00422c0a00401400000000f8 +:1041e000f4ff02241000c2a38110400b0000000065 +:1041f000f4ff02241000c2a38110400b0000000055 +:10420000000000001000c28321e8c0031c00bf8f23 +:104210001800be8f2000bd270800e003000000004a +:10422000f0ffbd270c00beaf21f0a0031000c4af0b +:104230000000c0a31000c28f050040140000000061 +:10424000f4ff02240000c2a3b710400b00000000de +:104250001000c28f000042900300401400000000d4 +:10426000f4ff02240000c2a31000c28f010042909c +:104270000a00422c06004014000000001000c28f0b +:1042800001004290fb00422c03004014000000009b +:10429000f4ff02240000c2a31000c28f020042906b +:1042a00006004010000000001000c28f0200429083 +:1042b0000300422c0300401400000000f4ff02241d +:1042c0000000c2a31000c28f03004280030040041c +:1042d00000000000f4ff02240000c2a30000c2831b +:1042e00021e8c0030c00be8f1000bd270800e003ca +:1042f00000000000d0ffbd272c00bfaf2800beafdc +:1043000021f0a003211080003000c2a3f4ff02249a +:104310002000c2a32400c0af3000c2932400c2a377 +:104320002400c2271000a0af1400a0af1800a0af57 +:104330000100042423000524213040000400072448 +:10434000ff39400f000000002000c2a32000c283fc +:1043500021e8c0032c00bf8f2800be8f3000bd278e +:104360000800e00300000000e0ffbd271c00bfaf15 +:104370001800beaf21f0a003f4ff02241000c2a376 +:1043800021200000c16c400f000000001000c2a3fb +:104390001000c28321e8c0031c00bf8f1800be8f2d +:1043a0002000bd270800e00300000000c8ffbd2773 +:1043b0003400bfaf3000beaf21f0a0033800c4af5f +:1043c0001000c0a33800c28f050040140000000098 +:1043d000f4ff02241000c2a33711400b00000000bc +:1043e0003800c28f0000428cc48082af3800c28f78 +:1043f0000400428cc88082af21200000ec6c400f8a +:10440000000000001000c2a31000c2832c00401462 +:1044100000000000212000002a39400f00000000a9 +:104420001000c2a31000c2831f004014000000004f +:1044300001000424009d023c00384524193d400f32 +:10444000000000001400c227212040003116400f58 +:10445000000000001000c2a31400c2272120400069 +:104460006516400f000000001000c28317004014c2 +:10447000000000007b39400f000000001000c2a3c4 +:104480001000c28314004014000000003800c28fe6 +:104490001800429021204000bd10400f0000000095 +:1044a0003711400b00000000000000002120000038 +:1044b000526d400f000000003711400b000000005b +:1044c000000000003711400b000000000000000059 +:1044d0003711400b00000000000000001000c283f4 +:1044e00021e8c0033400bf8f3000be8f3800bd27e5 +:1044f0000800e00300000000e0ffbd271c00bfaf84 +:104500001800beaf21f0a0032000c4af1000c0a36c +:10451000da10400f000000001000c2a31000c28398 +:1045200005004014000000002000c48feb10400f75 +:10453000000000001000c2a31000c28321e8c003e5 +:104540001c00bf8f1800be8f2000bd270800e003ad +:1045500000000000e8ffbd271400bfaf1000beaf91 +:1045600021f0a0031800c4af212000004539400ffe +:104570000000000021200000526d400f00000000ec +:104580002110000021e8c0031400bf8f1000be8f6f +:104590001800bd270800e00300000000e8ffbd2769 +:1045a0001400bfaf1000beaf21f0a0032120000017 +:1045b0005511400f00000000da10400f000000000d +:1045c00021e8c0031400bf8f1000be8f1800bd2764 +:1045d0000800e00300000000e8ffbd271400bfafa3 +:1045e0001000beaf21f0a0031800c4af1800c48fa4 +:1045f000eb10400f0000000021e8c0031400bf8f43 +:104600001000be8f1800bd270800e0030000000066 +:10461000e0ffbd271c00bfaf1800beaf21f0a00314 +:104620002000c4aff4ff02241000c2a36711400fa2 +:10463000000000001000c2a31000c2830500401457 +:10464000000000002000c48f7611400f0000000021 +:104650001000c2a31000c28321e8c0031c00bf8f5a +:104660001800be8f2000bd270800e00300000000f6 +:10467000e8ffbd271400bfaf1000beaf21f0a003bc +:10468000453c400f0000000021e8c0031400bf8f2c +:104690001000be8f1800bd270800e00300000000d6 +:1046a000e8ffbd271400bfaf1000beaf21f0a0038c +:1046b0001800c4af4f3c400f0000000021e8c003c9 +:1046c0001400bf8f1000be8f1800bd270800e00344 +:1046d00000000000d8ffbd272400bfaf2000beaf00 +:1046e00021f0a0031000a0af1400a0af1800a0afed +:1046f0000100042429000524213000002138000095 +:10470000ff39400f0000000021e8c0032400bf8fe4 +:104710002000be8f2800bd270800e0030000000035 +:10472000d8ffbd272400bfaf2000beaf21f0a003fb +:104730002800c4af2120a0002118c0003400c7af5a +:104740003800c28f2c00c4a33000c3a31800c2a736 +:104750002c00c3933000c2931800c4971000a4af7c +:104760001400a0af2800c48f212860002130400031 +:104770003400c78fe511400f0000000021e8c0039e +:104780002400bf8f2000be8f2800bd270800e00353 +:104790000000000048ffbd27b400bfafb000beafaf +:1047a00021f0a003b800c4af2120c000c400c7afef +:1047b000c800c38fcc00c28fbc00c5a3c000c4a377 +:1047c000a800c3a7ac00c2a32000c0a3c000c3932d +:1047d000010002244e00621000000000c400c28fdd +:1047e0000500401400000000f4ff02242000c2a3d2 +:1047f000ef12400b00000000c000c393020002242f +:104800004300621400000000c400c28f2120400059 +:10481000107b400f000000002118400040000224df +:104820003b006214000000002100c0a3c400c28f3e +:104830002400c2af4012400b000000002100c293d0 +:104840002400c38f21106200000042903000422cef +:1048500024004014000000002100c2932400c38ff4 +:1048600021106200000042903a00422c08004014df +:10487000000000002100c2932400c38f21106200b9 +:10488000000042904100422c16004014000000003d +:104890002100c2932400c38f2110620000004290c7 +:1048a0004700422c08004014000000002100c29381 +:1048b0002400c38f21106200000042906100422c4e +:1048c00008004014000000002100c2932400c38fa0 +:1048d00021106200000042906700422c0500401445 +:1048e00000000000f4ff02242000c2a3ef12400bde +:1048f000000000002100c293010042242100c2a355 +:104900002100c2934000422cccff40140000000064 +:10491000bc00c2930500401000000000bc00c29320 +:104920002100422c0500401400000000f4ff022486 +:104930002000c2a3ef12400b00000000a800c297a5 +:104940000500401000000000a800c2970f00422c94 +:104950000900401400000000a800c397ff000224d3 +:104960000500621000000000f4ff02242000c2a332 +:10497000ef12400b00000000b800c38fbc00c293d0 +:104980003800c427460084242128600021304000dc +:10499000b57a400f00000000bc00c2932000c3277e +:1049a000211062005e0040a0a800c2977c00c2a750 +:1049b000ac00c2932b100200ff0042309f00c2a344 +:1049c0003800c2272800c2af2800c28fc000c3939e +:1049d000410043a0c000c3930300022439006214c5 +:1049e00000000000c400c28f2c00c2af2800c28f9c +:1049f0003000c2af2c00c28f00004290ffff422463 +:104a0000ff0043303000c28f000043a03000c28f4f +:104a1000000042900400422c0500401400000000f9 +:104a2000f4ff02242000c2a3ef12400b000000009c +:104a30002c00c28f01004290ffff4224ff00433050 +:104a40003000c28f010043a03000c28f01004390ac +:104a50000a0002240a006210000000003000c28f29 +:104a6000010043901a0002240500621000000000bb +:104a7000f4ff02242000c2a3ef12400b000000004c +:104a80003000c28f020044242c00c28f0200432455 +:104a90002c00c28f0100429021286000213040008c +:104aa000b57a400f000000002c00c28f0100429038 +:104ab0003000c38f21106200020040a0e412400bbe +:104ac00000000000c000c393020002241b00621417 +:104ad00000000000c400c28f21204000107b400f66 +:104ae000000000003400c2a73400c2970500401047 +:104af000000000003400c2974100422c0500401421 +:104b000000000000f4ff02242000c2a3ef12400bbb +:104b1000000000002800c48fc400c38f3400c29777 +:104b2000010042242128600021304000b57a400f66 +:104b300000000000e412400b00000000c000c3931e +:104b4000040002240a006214000000002800c38f41 +:104b5000c400c28f212060002128400040000624ac +:104b6000b57a400f00000000e412400b0000000086 +:104b7000c000c39301000224050062100000000081 +:104b8000f4ff02242000c2a3ef12400b000000003b +:104b90003800c2271000a0af1400a0af1800a0afcb +:104ba0000100042428000524213040006c00072463 +:104bb000ff39400f000000002000c2a32000c28384 +:104bc00021e8c003b400bf8fb000be8fb800bd277e +:104bd0000800e00300000000d8ffbd272400bfaf9d +:104be0002000beaf21f0a0031000a0af1400a0afc2 +:104bf0001800a0af010004242b0005242130000080 +:104c000021380000ff39400f0000000021e8c003f8 +:104c10002400bf8f2000be8f2800bd270800e003be +:104c200000000000d0ffbd272c00bfaf2800beafa2 +:104c300021f0a0033000c4af2000c2272120400093 +:104c40003000c58f06000624b57a400f0000000032 +:104c50001000a0af1400a0af1800a0af0100042402 +:104c6000020005242000c22721304000080007244c +:104c7000ff39400f0000000021e8c0032c00bf8f67 +:104c80002800be8f3000bd270800e00300000000b0 +:104c9000d8ffbd272400bfaf2000beaf21f0a00386 +:104ca0002800c4af2800c28f0800438c2800c28fa0 +:104cb000080043ac2800c28f0400438c2800c28f38 +:104cc000040043ac2800c28f0000438c2800c28f30 +:104cd000000043ac2800c28f0c00438c2800c28f18 +:104ce0000c0043ac2800c28f1000a0af1400a0af8e +:104cf0001800a0af020004240a000524213040005f +:104d000010000724ff39400f0000000021e8c00315 +:104d10002400bf8f2000be8f2800bd270800e003bd +:104d200000000000f8ffbd270400beaf21f0a00383 +:104d30002110000021e8c0030400be8f0800bd2739 +:104d40000800e00300000000f8ffbd270400beaf2c +:104d500021f0a0030800c4af2110000021e8c00327 +:104d60000400be8f0800bd270800e003000000001b +:104d7000d0ffbd272c00bfaf2800beaf21f0a0039d +:104d8000211080003000c2a33000c2930400401004 +:104d9000000000000b0002246913400b000000001b +:104da0000c0002242000c2a32000c2931000a0af78 +:104db0001400a0af1800a0af020004242128400076 +:104dc0002130000021380000ff39400f00000000b2 +:104dd00021e8c0032c00bf8f2800be8f3000bd2704 +:104de0000800e00300000000d8ffbd272400bfaf8b +:104df0002000beaf21f0a0032800c4af2800c28f5e +:104e00001000a0af1400a0af1800a0af0100042450 +:104e1000390005242130400004000724ff39400fe9 +:104e20000000000021e8c0032400bf8f2000be8fd7 +:104e30002800bd270800e00300000000d8ffbd27c0 +:104e40002400bfaf2000beaf21f0a0032800c4aff4 +:104e50002800c28f0000429001004224ffff423030 +:104e60001000a0af1400a0af1800a0af01000424f0 +:104e7000110005242800c68f21384000ff39400f5b +:104e80000000000021e8c0032400bf8f2000be8f77 +:104e90002800bd270800e00300000000d0ffbd2768 +:104ea0002c00bfaf2800beaf21f0a0033000c4af7c +:104eb000f4ff02242000c2a33000c48f8810400fea +:104ec000000000000c004014000000003000c28f01 +:104ed0001000a0af1400a0af1800a0af0100042480 +:104ee000160005242130400008000724ff39400f38 +:104ef000000000002000c2a32000c28321e8c003fc +:104f00002c00bf8f2800be8f3000bd270800e003b3 +:104f100000000000d0ffbd272c00bfaf2800beafaf +:104f200021f0a003211080003000c2a7f4ff02246a +:104f30002000c2a33000c2972400c2a72400c227c9 +:104f40001000a0af1400a0af1800a0af010004240f +:104f5000170005242130400004000724ff39400fca +:104f6000000000002000c2a32000c28321e8c0038b +:104f70002c00bf8f2800be8f3000bd270800e00343 +:104f800000000000d0ffbd272c00bfaf2800beaf3f +:104f900021f0a003211080003000c2a32000c0a394 +:104fa0003000c29305004010000000003000c293a2 +:104fb0000f00422c05004014000000003000c39395 +:104fc000ff00022410006214000000003000c293b1 +:104fd0002400c2a32400c2271000a0af1400a0af79 +:104fe0001800a0af01000424120005242130400065 +:104ff00004000724ff39400f000000002000c2a376 +:105000000414400b00000000f1ff02242000c2a3a2 +:105010002000c28321e8c0032c00bf8f2800be8f70 +:105020003000bd270800e00300000000d0ffbd27ce +:105030002c00bfaf2800beaf21f0a00321108000dc +:105040003000c2a32000c0a33000c293050040106e +:10505000000000003000c2930f00422c05004014f5 +:10506000000000003000c393ff000224100062140f +:10507000000000003000c2932400c2a32400c22715 +:105080001000a0af1400a0af1800a0af01000424ce +:10509000250005242130400004000724ff39400f7b +:1050a000000000002000c2a32e14400b00000000ee +:1050b000f1ff02242000c2a32000c28321e8c00324 +:1050c0002c00bf8f2800be8f3000bd270800e003f2 +:1050d00000000000c8ffbd273400bfaf3000beafe6 +:1050e00021f0a003211080003c00c5af3800c2a30e +:1050f0003800c2932000c2a33800c29308004014b5 +:10510000000000002100c3273c00c28f2120600066 +:105110002128400008000624b57a400f0000000056 +:105120001000a0af1400a0af1800a0af010004242d +:105130002f0005242000c227213040000c00072446 +:10514000ff39400f0000000021e8c0033400bf8f8a +:105150003000be8f3800bd270800e00300000000cb +:10516000d0ffbd272c00bfaf2800beaf21f0a003a9 +:105170002000c0a31000a0af1400a0af1800a0af83 +:1051800001000424310005242130000021380000f2 +:10519000ff39400f000000002000c2a32000c2839e +:1051a00021e8c0032c00bf8f2800be8f3000bd2730 +:1051b0000800e00300000000d0ffbd272c00bfafb7 +:1051c0002800beaf21f0a003211080003000c2a350 +:1051d0002000c0a33000c393010002240900621024 +:1051e000000000003000c393060002240500621096 +:1051f000000000003000c3930b0002241000621472 +:10520000000000003000c2932400c2a32400c22783 +:105210001000a0af1400a0af1800a0af010004243c +:105220005b0005242130400004000724ff39400fb3 +:10523000000000002000c2a39214400b00000000f8 +:10524000f4ff02242000c2a32000c28321e8c0038f +:105250002c00bf8f2800be8f3000bd270800e00360 +:1052600000000000d0ffbd272c00bfaf2800beaf5c +:1052700021f0a0032000c0a31000a0af1400a0af35 +:105280001800a0af010004245c00052421300000b8 +:1052900021380000ff39400f000000002000c2a3a9 +:1052a0002000c28321e8c0032c00bf8f2800be8fde +:1052b0003000bd270800e00300000000d0ffbd273c +:1052c0002c00bfaf2800beaf21f0a0033000c4af58 +:1052d000f4ff02242000c2a33000c48f0510400f49 +:1052e000000000000c004014000000003000c28fdd +:1052f0001000a0af1400a0af1800a0af010004245c +:10530000460005242130400048000724ff39400fa3 +:10531000000000002000c2a32000c28321e8c003d7 +:105320002c00bf8f2800be8f3000bd270800e0038f +:1053300000000000d0ffbd272c00bfaf2800beaf8b +:1053400021f0a0032000c0a31000a0af1400a0af64 +:105350001800a0af010004244700052421300000fc +:1053600021380000ff39400f000000002000c2a3d8 +:105370002000c28321e8c0032c00bf8f2800be8f0d +:105380003000bd270800e00300000000d0ffbd276b +:105390002c00bfaf2800beaf21f0a0032000c0a3a7 +:1053a0001000a0af1400a0af1800a0af01000424ab +:1053b000030005242130000021380000ff39400f90 +:1053c000000000002000c2a32000c28321e8c00327 +:1053d0002c00bf8f2800be8f3000bd270800e003df +:1053e00000000000d0ffbd272c00bfaf2800beafdb +:1053f00021f0a0032000c0a31000a0af1400a0afb4 +:105400001800a0af0100042405000524213000008d +:1054100021380000ff39400f000000002000c2a327 +:105420002000c28321e8c0032c00bf8f2800be8f5c +:105430003000bd270800e00300000000d0ffbd27ba +:105440002c00bfaf2800beaf21f0a0032000c0a3f6 +:105450001000a0af1400a0af1800a0af01000424fa +:10546000060005242130000021380000ff39400fdc +:10547000000000002000c2a32000c28321e8c00376 +:105480002c00bf8f2800be8f3000bd270800e0032e +:1054900000000000d0ffbd272c00bfaf2800beaf2a +:1054a00021f0a0033000c4af2110a0003400c2a737 +:1054b000ffff02242000c2a33000c28f160040105c +:1054c000000000003400c2971300401000000000ec +:1054d0003400c2972400c2a70e0002242600c2a7ef +:1054e0002400c2273400c3973000c48f1000a4af3b +:1054f0001400a3af1a0003241800a3af0100042472 +:105500009e0005242130400004000724ff39400f8d +:10551000000000002000c2a32000c28321e8c003d5 +:105520002c00bf8f2800be8f3000bd270800e0038d +:1055300000000000e0ffbd271c00bfaf1800beaf99 +:1055400021f0a0032000c4af2400c5af1000c0a309 +:105550009838400f000000001000c2a31000c28362 +:105560000c004014000000002000c48f2400c58ff0 +:10557000b237400f000000001000c2a31000c28329 +:105580000400401400000000e138400f000000005b +:105590001000c2a31000c28321e8c0031c00bf8f0b +:1055a0001800be8f2000bd270800e00300000000a7 +:1055b000e0ffbd271c00bfaf1800beaf21f0a00365 +:1055c0002000c4af1000c0a39838400f00000000b6 +:1055d0001000c2a31000c2830b00401400000000a2 +:1055e0002000c48f0a38400f000000001000c2a342 +:1055f0001000c2830400401400000000e138400f96 +:10560000000000001000c2a31000c28321e8c00304 +:105610001c00bf8f1800be8f2000bd270800e003cc +:1056200000000000d0ffbd272c00bfaf2800beaf98 +:1056300021f0a003211080003000c2a32000c0a3ed +:105640003000c2932400c2a32400c2271000a0afe0 +:105650001400a0af1800a0af01000424140005241a +:105660002130400004000724ff39400f00000000f3 +:105670002000c2a32000c28321e8c0032c00bf8ffa +:105680002800be8f3000bd270800e00300000000a6 +:10569000f8ffbd270400beaf21f0a003c0808293b5 +:1056a000ff00423021e8c0030400be8f0800bd2780 +:1056b0000800e00300000000e8ffbd271400bfafb2 +:1056c0001000beaf21f0a003d738400f000000004b +:1056d00021e8c0031400bf8f1000be8f1800bd2743 +:1056e0000800e00300000000d0ffbd272c00bfaf82 +:1056f0002800beaf21f0a003211880002110a000d7 +:105700003000c3a33400c2a32000c0a33000c29362 +:105710002400c2a33400c2932500c2a32400c227e0 +:105720001000a0af1400a0af1800a0af0100042427 +:105730002d0005242130400004000724ff39400fcc +:10574000000000002000c2a33000c29321204000ce +:10575000cb38400f000000002000c28321e8c003c6 +:105760002c00bf8f2800be8f3000bd270800e0034b +:1057700000000000d0ffbd272c00bfaf2800beaf47 +:1057800021f0a0033000c4af2000c0a3d738400fe1 +:10579000000000002100c2a32100c39304000224e2 +:1057a0000e006214000000003000c28f2400c2af5f +:1057b0002400c2271000a0af1400a0af1800a0afb3 +:1057c000010004243a00052421304000040007248d +:1057d000ff39400f000000002000c2a32000c28358 +:1057e00021e8c0032c00bf8f2800be8f3000bd27ea +:1057f0000800e00300000000a8ffbd275400bfaf71 +:105800005000beaf21f0a0035800c4af2110a0008b +:105810005c00c2a35c00c2933000422c0300401421 +:1058200000000000300002245c00c2a35c00c293b0 +:10583000010042245c00c2a35c00c2932000c32785 +:10584000212060005800c58f21304000b57a400ffc +:10585000000000001000a0af1400a0af1800a0af1f +:1058600001000424090005242000c2272130400043 +:1058700030000724ff39400f0000000021e8c0037a +:105880005400bf8f5000be8f5800bd270800e003b2 +:1058900000000000e8ffbd271400bfaf1000beaf3e +:1058a00021f0a0038c34400f0000000021e8c00369 +:1058b0001400bf8f1000be8f1800bd270800e00342 +:1058c00000000000e0ffbd271c00bfaf1800beaf06 +:1058d00021f0a0032000c4af1000c0a39838400fef +:1058e000000000001000c2a31000c2830700401493 +:1058f000000000002000c48fd86b400f00000000a3 +:105900001000c2a3e138400f000000001000c28365 +:1059100021e8c0031c00bf8f1800be8f2000bd27e8 +:105920000800e00300000000e0ffbd271c00bfaf3f +:105930001800beaf21f0a0031000c0a31200c0a742 +:105940001200c2272120000021284000b06b400f28 +:10595000000000001000c2a31000c2830600401423 +:10596000000000001200c297212040005d39400f66 +:10597000000000001000c2a31000c28321e8c00391 +:105980001c00bf8f1800be8f2000bd270800e00359 +:1059900000000000e0ffbd271c00bfaf1800beaf35 +:1059a00021f0a0032000c4af1000c0a39838400f1e +:1059b000000000001000c2a31000c28307004014c2 +:1059c000000000002000c48f3d6c400f000000006c +:1059d0001000c2a3e138400f000000001000c28395 +:1059e00021e8c0031c00bf8f1800be8f2000bd2718 +:1059f0000800e00300000000d0ffbd272c00bfaf6f +:105a00002800beaf21f0a0033000c4af3400c5af02 +:105a10002118c0002110e0003800c3a73c00c2a735 +:105a2000ffff02242000c2a33000c28f000042907a +:105a300017004010000000003000c28f00004290ac +:105a40000f00422c12004010000000003400c28ff2 +:105a5000cc8082af3800c297d28082a73c00c29728 +:105a6000d08082a73000c28f1000a0af1400a0af7a +:105a70001800a0af010004243500052421304000a7 +:105a800018000724ff39400f000000002000c2a3c7 +:105a90002000c28321e8c0032c00bf8f2800be8fe6 +:105aa0003000bd270800e00300000000d8ffbd273c +:105ab0002400bfaf2000beaf21f0a0031000a0afb4 +:105ac0001400a0af1800a0af010004243600052484 +:105ad0002130000021380000ff39400f0000000095 +:105ae00021e8c0032400bf8f2000be8f2800bd27ff +:105af0000800e00300000000d0ffbd272c00bfaf6e +:105b00002800beaf21f0a0033000c4af2118a000d0 +:105b10002110c0003400c3a73800c2a7ffff022431 +:105b20002000c2a33000c28f13004010000000000c +:105b30003800c2972400c2a73400c2972600c2a72b +:105b40002400c2273800c3973000c48f1000a4afd0 +:105b50001400a3af040003241800a3af0100042421 +:105b6000b80005242130400004000724ff39400f0d +:105b7000000000002000c2a32000c28321e8c0036f +:105b80002c00bf8f2800be8f3000bd270800e00327 +:105b90000000000048ffbd27b400bfafb000beaf9b +:105ba00021f0a003b800c4afbc00c5af2110c000f5 +:105bb000c000c2a3f4ff02242000c2a3b800c28f19 +:105bc0002b00401000000000b800c48f0510400feb +:105bd000000000002600401400000000b800c28f42 +:105be0002400c3272120600021284000480006240b +:105bf000b57a400f00000000bc00c28f2120400099 +:105c0000107b400f00000000190040100000000051 +:105c1000bc00c28f16004010000000002400c22704 +:105c200048004324bc00c28f21206000212840008e +:105c300040000624b57a400f00000000c000c29367 +:105c4000ac00c2a32400c2271000a0af1400a0af74 +:105c50001800a0af010004248a0005242130400070 +:105c60008c000724ff39400f000000002000c2a371 +:105c70002000c28321e8c003b400bf8fb000be8ff4 +:105c8000b800bd270800e00300000000d8ffbd27d2 +:105c90002400bfaf2000beaf21f0a0031000a0afd2 +:105ca0001400a0af1800a0af010004240c000524cc +:105cb0002130000021380000ff39400f00000000b3 +:105cc00021e8c0032400bf8f2000be8f2800bd271d +:105cd0000800e00300000000d8ffbd272400bfaf8c +:105ce0002000beaf21f0a0031000a0af1400a0afb1 +:105cf0001800a0af01000424070005242130000093 +:105d000021380000ff39400f0000000021e8c003e7 +:105d10002400bf8f2000be8f2800bd270800e003ad +:105d200000000000d8ffbd272400bfaf2000beaf99 +:105d300021f0a0032800c4af2800c2271000a0afa4 +:105d40001400a0af1800a0af010004240d0005242a +:105d50002130400008000724ff39400f00000000f8 +:105d600021e8c0032400bf8f2000be8f2800bd277c +:105d70000800e00300000000d8ffbd272400bfafeb +:105d80002000beaf21f0a0031000a0af1400a0af10 +:105d90001800a0af010004241c00052421300000dd +:105da00021380000ff39400f0000000021e8c00347 +:105db0002400bf8f2000be8f2800bd270800e0030d +:105dc00000000000d0ffbd272c00bfaf2800beaff1 +:105dd00021f0a003211080003000c2a33000c29344 +:105de00004004010000000000e0002247e17400b4b +:105df000000000000f0002242000c2a32000c29374 +:105e00001000a0af1400a0af1800a0af0100042440 +:105e1000212840002130000021380000ff39400fc8 +:105e20000000000021e8c0032c00bf8f2800be8fb7 +:105e30003000bd270800e00300000000d0ffbd27b0 +:105e40002c00bfaf2800beaf21f0a00321108000be +:105e50003000c2a32000c0a33000c2932400c2a31c +:105e60002400c2271000a0af1400a0af1800a0affc +:105e700001000424180005242130400004000724f8 +:105e8000ff39400f000000002000c2a32000c283a1 +:105e900021e8c0032c00bf8f2800be8f3000bd2733 +:105ea0000800e00300000000d0ffbd272c00bfafba +:105eb0002800beaf21f0a003211080003000c2a353 +:105ec0002000c0a33000c2932400c2a32400c22734 +:105ed0001000a0af1400a0af1800a0af0100042470 +:105ee000190005242130400004000724ff39400f29 +:105ef000000000002000c2a32000c28321e8c003ec +:105f00002c00bf8f2800be8f3000bd270800e003a3 +:105f100000000000d0ffbd272c00bfaf2800beaf9f +:105f200021f0a003211080003000c2a32000c0a3f4 +:105f30003000c2932400c2a32400c2271000a0afe7 +:105f40001400a0af1800a0af010004241b0005241a +:105f50002130400004000724ff39400f00000000fa +:105f60002000c2a32000c28321e8c0032c00bf8f01 +:105f70002800be8f3000bd270800e00300000000ad +:105f8000d0ffbd272c00bfaf2800beaf21f0a0037b +:105f9000211080003000c2a72000c0a32400c0afa1 +:105fa0003000c2972400c2a72400c2271000a0af6f +:105fb0001400a0af1800a0af010004241a000524ab +:105fc0002130400004000724ff39400f000000008a +:105fd0002000c2a32000c28321e8c0032c00bf8f91 +:105fe0002800be8f3000bd270800e003000000003d +:105ff000c8ffbd273400bfaf3000beaf21f0a00303 +:106000003800c4af2110a0003c00c2a7f4ff022456 +:106010002000c2a32400c0af2800c0af3c00c2973c +:106020003406422c13004010000000003800c28fdc +:1060300010004010000000003c00c2972800c2a7da +:106040003800c28f2400c2af2400c2271000a0afc6 +:106050001400a0af1800a0af01000424bb00052469 +:106060002130400008000724ff39400f00000000e5 +:106070002000c2a32000c28321e8c0033400bf8fe8 +:106080003000be8f3800bd270800e003000000008c +:10609000d0ffbd272c00bfaf2800beaf21f0a0036a +:1060a0003000c4af3400c5af3400c28fffff4230b0 +:1060b0002000c2a72000c2273400c38fffff633037 +:1060c0003000c48f1000a4af1400a3af020003245b +:1060d0001800a3af01000424a100052421304000d2 +:1060e00002000724ff39400f0000000021e8c00330 +:1060f0002c00bf8f2800be8f3000bd270800e003b2 +:1061000000000000d0ffbd272c00bfaf2800beafad +:1061100021f0a0033400c5af2118c0003c00c7af78 +:106120004000c28f3000c4a33800c3a32000c2a720 +:106130003c00c28f1400c2af3400c28f2000c3974e +:10614000060043a42000c2977d004010000000001c +:106150003000c38300a0023c001903004002422427 +:10616000211062000000428c750040100000000009 +:106170003000c38300a0023c001903004002422407 +:106180002110620004004294ffff42306c00401076 +:10619000000000003000c38300a0023c001903008f +:1061a00040024224211062000a004290ff00433066 +:1061b0000100022462006214000000002000c29767 +:1061c0001000c2a73000c38300a0023c00190300e6 +:1061d000400242242110620004004294ffff42303a +:1061e0001000c39723106200ffff42301800c2a7bf +:1061f0001800c28708004018000000003000c38368 +:1062000000a0023c00190300400242242110620059 +:10621000040042941000c2a73000c38300a0023cd7 +:106220000019030040024224211062000000438c48 +:106230001000c2971400c48f212860002130400054 +:1062400001000724823c400f000000003c00401485 +:10625000000000003000c38300a0023c00190300ce +:1062600040024224211062000000438c3400c28f9f +:10627000000043ac1000c3873400c28f040043a465 +:106280003400c28f060043941000c29723106200ae +:10629000ffff43303400c28f060043a43000c483a4 +:1062a0003000c38300a0023c0019030040024224d6 +:1062b0002110620004004294ffff43301000c29797 +:1062c00023106200ffff433000a0023c00210400c5 +:1062d0004002422421108200040043a43000c38302 +:1062e00000a0023c00190300400242242110620079 +:1062f00004004294ffff42300700401400000000f9 +:106300003000c38300a0023c001903004002422475 +:1063100021106200000040ac7c81828f0800401098 +:10632000000000007c81828f3000c4833800c3935a +:10633000212860003400c68f09f8400000000000ea +:1063400021e8c0032c00bf8f2800be8f3000bd277e +:106350000800e00300000000e8febd271401bfaf05 +:106360001001beaf21f0a003211880002110a00071 +:106370002001c6af1801c3a31c01c2a71801c39313 +:106380004100022419006214000000002800c22706 +:106390002001c48f21284000040006242138000079 +:1063a000823c400f000000009e01401400000000ed +:1063b0002900c2832c00c2a37c81828f99014010e6 +:1063c000000000007c81828f2800c38321206000b0 +:1063d0002c00c327010005242130600009f840008b +:1063e00000000000891a400b000000001801c39350 +:1063f0004200022419006214000000003000c2278d +:106400002001c48f21284000040006242138000008 +:10641000823c400f00000000820140140000000098 +:106420003100c2833400c2a37c81828f7d01401081 +:10643000000000007c81828f3000c3832120600037 +:106440003400c327020005242130600009f8400011 +:1064500000000000891a400b000000001801c393df +:106460004300022448006214000000003800c227e4 +:106470002001c48f212840000c0006242138000090 +:10648000823c400f00000000660140140000000044 +:106490004100c28327004004000000004100c28385 +:1064a0002118400000a0023c0019030040024224d1 +:1064b000211062000b0040a04100c283211840005f +:1064c00000a0023c00190300400242242110620097 +:1064d000010003240a0043a0da808297ffff4230c4 +:1064e00001004224ffff4230da8082a7da808297df +:1064f000ffff42300600401400000000da8082975f +:10650000ffff423001004224ffff4230da8082a7c1 +:106510004100c28321204000da808297ffff433090 +:1065200000a0023c0021040040024224211082000d +:10653000060043a44100c2834400c2a30200022417 +:106540004800c2a73a00c2974a00c2a73c00c28fc7 +:106550004c00c2af7c81828f3201401000000000ed +:106560007c81828f4000c383212060004400c327c8 +:10657000040005242130600009f8400000000000fc +:10658000891a400b000000001801c3934400022444 +:1065900005006210000000001801c3934b000224a4 +:1065a00028006214000000005800c2272001c48f98 +:1065b000212840000400062421380000823c400fbe +:1065c0000000000001014014000000005800c283d8 +:1065d0005c00c2a35900c2835d00c2a35900c283fc +:1065e0000b004014000000005800c283212040002e +:1065f0005a00c297f8ff4224ffff433000a0023c3c +:10660000002104004002422421108200080043a41b +:106610007c81828ff0004010000000007c81828f1e +:106620005800c383212060005c00c32705000524b7 +:106630002130600009f8400000000000891a400b7a +:10664000000000001801c3934a00022417006214de +:1066500000000000a800c2272001c48f21284000ac +:106660006800062421380000823c400f0000000032 +:10667000ec004014000000000c01c28f0c01c2affe +:106680007481828fe7004010000000007481828fc7 +:10669000a800c4270c01c38f2128600009f840001e +:1066a00000000000891a400b000000001801c3938d +:1066b0004600022409006210000000001801c39384 +:1066c0004800022405006210000000001801c39376 +:1066d0004d0002246800621400000000060002243d +:1066e0001800c2a31801c3934800022403006214d7 +:1066f00000000000090002241800c2a310000224b8 +:106700001e00c2a76000c3271e00c2972001c48fcd +:10671000212860002130400021380000823c400fd9 +:1067200000000000af004014000000002000c0a7df +:106730006c00c2932200c2a36e00c2972000c2a7c1 +:106740002200c38300a0023c00190300400242243f +:10675000211062000c0040a06800c2972400c2a76c +:106760006a00c2972600c2a76200c2977a00c2a739 +:106770006400c28f7c00c2af2200c38300a0023c31 +:1067800000190300400242242110620006004294d6 +:10679000ffff42302000c3972a006214000000006f +:1067a0002400c28718004018000000002400c3879e +:1067b0001c01c2972a106200130040100000000064 +:1067c0002600c2972001c38f211062002001c2afb2 +:1067d0002400c2971e00c2a72200c4831800c293df +:1067e0001e00c5977000c3271000a5af21286000c8 +:1067f000213040002001c78f4118400f00000000e9 +:10680000891a400b000000002400c2977400c2a740 +:106810007000c0af7c81828f7500401000000000c6 +:106820007c81828f2200c4831800c5937000c32727 +:106830002130600009f8400000000000891a400b78 +:10684000000000001e00c3971c01c2972b106200bd +:106850006a004010000000002120000021280000f4 +:106860002130000001000724823c400f000000009e +:10687000891a400b000000001801c3934500022450 +:1068800009006210000000001801c39347000224b1 +:1068900005006210000000001801c3934c000224a0 +:1068a0002f00621400000000070002241900c2a398 +:1068b0001801c39347000224030062140000000083 +:1068c000080002241900c2a38c00c2272001c48f33 +:1068d000212840000800062421380000823c400f97 +:1068e0000000000048004014000000001a00c0a78b +:1068f0008c00c2931c00c2a39000c2971a00c2a7ca +:106900008e00c2878800c2a71c00c38300a0023c7f +:106910000019030040024224211062000600429444 +:10692000ffff42301a00c3973a00621400000000d3 +:106930007c81828f3a004010000000007c81828fb1 +:106940001c00c4831900c5938800c3272130600050 +:1069500009f8400000000000891a400b0000000008 +:106960001801c393520002242e006214000000009c +:106970009400c2272001c48f21284000140006245f +:1069800001000724823c400f000000002500401455 +:10699000000000009800c28f848182af8481828fc2 +:1069a00020004010000000008481828f9400c48f7a +:1069b0009c00c58fa400c3932130600009f84000fb +:1069c00000000000891a400b0000000000000000d9 +:1069d000891a400b0000000000000000891a400bdb +:1069e0000000000000000000891a400b00000000b9 +:1069f00000000000891a400b0000000000000000a9 +:106a0000891a400b0000000000000000891a400baa +:106a10000000000000000000891a400b0000000088 +:106a20000000000021e8c0031401bf8f1001be8fd9 +:106a30001801bd270800e00300000000e8ffbd27a3 +:106a40001400bfaf1000beaf21f0a003dc80829322 +:106a5000ff004230100040140000000000a0023c83 +:106a6000400242242120400021280000b0000624da +:106a7000f27a400f0000000002000424009d023c56 +:106a800058634524193d400f000000000100022416 +:106a9000dc8082a3da8080a721e8c0031400bf8fc6 +:106aa0001000be8f1800bd270800e00300000000a2 +:106ab000e8ffbd271400bfaf1000beaf21f0a00358 +:106ac00000a0023c40024224212040002128000076 +:106ad000b0000624f27a400f0000000002000424f7 +:106ae00021280000193d400f000000007c8180af8c +:106af000748180afdc8080a321e8c0031400bf8fc5 +:106b00001000be8f1800bd270800e0030000000041 +:106b1000f8ffbd270400beaf21f0a0030800c4affa +:106b20000c00c5af0800c28f7c8182af0c00c28f01 +:106b3000748182af21e8c0030400be8f0800bd2726 +:106b40000800e00300000000c0ffbd273c00bfaf0d +:106b50003800beaf21f0a0032118a0002110c00012 +:106b60004000c4a74400c3a34800c2a3ffff0224ff +:106b70002000c2a34000c397020002248d006214cb +:106b8000000000004400c3930100022429006214a5 +:106b9000000000002100c0a3071b400b0000000004 +:106ba000dd8082932800c2a3dd808293ff00423003 +:106bb0000019020000a0023c4002422421106200a1 +:106bc0002400c2afdd808293ff00423001004324e5 +:106bd000070002241a006200f401400010100000b7 +:106be000ff004230dd8082a32400c28f0a00429061 +:106bf000ff00423006004014000000002800c2934d +:106c00002000c2a3000000003b1b400b000000005e +:106c10002100c293010042242100c2a32100c2939b +:106c20000700422cdeff4014000000003b1b400b1d +:106c3000000000004400c393020002242b006214f1 +:106c40000000000000a0023cb00242242c00c2afb1 +:106c50002100c0a3371b400b00000000de808293a0 +:106c60002800c2a3de808293ff00423000110200a0 +:106c70002c00c38f211062002400c2afde808293fb +:106c8000ff00423001004324c317030082170200b3 +:106c9000211862000300633023106200ff004230bd +:106ca000de8082a32400c28f0a004290ff0042309f +:106cb00007004014000000002800c293070042248f +:106cc000ff0042302000c2a33b1b400b000000002d +:106cd0002100c293010042242100c2a32100c293db +:106ce0000400422cddff4014000000002000c2839d +:106cf00030004004000000002400c28f212040002a +:106d00002128000010000624f27a400f0000000045 +:106d10002400c28f010003240a0043a0da80829776 +:106d2000ffff423001004224ffff4230da8082a799 +:106d3000da808297ffff4230060040140000000016 +:106d4000da808297ffff423001004224ffff423089 +:106d5000da8082a7da808297ffff43302400c28f57 +:106d6000060043a44800c29301004230ff004230b5 +:106d700010004010000000002000c2933000c2a3a9 +:106d80002400c28f010003240b0043a03000c2275f +:106d90001000a0af1400a0af1800a0af02000424a0 +:106da000500005242130400004000724ff39400f23 +:106db000000000002000c28321e8c0033c00bf8f18 +:106dc0003800be8f4000bd270800e003000000002f +:106dd000c8ffbd273400bfaf3000beaf21f0a00315 +:106de000211880003c00c5af2110c0003800c3a3ab +:106df0004000c2a3faff02242000c2a33c00c28fbd +:106e000038004010000000003800c2833500400404 +:106e1000000000003800c38300a0023c00190300fa +:106e200040024224211062000a004290ff004330d9 +:106e3000010002242b006214000000004000c293f5 +:106e400028004010000000003800c2932c00c2a3ac +:106e50002400c3273c00c28f21206000212840006d +:106e600008000624b57a400f000000002400c297f5 +:106e70002400c2a72600c2972600c2a72800c28ffe +:106e80002800c2af3800c38300a0023c00190300f1 +:106e9000400242242110620006004294ffff42306b +:106ea0002e00c2a72400c2271000a0af1400a0af7c +:106eb0001800a0af02000424410005242130400046 +:106ec0000c000724ff39400f000000002000c2a37f +:106ed0002000c2830300401000000000f7ff0224de +:106ee0002000c2a32000c28321e8c0033400bf8f6a +:106ef0003000be8f3800bd270800e003000000000e +:106f0000d0ffbd272c00bfaf2800beaf21f0a003eb +:106f1000211880002110a0003000c3a33400c2a3b8 +:106f2000faff02242000c2a33000c28327004004dd +:106f3000000000003000c38300a0023c00190300e1 +:106f400040024224211062000a004290ff004330b8 +:106f5000010002241d006214000000003000c293f2 +:106f60002400c2a33400c2932500c2a33000c3830f +:106f700000a0023c001903004002422421106200dc +:106f800006004294ffff42302600c2a72400c22719 +:106f90001000a0af1400a0af1800a0af020004249e +:106fa000420005242130400004000724ff39400f2f +:106fb000000000002000c2a32000c2830300401094 +:106fc00000000000f7ff02242000c2a32000c283bb +:106fd00021e8c0032c00bf8f2800be8f3000bd27e2 +:106fe0000800e00300000000f0ffbd270c00beaf6a +:106ff00021f0a003211080001400c5af1800c6af17 +:107000001000c2a3faff02240000c2a31000c28332 +:107010000c004004000000001000c38300a0023cec +:107020000019030040024224211062000a0042902d +:10703000ff0043300100022402006214000000003f +:107040000000c0a30000c28321e8c0030c00be8f73 +:107050001000bd270800e00300000000c8ffbd27a6 +:107060003400bfaf3000beaf21f0a0032118800074 +:107070003c00c5af2110c0003800c3a34000c2a32c +:10708000faff02242000c2a33800c2834a00400451 +:10709000000000003c00c28f4700401000000000cc +:1070a0003800c38300a0023c0019030040024224c0 +:1070b000211062000a004290ff00433001000224c8 +:1070c0003d006214000000004000c2933a004010ee +:1070d00000000000440002242100c2a33800c38342 +:1070e00000a0023c0019030040024224211062006b +:1070f0000b004290ff00423001004230ff0042305e +:107100000b004010000000004b0002242100c2a32d +:107110003800c38300a0023c00190300400242244f +:10712000211062000b004290ff0042302d00c2a3ec +:107130003800c2932c00c2a32400c3273c00c28f96 +:10714000212060002128400008000624b57a400f65 +:10715000000000003800c38300a0023c00190300b7 +:10716000400242242110620006004294ffff423098 +:107170002e00c2a72100c3932400c2271000a0af95 +:107180001400a0af1800a0af020004242128600062 +:10719000213040000c000724ff39400f00000000a0 +:1071a0002000c2a32000c2830300401000000000a2 +:1071b000f7ff02242000c2a32000c28321e8c003fd +:1071c0003400bf8f3000be8f3800bd270800e003b9 +:1071d00000000000c0ffbd273c00bfaf3800beafbd +:1071e00021f0a0034400c5af2118c0002110e00029 +:1071f0004000c4a34800c3a74c00c2a7faff022462 +:107200002000c2a74000c2835400400400000000d8 +:107210004400c28f51004010000000004800c29797 +:107220007905422c4d004010000000004000c3834f +:1072300000a0023c00190300400242242110620019 +:107240000a004290ff004330010002244300621410 +:1072500000000000450002242400c2a350000224c4 +:107260002200c2a74000c2932800c2a34800c297d0 +:107270002a00c2a74000c38300a0023c00190300fb +:10728000400242242110620006004294ffff423077 +:107290003400c2a74000c283070042280300401404 +:1072a00000000000440002242200c2a74000c38363 +:1072b00000a0023c00190300400242242110620099 +:1072c0000b004290ff00423001004230ff0042308c +:1072d0000a004010000000004c0002242400c2a359 +:1072e0004000c38300a0023c001903004002422476 +:1072f00021106200080042942200c2a72400c39318 +:1073000080ff022425106200ff0042302118400057 +:107310002800c2274400c68f4800c5972200c497a2 +:107320001000a6af1400a5af1800a4af02000424fb +:10733000212860002130400010000724ff39400f51 +:10734000000000002000c2a72000c28703004010f8 +:1073500000000000f2ff02242000c2a72000c28724 +:1073600021e8c0033c00bf8f3800be8f4000bd271e +:107370000800e00300000000b8ffbd274400bfafd5 +:107380004000beaf21f0a003214080004c00c5affb +:107390002120c0002118e0005c00c28f4800c8a373 +:1073a0005000c4a75400c3a73800c2a3faff0224a8 +:1073b0002000c2a74800c2834e0040040000000025 +:1073c0004c00c28f4b004010000000005000c297dc +:1073d0007905422c47004010000000004800c3839c +:1073e00000a0023c00190300400242242110620068 +:1073f0000a004290ff004330010002243d00621465 +:10740000000000004800c38300a0023c00190300f4 +:1074100040024224211062000a004290ff004230e4 +:1074200034004010000000002800c2272120400046 +:107430002128000010000624f27a400f000000000e +:107440004800c2932800c2a35000c2972a00c2a7d6 +:107450004800c38300a0023c0019030040024224fc +:107460002110620006004294ffff42303400c2a7a0 +:107470005800c28f0c004010000000005800c28f5e +:107480002400c2af2400c28f000042942c00c2a787 +:107490002400c28f020042942e00c2a72400c28f93 +:1074a0000400428c3000c2af2800c2274c00c48fb9 +:1074b0005000c3971000a4af1400a3af44000324ee +:1074c0001800a3af02000424c700052421304000a7 +:1074d00010000724ff39400f000000002000c2a761 +:1074e0002000c2870300401000000000f2ff0224c9 +:1074f0002000c2a72000c28721e8c0034400bf8f3c +:107500004000be8f4800bd270800e00300000000d7 +:10751000c8ffbd273400bfaf3000beaf21f0a003cd +:10752000211880003c00c5af2110c0004400c7af47 +:107530003800c3a34000c2a7faff02242000c2a75c +:107540003800c28365004004000000003c00c28f88 +:1075500062004010000000004000c2975f00401031 +:10756000000000003800c38300a0023c00190300a3 +:1075700040024224211062000a004290ff00433082 +:107580000100022455006214000000002000c0a782 +:107590003800c4833c00c38f00a0023c00210400db +:1075a0004002422421108200000043ac3800c38313 +:1075b00000a0023c00190300400242242110620096 +:1075c0004000c397040043a43800c38300a0023cda +:1075d0000019030040024224211062000c00429076 +:1075e000ff0042303d00401400000000460002242d +:1075f0002200c2a33800c38300a0023c001903008c +:107600004002422421106200010003240c0043a028 +:107610003800c38300a0023c00190300400242244a +:10762000211062000b004290ff0042300100423006 +:10763000ff00423003004010000000004d00022413 +:107640002200c2a34400c28f0500401400000000c5 +:10765000ffff02242400c2af9a1d400b000000006f +:107660004400c28f2400c2af3800c2932800c2a3d6 +:107670003800c38300a0023c0019030040024224ea +:107680002110620006004294ffff42302a00c2a788 +:107690004000c2972c00c2a72200c3932400c22737 +:1076a0001000a0af1400a0af1800a0af0200042487 +:1076b00021286000213040000c000724ff39400fd2 +:1076c000000000002000c2a72000c2870300401075 +:1076d00000000000f2ff02242000c2a72000c287a1 +:1076e00021e8c0033400bf8f3000be8f3800bd27b3 +:1076f0000800e00300000000d0ffbd272c00bfaf52 +:107700002800beaf21f0a003211080003000c2a3ea +:10771000faff02242000c2a33000c2833f004004cd +:10772000000000003000c38300a0023c00190300e9 +:1077300040024224211062000a004290ff004330c0 +:1077400001000224350062140000000049000224f8 +:107750002100c2a33000c2932400c2a33000c3831f +:1077600000a0023c001903004002422421106200e4 +:1077700006004294ffff42302600c2a73000c383b8 +:1077800000a0023c001903004002422421106200c4 +:107790000b004290ff00423001004230ff004230b7 +:1077a00003004010000000004e0002242100c2a38c +:1077b0002100c3932400c2271000a0af1400a0af83 +:1077c0001800a0af020004242128600021304000ee +:1077d00004000724ff39400f000000002000c2a36e +:1077e0002000c2830300401000000000f7ff0224c5 +:1077f0002000c2a300a0023c400243243000c28308 +:107800000011020021106200212040002128000008 +:1078100010000624f27a400f000000002000c2830e +:1078200021e8c0032c00bf8f2800be8f3000bd2789 +:107830000800e00300000000c8ffbd273400bfaf10 +:107840003000beaf21f0a003211880003c00c5af7e +:107850002110c0004400c7af3800c3a34000c2a736 +:107860002000c0a73800c283600040040000000070 +:107870003c00c28f5d004010000000004000c29735 +:107880005a004010000000003800c38300a0023cf2 +:107890000019030040024224211062000a004290b5 +:1078a000ff00433001000224500062140000000079 +:1078b0003800c38300a0023c0019030040024224a8 +:1078c000211062000a004290ff0042304f00401039 +:1078d000000000002000c0a73800c4833c00c38f14 +:1078e00000a0023c0021040040024224211082003a +:1078f000000043ac3800c38300a0023c0019030021 +:1079000040024224211062004000c397040043a4b7 +:107910003800c38300a0023c001903004002422447 +:10792000211062000c004290ff00423033004014ee +:10793000000000003800c38300a0023c00190300cf +:107940004002422421106200010003240c0043a0e5 +:107950004400c28f0500401400000000ffff022415 +:107960002400c2af5d1e400b000000004400c28f27 +:107970002400c2af3800c2932800c2a33800c383da +:1079800000a0023c001903004002422421106200c2 +:1079900006004294ffff42302a00c2a74000c2976f +:1079a0002c00c2a72400c2271000a0af1400a0af73 +:1079b0001800a0af02000424480005242130400034 +:1079c0000c000724ff39400f000000002000c2a770 +:1079d0002000c2870c00401000000000f2ff0224cb +:1079e0002000c2a7831e400b00000000faff022403 +:1079f0002000c2a7831e400b000000000000000012 +:107a0000831e400b00000000000000002000c28721 +:107a100021e8c0033400bf8f3000be8f3800bd277f +:107a20000800e00300000000d8ffbd272400bfaf1e +:107a30002000beaf21f0a0032800c4af1400c0afe7 +:107a40001000c0a31100c0a3d51e400b0000000011 +:107a50001200c0a32800c28f000042801300c2a3fe +:107a60001200c293010042241200c2a31200c2936a +:107a70000500422c0400401400000000211000000a +:107a8000e11e400b000000001300c3932e000224ef +:107a900004006210000000001300c29309004014ab +:107aa000000000001100c2931000c32721106200e3 +:107ab0001000c393080043a01000c0a3c81e400bd1 +:107ac000000000001300c2933000422c110040144b +:107ad000000000001300c2933a00422c0d00401039 +:107ae000000000001000c293401002008018020045 +:107af00021104300ff0043301300c29321106200a5 +:107b0000ff004230d0ff42241000c2a3c81e400b29 +:107b10000000000021100000e11e400b00000000ea +:107b20002800c28f010042242800c2af1300c39373 +:107b30002e00022404006210000000001300c29313 +:107b4000c4ff4014000000001100c2930100422451 +:107b50001100c2a31100c2930400422cbcff4014c8 +:107b6000000000001400c3271800c2272120600075 +:107b70002128400004000624b57a400f00000000d0 +:107b80001400c28f21e8c0032400bf8f2000be8fe5 +:107b90002800bd270800e00300000000d0ffbd273b +:107ba0002c00bfaf2800beaf21f0a0033000c4af4f +:107bb000faff02242000c2a33000c48f107b400fc4 +:107bc000000000002100c2a32100c2936500422ce6 +:107bd00014004010000000002100c293ffff42305b +:107be00001004224ffff42301000a0af1400a0affc +:107bf0001800a0af02000424ca0005243000c68f7c +:107c000021384000ff39400f000000002000c2a3cf +:107c10002000c2830300401000000000f7ff022490 +:107c20002000c2a32000c28321e8c0032c00bf8f24 +:107c30002800be8f3000bd270800e00300000000d0 +:107c400058ffbd27a400bfafa000beaf21f0a00326 +:107c50002118a000b000c6af2110e000a800c4a306 +:107c6000ac00c3a3b400c2a7faff02242000c2a341 +:107c7000a800c28307004228cf0040100000000087 +:107c8000a800c38300a0023c001903004002422464 +:107c9000211062000b004290ff0042300100423090 +:107ca000ff004230c400401000000000ac00c3934d +:107cb000010002242b00621400000000b000c28ffb +:107cc0000000428c2400c2af2400c28f120040107a +:107cd00000000000a800c483a800c38300a0023ce9 +:107ce0000019030040024224211062000b00429060 +:107cf000ff00423002004234ff00433000a0023c4b +:107d00000021040040024224211082000b0043a005 +:107d1000561f400b00000000a800c483a800c383c6 +:107d200000a0023c0019030040024224211062001e +:107d30000b004290ff004330fdff0224241062003c +:107d4000ff00433000a0023c002104004002422416 +:107d5000211082000b0043a02000c0a3ee1f400ba7 +:107d600000000000ac00c393030002242b00621447 +:107d700000000000b000c28f0000428c2800c2af9b +:107d80002800c28f1200401000000000a800c48329 +:107d9000a800c38300a0023c001903004002422453 +:107da000211062000b004290ff004230100042346c +:107db000ff00433000a0023c0021040040024224a6 +:107dc000211082000b0043a0841f400b0000000024 +:107dd000a800c483a800c38300a0023c00190300cc +:107de00040024224211062000b004290ff00433009 +:107df000efff022424106200ff00433000a0023c89 +:107e00000021040040024224211082000b0043a004 +:107e10002000c0a3ee1f400b00000000ac00c39385 +:107e2000040002242b00621400000000b000c28f86 +:107e30000000428c2c00c2af2c00c28f12004010f8 +:107e400000000000a800c483a800c38300a0023c77 +:107e50000019030040024224211062000b004290ee +:107e6000ff00423040004234ff00433000a0023c9b +:107e70000021040040024224211082000b0043a094 +:107e8000b21f400b00000000a800c483a800c383f9 +:107e900000a0023c001903004002422421106200ad +:107ea0000b004290ff004330bfff02242410620009 +:107eb000ff00433000a0023c0021040040024224a5 +:107ec000211082000b0043a02000c0a3ee1f400b36 +:107ed00000000000ac00c3930200022436006214cc +:107ee00000000000b400c2976400422c3200401031 +:107ef00000000000b000c28f3000c2afa800c293e3 +:107f00003400c2a3a800c38300a0023c00190300f0 +:107f1000400242242110620006004294ffff4230da +:107f20003600c2a7ac00c2933500c2a3b400c2970a +:107f30003800c2af3400c22708004224212040008c +:107f40003000c58f64000624b57a400f00000000a1 +:107f50003400c2271000a0af1400a0af1800a0afdb +:107f60000200042451000524213040006c00072445 +:107f7000ff39400f0000000021184000fdff0224df +:107f80000c006214000000003400c2271000a0aff3 +:107f90001400a0af1800a0af02000424d1000524f3 +:107fa000213040006c000724ff39400f0000000022 +:107fb0002000c2a32000c0a32000c28321e8c00388 +:107fc000a400bf8fa000be8fa800bd270800e0035b +:107fd00000000000c0ffbd273c00bfaf3800beafaf +:107fe00021f0a003214080002120a0002118c00022 +:107ff0004c00c7af5000c28f4000c8a34400c4a3c8 +:108000004800c3a33000c2a7faff02242000c2a385 +:108010004000c2834b004004000000004c00c28faf +:1080200048004010000000004000c38300a0023c54 +:108030000019030040024224211062000a0042900d +:10804000ff004330010002243e00621400000000e3 +:108050004400c393020002241400621400000000d4 +:108060004800c393020002240500621000000000d3 +:108070003000c397040002243200621400000000a4 +:108080004000c4834800c3933000c2972128600099 +:108090004c00c68f21384000101f400f0000000028 +:1080a0002000c2a35120400b000000003000c39705 +:1080b0000400022423006214000000004f00022488 +:1080c0002100c2a34800c2932900c2a34000c2936a +:1080d0002800c2a34c00c28f0000428c2400c2af13 +:1080e0004000c38300a0023c001903004002422468 +:1080f0002110620006004294ffff42302a00c2a70e +:108100002100c3932400c2271000a0af1400a0af29 +:108110001800a0af02000424212860002130400094 +:1081200008000724ff39400f000000002000c2a310 +:108130002000c2830300401000000000f7ff02246b +:108140002000c2a32000c28321e8c0033c00bf8fef +:108150003800be8f4000bd270800e003000000008b +:10816000f8ffbd270400beaf21f0a0032118a00036 +:108170002110c0001400c7af0800c4a30c00c3a3a3 +:108180001000c2a3faff022421e8c0030400be8f3e +:108190000800bd270800e00300000000c8ffbd275d +:1081a0003400bfaf3000beaf21f0a0033800c4af31 +:1081b0002110a0004000c6af3c00c2a3f1ff022482 +:1081c0002000c2a33800c28f17004010000000003a +:1081d0004000c28f14004010000000000100022483 +:1081e0002c00c2a73800c28f2400c2af4000c28f4b +:1081f0002800c2af3c00c2932e00c2a32400c227b5 +:108200001000a0af1400a0af1800a0af020004241b +:1082100052000524213040000c000724ff39400f94 +:10822000000000002000c2a32000c28321e8c00398 +:108230003400bf8f3000be8f3800bd270800e00338 +:1082400000000000e0ffbd271c00bfaf1800beaf5c +:1082500021f0a003e64a400f0000000000a0023c0d +:108260002409442421280000200606245b8c400faa +:10827000000000001000c0af1e21400b00000000f5 +:1082800000a0043c1000c28f2118400040110300e0 +:1082900021184000c010030023104300c018020042 +:1082a000231862002409822421106200080040acd7 +:1082b0001000c28f21184000401103002118400017 +:1082c000c010030023104300c018020023186200ee +:1082d0000800632400a0023c24094224211062000b +:1082e0000400442400a0033c1000c28f240965242c +:1082f000211840004011030021184000c010030065 +:1083000023104300c0180200231062002110a200b5 +:108310000c0444ac1000c28f21184000401103002f +:1083200021184000c010030023104300c0180200b1 +:10833000231862000800632400a0023c24094224a0 +:10834000211062000400442400a0053c1000c28fec +:10835000211840004011030021184000c010030004 +:1083600023104300c0180200231862002409a2242d +:1083700021106200100444ac1000c28f211840008c +:108380004011030021184000c010030023104300d7 +:10839000c0180200231862001004632400a0023ced +:1083a00024094224211062000400442400a0053c5a +:1083b0001000c28f21184000401103002118400016 +:1083c000c010030023104300c018020023186200ed +:1083d0002409a22421106200180644ac00a0043c29 +:1083e0001000c28f211840004011030021184000e6 +:1083f000c010030023104300c018020023186200bd +:1084000024098224211062001806448c00a0033c39 +:108410001000c28f24096524211840004011030078 +:1084200021184000c010030023104300c0180200b0 +:10843000231062002110a200140644ac00a0033ceb +:108440001000c28f24096424211840004011030049 +:1084500021184000c010030023104300c018020080 +:1084600023106200211082001c0640ac1000c28f55 +:10847000010042241000c2af1000c28f80ff4018dc +:108480000000000000a0023c01000324240943acca +:1084900000a0023c2409422401000324040043ac50 +:1084a00000a0023c403d442421280000f28f400ff0 +:1084b0000000000000a0023c403d4424fe8c400f20 +:1084c000000000002120000080250524213000004c +:1084d00021380000ea21400f0000000021e8c0031d +:1084e0001c00bf8f1800be8f2000bd270800e003ce +:1084f00000000000e8ffbd271400bfaf1000beafb2 +:1085000021f0a0031800c4af1800c28f0200422857 +:10851000040040140000000021100000e421400b82 +:108520000000000000a0043c1800c28f2118400089 +:108530004011030021184000c01003002310430025 +:10854000c01802002318620024098224211062004e +:10855000080040ac1800c28f2118400040110300f1 +:1085600021184000c010030023104300c01802006f +:10857000231862000800632400a0023c240942245e +:10858000211062000400442400a0033c1800c28fa4 +:1085900024096524211840004011030021184000df +:1085a000c010030023104300c01802002310620013 +:1085b0002110a2000c0444ac1800c28f2118400006 +:1085c0004011030021184000c01003002310430095 +:1085d000c0180200231862000800632400a0023cb7 +:1085e00024094224211062000400442400a0053c18 +:1085f0001800c28f211840004011030021184000cc +:10860000c010030023104300c018020023186200aa +:108610002409a22421106200100444ac1800c28f67 +:10862000211840004011030021184000c010030031 +:1086300023104300c01802002318620010046324b2 +:1086400000a0023c240942242110620004004424ba +:1086500000a0053c1800c28f211840004011030003 +:1086600021184000c010030023104300c01802006e +:10867000231862002409a22421106200180644acc9 +:1086800000a0043c1800c28f2118400040110300d4 +:1086900021184000c010030023104300c01802003e +:1086a0002318620024098224211062001806448cd9 +:1086b00000a0033c1800c28f240965242118400043 +:1086c0004011030021184000c01003002310430094 +:1086d000c0180200231062002110a200140644ac4e +:1086e00000a0033c1800c28f240964242118400014 +:1086f0004011030021184000c01003002310430064 +:10870000c018020023106200211082001c0640ac39 +:1087100000a0023c2409438c010002241b006214c7 +:108720000000000000a0033c1800c28f240964244c +:10873000211840004011030021184000c010030020 +:1087400023104300c0180200231062002110820091 +:108750000400428c060040100000000001000324c9 +:108760000700431000000000e321400b0000000060 +:108770002e4e400f00000000e321400b00000000df +:10878000704e400f000000000000000001000224b5 +:1087900021e8c0031400bf8f1000be8f1800bd2752 +:1087a0000800e00300000000c8ffbd273400bfaf91 +:1087b0003000beaf21f0a0033800c4af3c00c5af0d +:1087c0004000c6af4400c7af3800c28f0400401c51 +:1087d000000000003800c28f0400410400000000c7 +:1087e000050002246022400b0000000000a0043cb1 +:1087f0003800c28f211840004011030021184000aa +:10880000c010030023104300c018020023186200a8 +:1088100024098224211062000000438c01000224fc +:1088200056006214000000004000c28f0f00400498 +:108830000000000002004328060060140000000051 +:108840000200032406004310000000001b22400b1e +:10885000000000002000c0af1b22400b0000000001 +:10886000010002242000c2af000000004400c28fbb +:10887000010003240900431000000000020003244b +:108880000a004310000000000b004014000000002c +:108890002400c0af2e22400b000000000100022483 +:1088a0002400c2af2e22400b000000000200022470 +:1088b0002400c2af0000000000a0033c3800c28fbb +:1088c00024096424211840004011030021184000ad +:1088d000c010030023104300c018020023106200e0 +:1088e000211082000400448c3800c28f21184000ff +:1088f0004011030021184000c01003002310430062 +:10890000c0180200231862000800632400a0023c83 +:108910002409422421106200040046243800c28f3a +:10892000211840004011030021184000c01003002e +:1089300023104300c01802002318620007046324b8 +:1089400000a0023c240942242110620004004224b9 +:108950003c00c38f1000a3af2000c38f1400a3af4f +:108960002400c38f1800a3af3800c58f2138400002 +:108970005c4b400f000000002800c2af2800c28fef +:1089800021e8c0033400bf8f3000be8f3800bd2700 +:108990000800e00300000000e0ffbd271c00bfaf9f +:1089a0001800beaf21f0a0032000c4af2400c5af63 +:1089b0002800c6af2000c28f2118400040110300dc +:1089c00021184000c010030023104300c01802000b +:1089d0002318620000a0023c2409422421106200f6 +:1089e0001400c2af2000c28f070041040000000045 +:1089f0002000c28f04004018000000002110000079 +:108a0000b322400b000000001000c0af9e22400bbc +:108a1000000000001400c28f1406428c2400c38f93 +:108a200000006380000043a0010043241400c28fb3 +:108a3000140643ac2400c28f010042242400c2afbc +:108a40001400c28f1406438c1400c28f13064224f4 +:108a50002b10430005004010000000001400c28fde +:108a6000140443241400c28f140643ac1000c28fb8 +:108a7000010042241000c2af1000c38f2800c28f33 +:108a80002a106200e3ff4014000000001400c28faf +:108a90001c06438c2800c28f211862001400c28f6c +:108aa0001c0643ac1400c28f1c06428c00024228f4 +:108ab0000500401400000000029d023c983f442441 +:108ac000578f400f000000000100022421e8c0037e +:108ad0001c00bf8f1800be8f2000bd270800e003d8 +:108ae00000000000f0ffbd270c00beaf21f0a00386 +:108af0001000c4af1000c28f2118400040110300c5 +:108b000021184000c010030023104300c0180200c9 +:108b10002318620000a0023c2409422421106200b4 +:108b20000000c2af0000c28f1406438c0000c28f49 +:108b30001806428c0400621400000000211000009e +:108b4000f222400b000000000000c28f1806438c88 +:108b50000000c28f1406428c2b10620009004010e6 +:108b6000000000000000c28f1406428c2118400053 +:108b70000000c28f1806428c23106200f222400bc4 +:108b8000000000000000c28f13064224211840009c +:108b90000000c28f1806428c231062000400c2af8e +:108ba0000000c28f1406428c211840000000c28fc2 +:108bb00014044224231062000400c38f21106200b9 +:108bc0000400c2af0400c28f21e8c0030c00be8fb6 +:108bd0001000bd270800e00300000000f0ffbd27e3 +:108be0000c00beaf21f0a0031000c4af1400c5af4d +:108bf0001800c6af0400c0af00a0043c1000c28f34 +:108c0000211840004011030021184000c01003004b +:108c100023104300c0180200231862002409822494 +:108c2000211062001004448c00a0033c1000c28f8d +:108c30002409652421184000401103002118400038 +:108c4000c010030023104300c0180200231062006c +:108c50002110a2000c04428c2b1082007d004010d9 +:108c60000000000000a0043c1000c28f211840004a +:108c70004011030021184000c010030023104300de +:108c8000c018020023186200240982242110620007 +:108c90001004428c212040001000c28f2118400097 +:108ca0004011030021184000c010030023104300ae +:108cb000c0180200231862000800632400a0023cd0 +:108cc000240942242110620004004224232082004f +:108cd0001000c28f211840004011030021184000ed +:108ce000c010030023104300c018020023186200c4 +:108cf0000704632400a0023c2409422421106200de +:108d0000040042242128400000a0033c1000c28f30 +:108d10002409662421184000401103002118400056 +:108d2000c010030023104300c0180200231062008b +:108d30002110c2000c04428c2310a20021188200d2 +:108d40001800c28f2a1062000101401000000000cc +:108d500000a0043c1000c28f211840004011030005 +:108d600021184000c010030023104300c018020067 +:108d7000231862002409822421106200080040acfc +:108d80001000c28f2118400040110300211840003c +:108d9000c010030023104300c01802002318620013 +:108da0000800632400a0023c240942242110620030 +:108db0000400442400a0033c1000c28f2409652451 +:108dc000211840004011030021184000c01003008a +:108dd00023104300c0180200231062002110a200db +:108de0000c0444ac1000c28f211840004011030055 +:108df00021184000c010030023104300c0180200d7 +:108e0000231862000800632400a0023c24094224c5 +:108e1000211062000400442400a0053c1000c28f11 +:108e2000211840004011030021184000c010030029 +:108e300023104300c0180200231862002409a22452 +:108e400021106200100444ac04000224c324400b2f +:108e50000000000000a0033c1000c28f240964241d +:108e6000211840004011030021184000c0100300e9 +:108e700023104300c018020023106200211082005a +:108e80000c04448c00a0053c1000c28f2118400047 +:108e90004011030021184000c010030023104300bc +:108ea000c0180200231862002409a22421106200c5 +:108eb0001004428c2b108200600040100000000063 +:108ec00000a0043c1000c28f211840004011030094 +:108ed00021184000c010030023104300c0180200f6 +:108ee0002318620024098224211062001004428c9d +:108ef0002120400000a0033c1000c28f24096524fb +:108f0000211840004011030021184000c010030048 +:108f100023104300c0180200231062002110a20099 +:108f20000c04428c231882001800c28f2a106200a1 +:108f3000870040100000000000a0043c1000c28f19 +:108f4000211840004011030021184000c010030008 +:108f500023104300c0180200231862002409822451 +:108f600021106200080040ac1000c28f21184000a0 +:108f70004011030021184000c010030023104300db +:108f8000c0180200231862000800632400a0023cfd +:108f900024094224211062000400442400a0033c60 +:108fa0001000c28f240965242118400040110300dd +:108fb00021184000c010030023104300c018020015 +:108fc000231062002110a2000c0444ac1000c28fd8 +:108fd000211840004011030021184000c010030078 +:108fe00023104300c0180200231862000800632405 +:108ff00000a0023c24094224211062000400442401 +:1090000000a0053c1000c28f211840004011030051 +:1090100021184000c010030023104300c0180200b4 +:10902000231862002409a22421106200100444ac19 +:1090300004000224c324400b000000001800c28f6b +:1090400000044228420040140000000000a0043c3c +:109050001000c28f21184000401103002118400069 +:10906000c010030023104300c01802002318620040 +:109070002409822421106200080040ac1000c28f35 +:10908000211840004011030021184000c0100300c7 +:1090900023104300c0180200231862000800632454 +:1090a00000a0023c24094224211062000400442450 +:1090b00000a0033c1000c28f240965242118400041 +:1090c0004011030021184000c0100300231043008a +:1090d000c0180200231062002110a2000c0444ac4e +:1090e0001000c28f211840004011030021184000d9 +:1090f000c010030023104300c018020023186200b0 +:109100000800632400a0023c2409422421106200cc +:109110000400442400a0053c1000c28f2118400028 +:109120004011030021184000c01003002310430029 +:10913000c0180200231862002409a2242110620032 +:10914000100444ac04000224c324400b00000000bf +:109150000000c0afb024400b000000001000c28f20 +:10916000211840004011030021184000c0100300e6 +:1091700023104300c018020023186200080463246f +:1091800000a0023c2409422421106200040044246f +:1091900000a0033c1000c28f240965242118400060 +:1091a0004011030021184000c010030023104300a9 +:1091b000c0180200231062002110a2000c04428c8f +:1091c0001400c38f00006380000043a0010042240c +:1091d000000082ac1400c28f010042241400c2af10 +:1091e00000a0033c1000c28f240964242118400011 +:1091f0004011030021184000c01003002310430059 +:10920000c018020023106200211082000c04448c5c +:109210001000c28f211840004011030021184000a7 +:10922000c010030023104300c0180200231862007e +:109230000704632400a0023c240942242110620098 +:10924000040042242b1044001a00401000000000cb +:109250001000c28f21184000401103002118400067 +:10926000c010030023104300c0180200231862003e +:109270000800632400a0023c24094224211062005b +:109280000400442400a0033c1000c28f240965247c +:10929000211840004011030021184000c0100300b5 +:1092a00023104300c0180200231062002110a20006 +:1092b0000c0444ac0000c28f010042240000c2af85 +:1092c0000000c38f1800c28f2a106200a3ff401451 +:1092d0000000000000a0043c1000c28f21184000d4 +:1092e0004011030021184000c01003002310430068 +:1092f000c018020023186200240982242110620091 +:1093000001000324080043ac0400c28f21e8c0031d +:109310000c00be8f1000bd270800e0030000000015 +:10932000f8ffbd270400beaf21f0a0030800c4afc2 +:109330000c00c5af00a0043c0800c28f21184000fb +:109340004011030021184000c01003002310430007 +:10935000c018020023186200240982242110620030 +:109360001004438c0c00c28f212062000800c28fc1 +:10937000211840004011030021184000c0100300d4 +:1093800023104300c0180200231862000800632461 +:1093900000a0023c2409422421106200040042245f +:1093a000000442242b1082001d0040100000000029 +:1093b00000a0043c0800c28f2118400040110300a7 +:1093c00021184000c010030023104300c018020001 +:1093d0002318620024098224211062001004438ca7 +:1093e0000c00c28f2120620000a0053c0800c28f43 +:1093f000211840004011030021184000c010030054 +:1094000023104300c0180200231862002409a2247c +:1094100021106200100444ac4225400b0000000003 +:1094200000a0043c0800c28f211840004011030036 +:1094300021184000c010030023104300c018020090 +:109440002318620024098224211062001004428c37 +:10945000212040000800c28f211840004011030065 +:1094600021184000c010030023104300c018020060 +:10947000231862000800632400a0023c240942244f +:1094800021106200040042240004422423108200c0 +:109490000c00c38f211062000c00c2af0800c28f05 +:1094a000211840004011030021184000c0100300a3 +:1094b00023104300c0180200231862000800632430 +:1094c00000a0023c2409422421106200040043242d +:1094d0000c00c28f2120620000a0053c0800c28f52 +:1094e000211840004011030021184000c010030063 +:1094f00023104300c0180200231862002409a2248c +:1095000021106200100444ac00a0043c0800c28f8b +:10951000211840004011030021184000c010030032 +:1095200023104300c018020023186200240982247b +:10953000211062001004448c00a0033c0800c28f7c +:10954000240965242118400040110300211840001f +:10955000c010030023104300c01802002310620053 +:109560002110a2000c04428c1000821000000000a8 +:1095700000a0043c0800c28f2118400040110300e5 +:1095800021184000c010030023104300c01802003f +:1095900023186200240982242110620001000324a0 +:1095a000080043ac7725400b0000000000a0043cfd +:1095b0000800c28f2118400040110300211840000c +:1095c000c010030023104300c018020023186200db +:1095d0002409822421106200080040ac010002240a +:1095e00021e8c0030400be8f0800bd270800e00387 +:1095f00000000000c0fdbd273c02bfaf3802beaf77 +:1096000021f0a0031800c0afe14c400f00000000a3 +:109610001800c0afe926400b0000000000a0043c89 +:109620001800c28f2118400040110300211840008b +:10963000c010030023104300c0180200231862006a +:1096400024098224211062000800428ccd004010c1 +:109650000000000000a0033c1800c28f240964240d +:10966000211840004011030021184000c0100300e1 +:1096700023104300c0180200231062002110820052 +:109680000c04428c2800c2af00a0043c1800c28f1a +:10969000211840004011030021184000c0100300b1 +:1096a00023104300c01802002318620024098224fa +:1096b000211062001004438c2800c28f2b1062001e +:1096c00012004010000000002800c48f00a0053cdc +:1096d0001800c28f211840004011030021184000db +:1096e000c010030023104300c018020023186200ba +:1096f0002409a224211062001004428c231082004d +:109700002000c2aff025400b000000001800c28fff +:10971000211840004011030021184000c010030030 +:1097200023104300c01802002318620008006324bd +:1097300000a0023c240942242110620004004224bb +:10974000000442242120400000a0053c1800c28fe4 +:10975000211840004011030021184000c0100300f0 +:1097600023104300c0180200231862002409a22419 +:10977000211062001004428c232082002800c58f33 +:109780001800c28f2118400040110300211840002a +:10979000c010030023104300c01802002318620009 +:1097a0000800632400a0023c240942242110620026 +:1097b000040042242310a200211082002000c2af26 +:1097c00000a0043c1800c28f211840004011030083 +:1097d00021184000c010030023104300c0180200ed +:1097e0002318620024098224211062000000428ca8 +:1097f000440040100000000000a0043c1800c28f8c +:10980000211840004011030021184000c01003003f +:1098100023104300c0180200231862002409822488 +:1098200021106200080040ac00a0043c1800c28f68 +:10983000211840004011030021184000c01003000f +:1098400023104300c0180200231862002409822458 +:10985000211062001004448c00a0033c1800c28f49 +:1098600024096524211840004011030021184000fc +:10987000c010030023104300c01802002310620030 +:109880002110a2000400468c1800c28f211840004d +:109890004011030021184000c010030023104300b2 +:1098a000c0180200231862000800632400a0023cd4 +:1098b0002409422421106200040047241800c28faa +:1098c000211840004011030021184000c01003007f +:1098d00023104300c0180200231862000704632409 +:1098e00000a0023c2409422421106200040042240a +:1098f0001000a2af2000c58fe44b400f0000000015 +:109900001c00c2af1c00c28f020003240a004310d7 +:10991000000000000300432816006014000000004f +:109920000300032416004310000000000400032479 +:10993000140043140000000000a0043c1800c28f73 +:10994000211840004011030021184000c0100300fe +:1099500023104300c0180200231862002409822447 +:109960002110620001000324080043ac6126400b73 +:1099700000000000000000006126400b0000000015 +:10998000000000001800c48fb922400f0000000042 +:109990002c00c2af2c00c28f7f00401800000000d6 +:1099a0002400c0afc226400b000000001800c28f88 +:1099b000211840004011030021184000c01003008e +:1099c00023104300c0180200231862001806632405 +:1099d00000a0023c240942242120620000a0053c92 +:1099e0001800c28f211840004011030021184000c8 +:1099f000c010030023104300c018020023186200a7 +:109a00002409a224211062001806428c000045801f +:109a10002400c38f1800c6272118c3001c0065a0ae +:109a200001004224000082ac00a0043c1800c28f58 +:109a3000211840004011030021184000c01003000d +:109a400023104300c0180200231862002409822456 +:109a5000211062001806448c1800c28f21184000a3 +:109a60004011030021184000c010030023104300e0 +:109a7000c0180200231862000f06632400a0023cf5 +:109a80002409422421106200040042242b104400c7 +:109a90001a004010000000001800c28f211840007a +:109aa0004011030021184000c010030023104300a0 +:109ab000c0180200231862001004632400a0023cb6 +:109ac00024094224211062000400442400a0053c23 +:109ad0001800c28f211840004011030021184000d7 +:109ae000c010030023104300c018020023186200b6 +:109af0002409a22421106200180644ac2400c28f5d +:109b0000010042242400c2af2400c38f2c00c28f66 +:109b10002a106200a5ff40140000000000a0033cd2 +:109b20001800c28f2409642421184000401103004a +:109b300021184000c010030023104300c018020089 +:109b400023106200211082001c06438c2c00c28f5f +:109b50002320620000a0033c1800c28f2409652462 +:109b6000211840004011030021184000c0100300dc +:109b700023104300c0180200231062002110a2002d +:109b80001c0644ac1800c28f030040140000000003 +:109b90003000c0af3000c0af1800c28f01004224b7 +:109ba0001800c2af1800c28f9cfe401800000000d1 +:109bb0000100022421e8c0033c02bf8f3802be8f9f +:109bc0004002bd270800e00300000000e0ffbd27c1 +:109bd0001c00bfaf1800beaf21f0a0032000c4af2f +:109be0001000c0af0027400b000000007d25400f93 +:109bf000000000001000c28f010042241000c2af1c +:109c00001000c38f2000c28f2b106200f7ff40149a +:109c10000000000021e8c0031c00bf8f1800be8fa9 +:109c20002000bd270800e00300000000e8ffbd277a +:109c30001400bfaf1000beaf21f0a0031800c4afe6 +:109c40001800c28f0800401800000000211000001a +:109c50002a27400b000000007d25400f0000000077 +:109c60001b27400b000000000000000000a0043c87 +:109c70001800c28f21184000401103002118400035 +:109c8000c010030023104300c01802002318620014 +:109c900024098224211062000800428ceeff401447 +:109ca000000000000100022421e8c0031400bf8f5f +:109cb0001000be8f1800bd270800e0030000000060 +:109cc000e0ffbd271c00bfaf1800beaf21f0a0030e +:109cd0002000c4af2400c5af2400c28f0c8182af26 +:109ce00001000224188182af2400c28fff0045309a +:109cf0002400c28f02120200ff0043302400c28ff2 +:109d000002140200ff0042302400c48f0226040027 +:109d10001000a4af029d043c240d84242130600077 +:109d200021384000688f400f00000000029d023c77 +:109d3000400d44242000c58f688f400f00000000b4 +:109d400021e8c0031c00bf8f1800be8f2000bd2774 +:109d50000800e00300000000d0ffbd272c00bfafcb +:109d60002800beaf21f0a003211880002110a00020 +:109d70003800c6af3000c3a33400c2a33400c2937e +:109d80000800432c8f0160100000000080180200c2 +:109d9000019d023ca89d4224211062000000428cdb +:109da0000800400000000000c4a3009dc89d009d65 +:109db000b89e009dc4a3009d249f009dc4a3009d48 +:109dc0003ca1009dc4a3009d3800c28f1000c2af0b +:109dd0001000c28f000042803100401400000000db +:109de000488082833000c3830800621400000000b2 +:109df000488082832120400021280000c01b400fa2 +:109e000000000000f128400b000000004a8082831f +:109e10003000c38308006214000000004a8082837f +:109e20002120400021280000c01b400f000000003e +:109e3000f128400b000000004c8082833000c38377 +:109e400008006214000000004c8082832120400042 +:109e500021280000c01b400f00000000f128400b2b +:109e6000000000004e8082833000c3834b016214e7 +:109e7000000000004e808283212040002128000045 +:109e8000c01b400f00000000029d023c540d442402 +:109e9000578f400f00000000f128400b0000000029 +:109ea000029d023c700d4424578f400f00000000bb +:109eb000f128400b000000003800c28f1400c2af30 +:109ec0001400c28f000042800c004010000000000f +:109ed0003000c3831400c28f00004280029d043c06 +:109ee0007c0d84242128600021304000688f400fc1 +:109ef00000000000f128400b000000004a8082832f +:109f00003000c383280162140000000021200000fb +:109f1000010005241c7f400f00000000f128400bc9 +:109f2000000000003800c28f1800c2af1800c28fb6 +:109f300000004280790040040000000048808283d5 +:109f40003000c3831e0062140000000000a0023c29 +:109f50003414442421280000000406245b8c400fa4 +:109f6000000000001800c28f00004280478082a3da +:109f7000478082832120400000a0023c3414452405 +:109f80000004062421380000441d400f000000009a +:109f9000029d023ca00d4224212040005f000524c8 +:109fa000982b400f00000000029d023c000e44244c +:109fb000578f400f00000000f128400b0000000008 +:109fc0004a8082833000c3831e00621400000000b8 +:109fd00000a0023c701c442421280000c800062474 +:109fe0005b8c400f000000001800c28f0000428010 +:109ff000498082a3498082832120400000a0023c46 +:10a00000701c4524c800062421380000441d400f60 +:10a010000000000001000424010005241c7f400f03 +:10a0200000000000029d023c1c0e42242120400042 +:10a030000f000524782c400f00000000f128400b91 +:10a04000000000004c8082833000c383180062143b +:10a050000000000000a0023c34104424212800002d +:10a06000000406245b8c400f000000001800c28f23 +:10a07000000042804b8082a34b80828321204000dd +:10a0800000a0023c341045240004062421380000be +:10a09000441d400f00000000029d023c2c0e442491 +:10a0a000578f400f00000000f128400b0000000017 +:10a0b0004e8082833000c383be0062140000000023 +:10a0c00000a0023c34184424212800000004062487 +:10a0d0005b8c400f000000001800c28f000042801f +:10a0e0004d8082a34d8082832120400000a0023c4d +:10a0f000341845240004062421380000441d400f74 +:10a1000000000000029d023c480e4424578f400f7f +:10a1100000000000f128400b000000003000c28366 +:10a12000029d033c640e642421284000688f400f88 +:10a1300000000000f128400b000000003800c28f32 +:10a140001c00c2af1c00c28f0000428c51004010a6 +:10a15000000000001c00c28f040042844d00401823 +:10a1600000000000478082833000c3831200621425 +:10a1700000000000478082832120400000a0023cb4 +:10a18000341445240004062421380000441d400fe7 +:10a19000000000001c00c28f0400428400a0033ca9 +:10a1a0003414642421284000ed4e400f00000000cc +:10a1b000a228400b00000000498082833000c38346 +:10a1c0000b006214000000004980828321204000bf +:10a1d00000a0023c701c4524c80006242138000061 +:10a1e000441d400f00000000a228400b00000000aa +:10a1f0004b8082833000c3830b0062140000000098 +:10a200004b8082832120400000a0023c3410452472 +:10a210000004062421380000441d400f0000000007 +:10a22000a228400b000000004d8082833000c383d1 +:10a2300015006214000000004d8082832120400040 +:10a2400000a0023c341845240004062421380000f4 +:10a25000441d400f000000000300401000000000fb +:10a26000010002242000c2a31c00c28f0000438c06 +:10a270001c00c28f0400428421206000212840007d +:10a280004f5a400f0000000000000000f128400b72 +:10a2900000000000478082833000c3830d006214f9 +:10a2a000000000004780828321204000be1d400f37 +:10a2b00000000000ffff0224478082a3029d023cb1 +:10a2c000800e4424578f400f00000000f128400bff +:10a2d00000000000498082833000c3830d006214b7 +:10a2e000000000004980828321204000be1d400ff5 +:10a2f00000000000ffff0224498082a30100042423 +:10a30000212800001c7f400f00000000f128400bb6 +:10a31000000000004b8082833000c3830d00621474 +:10a32000000000004b80828321204000be1d400fb2 +:10a3300000000000ffff02244b8082a3029d023c2c +:10a34000a00e4424578f400f00000000f128400b5e +:10a35000000000004d8082833000c3831800621427 +:10a36000000000004d80828321204000be1d400f70 +:10a3700000000000ffff02244d8082a3029d023cea +:10a38000bc0e4424578f400f000000008530400f62 +:10a3900000000000f128400b000000000000000059 +:10a3a000f128400b0000000000000000f128400be5 +:10a3b0000000000000000000f128400b0000000039 +:10a3c0000000000021e8c0032c00bf8f2800be8fd2 +:10a3d0003000bd270800e00300000000e0ffbd27bb +:10a3e0001c00bfaf1800beaf21f0a0032000c4af17 +:10a3f0002400c5af2000c48f107b400f0000000078 +:10a400001000c2a71000c2970500422c750040142e +:10a41000000000001000c297ffff42242000c38ffd +:10a42000211862002400c28f0500422400004290df +:10a430000f0042300a0042280a00401400000000c9 +:10a440002400c28f05004224000042900f004230d9 +:10a45000ff00423037004224ff0042302029400be9 +:10a46000000000002400c28f05004224000042903a +:10a470000f004230ff00423030004224ff004230e3 +:10a48000000062a01000c297feff42242000c38f8c +:10a49000211862002400c28f05004224000042906f +:10a4a00002110200ff0042300f0042300a00422831 +:10a4b0000a004014000000002400c28f050042245e +:10a4c0000000429002110200ff0042303700422497 +:10a4d000ff0042303e29400b000000002400c28fe4 +:10a4e000050042240000429002110200ff004230a9 +:10a4f00030004224ff004230000062a01000c297ea +:10a50000fcff42242000c38f211862002400c28f68 +:10a5100004004224000042900f0042300a0042280a +:10a520000a004014000000002400c28f04004224ee +:10a53000000042900f004230ff00423037004224ba +:10a54000ff0042305a29400b000000002400c28f57 +:10a5500004004224000042900f004230ff004230cd +:10a5600030004224ff004230000062a01000c29779 +:10a57000fbff42242000c38f211862002400c28ff9 +:10a58000040042240000429002110200ff00423009 +:10a590000f0042300a0042280a0040140000000068 +:10a5a0002400c28f040042240000429002110200e5 +:10a5b000ff00423037004224ff0042307829400b30 +:10a5c000000000002400c28f0400422400004290da +:10a5d00002110200ff00423030004224ff004230ee +:10a5e000000062a021e8c0031c00bf8f1800be8fce +:10a5f0002000bd270800e00300000000c8ffbd27c1 +:10a600003400bfaf3000beaf2c00b0af21f0a003cc +:10a61000211080003c00c5af3800c2a33800c293af +:10a6200032000324320043100000000033004328ae +:10a6300074006010000000000b0003244b00431066 +:10a64000000000002c0003247100431400000000ef +:10a650003c00c28f1800c2af1800c28f00004390a8 +:10a66000010002240f00621400000000029d023c61 +:10a67000dc0e4424578f400f0000000000a0023c75 +:10a68000601c44242413400f000000000100022439 +:10a69000148182af010002244f8082a3082a400b5c +:10a6a000000000001800c28f000042905b004014c0 +:10a6b00000000000029d023cf00e4424578f400f22 +:10a6c00000000000148180af020002244f8082a3aa +:10a6d000ea2a400f0000000021200000212800008d +:10a6e0001c7f400f00000000082a400b0000000003 +:10a6f0003c00c28f1c00c2af1c00c28f0000429001 +:10a70000212840001c00c28f01004224000042901a +:10a71000211840001c00c28f020042240000429019 +:10a720001c00c48f03008424000084901000a4af98 +:10a73000029d043c040f8424213060002138400035 +:10a74000688f400f0000000001000224148182afd6 +:10a7500000a0023c243e422421204000e71e400f7e +:10a7600000000000082a400b000000003c00c28fdf +:10a770002000c2af029d023c200f4424578f400f9f +:10a78000000000002000c28f6300429017004014b8 +:10a79000000000002000c28f218040002000c28ff6 +:10a7a00021204000d988400f00000000ff00423007 +:10a7b000212840002000c28f6200429021184000f2 +:10a7c0002000c28f21004224ff0004241000a4af07 +:10a7d000212000022130600021384000c811400fc4 +:10a7e00000000000082a400b00000000029d023c0f +:10a7f000480f4424578f400f00000000082a400be8 +:10a800000000000000000000082a400b00000000cb +:10a8100000000000082a400b0000000000000000bb +:10a8200021e8c0033400bf8f3000be8f2c00b08ff2 +:10a830003800bd270800e00300000000b0ffbd277e +:10a840004c00bfaf4800beaf4400b0af21f0a00342 +:10a850001c8180af0500042401000524eb60400f3b +:10a860000000000000a0023c601c442421280000dd +:10a87000100006245b8c400f0000000000a0023c8a +:10a88000327e033cc0a86334601c43ac00a0023c91 +:10a89000601c42240808033c08086334080043ace9 +:10a8a00000a0023c601c42243201033cc0a8633477 +:10a8b000040043ac00a0023c601c4224ff00033ca7 +:10a8c000ffff63340c0043ac6280400f00000000c7 +:10a8d0001c00c22721204000212800001c00062463 +:10a8e0005b8c400f00000000019d023cfca542244f +:10a8f0001c00c2af1c00c227212040003e11400fa7 +:10a90000000000001800c2a31800c2830700401016 +:10a9100000000000208180af030002244f8082a34a +:10a9200021100000be2a400b00000000010002249c +:10a93000208182af020002244f8082a38f1a400f31 +:10a9400000000000019d023c589d4424019d023cf2 +:10a95000c09c4524c41a400f00000000ac8184272d +:10a96000a88185274d15400f00000000a881829323 +:10a970000400401400000000408084270913400fa9 +:10a9800000000000408084276c15400f000000008c +:10a9900000a0023c143e4224212040004080852734 +:10a9a000f728400f0000000000a0023ccc3d4424ea +:10a9b00040808527f728400f0000000000a0023cdf +:10a9c000143e502400a0023c143e422421204000aa +:10a9d000107b400f00000000ff00423021200002e9 +:10a9e00021284000fe15400f00000000212000003b +:10a9f0005c13400f00000000ff0002241000a2af13 +:10aa0000029d023c640f44240b000524020006242e +:10aa1000029d023c700f4724c811400f0000000047 +:10aa20000500401000000000029d023c7c0f442401 +:10aa3000688f400f000000003800c227212040002e +:10aa4000fc7e400f000000002120000001000524d2 +:10aa5000067f400f000000000100042401000524cf +:10aa6000067f400f000000000200042401000524be +:10aa7000067f400f0000000003000424212800008e +:10aa8000067f400f0000000004000424212800007d +:10aa9000067f400f00000000212000002128000058 +:10aaa0001c7f400f0000000001000424212800004a +:10aab0001c7f400f00000000020004242128000039 +:10aac0001c7f400f00000000030004242128000028 +:10aad0001c7f400f00000000040004242128000017 +:10aae0001c7f400f0000000005000424881305248b +:10aaf000eb60400f0000000021e8c0034c00bf8f56 +:10ab00004800be8f4400b08f5000bd270800e0030e +:10ab100000000000e0ffbd271c00bfaf1800beaf63 +:10ab200021f0a003ea2a400f00000000ac1a400ff9 +:10ab300000000000f612400f000000001000c227c5 +:10ab4000212040005511400f0000000088bf033c49 +:10ab50002061628c8410027c206162ac88bf033c5f +:10ab60002061628c0421027c206162ac208180af74 +:10ab7000148180af88bf033c2061628c01000424f3 +:10ab80008431827c206162ac4f8080a3010002246a +:10ab900021e8c0031c00bf8f1800be8f2000bd2716 +:10aba0000800e00300000000e8ffbd271400bfaf6d +:10abb0001000beaf21f0a0031c8180af48808283cb +:10abc00021204000be1d400f00000000478083830d +:10abd000ffff02240500621000000000478082830e +:10abe00021204000be1d400f000000004c808283e9 +:10abf00021204000be1d400f000000004b808383d9 +:10ac0000ffff022405006210000000004b808283d9 +:10ac100021204000be1d400f000000004a808283ba +:10ac200021204000be1d400f0000000049808383aa +:10ac3000ffff0224050062100000000049808283ab +:10ac400021204000be1d400f000000004e80828386 +:10ac500021204000be1d400f000000004d80838376 +:10ac6000ffff022405006210000000004d80828377 +:10ac700021204000be1d400f0000000021e8c0035d +:10ac80001400bf8f1000be8f1800bd270800e0031e +:10ac900000000000f8ffbd270400beaf21f0a003b4 +:10aca0004f80828321e8c0030400be8f0800bd27c7 +:10acb0000800e00300000000e0ffbd271c00bfaf5c +:10acc0001800beaf21f0a0032081828f2e0040101b +:10acd000000000004f8083830200022417006214ea +:10ace000000000001481828f140040140000000056 +:10acf00005000424fe5f400f000000000f0040101c +:10ad000000000000ff0002241000a2af029d023ce0 +:10ad1000640f44240b00052402000624029d023c1b +:10ad2000700f4724c811400f0000000005000424e4 +:10ad300088130524eb60400f000000002120000074 +:10ad4000a811400f000000001481828f0f004010f6 +:10ad5000000000001c81828f0c00401400000000e5 +:10ad6000692b400f000000007530400f000000000c +:10ad7000492c400f00000000010002241c8182af1a +:10ad8000632b400b000000000000000021e8c0031e +:10ad90001c00bf8f1800be8f2000bd270800e003f5 +:10ada00000000000d0ffbd272c00bfaf2800beafc1 +:10adb00021f0a0030200042401000524213000003a +:10adc000d21a400f00000000488082a355000224e0 +:10add0001000c2a7488082831a00400400000000cf +:10ade000020002241400c2a71000c2970012020041 +:10adf000201e027c1000c29702120200ffff4230a8 +:10ae00002016027c251062002016027cffff4230d3 +:10ae10001600c2a71800c0af4880828321184000e6 +:10ae20001400c227212060002128400010000624c1 +:10ae3000741b400f0000000001000224922b400b05 +:10ae4000000000002110000021e8c0032c00bf8f8b +:10ae50002800be8f3000bd270800e003000000007e +:10ae6000e8ffbd271400bfaf1000beaf21f0a00364 +:10ae70001800c4af1c00c5af47808383ffff0224c6 +:10ae800013006210000000004780828321184000f8 +:10ae90001c00c28fffff4230212060001800c58fc8 +:10aea0002130400021380000751c400f00000000d8 +:10aeb000478082832120400000a0023c34144524b6 +:10aec0000004062421380000441d400f000000004b +:10aed00021e8c0031400bf8f1000be8f1800bd27eb +:10aee0000800e00300000000e8ffbd271400bfaf2a +:10aef0001000beaf21f0a003211080001800c2a3f3 +:10af000047808383ffff02241000621000000000ce +:10af100047808283212040001800c52701000624b5 +:10af200021380000751c400f00000000478082831c +:10af30002120400000a0023c3414452400040624d3 +:10af400021380000441d400f0000000021e8c0032c +:10af50001400bf8f1000be8f1800bd270800e0034b +:10af600000000000d0ffbd272c00bfaf2800beafff +:10af700021f0a00302000424010005242130000078 +:10af8000d21a400f000000004c8082a35600022419 +:10af90001000c2a74c8082831a0040040000000009 +:10afa000020002241400c2a71000c297001202007f +:10afb000201e027c1000c29702120200ffff4230e6 +:10afc0002016027c251062002016027cffff423012 +:10afd0001600c2a71800c0af4c8082832118400021 +:10afe0001400c22721206000212840001000062400 +:10aff000741b400f0000000001000224022c400bd3 +:10b00000000000002110000021e8c0032c00bf8fc9 +:10b010002800be8f3000bd270800e00300000000bc +:10b02000e8ffbd271400bfaf1000beaf21f0a003a2 +:10b030001800c4af1c00c5af4b808383ffff022400 +:10b0400013006210000000004b8082832118400032 +:10b050001c00c28fffff4230212060001800c58f06 +:10b060002130400021380000751c400f0000000016 +:10b070004b8082832120400000a0023c34144524f0 +:10b080000004062421380000441d400f0000000089 +:10b0900021e8c0031400bf8f1000be8f1800bd2729 +:10b0a0000800e00300000000e8ffbd271400bfaf68 +:10b0b0001000beaf21f0a003211080001800c2a331 +:10b0c0004b808383ffff0224100062100000000009 +:10b0d0004b808283212040001800c52701000624f0 +:10b0e00021380000751c400f000000004b80828357 +:10b0f0002120400000a0023c341445240004062412 +:10b1000021380000441d400f0000000021e8c0036a +:10b110001400bf8f1000be8f1800bd270800e00389 +:10b1200000000000d0ffbd272c00bfaf2800beaf3d +:10b1300021f0a003020004240100052421300000b6 +:10b14000d21a400f000000004a8082a35700022458 +:10b150001000c2a74a8082831a0040040000000049 +:10b16000020002241400c2a71000c29700120200bd +:10b17000201e027c1000c29702120200ffff423024 +:10b180002016027c251062002016027cffff423050 +:10b190001600c2a71800c0af4a8082832118400061 +:10b1a0001400c2272120600021284000100006243e +:10b1b000741b400f0000000001000224722c400ba1 +:10b1c000000000002110000021e8c0032c00bf8f08 +:10b1d0002800be8f3000bd270800e00300000000fb +:10b1e000e8ffbd271400bfaf1000beaf21f0a003e1 +:10b1f0001800c4af1c00c5af4980828321184000ed +:10b200001c00c28fffff4230212060001800c58f54 +:10b210002130400021380000751c400f0000000064 +:10b22000498082832120400000a0023c701c4524fc +:10b23000c800062421380000441d400f0000000013 +:10b2400021e8c0031400bf8f1000be8f1800bd2777 +:10b250000800e00300000000e8ffbd271400bfafb6 +:10b260001000beaf21f0a003211080001800c2a37f +:10b2700049808383ffff0224100062100000000059 +:10b2800049808283212040001800c5270100062440 +:10b2900021380000751c400f0000000049808283a7 +:10b2a0002120400000a0023c701c4524c800062458 +:10b2b00021380000441d400f0000000021e8c003b9 +:10b2c0001400bf8f1000be8f1800bd270800e003d8 +:10b2d00000000000f8ffbd270400beaf21f0a0036e +:10b2e00049808383ffff02240400621400000000f1 +:10b2f00021100000c02c400b0000000001000224bf +:10b3000021e8c0030400be8f0800bd270800e00349 +:10b3100000000000d0ffbd272c00bfaf2800beaf4b +:10b3200021f0a003020004240100052421300000c4 +:10b33000d21a400f000000004e8082a36300022456 +:10b340001000c2a74e8082831a0040040000000053 +:10b35000020002241400c2a71000c29700120200cb +:10b36000201e027c1000c29702120200ffff423032 +:10b370002016027c251062002016027cffff42305e +:10b380001600c2a71800c0af4e808283211840006b +:10b390001400c2272120600021284000100006244c +:10b3a000741b400f0000000001000224ee2c400b33 +:10b3b000000000002110000021e8c0032c00bf8f16 +:10b3c0002800be8f3000bd270800e0030000000009 +:10b3d000e8ffbd271400bfaf1000beaf21f0a003ef +:10b3e0004e80828321204000be1d400f00000000df +:10b3f000ffff02244e8082a34d808383ffff02243f +:10b4000007006210000000004d8082832120400070 +:10b41000be1d400f00000000ffff02244d8082a3ec +:10b4200021e8c0031400bf8f1000be8f1800bd2795 +:10b430000800e00300000000e8ffbd271400bfafd4 +:10b440001000beaf21f0a0031800c4af1c00c5afb0 +:10b450004d808283211840001c00c28fffff4230c4 +:10b46000212060001800c58f2130400021380000e5 +:10b47000751c400f000000004d8082832120400099 +:10b4800000a0023c701c4524c8000624213800009e +:10b49000441d400f0000000021e8c0031400bf8fce +:10b4a0001000be8f1800bd270800e0030000000058 +:10b4b000e8ffbd271400bfaf1000beaf21f0a0030e +:10b4c000211080001800c2a34d808383ffff022457 +:10b4d00010006210000000004d8082832120400097 +:10b4e0001800c5270100062421380000751c400ff4 +:10b4f000000000004d8082832120400000a0023c1b +:10b50000701c4524c800062421380000441d400f4b +:10b510000000000021e8c0031400bf8f1000be8fa0 +:10b520001800bd270800e00300000000f8ffbd2759 +:10b530000400beaf21f0a0034d808383ffff0224ef +:10b54000040062140000000021100000562d400b82 +:10b55000000000000100022421e8c0030400be8fa7 +:10b560000800bd270800e00300000000e8ffbd2739 +:10b570001400bfaf1000beaf21f0a003f158400f80 +:10b58000000000005e30400f00000000be31400fa0 +:10b59000000000002120000021280000ea82400f66 +:10b5a000000000000100022421e8c0031400bf8f46 +:10b5b0001000be8f1800bd270800e0030000000047 +:10b5c000e8ffbd271400bfaf1000beaf21f0a003fd +:10b5d0002120000021280000322e400f0000000032 +:10b5e00021e8c0031400bf8f1000be8f1800bd27d4 +:10b5f0000800e00300000000e0ffbd271c00bfaf13 +:10b600001800beaf21f0a003211080002400c5afb8 +:10b610002000c2a3f65a400f000000001000c2af85 +:10b620002400c28f08004014000000002000c293d4 +:10b630002120400007000524835a400f000000002d +:10b64000122e400b000000002000c2831900432c82 +:10b65000790060100000000080180200019d023c8b +:10b6600074b64224211062000000428c08004000a1 +:10b670000000000044b8009d44b8009dd8b6009d6d +:10b6800044b8009d0cb7009d44b8009d44b8009d8f +:10b6900034b7009d44b8009d5cb7009d44b8009d40 +:10b6a00044b8009d88b7009d44b8009da0b7009d98 +:10b6b00044b8009dc8b7009d44b8009df0b7009df8 +:10b6c00044b8009d44b8009d44b8009d44b8009d16 +:10b6d00044b8009d10b8009d029d023c5c93442438 +:10b6e000578f400f000000001000c28f010003249c +:10b6f000000043a00300042401000524835a400fe6 +:10b7000000000000122e400b00000000029d023cd1 +:10b710007c934424578f400f000000000100042454 +:10b7200002000524322e400f00000000122e400bb4 +:10b7300000000000029d023ca8934424578f400f54 +:10b74000000000000100042403000524322e400ff5 +:10b7500000000000122e400b00000000029d023c81 +:10b76000c8934424578f400f000000000482828f4a +:10b770002014027c21204000cf5b400f000000001d +:10b78000122e400b000000000100042404000524d8 +:10b79000322e400f00000000122e400b000000006f +:10b7a000029d023ce8934424578f400f00000000a4 +:10b7b0000100042405000524322e400f0000000083 +:10b7c000122e400b00000000029d023c0c94442409 +:10b7d000578f400f000000000100042406000524dc +:10b7e000322e400f00000000122e400b000000001f +:10b7f000029d023c30944424578f400f000000000b +:10b800000100042401000524322e400f0000000036 +:10b81000029d023c54944424578f400f00000000c6 +:10b820000100042408000524322e400f000000000f +:10b83000122e400b0000000000000000122e400bf2 +:10b84000000000000000000021e8c0031c00bf8fc2 +:10b850001800be8f2000bd270800e0030000000094 +:10b86000e8ffbd271400bfaf1000beaf21f0a0035a +:10b87000211080001c00c5af2000c6af1800c2a375 +:10b880001800c283029d033c849464242128400054 +:10b890001c00c68f2000c78f688f400f000000007b +:10b8a0000100042407000524322e400f0000000090 +:10b8b00021e8c0031400bf8f1000be8f1800bd2701 +:10b8c0000800e00300000000d8ffbd272400bfaf40 +:10b8d0002000beaf21f0a0032800c4af2c00c5afec +:10b8e0000482828f0600432c1d02601000000000bd +:10b8f00080180200019d023c0cb942242110620014 +:10b900000000428c080040000000000024b9009da7 +:10b9100088b9009d78bb009df8bc009d0cc0009dbf +:10b9200094c0009d2800c28f01000324080043102a +:10b93000000000000200032410004310000000007b +:10b94000fa01401400000000602e400b00000000cf +:10b950002c00c28f070040140000000001000224e8 +:10b96000048282af029d023cd4944424578f400f3e +:10b9700000000000602e400b0000000000000000ee +:10b980005830400b000000002800c28f0100032443 +:10b99000080043100000000002000324730043105d +:10b9a00000000000e401401400000000dc2e400b09 +:10b9b000000000002c00c28f0900422c63004010e0 +:10b9c000000000002c00c28f80180200019d023c84 +:10b9d000e4b94224211062000000428c08004000bb +:10b9e000000000004cbb009d94ba009d08ba009d69 +:10b9f0003cba009d4cbb009d4cbb009db4ba009d61 +:10ba00004cbb009d0cbb009d1e31400f0000000090 +:10ba100005000424115b400f000000000200022416 +:10ba2000048282af029d023c04954424578f400f4c +:10ba300000000000d92e400b00000000ec81828f36 +:10ba40000600401400000000020004243a5b400f8e +:10ba500000000000a32e400b0000000001000424a1 +:10ba60003a5b400f000000000b000424115b400f04 +:10ba70000000000003000224048282af029d023c09 +:10ba800038954424578f400f00000000d92e400bfa +:10ba900000000000029d023c6c954424578f400f2b +:10baa000000000005e30400f00000000d92e400b67 +:10bab000000000001082838f010002240a0062143b +:10bac0000000000011000424115b400f0000000082 +:10bad000029d023c98954424578f400f00000000bf +:10bae000c12e400b0000000011000424265b400f13 +:10baf00000000000029d023cc4954424578f400f73 +:10bb000000000000d92e400b00000000be31400fa5 +:10bb10000000000021184000010002240600621409 +:10bb20000000000001000424015c400f0000000040 +:10bb3000d12e400b0000000021200000015c400fce +:10bb400000000000d92e400b000000002c00c28f26 +:10bb5000ff00423021204000265b400f0000000023 +:10bb600000000000dc2e400b000000000000000080 +:10bb70005830400b000000002800c28f0100032451 +:10bb8000430043100000000002000324570043104c +:10bb9000000000006b0140140000000021200000a4 +:10bba0009130400f000000001000c2af1000c28fa3 +:10bbb000010003241200431000000000020043288b +:10bbc00005006010000000000b00401000000000a5 +:10bbd000222f400b00000000020003241500431038 +:10bbe00000000000030003241d00431000000000bb +:10bbf000222f400b00000000222f400b000000000d +:10bc0000029d023c00964424578f400f0000000024 +:10bc100006000424115b400f000000000100022414 +:10bc2000048282af01000224ec8182af222f400bfc +:10bc300000000000029d023c44964424578f400fb0 +:10bc40000000000006000424265b400f00000000f6 +:10bc500001000224048282af222f400b000000006a +:10bc6000029d023c88964424578f400f000000003c +:10bc700006000424265b400f00000000010002249f +:10bc8000048282af000000003c2f400b0000000047 +:10bc90002c00c38f010002240c006214000000007d +:10bca000010004249130400f00000000029d023c7e +:10bcb000cc964424578f400f000000005e30400fa8 +:10bcc00000000000392f400b000000002c00c28f44 +:10bcd000ff00423021204000265b400f00000000a2 +:10bce000000000003c2f400b00000000000000009e +:10bcf0005830400b000000002800c28f01000324d0 +:10bd00003f0043100000000002000324bc00431069 +:10bd1000000000000e01401400000000212000007f +:10bd20002b31400f000000001400c2af1400c28f7e +:10bd30000100032412004310000000000200432809 +:10bd400005006010000000000b0040100000000023 +:10bd50007e2f400b00000000020003241800431057 +:10bd60000000000003000324220043100000000034 +:10bd70007e2f400b000000007e2f400b00000000d3 +:10bd80001482828f0100042421284000925b400f1e +:10bd9000000000001482828f029d033cfc96642404 +:10bda00021284000688f400f000000001482828f1d +:10bdb00001004224148282af7e2f400b000000005d +:10bdc0001482828f0500042421284000925b400fda +:10bdd000000000005e30400f00000000029d023ca9 +:10bde00030974424578f400f000000007e2f400bf7 +:10bdf00000000000000000000130400b00000000c7 +:10be00002c00c28f04000324110043100000000026 +:10be10000500432806006010000000000100032414 +:10be20006900431000000000fd2f400b00000000df +:10be30000500032445004310000000000700032410 +:10be40003500431000000000fd2f400b00000000f3 +:10be50001800c0af1c00c0af1c00c0af00a0023c67 +:10be6000442f4424bb32400f000000001800c2af32 +:10be700000a0023c482f4424bb32400f00000000c9 +:10be80001c00c2af00a0023c442f42240800422400 +:10be9000e88182af1482828f211840001800c28f7f +:10bea00011006210000000001482828f040004243c +:10beb00021284000925b400f000000001482828f16 +:10bec000029d033c749764241800c58f2130400004 +:10bed000688f400f00000000ab32400f00000000f0 +:10bee000c42f400b000000001c00c28fe08182af15 +:10bef000010004242b31400f00000000029d023c91 +:10bf0000d49744241800c58f688f400f00000000ac +:10bf1000fe2f400b000000001482828f02000424d8 +:10bf200021284000925b400f000000001482828fa5 +:10bf3000029d033c1c98642421284000688f400f18 +:10bf400000000000fe2f400b00000000029d023c9c +:10bf500068984424578f400f00000000be31400f06 +:10bf60000000000021184000010002240a006214b1 +:10bf70000000000001000224048282af01000424ba +:10bf8000e85b400f0000000001000224108282af35 +:10bf9000f02f400b00000000029d023cb0984424aa +:10bfa000578f400f0000000002000424e85b400fa0 +:10bfb000000000005e30400f00000000108280afe3 +:10bfc000fe2f400b00000000029d023cf09844242c +:10bfd000578f400f00000000020004242b31400f57 +:10bfe000000000005e30400f00000000fe2f400bfc +:10bff00000000000000000000130400b00000000c5 +:10c00000000000005830400b000000002800c28fe4 +:10c010000100032408004310000000000200032474 +:10c0200019004310000000004c0040140000000004 +:10c030002330400b000000002c00c38f01000224bd +:10c040000900621400000000029d023c6c9544242b +:10c05000578f400f000000005e30400f00000000ce +:10c060002030400b000000002c00c28fff00423047 +:10c0700021204000265b400f00000000000000006f +:10c080002330400b00000000000000005830400b3f +:10c09000000000002800c28f0100032408004310a4 +:10c0a00000000000020003241900431000000000fb +:10c0b0001a004010000000005830400b0000000043 +:10c0c0002c00c38f0100022409006214000000004c +:10c0d000029d023c6c954424578f400f00000000e5 +:10c0e0005e30400f000000004230400b00000000b6 +:10c0f0002c00c28fff00423021204000265b400f01 +:10c1000000000000000000004830400b000000006c +:10c11000000000004830400b00000000000000005c +:10c12000000000005830400b00000000000000003c +:10c130005830400b00000000000000005830400b59 +:10c1400000000000000000005830400b000000001c +:10c15000000000005830400b00000000000000000c +:10c1600021e8c0032400bf8f2000be8f2800bd2718 +:10c170000800e00300000000e8ffbd271400bfaf87 +:10c180001000beaf21f0a003048280af088280af10 +:10c19000148280af108280af148280af108280af93 +:10c1a000e08180af1e31400f00000000ab32400f35 +:10c1b00000000000f42c400f0000000021e8c00344 +:10c1c0001400bf8f1000be8f1800bd270800e003c9 +:10c1d00000000000e8ffbd271400bfaf1000beaf95 +:10c1e00021f0a003c52c400f000000000100042432 +:10c1f00021280000322e400f0000000021e8c0037b +:10c200001400bf8f1000be8f1800bd270800e00388 +:10c2100000000000e8ffbd271400bfaf1000beaf54 +:10c2200021f0a0035e30400f0000000021e8c003b1 +:10c230001400bf8f1000be8f1800bd270800e00358 +:10c2400000000000e8ffbd271400bfaf1000beaf24 +:10c2500021f0a0031800c4af1800c38f010002240e +:10c2600006006214000000001e31400f00000000b4 +:10c27000030002241831400b00000000f881828f77 +:10c280000500432c750060100000000080180200bb +:10c29000019d023ca8c24224211062000000428c91 +:10c2a0000800400000000000bcc2009d28c3009da3 +:10c2b0004cc4009d34c4009d40c4009dfc81828f0d +:10c2c00021204000212800003454400f00000000cd +:10c2d0000c00401400000000fc81828f029d033c92 +:10c2e0003499642421284000688f400f000000002a +:10c2f00004000224f88182af020002241831400bae +:10c30000000000000c8280af0900042419000524fd +:10c31000eb60400f0000000001000224f88182afb2 +:10c320001731400b0000000009000424fe5f400f9d +:10c3300000000000211840000100022446006214a1 +:10c34000000000002453400f0000000021004014b2 +:10c3500000000000fc81838f1f00023c0e0062146d +:10c3600000000000fc81838f0c82828f029d043cc0 +:10c37000609984242128600021304000688f400f9c +:10c380000000000003000224f88182af01000224b3 +:10c390001831400b00000000fc81838f0c82828fdb +:10c3a000029d043ca0998424212860002130400093 +:10c3b000688f400f00000000fc81838f0100023c69 +:10c3c00021106200fc8182aff88180af1731400bf1 +:10c3d000000000000c82828f280042280c004014cc +:10c3e000000000000c82828f029d033cd8996424d7 +:10c3f00021284000688f400f000000000400022444 +:10c40000f88182af020002241831400b00000000c6 +:10c410000900042419000524eb60400f000000000f +:10c420000c82828f010042240c8282af1731400bb4 +:10c4300000000000010002241831400b0000000041 +:10c44000020002241831400b000000000000000030 +:10c450001731400b00000000000000002110000018 +:10c4600021e8c0031400bf8f1000be8f1800bd2745 +:10c470000800e00300000000f8ffbd270400beaf85 +:10c4800021f0a003f88180af1800023cfc8182af4c +:10c490000c8280afec8180af21e8c0030400be8f26 +:10c4a0000800bd270800e00300000000e0ffbd27f2 +:10c4b0001c00bfaf1800beaf21f0a0032000c4af26 +:10c4c000f081828f0600432c7b006010000000008a +:10c4d00080180200019d023cecc44224211062003d +:10c4e0000000428c080040000000000004c5009dd0 +:10c4f00038c5009d5cc6009d90c6009d78c6009d15 +:10c5000084c6009d2000c28f64004010000000001f +:10c510002000c38f010002246300621400000000a9 +:10c5200001000224f08182afe48180af211000007d +:10c53000b031400b00000000e881828f3c004014c5 +:10c5400000000000ab32400f000000000200022497 +:10c55000b031400b00000000f481828f21204000a8 +:10c5600001004224f48182afe881828f0000438081 +:10c5700001004224e88182af2128600001000624e6 +:10c58000f854400f000000000a00401400000000b2 +:10c59000029d023c249a4424578f400f0000000063 +:10c5a00005000224f08182af02000224b031400b6a +:10c5b000000000001000c0af7131400b000000000f +:10c5c000000000002453400f00000000060040144b +:10c5d00000000000e481828f01004224e48182afe8 +:10c5e0008d31400b000000001000c28fc9004228ae +:10c5f00001004238ff0042301000c38f0100632465 +:10c600001000c3afeeff401000000000029d023c8e +:10c61000609a4424578f400f000000000500022458 +:10c62000f08182af02000224b031400b0000000014 +:10c6300000000000e481838fe081828f2a10620075 +:10c64000c5ff40140000000002000224f08182af08 +:10c6500021100000b031400b000000002000c28f0c +:10c660001400401400000000f08180af010002249b +:10c67000b031400b0000000001000224b031400b3b +:10c680000000000002000224b031400b0000000056 +:10c6900000000000ae31400b000000000000000070 +:10c6a000ae31400b0000000000000000ae31400b36 +:10c6b0000000000000000000b031400b000000004e +:10c6c00021e8c0031c00bf8f1800be8f2000bd27cb +:10c6d0000800e00300000000f8ffbd270400beaf23 +:10c6e00021f0a00321e8c0030400be8f0800bd278d +:10c6f0000800e00300000000e0fcbd271c03bfaf02 +:10c700001803beaf21f0a0031800023c2000c2af06 +:10c71000ffff02242400c2af029d023cac9a4424d5 +:10c72000578f400f000000002000c28f5800c32721 +:10c730002120600018000524213040008a53400f5a +:10c74000000000005800c22721204000bb32400feb +:10c75000000000003000c2af5800c227040042248d +:10c7600021204000bb32400f000000003400c2af67 +:10c770005800c2270800422421204000bb32400f4d +:10c78000000000003800c2af5800c2270c0042244d +:10c7900021204000bb32400f000000003c00c2af2f +:10c7a0005800c2271000422421204000bb32400f15 +:10c7b000000000004000c2af5800c227140042240d +:10c7c00021204000bb32400f000000004400c2aff7 +:10c7d0003c00c28f1000a2af4000c28f1400a2af75 +:10c7e0004400c28f1800a2af029d023cdc9a442490 +:10c7f0003000c58f3400c68f3800c78f688f400f58 +:10c80000000000003000c38fadba023cefbe4234de +:10c810000800621000000000029d023c4c9b442472 +:10c82000578f400f0000000021100000a532400b80 +:10c83000000000003800c28f080040140000000013 +:10c84000029d023c709b4424578f400f0000000063 +:10c8500021100000a532400b000000002000c28f14 +:10c86000180042242000c2af2800c0af4800c0af6b +:10c870006432400b000000002000c28f5800c32724 +:10c88000212060000c000524213040008a53400f15 +:10c89000000000005800c22721204000bb32400f9a +:10c8a000000000004c00c2af5800c2270400422420 +:10c8b00021204000bb32400f000000005000c2affa +:10c8c0005800c2270800422421204000bb32400ffc +:10c8d000000000005400c2af2000c28f0c004224b0 +:10c8e0002000c2af4c00c38fadde023cefbe42342d +:10c8f0000a00621000000000029d023ca09b44243c +:10c900002800c58f4c00c68f688f400f00000000c4 +:10c9100021100000a532400b000000005000c28f23 +:10c920000800401400000000029d023cd49b4424f7 +:10c93000688f400f0000000021100000a532400b5e +:10c94000000000002800c28f010042242800c2af6e +:10c950002800c38f3800c28f090062140000000055 +:10c96000029d023c149c4424578f400f000000009d +:10c97000010002244800c2af6732400b00000000f3 +:10c980005000c28f2000c38f211062002000c2af70 +:10c990004800c28fb8ff4010000000001800023ca1 +:10c9a000180042342000c2af2c00c0af8132400bcf +:10c9b000000000001403c3272000c28f2000c48f92 +:10c9c000010084242000c4af212060000100052460 +:10c9d000213040008a53400f000000001403c2833e +:10c9e000ff0042302400c48f21284000ea82400f1b +:10c9f000000000002400c2af2c00c28f01004224be +:10ca00002c00c2af2c00c38f3c00c28f2b106200e1 +:10ca1000e8ff4014000000002400c28f271002002d +:10ca20002400c2af2400c38f4400c28f0e006214e2 +:10ca300000000000029d023c409c44242400c58f5d +:10ca40004400c68f688f400f00000000029d023c2a +:10ca5000749c4424578f400f000000000100022402 +:10ca6000a532400b00000000029d023c9c9c442427 +:10ca70002400c58f4400c68f688f400f000000005f +:10ca8000029d023cd09c4424578f400f00000000c0 +:10ca90002110000021e8c0031c03bf8f1803be8fc4 +:10caa0002003bd270800e00300000000f8ffbd27b9 +:10cab0000400beaf21f0a003f08180af1800023c5b +:10cac000f48182af008280afe48180afe88180afe3 +:10cad000e48180af0100022421e8c0030400be8f7e +:10cae0000800bd270800e00300000000f0ffbd279c +:10caf0000c00beaf21f0a0031000c4af1000c28f25 +:10cb0000040040140000000021100000e432400b3b +:10cb1000000000001000c28f000042900000c2af71 +:10cb20000000c28f001202000000c2af1000c28fce +:10cb300001004224000042900000c38f21106200d7 +:10cb40000000c2af0000c28f001202000000c2af9e +:10cb50001000c28f02004224000042900000c38fe8 +:10cb6000211062000000c2af0000c28f001202005c +:10cb70000000c2af1000c28f0300422400004290a8 +:10cb80000000c38f211062000000c2af0000c28ffe +:10cb900021e8c0030c00be8f1000bd270800e00391 +:10cba00000000000d8ffbd272400bfaf2000beafab +:10cbb00021f0a0032800c4af1000c0a32800c28f3a +:10cbc0001400c2aff732400b00000000000000006c +:10cbd000f732400b0000000000000000a014042405 +:10cbe0001400c58fd878400f000000001400c28fd9 +:10cbf00011004010000000001800c0af1800c2274c +:10cc0000a014042421284000c878400f0000000030 +:10cc10001000c2a31000c283ecff4014000000000b +:10cc20001800c38f1400c28febff621400000000d5 +:10cc30000f33400b00000000000000002110000036 +:10cc400021e8c0032400bf8f2000be8f2800bd272d +:10cc50000800e00300000000d0ffbd272c00bfaf9c +:10cc60002800beaf21f0a0031000c0a31400c0af85 +:10cc7000c80002241800c2af010004249780400fae +:10cc8000000000001c00c2270100042421284000ed +:10cc9000c878400f000000001000c2a31000c2833b +:10cca00004004010000000001000c283a033400bbd +:10ccb000000000001c00c28f020042340100042466 +:10ccc00021284000d878400f000000001800c28fd3 +:10ccd00004004010000000001800c28fffff422433 +:10cce0001800c2af010004249780400f000000002c +:10ccf0002080838f2000c22721206000212840004f +:10cd0000c878400f000000001000c2a31000c283ca +:10cd100007004014000000001000c2831b004014f4 +:10cd2000000000002000c28f180040140000000026 +:10cd30002080828f0f0003240800431000000000b1 +:10cd40001300032409004314000000000f00022414 +:10cd5000208082af5d33400b000000000e000224f3 +:10cd6000208082af5d33400b00000000208080af48 +:10cd7000000000002080828f0400401000000000ae +:10cd80001800c28fd1ff4014000000002080828f65 +:10cd900004004014000000001000c283a033400bc8 +:10cda000000000001400c0af7833400b000000000a +:10cdb0001800c28fffff42241800c2af02000424f3 +:10cdc0009780400f000000002080838f2000c22742 +:10cdd0002120600021284000c878400f000000009a +:10cde0002000c28f040042300e00401400000000fa +:10cdf0001400c28f010042241400c2af1400c38f7c +:10ce0000030002241b006200f40140001010000027 +:10ce100004004014000000001800c28fe4ff40141a +:10ce2000000000002000c28f0400423007004014c0 +:10ce3000000000001c00c28f0200423401000424e4 +:10ce400021284000d878400f000000002000c28f49 +:10ce50000400423004004014000000001800c28f9b +:10ce600094ff4014000000001800c28f030040141b +:10ce700000000000fbff02241000c2a31000c283c8 +:10ce800021e8c0032c00bf8f2800be8f3000bd27d3 +:10ce90000800e00300000000e0ffbd271c00bfaf5a +:10cea0001800beaf21f0a0031000c0af01000424a1 +:10ceb0001000c22721284000c878400f0000000061 +:10cec0001000c28f020042300a0040100000000033 +:10ced0001000c38ffdff0224241062001000c2afb7 +:10cee0001000c28f0100042421284000d878400f90 +:10cef0000000000021e8c0031c00bf8f1800be8f97 +:10cf00002000bd270800e00300000000e8ffbd2767 +:10cf10001400bfaf1000beaf21f0a0030600042430 +:10cf2000db000524d878400f00000000070004242f +:10cf300006000524d878400f000000000a000424f1 +:10cf40009780400f00000000801404242128000076 +:10cf5000d878400f00000000841404242128000029 +:10cf6000d878400f000000000a0004249780400f8a +:10cf7000000000000600042421280000d878400f9b +:10cf8000000000000700042421280000d878400f8a +:10cf90000000000021e8c0031400bf8f1000be8f06 +:10cfa0001800bd270800e00300000000e0ffbd27d7 +:10cfb0001c00bfaf1800beaf21f0a0031400c227b1 +:10cfc0000814042421284000c878400f0000000005 +:10cfd0001000c2a31000c283040040100000000033 +:10cfe000faff02242734400b000000001400c28f17 +:10cff000000142341400c2af1400c28f081404248c +:10d0000021284000d878400f000000001000c2a383 +:10d010001000c2830400401000000000faff022448 +:10d020002734400b000000001400c227001a04241b +:10d0300021284000c878400f000000001000c2a363 +:10d040001000c2830400401000000000faff022418 +:10d050002734400b000000001400c38f0100023c85 +:10d06000251062001400c2af1400c28f001a0424fd +:10d0700021284000d878400f000000001000c2a313 +:10d080001000c2830400401000000000faff0224d8 +:10d090002734400b000000002110000021e8c003ed +:10d0a0001c00bf8f1800be8f2000bd270800e003c2 +:10d0b00000000000e0ffbd271c00bfaf1800beaf9e +:10d0c00021f0a0030c00023c0c0044342128000095 +:10d0d000d878400f000000008c10042421280000a4 +:10d0e000d878400f000000000200023cac07443436 +:10d0f00021280000d878400f000000001400c2274b +:10d100001811042421284000c878400f00000000b6 +:10d110001000c2a31000c2830300401000000000f2 +:10d12000faff02241000c2a31400c28f010042348f +:10d130001400c2af1400c28f18110424212840002b +:10d14000d878400f000000001000c2a31500023c78 +:10d150001400443401000524d878400f000000007a +:10d160001000c2a31400c227001404242128400088 +:10d17000c878400f00000000ff0043301000c29349 +:10d1800021106200ff0042301000c2a31400c28fc1 +:10d19000000442300f004010000000001400c38f54 +:10d1a000fffb0224241062001400c2af1400c28fdf +:10d1b0000014042421284000d878400f000000000b +:10d1c000ff0043301000c29321106200ff00423084 +:10d1d0001000c2a31400c28f000442341400c2af76 +:10d1e0001400c28f0014042421284000d878400f76 +:10d1f00000000000ff0043301000c29321106200c5 +:10d20000ff0042301000c2a3010004249780400fa9 +:10d21000000000001000c28321e8c0031c00bf8f83 +:10d220001800be8f2000bd270800e00300000000aa +:10d23000e0ffbd271c00bfaf1800beaf21f0a00368 +:10d24000d480828f79004014000000000010042474 +:10d25000d4808527c878400f0000000005004010ea +:10d2600000000000d48080af211000000c35400b7e +:10d2700000000000f41304241000c22721284000fd +:10d28000c878400f000000000500401000000000ba +:10d29000d48080af211000000c35400b000000004e +:10d2a000d480838f1000023ca00242340a00621432 +:10d2b000000000001000c38f010002244100621032 +:10d2c000000000001000023ca1024234d48082af72 +:10d2d000f134400b00000000d480838f1000023c2a +:10d2e000b002423413006214000000001000c38f2b +:10d2f0000300022433006210000000001000c38ffe +:10d300000400022406006214000000001000023c29 +:10d31000b1024234d48082aff134400b00000000ef +:10d320001000023cb2024234d48082aff134400b90 +:10d3300000000000d480838f1000023cf0004234d3 +:10d3400020006214000000003b00043cd4808527cc +:10d35000c878400f000000000500401000000000e9 +:10d36000d48080af211000000c35400b000000007d +:10d37000d480838f3000023cd0004234110062140c +:10d38000000000001000c38f060002240600621493 +:10d39000000000003000023cd1004234d48082af53 +:10d3a000f134400b000000001000c38f0200022483 +:10d3b00004006214000000003000023cd20042343d +:10d3c000d48082afd480838ff000023c24186200a6 +:10d3d0003000023c0c00621400000000d480838ff7 +:10d3e000f0ff023cffff423424106200d48082af81 +:10d3f000d480838f0400023c25106200d48082af69 +:10d400000b35400b00000000d480838ff0ff023cfe +:10d41000ffff423424106200d48082afd480838f17 +:10d420000500023c25106200d48082afd480828f38 +:10d4300021e8c0031c00bf8f1800be8f2000bd274d +:10d440000800e00300000000e0ffbd271c00bfafa4 +:10d450001800beaf21f0a003f41304241000c2276b +:10d4600021284000c878400f00000000050040104f +:10d47000000000001000c0af211000002235400b5a +:10d48000000000001000c28f21e8c0031c00bf8f05 +:10d490001800be8f2000bd270800e0030000000038 +:10d4a000e8ffbd271400bfaf1000beaf21f0a003fe +:10d4b0008c34400f00000000ff0f4230b002422cbd +:10d4c0000600401400000000481e042484b7023cfb +:10d4d000ce694534d878400f0000000021e8c00331 +:10d4e0001400bf8f1000be8f1800bd270800e00396 +:10d4f00000000000e0ffbd271c00bfaf1800beaf5a +:10d5000021f0a00328140424ba78400f0000000082 +:10d510001000c2af1000c38ffeff0224241062006f +:10d520001000c2af281404241000c58fd878400f13 +:10d53000000000001000c28f010042341000c2af92 +:10d54000281404241000c58fd878400f0000000074 +:10d5500021e8c0031c00bf8f1800be8f2000bd272c +:10d560000800e00300000000e0ffbd271c00bfaf83 +:10d570001800beaf21f0a0031c140424ba78400f99 +:10d58000000000001000c2af1000c28f040042343f +:10d590001000c2af1c1404241000c58fd878400faf +:10d5a000000000003d35400f0000000021e8c003ee +:10d5b0001c00bf8f1800be8f2000bd270800e003ad +:10d5c00000000000e0ffbd271c00bfaf1800beaf89 +:10d5d00021f0a0031000c0a31633400f000000008c +:10d5e0001000c2a31000c28304004010000000001d +:10d5f0001000c2838035400b000000001000c28381 +:10d6000021e8c0031c00bf8f1800be8f2000bd277b +:10d610000800e00300000000e0ffbd271c00bfafd2 +:10d620001800beaf21f0a0031000c0a31400c0afcb +:10d630007135400f000000001000c2a31000c2832b +:10d6400004004010000000001000c283e535400bcc +:10d6500000000000eb35400f000000001400c2275e +:10d660001811042421284000c878400f0000000051 +:10d670001000c2a31000c28303004010000000008d +:10d68000faff02241000c2a31400c28f010042342a +:10d690001400c2af1400c28f1811042421284000c6 +:10d6a000d878400f000000001000c2a31400c22769 +:10d6b0000014042421284000c878400f0000000016 +:10d6c000ff0043301000c29321106200ff0042307f +:10d6d0001000c2a31400c28f000442301900401091 +:10d6e000000000001400c38ffffb0224241062001e +:10d6f0001400c2af1400c28f00140424212840007b +:10d70000d878400f00000000ff0043301000c293a3 +:10d7100021106200ff0042301000c2a31400c22793 +:10d720000014042421284000c878400f00000000a5 +:10d73000ff0043301000c29321106200ff0042300e +:10d740001000c2a30c00023c0c004434212800004d +:10d75000d878400f000000008c100424212800001d +:10d76000d878400f000000000200023cac074434af +:10d7700021280000d878400f00000000081404247d +:10d780001111023c00104534d878400f0000000011 +:10d790001000c28321e8c0031c00bf8f1800be8f99 +:10d7a0002000bd270800e00300000000e0ffbd27c7 +:10d7b0001c00bfaf1800beaf21f0a0031000c0a333 +:10d7c0000014042421280000d878400f0000000035 +:10d7d000ff0043301000c29321106200ff0042306e +:10d7e0001000c2a3320004249780400f0000000004 +:10d7f0002835400f000000001000c28321e8c0035c +:10d800001c00bf8f1800be8f2000bd270800e0035a +:10d8100000000000d8ffbd272400bfaf2000beaf2e +:10d8200021f0a003211080002800c2a31000c0a393 +:10d830001400c0af1800c0af1400c0af141004240f +:10d84000ba78400f000000001400c2af1400c28f6d +:10d850000e004104000000000200023cbc074434fa +:10d86000ba78400f000000001400c2af1400c28f4d +:10d87000010042301400c2af1400c28f08004010f3 +:10d88000000000004336400b0000000001000424ab +:10d890009780400f000000000f36400b0000000092 +:10d8a0001400c0af3e36400b00000000010004240d +:10d8b0009780400f000000000c00023c0c00443434 +:10d8c000ba78400f000000001400c2af1800c28fe9 +:10d8d000010042241800c2af1800c28fd107422ca9 +:10d8e0000500401400000000fbff02241000c2a34a +:10d8f0006136400b000000001400c38fad10023ce5 +:10d900009ed04234e9ff6214000000002800c39357 +:10d910000200022407006214000000000200023c22 +:10d92000ac0744341c3c023c7dd54534d878400fcc +:10d93000000000008c34400f00000000ff0f433057 +:10d94000a003022406006214000000000200042468 +:10d95000e932400f000000005b36400b0000000081 +:10d9600021200000e932400f000000000c00023cc2 +:10d970000c00443452ef023c612f4534d878400ffc +:10d98000000000001000c28321e8c0032400bf8f04 +:10d990002000be8f2800bd270800e0030000000023 +:10d9a000d0ffbd272c00bfaf2800beaf21f0a003e1 +:10d9b000211080003000c2a31000c0a31800c0af27 +:10d9c0001400c0af8c1002241c00c2af5302023cf2 +:10d9d000362642342000c2af3000c3930200022436 +:10d9e00022006214000000000200023cac07423436 +:10d9f0001c00c2af5dd7023cc3c142342000c2af9d +:10da00009c36400b00000000020004249780400f69 +:10da1000000000001c00c38f1800c22721206000f6 +:10da200021284000c878400f00000000040040108a +:10da3000000000002000c28f0100422c1800c2af7d +:10da40001400c28f010042241400c2af1400c28f20 +:10da5000d107422c0600401400000000fbff022406 +:10da60001000c2a3a936400b000000000000000017 +:10da70002000c38f1800c28fe3ff62140000000073 +:10da80002000c38f5302023c362642340500621444 +:10da9000000000008c10042421280000d878400fda +:10daa000000000001000c28321e8c0032c00bf8fdb +:10dab0002800be8f3000bd270800e00300000000f2 +:10dac000e0ffbd271c00bfaf1800beaf21f0a003d0 +:10dad0001400c0af0a0002241100c2a31400c22720 +:10dae0000014042421284000c878400f00000000e2 +:10daf0001000c2a31400c38ffffb02242410620095 +:10db00001400c2af1400c28f001404242128400066 +:10db1000d878400f000000001000c2a31000c2839c +:10db200004004010000000001000c283f136400bda +:10db3000000000001400c227001404242128400023 +:10db4000c878400f000000001000c2a31000c2837c +:10db500004004010000000001000c283f136400baa +:10db6000000000001400c28f000442301300401077 +:10db7000000000001400c38ffffb02242410620089 +:10db80001400c2af1400c28f0014042421284000e6 +:10db9000d878400f000000001000c2a31100c2930b +:10dba000ffff42241100c2a31100c293e1ff401401 +:10dbb00000000000f036400b0000000000000000f4 +:10dbc0001000c28321e8c0031c00bf8f1800be8f65 +:10dbd0002000bd270800e00300000000e0ffbd2793 +:10dbe0001c00bfaf1800beaf21f0a00321188000b9 +:10dbf0002110a0002000c3a32400c2a31400c22748 +:10dc00000200033c0801643421284000c878400f1a +:10dc1000000000001000c2a31000c2831c004014ca +:10dc2000000000002400c293090040100000000022 +:10dc30002000c29301000324041843001400c28f83 +:10dc4000251062001400c2af1b37400b000000001b +:10dc50002000c2930100032404104300271802008f +:10dc60001400c28f241062001400c2af1400c28fcf +:10dc70000200033c0801643421284000d878400f9a +:10dc8000000000001000c2a32537400b0000000078 +:10dc9000000000001000c28321e8c0031c00bf8ff9 +:10dca0001800be8f2000bd270800e0030000000020 +:10dcb000e0ffbd271c00bfaf1800beaf21f0a003de +:10dcc000211880002110a0002000c3a32400c2a3bb +:10dcd0001400c2270200033c0001643421284000e4 +:10dce000c878400f000000001000c2a31000c283db +:10dcf0001c004014000000002400c29309004010e2 +:10dd0000000000002000c293010003240418430017 +:10dd10001400c28f251062001400c2af5037400bb0 +:10dd2000000000002000c2930100032404104300ff +:10dd3000271802001400c28f241062001400c2af22 +:10dd40001400c28f0200033c00016434212840000b +:10dd5000d878400f000000001000c2a35a37400bd3 +:10dd600000000000000000001000c28321e8c00392 +:10dd70001c00bf8f1800be8f2000bd270800e003e5 +:10dd800000000000e0ffbd271c00bfaf1800beafc1 +:10dd900021f0a003211080002400c5af2000c2a301 +:10dda0001400c2270200033c04016434212840000f +:10ddb000c878400f000000001000c2a31000c2830a +:10ddc0000b004014000000001400c38f2000c29319 +:10ddd00006104300ff00423001004230ff00433094 +:10dde0002400c28f000043a07d37400b00000000dc +:10ddf000000000001000c28321e8c0031c00bf8f98 +:10de00001800be8f2000bd270800e00300000000be +:10de1000e0ffbd271c00bfaf1800beaf21f0a0037c +:10de20002000c4af2110a0002400c2a31400c22708 +:10de30002c14042421284000c878400f0000000062 +:10de40001000c2a31000c28317004014000000009d +:10de50002400c29308004010000000002000c28f80 +:10de6000271802001400c28f241062001400c2aff1 +:10de7000a237400b000000001400c38f2000c28fa7 +:10de8000251062001400c2af1400c28f2c140424a9 +:10de900021284000d878400f000000001000c2a3e5 +:10dea000ab37400b00000000000000001000c283f0 +:10deb00021e8c0031c00bf8f1800be8f2000bd27c3 +:10dec0000800e00300000000d0ffbd272c00bfaf1a +:10ded0002800beaf21f0a0033000c4af3400c5afae +:10dee0002000c0af2400c0af1400c2279c1404243b +:10def00021284000c878400f000000001000c2a395 +:10df00001000c28338004014000000001400c38fca +:10df10000300023c251862002000c2272120600077 +:10df20002128400008000624fc78400f0000000073 +:10df30001000c2a31000c2832e0040140000000095 +:10df40002000c28f1400c2af1400c38fffff023c39 +:10df50002410620008004014000000003000c48f4c +:10df60002128000006000624f27a400f000000007d +:10df7000fe37400b000000001400c28f02140200a4 +:10df80001400c2af1400c38f0300023c25186200c6 +:10df90001800c22721206000212840000600062426 +:10dfa000fc78400f000000001000c2a31800c22738 +:10dfb0003000c48f2128400006000624b57a400fa7 +:10dfc000000000003400c28f040040100000000078 +:10dfd0003400c28f01000324000043a01000c2835c +:10dfe0000438400b0000000000000000fe37400b2a +:10dff00000000000000000003400c28f0300401049 +:10e00000000000003400c28f000040a01000c28356 +:10e0100021e8c0032c00bf8f2800be8f3000bd2731 +:10e020000800e00300000000d0ffbd272c00bfafb8 +:10e030002800beaf21f0a0033000c4af2000c0af65 +:10e040002400c0af1400c2279c14042421284000df +:10e05000c878400f000000001000c2a31000c28367 +:10e0600026004014000000001400c38f0300023c8f +:10e07000251862002000c2272120600021284000ce +:10e0800008000624fc78400f000000001000c2a326 +:10e090001000c2831c004014000000002000c28f4a +:10e0a0001400c2af1400c28fffff42301400c2af91 +:10e0b0001400c38f0300023c251862001800c22719 +:10e0c000212060002128400006000624fc78400f33 +:10e0d000000000001000c2a31800c2273000c48f47 +:10e0e0002128400006000624b57a400f00000000f9 +:10e0f0001000c2834438400b000000000000000004 +:10e100004338400b00000000000000001000c283f4 +:10e1100021e8c0032c00bf8f2800be8f3000bd2730 +:10e120000800e00300000000f8ffbd270400beafb8 +:10e1300021f0a00393808293ff004230010042242b +:10e14000ff004230938082a321e8c0030400be8f09 +:10e150000800bd270800e00300000000e0ffbd2725 +:10e160001c00bfaf1800beaf21f0a0031000c0a379 +:10e1700001000424b080400f000000008c34400fe8 +:10e180000000000021184000f0ff023c00f0423483 +:10e19000241862003000023c0800621400000000f5 +:10e1a000a810042401000524d878400f00000000c6 +:10e1b0001000c2a38438400b000000001400c227e6 +:10e1c0007010042421284000c878400f000000008f +:10e1d0001000c2a31000c2830c0040140000000015 +:10e1e0001400c28f020042341400c2af1400c28f68 +:10e1f0007010042421284000d878400f000000004f +:10e200001000c2a38438400b000000000000000092 +:10e210001000c28321e8c0031c00bf8f1800be8f0e +:10e220002000bd270800e00300000000f8ffbd2724 +:10e230000400beaf21f0a003211880002110a0002f +:10e240001000c6af0800c3a30c00c2a721e8c0039a +:10e250000400be8f0800bd270800e0030000000096 +:10e26000e0ffbd271c00bfaf1800beaf21f0a00328 +:10e270001000c0a391808293ff0042301900401427 +:10e280000000000090808293ff00433003000224ce +:10e29000060062100000000090808293ff0043306f +:10e2a000040002240f006214000000001633400f27 +:10e2b000000000001000c2a31000c2831000401430 +:10e2c000000000007410042478560524d878400f0c +:10e2d000000000001000c2a31000c2830b00401415 +:10e2e0000000000091808293ff0042300100422430 +:10e2f000ff004230918082a3c438400b0000000030 +:10e3000000000000c438400b0000000000000000c6 +:10e310001000c28321e8c0031c00bf8f1800be8f0d +:10e320002000bd270800e00300000000f8ffbd2723 +:10e330000400beaf21f0a003211080000800c2a39a +:10e340000800c293908082a321e8c0030400be8f1e +:10e350000800bd270800e00300000000f8ffbd270b +:10e360000400beaf21f0a00390808293ff004230f2 +:10e3700021e8c0030400be8f0800bd270800e003a9 +:10e3800000000000e0ffbd271c00bfaf1800beafbb +:10e3900021f0a0031000c0a391808293ff004230bf +:10e3a000060040100000000091808293ff00423080 +:10e3b000ffff4224ff004230918082a3918082932c +:10e3c000ff00423031004014000000009080829332 +:10e3d000ff0043300300022406006210000000002a +:10e3e00090808293ff0043300400022427006214cf +:10e3f000000000001400c0af741004242143052461 +:10e40000d878400f000000001000c2a31000c283a3 +:10e410001a004014000000001400c2270100042468 +:10e4200021284000c878400f000000001000c2a35f +:10e430001000c28314004014000000001400c28fba +:10e440000200423011004010000000001400c38f91 +:10e45000fdff0224241062001400c2af1400c28f1a +:10e460000100042421284000d878400f000000005b +:10e470001000c2a32339400b000000000000000080 +:10e480002339400b00000000000000001000c28390 +:10e4900021e8c0031c00bf8f1800be8f2000bd27dd +:10e4a0000800e00300000000e8ffbd271400bfaf34 +:10e4b0001000beaf21f0a0031800c4af988080af59 +:10e4c0009c8080af918080a3908080a3938080a364 +:10e4d000019d023c28e14424a580400f000000007b +:10e4e000958080a303000424019d023c2ce2452476 +:10e4f000193d400f000000002110000021e8c0037a +:10e500001400bf8f1000be8f1800bd270800e00365 +:10e5100000000000e0ffbd271c00bfaf1800beaf29 +:10e5200021f0a0032000c4af1000c0a39838400f12 +:10e53000000000001000c2a3908080a3918080a3ff +:10e54000928080a3938080a3988080af9c8080afce +:10e55000a08080afa88080af1000c28321e8c003f4 +:10e560001c00bf8f1800be8f2000bd270800e003ed +:10e5700000000000f0ffbd270c00beaf21f0a0039b +:10e58000211080001000c2a7f3ff02240000c2a3e4 +:10e590001000c29782130200ffff4230ff0042309a +:10e5a00003004330020002240a006214000000004d +:10e5b0001000c29702120200ffff4230ff004230fb +:10e5c0003f004330010002240200621400000000fa +:10e5d0000000c0a30000c28321e8c0030c00be8f6e +:10e5e0001000bd270800e00300000000e0ffbd2789 +:10e5f0001c00bfaf1800beaf21f0a0031000c0a3e5 +:10e600001200c0a71200c2272120400021280000cc +:10e61000b06b400f000000001000c2a31000c283c6 +:10e6200033004014000000001200c2972120400077 +:10e630005d39400f000000001000c2a31000c2832b +:10e640002a004014000000001200c297ff00423070 +:10e6500001000324140043100000000002004328be +:10e6600005006010000000000b00401000000000da +:10e67000b739400b00000000020003240e004310d5 +:10e6800000000000030003240f00431000000000fe +:10e69000b739400b0000000001000224958082a3de +:10e6a000bc39400b0000000002000224958082a3c8 +:10e6b000bc39400b0000000002000224958082a3b8 +:10e6c000bc39400b0000000003000224958082a3a7 +:10e6d00000000000bc39400b0000000003000224d1 +:10e6e000958082a3bc39400b00000000958080a378 +:10e6f0001000c28321e8c0031c00bf8f1800be8f2a +:10e700002000bd270800e00300000000f0ffbd2747 +:10e710000c00beaf21f0a003211880002110a00042 +:10e720001000c3a31400c2a31000c2930012020081 +:10e73000201e027c1400c2932016027c2510620069 +:10e740002016027c0200c2a70200c39769040224bb +:10e7500005006210000000000200c3976804022454 +:10e76000040062140000000021100000fa39400b80 +:10e770000000000095808293040040140000000017 +:10e78000ffff0224fa39400b0000000095808293bd +:10e790000000c2a3f539400b000000000000c29346 +:10e7a0004018020014808227211062000000429469 +:10e7b0000200c3970400621400000000ffff02245f +:10e7c000fa39400b000000000000c293010042240f +:10e7d0000000c2a30000c2930300422cefff4014cc +:10e7e000000000002110000021e8c0030c00be8fd3 +:10e7f0001000bd270800e00300000000c8ffbd278f +:10e800003400bfaf3000beaf21f0a0032140800034 +:10e810004000c6af2120e0004c00c38f5000c28fe3 +:10e820003800c8a33c00c5a34400c4a72800c3a760 +:10e830002c00c2a7ffff02241000c2a33c00c29319 +:10e840007f004230ff0042301500c2a33800c2935f +:10e850001400c2a3080002241600c2a74800c28ff9 +:10e860000c004010000000001600c297ffff43306c +:10e870002c00c4972800c29721108200ffff42306d +:10e8800021106200ffff42301600c2a72b3a400b56 +:10e89000000000001600c297ffff43304400c297fb +:10e8a00021106200ffff42301600c2a71400c2937d +:10e8b000ff004230211840001500c293ff00423093 +:10e8c0002120600021284000c339400f00000000d3 +:10e8d0001000c2a31000c283e20040140000000038 +:10e8e0009838400f000000001000c2a31000c2833f +:10e8f000df004014000000001c00c0af2000c0a7d3 +:10e900001800c0af3800c3931800c28f25106200f2 +:10e910001800c2af3c00c293001a02001800c28f58 +:10e92000251062001800c2af1600c297ffff4230e8 +:10e93000001c02001800c28f251062001800c2af30 +:10e940001800c28f8c10042421284000d878400f72 +:10e95000000000001000c2a31000c283c7004014d2 +:10e96000000000001800c0af1800c28f020042343f +:10e970001800c2af1800c28f78100424212840006c +:10e98000d878400f000000001000c2a31000c2831e +:10e99000bd004014000000008c34400f0000000057 +:10e9a00021184000f0ff023c00f0423424186200bd +:10e9b0003000023c0900621400000000ac10042486 +:10e9c00001000524d878400f000000001000c2a309 +:10e9d0001000c283af004014000000001c00c0af54 +:10e9e0002000c0a7a23a400b000000001800c22778 +:10e9f0007810042421284000c878400f000000004f +:10ea00001000c2a31000c2832600401400000000c2 +:10ea10001800c28f020042300e00401400000000b7 +:10ea20001c00c2271500033c000464342128400068 +:10ea3000c878400f000000001000c2a31000c2837d +:10ea40001b004010000000001c00c0afad3a400b9e +:10ea5000000000002000c297ffff4230e803422c74 +:10ea60000400401400000000050004249780400fbb +:10ea7000000000002000c297ffff42300100422446 +:10ea8000ffff42302000c2a72000c297ffff4230a4 +:10ea90008813422cd5ff401400000000ad3a400b13 +:10eaa0000000000000000000ad3a400b0000000034 +:10eab000000000001c00c28f610040100000000038 +:10eac0001c00c28f2400c2af1600c297ffff423065 +:10ead0001600c2a72400c38f1400c22721206000a3 +:10eae00021284000080006245979400f000000004a +:10eaf0001000c2a31000c28369004014000000008f +:10eb00002400c28f080042242400c2af4000c28ffc +:10eb100010004010000000002400c38f4400c29782 +:10eb2000212060004000c58f213040005979400ffe +:10eb3000000000001000c2a31000c2835b0040145c +:10eb4000000000004400c3972400c28f211062001f +:10eb50002400c2af4800c28f170040100000000020 +:10eb60002c00c3974400c297231062002118400074 +:10eb70002400c28f211062002400c2af2400c38f82 +:10eb80002800c297212060004800c58f2130400036 +:10eb90005979400f000000001000c2a31000c2838a +:10eba00045004014000000002800c3972400c28fd5 +:10ebb000211062002400c2af1c00c28f801002002e +:10ebc0001800c2af1800c28f020042341800c2af52 +:10ebd0001800c28f6c10042421284000d878400f00 +:10ebe000000000001000c2a31000c28335004014d2 +:10ebf000000000008c34400f00000000211840008d +:10ec0000f0ff023c00f04234241862003000023c65 +:10ec10000f00621400000000b0100424010005245d +:10ec2000d878400f000000001000c2a31000c2837b +:10ec30000700401000000000323b400b00000000c5 +:10ec4000fdff02241000c2a3323b400b0000000075 +:10ec5000e138400f000000001000c2a3323b400b1f +:10ec60000000000000000000323b400b00000000ec +:10ec700000000000323b400b0000000000000000dc +:10ec8000323b400b0000000000000000323b400b14 +:10ec90000000000000000000323b400b00000000bc +:10eca00000000000323b400b0000000000000000ac +:10ecb000323b400b0000000000000000323b400be4 +:10ecc00000000000000000001000c28321e8c00323 +:10ecd0003400bf8f3000be8f3800bd270800e0032e +:10ece00000000000d8ffbd272400bfaf2000beaf4a +:10ecf00021f0a0031000c0a31400c2277010042448 +:10ed000021284000c878400f000000001000c2a376 +:10ed10001000c283f8004014000000001400c28fed +:10ed200001004230ff004230f300401000000000bc +:10ed300021200000b080400f000000001400c22716 +:10ed40007010042421284000c878400f0000000003 +:10ed50001000c2a31000c283e300401400000000b2 +:10ed60001400c38ffeff0224241062001400c2afff +:10ed70001400c28f7010042421284000d878400f5e +:10ed8000000000001000c2a31000c283d90040148c +:10ed9000000000001400c227701004242128400045 +:10eda000c878400f000000001000c2a31000c2830a +:10edb000060040100000000001000424b080400f55 +:10edc000000000003e3c400b00000000928080a349 +:10edd0001400c28f82100200ffff4230ff0f42304a +:10ede0001200c2a71200c297bb0040100000000032 +:10edf0001c00c0af1c00c22784100424212840003e +:10ee0000c878400f000000001000c2a31000c283a9 +:10ee1000060040100000000001000424b080400ff4 +:10ee2000000000003e3c400b000000001c00c38faf +:10ee30001800c22721206000212840000400062479 +:10ee4000fc78400f000000001000c2a31a00c29717 +:10ee5000ffff42301a00c2a71000c2830600401014 +:10ee60000000000001000424b080400f00000000fa +:10ee70003e3c400b000000001a00c297ffff4230ea +:10ee80001200c3970f006210000000001200c39729 +:10ee90001a00c297ffff423023106200050042288b +:10eea000080040140000000001000424b080400f5e +:10eeb00000000000faff02241000c2a33e3c400bf9 +:10eec000000000001800c293ff004330010002243c +:10eed00014006214000000009880828f75004010ba +:10eee000000000009880828f1900c393ff006330f8 +:10eef000212060001a00c397ffff6330f8ff6324ee +:10ef0000ffff6330212860001c00c38f08006324ca +:10ef10002130600009f84000000000002d3c400b4b +:10ef2000000000001800c293ff00433002000224da +:10ef300014006214000000009c80828f5d0040106d +:10ef4000000000009c80828f1900c393ff00633093 +:10ef5000212060001a00c397ffff6330f8ff63248d +:10ef6000ffff6330212860001c00c38f080063246a +:10ef70002130600009f84000000000002d3c400beb +:10ef8000000000001800c293ff0043300400022478 +:10ef90001400621400000000a080828f4500401021 +:10efa00000000000a080828f1900c393ff0063302f +:10efb000212060001a00c397ffff6330f8ff63242d +:10efc000ffff6330212860001c00c38f080063240a +:10efd0002130600009f84000000000002d3c400b8b +:10efe000000000001800c293ff0043300600022416 +:10eff0001400621400000000a480828f2d004010d5 +:10f0000000000000a480828f1900c393ff006330ca +:10f01000212060001a00c397ffff6330f8ff6324cc +:10f02000ffff6330212860001c00c38f08006324a9 +:10f030002130600009f84000000000002d3c400b2a +:10f04000000000001800c293ff00433005000224b6 +:10f050001400621400000000ac80828f1500401084 +:10f0600000000000ac80828f1900c393ff00633062 +:10f07000212060001a00c397ffff6330f8ff63246c +:10f08000ffff6330212860001c00c38f0800632449 +:10f090002130600009f84000000000002d3c400bca +:10f0a00000000000faff02241000c2a33e3c400b07 +:10f0b0000000000092808293ff0042300e00401456 +:10f0c000000000005738400f000000001000c2a3ed +:10f0d0003e3c400b00000000feff02241000c2a3d3 +:10f0e0003e3c400b00000000000000003e3c400b96 +:10f0f00000000000000000001000c28321e8c003ef +:10f100002400bf8f2000be8f2800bd270800e00329 +:10f1100000000000f8ffbd270400beaf21f0a003ef +:10f1200001000224948082a321e8c0030400be8f62 +:10f130000800bd270800e00300000000e0ffbd2735 +:10f140001c00bfaf1800beaf21f0a0031000c0a389 +:10f1500093808293ff0042302400401000000000a2 +:10f160009838400f000000001000c2a31000c283b6 +:10f170001e00401400000000948080a3703c400bef +:10f180000000000093808293ff004230ffff422482 +:10f19000ff004230938082a3693c400b00000000d6 +:10f1a00000000000393b400f000000001000c2a327 +:10f1b0001000c283faff40140000000000000000ad +:10f1c00093808293ff004230050040100000000051 +:10f1d00094808293ff004230eaff4010000000005c +:10f1e000e138400f000000001000c2a31000c283ed +:10f1f00021e8c0031c00bf8f1800be8f2000bd2770 +:10f200000800e00300000000d8ffbd272400bfafc6 +:10f210002000beaf21f0a0032800c4af2c00c5af72 +:10f220002118c0002110e0003000c3a73400c2a3a1 +:10f230001000c0a32800c28f07004010000000008b +:10f240002c00c28f04004010000000003000c29764 +:10f2500019004014000000003400c2931200401056 +:10f260000000000001000224928082a35738400f62 +:10f27000000000001000c2a32800c28f0a00401442 +:10f28000000000002c00c28f0700401400000000a6 +:10f290003000c2970400401400000000211000005c +:10f2a000133d400b00000000f4ff02241000c2a335 +:10f2b000123d400b000000001800c227701004240b +:10f2c00021284000c878400f000000001000c2a3b1 +:10f2d0001000c28355004014000000001800c28fc7 +:10f2e00082100200ffff4230ff0f42301200c2a71f +:10f2f0001400c2278410042421284000c878400f3d +:10f30000000000001000c2a31000c2834a00401495 +:10f31000000000003000c2972800c48f2c00c58f69 +:10f3200021304000fc78400f000000001000c2a314 +:10f330001000c28343004014000000003000c39757 +:10f340001200c2972b10430005004010000000007f +:10f35000f4ff02241000c2a3123d400b0000000085 +:10f360001400c28f2800c38f2b1062000a004014c3 +:10f37000000000003000c3972800c28f21186200ef +:10f380001200c4971400c28f211082002b1043007a +:10f390000500401000000000f4ff02241000c2a38a +:10f3a000123d400b000000003400c29318004014ce +:10f3b000000000001200c3971400c28f21186200e1 +:10f3c0003000c4972800c28f211082001000621004 +:10f3d000000000003000c3972800c28f2110620097 +:10f3e0000300423004000324231862001200c49773 +:10f3f0001400c28f212082003000c5972800c28fe0 +:10f400002110a200231082000f00621400000000ef +:10f4100001000224928082a35738400f00000000b0 +:10f420001000c2a3123d400b0000000000000000cd +:10f43000123d400b0000000000000000123d400b98 +:10f4400000000000000000001000c28321e8c0039b +:10f450002400bf8f2000be8f2800bd270800e003d6 +:10f4600000000000f0ffbd270c00beaf21f0a0039c +:10f47000211080001400c5af1000c2a30000c0a37b +:10f480001000c2930700432c27006010000000000a +:10f4900080180200019d023cacf44224211062005d +:10f4a0000000428c080040000000000028f5009d8c +:10f4b000d8f4009dc8f4009df8f4009de8f4009d88 +:10f4c00018f5009d08f5009d1400c28f9c8082af46 +:10f4d0004d3d400b000000001400c28f988082afa9 +:10f4e0004d3d400b000000001400c28fa08082af91 +:10f4f0004d3d400b000000001400c28fa88082af79 +:10f500004d3d400b000000001400c28fa48082af6c +:10f510004d3d400b000000001400c28fac8082af54 +:10f520004d3d400b00000000f4ff02240000c2a388 +:10f53000000000000000c28321e8c0030c00be8f61 +:0cf540001000bd270800e00300000000e0 +:020000040000fa +:020000041d00dd +:10f54c0098ffbd27211000004800b2af4400b1afb6 +:10f55c004000b0af6400bfaf6000beaf5c00b7af9f +:10f56c005800b6af5400b5af5000b4af4c00b3afb9 +:10f57c00219080002188a0007000a6af3000a2afbf +:10f58c0021800000000024826b0080101000a4a3d6 +:10f59c00250002243802821401003326020024269e +:10f5ac00ffff82802d000624211800003000082463 +:10f5bc00200007242b0009242c024610ffff912465 +:10f5cc002e0045282202a0100000000033024750f4 +:10f5dc00010063342f02495002006334029d053c44 +:10f5ec007829a5242120a20002006630feff653098 +:10f5fc00010084900b18a60008006630fbff6530f4 +:10f60c0004008430270280100b18a60021a00000f3 +:10f61c0040201400c0a0140021a094000100312649 +:10f62c0021a08202029d073c000022827829e72457 +:10f63c002120e2000100849004008430f4ff801447 +:10f64c00d0ff94262e0004241c02445001003126c5 +:10f65c000010633421980000100007240080062459 +:10f66c00ff0044307900852c1000a2a33f00a014a9 +:10f67c00010031261000b527010016240400601289 +:10f68c002b10d4022b1076020bb062022b10d4027a +:10f69c000200405021a0000023a096020800773001 +:10f6ac001300e016ffff1324b53d400bffff94261b +:10f6bc003389400f21284002271002000100032645 +:10f6cc000b806200ffff9426f9ff931620000424a0 +:10f6dc00bf3d400bffff13243389400f212840020c +:10f6ec0027100200010003260100b5260b806200e2 +:10f6fc00ffffd626f8ffd3560000a482a2ffe052eb +:10f70c0000002482cb3d400bffff13243389400fb4 +:10f71c002128400227100200010003260b80620002 +:10f72c00ffff9426f9ff9316200004240000248286 +:10f73c0097ff80141000a4a36400bf8f2110000257 +:10f74c006000be8f5c00b78f5800b68f5400b58f29 +:10f75c005000b48f4c00b38f4800b28f4400b18f6f +:10f76c004000b08f0800e0036800bd27019d023cfb +:10f77c0094f7422480200400212044000000828c55 +:10f78c00080040000000000044f7009d80f6009d3a +:10f79c0080f6009d80f6009d80f6009d80f6009d11 +:10f7ac0080f6009d80f6009d80f6009d80f6009d01 +:10f7bc0080f6009d80f6009d80f6009d80f6009df1 +:10f7cc0080f6009d80f6009d80f6009d80f6009de1 +:10f7dc0080f6009d80f6009d80f6009d80f6009dd1 +:10f7ec0080f6009d80f6009d80f6009d80f6009dc1 +:10f7fc0080f6009d80f6009d80f6009d80f6009db1 +:10f80c0080f6009d80f6009d80f6009d80f6009da0 +:10f81c0080f6009d80f6009d80f6009d80f6009d90 +:10f82c0080f6009d80f6009d80f6009d80f6009d80 +:10f83c0080f6009d80f6009d80f6009d80f6009d70 +:10f84c0080f6009d80f6009d80f6009d80f6009d60 +:10f85c0080f6009d80f6009d80f6009d80f6009d50 +:10f86c0080f6009d80f6009d80f6009d80f6009d40 +:10f87c0080f6009d80f6009d80f6009d80f6009d30 +:10f88c0080f6009d80f6009d80f6009d80f6009d20 +:10f89c0080f6009d80f6009d80f6009d80f6009d10 +:10f8ac0080f6009d80f6009d80f6009d80f6009d00 +:10f8bc0080f6009d80f6009d80f6009d80f6009df0 +:10f8cc0080f6009d80f6009d80f6009d80f6009de0 +:10f8dc0080f6009d80f6009d80f6009d80f6009dd0 +:10f8ec0080f6009d80f6009d5cfb009d80f6009ddf +:10f8fc0080f6009d80f6009d80f6009d80f6009db0 +:10f90c0080f6009d80f6009d80f6009d80f6009d9f +:10f91c0080f6009db0fd009d7cf9009d80f6009d59 +:10f92c00a8fd009d80f6009d80f6009d7cf9009d51 +:10f93c0080f6009d80f6009d40fe009d80f6009da7 +:10f94c0080f6009d38fe009d5cfb009d80f6009dbe +:10f95c0080f6009df8fd009d80f6009d78f9009dd5 +:10f96c0080f6009d80f6009d60fb009dc000633416 +:10f97c00000762307b00401021f060000010653001 +:10f98c0006000424100062303b0240100b988500e6 +:10f99c007000a28f07004424f8ff02242410820078 +:10f9ac000000448c0400458c080042243c00a3afaa +:10f9bc009785400f7000a2af3c00a38f21a8400098 +:10f9cc002120a00221280000d78c400f3c00a3afbf +:10f9dc00040041043c00a38f0080023c26a8550083 +:10f9ec0003007e342120a00221280000d78c400f78 +:10f9fc001800a0aff402401421b000001900622ad4 +:10fa0c003e0040100a00c22aff0077326e00e22e40 +:10fa1c00320240140b00e22eeb51033c1f85633481 +:10fa2c001900e302029d063c10180000f439c624ac +:10fa3c0042190300120062248010020021104600bb +:10fa4c000000448c029d023c502d458c3c00a3af21 +:10fa5c001f86400f3800a6af3c00a38f3800a68f3e +:10fa6c008020030000190300211883008028030064 +:10fa7c00212865002328e502cccc033ccdcc633493 +:10fa8c00ff00a5301900a300212040001028000021 +:10fa9c003c00a3afc21005000900422480100200f4 +:10faac00211046001f86400f0000458c3c00a38fa0 +:10fabc00212040001900e3023800a68f1018000026 +:10facc00c218030040100300c018030021104300ab +:10fadc002310e202ff004230801002002130460069 +:10faec001f86400f0000c58c2120a0027281400fa0 +:10fafc002128400021a840000a00c22a1101401010 +:10fb0c00029d023c2120a002d78c400f212800002e +:10fb1c0004014014000000008a8d400f2120a00237 +:10fb2c002120400021280000c38b400f21b8400049 +:10fb3c00212840007081400f2120a00221b04000fc +:10fb4c0021a8e0021800a0afe93f400b21180000eb +:10fb5c0020006334800063340007623087ff401458 +:10fb6c0021f06000c0006230c80140142016037cf4 +:10fb7c002c03400410006230f80140107000a78f75 +:10fb8c007000a58f0000a48c0400a524c3170400ea +:10fb9c007000a5af21a880000302400421f04000b2 +:10fbac0003006016c00077302598be020100732e4a +:10fbbc0040000224c502e2124100e22a7c024010fd +:10fbcc00800002241600e0161000a283010002241b +:10fbdc004603c0131000a2a3029d043cb82c84243d +:10fbec000200072402000224003f400b14000824ea +:10fbfc00213840000400858c2b30c5032c03c054e5 +:10fc0c001000a7a32603be500000858c01004224df +:10fc1c002014027cf6ff4814080084241000a2a3d0 +:10fc2c002a2053005e0280102a2062022014137cca +:10fc3c001000a2a305008012004064300300653060 +:10fc4c00ffff84260ba08500004064300600801066 +:10fc5c002a2054002a2074020200805021a00000a7 +:10fc6c0023a093022a205400160280500400623014 +:10fc7c00231082022000a2af040062301402401054 +:10fc8c002000a28f02006230d202401001006230cc +:10fc9c00010065302d0002242b0004240b204500ac +:10fcac00212840023389400f3c00a3af27100200eb +:10fcbc00010004263c00a38f0b8082002000a28f41 +:10fccc00c001401430000424080064303400a4af98 +:10fcdc00ffff7326029d023cc0201300a82c562463 +:10fcec0021b0c4024010130040201e004100e52a40 +:10fcfc002000633080a013002800a4af219853008b +:10fd0c002400a5af5d3f400b2c00a3af0e00e01606 +:10fd1c001000a4830000c68e0400c78e2120a00210 +:10fd2c00a279400f2128c003212040002128600027 +:10fd3c000a0006247677400f213800003000422458 +:10fd4c002024027c1000a4a33389400f21284002f8 +:10fd5c0027100200010003260b806200f8ffd62654 +:10fd6c00fcff9426fdff7326fdff0224c3016212e3 +:10fd7c0040000224b301e2122400a78fe3ffe01439 +:10fd8c00800002249d01e212c0000224e1ffe21275 +:10fd9c001000a483553f400b000000005f3e400b59 +:10fdac00000463347000a78f100066300100e280fd +:10fdbc000000e58c0400e4247601c0101000a2a31e +:10fdcc00750140501400a5a3ffff06247201465094 +:10fddc001400a5a31400a2a31500a5a302001624c9 +:10fdec001400b527a23d400b7000a4af7000a58f86 +:10fdfc000000a48c0400a524a002801021a880007f +:10fe0c0000008280b20240507000a5af21b000000b +:10fe1c000100d6262110960000004280fdff4054c0 +:10fe2c000100d626a23d400b7000a5af5f3e400bf3 +:10fe3c0040006334100062302120c0000a20e20030 +:10fe4c0025188300ffff63309b3d400b000022828e +:10fe5c00e3fd4814029d053c040063340100842436 +:10fe6c00ffff8280d6fd4614ffff91240800633407 +:10fe7c009b3f400b010084243389400f2128400212 +:10fe8c00ffff0324bffd431021886002643d400b3b +:10fe9c00010010269b3f400b010084249b3f400b2c +:10feac00010084242a000424020144102e0004249e +:10febc00e7fd441421a0000001003126000022823d +:10fecc002a000424e001441000406334029d053ce8 +:10fedc007829a5242120a2000100849004008430fc +:10feec00dcfd80102198000040201300c098130006 +:10fefc00219893000100312621986202029d053c55 +:10ff0c00000022827829a5242120a20001008490df +:10ff1c0004008430f4ff8014d0ff73269a3d400b0c +:10ff2c00100007248a8d400f2120a002fdfe4014f2 +:10ff3c00212040000200c32afbfe6014212800008f +:10ff4c00029d023c542d42243000a48fd78c400fcc +:10ff5c000000458cdf004004edffc326eeffc326f6 +:10ff6c001800a3af2024037cc880400f3c00a3af33 +:10ff7c00212840002120a0020b85400f3000a2afa9 +:10ff8c008a8d400f212040003c00a38f21b84000f7 +:10ff9c0021a8400021b00000010004240a00e22e38 +:10ffac00490240141000a4a3029d043cb82c8424e4 +:10ffbc00211000000200052402000724f53f400b2d +:10ffcc00120009242138a0000400868c7601c0148c +:10ffdc00020048240000868c2b30e6027201c0140b +:10ffec00010042240100e524202c057cf5ff491476 +:10fffc00080084241000a5a31400082423b883024d +:020000041d01dc +:10000c0023b8f30223b8e802ffffe2260bb8530033 +:10001c000300c433ffffe3260400c2334501401044 +:10002c000bb864000200c233e60140100100c23379 +:10003c000100c4332d0002242b0003240a10640099 +:10004c00212040003389400f212840022710020054 +:10005c00010003260b8062000a00e05a0800de3320 +:10006c00300004243389400f21284002271002005d +:10007c0001000326fffff726f9ffe0160b80620054 +:10008c000800de332000beaf029d043c3a40400b1a +:10009c00a82c9424c0180300211883020000668c3d +:1000ac000400678c2120a002a279400f21280000b7 +:1000bc0021204000212860000a0006247677400f9a +:1000cc0021380000300044243389400f212840029d +:1000dc0027100200010003260b8062001000a2838f +:1000ec00ffff4324201c037ceaff40141000a3a351 +:1000fc001800a28f0c0040181300622a3000042450 +:10010c003389400f212840021800a48f01000326d8 +:10011c0027100200ffff84240b806200f7ff801c75 +:10012c001800a4af1300622afc0040142014137ca6 +:10013c00120002241000a2a3eeff73262e0004244a +:10014c003389400f21284002ffff03240200431093 +:10015c001000b48301001026c880400f21208002bb +:10016c00212040001f86400f2128c0028a8d400f9d +:10017c002120400021a84000ffff82262014027c91 +:10018c0021f00000230080121000a2a3029d053c68 +:10019c00a82cb624c01002002110c2020000468c0c +:1001ac000400478c2120a002a279400f2128c00313 +:1001bc00212040000a000624213800007677400fe9 +:1001cc0021286000300044243389400f212840024c +:1001dc001000b48327100200c01814002118c302a9 +:1001ec000000668c0400678c2128c00301000326e4 +:1001fc002120a0027677400f0b80620021a84000de +:10020c00ffff82262014027c21f06000e1ff8016a3 +:10021c001000a2a30a0060122000a78f3000042453 +:10022c003389400f212840022710020001000326c9 +:10023c00ffff7326f9ff60160b8062002000a78f6a +:10024c00d1fce05000002482cffce05a0000248254 +:10025c00200004243389400f21284002271002007b +:10026c0001000326fffff726f9ffe0160b80620062 +:10027c00653d400b000024827000a48f0000958c1b +:10028c0004008424733e400b7000a4af5c01400456 +:10029c00100062303a0040107000a78f7000a58fdc +:1002ac0021f000000000b58c0400a524eb3e400baf +:1002bc007000a5af7000a48f7000a28f01003126d2 +:1002cc00040084240000548c00002282943d400bd6 +:1002dc007000a4afdc3f400b1800a3af5e0140548c +:1002ec00029d023ccccc033ccdcc63341900e30220 +:1002fc00029d063c10180000f439c624c2180300f5 +:10030c000900622480100200211046000000448c79 +:10031c00029d023c502d458c3c00a3af1f86400f24 +:10032c003800a6af3c00a38f3800a68f40200300f6 +:10033c00c0180300211883002318e302ff00633068 +:10034c0080180300213066000000c58c1f86400f0a +:10035c0021204000be3e400b2120a0020000e48c76 +:10036c000400e724c31704007000a7af21a8800085 +:10037c000bfe410421f04000ee40400b23a804008a +:10038c0021f000000000f58c0400e724eb3e400b4c +:10039c007000a7af1400a5a3010016241400b52704 +:1003ac00a23d400b7000a4af23a804002b20150025 +:1003bc002310020003006334eb3e400b23f0440097 +:1003cc0030000424212840023389400f3c00a3afa5 +:1003dc002000a58f2710020001000426ffffa52492 +:1003ec002000a5af0b808200f5ffa0143c00a38f6a +:1003fc0008006730373f400b3400a7af2c00a28faa +:10040c001c004050029d053c029d043c802c832422 +:10041c002800a78f272014000420870006109502bf +:10042c00251082002000853206209e020b108500cc +:10043c000f0042302110620000004480553f400bf9 +:10044c001000a4a32800a38f27101300041043004e +:10045c0006207502252044002000633206107e021f +:10046c000b2043000700843030008424553f400ba0 +:10047c001000a4a30741400b942ca3243400a48f98 +:10048c0041fc8050000024822000a58f3efca05827 +:10049c0000002482200004243389400f21284002cc +:1004ac002000a78f2710020001000326ffffe7247e +:1004bc002000a7aff7ffe0140b806200653d400bf6 +:1004cc0000002482effd40142000a0af2000a28f7a +:1004dc009c00401408006530080064303400a4af60 +:1004ec000200623093004010010062300100653060 +:1004fc002d0002242b0004240b204500212840024f +:10050c003389400f3c00a3af2710020001000426e2 +:10051c000b808200373f400b3c00a38f1000a2a33e +:10052c0006ff401423986202ffff02248840400b10 +:10053c001000a2a30800c3330b0060142000a3af6b +:10054c000a00e01a0200c233200004243389400f51 +:10055c00212840022710020001000326fffff72686 +:10056c00f9ffe0160b8062000200c233910040508c +:10057c000100de330100c4332d0002242b000324c0 +:10058c000a106400212040003389400f21284002ca +:10059c0027100200010003262540400b0b8062004f +:1005ac00103f400b0b9844000240400b1000a5a3d9 +:1005bc002c00e212c000022484fde2121000a2837f +:1005cc000c3f400b2a2053001800a527488d400fe4 +:1005dc002120a0021800a28f6666043cffff422473 +:1005ec004018020021106200676684241800440041 +:1005fc00c3170200102000008320040023b08200e7 +:10060c000000c32affffc2260bb0430023201600b4 +:10061c00c880400f2024047c212040001f86400ffe +:10062c002128a0023000a2af029d023c482d458c2f +:10063c00d78c400f3000a48f6a004104029d023c0d +:10064c00823e400bffffd6267000a78f010031269b +:10065c000000f38c0400e72400002282993d400b3b +:10066c007000a7af01000224a500c0131000a2a3c4 +:10067c0002000224020007240001042421280000a7 +:10068c00ab41400b10000824003105000039040078 +:10069c00253026012120e0002128c000213840000f +:1006ac002b30c5035efdc0541000a2a38200c513fd +:1006bc002b30a4020100e2242014027cf2ff481427 +:1006cc00024f04000b3f400b1000a8a301000224b2 +:1006dc008100c0131000a2a302000824020002240f +:1006ec004000042421280000c541400b15000724bc +:1006fc00c0300500c0400400253026012120000137 +:10070c002128c000214040002b30c5036200c0549a +:10071c001000a8a35d00c5132b30a40201004224d5 +:10072c002014027cf2ff4714424f04000b3f400b95 +:10073c001000a2a367fd4050ffff73264241400bff +:10074c002000042466ffa0143400a5af200004246c +:10075c00212840023389400f3c00a3af2000a78f13 +:10076c002710020001000426ffffe7242000a7af9a +:10077c000b8082005affe0103c00a38f2000042461 +:10078c00212840023389400f3c00a3af2000a78fe3 +:10079c002710020001000426ffffe7242000a7af6a +:1007ac000b808200e9ffe0143c00a38f3c41400b1e +:1007bc000200623035fec053029d043c6541400b83 +:1007cc002000042424fe4010200004241440400b7c +:1007dc00000000003afd40102000a28f2b3f400b80 +:1007ec00200004244c2d448cd78c400f3000a58f56 +:1007fc00010042280100c326823e400b0bb0620070 +:10080c007000a28f07004424f8ff022424108200f9 +:10081c00080044247000a4af0000558ceb3e400b44 +:10082c0004005e8c7000a28f07004524f8ff0224a0 +:10083c002428a2000000a48c0400a28c0800a5248b +:10084c007000a5af21a88000d5fc410421f0400028 +:10085c00ee40400b23a80400f439422480b8170062 +:10086c0021b8e202029d023c0000e48e1f86400f7c +:10087c00502d458cbe3e400b2120a002029d153c04 +:10088c00782cb526833f400b2120a002a4ffc0503a +:10089c00010042241000a8a30b3f400b21100001c3 +:1008ac002b28a502dafca050010042241000a7a3bb +:1008bc000b3f400b2110e0007fffc0500100e224f1 +:1008cc000b3f400b1000a2a30240400b0100082478 +:1008dc00a23d400b21b000000800a22e7fff40502b +:1008ec00020008240b3f400b010002240a00a22e38 +:1008fc00bafc4010029d043c0b3f400b010002244b +:10090c001000a22e5bff4050020002240b3f400b54 +:04091c0001000224b0 +:020000040000fa +:020000041d01dc +:10092000d8ffbd272400bfaf2000beaf21f0a00339 +:100930002800c4af1000c0a3050002241400c2a305 +:100940000100023c0802443404000524d878400f1a +:1009500000000000ff0043301000c293211062002d +:10096000ff0042301000c2a31400c2930100033cf8 +:100970000c02643421284000d878400f00000000a9 +:10098000ff0043301000c29321106200ff0042308c +:100990001000c2a30100023c1402443401000524eb +:1009a000d878400f00000000ff0043301000c293d1 +:1009b00021106200ff0042301000c2a30100023c7f +:1009c0001c02443484100524d878400f0000000035 +:1009d000ff0043301000c29321106200ff0042303c +:1009e0001000c2a30100023c04024434810005242b +:1009f000d878400f00000000ff0043301000c29381 +:100a000021106200ff0042301000c2a31800c2276c +:100a10000100033c1802643421284000c878400fcc +:100a200000000000ff0043301000c293211062005c +:100a3000ff0042301000c2a31000c2830700401420 +:100a4000000000001800c38f01000224efff6214b1 +:100a5000000000009842400b000000000000000071 +:100a60001000c2830600401400000000841004241b +:100a7000ba78400f00000000a142400b00000000c7 +:100a8000211000001800c2af1800c28fff004330d1 +:100a90002800c28f000043a01000c28321e8c003d9 +:100aa0002400bf8f2000be8f2800bd270800e00370 +:100ab00000000000d8ffbd272400bfaf2000beaf5c +:100ac00021f0a0032800c4af2c00c5af3000c6af92 +:100ad0001c00c0af1000c0a30b0002241400c2a36e +:100ae0002c00c28f02140200ff0042301500c2a386 +:100af0002c00c28f02120200ff0042301600c2a377 +:100b00002c00c28fff0042301700c2a3a5ff0224b1 +:100b10001800c2a30100023c080244343000c58f13 +:100b2000d878400f00000000ff0043301000c2934f +:100b300021106200ff0042301000c2a31400c293d3 +:100b4000211840001500c29300120200251862000f +:100b50001600c29300140200251862001700c29309 +:100b600000160200251062000100033c0c026434f0 +:100b700021284000d878400f00000000ff004330db +:100b80001000c29321106200ff0042301000c2a387 +:100b90001800c2930100033c100264342128400075 +:100ba000d878400f00000000ff0043301000c293cf +:100bb00021106200ff0042301000c2a30100023c7d +:100bc000140244341f000524d878400f00000000b0 +:100bd000ff0043301000c29321106200ff0042303a +:100be0001000c2a30100023c1c0244342800c58f3f +:100bf000d878400f00000000ff0043301000c2937f +:100c000021106200ff0042301000c2a30100023c2c +:100c10000402443485000524d878400f0000000009 +:100c2000ff0043301000c29321106200ff004230e9 +:100c30001000c2a31c00c2270100033c1802643448 +:100c400021284000c878400f00000000ff0043301a +:100c50001000c29321106200ff0042301000c2a3b6 +:100c60001000c28307004014000000001c00c38f66 +:100c700001000224efff6214000000002243400b39 +:100c800000000000000000001000c28321e8c00343 +:100c90002400bf8f2000be8f2800bd270800e0037e +:100ca00000000000d8ffbd272400bfaf2000beaf6a +:100cb00021f0a0032800c4af1800c0af1000c0a3eb +:100cc000200002241400c2a32800c28f02140200d4 +:100cd000ff0042301500c2a32800c28f021202009a +:100ce000ff0042301600c2a32800c28fff0042302e +:100cf0001700c2a30100023c08024434212800006e +:100d0000d878400f00000000ff0043301000c2936d +:100d100021106200ff0042301000c2a31400c293f1 +:100d2000211840001500c29300120200251862002d +:100d30001600c29300140200251862001700c29327 +:100d400000160200251062000100033c0c0264340e +:100d500021284000d878400f00000000ff004330f9 +:100d60001000c29321106200ff0042301000c2a3a5 +:100d70000100023c140244340f000524d878400fcf +:100d800000000000ff0043301000c29321106200f9 +:100d9000ff0042301000c2a30100023c1c02443498 +:100da00021280000d878400f00000000ff004330e9 +:100db0001000c29321106200ff0042301000c2a355 +:100dc0000100023c0402443484000524d878400f1a +:100dd00000000000ff0043301000c29321106200a9 +:100de000ff0042301000c2a31800c2270100033cdc +:100df0001802643421284000c878400f0000000029 +:100e0000ff0043301000c29321106200ff00423007 +:100e10001000c2a31000c2830700401400000000ad +:100e20001800c38f01000224efff621400000000cd +:100e30008f43400b00000000000000001000c28340 +:100e400021e8c0032400bf8f2000be8f2800bd27eb +:100e50000800e00300000000d8ffbd272400bfaf5a +:100e60002000beaf21f0a0031800c0af1000c0a347 +:100e7000060002241400c2a30100023c080244340c +:100e800021280000d878400f00000000ff00433008 +:100e90001000c29321106200ff0042301000c2a374 +:100ea0001400c2930100033c0c026434212840006a +:100eb000d878400f00000000ff0043301000c293bc +:100ec00021106200ff0042301000c2a30100023c6a +:100ed0001402443401000524d878400f00000000bb +:100ee000ff0043301000c29321106200ff00423027 +:100ef0001000c2a30100023c1c024434212800005f +:100f0000d878400f00000000ff0043301000c2936b +:100f100021106200ff0042301000c2a30100023c19 +:100f20000402443481000524d878400f00000000fa +:100f3000ff0043301000c29321106200ff004230d6 +:100f40001000c2a31800c2270100033c1802643439 +:100f500021284000c878400f00000000ff00433007 +:100f60001000c29321106200ff0042301000c2a3a3 +:100f70001000c28307004014000000001800c38f57 +:100f800001000224efff621400000000e643400b62 +:100f900000000000000000001000c28321e8c00330 +:100fa0002400bf8f2000be8f2800bd270800e0036b +:100fb00000000000d8ffbd272400bfaf2000beaf57 +:100fc00021f0a0031800c0af1000c0a30400022449 +:100fd0001400c2a30100023c08024434212800008e +:100fe000d878400f00000000ff0043301000c2938b +:100ff00021106200ff0042301000c2a31400c2930f +:101000000100033c0c02643421284000d878400fd2 +:1010100000000000ff0043301000c2932110620066 +:10102000ff0042301000c2a30100023c140244340d +:1010300001000524d878400f00000000ff00433075 +:101040001000c29321106200ff0042301000c2a3c2 +:101050000100023c1c02443421280000d878400fd3 +:1010600000000000ff0043301000c2932110620016 +:10107000ff0042301000c2a30100023c04024434cd +:1010800081000524d878400f00000000ff004330a5 +:101090001000c29321106200ff0042301000c2a372 +:1010a0001800c2270100033c1802643421284000c4 +:1010b000c878400f00000000ff0043301000c293ca +:1010c00021106200ff0042301000c2a31000c28352 +:1010d00007004014000000001800c38f0100022424 +:1010e000efff6214000000003d44400b00000000d0 +:1010f000000000001000c28321e8c0032400bf8f5d +:101100002000be8f2800bd270800e003000000007b +:10111000d8ffbd272400bfaf2000beaf21f0a00341 +:101120002800c4af2c00c5af3000c6af1800c0af58 +:101130001000c0a3020002241400c2a32c00c28f1e +:1011400002140200ff0042301500c2a32c00c28f1f +:1011500002120200ff0042301600c2a32c00c28f10 +:10116000ff0042301700c2a30100023c08024434d1 +:1011700021280000d878400f00000000ff00433015 +:101180001000c29321106200ff0042301000c2a381 +:101190001400c293211840001500c29300120200ef +:1011a000251862001600c293001402002518620080 +:1011b0001700c29300160200251062000100033cd4 +:1011c0000c02643421284000d878400f0000000051 +:1011d000ff0043301000c29321106200ff00423034 +:1011e0001000c2a30100023c140244340f00052485 +:1011f000d878400f00000000ff0043301000c29379 +:1012000021106200ff0042301000c2a30100023c26 +:101210001c0244342800c58fd878400f000000001d +:10122000ff0043301000c29321106200ff004230e3 +:101230001000c2a33000c28f0098427c001202004e +:10124000840042340100033c04026434212840003d +:10125000d878400f00000000ff0043301000c29318 +:1012600021106200ff0042301000c2a31800c22704 +:101270000100033c1802643421284000c878400f64 +:1012800000000000ff0043301000c29321106200f4 +:10129000ff0042301000c2a31000c28307004014b8 +:1012a000000000001800c38f01000224efff621449 +:1012b00000000000b044400b0000000000000000ef +:1012c0001000c28321e8c0032400bf8f2000be8f1e +:1012d0002800bd270800e00300000000e0ffbd2754 +:1012e0001c00bfaf1800beaf21f0a0032000c4afa8 +:1012f0002400c5af2800c6af1000c0a30d00043cf9 +:101300002400c58f2800c68fad42400f00000000aa +:101310001000c2a31000c2830900401400000000a6 +:101320000d00043c2000c58f2800c68ffc78400fbc +:10133000000000001000c2a3d144400b00000000d8 +:10134000000000001000c28321e8c0031c00bf8f12 +:101350001800be8f2000bd270800e0030000000039 +:10136000e0ffbd271c00bfaf1800beaf21f0a003f7 +:101370002000c4af2400c5af2110c0002800c2a7c0 +:101380001000c0a39643400f000000002800c29741 +:101390000d00043c2400c58f213040005979400fd6 +:1013a00000000000ff0043301000c29321106200d3 +:1013b000ff0042301000c2a32800c2970d00043c79 +:1013c0002000c58f213040004444400f0000000041 +:1013d000ff0043301000c29321106200ff00423032 +:1013e0001000c2a31000c2831800401400000000c7 +:1013f0001100c227212040004842400f0000000099 +:10140000ff0043301000c29321106200ff00423001 +:101410001000c2a31100c29301004230ff0042300d +:10142000f0ff401400000000ed43400f00000000fa +:10143000ff0043301000c29321106200ff004230d1 +:101440001000c2a31445400b000000000000000083 +:101450001000c28321e8c0031c00bf8f1800be8f9c +:101460002000bd270800e00300000000d8ffbd27d2 +:101470002400bfaf2000beaf21f0a0031c00c0af0e +:101480001000c0af1400c0a39fff02241800c2a325 +:101490000100023c0802443404000524d878400fbf +:1014a00000000000ff0043301400c29321106200ce +:1014b000ff0042301400c2a31800c2930100033c95 +:1014c0000c02643421284000d878400f000000004e +:1014d000ff0043301400c29321106200ff0042302d +:1014e0001400c2a30100023c14024434010005248c +:1014f000d878400f00000000ff0043301400c29372 +:1015000021106200ff0042301400c2a30100023c1f +:101510001c02443484100524d878400f00000000d9 +:10152000ff0043301400c29321106200ff004230dc +:101530001400c2a30100023c0402443481000524cb +:10154000d878400f00000000ff0043301400c29321 +:1015500021106200ff0042301400c2a31c00c22709 +:101560000100033c1802643421284000c878400f71 +:1015700000000000ff0043301400c29321106200fd +:10158000ff0042301400c2a31400c28312004014b2 +:10159000000000001000c28f010042241000c2af02 +:1015a0001000c28ff501422c05004014000000001d +:1015b000fbff02241400c2a37745400b000000008b +:1015c0001c00c38f01000224e4ff6214000000002d +:1015d0007745400b00000000000000001400c283ab +:1015e000060040140000000084100424ba78400f64 +:1015f000000000008045400b0000000021100000aa +:101600001c00c2af1c00c28f21e8c0032400bf8fa2 +:101610002000be8f2800bd270800e0030000000066 +:10162000e0ffbd271c00bfaf1800beaf21f0a00334 +:101630002000c4af2400c5af2800c6af1000c0a36f +:101640002800c38f018002342b1062001a0040145e +:10165000000000002000c48f2400c58f00800634e5 +:10166000b744400f000000001000c2a31000c28366 +:1016700019004014000000002800c28f008042249e +:101680002800c2af2400c38f008002342110620002 +:101690002400c2af2000c38f0080023421106200fa +:1016a0002000c2af2800c38f018002342b106200db +:1016b000e8ff4010000000002000c48f2400c58f08 +:1016c0002800c68fb744400f000000001000c2a3de +:1016d000b745400b00000000000000001000c2836e +:1016e00021e8c0031c00bf8f1800be8f2000bd275b +:1016f0000800e00300000000d8ffbd272400bfafb2 +:101700002000beaf21f0a0032800c4af2c00c5af5d +:101710003000c6af1000c0a3000102241400c2af05 +:101720002c00c38f1400c28f1b006200f401400024 +:10173000101000001800c2af3000c28f0500401426 +:1017400000000000f4ff02241000c2a32a46400b50 +:10175000000000001800c28f4d0040100000000083 +:101760001400c38f1800c28f231062001c00c2af88 +:101770003000c38f1c00c28f2b10430005004010a7 +:10178000000000001c00c28fffff4230e745400b05 +:10179000000000003000c28fffff42302c00c48fd9 +:1017a0002800c58f21304000d844400f00000000c1 +:1017b0000500401000000000f4ff02241000c2a346 +:1017c0002a46400b000000003000c38f1c00c28f6f +:1017d0002b10620033004014000000002800c38f6b +:1017e0001c00c28f211062002800c2af2c00c38fe2 +:1017f0001c00c28f211062002c00c2af3000c38fca +:101800001c00c28f231062003000c2af2446400b80 +:10181000000000001400c28f3000c38f3000c48f5e +:101820002b2044000a1064001c00c2af1c00c28fb1 +:10183000ffff42302c00c48f2800c58f21304000ac +:10184000d844400f000000000500401000000000d8 +:10185000f4ff02241000c2a32a46400b000000003f +:101860002800c38f1c00c28f211062002800c2af65 +:101870002c00c38f1c00c28f211062002c00c2af4d +:101880003000c38f1c00c28f231062003000c2af33 +:101890003000c28fdfff4014000000002a46400bda +:1018a00000000000000000001000c28321e8c00317 +:1018b0002400bf8f2000be8f2800bd270800e00352 +:1018c00000000000e0ffbd271c00bfaf1800beaf46 +:1018d00021f0a0032000c4af2400c5af1000c0afaa +:1018e0001400c0a31500c0a32000c28f1000c2af17 +:1018f0007346400b000000009643400f00000000bc +:10190000ff0043301400c29321106200ff004230f8 +:101910001400c2a31500c227212040004842400ff6 +:1019200000000000ff0043301400c2932110620049 +:10193000ff0042301400c2a31000c48f2943400f9f +:1019400000000000ff0043301400c2932110620029 +:10195000ff0042301400c2a31500c227212040001e +:101960004842400f00000000ff0043301400c293c3 +:1019700021106200ff0042301400c2a31400c28391 +:101980001b004014000000001500c2272120400069 +:101990004842400f00000000ff0043301400c29393 +:1019a00021106200ff0042301400c2a31500c29350 +:1019b00001004230ff004230f0ff40140000000000 +:1019c0001000c28f001042241000c2af2400c38f49 +:1019d0002000c28f211862001000c28f2b1043001c +:1019e000c5ff4014000000007d46400b00000000d1 +:1019f000000000001400c28321e8c0031c00bf8f58 +:101a00001800be8f2000bd270800e0030000000082 +:101a1000e0ffbd271c00bfaf1800beaf21f0a00340 +:101a20001000c0af1400c0afe080828f11004014de +:101a3000000000001b45400f000000001000c2af76 +:101a40001000c38fffff02240a0062100000000094 +:101a50001000c28f02140200ff004230efff422448 +:101a60001400c2af1400c28f01000324041043000d +:101a7000e08082afe080828f21e8c0031c00bf8f2e +:101a80001800be8f2000bd270800e0030000000002 +:101a9000e8ffbd271400bfaf1000beaf21f0a003c8 +:101aa0001800c4af2110a0001c00c2a71c00c297e0 +:101ab000212000001800c58f21304000b97c400f64 +:101ac0000000000021e8c0031400bf8f1000be8f8b +:101ad0001800bd270800e00300000000e8ffbd2754 +:101ae0001400bfaf1000beaf21f0a0031800c4afb8 +:101af0002110a0001c00c2a71c00c2971800c48fb0 +:101b00002128000021304000b97c400f0000000077 +:101b100021e8c0031400bf8f1000be8f1800bd273e +:101b20000800e00300000000e8ffbd271400bfaf7d +:101b30001000beaf21f0a0031800c4af1c00c5af59 +:101b40002110c0002000c2a72000c2971800c48f37 +:101b50001c00c58f21304000b97c400f0000000000 +:101b600021e8c0031400bf8f1000be8f1800bd27ee +:101b70000800e00300000000f8ffbd270400beaf2e +:101b800021f0a003211880002110a0000800c3a3a9 +:101b90000c00c2a30800c293401802000c00c293bc +:101ba00026186200029d023c7c2a42242110620019 +:101bb0000000429021e8c0030400be8f0800bd274a +:101bc0000800e00300000000e8ffbd271400bfafdd +:101bd0001000beaf21f0a003211080001c00c5af93 +:101be0002000c6af1800c2a30747400b000000004a +:101bf0001800c3931c00c28f000042901c00c48fc9 +:101c0000010084241c00c4af212060002128400072 +:101c1000de46400f000000001800c2a32000c28f63 +:101c20002b100200ff0042302000c38fffff63240f +:101c30002000c3afeeff4014000000001800c29364 +:101c400021e8c0031400bf8f1000be8f1800bd270d +:101c50000800e00300000000c8ffbd273400bfaf4c +:101c60003000beaf2c00b0af21f0a00321188000df +:101c70003c00c5af4000c6af4400c7af4800c28fac +:101c80003800c3a32000c2a3050002241000c2a391 +:101c90001100c0a33800c2931400c2a33800c2933d +:101ca0003dff42240d00432c9c006010000000000a +:101cb00080180200019d023ccc1c422421106200cd +:101cc0000000428c08004000000000001c1e019d26 +:101cd0003c1d019d1c1f019d1c1f019db41d019dec +:101ce000b41d019da41e019d001d019d1c1f019d91 +:101cf0001c1f019d1c1f019d1c1f019d8c1d019d12 +:101d00003c00c28f02140200ff0042301500c2a343 +:101d10003c00c28f02120200ff0042301600c2a334 +:101d20003c00c28fff0042301700c2a3050002240e +:101d30001000c2a3ca47400b000000003c00c28f45 +:101d400002120200ff0042301500c2a32000c2931d +:101d500006004010000000001500c39380ff02241d +:101d600025106200ff0042301500c2a33c00c28f64 +:101d7000ff0042301600c2a31700c0a305000224d2 +:101d80001000c2a3ca47400b00000000ffff02245e +:101d90001500c2a3ffff02241600c2a3ffff022406 +:101da0001700c2a3050002241000c2a3ca47400bbb +:101db000000000003c00c28f02140200ff0042300d +:101dc0001500c2a33c00c28f02120200ff00423085 +:101dd0001600c2a33c00c28fff0042301700c2a30e +:101de0004400c28f02140200ff0042301800c2a358 +:101df0004400c28f02120200ff0042301900c2a349 +:101e00004400c28fff0042301a00c2a3080002241f +:101e10001000c2a3ca47400b000000003c00c28f64 +:101e200002120200ff0042301500c2a32000c2933c +:101e300006004010000000001500c39380ff02243c +:101e400025106200ff0042301500c2a33c00c28f83 +:101e5000ff0042301600c2a34000c28f02160200eb +:101e6000ff0042301700c2a34000c28f02140200dc +:101e7000ff0042301800c2a34000c28f02120200cd +:101e8000ff0042301900c2a34000c28fff00423061 +:101e90001a00c2a3080002241000c2a3ca47400bc4 +:101ea000000000003c00c28f02140200ff0042301c +:101eb0001500c2a33c00c28f02120200ff00423094 +:101ec0001600c2a33c00c28fff0042301700c2a31d +:101ed0004000c28f02160200ff0042301800c2a369 +:101ee0004000c28f02140200ff0042301900c2a35a +:101ef0004000c28f02120200ff0042301a00c2a34b +:101f00004000c28fff0042301b00c2a30900022420 +:101f10001000c2a3ca47400b00000000ffff0224cc +:101f20001100c2a3000000001100c283220040146f +:101f300000000000d88082931200401400000000ce +:101f40001000c293ffff50241000c293ffff4224f1 +:101f50001400c3277f0004242128600021304000a2 +:101f6000f246400f0000000040100200ff00433026 +:101f70001000c22721105000040043a0e447400b8a +:101f8000000000001000c293ffff42241000c2a313 +:101f90001000c2931400c3272120600021284000b4 +:101fa000b746400f00000000030040100000000092 +:101fb000ffff02241100c2a31100c28321e8c00365 +:101fc0003400bf8f3000be8f2c00b08f3800bd278b +:101fd0000800e00300000000e0ffbd271c00bfafc9 +:101fe0001800beaf21f0a003211080002000c2a382 +:101ff0001000c0a30a0002241100c2a31200c227cd +:102000002120400001000524a446400f00000000ec +:102010000500401000000000ffff02241000c2a3d2 +:102020003b48400b000000001200c2932000c39305 +:1020300009006210000000001100c2832a10020093 +:10204000ff0042301100c393ffff63241100c3a3bc +:10205000eaff4014000000001100c28305004104a3 +:1020600000000000ffff02241000c2a33b48400b09 +:10207000000000000a0002241100c2a31200c227bf +:102080002120400001000524a446400f000000006c +:102090000500401000000000ffff02241000c2a352 +:1020a0003b48400b000000001200c29309004010a2 +:1020b000000000001100c2832a100200ff0042301d +:1020c0001100c393ffff63241100c3a3ebff40146f +:1020d000000000001100c283040041040000000061 +:1020e000ffff02241000c2a3000000001000c28302 +:1020f00021e8c0031c00bf8f1800be8f2000bd2741 +:102100000800e00300000000d0ffbd272c00bfaf97 +:102110002800beaf21f0a0031000a0afcf00042420 +:102120002128000021300000213800001647400f10 +:1021300000000000cf000424f647400f000000001c +:1021400013004010000000001800c0af1c00c0af1a +:10215000ffff02241800c2a32000c2271800c327d3 +:10216000212060002128400008000624ca46400fb4 +:10217000000000002700c393ff0002240400621047 +:1021800000000000ffff02246548400b0000000033 +:102190002110000021e8c0032c00bf8f2800be8f53 +:1021a0003000bd270800e00300000000d8ffbd2775 +:1021b0002400bfaf2000beaf21f0a0032800c4afb1 +:1021c0002118a0002110c0002c00c3a73000c2a31a +:1021d0001600c0a31200c0a72c00c2970120422cf9 +:1021e00005004010000000002c00c2971400c2a798 +:1021f0008048400b00000000002002241400c2a709 +:102200000a0002241000c2a71a00c22721204000a1 +:1022100001000524a446400f000000000500401006 +:1022200000000000ffff02241600c2a39d48400bdf +:10223000000000001a00c293f0004330f0000224b6 +:102240000b006210000000001000c2872b1002007b +:10225000ff0042301000c397ffff63241000c3a7a4 +:10226000e9ff4014000000009d48400b0000000002 +:10227000000000001600c383ffff02243500621037 +:10228000000000001000c2870500401c0000000094 +:10229000ffff02241600c2a3d648400b0000000036 +:1022a0001200c2872800c38f211862001400c29751 +:1022b0002120600021284000a446400f00000000bb +:1022c0000500401000000000ffff02241600c2a31a +:1022d000d648400b000000003000c2930f004014ad +:1022e00000000000d88082930c0040140000000021 +:1022f0001800c2272120400002000524a446400ff8 +:10230000000000000500401000000000ffff022454 +:102310001600c2a3d648400b000000001200c3976d +:102320001400c29721106200ffff42301200c2a7c2 +:102330001400c2972c00c397231062002c00c2a780 +:102340002c00c297a4ff401400000000d648400ba8 +:1023500000000000000000001600c28321e8c00356 +:102360002400bf8f2000be8f2800bd270800e00397 +:1023700000000000d8ffbd272400bfaf2000beaf83 +:1023800021f0a0032800c4af2110a0002c00c2a798 +:102390001000c0a71400c0a31800c0a72c00c2974b +:1023a0000120422c05004010000000002c00c297c4 +:1023b0001200c2a7f148400b0000000000200224d8 +:1023c0001200c2a7f0ff02241600c2a31000c287a9 +:1023d0000d004014000000002c00c2970120422c88 +:1023e0000500401000000000030002241500c2a3f5 +:1023f0000c49400b00000000010002241500c2a39c +:102400000c49400b000000002c00c2970120422c18 +:102410000500401000000000030002241500c2a3c4 +:102420000c49400b00000000020002241500c2a36a +:102430001600c3931500c29325106200ff004230be +:102440001600c2a31600c227212040000100052467 +:10245000b746400f000000000500401000000000db +:10246000ffff02241400c2a34449400b00000000f7 +:102470001000c2872800c38f211862001200c29783 +:102480002120600021284000b746400f00000000d6 +:102490000500401000000000ffff02241400c2a34a +:1024a0004449400b00000000d88082930c00401487 +:1024b000000000001800c22721204000020005246f +:1024c000b746400f0000000005004010000000006b +:1024d000ffff02241400c2a34449400b0000000087 +:1024e0001000c3971200c29721106200ffff423014 +:1024f0001000c2a72c00c3971200c29723106200dd +:102500002c00c2a72c00c297a4ff401400000000ba +:102510001400c28321e8c0032400bf8f2000be8fb7 +:102520002800bd270800e00300000000d8ffbd27f9 +:102530002400bfaf2000beaf21f0a0032800c4af2d +:102540002c00c5af1a00c0a3c9ff02241800c2a303 +:102550001900c0a32800c28f3100422c0500401092 +:1025600000000000c3ff02241800c2a301000224df +:102570001900c2a31800c2931900c3931000a3af9f +:10258000212040002800c58f2c00c68f040007249e +:102590001647400f000000001a00c2a31a00c283b1 +:1025a0000400401000000000ffff02247b49400ba4 +:1025b000000000001800c29321204000f647400fa1 +:1025c000000000001a00c2a31a00c28306004010d7 +:1025d000000000004248400f00000000ffff0224fe +:1025e0007b49400b000000002110000021e8c003df +:1025f0002400bf8f2000be8f2800bd270800e00305 +:1026000000000000d8ffbd272400bfaf2000beaff0 +:1026100021f0a0032800c4af2c00c5af2110c000da +:102620003000c2a7c7ff02241800c2a33000c3971e +:1026300001000224030062140000000002000224d2 +:102640003000c2a71800c3933000c2971000a0af9b +:10265000212060002800c58f213000002138400073 +:102660001647400f000000001900c2a31900c283e2 +:102670000400401000000000ffff0224bd49400b91 +:10268000000000001800c29321204000f647400fd0 +:10269000000000001900c2a31900c2830600401008 +:1026a000000000004248400f00000000ffff02242d +:1026b000bd49400b000000003000c2972c00c48fc1 +:1026c00021284000dd48400f000000001900c2a38f +:1026d0001900c28306004010000000004248400f6d +:1026e00000000000ffff0224bd49400b0000000075 +:1026f0002110000021e8c0032400bf8f2000be8ffe +:102700002800bd270800e00300000000d8ffbd2717 +:102710002400bfaf2000beaf21f0a0032800c4af4b +:102720002c00c5af1a00c0a3caff02241800c2a320 +:102730001900c0a32800c28f0001422c05004010e0 +:1027400000000000c4ff02241800c2a301000224fc +:102750001900c2a31800c2931900c3931000a3afbd +:10276000212040002800c58f2130000004000724ec +:102770001647400f000000001a00c2a31a00c283cf +:102780000400401000000000ffff0224104a400b2c +:10279000000000001800c29321204000f647400fbf +:1027a000000000001a00c2a31a00c28306004010f5 +:1027b000000000004248400f00000000ffff02241c +:1027c000104a400b000000001900c2931c00c327f0 +:1027d0002120600004000524213040006b48400f98 +:1027e000000000001a00c2a31a00c28306004010b5 +:1027f000000000004248400f00000000ffff0224dc +:10280000104a400b000000001c00c2932118400039 +:102810001d00c29300120200251862001e00c29320 +:1028200000140200251862001f00c2930016020067 +:10283000251862002c00c28f000043ac211000005c +:1028400021e8c0032400bf8f2000be8f2800bd27d1 +:102850000800e00300000000d8ffbd272400bfaf40 +:102860002000beaf21f0a0032800c4af2c00c5afec +:102870002110c0003000c2a7c8ff02241a00c2a362 +:102880001900c0a33000c3970100022405006214a0 +:1028900000000000020002243000c2a70100022450 +:1028a0001900c2a31a00c3933000c2971000a0af52 +:1028b000212060002800c58f213000002138400011 +:1028c0001647400f000000001800c2a31800c28382 +:1028d0000400401000000000ffff0224664a400b85 +:1028e000000000001a00c29321204000f647400f6c +:1028f000000000001800c2a31800c28306004010a8 +:10290000000000004248400f00000000ffff0224ca +:10291000664a400b000000001900c2930e004010f0 +:10292000000000003000c2971c00c3272120600077 +:1029300021284000213000006b48400f00000000bb +:102940001800c2a31c00c3932c00c28f000043a038 +:102950005d4a400b000000003000c2972c00c48f7d +:1029600021284000213000006b48400f000000008b +:102970001800c2a31800c283060040100000000027 +:102980004248400f00000000ffff0224664a400b4f +:10299000000000002110000021e8c0032400bf8fc8 +:1029a0002000be8f2800bd270800e00300000000c3 +:1029b000e0ffbd271c00bfaf1800beaf21f0a00391 +:1029c00024e80434d54a400f000000001000c2afd4 +:1029d0001000c38f8fff0224241062001000c2afca +:1029e0001000c28f500042341000c2af24e80434fb +:1029f0001000c58f4b49400f0000000021e8c003c4 +:102a00001c00bf8f1800be8f2000bd270800e00308 +:102a100000000000e0ffbd271c00bfaf1800beafe4 +:102a200021f0a0031400c0afd88080a31400c227f7 +:102a300024e8043421284000c349400f000000006e +:102a40000d0040100000000001000224d88082a385 +:102a50001400c22724e8043421284000c349400f51 +:102a6000000000000400401000000000faff0224f3 +:102a7000c54a400b00000000d88082931800401423 +:102a8000000000001400c38ff3ff02242410620032 +:102a90001400c2af1400c38f8fff02242410620001 +:102aa0001400c2af1400c28f500042341400c2aff1 +:102ab0001400c28f24e80434212840004b49400f01 +:102ac000000000000400401000000000faff022493 +:102ad000c54a400b0000000001000224d88082a3f8 +:102ae000001004241000c22721284000c349400fd1 +:102af000000000000400401000000000faff022463 +:102b0000c54a400b000000006c4a400f0000000066 +:102b10002110000021e8c0031c00bf8f1800be8fe9 +:102b20002000bd270800e00300000000f8ffbd27db +:102b30000400beaf21f0a003d88080a321100000c4 +:102b400021e8c0030400be8f0800bd270800e00391 +:102b500000000000e0ffbd271c00bfaf1800beafa3 +:102b600021f0a0032000c4af2000c48f1000c227b2 +:102b700021284000c349400f000000001000c28f10 +:102b800021e8c0031c00bf8f1800be8f2000bd27a6 +:102b90000800e00300000000f0ffbd270c00beaffe +:102ba00021f0a00380bf033c0068628cc47b027ce0 +:102bb000006862ac80bf023c106840ac80bf033c40 +:102bc0001068628c8452027c106862ac88bf033c3f +:102bd0001011628c070004248420827c101162ace6 +:102be00088bf033c1011628c0408027c101162ac97 +:102bf00080bf033c1068628c01000424847b827ccb +:102c0000106862ac88bf033c4010628c8452027c26 +:102c1000401062ac88bf033c7010628c8452027c0e +:102c2000701062ac80bf033c1068628c8439027cf7 +:102c3000106862ac88bf033c4010628c444a027c3e +:102c4000401062ac88bf033c7010628c444a027c26 +:102c5000701062ac80bf033c1068628c01000424d9 +:102c60000463827c106862ac80bf033c1068628c95 +:102c7000010004248452827c106862ac80bf033c53 +:102c80000068628cc47b027c006862ac0000c0af4c +:102c9000534b400b0000000000a0023c0000c38f1b +:102ca00040190300f002422421106200000040acf1 +:102cb00000a0023c0000c38f40190300f002422430 +:102cc00021106200080040ac00a0033c0000c28f4d +:102cd000f002632440110200211062000c0040ac9d +:102ce00000a0023c0000c38f40190300f002422400 +:102cf00021106200100040ac00a0033c0000c28f15 +:102d0000f00263244011020021106200140040ac64 +:102d100000a0023c0000c38f40190300f0024224cf +:102d200021106200180040ac00a0033c0000c28fdc +:102d3000f002632440110200211062001c0040ac2c +:102d40000000c28f010042240000c2af0000c28f09 +:102d500002004228d0ff40140000000021e8c00318 +:102d60000c00be8f1000bd270800e003000000002b +:102d7000f0ffbd270c00beaf21f0a0031000c4afd0 +:102d80001400c5af1800c6af1c00c7af1000c28f3b +:102d90000300422804004014000000000600022442 +:102da000df4b400b000000002000c28f80180200a3 +:102db000c404023c00b442341a004300f401600031 +:102dc0001018000012100000ffff42240400c2afe0 +:102dd0000000c0af2400c28f0900401000000000b6 +:102de0000100032407004314000000000000c28f0c +:102df000010042340000c2af814b400b00000000d4 +:102e00000000000000a0033c1000c28ff002632409 +:102e100040110200211062001400c38f1c0043ac5b +:102e20002800c28f010003240600431000000000a8 +:102e30000200032408004310000000009a4b400bde +:102e4000000000000000c28f020042340000c2af48 +:102e50009a4b400b000000000000c28f0400423477 +:102e60000000c2af000000001000c28f060040103a +:102e700000000000010003241e00431000000000b9 +:102e8000d74b400b0000000088bf033c4061628cc0 +:102e9000c418027c406162ac88bf033c6061628cf4 +:102ea00001000424c418827c606162ac0000c38ffe +:102eb00080bf023c006043ac80bf033c0060628c7a +:102ec00001000424c418827c006062ac0400c38f3b +:102ed00080bf023c406043ac80bf033c0060628c1a +:102ee00001000424c47b827c006062acd74b400ba1 +:102ef0000000000088bf033c4061628c4429027cd2 +:102f0000406162ac88bf033c6061628c01000424b4 +:102f10004429827c606162ac0000c38f80bf023ca8 +:102f2000006843ac80bf033c0068628c010004244d +:102f3000c418827c006862ac0400c38f80bf023c6e +:102f4000406843ac80bf033c0068628c01000424ed +:102f5000c47b827c006862ac0000000000a0023ce0 +:102f60001000c38f40190300f002422421106200b8 +:102f700001000324180043ac0100022421e8c0032f +:102f80000c00be8f1000bd270800e0030000000009 +:102f9000d0ffbd272c00bfaf2800beaf21f0a0039b +:102fa0003000c4af3400c5af3800c6af3c00c7af77 +:102fb0003800c28f4019020000a0023cf0024224f7 +:102fc000211062002400c2af2400c28f1800428c7e +:102fd000040040140000000003000224a54c400b34 +:102fe000000000002400c28f1400438c0100022462 +:102ff000040062140000000002000224a54c400bf3 +:10300000000000003400c28f1000c2af1000c28f59 +:1030100002004228030040140000000001000224c6 +:103020001000c2af2400c28f040043242400c28fca +:10303000000043ac2400c28f0000428c1400c2afd9 +:103040002400c28f1000c38f080043ac1800c0af2b +:103050002a4c400b000000003000c28f000043806b +:103060001400c28f000043a01400c28f010042244c +:103070001400c2af3000c28f010042243000c2af42 +:103080003000c38f4000c28f2b104300030040105c +:10309000000000003c00c28f3000c2af1800c28f99 +:1030a000010042241800c2af1800c38f1000c28f65 +:1030b0002a106200e8ff4014000000002400c28fc4 +:1030c00001000324140043ac3800c28f06004010f6 +:1030d000000000000100032439004310000000003c +:1030e000a44c400b0000000088bf023c6010438ce1 +:1030f0000010023c241062000e004010000000008e +:103100002400c28f1c00428c212040001000c58f7b +:10311000c824400f0000000080bf033c1060628c98 +:10312000010004248452827c106062aca44c400be9 +:10313000000000001c00c0af614c400b000000000c +:103140003000c28f000042802118400080bf023c46 +:10315000206043ac3000c28f010042243000c2af77 +:103160000000000080bf023c1060428c0001423031 +:10317000fcff4010000000001c00c28f0100422430 +:103180001c00c2af1c00c38f3400c28f2a10620023 +:10319000ebff4014000000002400c28f140040ac7c +:1031a0002400c28f1c00428c212040001000c58fdb +:1031b000c824400f00000000a44c400b0000000099 +:1031c00088bf023c7010428c000442300e00401058 +:1031d000000000002400c28f1c00428c212040000f +:1031e0001000c58fc824400f0000000080bf033cc2 +:1031f0001068628c010004248452827c106862ace6 +:10320000a44c400b000000002000c0af964c400bc7 +:10321000000000003000c28f0000428021184000f2 +:1032200080bf023c206843ac3000c28f01004224c2 +:103230003000c2af0000000080bf023c1068428c2a +:1032400000014230fcff4010000000002000c28f4f +:10325000010042242000c2af2000c38f3400c28f7f +:103260002a106200ebff4014000000002400c28f0f +:10327000140040ac2400c28f1c00428c212040006e +:103280001000c58fc824400f00000000000000009f +:103290000100022421e8c0032c00bf8f2800be8f4c +:1032a0003000bd270800e00300000000f0ffbd274c +:1032b0000c00beaf21f0a0031000c4af1400c5afd6 +:1032c0001800c6af0000c0afd14c400b000000009a +:1032d00088bf023ca060428c4003427cff00423029 +:1032e00027100200ff00423001004230ff0044304e +:1032f00088bf033ca060628c446b827ca06062ac9f +:103300001000c28f000042802118400080bf023ca4 +:10331000206843ac1000c28f010042241000c2afed +:103320000000000080bf023c1068428c0001423067 +:10333000fcff4010000000000000c28f010042248a +:103340000000c2af0000c38f1400c28f2a106200b9 +:10335000dfff40140000000088bf033ca060628cc7 +:1033600001000424446b827ca06062ac0100022452 +:1033700021e8c0030c00be8f1000bd270800e00349 +:1033800000000000e0ffbd271c00bfaf1800beaf6b +:1033900021f0a00380bf023c1068428c0100423043 +:1033a000280040100000000080bf023c1068428ce2 +:1033b00002004230050040100000000080bf033cc6 +:1033c0001068628c4408027c106862ac1000c0afc8 +:1033d000094d400b0000000080bf023c3068428c69 +:1033e0001400c2a388bf023ca060428c8003427cd0 +:1033f000ff00423027100200ff004230010042303f +:10340000ff00443088bf033ca060628c8473827ce0 +:10341000a06062ac1400c29321204000a468400f59 +:103420000000000080bf023c1068428c0100423066 +:1034300004004010000000001000c28fe6ff40189a +:103440000000000021e8c0031c00bf8f1800be8fe1 +:103450002000bd270800e0030000000000e85d41f7 +:1034600000701a4000601b40c8ffbd273400bbaf8e +:1034700044781b7c001c7b3700609b402400bfaf5e +:103480002000beaf121000002c00a2af10180000e8 +:103490002800a3af21f0a00300a0023cf0024224c8 +:1034a0001400c2af88bf023c3010438c0010023cb5 +:1034b000241062002e0040100000000088bf023c73 +:1034c0006010438c0010023c241062002800401061 +:1034d0000000000088bf033c3010628c04e7027ccf +:1034e000301062ac1400c28f0800428c09004014f6 +:1034f0000000000080bf033c1060628c8452027c9c +:10350000106062ac1400c28f140040ac5c4d400be4 +:10351000000000001400c28f0000428c00004380b5 +:103520002120600080bf033c206064ac0100432484 +:103530001400c28f000043ac1400c28f0800428cfc +:10354000ffff43241400c28f080043ac80bf023c3d +:103550001060428c00024230050040140000000060 +:103560001400c28f0800428ceaff401400000000e3 +:1035700088bf023c3010438c0008023c24106200db +:10358000390040100000000088bf023c6010438cee +:103590000008023c241062003300401000000000cc +:1035a00088bf033c3010628cc4de027c301062acf9 +:1035b00080bf023c1060428c020042300f0040107d +:1035c0000000000080bf033c1060628c4408027c55 +:1035d000106062ac88bf033c3010628cc4de027c99 +:1035e000301062ac029d023c60414424578f400f72 +:1035f000000000009a4d400b000000001000c0af1a +:103600008d4d400b0000000080bf023c3060428cba +:103610001800c2a31000c38f8c8182272110620082 +:103620001800c393000043a01000c28f0100422481 +:103630001000c2af80bf023c1060428c01004230db +:10364000f1ff4014000000001400c28f1c00438ce6 +:103650008c81822721206000212840001000c68f25 +:103660006622400f0000000021e8c0032c00a28f5a +:10367000130040002800a38f110060002400bf8fba +:103680002000be8f3400bb8f3800bd2700e8dd412d +:1036900000609b401800004200e85d4100701a4045 +:1036a00000601b40c8ffbd273400bbaf44781b7cc3 +:1036b000001c7b3700609b402400bfaf2000beafe2 +:1036c000121000002c00a2af101800002800a3afb9 +:1036d00021f0a00300a0023c100342241400c2af5a +:1036e00088bf023c4010428c000442302d00401044 +:1036f0000000000088bf023c7010428c0004423081 +:10370000280040100000000088bf033c4010628c7d +:103710008452027c401062ac1400c28f0800428cbc +:10372000090040140000000080bf033c1068628c58 +:103730008452027c106862ac1400c28f140040ac4a +:10374000e94d400b000000001400c28f0000428cc5 +:10375000000043802120600080bf033c206864acef +:10376000010043241400c28f000043ac1400c28f38 +:103770000800428cffff43241400c28f080043acb2 +:1037800080bf023c1068428c0002423005004014a9 +:10379000000000001400c28f0800428ceaff4014b1 +:1037a0000000000088bf023c4010428c0002423002 +:1037b000350040100000000088bf023c7010428cb1 +:1037c00000024230300040100000000088bf033c7f +:1037d0004010628c444a027c401062ac80bf023cc4 +:1037e0001068428c020042300b00401000000000c4 +:1037f00080bf033c1068628c4408027c106862ac95 +:1038000088bf033c4010628c444a027c401062ac8a +:10381000224e400b000000001000c0af144e400bc1 +:103820000000000080bf023c3068428c1800c2a338 +:103830001000c38f8d818227211062001800c3936e +:10384000000043a01000c28f010042241000c2af4c +:1038500080bf023c1068428c01004230f1ff4014ee +:10386000000000001400c28f1c00438c8c81822752 +:103870000100422421206000212840001000c68f52 +:103880006622400f0000000021e8c0032c00a28f38 +:10389000130040002800a38f110060002400bf8f98 +:1038a0002000be8f3400bb8f3800bd2700e8dd410b +:1038b00000609b4018000042f8ffbd270400beaf27 +:1038c00021f0a00380bf033c0060628cc47b027cbb +:1038d000006062ac80bf033c1060628c8452027c4a +:1038e000106062ac88bf033c6010628c04e7027c0d +:1038f000601062ac88bf033c3010628c04e7027c2d +:10390000301062ac88bf033c6010628c010004245c +:1039100004e7827c601062ac88bf033c6010628c5c +:10392000c4de027c601062ac88bf033c6010628c15 +:10393000c4de027c601062ac88bf033c3010628c35 +:10394000c4de027c301062ac88bf033c6010628c25 +:1039500001000424c4de827c601062ac80bf033ca2 +:103960001060628c010004240463827c106062aced +:1039700000a0023c00a0033cf4026324f00243ac2c +:1039800000a0023cf00242240c0040ac00a0023c2b +:10399000f0024224140040ac80bf033c0060628c03 +:1039a00001000424c47b827c006062ac21e8c00377 +:1039b0000400be8f0800bd270800e00300000000df +:1039c000f8ffbd270400beaf21f0a00380bf033c79 +:1039d0000068628cc47b027c006862ac80bf033ce0 +:1039e0001068628c8452027c106862ac88bf033c11 +:1039f0007010628c8452027c701062ac88bf033cf1 +:103a00004010628c8452027c401062ac88bf033c40 +:103a10007010628c010004248452827c701062acad +:103a200088bf033c7010628c444a027c701062ac08 +:103a300088bf033c4010628c444a027c401062ac58 +:103a400088bf033c7010628c444a027c701062ace8 +:103a500080bf033c1068628c010004240463827cf4 +:103a6000106862ac00a0023cf002422400a0033cbb +:103a700014036324200043ac00a0023cf002422463 +:103a80002c0040ac00a0023cf0024224340040acc8 +:103a900080bf033c0068628c01000424c47b827cec +:103aa000006862ac21e8c0030400be8f0800bd2797 +:103ab0000800e00300000000f8ffbd270400beafcf +:103ac00021f0a00321e8c0030400be8f0800bd2739 +:103ad0000800e00300000000e8ffbd271400bfafae +:103ae0001000beaf21f0a00300a0023cf807422462 +:103af000948182af00a0023cf807442421280000f2 +:103b00002c0106245b8c400f0000000000a0023c4a +:103b1000cc064424212800002c0106245b8c400f95 +:103b20000000000000a0023ca00544242128000061 +:103b30002c0106245b8c400f00000000988180afb0 +:103b400021e8c0031400bf8f1000be8f1800bd27ee +:103b50000800e00300000000e8ffbd271400bfaf2d +:103b60001000beaf21f0a0039881828f0a004010a0 +:103b700000000000010003240800431400000000be +:103b8000988180afc52a400f0000000000000000af +:103b9000e74e400b000000000000000021e8c003d9 +:103ba0001400bf8f1000be8f1800bd270800e0036f +:103bb00000000000e0ffbd271c00bfaf1800beaf33 +:103bc00021f0a0032000c4af2400c5af2000c28fa5 +:103bd00015004010000000001000c0af1000c0af82 +:103be000054f400b000000002000c28f00004290f3 +:103bf0002000c38f010063242000c3af21204000b8 +:103c0000104f400f000000001000c28f010042243e +:103c10001000c2af1000c38f2400c28f2a106200b0 +:103c2000f1ff40140000000021e8c0031c00bf8f1a +:103c30001800be8f2000bd270800e0030000000030 +:103c4000e8ffbd271400bfaf1000beaf21f0a003f6 +:103c5000211080001800c2a31800c3930d00022495 +:103c60001d00621400000000029d023c4cd9442457 +:103c70002352400f0000000000a0023cf80742243d +:103c800000004280090040100000000000a0023c3b +:103c9000cc06442400a0023cf80745248e86400f41 +:103ca00000000000644f400f0000000000a0023c34 +:103cb000f8074224948182af00a0023cf807442414 +:103cc000212800002c0106245b8c400f000000001e +:103cd0005e4f400b000000001800c3930800022450 +:103ce00005006210000000001800c3937f0002244a +:103cf00011006214000000001800c283212040005f +:103d00003852400f000000009481838f00a0023cd5 +:103d1000f807422418006210000000009481828f8e +:103d2000ffff4224948182af9481828f000040a0e3 +:103d30005e4f400b000000001800c28321204000ad +:103d40003852400f000000009481838f00a0023c95 +:103d5000240942242b1062000700401000000000dc +:103d60009481828f1800c383000043a09481828fc6 +:103d700001004224948182af21e8c0031400bf8f68 +:103d80001000be8f1800bd270800e00300000000ef +:103d9000b8febd274401bfaf4001beaf21f0a00374 +:103da0002000c22721204000212800001e000624f8 +:103db0005b8c400f000000004000c2272120400023 +:103dc000212800001e0006245b8c400f000000002c +:103dd0006000c22721204000212800001e00062488 +:103de0005b8c400f000000008000c22721204000b3 +:103df000212800001e0006245b8c400f00000000fc +:103e0000a000c22721204000212800001e00062417 +:103e10005b8c400f000000004000c2276000c327f9 +:103e20001000a3af8000c3271400a3afa000c327d6 +:103e30001800a3af00a0033cf8076424029d033cd4 +:103e400050d965242000c32721306000213840006c +:103e5000d08e400f000000002000c227212040002b +:103e6000029d023c60d9452404000624e58d400fe4 +:103e700000000000120040140000000000a0023cfe +:103e8000c83042249c8182af00a0023cc83042244a +:103e900021204000d988400f0000000000a0033c12 +:103ea000c830642421284000982b400f00000000f7 +:103eb0009c81828f308082af1d52400b0000000039 +:103ec0002000c22721204000029d023c68d94524e1 +:103ed00005000624e58d400f000000003700401467 +:103ee000000000004000c22700004280070040148c +:103ef00000000000029d023c70d944242352400f70 +:103f0000000000001d52400b000000004000c227ce +:103f100021204000029d023cacd945240200062429 +:103f2000e58d400f00000000090040140000000073 +:103f3000029d023cb0d944242352400f00000000ef +:103f40004784400f00000000e94f400b00000000d4 +:103f50004000c22721204000029d023cd0d94524c8 +:103f600003000624e58d400f000000000900401406 +:103f700000000000029d023cd4d944242352400f8b +:103f8000000000005b84400f00000000e94f400b80 +:103f900000000000029d023cf4d944242352400f4b +:103fa00000000000029d023c34da44242352400ffa +:103fb000000000001d52400b000000002000c2273e +:103fc00021204000029d023c38da452404000624ea +:103fd000e58d400f0000000080004014000000004c +:103fe0004000c2270000428007004014000000008b +:103ff000029d023c40da44242352400f000000009e +:104000001d52400b000000004000c227212040004c +:10401000029d023cacd9452402000624e58d400fe8 +:10402000000000001500401400000000252b400f88 +:104030000000000021184000010002240900621065 +:1040400000000000029d023c7cda44242352400f11 +:10405000000000000f2a400f000000007150400bcc +:1040600000000000029d023c94da44242352400fd9 +:10407000000000007150400b000000004000c2270b +:1040800021204000029d023cd0d945240300062493 +:10409000e58d400f000000001300401400000000f8 +:1040a000252b400f00000000090040100000000018 +:1040b000029d023cb0da44242352400f000000006d +:1040c00001000224988182af7150400b0000000073 +:1040d000029d023cd8da44242352400f0000000025 +:1040e0007150400b000000004000c227212040001a +:1040f000029d023c04db452406000624e58d400faa +:10410000000000002f00401400000000252b400f8d +:10411000000000000500432c2a0060100000000091 +:1041200080180200019d023c3c41422421106200a3 +:104130000000428c08004000000000005041019d3a +:104140006841019d8041019d9841019db041019dc3 +:10415000029d023c0cdb44242352400f000000006f +:104160007150400b00000000029d023c20db442403 +:104170002352400f000000007150400b000000006f +:10418000029d023c30db44242352400f000000001b +:104190007150400b00000000029d023c44db4424af +:1041a0002352400f000000007150400b000000003f +:1041b000029d023c50db44242352400f00000000cb +:1041c00000000000029d023c34da44242352400fd8 +:1041d000000000001d52400b000000002000c2271c +:1041e00021204000029d023c68db45240700062494 +:1041f000e58d400f00000000910040140000000019 +:104200004000c227000042802d0040140000000042 +:10421000d17f400f00000000c000c32721206000b4 +:10422000029d033c70db652421304000568e400f18 +:1042300000000000029d023c74db44242352400f26 +:1042400000000000c000c227212040002352400f80 +:1042500000000000029d023c34da44242352400f47 +:1042600000000000eb7f400f00000000d000c327db +:1042700021206000029d033c88db65242130400042 +:10428000568e400f00000000029d023c8cdb44244f +:104290002352400f00000000d000c2272120400020 +:1042a0002352400f00000000029d023ca8db442482 +:1042b0002352400f000000001d52400b0000000080 +:1042c0004000c22721204000029d023cacdb452477 +:1042d00007000624e58d400f000000001800401480 +:1042e00000000000d17f400f00000000e000c32765 +:1042f00021206000029d033c70db652421304000da +:10430000568e400f00000000029d023c74db4424e6 +:104310002352400f00000000e000c227212040008f +:104320002352400f00000000029d023c34da442476 +:104330002352400f000000000a51400b0000000013 +:104340004000c22721204000029d023cb4db4524ee +:1043500007000624e58d400f0000000018004014ff +:1043600000000000eb7f400f00000000f000c327ba +:1043700021206000029d033c88db65242130400041 +:10438000568e400f00000000029d023c8cdb44244e +:104390002352400f00000000f000c22721204000ff +:1043a0002352400f00000000029d023ca8db442481 +:1043b0002352400f000000000a51400b0000000093 +:1043c0004000c22721204000029d023cbcdb452466 +:1043d00003000624e58d400f000000001200401489 +:1043e00000000000f47f400f000000000001c32720 +:1043f00021206000029d033c88db652421304000c1 +:10440000568e400f00000000029d023cc0db442499 +:104410002352400f00000000029d023cd0db4424e8 +:104420002352400f00000000029d023c34da442475 +:104430002352400f000000001d52400b00000000fe +:104440002000c22721204000029d023c04db4524bd +:1044500006000624e58d400f00000000a200401475 +:1044600000000000029d023cd4db44242352400f94 +:10447000000000006f84400f00000000070040149f +:1044800000000000029d023ce8db44242352400f60 +:10449000000000003751400b000000006f84400f07 +:1044a00000000000211840000100022407006214ef +:1044b00000000000029d023c04dc44242352400f13 +:1044c000000000003751400b00000000029d023c3c +:1044d00020dc44242352400f00000000252b400f15 +:1044e000000000000100032416004310000000003b +:1044f0000200432805006010000000000b0040107f +:10450000000000006351400b000000000200032483 +:1045100012004310000000000300032415004310a4 +:10452000000000006351400b00000000029d023caf +:1045300040dc44242352400f000000006851400b2f +:1045400000000000029d023c5cdc44242352400f2a +:10455000000000006851400b00000000029d023c7a +:1045600074dc44242352400f000000006851400bcb +:1045700000000000029d023c90dc44242352400fc6 +:10458000000000006851400b00000000029d023c4a +:10459000b4dc44242352400f00000000000000005f +:1045a0001001c22721204000212800000f0006240e +:1045b0005b8c400f00000000d17f400f0000000026 +:1045c0001001c32721206000029d033cccdc652440 +:1045d00021304000568e400f00000000029d023c3a +:1045e00074db44242352400f000000001001c22756 +:1045f000212040002352400f00000000029d023c99 +:10460000d4dc44242352400f000000002001c227c4 +:1046100021204000212800000f0006245b8c400f61 +:1046200000000000eb7f400f000000002001c327c6 +:1046300021206000029d033cd8dc6524213040002d +:10464000568e400f00000000029d023c8cdb44248b +:104650002352400f000000002001c227212040000b +:104660002352400f0000000064000424a161400fa9 +:10467000000000003001c227212040002128000056 +:104680000f0006245b8c400f00000000f47f400ff9 +:10469000000000003001c32721206000029d033c80 +:1046a000e0dc652421304000568e400f0000000001 +:1046b000029d023cc0db44242352400f0000000056 +:1046c0003001c227212040002352400f000000008b +:1046d000029d023c34da44242352400f00000000c3 +:1046e0001d52400b000000002000c2272120400086 +:1046f000029d023ce8dc45240a000624e58d400fbb +:10470000000000004a004014000000004000c227e2 +:10471000000042800700401400000000029d023c9f +:10472000f4dc44242352400f000000001d52400bd3 +:10473000000000004000c22721204000029d023cf2 +:1047400034dd452405000624e58d400f00000000ff +:1047500009004014000000007530400f0000000008 +:10476000029d023c3cdd44242352400f0000000027 +:104770001d52400b000000004000c22721204000d5 +:10478000029d023c54dd452404000624e58d400fc3 +:10479000000000000900401400000000029d023cdf +:1047a0005cdd44242352400f000000008530400fa0 +:1047b000000000001d52400b000000004000c22716 +:1047c00021204000029d023c04db45240600062413 +:1047d000e58d400f0000000026004014000000009e +:1047e0004b2d400f000000000700401000000000ab +:1047f000029d023c78dd44242352400f000000005b +:104800001d52400b000000004b2d400f0000000027 +:104810001800401000000000029d023c98dd442476 +:104820002352400f000000001d52400b000000000a +:104830002000c22721204000d988400f000000003e +:104840002000c32721206000029d033cbcdd6524bd +:1048500021304000e58d400f0000000005004010b1 +:1048600000000000029d023cc4dd44242352400f9e +:104870000000000021e8c0034401bf8f4001be8f4b +:104880004801bd270800e00300000000e0ffbd274d +:104890001c00bfaf1800beaf1400b0af21f0a003e2 +:1048a0002000c4af2000d08f2000c48fd988400fd3 +:1048b000000000002120000221284000982b400f1a +:1048c0000000000021e8c0031c00bf8f1800be8f4d +:1048d0001400b08f2000bd270800e0030000000096 +:1048e000e8ffbd271400bfaf1000beaf21f0a0034a +:1048f000211080001800c2a31800c293212040009c +:10490000ba2b400f0000000021e8c0031400bf8f45 +:104910001000be8f1800bd270800e0030000000053 +:10492000f8ffbd270400beaf21f0a00321e8c003bb +:104930000400be8f0800bd270800e003000000004f +:10494000e0ffbd271c00beaf21f0a00388bf033ce1 +:104950002061628c01000424c418827c206162ac56 +:10496000c404023c00b442340000c2af7d01023cea +:10497000407842340400c2af0400c28f40100200ed +:104980000000c38f1b006200f401400010180000fb +:10499000121000000800c2af0400c28f40100200d5 +:1049a0000000c38f1b006200f401400010100000e3 +:1049b00004004010000000000800c28f01004224e3 +:1049c0000800c2af0800c28f0101422c030040144e +:1049d00000000000000102240800c2af0800c28fde +:1049e00004004010000000000800c28fffff4224b6 +:1049f0000800c2af0800c28fff004230d98182a3f5 +:104a0000c404023c00b442340c00c2af1602023ca3 +:104a1000c00e42341000c2af1000c28f401002001e +:104a20000c00c38f1b006200f4014000101800004e +:104a3000121000001400c2af1000c28f401002001c +:104a40000c00c38f1b006200f40140001010000036 +:104a500004004010000000001400c28f0100422436 +:104a60001400c2af1400c28f0101422c0300401495 +:104a700000000000000102241400c2af1400c28f25 +:104a800004004010000000001400c28fffff422409 +:104a90001400c2af1400c28fff004230d88182a33d +:104aa00021e8c0031c00be8f2000bd270800e003e2 +:104ab00000000000e8ffbd271400bfaf1000beaf2c +:104ac00021f0a0033b53400f0000000021184000dc +:104ad000010002242000621400000000e152400f97 +:104ae0000000000088bf033c2061628cc418027c77 +:104af000206162acd8818293010004242128400007 +:104b0000208e400f00000000d881829321200000f9 +:104b100021284000208e400f0000000088bf033c89 +:104b20002061628c01000424c418827c206162ac84 +:104b300001000424fa52400f00000000029d023cd4 +:104b4000e02f4424578f400f000000000100022492 +:104b5000db52400b00000000029d023cf82f442471 +:104b6000578f400f000000002110000021e8c00313 +:104b70001400bf8f1000be8f1800bd270800e0038f +:104b800000000000e8ffbd271400bfaf1000beaf5b +:104b900021f0a00388bf033c2061628cc418027c12 +:104ba000206162acd8818293060004242128400051 +:104bb000208e400f0000000088bf033c2061628c03 +:104bc00001000424c418827c206162ac010002242c +:104bd00021e8c0031400bf8f1000be8f1800bd274e +:104be0000800e00300000000e0ffbd271c00bfaf8d +:104bf0001800beaf21f0a0032000c4af88bf033c63 +:104c00002061628cc418027c206162acd9818293dd +:104c10000500042421284000208e400f00000000e1 +:104c20001000c2a3d98182932120000021284000d6 +:104c3000208e400f000000001000c2a388bf033c7c +:104c40002061628c01000424c418827c206162ac63 +:104c50002000c28f07004010000000001000c29327 +:104c6000029d033c1830642421284000688f400fc7 +:104c7000000000001000c29321e8c0031c00bf8f99 +:104c80001800be8f2000bd270800e00300000000d0 +:104c9000e0ffbd271c00bfaf1800beaf21f0a0038e +:104ca00021200000fa52400f000000001000c2a3b3 +:104cb0001000c29301004230ff0042300400401057 +:104cc00000000000010002243553400b00000000ea +:104cd0002110000021e8c0031c00bf8f1800be8f08 +:104ce0002000bd270800e00300000000e0ffbd2712 +:104cf0001c00bfaf1800beaf21f0a00388bf033c6b +:104d00002061628cc418027c206162acd9818293dc +:104d10009000042421284000208e400f0000000055 +:104d2000d98182932120000021284000208e400f4d +:104d300000000000d981829321200000212840003a +:104d4000208e400f00000000d981829321200000b6 +:104d500021284000208e400f00000000d98182935e +:104d60002120000021284000208e400f000000007c +:104d70001000c2a3d9818293212000002128400085 +:104d8000208e400f000000001100c2a388bf033c2a +:104d90002061628c01000424c418827c206162ac12 +:104da0001000c393bf00022405006214000000003d +:104db0001100c393410002240c00621000000000a7 +:104dc0001000c3931100c293029d043c3830842428 +:104dd0002128600021304000688f400f0000000053 +:104de000211000008453400b000000001000c3930a +:104df0001100c293029d043c743084242128600079 +:104e000021304000688f400f0000000001000224a4 +:104e100021e8c0031c00bf8f1800be8f2000bd27f3 +:104e20000800e00300000000e0ffbd271c00bfaf4a +:104e30001800beaf21f0a0032000c4af2400c5af0e +:104e40002800c6af2800c38f2400c28f2110620043 +:104e5000ffff43242000023c2a106200040040149b +:104e60000000000021100000e453400b000000008f +:104e700088bf033c2061628cc418027c206162ac54 +:104e8000d98182930b00042421284000208e400ffa +:104e9000000000002800c38fff00023c24106200c5 +:104ea00003140200ff00423021184000d881829391 +:104eb0002120600021284000208e400f00000000cb +:104ec0002800c28f00ff423003120200ff00423070 +:104ed00021184000d88182932120600021284000c1 +:104ee000208e400f000000002800c28fff004230db +:104ef00021184000d88182932120600021284000a1 +:104f0000208e400f00000000d881829321200000f5 +:104f100021284000208e400f000000001000c0af8c +:104f2000d953400b00000000d8818293de00042496 +:104f300021284000208e400f000000001400c2a372 +:104f40002000c28f1400c393000043a02000c28f32 +:104f5000010042242000c2af1000c28f0100422491 +:104f60001000c2af1000c38f2400c28f2a1062004d +:104f7000edff40140000000088bf033c2061628cfc +:104f800001000424c418827c206162ac0100022468 +:104f900021e8c0031c00bf8f1800be8f2000bd2772 +:104fa0000800e00300000000e8ffbd271400bfafc9 +:104fb0001000beaf21f0a0031800c4af1800c28fcc +:104fc000ff0f4230040040100000000021100000dc +:104fd0002e54400b00000000e152400f0000000082 +:104fe00088bf033c2061628cc418027c206162ace3 +:104ff000d88182932000042421284000208e400f75 +:10500000000000001800c38fff00023c2410620063 +:1050100003140200ff00423021184000d88182931f +:105020002120600021284000208e400f0000000059 +:105030001800c28f00ff423003120200ff0042300e +:1050400021184000d881829321206000212840004f +:10505000208e400f000000001800c28fff00423079 +:1050600021184000d881829321206000212840002f +:10507000208e400f0000000088bf033c2061628c3e +:1050800001000424c418827c206162ac1800c28f25 +:10509000010042241800c2af000000002453400f5a +:1050a000000000002118400001000224fbff6210f4 +:1050b000000000000100022421e8c0031400bf8f9b +:1050c0001000be8f1800bd270800e003000000009c +:1050d000e8ffbd271400bfaf1000beaf21f0a00352 +:1050e0001800c4af1c00c5af1800c28fffff4230cc +:1050f0000400401000000000211000008354400b09 +:10510000000000001800c38fffff02342118620066 +:105110002000023c2a10620004004014000000003d +:10512000211000008354400b00000000e152400faa +:105130000000000088bf033c2061628cc418027c20 +:10514000206162acd8818293d800042421284000d9 +:10515000208e400f000000001800c38fff00023cab +:105160002410620003140200ff00423021184000a6 +:10517000d88182932120600021284000208e400f9a +:10518000000000001800c28f00ff4230031202002e +:10519000ff00423021184000d88182932120600016 +:1051a00021284000208e400f000000001800c28f10 +:1051b000ff00423021184000d881829321206000f6 +:1051c00021284000208e400f0000000088bf033cd3 +:1051d0002061628c01000424c418827c206162acce +:1051e0001c00c28f080040100000000000000000fa +:1051f0002453400f00000000211840000100022449 +:10520000fbff6210000000000100022421e8c0033f +:105210001400bf8f1000be8f1800bd270800e003e8 +:1052200000000000d8ffbd272400bfaf2000beafa4 +:1052300021f0a0032800c4af2c00c5af2800c28f06 +:10524000ff0f423004004010000000002110000059 +:10525000f254400b000000002c00c38f0100022418 +:1052600004006214000000002800c48fea53400fbd +:105270000000000000a0023c501d42241000c2affc +:105280001400c0afed54400b000000001000c28fae +:10529000000042901800c2a3e152400f000000003d +:1052a0002800c38fff00023c241062000314020098 +:1052b0001900c2a32800c28f00ff4230031202006f +:1052c0001a00c2a32800c28f1b00c2a31c00c0afdb +:1052d00088bf033c2061628cc418027c206162acf0 +:1052e000d88182930200042421284000208e400fa0 +:1052f000000000001900c29321184000d881829359 +:105300002120600021284000208e400f0000000076 +:105310001a00c29321184000d88182932120600096 +:1053200021284000208e400f000000001b00c29387 +:1053300021184000d881829321206000212840005c +:10534000208e400f000000001800c393d881829384 +:105350002120600021284000208e400f0000000026 +:1053600088bf033c2061628c01000424c418827c45 +:10537000206162ac1000c28f010042241000c2af55 +:105380002800c28f010042242800c2af00000000a4 +:105390002453400f000000002118400001000224a7 +:1053a000fbff6210000000001400c28f01004224c5 +:1053b0001400c2af1400c28f00104228b3ff401483 +:1053c000000000000100022421e8c0032400bf8f78 +:1053d0002000be8f2800bd270800e0030000000069 +:1053e000e8ffbd271400bfaf1000beaf21f0a0033f +:1053f0001800c4af2110a0002000c6af1c00c2a33b +:105400001800c38f2000023c2b10620004004014df +:1054100000000000211000004755400b0000000074 +:10542000e152400f0000000088bf033c2061628c05 +:10543000c418027c206162acd881829302000424eb +:1054400021284000208e400f000000001800c38f6c +:10545000ff00023c2410620002140200ff004230f0 +:1054600021184000d881829321206000212840002b +:10547000208e400f000000001800c28f00ff423055 +:1054800002120200ff00423021184000d8818293ae +:105490002120600021284000208e400f00000000e5 +:1054a0001800c28fff00423021184000d88182933b +:1054b0002120600021284000208e400f00000000c5 +:1054c0001c00c29321184000d881829321206000e3 +:1054d00021284000208e400f0000000088bf033cc0 +:1054e0002061628c01000424c418827c206162acbb +:1054f0002000c28f080040100000000000000000e3 +:105500002453400f00000000211840000100022435 +:10551000fbff6210000000000100022421e8c0032c +:105520001400bf8f1000be8f1800bd270800e003d5 +:1055300000000000c8ffbd273400bfaf3000beaf81 +:1055400021f0a0033800c4af3c00c5af4000c6af97 +:105550001c00c0af4000c38f3c00c28f211062000e +:105560002000c2af4000c28f1000c2af3800c28f0f +:105570001400c2af2000c38f2000023c2a1062003a +:105580004c0040140000000021100000b155400bf9 +:10559000000000001000c28fff0f432400004428c9 +:1055a0000b10640003130200001302002400c2afba +:1055b00000a0023c501d4424001005242400c68f86 +:1055c0008a53400f0000000021184000010002240f +:1055d000040062100000000021100000b155400bd3 +:1055e0000000000000a0023c501d43241000c48fa6 +:1055f0002400c28f23108200211062001800c2af65 +:105600002800c0afaa55400b000000001400c28f54 +:10561000000043801800c28f000043a01800c28f12 +:10562000010042241800c2af1400c28f01004224be +:105630001400c2af1000c28f010042241000c2af9c +:105640001000c38f2000c28f0b0062140000000006 +:10565000010002242800c2af010002241c00c2afd6 +:105660002400c48f010005248954400f000000006d +:10567000ad55400b000000001000c28fff0f4230fc +:105680000900401400000000010002242800c2affd +:105690002400c48f010005248954400f000000003d +:1056a000ad55400b000000002800c28fd7ff40100e +:1056b000000000001c00c28fb6ff40100000000078 +:1056c0000100022421e8c0033400bf8f3000be8fe8 +:1056d0003800bd270800e00300000000f8ffbd27e8 +:1056e0000400beaf21f0a003211080000800c2a773 +:1056f0000800c28700ff423003120200201e027c15 +:105700000800c297001202002016027c25106200d9 +:105710002016027c21e8c0030400be8f0800bd27cc +:105720000800e00300000000f8ffbd270400beaf42 +:1057300021f0a0030800c4af0800c28f021e0200bf +:105740000800c48fff00023c2410820003120200f4 +:10575000251862000800c28f00ff423000120200cc +:10576000251862000800c28f001602002510620092 +:1057700021e8c0030400be8f0800bd270800e00335 +:1057800000000000d8ffbd272400bfaf2000beaf3f +:1057900021f0a0032800c4af2c00c5af3000c6af75 +:1057a0001000c0af1400c22721204000029d023c1f +:1057b000e0ee45242c00c68f568e400f00000000fe +:1057c0002c00c28f0f00422c1f0040100000000070 +:1057d0001000c0afff55400b000000001000c28f4a +:1057e0002800c38f2110620030000324000043a072 +:1057f0001000c28f010042241000c2af3000c28fdf +:10580000ffff43241000c28f2a104300f3ff40140f +:10581000000000001000c28f2800c38f212062000a +:105820003000c38f1000c28f231062001400c32702 +:1058300021286000213040007f88400f00000000d8 +:10584000e356400b000000002c00c28fff00422cea +:105850001f004010000000001000c0af2156400b98 +:10586000000000001000c28f2800c38f21106200ca +:1058700030000324000043a01000c28f0100422426 +:105880001000c2af3000c28ffeff43241000c28f51 +:105890002a104300f3ff4014000000001000c28fe4 +:1058a0002800c38f212062003000c38f1000c28ff8 +:1058b000231062001400c32721286000213040001b +:1058c0007f88400f00000000e356400b00000000fe +:1058d0002c00c28fff0f422c1f0040100000000060 +:1058e0001000c0af4356400b000000001000c28ff4 +:1058f0002800c38f2110620030000324000043a061 +:105900001000c28f010042241000c2af3000c28fcd +:10591000fdff43241000c28f2a104300f3ff401400 +:10592000000000001000c28f2800c38f21206200f9 +:105930003000c38f1000c28f231062001400c327f1 +:1059400021286000213040007f88400f00000000c7 +:10595000e356400b000000002c00c38fffff023411 +:105960002b1062001f004010000000001000c0afac +:105970006656400b000000001000c28f2800c38f45 +:105980002110620030000324000043a01000c28fe9 +:10599000010042241000c2af3000c28ffcff43243c +:1059a0001000c28f2a104300f3ff401400000000d3 +:1059b0001000c28f2800c38f212062003000c38fe7 +:1059c0001000c28f231062001400c327212860003a +:1059d000213040007f88400f00000000e356400b5c +:1059e000000000002c00c38f0f00023cffff423478 +:1059f0002b1062001f004010000000001000c0af1c +:105a00008a56400b000000001000c28f2800c38f90 +:105a10002110620030000324000043a01000c28f58 +:105a2000010042241000c2af3000c28ffbff4324ac +:105a30001000c28f2a104300f3ff40140000000042 +:105a40001000c28f2800c38f212062003000c38f56 +:105a50001000c28f231062001400c32721286000a9 +:105a6000213040007f88400f00000000e356400bcb +:105a7000000000002c00c38fff00023cffff4234f7 +:105a80002b1062001f004010000000001000c0af8b +:105a9000ae56400b000000001000c28f2800c38fdc +:105aa0002110620030000324000043a01000c28fc8 +:105ab000010042241000c2af3000c28ffaff43241d +:105ac0001000c28f2a104300f3ff401400000000b2 +:105ad0001000c28f2800c38f212062003000c38fc6 +:105ae0001000c28f231062001400c3272128600019 +:105af000213040007f88400f00000000e356400b3b +:105b0000000000002c00c38fff0f023cffff423457 +:105b10002b1062001d004010000000001000c0affc +:105b2000d256400b000000001000c28f2800c38f27 +:105b30002110620030000324000043a01000c28f37 +:105b4000010042241000c2af3000c28ff9ff43248d +:105b50001000c28f2a104300f3ff40140000000021 +:105b60001000c28f2800c38f212062003000c38f35 +:105b70001000c28f231062001400c3272128600088 +:105b8000213040007f88400f000000000100022407 +:105b900021e8c0032400bf8f2000be8f2800bd274e +:105ba0000800e00300000000d8ffbd272400bfafbd +:105bb0002000beaf21f0a0032800c4af2c00c5af69 +:105bc0001000c0af1400c22721204000029d023cfb +:105bd000e0ee45242c00c68f568e400f00000000da +:105be0002c00c28f0f00422c070040100000000064 +:105bf0001400c3832800c28f000043a001000224c8 +:105c0000b957400b000000002c00c28fff00422c4f +:105c100016004010000000001000c0af1457400be9 +:105c2000000000001000c28f2800c38f2110620006 +:105c30001000c38f1000c427211883000400638064 +:105c4000000043a01000c28f010042241000c2af28 +:105c50001000c28f02004228f2ff40140000000032 +:105c600002000224b957400b000000002c00c28f34 +:105c7000ff0f422c16004010000000001000c0afc3 +:105c80002d57400b000000001000c28f2800c38f6a +:105c9000211062001000c38f1000c4272118830058 +:105ca00004006380000043a01000c28f0100422462 +:105cb0001000c2af1000c28f03004228f2ff401450 +:105cc0000000000003000224b957400b0000000050 +:105cd0002c00c38fffff02342b106200160040100f +:105ce000000000001000c0af4757400b000000004c +:105cf0001000c28f2800c38f211062001000c38fd4 +:105d00001000c4272118830004006380000043a012 +:105d10001000c28f010042241000c2af1000c28fd9 +:105d200004004228f2ff4014000000000400022496 +:105d3000b957400b000000002c00c38f0f00023c3d +:105d4000ffff42342b1062001600401000000000dc +:105d50001000c0af6257400b000000001000c28f5f +:105d60002800c38f211062001000c38f1000c427c9 +:105d70002118830004006380000043a01000c28f3c +:105d8000010042241000c2af1000c28f050042285b +:105d9000f2ff40140000000005000224b957400b38 +:105da000000000002c00c38fff00023cffff4234c4 +:105db0002b10620016004010000000001000c0af61 +:105dc0007d57400b000000001000c28f2800c38fd9 +:105dd000211062001000c38f1000c4272118830017 +:105de00004006380000043a01000c28f0100422421 +:105df0001000c2af1000c28f06004228f2ff40140c +:105e00000000000006000224b957400b000000000b +:105e10002c00c38fff0f023cffff42342b106200a7 +:105e200016004010000000001000c0af9857400b53 +:105e3000000000001000c28f2800c38f21106200f4 +:105e40001000c38f1000c427211883000400638052 +:105e5000000043a01000c28f010042241000c2af16 +:105e60001000c28f07004228f2ff4014000000001b +:105e700007000224b957400b000000002c00c38f1c +:105e8000ffff022416006210000000001000c0afe7 +:105e9000b157400b000000001000c28f2800c38fd4 +:105ea000211062001000c38f1000c4272118830046 +:105eb00004006380000043a01000c28f0100422450 +:105ec0001000c2af1000c28f08004228f2ff401439 +:105ed0000000000008000224b957400b0000000039 +:105ee0002110000021e8c0032400bf8f2000be8fd6 +:105ef0002800bd270800e00300000000e0ffbd27e8 +:105f00001c00bfaf1800beaf21f0a0032000c4af3b +:105f10002110a0002800c6af2400c2a31000c0af0b +:105f20002400c2931400c32721206000029d033c7b +:105f3000e0ee652421304000568e400f0000000046 +:105f40002400c2930f00422c1f00401000000000ec +:105f50001000c0afdf57400b000000001000c28fe0 +:105f60002000c38f2110620030000324000043a0f2 +:105f70001000c28f010042241000c2af2800c28f5f +:105f8000ffff43241000c28f2a104300f3ff401488 +:105f9000000000001000c28f2000c38f212062008b +:105fa0002800c38f1000c28f231062001400c32783 +:105fb00021286000213040007f88400f0000000051 +:105fc0001258400b000000002400c393ff0002247d +:105fd0001d006210000000001000c0af0158400b0f +:105fe000000000001000c28f2000c38f211062004b +:105ff00030000324000043a01000c28f010042249f +:106000001000c2af2800c28ffeff43241000c28fd1 +:106010002a104300f3ff4014000000001000c28f5c +:106020002000c38f212062002800c38f1000c28f80 +:10603000231062001400c327212860002130400093 +:106040007f88400f000000000100022421e8c00307 +:106050001c00bf8f1800be8f2000bd270800e00382 +:1060600000000000e8ffbd271400beaf21f0a00330 +:106070001800c4af1c00c5af2000c6af0000c0af01 +:106080000400c0af0800c0af010002240c00c2af82 +:106090002000c38f100002243600621400000000ac +:1060a0001c00c28fffff42240000c2af5858400bb3 +:1060b000000000001c00c28fffff43240000c28fbd +:1060c00009006214000000000000c28f1800c38f96 +:1060d0002110620000004280d0ff42240800c2afbd +:1060e0005558400b000000000000c28f0400c2aff2 +:1060f0004458400b000000000c00c28f0011020049 +:106100000c00c2af0400c28f010042240400c2afe1 +:106110001c00c28ffeff43240400c28f2a106200bd +:10612000f5ff4010000000000000c28f1800c38f70 +:106130002110620000004280d0ff4224211840005c +:106140000c00c28f021862700800c28f2110430039 +:106150000800c2af0000c28fffff42240000c2afa0 +:106160000000c28fd3ff4104000000008e58400b96 +:10617000000000002000c38f0a0002242e006214d9 +:10618000000000000000c0af8958400b0000000074 +:106190000000c28f0500401400000000010002242e +:1061a0000c00c2af7b58400b000000000400c0afe1 +:1061b0007658400b000000000c00c28f4010020017 +:1061c00080180200211043000c00c2af0400c28fef +:1061d000010042240400c2af0400c38f0000c28f3c +:1061e0002a106200f4ff4014000000000000c28f7b +:1061f0001800c38f2110620000004280d0ff4224ab +:10620000211840000c00c28f021862700800c28f73 +:10621000211043000800c2af0000c28f01004224d9 +:106220000000c2af0000c38f1c00c28f2a106200a2 +:10623000d7ff4014000000000800c28f21e8c0030f +:106240001400be8f1800bd270800e0030000000006 +:10625000e0ffbd271c00bfaf1800beaf21f0a003b8 +:106260002000c4af2110a0002400c2a32400c293c8 +:106270001000c32721206000029d033ce0ee65244e +:1062800021304000568e400f000000002400c293d1 +:106290000f00422c07004010000000001000c383d4 +:1062a0002000c28f000043a001000224bc58400b14 +:1062b000000000002400c393ff0002240b006210c2 +:1062c000000000001000c3832000c28f000043a024 +:1062d0002000c28f010042241100c383000043a0ac +:1062e00002000224bc58400b0000000021100000f6 +:1062f00021e8c0031c00bf8f1800be8f2000bd27ff +:106300000800e00300000000e8ffbd271400beaf56 +:1063100021f0a0031800c4af1c00c5af0400c0af3b +:106320000000c0afdd58400b00000000029d023ca1 +:106330000400c38f80180300e4ee422421106200a1 +:106340000000428c0800c2af0000c28f1800c38f4b +:106350002110620000004280211840000800c28f16 +:10636000261062000400c2af0000c28f0100422468 +:106370000000c2af0000c38f1c00c28f2a10620051 +:10638000eaff4014000000000400c28f21e8c003af +:106390001400be8f1800bd270800e00300000000b5 +:1063a000f8ffbd270400beaf21f0a0030800c4af72 +:1063b00021e8c0030400be8f0800bd270800e003e9 +:1063c00000000000e8ffbd271400bfaf1000beaf03 +:1063d00021f0a0036e5a400f0000000021e8c00326 +:1063e0001400bf8f1000be8f1800bd270800e00307 +:1063f00000000000e8ffbd271400bfaf1000beafd3 +:1064000021f0a003211080001800c2a3788082939d +:106410000f00432c3d0160100000000080180200b6 +:10642000019d023c38644224211062000000428c2d +:1064300008004000000000007464019d9c64019d00 +:106440000465019d6c65019dd465019d4066019dbb +:106450007466019da866019df066019d3867019de7 +:10646000bc67019d1c68019d3468019d6068019da9 +:106470008c68019d388180af408180af488180a3c6 +:10648000448180af01000224788082a3ffff0224b0 +:10649000748082af495a400b000000003481828f23 +:1064a00000120200348182af1800c3933481828fbe +:1064b00021106200348182af7480838f1800c293f0 +:1064c0002120600021284000ea82400f00000000e7 +:1064d000748082af1800c393de00022405006214aa +:1064e0000000000002000224788082a3495a400b79 +:1064f000000000006e5a400f00000000495a400b97 +:10650000000000003481828f00120200348182afcb +:106510001800c3933481828f21106200348182afce +:106520007480838f1800c2932120600021284000ce +:10653000ea82400f00000000748082af1800c3930d +:10654000ad000224050062140000000003000224d4 +:10655000788082a3495a400b000000006e5a400f19 +:1065600000000000495a400b000000003481828f77 +:1065700000120200348182af1800c3933481828fed +:1065800021106200348182af7480838f1800c2931f +:106590002120600021284000ea82400f0000000016 +:1065a000748082af1800c393be00022405006214f9 +:1065b0000000000004000224788082a3495a400ba6 +:1065c000000000006e5a400f00000000495a400bc6 +:1065d000000000003481828f00120200348182affb +:1065e0001800c3933481828f21106200348182affe +:1065f0007480838f1800c2932120600021284000fe +:10660000ea82400f00000000748082af3481838fe3 +:10661000adde023cefbe4234050062100000000017 +:106620006e5a400f00000000495a400b0000000065 +:1066300005000224788082a3495a400b0000000024 +:106640001800c293488182a306000224788082a3a6 +:106650007480838f1800c29321206000212840009d +:10666000ea82400f00000000748082af495a400b5c +:10667000000000001800c293388182af0700022496 +:10668000788082a37480838f1800c29321206000d9 +:1066900021284000ea82400f00000000748082af91 +:1066a000495a400b000000003881828f001202001e +:1066b000388182af1800c3933881828f2110620025 +:1066c000388182af7480838f1800c29321206000cc +:1066d00021284000ea82400f00000000748082af51 +:1066e00008000224788082a3495a400b0000000071 +:1066f0003881828f00120200388182af1800c39364 +:106700003881828f21106200388182af7480838f3c +:106710001800c2932120600021284000ea82400f27 +:1067200000000000748082af09000224788082a3f8 +:10673000495a400b000000003881828f001202008d +:10674000388182af1800c3933881828f2110620094 +:10675000388182af7480838f1800c293212060003b +:1067600021284000ea82400f00000000748082afc0 +:106770003881828f9f00422c0500401400000000e9 +:106780006e5a400f00000000495a400b0000000004 +:106790003881828f05004014000000000b000224a5 +:1067a000788082a3495a400b000000000a000224ae +:1067b000788082a3495a400b000000001c82828f1f +:1067c0001800c393000043a01c82828f0100422462 +:1067d0001c8282af3c81828f010042243c8182afc7 +:1067e0007480838f1800c29321206000212840000c +:1067f000ea82400f00000000748082af3c81838fea +:106800003881828f46006214000000000b000224d1 +:10681000788082a3495a400b000000001800c29300 +:10682000448182af0c000224788082a3495a400b35 +:10683000000000004481828f00120200448182af78 +:106840001800c3934481828f21106200448182af7b +:106850000d000224788082a3495a400b00000000fa +:106860004481828f00120200448182af1800c393da +:106870004481828f21106200448182af0e00022485 +:10688000788082a3495a400b000000004481828f27 +:1068900000120200448182af1800c3934481828faa +:1068a00021106200448182af7480828f2710020021 +:1068b000748082af4481838f7480828f090062105c +:1068c00000000000488182932014027c21204000b7 +:1068d000212800007e2d400f000000006e5a400f5e +:1068e00000000000488182932014027c2120400097 +:1068f000010005247e2d400f000000006e5a400f5d +:1069000000000000495a400b000000006e5a400f82 +:106910000000000000000000495a400b0000000089 +:106920000000000021e8c0031400bf8f1000be8fdc +:106930001800bd270800e00300000000e0ffbd27ad +:106940001c00bfaf1800beaf21f0a0032000c4aff1 +:106950002400c5af1000c0af635a400b0000000018 +:106960002000c28f000042902000c38f01006324ea +:106970002000c3af21204000fd58400f0000000060 +:106980001000c28f010042241000c2af1000c38f5c +:106990002400c28f2a106200f1ff401400000000a2 +:1069a00021e8c0031c00bf8f1800be8f2000bd2748 +:1069b0000800e00300000000f8ffbd270400beafa0 +:1069c00021f0a003388180af348180af408180af57 +:1069d000488180a3448180af01000224788082a393 +:1069e0003c8180afffff0224748082af00a0023c94 +:1069f000442f42241c8282af21e8c0030400be8fd2 +:106a00000800bd270800e00300000000d8ffbd27f4 +:106a10002400bfaf2000beaf21f0a00321108000f2 +:106a20002c00c5af2800c2a300a0023cdeff032457 +:106a3000442f43a000a0023c442f4224adff032476 +:106a4000010043a000a0023c442f4224beff0324c7 +:106a5000020043a000a0023c442f4224efff032485 +:106a6000030043a000a0023c442f42242800c3930b +:106a7000040043a02c00c28f031602001000c2a322 +:106a80001000c39300a0023c442f4224050043a001 +:106a90002c00c28f031402001000c2a31000c39385 +:106aa00000a0023c442f4224060043a02c00c28fc9 +:106ab000031202001000c2a31000c39300a0023c06 +:106ac000442f4224070043a02c00c28f1000c2a311 +:106ad0001000c39300a0023c442f4224080043a0ae +:106ae000ffff02241400c2af2c00c28f0900422411 +:106af00000a0033c442f642421284000ac82400fb6 +:106b0000000000001400c2af7c80838f2c00c28f75 +:106b1000211062001800c2af1400c28f02160200da +:106b20001000c2a31000c3931800c28f000043a03e +:106b30001800c28f010042241800c2af1400c28f97 +:106b4000021402001000c2a31000c3931800c28fe9 +:106b5000000043a01800c28f010042241800c2aff9 +:106b60001400c28f021202001000c2a31000c393cf +:106b70001800c28f000043a01800c28f01004224f9 +:106b80001800c2af1400c28f1000c2a31000c3933c +:106b90001800c28f000043a01800c28f01004224d9 +:106ba0001800c2af2c00c28f0d00422400a0033c8d +:106bb000442f6424212840000e2d400f00000000c7 +:106bc00021e8c0032400bf8f2000be8f2800bd270e +:106bd0000800e00300000000f8ffbd270400beaf7e +:106be00021f0a0037c80828f21e8c0030400be8fc7 +:106bf0000800bd270800e00300000000e8ffbd27f3 +:106c00001400bfaf1000beaf21f0a003f65a400f32 +:106c10000000000001000324000043a0030004243e +:106c200001000524835a400f0000000021e8c00342 +:106c30001400bf8f1000be8f1800bd270800e003ae +:106c400000000000e8ffbd271400bfaf1000beaf7a +:106c500021f0a003211080001800c2a3f65a400fb3 +:106c60000000000001000324000043a01800c293ac +:106c70002120400001000524835a400f000000003d +:106c800021e8c0031400bf8f1000be8f1800bd277d +:106c90000800e00300000000e8ffbd271400bfafbc +:106ca0001000beaf21f0a003211080001800c2a385 +:106cb000f65a400f00000000000040a01800c293e8 +:106cc0002120400001000524835a400f00000000ed +:106cd00021e8c0031400bf8f1000be8f1800bd272d +:106ce0000800e00300000000d8ffbd272400bfaf6c +:106cf0002000beaf21f0a003211080002800c2a315 +:106d0000960002241000c2aff65a400f00000000a7 +:106d10001400c2af1400c28f2800c393000043a028 +:106d20001400c28f010042241400c2af2800c383a4 +:106d30000100022426006214000000001000c28f2f +:106d4000031602001800c2a31400c28f1800c393d8 +:106d5000000043a01400c28f010042241400c2afff +:106d60001000c28f031402001800c2a31400c28fc7 +:106d70001800c393000043a01400c28f01004224f6 +:106d80001400c2af1000c28f031202001800c2a389 +:106d90001400c28f1800c393000043a01400c28fd8 +:106da000010042241400c2af1000c28f1800c2a319 +:106db0001400c28f1800c393000043a01400c28fb8 +:106dc000010042241400c2af885b400b00000000a9 +:106dd0001400c28f000040a01400c28f01004224a2 +:106de0001400c2af1400c28f000040a01400c28f74 +:106df000010042241400c2af1400c28f000040a062 +:106e00001400c28f010042241400c2af1400c28fcc +:106e1000000040a01400c28f010042241400c2af41 +:106e20000800042405000524835a400f00000000d8 +:106e300021e8c0032400bf8f2000be8f2800bd279b +:106e40000800e00300000000e0ffbd271c00bfaf0a +:106e50001800beaf21f0a003211080002400c5afb0 +:106e60002000c2a3f65a400f000000001000c2af7d +:106e70001000c28f2000c393000043a01000c28ff7 +:106e8000010042241000c2af2400c28f031602008a +:106e90001400c2a31000c28f1400c393000043a0cb +:106ea0001000c28f010042241000c2af2400c28f24 +:106eb000031402001400c2a31000c28f1400c39375 +:106ec000000043a01000c28f010042241000c2af96 +:106ed0002400c28f031202001400c2a31000c28f4c +:106ee0001400c393000043a01000c28f010042248d +:106ef0001000c2af2400c28f1400c2a31000c28fc2 +:106f00001400c393000043a01000c28f010042246c +:106f10001000c2af0d00042405000524835a400f61 +:106f20000000000021e8c0031c00bf8f1800be8fc6 +:106f30002000bd270800e00300000000e0ffbd279f +:106f40001c00bfaf1800beaf21f0a00321108000cd +:106f50002000c2a3f65a400f000000001000c2af8c +:106f60001000c28f2000c393000043a01000c28f06 +:106f7000010042241000c2af0a00042401000524cd +:106f8000835a400f0000000021e8c0031c00bf8f9f +:106f90001800be8f2000bd270800e003000000009d +:106fa000e0ffbd271c00bfaf1800beaf21f0a0035b +:106fb000211080002000c2a3f65a400f00000000fc +:106fc0001000c2af1000c28f2000c393000043a086 +:106fd0001000c28f010042241000c2af0f00042431 +:106fe00001000524835a400f0000000021e8c0037f +:106ff0001c00bf8f1800be8f2000bd270800e003d3 +:1070000000000000e0ffbd271c00bfaf1800beafae +:1070100021f0a003211080002000c2a3f65a400fe7 +:10702000000000001000c2af1000c28f2000c39308 +:10703000000043a01000c28f010042241000c2af24 +:107040001900042401000524835a400f00000000a9 +:1070500021e8c0031c00bf8f1800be8f2000bd2791 +:107060000800e0030000000060ffbd279c00bfafe8 +:107070009800beaf21f0a003211880002110a000cd +:10708000a800c6afa000c3a3a400c2a71100c0a35c +:10709000a000c2930600032420004310000000005b +:1070a0000700032433004310000000000100032404 +:1070b000aa004314000000002800c227a800c48fc3 +:1070c000212840007000062421380000823c400f37 +:1070d000000000001100c2a31100c2838f00401401 +:1070e00000000000b880828f8f0040100000000078 +:1070f000a800c28f70004224bc8082afb880828f0b +:107100002800c327010004242128600009f840005a +:1071100000000000d75c400b000000001c00c227ec +:10712000a800c48f21284000040006242138000054 +:10713000823c400f000000001100c2a31100c28376 +:107140007c00401400000000b880828f7c0040105a +:1071500000000000b880828f1c00c32706000424b2 +:107160002128600009f8400000000000d75c400bb7 +:1071700000000000010002241000c2a32000c2276a +:10718000a800c48f212840000800062421380000f0 +:10719000823c400f000000001100c2a31100c28316 +:1071a00051004014000000002400c2971200c2a742 +:1071b0002600c2971400c2a72200c2971600c2a7d9 +:1071c0002000c2971800c2af1200c29703004014fb +:1071d00000000000010002241c8082af1200c3974f +:1071e0001400c297211862001600c29702006210b4 +:1071f000000000001000c0a31800c28f010003248b +:107200002c004310000000000100432c0900601412 +:1072100000000000020003240e00431000000000e4 +:10722000030003240f00431000000000a55c400b86 +:10723000000000001c80838f0100022420006214e3 +:10724000000000001800c28f1c8082afba5c400ba7 +:10725000000000001800c28f1c8082afba5c400b97 +:10726000000000001c80838f0200022417006210bf +:10727000000000001c80838f0400022416006210ae +:10728000000000001800c28f1c8082afba5c400b67 +:10729000000000001c80838f020002241100621095 +:1072a00000000000040002241c8082afba5c400b86 +:1072b0000000000000000000ba5c400b000000006d +:1072c00000000000ba5c400b00000000000000005d +:1072d000ba5c400b0000000000000000ba5c400bec +:1072e00000000000000000001000c29317004010d2 +:1072f00000000000b880828f1700401000000000de +:10730000b880828f070004241c80852709f840007c +:1073100000000000d75c400b0000000000000000ef +:10732000d75c400b0000000000000000d75c400b61 +:107330000000000000000000d75c400b00000000cf +:1073400000000000d75c400b0000000000000000bf +:10735000d75c400b000000000000000021e8c003e3 +:107360009c00bf8f9800be8fa000bd270800e003df +:1073700000000000d0ffbd272c00bfaf2800beaf2b +:1073800021f0a0033000c4af3400c5af2110c0000d +:107390003800c2a72000c0a33000c28f3800c397b6 +:1073a0003400c48f1000a4af1400a3af70000324f6 +:1073b0001800a3af050004248200052421304000fa +:1073c00070000724ff39400f000000002000c2a316 +:1073d0002000c28321e8c0032c00bf8f2800be8f8d +:1073e0003000bd270800e00300000000b8ffbd2703 +:1073f0004400bfaf4000beaf21f0a0034800c4afbf +:107400004c00c5af2000c0a34c00c28f0106422c27 +:1074100023004010000000004800c28f2800c2afc7 +:107420002800c28fc86e0324000043a44c00c28f02 +:107430000300422482100200ffff43302800c28f65 +:10744000020043a42800c28f040040a44c00c28f55 +:107450000300422482100200ffff43302800c28f45 +:10746000060043a44c00c28fffff42304800c38f88 +:107470001000a3af1400a2af1800a0af05000424b1 +:10748000840005242130000021380000ff39400f1e +:10749000000000002000c2a3c65d400b00000000f9 +:1074a0002400c0af2c00c0af4800c38f2400c28f9f +:1074b000211062003400c3272120600021284000f1 +:1074c00008000624b57a400f000000004c00c38f6e +:1074d0002400c28f23106200000503240105442c00 +:1074e0000a1064002c00c2af4800c38f2400c28f72 +:1074f000211062003000c2af3000c28fc86e03247a +:10750000000043a44c00c28f0300422482100200fa +:10751000ffff43303000c28f020043a42400c28f1b +:107520000300422482100200ffff43303000c28f6c +:10753000040043a42c00c28f0300422482100200e6 +:10754000ffff43303000c28f060043a44800c38fc2 +:107550002400c28f211862002c00c28fffff42302e +:107560001000a3af1400a2af1800a0af05000424c0 +:10757000840005242130000021380000ff39400f2d +:10758000000000002000c2a34800c38f2400c28f67 +:10759000211862003400c227212060002128400009 +:1075a00008000624b57a400f000000002400c38fb5 +:1075b0002c00c28f211062002400c2afc15d400bbd +:1075c000000000002400c28ff8ff42244800c38f4f +:1075d000211062003400c3272120600021284000d0 +:1075e00008000624b57a400f000000004c00c38f4d +:1075f0002400c28f23106200000503240105442cdf +:107600000a1064002c00c2af2c00c28f0300432478 +:10761000fcff0224241062002c00c2af2400c28fa1 +:10762000f8ff42244800c38f211062003000c2af2f +:107630003000c28fc86e0324000043a44c00c28fe8 +:107640000300422482100200ffff43303000c28f4b +:10765000020043a42400c28f0300422482100200cf +:10766000ffff43303000c28f040043a42c00c28fc0 +:107670000300422482100200ffff43303000c28f1b +:10768000060043a42400c28ff8ff42244800c38fa1 +:10769000211862002c00c28fffff423008004224f4 +:1076a000ffff42301000a3af1400a2af1800a0af3c +:1076b0000500042484000524213000002138000046 +:1076c000ff39400f000000002000c2a32400c28f39 +:1076d000f8ff42244800c38f211862003400c227fb +:1076e000212060002128400008000624b57a400fc0 +:1076f000000000002400c38f2c00c28f2110620004 +:107700002400c2af2400c38f4c00c28f2b10620034 +:10771000acff4014000000002000c28321e8c00339 +:107720004400bf8f4000be8f4800bd270800e00323 +:1077300000000000e0ffbd271c00bfaf1800beaf77 +:1077400021f0a0032000c4af2400c5af2800c6afbd +:107750002c00c7af010002241000c2a31100c0a377 +:10776000bc80828f0400401400000000f4ff02245b +:10777000965e400b00000000bc80838f2000c28f0b +:10778000212060002128400002000624213800004a +:10779000823c400f000000009000401400000000f8 +:1077a000bc80828f02004224bc8082afbc80838f69 +:1077b0001600c22721206000212840000200062474 +:1077c00021380000823c400f000000008600401479 +:1077d00000000000bc80828f02004224bc8082af87 +:1077e000bc80838f1200c227212060002128400026 +:1077f0000200062421380000823c400f00000000f7 +:107800007c00401400000000bc80828f02004224f3 +:10781000bc8082afbc80838f1400c227212060000f +:10782000212840000200062421380000823c400f3d +:10783000000000007200401400000000bc80828f35 +:1078400002004224bc8082af2000c28f000042941c +:1078500000120200201e027c2000c28f0000429411 +:1078600002120200ffff42302016027c2510620047 +:107870002016027cffff43302000c28f000043a48b +:107880001600c29700120200201e027c1600c2974a +:1078900002120200ffff42302016027c2510620017 +:1078a0002016027cffff43302c00c28f400043a40f +:1078b0001200c29700120200201e027c1200c29722 +:1078c00002120200ffff42302016027c25106200e7 +:1078d0002016027cffff42301200c2a71400c2979c +:1078e00000120200201e027c1400c2970212020045 +:1078f000ffff42302016027c251062002016027c19 +:10790000ffff42301400c2a7bc80848f2c00c38fbd +:107910002c00c28f4000429440100200ffff423012 +:10792000212860002130400021380000823c400fb7 +:107930000000000035004014000000002c00c28f41 +:10794000400042944010020021184000bc80828f09 +:1079500021106200bc8082afbc80838f1200c2976e +:10796000212060002400c58f213040002138000014 +:10797000823c400f0000000027004014000000007f +:107980001200c29721184000bc80828f2110620033 +:10799000bc8082afbc80838f1400c297212060001e +:1079a0002800c58f2130400021380000823c400f64 +:1079b000000000001b004014000000001400c297eb +:1079c00021184000bc80828f21106200bc8082aff1 +:1079d0001000c0a38a5e400b000000000000000001 +:1079e0008a5e400b00000000000000008a5e400b31 +:1079f00000000000000000008a5e400b0000000054 +:107a0000000000008a5e400b000000000000000043 +:107a10008a5e400b00000000000000008a5e400b00 +:107a200000000000000000001000c2930900401098 +:107a300000000000f4ff02241100c2a32120000076 +:107a4000212800002130000001000724823c400f63 +:107a5000000000001100c28321e8c0031c00bf8f9a +:107a60001800be8f2000bd270800e00300000000c2 +:107a7000e0ffbd271c00bfaf1800beaf21f0a00380 +:107a80002000c4af2110a0002400c2a701000224de +:107a90001000c2a31100c0a3bc80828f0400401458 +:107aa00000000000f4ff0224c65e400b000000004e +:107ab000bc80838f2400c297212060002000c58fe6 +:107ac0002130400021380000823c400f00000000bf +:107ad00004004014000000001000c0a3ba5e400b78 +:107ae00000000000000000001000c29309004010d8 +:107af00000000000f4ff02241100c2a321200000b6 +:107b0000212800002130000001000724823c400fa2 +:107b1000000000001100c28321e8c0031c00bf8fd9 +:107b20001800be8f2000bd270800e0030000000001 +:107b3000e8ffbd271400bfaf1000beaf21f0a003c7 +:107b4000212000002128000021300000010007242e +:107b5000823c400f0000000021e8c0031400bf8fea +:107b60001000be8f1800bd270800e00300000000d1 +:107b7000f8ffbd270400beaf21f0a003bc8080af9a +:107b800021e8c0030400be8f0800bd270800e00301 +:107b900000000000d0ffbd272c00bfaf2800beaf03 +:107ba00021f0a0033000c4af2000c0a33000c28f7a +:107bb0002400c2af2400c2271000a0af1400a0af61 +:107bc0001800a0af05000424050005242130400062 +:107bd00004000724ff39400f000000002000c2a36a +:107be0002000c28321e8c0032c00bf8f2800be8f75 +:107bf0003000bd270800e00300000000e0ffbd27c3 +:107c00001c00bfaf1800beaf21f0a0032000c4af1e +:107c10001000c0a32000c28fb88082afbc8080afac +:107c2000040002241c8082af05000424019d023c54 +:107c300068704524193d400f000000001000c2a3e9 +:107c40001000c28321e8c0031c00bf8f1800be8f44 +:107c50002000bd270800e00300000000e8ffbd276a +:107c60001400bfaf1000beaf21f0a00380bf023ce4 +:107c7000000640ac80bf033c0006628c0100042477 +:107c80000429827c000662ac80bf023c100640ac36 +:107c900080bf023c10270324200643ac88bf033c6e +:107ca000a010628c020004248420827ca01062acac +:107cb00088bf033ca010628c030004240408827c6b +:107cc000a01062ac88bf033c3010628c0421027c9f +:107cd000301062ac88bf033c6010628c0100042449 +:107ce0000421827c601062ac80bf033c0006628c81 +:107cf00001000424c47b827c000662ac00a0023c2c +:107d0000440f442421280000f00006245b8c400f1f +:107d10000000000021e8c0031400bf8f1000be8fd8 +:107d20001800bd270800e00300000000f0ffbd2799 +:107d30000c00beaf21f0a0031000c4af0000c0af24 +:107d40001000c28fc01002008018020023186200c9 +:107d500000a0023c440f4224211062001400428c17 +:107d600046004010000000001000c28fc01002004a +:107d7000801802002318620000a0023c440f422435 +:107d8000211062000400438c1000c28fc01002005a +:107d9000802002002320820000a0023c440f4224e5 +:107da000211082000000428c231062000000c2af4c +:107db0000000c38f1000c28fc0100200802002009c +:107dc0002320820000a0023c440f422421108200a4 +:107dd0000c00428c2b1062000c00401400000000cc +:107de0001000c28fc0100200801802002318620029 +:107df00000a0023c440f422421106200040040ac69 +:107e000001000224a05f400b000000000000c28fb0 +:107e10001a004104000000000000c28fe803422461 +:107e2000211840001000c28fc01002008020020004 +:107e30002320820000a0023c440f42242110820033 +:107e40000c00428c2b1062000c004014000000005b +:107e50001000c28fc01002008018020023186200b8 +:107e600000a0023c440f422421106200040040acf8 +:107e700001000224a05f400b000000002110000060 +:107e800021e8c0030c00be8f1000bd270800e003ee +:107e900000000000f0ffbd270c00beaf21f0a003e2 +:107ea0001000c4af0000c0af1000c28fc0100200ad +:107eb000801802002318620000a0023c440f4224f4 +:107ec000211062001400428c4500401000000000a8 +:107ed0001000c28fc0100200801802002318620038 +:107ee00000a0023c440f4224211062000800438c91 +:107ef0001000c28fc01002008020020023208200e8 +:107f000000a0023c440f4224211082000000428c59 +:107f1000231062000000c2af0000c38f1000c28fa8 +:107f2000c0100200802002002320820000a0023c3a +:107f3000440f4224211082001000428c2b1062005a +:107f40000c004014000000001000c28fc01002009e +:107f5000801802002318620000a0023c440f422453 +:107f600021106200080040ac01000224f95f400bc0 +:107f7000000000000000c28f190041040000000052 +:107f80000000c28fffff43241000c28fc010020008 +:107f9000802002002320820000a0023c440f4224e3 +:107fa000211082001000428c2b1062000c00401443 +:107fb000000000001000c28fc010020080180200f4 +:107fc0002318620000a0023c440f422421106200ea +:107fd000080040ac01000224f95f400b00000000e3 +:107fe0002110000021e8c0030c00be8f1000bd2747 +:107ff0000800e00300000000f0ffbd270c00beaf4a +:1080000021f0a0031000c4af0000c0af1000c28f69 +:10801000c0100200801802002318620000a0023c79 +:10802000440f4224211062001400428cd9004010f9 +:10803000000000001000c28fc01002008018020073 +:108040002318620000a0023c440f42242110620069 +:108050000800438c1000c28fc01002008020020074 +:108060002320820000a0023c440f42242110820001 +:108070000000428c231062000000c2af0000c38fda +:108080001000c28fc0100200802002002320820056 +:1080900000a0023c440f4224211082001000428cb8 +:1080a0002b10620056004014000000001000c28f28 +:1080b000c0100200801802002318620000a0023cd9 +:1080c000440f4224211062000400438c1000c28f30 +:1080d000c0100200802002002320820000a0023c89 +:1080e000440f4224211082000000428c23106200c1 +:1080f0000000c2af0000c38f1000c28fc01002008a +:10810000802002002320820000a0023c440f422471 +:10811000211082000c00428c2b10620014004014cd +:10812000000000001000c28fc01002008018020082 +:108130002318620000a0023c440f42242110620078 +:10814000080040ac1000c28fc0100200801802006e +:108150002318620000a0023c440f42242110620058 +:10816000040040ac01000224e660400b0000000067 +:108170000000c28f87004104000000000000c28f91 +:10818000e8034224211840001000c28fc0100200f2 +:10819000802002002320820000a0023c440f4224e1 +:1081a000211082000c00428c2b10620079004014d8 +:1081b000000000001000c28fc010020080180200f2 +:1081c0002318620000a0023c440f422421106200e8 +:1081d000080040ac1000c28fc010020080180200de +:1081e0002318620000a0023c440f422421106200c8 +:1081f000040040ac01000224e660400b00000000d7 +:108200000000c28f63004104000000000000c28f24 +:10821000ffff43241000c28fc01002008020020024 +:108220002320820000a0023c440f4224211082003f +:108230001000428c2b106200560040140000000019 +:108240001000c28fc01002008018020023186200c4 +:1082500000a0023c440f4224211062000400438c21 +:108260001000c28fc0100200802002002320820074 +:1082700000a0023c440f4224211082000000428ce6 +:10828000231062000000c2af0000c38f1000c28f35 +:10829000c0100200802002002320820000a0023cc7 +:1082a000440f4224211082000c00428c2b106200eb +:1082b00014004014000000001000c28fc010020023 +:1082c000801802002318620000a0023c440f4224e0 +:1082d00021106200080040ac1000c28fc0100200e4 +:1082e000801802002318620000a0023c440f4224c0 +:1082f00021106200040040ac01000224e660400b43 +:10830000000000000000c28f2200410400000000b5 +:108310000000c28fe8034224211840001000c28fe1 +:10832000c0100200802002002320820000a0023c36 +:10833000440f4224211082000c00428c2b1062005a +:1083400014004014000000001000c28fc010020092 +:10835000801802002318620000a0023c440f42244f +:1083600021106200080040ac1000c28fc010020053 +:10837000801802002318620000a0023c440f42242f +:1083800021106200040040ac01000224e660400bb2 +:10839000000000002110000021e8c0030c00be8f87 +:1083a0001000bd270800e00300000000e8ffbd2723 +:1083b0001400bfaf1000beaf21f0a0031800c4af7f +:1083c0001c00c5af1800c28fc01002008018020048 +:1083d0002318620000a0023c440f422421106200d6 +:1083e00001000324140043ac1c00c28fe803422c9c +:1083f0001e004014000000001800c28fc0100200d0 +:10840000801802002318620000a0023c440f42249e +:10841000211062001c00c48fe80303241b008300aa +:10842000f40160001020000012180000100043ac9e +:108430001800c28fc01002008018020023186200ca +:1084400000a0023c440f4224211062001c00c48f93 +:10845000e80303241b008300f401600010180000ef +:108460000c0043ac2c61400b000000001800c28fd0 +:10847000c0100200801802002318620000a0023c15 +:10848000440f422421106200100040ac1800c28f3b +:10849000c0100200801802002318620000a0023cf5 +:1084a000440f4224211062001c00c38f0c0043ac17 +:1084b0001800c48f5e61400f0000000021e8c00377 +:1084c0001400bf8f1000be8f1800bd270800e00306 +:1084d00000000000e8ffbd271400bfaf1000beafd2 +:1084e00021f0a0031800c4af1c00c5af1800c28f54 +:1084f000c0100200801802002318620000a0023c95 +:10850000440f42242110620001000324140043acf4 +:108510001800c28fc01002008018020023186200e9 +:1085200000a0023c440f4224211062001c00c38fb3 +:10853000100043ac1800c28fc01002008018020067 +:108540002318620000a0023c440f42242110620064 +:108550000c0040ac1800c48f5e61400f00000000aa +:1085600021e8c0031400bf8f1000be8f1800bd2784 +:108570000800e00300000000f8ffbd270400beafc4 +:1085800021f0a0030800c4af0800c28fc010020091 +:10859000801802002318620000a0023c440f42240d +:1085a00021106200000040ac0800c28fc010020021 +:1085b000801802002318620000a0023c440f4224ed +:1085c00021106200040040ac0800c28fc0100200fd +:1085d000801802002318620000a0023c440f4224cd +:1085e00021106200080040ac21e8c0030400be8fe7 +:1085f0000800bd270800e00300000000f8ffbd27c9 +:108600000400beaf21f0a0030800c4af0800c28f71 +:10861000c0100200801802002318620000a0023c73 +:10862000440f4224211062001400428c21e8c00350 +:108630000400be8f0800bd270800e0030000000012 +:10864000f8ffbd270400beaf21f0a0030800c4afaf +:108650000800c28fc01002008018020023186200b8 +:1086600000a0023c440f422421106200140040ace0 +:1086700021e8c0030400be8f0800bd270800e00306 +:1086800000000000e8ffbd271400bfaf1000beaf20 +:1086900021f0a0031800c4af02000424eb60400fd7 +:1086a0001800c58fac61400b0000000040000000c6 +:1086b00002000424fe5f400f00000000fbff40109a +:1086c000000000009061400f0200042421e8c00374 +:1086d0001400bf8f1000be8f0800e0031800bd27f4 +:1086e00000e85d4100701a4000601b40e0ffbd27bc +:1086f0001c00baaf1800bbaf44781b7c00087b3766 +:1087000000609b401400beaf1000a4af0c00a3afec +:108710000800a2af21f0a00300a0023c440f4224b5 +:108720000400c2af0000c0afe761400b00000000d2 +:108730000400c28f1400428c1200401000000000a0 +:108740000400c28f0400428ce80343380100632c0c +:10875000ff006330010044240400c28f040044acd5 +:1087600008006010000000000400c28f040040ac4c +:108770000400c28f0800428c010043240400c28f11 +:10878000080043ac0400c28f180042240400c2afaa +:108790000000c28f010042240000c2af0000c28f5f +:1087a0000a00422ce2ff40140000000088bf033c96 +:1087b0003010628c0421027c301062ac21e8c003ce +:1087c0001400be8f1000a48f0c00a38f0800a28f8e +:1087d00000606041c00000001c00ba8f1800bb8f11 +:1087e00000709a402000bd2700e8dd4100609b40fa +:0487f000180000422b +:020000040000fa +:020000041d01dc +:1087f400ac0000a00400000000000000300000a055 +:10880400040000000100000000010000b00000a00e +:108814002000000000000000340000a00800000058 +:1088240001000000ffff040525010000d00000a0a6 +:108834000800000000000000d80000a008000000ac +:10884400000000003c0000a0040000000100000043 +:1088540004000000e00000a014000000000000007c +:10886400400000a00400000001000000130000000c +:10887400f40000a00400000000000000f80000a0c4 +:108884000100000000000000fa0000a00600000043 +:1088940000000000400200a0b00000000000000042 +:1088a400000100a00400000000000000040100a07a +:1088b4000400000000000000f00200a040000000de +:1088c40000000000080100a01800000000000000e3 +:1088d400440000a0020000000100000001090000a3 +:1088e400300300a06e02000000000000703000a001 +:1088f400bc0400000100000057494e4333343030bb +:108904005f30303a3030000000000000000000000a +:1089140000000000000000000001000a313233347e +:1089240035464646464600000000000000000000b0 +:10893400000000000000000100c0a80101000000c8 +:1089440057494e43333430305f30303a30300000d2 +:108954004865726520697320746865206c69737456 +:10896400206f662074686520617661696c61626c51 +:108974006520636f6d6d616e64733a0a0d0a0d684c +:10898400656c70203a2053686f777320746869733c +:108994002077696e646f770a0d0a706f77657220ad +:1089a4005b73746174655d20536574206368616ce6 +:1089b400657427732031325620496e76657274656a +:1089c40072206665656420706f77657220737461c8 +:1089d40074652e20205468697320636f6d6d616e19 +:1089e4006420636f6e74726f6c7320746865206d9d +:1089f40061696e20706f7765722072656c61790aa7 +:108a0400202020202d20417661696c61626c6520f4 +:108a14005b73746174655d20617267756d656e74f6 +:108a2400206172653a206f6e0a20202020202020c9 +:108a34002020202020202020202020202020202032 +:108a44002020202020202020202020202020206fd3 +:108a540066660a0a77696669205b636f6d6d616e8d +:108a6400645d20636f6e74726f6c204368616c6523 +:108a7400744475696e6f27732057694669206d6f5a +:108a840064756c65207374617465250a2020202048 +:108a94002d20417661696c61626c65205b636f6d4a +:108aa4006d616e645d20617267756d656e742061c1 +:108ab40072653a206f6e20287475726e73204f4e63 +:108ac400206d6f64756c65290a20202020202020e9 +:108ad4002020202020202020202020202020202092 +:108ae4002020202020202020202020202020202082 +:108af400206f666620287475726e73204f46462078 +:108b04006d6f64756c65290a2020202020202020a8 +:108b14002020202020202020202020202020202051 +:108b24002020202020202020202020202020202041 +:108b3400737461747573202872657475726e732012 +:108b440063757272656e7420737461747573290a27 +:108b54000a62617474657279205b73656e736f72f7 +:108b64005d2072657475726e732063757272656ec2 +:108b74007420626174746572792073656e736f72a8 +:108b8400732072656164696e67730a202020202d4a +:108b940020417661696c61626c65205b73656e73fc +:108ba4006f725d20617267756d656e7420617265a8 +:108bb4003a20766f6c746167650a2020202020209b +:108bc40020202020202020202020202020202020a1 +:108bd4002020202020202020202020202020202091 +:108be4002063757272656e740a2020202020202074 +:108bf4002020202020202020202020202020202071 +:108c04002020202020202020202020202020202060 +:108c1400736f6320287374617465206f66206368c2 +:108c240061726765290a20202020202020456d706c +:108c34007479205b73656e736f725d206172677502 +:108c44006d656e74207072696e747320616c6c2033 +:108c540076616c7565730a0a737461747573203a6e +:108c6400206765742067656e6572616c2073797323 +:108c740074656d207374617475730a0a626f6f741e +:108c84006c6f61646572205b636f6d6d616e645db2 +:108c9400203a20626f6f746c6f61646572206d6f2f +:108ca400646520636f6e74726f6c0a202020202d1f +:108cb40020417661696c61626c65205b636f6d6de8 +:108cc400616e645d20617267756d656e742061729a +:108cd400653a2073746172742028656e61626c65f4 +:108ce40020626f6f746c6f6164657220616e6420c2 +:108cf4006f70656e7320706f7274290a20202020b3 +:108d0400202020202020202020202020202020205f +:108d1400202020202020202020202020202020204f +:108d24002020202073746f70202864697361626c42 +:108d3400657320626f6f746c6f616465722069661d +:108d4400206e6f742062757379290a2020202020f8 +:108d5400202020202020202020202020202020200f +:108d640020202020202020202020202020202020ff +:108d7400202020737461746520287072696e747386 +:108d84002061637475616c207374617465206f660f +:108d94002074686520626f6f746c6f6164657229fa +:108da4000a0a48617665206120676f6f64206461f8 +:108db40079210a00480000a00c0000000100000016 +:108dc400f8f00545d4840000c83000a0a00500a038 +:108dd4008403000000000000540000a00400000010 +:108de40001000000903f029d240900a0200600001d +:108df40000000000200100a00c00000000000000a2 +:108e0400383e00a0580000000100000057494e43be +:108e1400333430305f30303a30300000000000002e +:108e24000000000000000000000000000001000a33 +:108e340031323334354646464646000000000000d1 +:108e440000000000000000000000000100c0a801b4 +:108e54000100000057494e43333430305f30303a1c +:108e640030300000580000a008000000010000009d +:108e7400f8f00545d4840000440f00a0f000000081 +:108e840000000000cc3d00a06c00000001000000c8 +:108e940057494e43333430305f30303a303000007d +:108ea40000000000000000000000000000000000be +:108eb4000001000a31323334354646464646000046 +:108ec400000000000000000000000000000000019d +:108ed40000c0a8010100000057494e43333430302c +:108ee4005f30303a303000006f70656e77656174c2 +:108ef4006865726d61702e6f726700002c3500a07a +:108f04000004000000000000600000a01000000049 +:108f140001000000f8f00545d484ffffffffffffc8 +:108f2400ffffff042c0100a0180000000000000057 +:108f3400341000a0040d000000000000700000a028 +:108f4400040000000100000000050400903e00a0a1 +:108f5400580000000100000057494e4333343030bc +:108f64005f30303a303000000000000000000000a4 +:108f740000000000000000000001000a3132333418 +:108f8400354646464646000000000000000000004a +:108f9400000000000000000100c0a8010100000062 +:108fa40057494e43333430305f30303a303000006c +:108fb400740000a00800000001000000f8f005455e +:108fc400d4840000440100a004000000000000005c +:108fd400480100a00800000000000000381d00a0a7 +:108fe4001600000000000000501d00a0001000004a +:108ff40000000000e83e00a058000000010000004e +:1090040057494e43333430305f30303a303000000b +:10901400000000000000000000000000000000004c +:109024000001000a313233343546464646460000d4 +:10903400000000000000000000000000000000012b +:1090440000c0a8010100000057494e4333343030ba +:109054005f30303a303000007c0000a0080000008f +:1090640001000000f8f00545d4840000502d00a054 +:10907400f401000000000000500100a00400000002 +:1090840000000000403f00a0580000000100000064 +:1090940057494e43333430305f30303a303000007b +:1090a40000000000000000000000000000000000bc +:1090b4000001000a31323334354646464646000044 +:1090c400000000000000000000000000000000019b +:1090d40000c0a8010100000057494e43333430302a +:1090e4005f30303a30300000840000a008000000f7 +:1090f40001000000f8f00545d4840000442f00a0ce +:109104002c01000000000000983f00a0580000005f +:109114000100000057494e43333430305f30303a59 +:1091240030300000000000000000000000000000db +:10913400000000000001000a31323334354646464f +:10914400464600000000000000000000000000008f +:109154000000000100c0a8010100000057494e436f +:10916400333430305f30303a303000008c0000a0af +:109174001800000001000000f8f00545d484000048 +:10918400ffffffff010000004d2f00a009000000b9 +:10919400540100a018000000000000002c3900a0b9 +:1091a40000040000000000006c0100a001000000a9 +:1091b400000000002c3d00a0a00000000100000001 +:1091c400f03f00a000000000f03f00a009000000f4 +:1091d40020000000104000a000000000104000a08b +:1091e4000e0201000000000000000000000000006a +:1091f4000000000006020200000000000000000061 +:10920400000000000000000000000000000000005a +:10921400000000000000000000000000000000004a +:10922400000000000000000000000000000000003a +:10923400000000000000000000000000000000002a +:10924400000000000000000000000000000000001a +:10925400000000000000000000000000000000000a +:10926400f03f00a04000000000000000a40000a0a7 +:1092740004000000010000002c3d00a06d0100a0ce +:1092840001000000000000004c4000a0100000009d +:1092940000000000700100a01000000000000000a9 +:1092a4005c4000a00400000000000000800100a059 +:1092b4000400000000000000604000a00400000062 +:1092c40000000000304000a01c000000000000006e +:1092d400840100a00800000000000000a80000a015 +:1092e400040000000100000002000000000000a0d3 +:1092f40020000000010000000c000000000000003d +:109304000100017c1f0c1d000c0000001400000073 +:1093140088e6019d4c040000200000a0100000001d +:10932400010000000c00000024000000b0bb033a60 +:109334005c040000000000002222222222222222b9 +:1093440022222222222222222222222222222222f9 +:020000040000fa +:020000041d01dc +:109354004a462e636f6d0000426f6f746c6f6164d8 +:10936400657220486561727462656174205265712a +:109374007565737400000000424f4f544c4f4144d4 +:1093840045525f45524153455f424f4f544c4f4104 +:109394004445525f464c4153485f524551554553ed +:1093a40054000000424f4f544c4f414445525f49d2 +:1093b4004e49545f55504c4f41445f5245515545b9 +:1093c40053540000424f4f544c4f414445525f4761 +:1093d40045545f53544154455f5245515545535488 +:1093e40000000000424f4f544c4f414445525f55da +:1093f400504c4f41445f46494e49534845445f529f +:109404004551554553540000424f4f544c4f41442d +:1094140045525f455845435554455f555047524161 +:1094240047455f524551554553540000424f4f54f0 +:109434004c4f414445525f41424f52545f4f504557 +:10944400524154494f4e5f524551554553540000c3 +:10945400424f4f544c4f414445525f434845434b60 +:109464005f464c4153485f4649524d575f494e54fd +:109474004547524954595f5245515545535400008c +:10948400426f6f746c6f6164657250726f746f6356 +:109494006f6c206465746563746564206120435255 +:1094a40043206572726f722e2020436d643a20252a +:1094b400642c2052784352433a307825782c204546 +:1094c400787065637465643a5b307825785d0a006a +:1094d400426f6f746c6f6164657220496e7465725b +:1094e4006661636520676f696e6720696e746f20bb +:1094f40061637469766520737461746500000000ab +:10950400426f6f746c6f6164657220496e7465722a +:109514006661636520676f696e6720696e746f208a +:10952400457261736520466c61736820737461745d +:1095340065000000426f6f746c6f6164657220494e +:109544006e7465726661636520676f696e67206912 +:109554006e746f204669726d77617265205258206f +:10956400737461746500000041626f7274696e67a0 +:109574002075706c6f61642c20676f696e67206959 +:109584006e746f205354414e444259206d6f64658c +:1095940000000000426f6f746c6f61646572207725 +:1095a400696c6c206e6f77207570677261646520da +:1095b400616e64207265626f6f7421210000000087 +:1095c400426f6f746c6f616465722075706772614d +:1095d400646520726571756573742064656e696570 +:1095e400643a204669726d77617265206e6f7420eb +:1095f40075706c6f6164656400000000466c617393 +:10960400682065726173652066696e697368656454 +:109614002e2020426f6f746c6f6164657220496ef6 +:109624007465726661636520676f696e6720696e31 +:10963400746f204163746976652073746174650086 +:10964400466c617368206572617365206572726f20 +:10965400722e2020426f6f746c6f616465722049b2 +:109664006e7465726661636520676f696e672069f1 +:109674006e746f20416374697665207374617465d8 +:1096840000000000466c6173682065726173652098 +:1096940061626f72742e2020426f6f746c6f61640c +:1096a400657220496e7465726661636520676f69cf +:1096b4006e6720696e746f204163746976652073e8 +:1096c400746174650000000041626f7274696e67b2 +:1096d40020466c6173682065726173652c20676f26 +:1096e400696e6720696e746f205354414e44425929 +:1096f400206d6f6465000000426f6f746c6f61646d +:109704006572204368756e6b2025642073756363ee +:1097140065737366756c79207772697474656e20ed +:10972400746f20666c6173680a000000426f6f7486 +:109734006c6f6164657220466c617368207772692e +:109744007465206572726f722e2041626f72746943 +:109754006e6720616e6420676f696e6720696e743e +:109764006f205354414e4442592073746174650010 +:10977400426f6f746c6f6164657220496e746572b8 +:10978400666163652041424f5254494e472055500b +:109794004c4f41442e2052656365697665642069a7 +:1097a4006e76616c6964206368756e6b20696e64a3 +:1097b40065782e202052783a205b25645d202d2088 +:1097c40045787065637465643a205b25645d0a00be +:1097d400426f6f746c6f6164657220496e74657258 +:1097e400666163652e205278206e6577206461740b +:1097f40061206368756e6b2e202057726974696ee0 +:109804006720746f20666c6173682e2020496e6433 +:1098140065783a2025640a00426f6f746c6f616446 +:10982400657220496e7465726661636520696e763f +:10983400616c6964206368756e6b204352432e200b +:1098440052657175657374696e6720726573656eb0 +:1098540064206368756e6b20696e646578205b258f +:10986400645d0a00426f6f746c6f616465722049b5 +:109874006e74657266616365206669726d77617284 +:10988400652075706c6f61642066696e69736865c4 +:10989400642e20436865636b20666c61736820697d +:1098a4006e746567726974792e0000004669726d82 +:1098b4007761726520696e74656772697479206373 +:1098c4006865636b206661696c65642e2020476f50 +:1098d400696e67206261636b20746f205354414e3c +:1098e4004442592073746174652e0000426f6f7492 +:1098f4006c6f616465722061626f7274696e672057 +:109904006669726d7761726520646f776e6c6f61e2 +:10991400642e2020476f696e67206261636b207438 +:109924006f205354414e444259207374617465004e +:10993400426f6f746c6f6164657220496e746572f6 +:10994400666163652045726173696e672073656340 +:10995400746f722025307825780a0000426f6f7486 +:109964006c6f6164657220496e74657266616365cb +:109974003a204c61737420736563746f722030787d +:109984002578206572617365642061667465722050 +:10999400256420706f6c6c730a000000426f6f7452 +:1099a4006c6f6164657220496e746572666163658b +:1099b40020736563746f7220307825782065726136 +:1099c40073656420616674657220256420706f6c11 +:1099d4006c730a00426f6f746c6f61646572204926 +:1099e4006e7465726661636520466c617368206598 +:1099f40072617365206572726f722e20204d6178da +:109a040020706f6c6c20636f756e74207265616377 +:109a1400686564203a2025642121210a00000000a1 +:109a2400426f6f746c6f6164657220666c617368f9 +:109a3400206572726f722e202041626f7274696e9b +:109a44006720616e6420676f696e67206261636b73 +:109a540020746f205354414e44425900426f6f7436 +:109a64006c6f6164657220666c61736820777269db +:109a740074652074696d656f7574206572726f7298 +:109a84002e202041626f7274696e6720616e6420bb +:109a9400676f696e67206261636b20746f20535433 +:109aa400414e444259000000436865636b696e6728 +:109ab40020466c61736820626f6f746c6f616465bb +:109ac40072206461746120696e7465677269747967 +:109ad4002e2e2e200000000046696c65204865612a +:109ae4006465723a20436f64653a5b307825785d2b +:109af400202d20466c6167733a5b307825785d20b1 +:109b04002d204e62205265636f7264733a5b256444 +:109b14005d202d204669726d776172652053697ae4 +:109b2400653a5b25645d202d2056657273696f6efe +:109b34003a5b307825785d202d2043524333323a06 +:109b44005b307825785d0a00496e76616c69642023 +:109b540066696c652068656164657220636f64651d +:109b64002c2061626f7274696e6700004e6f207200 +:109b740065636f72647320696e2066696c65202862 +:109b84004e625265636f726473203d2030292c202d +:109b940061626f7274696e67000000004572726fd3 +:109ba4007220696e207265636f7264202325642eaf +:109bb4002020496e76616c69642068656164657211 +:109bc40020636f6465203a205b307825785d0a0055 +:109bd4004572726f7220696e207265636f726420c1 +:109be4002325642e2020496e76616c696420726599 +:109bf400636f72642073697a6520285265636f729b +:109c04006453697a65203d203029200a0000000051 +:109c1400416c6c207265636f726473206368656362 +:109c24006b6564204f4b212020436f6d7075746900 +:109c34006e67204352432e2e2e00000043524333be +:109c440032206d6174636865732e2020436f6d70dc +:109c5400757465643a5b307825785d202d204578ed +:109c64007065637465643a5b307825785d0a00003a +:109c7400466c61736820636865636b207375636306 +:109c84006573732e20204669726d77617265206951 +:109c9400732076616c6964004352433332206d69ea +:109ca400736d617463682e2020436f6d70757465e5 +:109cb400643a5b307825785d202d204578706563a3 +:109cc4007465643a5b307825785d0a00466c61738c +:109cd4006820636865636b206661696c65642e0047 +:020000040000fa +:020000041d01dc +:109ce400e8ffbd271400bfaf1000beaf21f0a003f2 +:109cf400b468400f0000000021e8c0031400bf8fc7 +:109d04001000be8f1800bd270800e003000000000b +:109d1400e0ffbd271c00bfaf1800beaf1400b0affa +:109d240021f0a003211080002000c2a3248082938c +:109d34000e00432c4801601000000000801802004f +:109d4400029d023c5c9d4224211062000000428c72 +:109d54000800400000000000949d019db89d019df5 +:109d6400209e019d6c9e019db89e019dfc9e019dbf +:109d7400709f019dbc9f019d08a0019d64a0019d51 +:109d8400c4a0019d24a1019daca1019d0ca2019d33 +:109d9400e88080aff08080aff48080a3f58080a35a +:109da400f68080a301000224248082a39d68400bd6 +:109db400000000002000c3938a00022412006214f1 +:109dc40000000000f080828f00a0033c3003632475 +:109dd400211843002000c493000064a00100422421 +:109de400f08082af02000224248082a3f680839351 +:109df4002000c29326106200ff004230f68082a346 +:109e04009d68400b00000000e88080afb468400ffc +:109e1400000000009d68400b000000002000c29379 +:109e2400f88082a3f080828f00a0033c3003632477 +:109e3400211843002000c493000064a001004224c0 +:109e4400f08082af03000224248082a3f6808393ef +:109e54002000c29326106200ff004230f68082a3e5 +:109e64009d68400b00000000f080828f00a0033c3e +:109e740030036324211843002000c493000064a02d +:109e840001004224f08082af04000224248082a3d3 +:109e94002000c293f78082a3f68083932000c293ac +:109ea40026106200ff004230f68082a39d68400bba +:109eb40000000000f080828f00a0033c3003632484 +:109ec400211843002000c493000064a00100422430 +:109ed400f08082af05000224248082a3f68083935d +:109ee4002000c29326106200ff004230f68082a355 +:109ef4009d68400b000000002000c3930100022471 +:109f040009006210000000002000c393ff00022437 +:109f14000500621000000000b468400f000000005b +:109f24009d68400b00000000f080828f00a0033c7d +:109f340030036324211843002000c493000064a06c +:109f440001004224f08082af06000224248082a310 +:109f5400f68083932000c29326106200ff004230f3 +:109f6400f68082a39d68400b000000002000c2938d +:109f7400f98082a3f080828f00a0033c3003632425 +:109f8400211843002000c493000064a0010042246f +:109f9400f08082af07000224248082a3f68083939a +:109fa4002000c29326106200ff004230f68082a394 +:109fb4009d68400b000000002000c293f58082a33e +:109fc400f080828f00a0033c3003632421184300f7 +:109fd4002000c493000064a001004224f08082affa +:109fe40008000224248082a3f68083932000c29375 +:109ff40026106200ff004230f68082a39d68400b69 +:10a0040000000000e88080af2000c293e88082afa7 +:10a01400e880828f00120200e88082aff080828f95 +:10a0240000a0033c30036324211843002000c493a0 +:10a03400000064a001004224f08082af09000224e1 +:10a04400248082a3f68083932000c29326106200aa +:10a05400ff004230f68082a39d68400b00000000a0 +:10a064002000c393e880828f25106200e88082afcd +:10a07400e880828f00120200e88082aff080828f35 +:10a0840000a0033c30036324211843002000c49340 +:10a09400000064a001004224f08082af0a00022480 +:10a0a400248082a3f68083932000c293261062004a +:10a0b400ff004230f68082a39d68400b0000000040 +:10a0c4002000c393e880828f25106200e88082af6d +:10a0d400e880828f00120200e88082aff080828fd5 +:10a0e40000a0033c30036324211843002000c493e0 +:10a0f400000064a001004224f08082af0b0002241f +:10a10400248082a3f68083932000c29326106200e9 +:10a11400ff004230f68082a39d68400b00000000df +:10a124002000c393e880828f25106200e88082af0c +:10a13400f080828f00a0033c300363242118430085 +:10a144002000c493000064a001004224f08082af88 +:10a15400e880828f2d01422c03004014000000008f +:10a16400b468400f00000000e880828f05004014ae +:10a17400000000000d000224248082a36468400bc8 +:10a18400000000000c000224248082a3f680839344 +:10a194002000c29326106200ff004230f68082a3a2 +:10a1a4009d68400b00000000f68083932000c2935a +:10a1b40026106200ff004230f68082a3f080828f76 +:10a1c40000a0033c30036324211843002000c493ff +:10a1d400000064a001004224f08082afec80828ff2 +:10a1e40001004224ec8082afec80838fe880828f70 +:10a1f4001e006214000000000d000224248082a3cb +:10a204009d68400b00000000f68082932000c393f9 +:10a214000500621000000000b468400f0000000058 +:10a224009d68400b00000000f5808293218040006f +:10a234008c69400f0000000021200002212840000a +:10a244003f6f400f00000000b468400f00000000a2 +:10a254009d68400b00000000b468400f000000003f +:10a26400000000009d68400b00000000000000009a +:10a2740021e8c0031c00bf8f1800be8f1400b08fec +:10a284002000bd270800e00300000000e8ffbd2710 +:10a294001400bfaf1000beaf21f0a0032110800056 +:10a2a4001800c2a31800c293212040004567400f44 +:10a2b4000000000021e8c0031400bf8f1000be8f0f +:10a2c4001800bd270800e00300000000f8ffbd27c8 +:10a2d4000400beaf21f0a003e88080aff08080af1f +:10a2e400f48080a3f58080a3f68080a3010002247b +:10a2f400248082a3ec8080aff98080a3f88080a3bf +:10a3040021e8c0030400be8f0800bd270800e00355 +:10a3140000000000f0ffbd270c00beaf21f0a00339 +:10a32400f580829321184000020002240300621485 +:10a33400000000000000c0a30000000021e8c003ea +:10a344000c00be8f1000bd270800e00300000000d1 +:10a35400f0ffbd270c00beaf21f0a0032118a00020 +:10a364002110c0001000c4a31400c3a31800c2a38a +:10a374001000c393010002240500621400000000d1 +:10a38400a3ff02240000c2a3e768400b0000000002 +:10a3940090ff02240000c2a31400c2930100c2a3d0 +:10a3a40021e8c0030c00be8f1000bd270800e003a5 +:10a3b40000000000f0ffbd270c00beaf21f0a00399 +:10a3c4001000c4af2110a0001400c2a30000c0a359 +:10a3d4000100c0a30269400b000000000100c29309 +:10a3e4001000c38f21106200000043900000c2934c +:10a3f400261062000000c2a30100c293010042249f +:10a404000100c2a30100c3931400c2932b10620085 +:10a41400f2ff4014000000000000c29321e8c003d2 +:10a424000c00be8f1000bd270800e00300000000f0 +:10a43400f8ffbd270400beaf21f0a003248083935e +:10a444000100022404006214000000002110000036 +:10a454001869400b000000000100022421e8c00339 +:10a464000400be8f0800bd270800e00300000000c0 +:10a47400d8ffbd272400bfaf2000beaf1c00b0af83 +:10a4840021f0a003214080002120c0002118e00019 +:10a494004000c28f2800c8a32c00c5a33000c4a369 +:10a4a4003400c3a31000c2a33c00c28f2d01422c70 +:10a4b40007004014000000004400c28f000040acbc +:10a4c40000a0023c680442248569400b000000009f +:10a4d40000a0023c8aff0324680443a000a0023cbd +:10a4e4006804422401000324010043a000a0023cac +:10a4f400680442243000c393020043a000a0023c3d +:10a50400680442242800c393030043a000a0023c33 +:10a51400680442242c00c393040043a000a0023c1e +:10a52400680442241000c393050043a000a0023c29 +:10a53400680442243400c393060043a03c00c28f45 +:10a5440002160200ff00433000a0023c68044224cb +:10a55400070043a03c00c28f02140200ff004330f6 +:10a5640000a0023c68044224080043a03c00c28fbf +:10a5740002120200ff00433000a0023c680442249f +:10a58400090043a03c00c28fff00433000a0023cfe +:10a59400680442240a0043a000a0023c730442243d +:10a5a400212040003800c58f3c00c68f7f88400fb3 +:10a5b400000000003c00c28f0b0050243c00c28ffe +:10a5c400ff0042300b004224ff00423000a0033c55 +:10a5d4006804642421284000ee68400f0000000055 +:10a5e4002118400000a0023c680442242110020209 +:10a5f400000043a03c00c28f0c00422421184000fc +:10a604004400c28f000043ac00a0023c6804422412 +:10a6140021e8c0032400bf8f2000be8f1c00b08f30 +:10a624002800bd270800e00300000000f8ffbd2754 +:10a634000400beaf21f0a00300a0023c3b0342246f +:10a6440021e8c0030400be8f0800bd270800e00312 +:04a654000000000002 +:020000040000fa +:020000041d01dc +:10a65800b8ffbd273c00b7af3400b5af029d173c2b +:10a6680000a0153c3800b6af2000b0af4400bfaf23 +:10a678004000beaf3000b4af2c00b3af2800b2af7b +:10a688002400b1af7829f7262180a0005000a6af9a +:10a698006040a4ae21b000001800a0af00001192e5 +:10a6a800c80020124400bf8f2110f102010042802f +:10a6b80088004230bd004014010010262500022405 +:10a6c800a50022160400032400001382218800003c +:10a6d8001400a3af21f0000004001424ff0073321b +:10a6e8007900622e1c004014010012262110f3028a +:10a6f8000100429004004230e601401000000000d2 +:10a70800858c400f2120000200005382029d033ceb +:10a7180078296324208c027c211063020100429076 +:10a7280004004230edff4010218040020100102655 +:10a73800000013822110f30201004290040042300d +:10a74800fbff405401001026ff0073327900622e8f +:10a75800e6ff401001001226029d043c8010130001 +:10a768007ca78424211082000000428c080040004d +:10a77800000000000cad019df4a6019df4a6019d0a +:10a78800f4a6019df4a6019df4a6019df4a6019de1 +:10a79800f4a6019df4a6019df4a6019df4a6019dd1 +:10a7a800f4a6019df4a6019df4a6019df4a6019dc1 +:10a7b800f4a6019df4a6019df4a6019df4a6019db1 +:10a7c800f4a6019df4a6019df4a6019df4a6019da1 +:10a7d800f4a6019df4a6019df4a6019df4a6019d91 +:10a7e800f4a6019df4a6019df4a6019df4a6019d81 +:10a7f800f4a6019df4a6019df4a6019df4a6019d71 +:10a80800f4a6019df4a6019df4a6019df4a6019d60 +:10a81800f4a6019df4a6019df4a6019df8ac019d46 +:10a82800f4a6019df4a6019df4a6019df4a6019d40 +:10a83800f4a6019df4a6019df4a6019df4a6019d30 +:10a84800f4a6019df4a6019df4a6019df4a6019d20 +:10a85800f4a6019df4a6019df4a6019df4a6019d10 +:10a86800f4a6019df4a6019df4a6019df4a6019d00 +:10a87800f4a6019df4a6019df4a6019df4a6019df0 +:10a88800f4a6019df4a6019df4a6019df4a6019de0 +:10a89800f4a6019df4a6019df4a6019df4a6019dd0 +:10a8a800f4a6019ddcac019df4a6019df4a6019dd2 +:10a8b800f4a6019df4a6019df4a6019df4a6019db0 +:10a8c800f4a6019df4a6019df4a6019df4a6019da0 +:10a8d800f4a6019dccac019df4a6019df4a6019db2 +:10a8e800f4a6019df4a6019df4a6019df4a6019d80 +:10a8f800f4a6019df4a6019df4a6019df4a6019d70 +:10a9080084ac019d78ac019df4a6019df4a6019d3f +:10a91800f4a6019d64ac019d78ac019df4a6019d4f +:10a92800f4a6019ddcac019df4a6019df4a6019d51 +:10a93800c4ab019df4a6019df4a6019df4a6019d5a +:10a9480010ab019df4a6019d78ac019df4a6019d74 +:10a95800f4a6019dfca9019d1c8a400f6040a48ead +:10a968004fff225200001192ffff032444014314b9 +:10a9780000a0033c1800a38f0b1063004400bf8f96 +:10a988004000be8f3c00b78f3800b68f3400b58fbb +:10a998003000b48f2c00b38f2800b28f2400b18f01 +:10a9a8002000b08f0800e0034800bd27a28e400faa +:10a9b80000000000000011923cff20162110f10257 +:10a9c8004400bf8f1800a28f4000be8f3c00b78f95 +:10a9d8003800b68f3400b58f3000b48f2c00b38f99 +:10a9e8002800b28f2400b18f2000b08f0800e00348 +:10a9f8004800bd27218040021000132421b0000028 +:10aa0800a28e400f000000001c8a400f6040a48ef8 +:10aa1800219040002d0002247100421200a0033c46 +:10aa280021204002212860022130c002af8c400f53 +:10aa38001c00a0afff000324760043106040a58ee1 +:10aa480030000224d30042120000000021a00000c0 +:10aa580002a0937221204002212860022130c00206 +:10aa6800af8c400fffff3126208c117c0b00201289 +:10aa780021a054001c8a400f6040a48e2120400071 +:10aa8800212860022130c002af8c400f2190400085 +:10aa9800ff000324efff435402a0937221204002d9 +:10aaa80021286002af8c400f2130c002ff00032430 +:10aab800e20043106040a58e1c00a48f23101400f0 +:10aac800f6fec0170ba044001800a38f1400a48f33 +:10aad80001006224ff0042301800a2af04000224e3 +:10aae800d00082101400a48f02000224d700821024 +:10aaf8005000a48f0000828c040084245000a4af6e +:10ab0800a969400b000054aca28e400f0000000061 +:10ab18009a00c0135000a38f1c8a400f6040a48e77 +:10ab2800ffff032494ff43101800a38f1400401460 +:10ab380001004324e86a400b21804002c9006210ea +:10ab4800000000000500c017ffff31261000a48f89 +:10ab5800000082a0010084241000a4af208c117c86 +:10ab68000d002012218040021c8a400f6040a48ef4 +:10ab7800010043240200642c070080142180400255 +:10ab88002118e3020000638088006330ebff605007 +:10ab98000000438221804002c1fec057000011928c +:10aba8001800a38f1000a48f01006224ff00423018 +:10abb8001800a2afa969400b000080a0a28e400f28 +:10abc800218040021c8a400f6040a48e21904000e2 +:10abd8002d00022492ff42160800132400a0033c13 +:10abe8006040648c010002241c8a400f1c00a2af44 +:10abf800219040002120400221286002af8c400fa4 +:10ac08002130c002ff0003248eff431430000224c9 +:10ac18006040a58e038e400f212040021800a38fac +:10ac28006900601000a0023c211060004400bf8f42 +:10ac38004000be8f3c00b78f3800b68f3400b58f08 +:10ac48003000b48f2c00b38f2800b28f2400b18f4e +:10ac58002000b08f0800e0034800bd27020002244e +:10ac68000000538221804002b969400b1400a2af52 +:10ac780021804002826a400b0a0013243500c01369 +:10ac88001800a38fffff10241c8a400f6040a48e79 +:10ac9800780050101800a38f0500c017ffff312659 +:10aca8001000a48f000082a0010084241000a4af2b +:10acb800208c117cf4ff201e00000000a969400bc5 +:10acc800218040022180400210001324826a400b38 +:10acd800010016241400a48f070094100800022411 +:10ace8000000538221804002b969400b1400a2afd2 +:10acf8000100de27ff00de3300005382b969400bf4 +:10ad0800218040021800a38fc8ff60142110600042 +:10ad18006040a38e4400bf8f0c006394ffff0224a1 +:10ad2800100063300a1003004000be8f3c00b78f4c +:10ad38003800b68f3400b58f3000b48f2c00b38f35 +:10ad48002800b28f2400b18f2000b08f0800e003e4 +:10ad58004800bd275000a48f01006224ff00423044 +:10ad68000000848c1800a2af5000a28f1000a4af7e +:10ad780004004224236b400b5000a2af5000a48f64 +:10ad88000000638c040084241000a3afc86a400b41 +:10ad98005000a4af1c8a400f6040a48e78000324a2 +:10ada8001a004310580003241a0043146040a58e6b +:10adb8001800c012000000001c8a400f6040a48eda +:10adc800956a400b219040006040438c4400bf8f3f +:10add8000c006394ffff0224100063300a10030084 +:10ade8004000be8f3c00b78f3800b68f3400b58f57 +:10adf8003000b48f2c00b38f2800b28f2400b18f9d +:10ae08002000b08f0800e0034800bd27eaffc01209 +:10ae18006040a58e038e400f21204000966a400bab +:10ae280021a000005000a38f0000628c040063245e +:10ae38005000a3afa969400b000054ac038e400f2b +:10ae480021204002b16a400b1c00a48f5000a38f40 +:10ae58000000628c040063245000a3afa969400b72 +:10ae6800000054a40dfec01701005026eb6a400be9 +:10ae78001800a38fffff0224616a400b0b106300c8 +:10ae88006040658c038e400f212040000d6b400b05 +:10ae98001800a28f1c8a400f6040a48e87ff6212a0 +:10aea800ffff0324f6ff431400a0033c1800a48fff +:08aeb8000d6b400b0b10840030 +:020000040000fa +:020000041d01dc +:10aec000e0ffbd271c00bfaf1800beaf21f0a003fc +:10aed0002000c4af2400c5af1000c0a31400c0af51 +:10aee0001400c2270200033cac0764342128400050 +:10aef000c878400f000000001000c2a31000c283f9 +:10af000010004014000000002000c28f0500401017 +:10af1000000000001400c28fffff43302000c28fea +:10af2000000043a42400c28f06004010000000006f +:10af30001400c28f02140200ffff43302400c28fae +:10af4000000043a41000c28321e8c0031c00bf8f8f +:10af50001800be8f2000bd270800e003000000009d +:10af6000d8ffbd272400bfaf2000beaf21f0a00353 +:10af70002800c4af1200c0a71400c0af1000c0a3c7 +:10af80001800c0af1c00c0af2800c28f21204000b5 +:10af9000212800001c000624f27a400f0000000067 +:10afa0001200c2272120400021280000b06b400f72 +:10afb000000000001200c29782130200ffff42301f +:10afc000ff004230030043300200022440006214bc +:10afd000000000001400c2279c1404242128400013 +:10afe000c878400f000000001000c2a31000c28308 +:10aff00039004014000000001400c28f30004010df +:10b00000000000001400c38f0300023c25186200fa +:10b010001800c227212060002128400008000624d3 +:10b02000fc78400f000000001000c2a31000c28393 +:10b0300029004014000000001c00c28f1400c2afa1 +:10b040001400c28fffff42301400c2af1400c28f41 +:10b0500017004010000000001400c38f0300023ce2 +:10b06000251862002800c28f21206000212840009e +:10b070001c000624fc78400f000000001000c2a352 +:10b080001000c28314004014000000002800c28f8a +:10b09000000043941200c2970f00621000000000ed +:10b0a000f4ff02241000c2a3366c400b0000000025 +:10b0b000f4ff02241000c2a3366c400b0000000015 +:10b0c000f4ff02241000c2a3366c400b0000000005 +:10b0d000f4ff02241000c2a31000c28321e8c003c1 +:10b0e0002400bf8f2000be8f2800bd270800e0038a +:10b0f00000000000d8ffbd272400bfaf2000beaf76 +:10b1000021f0a0032800c4af1200c0a71400c0aff4 +:10b110001000c0a31800c0af1c00c0af2800c28f31 +:10b1200021204000212800001c000624f27a400f54 +:10b13000000000001200c22721200000212840004a +:10b14000b06b400f000000001200c2978213020093 +:10b15000ffff4230ff004230030043300200022470 +:10b1600040006214000000001400c2279c14042454 +:10b1700021284000c878400f000000001000c2a342 +:10b180001000c28339004014000000001400c28f78 +:10b1900030004010000000001400c38f0300023c88 +:10b1a000251862001800c2272120600021284000d5 +:10b1b00008000624fc78400f000000001000c2a325 +:10b1c0001000c28329004014000000001c00c28f40 +:10b1d0001400c2af1400c28f021402001400c2afe8 +:10b1e0001400c28f17004010000000001400c38f2d +:10b1f0000300023c251862002800c28f2120600055 +:10b20000212840001c000624fc78400f00000000ac +:10b210001000c2a31000c2831400401400000000fc +:10b220002800c28f000043941200c2970f006210e2 +:10b2300000000000f4ff02241000c2a39b6c400b2e +:10b2400000000000f4ff02241000c2a39b6c400b1e +:10b2500000000000f4ff02241000c2a39b6c400b0e +:10b2600000000000f4ff02241000c2a31000c283fb +:10b2700021e8c0032400bf8f2000be8f2800bd2717 +:10b280000800e00300000000e0ffbd271c00bfaf86 +:10b290001800beaf21f0a0032000c4af1000c0a36f +:10b2a000212000002000c58f8d78400f0000000095 +:10b2b0001000c2a31000c2830a0040140000000066 +:10b2c000854a400f000000000200023c00034434a5 +:10b2d00021280000d878400f00000000ba6c400b15 +:10b2e00000000000000000001000c28321e8c0033d +:10b2f0001c00bf8f1800be8f2000bd270800e00390 +:10b3000000000000e0ffbd271c00bfaf1800beaf6b +:10b3100021f0a0032000c4af1000c0a32120000032 +:10b320002000c58f8d78400f000000001000c2a3e0 +:10b330001000c28316004014000000007135400f59 +:10b34000000000001000c2a30a0004249780400ff0 +:10b35000000000001000c28308004014000000003c +:10b36000854a400f00000000a633400f0000000097 +:10b370001000c283e66c400b0000000000000000db +:10b38000a078400f00000000e56c400b00000000ba +:10b39000000000001000c28321e8c0031c00bf8f22 +:10b3a0001800be8f2000bd270800e0030000000049 +:10b3b000e0ffbd271c00bfaf1800beaf21f0a00307 +:10b3c0002000c4af1000c0a3010002241100c2a3da +:10b3d0002000c28f08004010000000002000c28f33 +:10b3e00000004390020002240300621400000000e9 +:10b3f000020002241100c2a32d34400f00000000ff +:10b400001000c2a31000c2831e0040140000000000 +:10b410001100c293212040000536400f00000000bb +:10b420001000c2a31000c2831900401400000000e5 +:10b430001100c293212040006836400f0000000038 +:10b440001000c2a31000c2831400401400000000ca +:10b450001100c393020002241a00621000000000d1 +:10b46000eb33400f000000001000c2a31000c283a5 +:10b470000d004014000000001000c283336d400b2b +:10b4800000000000000000002b6d400b00000000d9 +:10b49000000000002b6d400b0000000000000000c9 +:10b4a0002b6d400b0000000000000000a078400f52 +:10b4b00000000000cb4a400f00000000326d400b3e +:10b4c00000000000000000001000c28321e8c0035b +:10b4d0001c00bf8f1800be8f2000bd270800e003ae +:10b4e00000000000e0ffbd271c00bfaf1800beaf8a +:10b4f00021f0a0032000c4af2400c5af1000c0a3fa +:10b500002400c48fc16c400f000000001000c2a3d3 +:10b510001000c28305004014000000002000c48f0a +:10b52000ec6c400f000000001000c2a31000c283aa +:10b5300021e8c0031c00bf8f1800be8f2000bd276c +:10b540000800e00300000000e0ffbd271c00bfafc3 +:10b550001800beaf21f0a0032000c4afb036400fea +:10b56000000000001000c2a31000c2830b004014b2 +:10b5700000000000a078400f000000001000c2a3ef +:10b580001000c2830800401400000000cb4a400fa6 +:10b59000000000006b6d400b000000000000000088 +:10b5a0006b6d400b00000000000000001000c28323 +:10b5b00021e8c0031c00bf8f1800be8f2000bd27ec +:10b5c0000800e00300000000e0ffbd271c00bfaf43 +:10b5d0001800beaf21f0a0032d34400f0000000082 +:10b5e0001000c2a31000c28321e8c0031c00bf8f5b +:10b5f0001800be8f2000bd270800e00300000000f7 +:10b60000e0ffbd271c00beaf21f0a00388bf033cb4 +:10b610000061628c4429027c006162ac88bf033cfb +:10b620000061628c8431027c006162ac88bf033ca3 +:10b630002061628c010004248431827c206162ac30 +:10b6400088bf033c2061628c4429027c206162ac8b +:10b6500088bf033c4061628c4408027c406162ac5c +:10b6600088bf033c6061628c010004244408827c32 +:10b67000606162ac88bf033c8061628c010004247d +:10b68000c439827c806162ac88bf033c4060628cbc +:10b69000446b027c406062ac88bf033c8061628c7a +:10b6a0000442027c806162ac88bf033c8061628c92 +:10b6b0008431027c806162ac88bf033c0061628c93 +:10b6c000c418027c006162ac88bf033c2061628cbc +:10b6d00001000424c418827c206162ac88bf033c52 +:10b6e0000061628c0400027c006162ac88bf033c94 +:10b6f0002061628c010004240400827c206162ac21 +:10b7000088bf033cc060628c010004240400827c7a +:10b71000c06062ac88bf033c0061628c8410027c14 +:10b72000006162ac88bf033c2061628c8410027ca3 +:10b73000206162ac88bf033c0061628c0421027c02 +:10b74000006162ac88bf033c2061628c0421027cf2 +:10b75000206162ac88bf033c6010628cc418027c1c +:10b76000601062ac88bf033c3010628cc418027c4d +:10b77000301062ac88bf033c0010628c0400027c75 +:10b78000001062ac88bf033c9010628c030004245c +:10b7900084e6827c901062ac88bf033c9010628c7f +:10b7a00004ce027c901062ac88bf033c6010628cb7 +:10b7b00001000424c418827c601062ac80bf023c8b +:10b7c000005a40ac80bf033c005a628c0100042444 +:10b7d0004429827c005a62ac80bf033c005a628cd0 +:10b7e000010004240442827c005a62ac80bf033c06 +:10b7f000005a628c444a027c005a62ac80bf033c0f +:10b80000005a628c8431027c005a62acc404023c4f +:10b8100000b442340000c2af0f00023c4042423448 +:10b820000400c2af0400c28f401002000000c38faa +:10b830001b006200f401400010180000121000000c +:10b840000800c2af0400c28f401002000000c38f86 +:10b850001b006200f40140001010000004004010c2 +:10b86000000000000800c28f010042240800c2af9f +:10b870000800c28f0101422c0300401400000000a8 +:10b88000000102240800c2af0800c28f040040106b +:10b89000000000000800c28fffff42240800c2af72 +:10b8a0000800c28fff0042302118400080bf023cd8 +:10b8b000305a43ac80bf033c005a628c0100042420 +:10b8c000c47b827c005a62ac88bf033c0061628cfe +:10b8d000c439027c006162ac88bf033c8061628c29 +:10b8e000444a027c806162ac88bf033c2061628c68 +:10b8f000c439027c206162ac88bf033ca061628cc9 +:10b90000444a027ca06162ac88bf033cc060628c88 +:10b910008431027cc06062ac88bf033ce060628c12 +:10b920008431027ce06062ac88bf033c4060628c82 +:10b9300001000424c47b827c406062ac88bf033c6d +:10b940004060628c010004244408827c406062ac48 +:10b9500081bf023cffff0334609043ac81bf033cd6 +:10b960006090628c4408027c609062ac88bf033cab +:10b970004060628c010004244408827c406062ac18 +:10b9800081bf023c009040ac81bf023c109040acb3 +:10b9900081bf023c209040ac81bf023c409040ac53 +:10b9a00081bf033c4090628c01000424049c827c93 +:10b9b000409062ac81bf023cf0ff0324209043a082 +:10b9c00081bf033c2090628c010004240462827ccd +:10b9d000209062ac81bf033c0090628c0100042483 +:10b9e000c47b827c009062ac81bf033c0090628c7f +:10b9f000010004244408827c009062ac88bf033cb0 +:10ba0000c060628c0421027cc06062ac88bf033cd1 +:10ba1000e060628c010004240421827ce06062ac5e +:10ba200088bf033cc060628cc418027cc06062acfa +:10ba300088bf033cc060628c010004248410827cb7 +:10ba4000c06062ac88bf033cc060628c4408027c6a +:10ba5000c06062ac80bf023c005840ac80bf033c79 +:10ba60000058628c010004244429827c005862ac96 +:10ba700080bf033c0058628c010004240442827c95 +:10ba8000005862ac80bf033c0058628c444a027c80 +:10ba9000005862ac80bf033c0058628c8431027c49 +:10baa000005862acc404023c00b442340c00c2af83 +:10bab0000f00023c404242341000c2af1000c28f5f +:10bac000401002000c00c38f1b006200f401400014 +:10bad00010180000121000001400c2af1000c28f36 +:10bae000401002000c00c38f1b006200f4014000f4 +:10baf0001010000004004010000000001400c28f6d +:10bb0000010042241400c2af1400c28f0101422c74 +:10bb10000300401400000000000102241400c2af22 +:10bb20001400c28f04004010000000001400c28ff7 +:10bb3000ffff42241400c2af1400c28fff00423046 +:10bb40002118400080bf023c305843ac80bf033c0a +:10bb50000058628c01000424c47b827c005862acd3 +:10bb600088bf033c4060628c010004248410827c06 +:10bb7000406062ac88bf033c4060628c01000424da +:10bb80000400827c406062ac88bf033cc060628c71 +:10bb9000c45a027cc06062ac88bf033ce060628c27 +:10bba000c45a027ce06062ac88bf033cc060628c17 +:10bbb000010004240442827cc06062ac88bf033c64 +:10bbc0008060628c8473027c806062ac88bf033cbe +:10bbd000a060628c010004248473827ca06062ac4b +:10bbe00088bf033c8060628c446b027c806062ace6 +:10bbf00088bf033ca060628c01000424446b827cfb +:10bc0000a06062ac88bf033cc060628c4429027ca7 +:10bc1000c06062ac88bf033ce060628c4429027c57 +:10bc2000e06062ac88bf033c4060628c446b027c85 +:10bc3000406062ac88bf033c6060628c446b027cf5 +:10bc4000606062ac88bf033c4060628c0463027c2d +:10bc5000406062ac88bf033c6060628c0463027c1d +:10bc6000606062ac88bf033c4060628cc418027c98 +:10bc7000406062ac88bf033c6060628cc418027c88 +:10bc8000606062ac88bf033c4060628c444a027cc6 +:10bc9000406062ac88bf033c6060628c444a027cb6 +:10bca000606062ac88bf033c4060628c8452027c5e +:10bcb000406062ac88bf033c6060628c8452027c4e +:10bcc000606062ac88bf033c4060628cc45a027cf6 +:10bcd000406062ac88bf033c6060628cc45a027ce6 +:10bce000606062ac0100022421e8c0031c00be8f2a +:10bcf0002000bd270800e00300000000b8ffbd27ba +:10bd00004400bfaf4000beaf21f0a0034800c4af65 +:10bd10004c00c5af88bf033ca060628c01000424c6 +:10bd20008473827ca06062ac3984400f0000000004 +:10bd30004800c28f1300422c4b014010000000004d +:10bd40004800c28f80180200029d023c60bd422460 +:10bd5000211062000000428c08004000000000003a +:10bd600068c2019d68c2019dacbd019d68c2019d74 +:10bd700098bf019d68c2019dc4bf019d68c2019d1d +:10bd800068c2019d68c2019d68c2019d68c2019d93 +:10bd900068c2019d68c2019d44c0019d68c2019da9 +:10bda000f4c0019d68c2019da4c1019dd17f400fd7 +:10bdb000000000002400c2affd89400f0000000019 +:10bdc0002800c2af2400c2270000428c1400c2af7a +:10bdd0002800c2270000428c1800c2afeb7f400f42 +:10bde000000000001c00c2aff47f400f0000000004 +:10bdf0002000c2af1000c0a36f84400f00000000fd +:10be00002118400001000224040062140000000018 +:10be10001000c293010042341000c2a30d80400ff5 +:10be200000000000211840000100022404006214f8 +:10be3000000000001000c293020042341000c2a3b0 +:10be40001000c2932c00c2a3252b400f000000005d +:10be50002014027c2d00c2a31400c28f2014027c87 +:10be60002e00c2a31400c28f021202001400c2af3f +:10be70001400c28f2014027c2f00c2a31400c28fb2 +:10be8000021202001400c2af1400c28f2014027c00 +:10be90003000c2a31400c28f021202001400c2af0d +:10bea0001400c28f2014027c3100c2a31c00c28f78 +:10beb0002014027c3200c2a31c00c28f03120200b5 +:10bec0001c00c2af1c00c28f2014027c3300c2a32e +:10bed0002000c28f2014027c3400c2a31c00c28f39 +:10bee000031202001c00c2af1c00c28f2014027c8f +:10bef0003500c2a31800c28f2014027c3600c2a3f2 +:10bf00001800c28f021202001800c2af1800c28fc0 +:10bf10002014027c3700c2a31800c28f0212020054 +:10bf20001800c2af1800c28f2014027c3800c2a3d0 +:10bf30001800c28f021202001800c2af1800c28f90 +:10bf40002014027c3900c2a32c00c2270300042461 +:10bf5000212840000e000624a070400f00000000c1 +:10bf600088bf023c2061428c4001427cff0042308d +:10bf700027100200ff00423001004230ff00443031 +:10bf800088bf033c2061628c4429827c206162acc2 +:10bf90009a70400b000000006f84400f000000000a +:10bfa0003a00c2a33a00c227050004242128400019 +:10bfb00001000624a070400f000000009a70400ba2 +:10bfc00000000000020002243b00c2a34c00c28f0c +:10bfd0000000429006004014000000005b84400f07 +:10bfe000000000003b00c0a30970400b00000000ef +:10bff0004c00c28f0000439001000224070062142d +:10c00000000000004784400f0000000001000224ef +:10c010003b00c2a30970400b000000000200022494 +:10c020003b00c2a33b00c227070004242128400094 +:10c0300001000624a070400f000000009a70400b21 +:10c0400000000000040002243c00c2a34c00c28f88 +:10c05000000042900600401400000000c52a400f76 +:10c06000000000003c00c0a33570400b0000000041 +:10c070004c00c28f000043900100022413006214a0 +:10c0800000000000252b400f000000002118400098 +:10c090000100022409006210000000000f2a400f76 +:10c0a00000000000252b400f000000002014027c3f +:10c0b0003c00c2a33570400b0000000001000224c8 +:10c0c0003c00c2a33570400b0000000004000224b5 +:10c0d0003c00c2a33c00c2270f00042421284000da +:10c0e00001000624a070400f000000009a70400b71 +:10c0f000000000004c00c28f00004390ba000224f0 +:10c100001f006214000000004c00c28f0100422496 +:10c1100000004390ad0002241900621400000000ea +:10c120004c00c28f0200422400004390be00022453 +:10c1300013006214000000004c00c28f0300422470 +:10c1400000004390ef0002240d0062140000000084 +:10c15000010002243d00c2a33d00c22711000424b7 +:10c160002128400001000624a070400f00000000bc +:10c17000488e400f000000009a70400b0000000045 +:10c180003d00c0a33d00c227110004242128400027 +:10c1900001000624a070400f000000009a70400bc0 +:10c1a000000000004c00c28f00004390ba0002243f +:10c1b00025006214000000004c00c28f01004224e0 +:10c1c00000004390ad0002241f0062140000000034 +:10c1d0004c00c28f0200422400004390ca00022497 +:10c1e00019006214000000004c00c28f03004224ba +:10c1f00000004390fe0002241300621400000000bf +:10c20000010002243e00c2a33e00c2271300042402 +:10c210002128400001000624a070400f000000000b +:10c2200064000424a161400f00000000c52a400ff3 +:10c230000000000064000424a161400f0000000021 +:10c24000a98d400f000000003e00c0a33e00c227a1 +:10c25000110004242128400001000624a070400f92 +:10c26000000000000000000021e8c0034400bf8f70 +:10c270004000be8f4800bd270800e003000000001a +:10c28000d0ffbd272c00bfaf2800beaf21f0a00318 +:10c290003000c4af3400c5af3800c6af3000c28f25 +:10c2a000ff0042302400c3273400c48f1000a4af25 +:10c2b0003800c48f1400a4af1800a0af1c00a3afb7 +:10c2c00021200000010005240e0006242138400032 +:10c2d0001d69400f000000002000c2af508082277f +:10c2e000212040000300052421300000ab4c400f0a +:10c2f000000000002000c38f2400c28f21206000b6 +:10c300002128400021300000ab4c400f000000000d +:10c3100021e8c0032c00bf8f2800be8f3000bd274e +:10c320000800e00300000000e0ffbd271c00bfafd5 +:10c330001800beaf21f0a003030002241000c2a326 +:10c340005080822721204000030005242130000076 +:10c35000ab4c400f0000000021e8c0031c00bf8f61 +:10c360001800be8f2000bd270800e0030000000079 +:10c37000e0ffbd271c00bfaf1800beaf21f0a00337 +:10c38000211880002110a0002000c3a32400c2a710 +:10c390001000c0afef70400b0000000000a0023c96 +:10c3a000441d43241000c28f21106200000040a0f1 +:10c3b0001000c28f010042241000c2af1000c28fd3 +:10c3c0000a00422cf5ff40140000000000a0023ccf +:10c3d00080ff0324441d43a000a0023c441d4224ce +:10c3e0002000c393010043a02400c2970212020060 +:10c3f000ffff4230ff00433000a0023c441d4224b6 +:10c40000020043a02400c297ff00433000a0023c7a +:10c41000441d4224030043a000a0023c441d4424c8 +:10c42000040005248c72400f0000000021e8c003c6 +:10c430001c00bf8f1800be8f2000bd270800e0033e +:10c4400000000000e0ffbd271c00bfaf1800beaf1a +:10c4500021f0a003211080002400c5af2000c2a35a +:10c46000010002241400c2af1000c0af2571400bc0 +:10c470000000000000a0023c441d43241000c28fb5 +:10c4800021106200000040a01000c28f0100422471 +:10c490001000c2af1000c28f0a00422cf5ff4014fa +:10c4a0000000000000a0023c80ff0324441d43a0c4 +:10c4b00000a0023c441d42242000c393010043a07d +:10c4c00000a0023c441d422481ff0324020043a03b +:10c4d00000a0023c441d4424020005248c72400f3d +:10c4e0000000000000a0023c441d422402004290d3 +:10c4f0002120400000a0023c381d452402000624f3 +:10c500000873400f000000001400c2af1400c38f76 +:10c510000100022405006210000000002400c28f08 +:10c52000000040a45871400b0000000000a0023c35 +:10c53000381d429000120200201e027c00a0023c26 +:10c54000381d4224010042902016027c2510620012 +:10c550002016027cffff43302400c28f000043a45a +:10c5600021e8c0031c00bf8f1800be8f2000bd272c +:10c570000800e00300000000e0ffbd271c00bfaf83 +:10c580001800beaf21f0a0030a000224288182af68 +:10c59000020002242c8182af05000424001005242f +:10c5a000dc70400f000000001f5c02241000c2a7d6 +:10c5b0001000c2972120000021284000dc70400fad +:10c5c0000000000021e8c0031c00bf8f1800be8fd0 +:10c5d0002000bd270800e00300000000e0ffbd27a9 +:10c5e0001c00bfaf1800beaf21f0a0030a00022458 +:10c5f000288182af020002242c8182af050004242e +:10c6000000100524dc70400f000000001f5c0224b5 +:10c610001000c2a71000c29721200000212840006e +:10c62000dc70400f0000000021e8c0031c00bf8f39 +:10c630001800be8f2000bd270800e00300000000a6 +:10c64000e0ffbd271c00bfaf1800beaf21f0a00364 +:10c6500019000224288182af010002242c8182afbc +:10c660000500042400280524dc70400f00000000b1 +:10c670001f5c02241000c2a71000c29721200000f6 +:10c6800021284000dc70400f0000000021e8c003ba +:10c690001c00bf8f1800be8f2000bd270800e003dc +:10c6a00000000000e0ffbd271c00bfaf1800beafb8 +:10c6b00021f0a00328000224288182af0100022477 +:10c6c0002c8182af0500042400400524dc70400f5b +:10c6d000000000001f0c02241000c2a71000c29727 +:10c6e0002120000021284000dc70400f00000000e5 +:10c6f00021e8c0031c00bf8f1800be8f2000bd279b +:10c700000800e00300000000e0ffbd271c00bfaff1 +:10c710001800beaf21f0a00364000224288182af7c +:10c72000010002242c8182af0500042400a00534fe +:10c73000dc70400f000000001f0402241000c2a79c +:10c740001000c2972120000021284000dc70400f1b +:10c750000000000021e8c0031c00bf8f1800be8f3e +:10c760002000bd270800e00300000000e0ffbd2717 +:10c770001c00bfaf1800beaf21f0a00301000224cf +:10c780001000c2af2120000000800534dc70400f93 +:10c79000000000001000c2af1400c22721200000da +:10c7a000212840001171400f000000001400c397c1 +:10c7b000ff39022404006210000000002110000074 +:10c7c000f571400b000000005e71400f000000009a +:10c7d0001000c28f21e8c0031c00bf8f1800be8f5d +:10c7e0002000bd270800e00300000000e0ffbd2797 +:10c7f0001c00bfaf1800beaf21f0a003010004244d +:10c800001000c227212840001171400f00000000d5 +:10c810001000c2972016027c21e8c0031c00bf8fc5 +:10c820001800be8f2000bd270800e00300000000b4 +:10c83000e0ffbd271c00bfaf1800beaf21f0a00372 +:10c84000020004241000c227212840001171400f6b +:10c85000000000001000c297c2100200ffff42302b +:10c8600080100200ffff42302016027c21e8c00346 +:10c870001c00bf8f1800be8f2000bd270800e003fa +:10c8800000000000e0ffbd271c00bfaf1800beafd6 +:10c8900021f0a003030004241000c2272128400037 +:10c8a0001171400f000000001000c2972016027c9a +:10c8b00021e8c0031c00bf8f1800be8f2000bd27d9 +:10c8c0000800e00300000000e0ffbd271c00bfaf30 +:10c8d0001800beaf21f0a003030004241000c227fb +:10c8e000212840001171400f000000001000c29785 +:10c8f000211840002c81828f1b006200f40140004f +:10c9000010180000121000002016027c21e8c0035d +:10c910001c00bf8f1800be8f2000bd270800e00359 +:10c9200000000000e0ffbd271c00bfaf1800beaf35 +:10c9300021f0a003040004241000c2272128400095 +:10c940001171400f000000001000c2972016027cf9 +:10c9500021e8c0031c00bf8f1800be8f2000bd2738 +:10c960000800e00300000000e0ffbd271c00bfaf8f +:10c970001800beaf21f0a003040004241000c22759 +:10c98000212840001171400f000000001000c297e4 +:10c99000211840002881828f1b006200f4014000b2 +:10c9a00010180000121000002016027c21e8c003bd +:10c9b0001c00bf8f1800be8f2000bd270800e003b9 +:10c9c00000000000f0ffbd270c00beaf21f0a00367 +:10c9d0008e0102240000c2af80bf023c005040ac78 +:10c9e00080bf033c0050628c01000424444a827cd6 +:10c9f000005062ac0000c38f80bf023c405043ac8b +:10ca000080bf033c0050628c01000424c47b827c04 +:10ca1000005062acd08180afd48180af21e8c003e8 +:10ca20000c00be8f1000bd270800e00300000000ce +:10ca3000f0ffbd270c00beaf21f0a0031000c4af73 +:10ca40002110a0001400c2a3010002240000c2af04 +:10ca500080bf033c0050628c010004240400827cef +:10ca6000005062ac0000000080bf023c0050428ccd +:10ca700001004230fcff40140000000080bf023c77 +:10ca80001050428c000442300500401000000000ad +:10ca9000d08180af21100000f872400b0000000030 +:10caa0000400c0afd072400b000000000400c28f31 +:10cab0001000c38f21106200000042902118400036 +:10cac00080bf023c505043acd48180afc872400b51 +:10cad0000000000080bf023c1050428c0004423035 +:10cae0000b00401400000000d481828f0c00033c36 +:10caf000013563342a18430001006338ff006330b6 +:10cb000001004224d48182af0500601000000000c3 +:10cb1000d08180af0000c0afcd72400b000000009c +:10cb200080bf023c1050428c00404230e9ff40146c +:10cb3000000000000400c28f010042240400c2afc4 +:10cb40001400c3930400c28f2a104300d7ff40147f +:10cb50000000000080bf033c0050628c01000424f0 +:10cb60008410827c005062acd48180aff072400ba4 +:10cb70000000000080bf023c1050428c0004423094 +:10cb80000b00401400000000d481828f0c00033c95 +:10cb9000013563342a18430001006338ff00633015 +:10cba00001004224d48182af050060100000000023 +:10cbb000d08180af0000c0aff572400b00000000d4 +:10cbc00080bf023c0050428c04004230e9ff401418 +:10cbd0000000000001000224d08182af0000c28f5b +:10cbe00021e8c0030c00be8f1000bd270800e00341 +:10cbf00000000000f8ffbd270400beaf21f0a00335 +:10cc0000211080000800c2a32110000021e8c00309 +:10cc10000400be8f0800bd270800e00300000000ec +:10cc2000f0ffbd270c00beaf21f0a003211880004b +:10cc30001400c5af2110c0001000c3a31800c2a388 +:10cc4000010002240400c2af80bf033c0050628c8c +:10cc5000010004240400827c005062acd48180afc7 +:10cc60002373400b0000000080bf023c1050428c38 +:10cc7000000442300500401000000000d08180af69 +:10cc800021100000c073400b0000000080bf023c78 +:10cc90000050428c01004230f3ff401400000000bd +:10cca0001000c39380bf023c505043acd48180af8e +:10ccb0004173400b0000000080bf023c1050428cca +:10ccc000000442300b00401400000000d481828f29 +:10ccd0000c00033c013563342a184300010063381b +:10cce000ff00633001004224d48182af0500601050 +:10ccf00000000000d08180af21100000c073400b05 +:10cd00000000000080bf023c1050428c00404230c6 +:10cd1000e9ff4014000000000000c0af9873400b12 +:10cd20000000000080bf033c0050628c010004241e +:10cd3000c418827c005062acd48180af6473400b15 +:10cd40000000000080bf023c1050428c00044230c2 +:10cd50000b00401400000000d481828f0c00033cc3 +:10cd6000013563342a18430001006338ff00633043 +:10cd700001004224d48182af050060100000000051 +:10cd8000d08180af21100000c073400b0000000074 +:10cd900080bf023c0050428c08004230e9ff401442 +:10cda000000000000000c28f1400c38f2110620039 +:10cdb00080bf033c6050638cff006330000043a0e1 +:10cdc00080bf033c0050628c010004244429827c13 +:10cdd000005062ac80bf033c0050628c0100042410 +:10cde0000421827c005062acd48180af9073400bf0 +:10cdf0000000000080bf023c1050428c0004423012 +:10ce00000b00401400000000d481828f0c00033c12 +:10ce1000013563342a18430001006338ff00633092 +:10ce200001004224d48182af0500601000000000a0 +:10ce3000d08180af21100000c073400b00000000c3 +:10ce400080bf023c0050428c10004230e9ff401489 +:10ce5000000000000000c28f010042240000c2afa9 +:10ce60001800c3930000c28f2a104300adff401486 +:10ce70000000000080bf033c0050628c01000424cd +:10ce80008410827c005062acd48180afb873400bb8 +:10ce90000000000080bf023c1050428c0004423071 +:10cea0000b00401400000000d481828f0c00033c72 +:10ceb000013563342a18430001006338ff006330f2 +:10cec00001004224d48182af050060100000000000 +:10ced000d08180af21100000c073400b0000000023 +:10cee00080bf023c0050428c04004230e9ff4014f5 +:10cef0000000000001000224d08182af0400c28f34 +:10cf000021e8c0030c00be8f1000bd270800e0031d +:10cf100000000000f8ffbd270400beaf21f0a00311 +:10cf2000d081828f21e8c0030400be8f0800bd2796 +:10cf30000800e0030000000098ffbd276400bfafb9 +:10cf40006000beaf21f0a003010002241000c2afb8 +:10cf5000c404023c00b442341400c2af05000224f1 +:10cf60001800c2af6190400f000000001c00c2af6b +:10cf700088bf023c40000324042043ac1800c28f49 +:10cf800001004230ff0042301d0040100000000050 +:10cf90001400c28f2000c2af2400c0aff173400b59 +:10cfa000000000002400c28f010042242400c2af10 +:10cfb0002000c38f36fe023c803c423421106200c8 +:10cfc0002000c2af2000c38fc901023c81c342349c +:10cfd0002b106200f3ff4010000000006190400f32 +:10cfe000000000002800c2af88bf023c2400c38fad +:10cff000004043ac2800c48feb8f400f00000000be +:10d000001800c28f0200423068004010000000008b +:10d010001400c28f2c00c2af2c00c28f3000c2aff0 +:10d020002c00c38fc404023c01b442342b106200b4 +:10d0300008004014000000000800023c3400c2afa9 +:10d040003000c28f421002003000c2af1674400b95 +:10d05000000000003400c0af3400c28f3800c2afff +:10d060006190400f000000003c00c2af88bf023c4e +:10d070000030428c0003427cff0042304000c2afcf +:10d080004000c28f090040140000000088bf023c2d +:10d0900000100324083043ac88bf023c0030428caf +:10d0a00000084230fcff4014000000004000c28f26 +:10d0b0004400c2af81bf023c30f240ac81bf023cb1 +:10d0c00099aa033c5566633430f243ac81bf023cfd +:10d0d0006655033caa99633430f243ac81bf023ced +:10d0e00000f0428c5800c2af5800c28fc4a4027c2a +:10d0f0005800c2af5800c38f3800c28f251062009d +:10d100005800c2af5800c38f81bf023c00f043ac4f +:10d1100081bf023c00f0428c5800c2af81bf023c8c +:10d120003333033c3333633430f243ac4400c28fb7 +:10d130004800c2af4800c28f13004010000000003a +:10d1400088bf023c0030428c0003427cff0042302a +:10d150004c00c2af4c00c28f100040140000000011 +:10d1600088bf023c00100324083043ac88bf023c57 +:10d170000030428c00084230fcff401400000000e8 +:10d180006874400b0000000088bf023c00100324bc +:10d19000043043ac6874400b000000000000000045 +:10d1a0003c00c48feb8f400f000000001800c28fbe +:10d1b000040042300c0040100000000088bf023c18 +:10d1c0000040428c5000c2af5000c28f3000423449 +:10d1d0005000c2af88bf023c5000c38f004043ac38 +:10d1e0000590400f000000001400c28f5400c2af31 +:10d1f00081bf023c00f0428cc00c427cff004230f8 +:10d200005400c38f061043005400c2af1c00c48feb +:10d21000eb8f400f0000000021200000928f400f94 +:10d220000000000081bf033c00f0628c4408027cd7 +:10d2300000f062ac81bf023cffff0334609043ac5e +:10d24000806d400f000000005f90400f0000000064 +:10d25000175f400f000000008d8b400f00000000a2 +:10d26000e183400f00000000587f400f00000000e5 +:10d270003c8e400f00000000d589400f00000000e8 +:10d280009120400f000000003967400f00000000af +:10d290005052400f000000007984400f0000000051 +:10d2a000029d023c203e4424578f400f00000000a6 +:10d2b000ad52400f00000000e689400f0000000062 +:10d2c0005b2d400f00000000b64e400f0000000034 +:10d2d0000f2a400f000000002120000090010524cb +:10d2e000eb60400f00000000029d023c3c3e4424e5 +:10d2f00001000524688f400f00000000a28b400f42 +:10d3000000000000b88b400f000000000100022464 +:10d310001000c2afee74400b00000000b88b400f4d +:10d32000000000002e2b400f00000000d64e400fe2 +:10d33000000000007d25400f00000000f883400f32 +:10d3400000000000747f400f000000008e84400f3a +:10d3500000000000068a400f00000000702d400f02 +:10d360000000000021200000fe5f400f00000000d0 +:10d37000110040100000000088bf023c2061428c78 +:10d380008001427cff00423027100200ff00423043 +:10d3900001004230ff00443088bf033c2061628cb2 +:10d3a0008431827c206162ac212000009001052440 +:10d3b000eb60400f000000001000c38f010002244a +:10d3c000d6ff6210000000001000c28f21e8c003e9 +:10d3d0006400bf8f6000be8f6800bd270800e003b7 +:10d3e00000000000e8ffbd271400bfaf1000beaf73 +:10d3f00021f0a003806d400f0000000021e8c00371 +:10d400001400bf8f1000be8f1800bd270800e00376 +:10d4100000000000e8ffbd271400bfaf1000beaf42 +:10d4200021f0a003211080001800c2a31800c283bd +:10d4300021204000b584400f0000000021e8c00317 +:10d440001400bf8f1000be8f1800bd270800e00336 +:10d4500000000000d0ffbd272c00bfaf2800beafea +:10d4600021f0a003211880002110a0003800c6afd1 +:10d470003000c3a33400c2a71000c0a33000c39380 +:10d480006b0002241c006214000000001400c2277c +:10d49000212040002128000010000624f27a400fcd +:10d4a000000000001400c2273800c48f212840006b +:10d4b0001000062421380000823c400f00000000cc +:10d4c0001000c2a31000c2832a0040140000000014 +:10d4d000b480828f2700401000000000b480828f4b +:10d4e0001400c3272120600009f84000000000005c +:10d4f0005d75400b000000003000c3936c000224f7 +:10d500001c006214000000002400c22721204000fb +:10d510002128000004000624f27a400f00000000d9 +:10d520002400c2273800c48f2128400004000624ac +:10d5300021380000823c400f000000001000c2a310 +:10d540001000c2830b00401400000000b080828fe6 +:10d550000800401000000000b080828f2400c393b8 +:10d56000212060002500c3932128600009f84000b5 +:10d570000000000021e8c0032c00bf8f2800be8ff0 +:10d580003000bd270800e00300000000e0ffbd27d9 +:10d590001c00bfaf1800beaf21f0a0032000c4af35 +:10d5a0002400c5af1000c0a32000c28f03004010ac +:10d5b000000000002000c28fb08082af2400c28f24 +:10d5c00003004010000000002400c28fb48082af2e +:10d5d00004000424029d023c54d44524193d400f0c +:10d5e000000000001000c28321e8c0031c00bf8fb0 +:10d5f0001800be8f2000bd270800e00300000000d7 +:10d60000d0ffbd272c00bfaf2800beaf21f0a00384 +:10d610003000c4af2000c0a33000c48f107b400f87 +:10d6200000000000010042242200c2a72200c2978d +:10d630001000a0af1400a0af1800a0af0400042495 +:10d64000670005243000c68f21384000ff39400fa5 +:10d65000000000002000c2a32000c28321e8c00314 +:10d660002c00bf8f2800be8f3000bd270800e003cc +:10d6700000000000d0ffbd272c00bfaf2800beafc8 +:10d6800021f0a0032000c0a31000a0af1400a0afa1 +:10d690001800a0af04000424650005242130000018 +:10d6a00021380000ff39400f000000002000c2a315 +:10d6b0002000c28321e8c0032c00bf8f2800be8f4a +:10d6c0003000bd270800e00300000000d0ffbd27a8 +:10d6d0002c00bfaf2800beaf21f0a0033000c4afc4 +:10d6e0002000c0a31000a0af1400a0af1800a0af8e +:10d6f00004000424650005242130000021380000c6 +:10d70000ff39400f000000002000c2a32000c283a8 +:10d7100021e8c0032c00bf8f2800be8f3000bd273a +:10d720000800e00300000000d0ffbd272c00bfafc1 +:10d730002800beaf21f0a0033000c4af2000c0a37a +:10d740003000c48f107b400f000000000100422415 +:10d750002200c2a72200c2971000a0af1400a0af01 +:10d760001800a0af04000424670005243000c68f11 +:10d7700021384000ff39400f000000002000c2a304 +:10d780002000c28321e8c0032c00bf8f2800be8f79 +:10d790003000bd270800e00300000000b8ffbd27ef +:10d7a0004400bfaf4000beaf21f0a0032000c0a3e3 +:10d7b0002400c227212040006516400f0000000011 +:10d7c0002000c2a32000c283170040140000000004 +:10d7d0002400c29782130200ffff4230ff00423054 +:10d7e00003004330020002240d0062140000000018 +:10d7f0001000a0af1400a0af1800a0af04000424d4 +:10d80000690005242130000021380000ff39400f55 +:10d81000000000002000c2a30a76400b00000000b8 +:10d82000f4ff02242000c2a32000c28321e8c00329 +:10d830004400bf8f4000be8f4800bd270800e003b2 +:10d8400000000000d0ffbd272c00bfaf2800beaff6 +:10d8500021f0a0032000c0a31000a0af1400a0afcf +:10d860001800a0af040004246a0005242130000041 +:10d8700021380000ff39400f000000002000c2a343 +:10d880002000c28321e8c0032c00bf8f2800be8f78 +:10d890003000bd270800e00300000000b8ffbd27ee +:10d8a0004400bfaf4000beaf21f0a0032000c0a3e2 +:10d8b0002400c227212040006516400f0000000010 +:10d8c0002000c2a32000c283170040140000000003 +:10d8d0002400c29782130200ffff4230ff00423053 +:10d8e00003004330020002240d0062140000000017 +:10d8f0001000a0af1400a0af1800a0af04000424d3 +:10d90000680005242130000021380000ff39400f55 +:10d91000000000002000c2a34a76400b0000000077 +:10d92000f4ff02242000c2a32000c28321e8c00328 +:10d930004400bf8f4000be8f4800bd270800e003b1 +:04d9400000000000e3 +:020000040000fa +:020000041d01dc +:10d944004a462e636f6d00000a0d000025732025e2 +:10d9540073202573202573202573000068656c707f +:10d9640000000000706f7765720000000a5b73743a +:10d974006174655d20706172616d657465722069a2 +:10d984007320696e76616c69642e20205479706509 +:10d99400202768656c702720666f72206d6f726532 +:10d9a40020696e666f0a00006f6e00005475726e17 +:10d9b400696e67206368616c6574277320696e768d +:10d9c4006572746572204f4e0a0000006f6666002f +:10d9d4005475726e696e67206368616c6574277331 +:10d9e40020696e766572746572204f46460a00009f +:10d9f4000a5b73746174655d20706172616d657436 +:10da0400657220697320696e76616c69642e2020ca +:10da140054797065202768656c702720666f7220c2 +:10da240076616c69642076616c7565730a00000028 +:10da34000a00000077696669000000000a5b7661ed +:10da44006c75655d20706172616d657465722069c5 +:10da54007320696e76616c69642e20205479706538 +:10da6400202768656c702720666f72206d6f726561 +:10da740020696e666f0a00005475726e696e6720c5 +:10da840057694669206d6f64756c65204f4e0a00b6 +:10da94005769466920616c726561647920636f6eb1 +:10daa4006e65637465642e2e2e0a00005475726ec2 +:10dab400696e672057694669206d6f64756c6520cf +:10dac4004f46462e2e2e20476f6f64627965210ad9 +:10dad4000000000057694669206d6f64756c65200d +:10dae400616c7265616479204f46462e2e2e207437 +:10daf4006861742773207765697264210a000000e5 +:10db0400737461747573000057694669206d6f649e +:10db1400756c65204f46460a000000005769466947 +:10db240020436f6e6e65637465640a0057694669c5 +:10db340020446973636f6e6e65637465640a0000e4 +:10db440057694669204552524f520a00576946693f +:10db540020737461746520556e6b6e6f776e210a45 +:10db6400000000006261747465727900256600002b +:10db74004261747465727920566f6c746167653a9a +:10db840020000000256400004261747465727920ed +:10db94006368617267652063757272656e743a209a +:10dba400000000006d410a00766f6c7461676500c7 +:10dbb40063757272656e7400736f6300426174748e +:10dbc40065727920534f433a20000000250a000073 +:10dbd40047656e6572616c207374617475733a0a7b +:10dbe40000000000496e76657274657220706f776c +:10dbf40065722072656c61793a204f46460a0000ce +:10dc0400496e76657274657220706f7765722072e2 +:10dc1400656c61793a204f4e0a000000496e7665c2 +:10dc24007274657220706f7765722072656c6179a9 +:10dc34003a20554e4b4e4f574e0a000057694669dd +:10dc44003a204d6f64756c65206973207475726e2b +:10dc54006564204f46460a00576946693a20436f77 +:10dc64006e6e656374656420746f2041500a000011 +:10dc7400576946693a20446973636f6e6e656374cd +:10dc840065642066726f6d2041500a0057694669c9 +:10dc94003a204d6f64756c6520696e697469616cb6 +:10dca400697a6174696f6e206572726f720a00001e +:10dcb400576946693a20556e6b6e6f776e207374a0 +:10dcc4006174650a00000000252e32660000000021 +:10dcd400560a000025646d410a00000025642525cc +:10dce4000a000000626f6f746c6f616465720000fb +:10dcf4000a5b636f6d6d616e645d20706172616d4e +:10dd04006574657220697320696e76616c69642e2e +:10dd1400202054797065202768656c702720666f11 +:10dd240072206d6f726520696e666f0a00000000d4 +:10dd3400737461727400000041637469766174697c +:10dd44006e6720626f6f746c6f616465720a0000a5 +:10dd540073746f70000000004465616374697661d8 +:10dd640074696e6720626f6f746c6f616465720aa8 +:10dd7400000000000a426f6f746c6f61646572206a +:10dd8400636c69656e7420636f6e6e65637465643d +:10dd94000a0000000a426f6f746c6f616465722040 +:10dda400636c69656e74206e6f7420636f6e6e654c +:10ddb400637465640a0000006465627567000000ae +:10ddc400556e6b6e6f776e20636f6d6d616e640a56 +:04ddd4000a00000041 +:020000040000fa +:020000041d01dc +:10ddd8002148c000214080003b00e0142118a00029 +:10dde8002b10a600480040102010c27008004010f8 +:10ddf800023c090023200200062088000418450080 +:10de0800044846002518830004404800023c0900e5 +:10de18001b006700f401e000ffff2b31022c080013 +:10de2800125000001020000002504b710034040012 +:10de38002530c5002b60ca001b006700f401e00014 +:10de4800090080512330ca002130c9002b18c900ad +:10de5800050060542330ca002b20ca002118c900cd +:10de68000b3064002330ca001b00c700f401e00037 +:10de7800ffff0831122000001018000002208b70ec +:10de8800001c0300254068002b1804011b00c70074 +:10de9800f401e00009006050234004012140090119 +:10dea8002b18090105006054234004012b180401b4 +:10deb800214809010b4023012340040106104800b2 +:10dec8000800e003211800002b10a70047004014a9 +:10ded8002050ea704800401520000c242b10e50063 +:10dee80005004014231086002b108600cd004054f6 +:10def80021108000231086002328a7002b208200f1 +:10df08000800e0032318a4000600c01420102271a2 +:10df1800010002241b004600f401c0001248000062 +:10df28002010227182004054200008242328a900d0 +:10df3800021c0900ffff27311b00a300f401600049 +:10df4800025c0800122000001050000002208770b8 +:10df580000340a002530cb002b50c4001b00a3005e +:10df6800f4016000090040512330c4002130c90089 +:10df78002b28c9000500a0542330c4002b50c4002e +:10df88002128c9000b30aa002330c4001b00c3009d +:10df9800f4016000ffff0831122000001028000083 +:10dfa80002388770002c05002540a8002b200701a7 +:10dfb8001b00c300f40160000900805023400701e2 +:10dfc800214009012b18090105006054234007016d +:10dfd8002b180701214809010b40230123400701a1 +:10dfe800061048000800e0032118000021108000f6 +:10dff8000800e0032118a00023608a0104384701c3 +:10e00800065886012558670106688501023c0b0001 +:10e018001b00a701f401e000ffff6f310610840127 +:10e02800042845012528450002140500043046014e +:10e03800127000001018000002c0cf71004c0300dd +:10e04800254822012b1038011b00a701f401e0002c +:10e058000a0040100420440121482b012b102b01f9 +:10e0680006004014ffffce252b1038010400405055 +:10e0780023483801ffffce2521482b0123483801ca +:10e088001b002701f401e000ffffa5301268000023 +:10e09800101800000278af71001403002510450025 +:10e0a8002b184f001b002701f401e0000b00601043 +:10e0b80000440e0021104b002b184b000700601481 +:10e0c800ffffad252b184f00050060102540a80163 +:10e0d800ffffad2521104b0000440e002540a8018c +:10e0e8001900060123784f00104800001240000074 +:10e0f8002b28e90121182001213820013d00a01416 +:10e10800121000004300e9512b1882002318e30184 +:10e11800233088002b2086002318640004608301c4 +:10e128000610460125104c000800e00306184301bc +:10e13800234002010448490006300501021c090079 +:10e148001b00c300f4016000ffff273106580401db +:10e158000428450025586501022c0b0004404400a2 +:10e1680012500000106000000250477100640c005b +:10e178002520ac002b288a001b00c300f401600096 +:10e188000600a05023208a00212089002b2889001e +:10e198001d00a0102b308a0023208a001b0083005a +:10e1a800f4016000ffff6b311230000010500000d6 +:10e1b8000230c770002c0a002528ab002b50a6009f +:10e1c8001b008300f40160005bff40512328a60078 +:10e1d8002128a9002b20a90057ff80542328a60036 +:10e1e8002b50a6002120a9000b288a00d077400bcd +:10e1f8002328a600234046002318eb002b104800d4 +:10e208004578400b23186200212889006878400b64 +:10e218000b20a600f8ff6054234046004678400bc8 +:10e22800211800000800e00300000000e0ffbd27ff +:10e238001c00bfaf1800beaf21f0a0032000c4af80 +:10e248002400c5af1000c0a32000c48f2400c58fd0 +:10e25800297d400f000000001000c2a31000c283f7 +:10e2680021e8c0031c00bf8f1800be8f2000bd2707 +:10e278000800e00300000000e0ffbd271c00bfaf5e +:10e288001800beaf21f0a0031000c0a3897d400f85 +:10e29800000000001000c2a31000c28321e8c003e0 +:10e2a8001c00bf8f1800be8f2000bd270800e003a8 +:10e2b80000000000f0ffbd270c00beaf21f0a00356 +:10e2c8001000c4af0000c0a30000c28321e8c0034f +:10e2d8000c00be8f1000bd270800e00300000000fe +:10e2e800e8ffbd271400bfaf1000beaf21f0a003a8 +:10e2f8001800c4af1800c48fd54a400f00000000b2 +:10e3080021e8c0031400bf8f1000be8f1800bd277e +:10e318000800e00300000000e8ffbd271400bfafbd +:10e328001000beaf21f0a0031800c4af1c00c5af99 +:10e338001800c48f1c00c58fc349400f000000009f +:10e3480021e8c0031400bf8f1000be8f1800bd273e +:10e358000800e00300000000e8ffbd271400bfaf7d +:10e368001000beaf21f0a0031800c4af1c00c5af59 +:10e378001800c48f1c00c58f4b49400f00000000d7 +:10e3880021e8c0031400bf8f1000be8f1800bd27fe +:10e398000800e00300000000e8ffbd271400bfaf3d +:10e3a8001000beaf21f0a0031800c4af1c00c5af19 +:10e3b8002110c0002000c2a72000c2971800c48ff7 +:10e3c8001c00c58f21304000164a400f0000000095 +:10e3d80021e8c0031400bf8f1000be8f1800bd27ae +:10e3e8000800e00300000000e0ffbd271c00bfafed +:10e3f8001800beaf21f0a0032000c4af2400c5afb1 +:10e408002800c6af10808297f8ff42241600c2a7e2 +:10e418001000c0af1400c0a31600c3972800c28f15 +:10e428002b10620012004014000000002400c38f6b +:10e438001000c28f211862002800c28fffff4230ef +:10e448002000c48f2128600021304000e878400f68 +:10e4580000000000ff0043301400c2932110620046 +:10e46800ff0042301400c2a33e79400b00000000b8 +:10e478002400c38f1000c28f211862001600c297b3 +:10e488002000c48f2128600021304000e878400f28 +:10e4980000000000ff0043301400c2932110620006 +:10e4a800ff0042301400c2a31400c2830f004014be +:10e4b800000000001600c2972800c38f23106200d6 +:10e4c8002800c2af1600c2971000c38f2110620047 +:10e4d8001000c2af1600c2972000c38f211062003f +:10e4e8002000c2af0879400b0000000000000000c7 +:10e4f8001400c28321e8c0031c00bf8f1800be8f20 +:10e508002000bd270800e00300000000e8ffbd2749 +:10e518001400bfaf1000beaf21f0a0031800c4afb5 +:10e528001c00c5af2110c0002000c2a72000c29760 +:10e538001800c48f1c00c58f213040008149400f4e +:10e548000000000021e8c0031400bf8f1000be8f38 +:10e558001800bd270800e00300000000e0ffbd2709 +:10e568001c00bfaf1800beaf21f0a0032000c4af4d +:10e578002400c5af2800c6af10808297f8ff422458 +:10e588001600c2a71000c0af1400c0a31600c3979e +:10e598002800c28f2b1062001200401400000000f7 +:10e5a8002400c38f1000c28f211862002800c28f78 +:10e5b800ffff42302000c48f212860002130400036 +:10e5c8004579400f00000000ff0043301400c2935b +:10e5d80021106200ff0042301400c2a39b79400b57 +:10e5e800000000002400c38f1000c28f21186200b1 +:10e5f8001600c2972000c48f2128600021304000f7 +:10e608004579400f00000000ff0043301400c2931a +:10e6180021106200ff0042301400c2a31400c2831c +:10e628000f004014000000001600c2972800c38f96 +:10e63800231062002800c2af1600c2971000c38fd3 +:10e64800211062001000c2af1600c2972000c38fcd +:10e65800211062002000c2af6579400b0000000065 +:10e66800000000001400c28321e8c0031c00bf8f13 +:10e678001800be8f2000bd270800e003000000003e +:10e688002110c000214080003e00e0142118a000a5 +:10e698002b30a6004600c010000000002020447067 +:10e6a80008008010022c0200232804000628a80075 +:10e6b80004188300041082002518a3000440880071 +:10e6c800022c02001b006500f401a000ffff493086 +:10e6d800026408001250000010580000022049711e +:10e6e800003c0b002538ec002b30e4001b006500d3 +:10e6f800f401a0000b00c0102318e4002138e20048 +:10e708002b18e20006006014ffff4a252b18e400ce +:10e71800040060102318e400ffff4a252138e200b6 +:10e728002318e4001b006500f401a000ffff083176 +:10e73800122000001038000002488970003c0700d1 +:10e748002540e8002b3009011b006500f401a000fa +:10e758000600c010214002012b10020103004014e2 +:10e76800ffff84242b48090123208900004c0a005c +:10e778002548890021280000211020010800e00315 +:10e788002118a0002b10a7004200405421280000a7 +:10e798002018e3704300601420000a242b28e500a9 +:10e7a800c500a0142b208600e079400b0100892cbd +:10e7b8000600401420184370010003241b00620067 +:10e7c800f401400012100000201843707a006054d1 +:10e7d800200008242348a200023c0200ffff4b301f +:10e7e800010005241b002701f401e000026c080069 +:10e7f800125000001060000002204b71001c0c0039 +:10e8080025186d002b3064001b002701f401e0007f +:10e818000900c05023186400211862002b306200e0 +:10e828000400c014ffff4a252b306400a500c05423 +:10e83800ffff4a25231864001b006700f401e0006d +:10e84800ffff0831122000001048000002588b70aa +:10e85800004c0900254028012b300b011b006700e4 +:10e86800f401e0000600c010214002012b10020153 +:10e8780003004014ffff84242b580b0123208b0036 +:10e88800004c0a0025488900211020010800e003f7 +:10e898002118a00021480000211020010800e003f1 +:10e8a8002118a000235043010610460104386700d0 +:10e8b8002538470006484501021407001b002201bd +:10e8c800f4014000ffffec300650440104286500c5 +:10e8d8002528450102540500125800001070000058 +:10e8e80002686c7100440e0025400a012b500d018e +:10e8f8001b002201f40140000a00401104306600a8 +:10e90800214007012b48070106002015ffff6b2552 +:10e918002b480d010400205123400d01ffff6b25fa +:10e928002140070123400d011b000201f4014000b2 +:10e93800ffffa530124800001068000002602c712b +:10e94800006c0d002528a5012b50ac001b0002010e +:10e95800f40140000b004051005c0b002128a70087 +:10e968002b10a70006004014ffff29252b10ac0030 +:10e9780004004050005c0b00ffff29252128a70058 +:10e98800005c0b0025482b01190026012328ac0048 +:10e99800103800002b40a70044000015123000007a +:10e9a8003f00a75004206400212800002110200106 +:10e9b8000800e0032118a0002340030104106200ae +:10e9c80006300501023c02001b00c700f401e0000c +:10e9d800ffff4b300428650006480401044064002a +:10e9e80025482501026c0900125000001060000043 +:10e9f80002204b7100640c002518ac012b28640020 +:10ea08001b00c700f401e0000b00a05023186400ad +:10ea1800211862002b2862000600a014ffff4a2577 +:10ea28002b2864000400a05023186400ffff4a2527 +:10ea380021186200231864001b006700f401e0003d +:10ea4800ffff2931122000001060000002308b7097 +:10ea580000640c00254889012b2826011b0067004b +:10ea6800f401e0000b00a050002c0a00214822010c +:10ea78002b18220106006014ffff84242b1826019e +:10ea880004006050002c0a00ffff84242148220162 +:10ea9800002c0a0023482601fb79400b2528850015 +:10eaa8002b308600c1ffc05021280000ffff292518 +:10eab8006d7a400b2128000021280000e079400be6 +:10eac800010009240f7a400b21186200f8ffbd27c6 +:10ead8000400beaf21f0a0030800c4af0c00c5af0e +:10eae8001000c6af1000c28f1300401000000000d5 +:10eaf8000c00c28f000043900800c28f000043a0a2 +:10eb08000800c28f010042240800c2af0c00c28f67 +:10eb1800010042240c00c2af1000c28fffff422444 +:10eb28001000c2af1000c28ff1ff401400000000b7 +:10eb3800d17a400b000000000000000021e8c0036b +:10eb48000400be8f0800bd270800e0030000000095 +:10eb5800f0ffbd270c00beaf21f0a0031000c4af2a +:10eb68001400c5af0000c0a3e67a400b0000000007 +:10eb78001000c28f000043900000c293261062006c +:10eb88000000c2a31000c28f010042241000c2afcf +:10eb98001400c28fffff42241400c2af1400c28fba +:10eba800f3ff4014000000000000c29321e8c003f6 +:10ebb8000c00be8f1000bd270800e0030000000015 +:10ebc800f8ffbd270400beaf21f0a0030800c4afc2 +:10ebd8002110a0001000c6af0c00c2a31000c28f05 +:10ebe8000f004010000000000800c28f0c00c39303 +:10ebf800000043a00800c28f010042240800c2aff1 +:10ec08001000c28fffff42241000c2af1000c28f55 +:10ec1800f5ff4014000000000b7b400b00000000d3 +:10ec28000000000021e8c0030400be8f0800bd27d3 +:10ec38000800e00300000000f0ffbd270c00beaf95 +:10ec480021f0a0031000c4af0000c0a71d7b400b3b +:10ec5800000000000000c297010042240000c2a783 +:10ec68001000c28f010042241000c2af1000c28ff2 +:10ec780000004290f7ff4014000000000000c29717 +:10ec880021e8c0030c00be8f1000bd270800e00378 +:10ec980000000000f8ffbd270400beaf21f0a0036c +:10eca8000800c4af0c00c5af2110c0001000c2a7f7 +:10ecb800537b400b000000000800c28f0000439007 +:10ecc8000c00c28f000042900e006210000000008d +:10ecd8000800c28f000043900c00c28f00004290d1 +:10ece8002b1062000400401000000000ff00022406 +:10ecf800417b400b0000000001000224577b400bc1 +:10ed0800000000000800c28f000042900400401478 +:10ed18000000000021100000577b400b000000009d +:10ed28000800c28f010042240800c2af0c00c28f45 +:10ed3800010042240c00c2af1000c297ffff42241a +:10ed48001000c2a71000c297dbff401400000000ab +:10ed58002110000021e8c0030400be8f0800bd2771 +:10ed68000800e00300000000e0ffbd271c00bfaf63 +:10ed78001800beaf21f0a0032000c4af2400c5af27 +:10ed88002400c28f000042901000c2a32400c28f4a +:10ed9800010042242400c2af1000c29304004014b2 +:10eda800000000002000c28f8c7b400b0000000098 +:10edb8002400c48f107b400f000000001200c2a77f +:10edc8002000c28f000042901400c2a32000c28f0e +:10edd800010042242000c2af1400c2930400401472 +:10ede80000000000211000008c7b400b0000000098 +:10edf8001400c3931000c293f1ff621400000000d6 +:10ee08001200c2972000c48f2400c58f2130400013 +:10ee1800277b400f00000000e9ff401400000000bd +:10ee28002000c28fffff422421e8c0031c00bf8fcf +:10ee38001800be8f2000bd270800e0030000000076 +:10ee4800f0ffbd270c00beaf21f0a0031000c4af37 +:10ee58001400c5af1800c6af0400c0a30000c0afbf +:10ee6800ad7b400b000000001000c38f0000c28f74 +:10ee780021106200000043901400c48f0000c28f6c +:10ee8800211082000000429005006210000000007e +:10ee9800010002240400c2a3b27b400b0000000062 +:10eea8000000c28f010042240000c2af0000c38fdf +:10eeb8001800c28f2b106200ebff40140000000006 +:10eec8000400c28321e8c0030c00be8f1000bd27d8 +:08eed8000800e0030000000047 +:020000040000fa +:020000041d01dc +:10eee0002558000000000000c70000004900000095 +:10eef0008e0000009200000055000000db000000c2 +:10ef00001c000000e300000024000000aa00000034 +:10ef10006d00000071000000b60000003800000025 +:10ef2000ff00000001000000c600000048000000d3 +:10ef30008f0000009300000054000000da00000081 +:10ef40001d000000e200000025000000ab000000f2 +:10ef50006c00000070000000b700000039000000e5 +:10ef6000fe00000002000000c50000004b00000091 +:10ef70008c0000009000000057000000d900000045 +:10ef80001e000000e100000026000000a8000000b4 +:10ef90006f00000073000000b40000003a000000a1 +:10efa000fd00000003000000c40000004a00000053 +:10efb0008d0000009100000056000000d800000005 +:10efc0001f000000e000000027000000a900000072 +:10efd0006e00000072000000b50000003b00000061 +:10efe000fc00000004000000c30000004d00000011 +:10eff0008a0000009600000051000000df000000c1 +:10f0000018000000e700000020000000ae00000033 +:10f010006900000075000000b20000003c00000024 +:10f02000fb00000005000000c20000004c000000d2 +:10f030008b0000009700000050000000de00000080 +:10f0400019000000e600000021000000af000000f1 +:10f050006800000074000000b30000003d000000e4 +:10f06000fa00000006000000c10000004f00000090 +:10f07000880000009400000053000000dd00000044 +:10f080001a000000e500000022000000ac000000b3 +:10f090006b00000077000000b00000003e000000a0 +:10f0a000f900000007000000c00000004e00000052 +:10f0b000890000009500000052000000dc00000004 +:10f0c0001b000000e400000023000000ad00000071 +:10f0d0006a00000076000000b10000003f00000060 +:10f0e000f800000008000000cf0000004100000010 +:10f0f000860000009a0000005d000000d3000000c0 +:10f1000014000000eb0000002c000000a200000032 +:10f110006500000079000000be0000003000000023 +:10f12000f700000009000000ce00000040000000d1 +:10f13000870000009b0000005c000000d20000007f +:10f1400015000000ea0000002d000000a3000000f0 +:10f150006400000078000000bf00000031000000e3 +:10f16000f60000000a000000cd000000430000008f +:10f1700084000000980000005f000000d100000043 +:10f1800016000000e90000002e000000a0000000b2 +:10f19000670000007b000000bc000000320000009f +:10f1a000f50000000b000000cc0000004200000051 +:10f1b00085000000990000005e000000d000000003 +:10f1c00017000000e80000002f000000a100000070 +:10f1d000660000007a000000bd000000330000005f +:10f1e000f40000000c000000cb000000450000000f +:10f1f000820000009e00000059000000d7000000bf +:10f2000010000000ef00000028000000a600000031 +:10f21000610000007d000000ba0000003400000022 +:10f22000f30000000d000000ca00000044000000d0 +:10f23000830000009f00000058000000d60000007e +:10f2400011000000ee00000029000000a7000000ef +:10f25000600000007c000000bb00000035000000e2 +:10f26000f20000000e000000c9000000470000008e +:10f27000800000009c0000005b000000d500000042 +:10f2800012000000ed0000002a000000a4000000b1 +:10f29000630000007f000000b8000000360000009e +:10f2a000f10000000f000000c80000004600000050 +:10f2b000810000009d0000005a000000d400000002 +:10f2c00013000000ec0000002b000000a50000006f +:10f2d000620000007e000000b9000000370000005e +:04f2e000f00000003a +:020000040000fa +:020000041d01dc +:10f2e400e0ffbd271c00bfaf1800beaf21f0a00394 +:10f2f4002000c4af2400c5af2110c0002800c2a75d +:10f304001400c0a31000c0a31100c0a32000c28f2a +:10f3140007004014000000001400c2272000c2af00 +:10f32400010002241000c2a3d97c400b000000009d +:10f334002400c28f07004014000000001400c227fc +:10f344002400c2af010002241100c2a3d97c400be7 +:10f3540000000000faff0224237d400b000000009f +:10f364001100c2932000401400000000f37c400b05 +:10f374000000000088bf033c2061628c0400027c12 +:10f38400206162ac7081829321200000212840001a +:10f39400208e400f000000001200c2a388bf033c6f +:10f3a4002061628c010004240400827c206162ac30 +:10f3b4002400c28f1200c393000043a02400c28f14 +:10f3c400010042242400c2af2800c2972b1002007f +:10f3d400ff0042302800c397ffff63242800c3a71f +:10f3e400e4ff4014000000001000c2932000401409 +:10f3f40000000000157d400b0000000088bf033ca6 +:10f404002061628c0400027c206162ac2000c28f07 +:10f4140000004290211840002000c28f01004224c5 +:10f424002000c2af70818293212060002128400017 +:10f43400208e400f000000001300c2a388bf033ccd +:10f444002061628c010004240400827c206162ac8f +:10f454002800c2972b100200ff0042302800c397f7 +:10f46400ffff63242800c3a7e4ff4014000000004a +:10f4740088bf033c2061628c010004240400827c68 +:10f48400206162ac2110000021e8c0031c00bf8f82 +:10f494001800be8f2000bd270800e0030000000014 +:10f4a400d8ffbd272400bfaf2000beaf21f0a003ca +:10f4b4002800c4af2c00c5af1000c0a3c404023c94 +:10f4c40000b442341400c2afe400023cc0e1423450 +:10f4d4001800c2af1800c28f401002001400c38f7e +:10f4e4001b006200f401400010180000121000001c +:10f4f4001c00c2af1800c28f401002001400c38f5a +:10f504001b006200f40140001010000004004010d1 +:10f51400000000001c00c28f010042241c00c2af86 +:10f524001c00c28f0101422c0300401400000000a3 +:10f53400000102241c00c2af1c00c28f0400401052 +:10f54400000000001c00c28fffff42241c00c2af59 +:10f554001c00c28fff004230708182a37580400f6f +:10f5640000000000010004249780400f0000000008 +:10f574001000c28321e8c0032400bf8f2000be8f87 +:10f584002800bd270800e00300000000e0ffbd27bd +:10f594001c00bfaf1800beaf21f0a00321108000f3 +:10f5a4002400c5af2000c2a31000c0a32000c39351 +:10f5b4000300022410006214000000002400c28f23 +:10f5c4001400c2af1400c28f0000448c1400c28f18 +:10f5d4000400438c1400c28f080042942128600068 +:10f5e40021304000b97c400f000000001000c2a38d +:10f5f400827d400b00000000ffff02241000c2a324 +:10f60400000000001000c28321e8c0031c00bf8f6b +:10f614001800be8f2000bd270800e0030000000092 +:10f62400f0ffbd270c00beaf21f0a0030000c0a373 +:10f634000000c28321e8c0030c00be8f1000bd2768 +:10f644000800e00300000000f8ffbd270400beaf7f +:10f6540021f0a0030800c4af2110000021e8c0037a +:10f664000400be8f0800bd270800e003000000006e +:10f67400e8ffbd271400bfaf1000beaf21f0a00308 +:10f6840088bf033ce060628c0421027ce06062acd1 +:10f6940080bf023cff000324205843ac000000005c +:10f6a40080bf023c1058428c01004230fcff4010e5 +:10f6b4000000000080bf023cff000324205843ac3c +:10f6c4000000000080bf023c1058428c0100423010 +:10f6d400fcff40100000000080bf023cff00032438 +:10f6e400205843ac0000000080bf023c1058428cfc +:10f6f40001004230fcff40100000000080bf023ccb +:10f70400ff000324205843ac0000000080bf023ceb +:10f714001058428c01004230fcff401000000000f1 +:10f7240080bf023c205840ac0000000080bf023c77 +:10f734001058428c01004230fcff401000000000d1 +:10f7440080bf023c2058428c2016027c188282a77b +:10f7540018828287001202002016027c188282a777 +:10f7640080bf023cff000324205843ac000000008b +:10f7740080bf023c1058428c01004230fcff401014 +:10f784000000000080bf023c2058428cffff433041 +:10f7940018828287ffff423021106200ffff42304f +:10f7a4002016027c188282a788bf033ce060628c2a +:10f7b400010004240421827ce06062ac1882838707 +:10f7c400fcff0224241062002016027c188282a707 +:10f7d4001882838700540224040062100000000091 +:10f7e400211000002b7e400b000000006400042464 +:10f7f400a161400f0000000088bf033ce060628c00 +:10f804000421027ce06062ac80bf023cff00032460 +:10f81400205843ac0000000080bf023c1058428cca +:10f8240001004230fcff40100000000080bf023c99 +:10f83400ff000324205843ac0000000080bf023cba +:10f844001058428c01004230fcff401000000000c0 +:10f8540080bf023c205840ac0000000080bf023c46 +:10f864001058428c01004230fcff401000000000a0 +:10f8740080bf023c205840ac0000000080bf023c26 +:10f884001058428c01004230fcff40100000000080 +:10f8940088bf033ce060628c010004240421827c64 +:10f8a400e06062ac0100022421e8c0031400bf8fb1 +:10f8b4001000be8f1800bd270800e0030000000000 +:10f8c400e0ffbd271c00bfaf1800beaf21f0a003ae +:10f8d4001000c0a788bf033ce060628c0421027c56 +:10f8e400e06062ac80bf023c205840ac00000000e5 +:10f8f40080bf023c1058428c01004230fcff401093 +:10f904000000000080bf023c2058428c1000c2a7b7 +:10f914001000c287001202001000c2a780bf023c80 +:10f92400ff000324205843ac0000000080bf023cc9 +:10f934001058428c01004230fcff401000000000cf +:10f9440080bf023c2058428cffff43301000c29716 +:10f9540021106200ffff42301000c2a788bf033ca1 +:10f96400e060628c010004240421827ce06062accb +:10f974001000c287c31002001000c2a71000c28783 +:10f98400212040008a8e400f000000002118400012 +:10f99400029d023c21206000d041458c1f86400f0f +:10f9a400000000001400c2af1400c28f21e8c0039d +:10f9b4001c00bf8f1800be8f2000bd270800e00385 +:10f9c40000000000f8ffbd270400beaf21f0a00333 +:10f9d4001882828721e8c0030400be8f0800bd2777 +:10f9e4000800e00300000000f8ffbd270400beafdc +:10f9f40021f0a003211080000800c2a30800c293d4 +:10fa04000500422c0400401400000000ffff022403 +:10fa1400aa7e400b000000000800c29304004014ba +:10fa24000000000003000224aa7e400b0000000036 +:10fa34000800c393010002240400621400000000c3 +:10fa440004000224aa7e400b000000000800c393b7 +:10fa54000200022404006214000000000f000224cb +:10fa6400aa7e400b000000000800c3930300022498 +:10fa7400040062140000000010000224aa7e400b5f +:10fa8400000000000800c393040002240400621470 +:10fa94000000000012000224aa7e400b00000000b7 +:10faa400feff022421e8c0030400be8f0800bd2726 +:10fab4000800e00300000000e0ffbd271c00bfaf0a +:10fac4001800beaf21f0a0032118a0002110c0002f +:10fad4002c00c7af2000c4a32400c3a32800c2a3e2 +:10fae4009838400f000000001000c2a31000c28329 +:10faf40036004014000000002400c293212040007e +:10fb04007b7e400f000000001100c2a31100c283dd +:10fb140028004004000000002000c2930b004014a1 +:10fb2400000000001100c293211840002800c29375 +:10fb34002120600021284000f736400f000000001b +:10fb44001000c2a3ef7e400b000000002000c3930e +:10fb5400010002240b006214000000001100c29393 +:10fb6400211840002800c293212060002128400071 +:10fb74002c37400f000000001000c2a3ef7e400ba2 +:10fb8400000000002000c393020002240a00621453 +:10fb9400000000001100c293212040002c00c58ffa +:10fba4006137400f000000001000c2a3ef7e400b3d +:10fbb4000000000000000000e138400f00000000d9 +:10fbc4001000c2a3f57e400b0000000000000000fe +:10fbd4001000c28321e8c0031c00bf8f1800be8f31 +:10fbe4002000bd270800e00300000000f8ffbd2747 +:10fbf4000400beaf21f0a0030800c4af2110000030 +:10fc040021e8c0030400be8f0800bd270800e003fc +:10fc140000000000e8ffbd271400bfaf1000beaf16 +:10fc240021f0a003211880002110a0001800c3a314 +:10fc34001c00c2a31800c3931c00c293212000001f +:10fc4400212860002130400021380000af7e400fa1 +:10fc54000000000021e8c0031400bf8f1000be8f15 +:10fc64001800bd270800e00300000000e8ffbd27de +:10fc74001400bfaf1000beaf21f0a0032118800014 +:10fc84002110a0001800c3a31c00c2a31800c39332 +:10fc94001c00c2930100042421286000213040008c +:10fca40021380000af7e400f0000000021e8c003af +:10fcb4001400bf8f1000be8f1800bd270800e0039a +:10fcc40000000000e8ffbd271400bfaf1000beaf66 +:10fcd40021f0a003211080001c00c5af1800c2a3ae +:10fce4001800c2930200042421284000213000009f +:10fcf4001c00c78faf7e400f0000000021e8c00346 +:10fd04001400bf8f1000be8f1800bd270800e00349 +:10fd140000000000e8ffbd271400bfaf1000beaf15 +:10fd240021f0a0031800c4af2110a0001c00c2a33e +:10fd34001c00c2931800c48f212840008437400f50 +:10fd44000000000021e8c0031400bf8f1000be8f24 +:10fd54001800bd270800e00300000000e8ffbd27ed +:10fd64001400bfaf1000beaf21f0a00321100000ab +:10fd7400c88182afb88180afc48180af0100022402 +:10fd8400cc8182af0300042464000524eb60400f9f +:10fd94000000000021100000bc8182afc08180af50 +:10fda400db71400f0000000002004014000000005e +:10fdb400cc8180af21e8c0031400bf8f1000be8f38 +:10fdc4001800bd270800e00300000000d8ffbd278d +:10fdd4002400bfaf2000beaf21f0a0030300042421 +:10fde400fe5f400f000000004f00401000000000c4 +:10fdf40081bf033c0090628c4408027c009062ac9a +:10fe04000000000081bf023c0090428c010042309f +:10fe1400fcff40100000000081bf023c7090428c47 +:10fe24001000c2af81bf033c0090628c0100042427 +:10fe34004408827c009062ac1000c48f8a8e400f0c +:10fe44000000000021184000029d023c21206000b7 +:10fe5400c83e458c0b85400f000000001400c2af63 +:10fe6400029d023c1400c48fcc3e458c1f86400f7b +:10fe7400000000001400c2af1400c28f1800c2af0b +:10fe8400029d023c1400c48fd03e458c1f86400f57 +:10fe9400000000001400c2afc081828f8813422882 +:10fea4000600401400000000c08180af1400c28f1f +:10feb400bc8182afb97f400b00000000c081828ffb +:10fec40001004224c08182afbc81828f2120400086 +:10fed4001400c58f7281400f00000000bc8182af06 +:10fee4001400c28fc88182af030004246400052477 +:10fef400eb60400f00000000cc81838f01000224de +:10ff040009006214000000005a72400f0000000053 +:10ff1400b88182afc573400f000000000200401496 +:10ff240000000000cc8180af21e8c0032400bf8f13 +:10ff34002000be8f2800bd270800e0030000000059 +:10ff4400e0ffbd271c00bfaf1800beaf1400b0af68 +:10ff540021f0a003bc81908fc081828f21204000ba +:10ff64008a8e400f0000000021200002212840005a +:10ff74000b85400f00000000c88182af21100000f3 +:10ff8400bc8182afc08180afc881828f21e8c00369 +:10ff94001c00bf8f1800be8f1400b08f2000bd2737 +:10ffa4000800e00300000000f8ffbd270400beaf16 +:10ffb40021f0a003b881828f21e8c0030400be8f22 +:10ffc4000800bd270800e00300000000f8ffbd277b +:10ffd4000400beaf21f0a003c481828f21e8c003d6 +:10ffe4000400be8f0800bd270800e00300000000e5 +:10fff400e8ffbd271400bfaf1000beaf21f0a0037f +:020000041d02db +:10000400c881828f029d033cb03e642421284000b5 +:10001400688f400f0000000021e8c0031400bf8f68 +:100024001000be8f1800bd270800e0030000000088 +:10003400f8ffbd270400beaf21f0a003cc81828f5e +:1000440021e8c0030400be8f0800bd270800e003b8 +:100054000000000000e85d4100701a4000601b4091 +:1000640090ffbd276c00baaf6800bbaf44781b7c1f +:10007400000c7b3700609b405c00bfaf5800beaff4 +:100084005400b9af5000b8af4c00afaf4800aeafaa +:100094004400adaf4000acaf3c00abaf3800aaaffa +:1000a4003400a9af3000a8af2c00a7af2800a6af3a +:1000b4002400a5af2000a4af1c00a3af1800a2af7a +:1000c4001400a1af121000006400a2af10180000c9 +:1000d4006000a3af21f0a0038c80828f0400401045 +:1000e400000000008c80828f09f8400000000000ae +:1000f40088bf033c3010628cc418027c301062aca0 +:1001040021e8c0036400a28f130040006000a38fa5 +:10011400110060005c00bf8f5800be8f5400b98f7f +:100124005000b88f4c00af8f4800ae8f4400ad8fa5 +:100134004000ac8f3c00ab8f3800aa8f3400a98fed +:100144003000a88f2c00a78f2800a68f2400a58f2d +:100154002000a48f1c00a38f1800a28f1400a18f6d +:1001640000606041c00000006c00ba8f6800bb8f63 +:1001740000709a407000bd2700e8dd4100609b409c +:1001840018000042f8ffbd270400beaf21f0a00311 +:100194008c8080af2110000021e8c0030400be8fd2 +:1001a4000800bd270800e00300000000f8ffbd2799 +:1001b4000400beaf21f0a0032110000021e8c00319 +:1001c4000400be8f0800bd270800e0030000000003 +:1001d400e8ffbd271400bfaf1000beaf21f0a0039d +:1001e40088bf033c2061628c8410027c206162ac75 +:1001f40088bf033c2061628c0421027c206162acd4 +:1002040064000424a161400f0000000088bf033c87 +:100214002061628c010004248410827c206162ac21 +:1002240096000424a161400f0000000088bf033c35 +:100234002061628c010004240421827c206162ac70 +:1002440021e8c0031400bf8f1000be8f1800bd2723 +:100254000800e00300000000e8ffbd271400bfaf62 +:100264001000beaf21f0a0031800c4af1800c48f63 +:10027400a161400f0000000021e8c0031400bf8ffb +:100284001000be8f1800bd270800e0030000000026 +:10029400f8ffbd270400beaf21f0a0030800c4afdf +:1002a4000800c28f8c8082af21e8c0030400be8f97 +:1002b4000800bd270800e00300000000f8ffbd2788 +:1002c4000400beaf21f0a003211080000800c2a3e7 +:1002d4000800c293070040140000000088bf033cdc +:1002e4006010628cc418027c601062acc380400b46 +:1002f4000000000088bf033c6010628c01000424ed +:10030400c418827c601062ac21e8c0030400be8f74 +:0c0314000800bd270800e0030000000006 +:020000040000fa +:020000041d02db +:10032000d8ffbd271400b0af2400bfaf2000b3af8b +:100330001c00b2af1800b1af4400800421808000df +:100340006e0082280e0040100b00822879004010b9 +:10035000029d023cc03942248080040021800202b8 +:100360000000028e2400bf8f2000b38f1c00b28fcc +:100370001800b18f1400b08f0800e0032800bd27db +:10038000eb51023c1f85423418008200c3970400e1 +:10039000102800006666133c4319050023187200fc +:1003a0008010030000190300211043008018020090 +:1003b00021104300231082002014027c67667326fc +:1003c00018005300c317020010180000029d113cd2 +:1003d00083180300231062002014027c09004224c9 +:1003e000c039312680100200211051004c00248eab +:1003f0001f86400f0000458c18001302212040008a +:10040000109800008398130023907202401012008d +:10041000c090120021905200238012022084107c90 +:1004200080801000218811021f86400f0000258e59 +:100430002400bf8f2000b38f1c00b28f1800b18f33 +:100440001400b08f0800e0032800bd2723800400bb +:100450002084107c6e00022a1d004010eb51023ceb +:100460000b00022a51004054029d023c6666023c89 +:100470006766422418000202c31f1000101000001b +:10048000831002002310430040200200c018020025 +:1004900021188300238003022024027c0900842485 +:1004a0002014107c029d033cf43963248020040056 +:1004b0008010020021208300211043000000848c62 +:1004c0001f86400f0000458cda80400b2400bf8f50 +:1004d0001f85423418000202c39710001028000044 +:1004e0006666133c43190500231872008010030050 +:1004f000001903002110430080180200211043005e +:10050000231002022014027c676673261800530031 +:10051000c317020010180000029d113c831803004d +:10052000231062002014027c09004224f980400b51 +:10053000f43931266666023c676642241800820060 +:10054000c31f04001010000083100200231043009a +:1005500040200200c01802002118830023800302fb +:100560002014027c090042242084107c029d033c5c +:10057000c0396324801002008080100021800302b3 +:10058000211043000000058e1f86400f0000448ca0 +:100590002400bf8f2000b38f1c00b28f1800b18fd2 +:1005a0001400b08f0800e0032800bd27f43942246e +:1005b0008080100021800202d980400b0000028e52 +:020000040000fa +:020000041d02db +:1005c0000080013c2628a100c24d0400ff00293113 +:1005d000c25d0500ff006b310080073c0042040053 +:1005e000254007010052050025504701ffff2d253a +:1005f000fe00a12d6100201000000000ffff6d250e +:10060000fe00a12d770020100000000023602b01c8 +:100610000d00800500000000200081290300201447 +:10062000000000001500001002000a2425300a0016 +:1006300006508a0104688a011000a611000000001b +:100640000e00001002004a3525480b0023600c0004 +:100650002000812903002014000000000700001082 +:10066000020008242530080006408801046888013b +:100670000200a61100000000020008352460870077 +:10068000266885011000a0050000000021400a0135 +:100690002b680a011700a0110000000001000d31b5 +:1006a0000200a011000000000200083542400800ce +:1006b00001002925ff0001240e0021150000000083 +:1006c0000c000010000008242b680a010400a0118f +:1006d00023400a0123400800030000102660870120 +:1006e0005000001100000000203006712348260150 +:1006f0000440c8000e0020190000000080000825fa +:1007000080000d2d21482d01026a08000100ad3145 +:1007100023400d014040080042420800c06d09001e +:1007200025400d0125100c010800e0030000000029 +:10073000010006242330c9002000c12c39002010fc +:10074000000000000080013c2540010120000d2434 +:100750002368a6010448a801020020110640c80031 +:10076000010008350000092480000d25e3ffa105e4 +:1007700000000000e1ff0010010009240e00201518 +:1007800000000000214008010500001100000000e9 +:1007900020600c7123482c0198ff00100440880150 +:1007a000ff0001240f006111000000000080013ce7 +:1007b0001800a11400000000216808011b00a0150a +:1007c00000000000ff00012414006115000000007b +:1007d000266885001500a005000000000d0000102f +:1007e00000000000080060150000000021504a01d0 +:1007f0000a0040110000000020604c7123586c0179 +:1008000082ff001004508a0121684a010700a015e8 +:1008100000000000c4ff001025100500c2ff0010fa +:1008200025100400c0ff001000000224beff0010cd +:08083000c0ff023c00000000c3 +:020000040000fa +:020000041d02db +:10083800c0ffbd272c00b5af00a0153c4c40a28ed0 +:100848003c00bfaf3800beaf3400b7af3000b6af22 +:100858002800b4af2400b3af2000b2af1c00b1af82 +:100868007f0040101800b0af00a0023c1400a2aff7 +:100878000f009324c2981300c098130087006326c2 +:100888001400a48fc219030004007e26bfff762639 +:10089800c019030077ff17347001828c40f01e00e6 +:1008a8001000a3af213000003f00d62e00a0143c5a +:1008b8002bb87702040043900100633012006054a3 +:1008c8000000508c0000438c0400649001008430c8 +:1008d80007008014212053000000638c04006490fa +:1008e80001008430fcff8010000043ac212053003d +:1008f8002b2864000400a0540000508c3b006106c3 +:100908001400a58f0000508cfeff032424800302ee +:100918002b105000e7ff4054211000022d00c0505a +:10092800010006241f00c0162190c0030200e01633 +:100938001000b28f08007226fa8e400f2120400264 +:10094800ffff03241c004310218840007401838e9c +:100958000800642421004410000062ac0400649084 +:1009680001008434040064a0f8ff5226219052004c +:10097800040044924c40a32601008434040044a29d +:1009880004004490000052acfe008430740192ae22 +:10099800040044a0000043ae213000002f82400b29 +:1009a80021100002fa8e400f21204002ffff03248d +:1009b800e6ff43142188400008007226fa8e400f93 +:1009c80021204002e2ff51147401838e8e82400b75 +:1009d800211000002f82400b2110000204006490b7 +:1009e800fe0084305c82400b040064a02b18830056 +:1009f8000a0060107001a4ac0000858c00a0033cc4 +:100a08000400868c780165ac0000458c780163246d +:100a1800040066ac000085ac040080a0040043908c +:100a2800000044ac01006334040043a008004224e1 +:100a38003c00bf8f3800be8f3400b78f3000b68fb0 +:100a48002c00b58f2800b48f2400b38f2000b28ffc +:100a58001c00b18f1800b08f0800e0034000bd27cc +:100a68004c40a22600a0073c00a0033c544063244d +:100a7800040046900c0045901400a7af00a0073c66 +:100a88004c40a3ae7401e3ac1400a38f0100c6343c +:100a98000100a534080042ac700162ac040046a015 +:080aa8001e82400b0c0045a06a +:020000040000fa +:020000041d02db +:100ab000d0ffbd272c00bfaf2800beaf21f0a003a0 +:100ac0003000c4af3400c5af4c818293010042387e +:100ad000ff00423003004010000000001083400f70 +:100ae00000000000ffff02241000c2af3000c28fe0 +:100af0001400c2af1400c28f21004010000000009b +:100b00001800c0afdb82400b000000001400c28f51 +:100b1000000042901c00c2af1000c38f1c00c28fa7 +:100b2000261062002000c2af1000c28f021a02001d +:100b30002000c28fff00443000a0023c802004004f +:100b40002c394224211082000000428c26106200c1 +:100b50001000c2af1400c28f010042241400c2afc3 +:100b60001800c28f010042241800c2af1800c38fc2 +:100b70003400c28f2b106200e4ff4014000000001c +:100b80001000c28f271002001000c2af1000c28fe9 +:100b900021e8c0032c00bf8f2800be8f3000bd2786 +:100ba0000800e00300000000e0ffbd271c00bfaf0d +:100bb0001800beaf21f0a0032000c4af2110a00098 +:100bc0002400c2a32400c2931000c2af4c818293c0 +:100bd00001004238ff0042300300401000000000d6 +:100be0001083400f000000002000c38f1000c28f50 +:100bf000261062001400c2af2000c28f021a020049 +:100c00001400c28fff00443000a0023c802004008a +:100c10002c394224211082000000428c26106200f0 +:100c20002000c2af2000c28f21e8c0031c00bf8f8c +:100c30001800be8f2000bd270800e0030000000060 +:100c4000e8ffbd271400beaf21f0a0030000c0af35 +:100c50003c83400b000000000000c28f0800c2afc0 +:100c60000400c0af2e83400b000000000800c28fbc +:100c700001004230ff004230090040100000000037 +:100c80000800c28f42180200b8ed023c20834234b3 +:100c9000261062000800c2af2b83400b000000004a +:100ca0000800c28f421002000800c2af0400c28fc9 +:100cb000010042240400c2af0400c28f0800422c8d +:100cc000eaff40140000000000a0023c0000c38fb7 +:100cd000801803002c394224211062000800c38fc1 +:100ce000000043ac0000c28f010042240000c2afec +:100cf0000000c28f0001422cd7ff4014000000000a +:100d0000010002244c8182a321e8c0031400be8f9d +:0c0d10001800bd270800e00300000000f0 +:020000040000fa +:020000041d02db +:100d1c004a462e636f6d0000486f73742049502053 +:100d2c0069732025642e25642e25642e25640d0af6 +:100d3c0000000000486f7374204e616d652069736c +:100d4c002025730d0a000000426f6f746c6f616494 +:100d5c006572207365727665722073746172746546 +:100d6c006400000042696e64204661696c65640031 +:100d7c00736f636b6574202564206c697374656e86 +:100d8c00204661696c65642e204572726f723a2040 +:100d9c0025640a004269656e76656e75652061751d +:100dac00206368616c6574210a4c65206368616c12 +:100dbc006574207061726c6520656e20616e676c65 +:100dcc0061697320636f6d6d65204d722e205065c7 +:100ddc0070696e0a496620796f75206e65656420ae +:100dec0068656c702e2e2e20747970652068656c89 +:100dfc00700a0a005465726d696e616c20636c69cf +:100e0c00656e7420636f6e6e6563746564000000bc +:100e1c005379736c6f672057656c636f6d650a004f +:100e2c004e6574776f726b20636c69656e742063aa +:100e3c006f6e6e656374656400000000426f6f74c2 +:100e4c006c6f6164657220636c69656e7420636f8e +:100e5c006e6e656374656400536f636b65742025f7 +:100e6c0064203a20416363657074204661696c6547 +:100e7c00640a00005465726d696e616c20636c6964 +:100e8c00656e7420646973636f6e6e6563746564fc +:100e9c00000000004e6574776f726b20636c69659f +:100eac006e7420646973636f6e6e65637465640041 +:100ebc00426f6f746c6f6164657220636c69656ef0 +:100ecc007420646973636f6e6e656374656400008f +:100edc0057692d466920636f6e6e65637465640d8a +:100eec000000000057692d466920646973636f6eba +:100efc006e65637465640d0057692d466920495011 +:100f0c002069732025752e25752e25752e25750dba +:100f1c000a000000776966695f63623a204d324dc2 +:100f2c005f574946495f524553505f50524f56499f +:100f3c0053494f4e5f494e464f2e0d0077696669f7 +:100f4c005f63623a2050726f766973696f6e2066c8 +:100f5c0061696c65642e0d00496d707256456d614a +:100f6c0072640000313233343566666666660000a2 +:080f7c006572726f7200000043 +:020000040000fa +:020000041d02db +:100f8400e8ffbd271400bfaf1000beaf21f0a003df +:100f940088bf033c2061628cc439027c206162ac4e +:100fa40088bf033ca061628c444a027ca06162acad +:100fb40002000224b48182af010004249061400f36 +:100fc4000000000021e8c0031400bf8f1000be8f92 +:100fd4001800bd270800e00300000000e8ffbd275b +:100fe4001400bfaf1000beaf21f0a00388bf023cc5 +:100ff4005060428c008042300c004014000000001d +:10100400b481828f0500401400000000029d023c60 +:10101400003f4424578f400f0000000001000224c9 +:10102400b48182af1584400b00000000b481838f2b +:10103400010002240500621400000000029d023c2d +:10104400143f4424578f400f00000000b48180af48 +:10105400010004247f61400f0000000021184000bb +:1010640001000224110062140000000001000424a5 +:10107400fe5f400f000000000c0040100000000064 +:1010840088bf033c2061628cc439027c206162ac5d +:1010940088bf033ca061628c444a027ca06162acbc +:1010a400010004249061400f0000000004000424a7 +:1010b400fe5f400f0000000003004010000000002d +:1010c4005b84400f0000000021e8c0031400bf8fc0 +:1010d4001000be8f1800bd270800e00300000000c8 +:1010e400e8ffbd271400bfaf1000beaf21f0a0037e +:1010f40004000424c0a805343561400f000000003a +:1011040021e8c0031400bf8f1000be8f1800bd2754 +:101114000800e00300000000e8ffbd271400bfaf93 +:101124001000beaf21f0a00388bf033c2061628c95 +:1011340001000424c439827c206162ac01000424cf +:10114400c8000524eb60400f0000000001000224e9 +:1011540021e8c0031400bf8f1000be8f1800bd2704 +:101164000800e00300000000e8ffbd271400bfaf43 +:101174001000beaf21f0a00388bf033ca061628cc5 +:1011840001000424444a827ca06162ac010004246e +:10119400c8000524eb60400f000000000100022499 +:1011a40021e8c0031400bf8f1000be8f1800bd27b4 +:1011b4000800e00300000000f8ffbd270400beaff4 +:1011c40021f0a003b481828f2014027c21e8c003a3 +:1011d4000400be8f0800bd270800e00300000000e3 +:1011e400e8ffbd271400bfaf1000beaf21f0a0037d +:1011f400dc8180af00a0023c502d44242128000053 +:10120400f40106245b8c400f000000000700042456 +:10121400c8000524eb60400f0000000021e8c00373 +:101224001400bf8f1000be8f1800bd270800e00314 +:1012340000000000e8ffbd271400bfaf1000beafe0 +:1012440021f0a003b52c400f00000000040040145e +:1012540000000000dc8180afaf84400b0000000080 +:10126400dc81828f14004010000000000700042479 +:10127400fe5f400f0000000021184000010002241e +:101284000d0062140000000000a0023c502d432415 +:10129400dc81828f2120600021284000782c400fbf +:1012a40000000000dc8180af07000424c80005248e +:1012b400eb60400f0000000021e8c0031400bf8f62 +:1012c4001000be8f1800bd270800e00300000000d6 +:1012d400e8ffbd271400bfaf1000beaf21f0a0038c +:1012e400211080001800c2a3b52c400f000000009c +:1012f4000500401400000000dc8180af21100000d4 +:10130400d884400b00000000dc81838f00a0023ce5 +:10131400502d4224211062001800c393000043a002 +:10132400dc81828f01004224dc8182afdc81838fe7 +:10133400f4010224080062140000000000a0023c32 +:10134400502d422421204000f4010524782c400f24 +:1013540000000000dc8180af0100022421e8c0030a +:101364001400bf8f1000be8f1800bd270800e003d3 +:1013740000000000e0ffbd271c00bfaf1800beaf97 +:101384001400b0af21f0a0032000c4afb52c400f6f +:10139400000000000500401400000000dc8180af64 +:1013a40021100000f584400b000000002000d08fc5 +:1013b4002000c48fd988400f0000000021200002c3 +:1013c40021284000782c400f000000000100022476 +:1013d40021e8c0031c00bf8f1800be8f1400b08f1b +:1013e4002000bd270800e00300000000f8ffbd272f +:1013f4000400beaf21f0a003dc81828f04004014fe +:1014040000000000010002240685400b00000000db +:101414002110000021e8c0030400be8f0800bd278e +:081424000800e00300000000d5 +:020000040000fa +:020000041d02db +:10142c0000800b3cc2450400ff000831c25505008a +:10143c00ff004a31003a04002538eb00004a050051 +:10144c0025482b012670850024586e01ffff0e25c0 +:10145c00fe00c12d3f00201000000000ffff4e25b4 +:10146c00fe00c12d53002010000000002b08e900e5 +:10147c00030020140000000042380700010008257a +:10148c0082630900f40180011b00ec0012200000b3 +:10149c0010300000ff3f2d311900a401122800006c +:1014ac00803306002b70c5000400c0112330c5002a +:1014bc00ffff84242130c9002b70c900f401800186 +:1014cc001b00cc0012380000103000001900a701de +:1014dc0012280000803306002b70c5000400c011d8 +:1014ec002330c500ffffe7242130c9002b70c90051 +:1014fc00807304002138ee000200c0100039070090 +:10150c000100e7347e000e242370ca0121400e0135 +:10151c00ffff0e25fe00c12d34002010000000003e +:10152c008000e7248000ee2c21400e01027207009f +:10153c000100ce312338ee0040380700423a070054 +:10154c00c07508002538ee002510eb000800e003fc +:10155c000000000008000015000000002138e70022 +:10156c000500e010000000002060ec7023400c012e +:10157c00baff001004388701040048150000000071 +:10158c00217029012f00c01100000000ff00012470 +:10159c0008004111000000001200001100000000c2 +:1015ac002170e7002700c015000000002200001089 +:1015bc00000000000800401500000000214829012f +:1015cc001d0020110000000020602c7123504c01e4 +:1015dc00a6ff001004488901217029011900c015cb +:1015ec0000000000d9ff001025100b001200001d98 +:1015fc000000000001000c24236088012000812dd4 +:10160c00f8ff20100000000020000e242370cc01f5 +:10161c000440c70102000011063887010200e734bc +:10162c00000008248000ee24bdffc105000000006e +:10163c00bbff001001000824807f013cc3ff001099 +:10164c0025106101c1ff0010c0ff023c000000002a +:020000040000fa +:020000041d02db +:10165c002510850084004010211000000100022498 +:10166c0046008210c2470500ffff0224650082106d +:10167c000a00022467008210f6ff02245a0082102e +:10168c00ffff0224090000114019050041008010e1 +:10169c000080023c23200400232805002b100400aa +:1016ac002310a2002128400040190500c216040096 +:1016bc0025106200c21e050025104300390040149d +:1016cc00801905008216040025106200821e050098 +:1016dc002510430012004054990002241a000224e1 +:1016ec00c23f040040180500403004002518e300f8 +:1016fc002120c0002128600080310300821e0400dc +:10170c002518c3008236050025186600f4ff60100a +:10171c00ffff42247f0042244600401801000324ae +:10172c00070083300a006010ff004328c000837c50 +:10173c000300842421208300c21e040004006010d6 +:10174c00ff0043284220040001004224ff004328ec +:10175c0034006010c2200400c005837c020060507d +:10176c002110000000b0847c0042080025104800c5 +:10177c00c01502000800e00325104400bbffa05474 +:10178c00ffff0224001208007f0042340800e0032f +:10179c00c0150200c0ffa214232004002120000069 +:1017ac000080053c1a000224c037050042180400d2 +:1017bc002518c30001008730423005002520e300c6 +:1017cc002128c000c21e0400403106002518c300a9 +:1017dc00c236050025186600f3ff60140100422490 +:1017ec00c985400b7f004224a6ffa21400120800fa +:1017fc0082004234c01502002000033c0800e003c4 +:10180c00251043009bffa4540a000224e585400bdd +:10181c000012080099ffa054f6ff0224ff85400b2c +:10182c000012080000120800ff0042340800e00318 +:10183c00c0150200231062001b00432808006050f2 +:10184c002120000023180200041864000610440034 +:10185c002b20030025208200cb85400b01000224a5 +:10186c00dd85400b211000000800e00300000000a3 +:020000040000fa +:020000041d02db +:10187c00c23d0400ff00e730c24d0500ff002931d6 +:10188c0000800a3c003204002530ca0000420500ea +:10189c0025400a012660850024504c01ffffec24f2 +:1018ac00fe00812d2100201000000000ffff2c25e0 +:1018bc00fe00812d36002010000000001900c80029 +:1018cc001258000002006011103000000100c634f4 +:1018dc000300c0040000000040300600ffffe724b6 +:1018ec0082ff2c252138ec00ffffec24fe00812d1b +:1018fc003a002010000000008000c6248000cc2c90 +:10190c002138ec000262060001008c312330cc003f +:10191c004030060042320600c06507002530cc007e +:10192c002510ca000800e003000000000d00e014c0 +:10193c00000000002130c6000500c01000000000af +:10194c002058cb702338eb00d8ff00100430660110 +:10195c00ff0001241f0021110000000015000010e1 +:10196c00000000002160c6001a0080150000000075 +:10197c0004002015000000002160080115008011f2 +:10198c0000000000ff0001240f00211500000000e2 +:10199c000a0020150000000021400801050000117c +:1019ac000000000020580b7123482b01c3ff0010ce +:1019bc0004406801dbff001025100a0021600801bb +:1019cc000400801500000000807f013cd5ff001052 +:1019dc0025104101d3ff0010c0ff023cfaffe01cb0 +:1019ec000000000001000b24235867012000612d2a +:1019fc00f0ff20100000000020000c2423608b015d +:101a0c00043886010200e010063066010200c6347c +:101a1c00000007248000cc24b7ff810500000000e3 +:0c1a2c00b5ff00100100072400000000be +:020000040000fa +:020000041d02db +:101a380025408500030008310300001121108000b3 +:101a4800380000100000aa900000aa8c0101093c8f +:101a580001012935c07909002340490124400f01bb +:101a68000700001124600a01050088110000000029 +:101a78000000a5240000aa902a0000100000842479 +:101a88000400ab8c00008aac2340690124400f019c +:101a98000700001124600b010500881100000000f8 +:101aa8000400a5240000aa901e000010040084244d +:101ab8000800aa8c04008bac2340490124400f0184 +:101ac8000700001124600a010500881100000000c9 +:101ad8000800a5240000aa90120000100800842421 +:101ae8000c00ab8c08008aac2340690124400f012c +:101af8000700001124600b01050088110000000098 +:101b08000c00a5240000aa90060000100c008424f4 +:101b18001000aa8c0c008bac10008424ceff00109f +:101b28001000a5240300401500008aa00800e00367 +:101b3800000000000100ab900300601501008ba0bd +:101b48000800e003000000000200aa90030040150e +:101b580002008aa00800e003000000000300ab9028 +:101b68000300601503008ba00800e00300000000dc +:101b78000400aa900300401504008aa00800e003ae +:101b8800000000000500ab900300601505008ba065 +:101b98000800e003000000000600aa9003004015ba +:101ba80006008aa00800e003000000000700ab90d0 +:101bb8000300601507008ba00800e0030000000088 +:101bc8000800aa9008008424d6ff00100800a52465 +:020000040000fa +:020000041d02db +:101bd800d8ffbd271400b0af2400bfaf2000b3afbb +:101be8001c00b2af1800b1af4000a01021808000e7 +:101bf80054008010f8ff822404004380f8ff938c7f +:101c0800010064302900801400a0043c0e82400fbb +:101c18002120a00037004010218840003d005010ce +:101c280023987002f8ff528c23904202c39012004e +:101c3800c39813002b3072020a98460221204000f4 +:101c4800212800027f88400fc03013002b1030027b +:101c58001e004010c0901200219032022b10120278 +:101c68001a00401000a0023c23805002c3801000dc +:101c7800780144247801438cc08010000400828cd1 +:101c880021803002040002ae000003ae21102002c1 +:101c98002400bf8f2000b38f1c00b28f1800b18fb3 +:101ca8001400b08f0800e0032800bd277001868c5f +:101cb8002b3046000100c054700182acfeff0424a2 +:101cc800241864000587400b040043a02400bf8f3c +:101cd800211020022000b38f1c00b28f1800b18f92 +:101ce8001400b08f0800e0032800bd270b00801403 +:101cf80000a0023c2400bf8f211000002000b38ff9 +:101d08001c00b28f1800b18f1400b08f0800e003d8 +:101d18002800bd272687400b211000027001438c44 +:101d2800f8ff90242b18030201006054700150ac96 +:101d38000400039221100000fe0063302687400b48 +:101d4800040003a22400bf8f2000b38f1c00b28fb1 +:101d58001800b18f1400b08f2120a0000e82400b14 +:041d68002800bd276b +:020000040000fa +:020000041d02db +:101d6c00d8ffbd271000b0af00a0103c3040028e51 +:101d7c002400bfaf2000b4af1c00b3af1800b2af4b +:101d8c00090040101400b1af2400bf8f2000b48fa5 +:101d9c001c00b38f1800b28f1400b18f1000b08fdd +:101dac000800e0032800bd2700a0133c8401638ecb +:101dbc004200605000a0033c00a0143c8801828ebd +:101dcc00390040100000043c828f0300829702000f +:101ddc0000e0447c00e0657c0200313a0200523a9b +:101dec000a18b1000a10920021886000b58f400fcc +:101dfc00219040000000438c0400428c2b202302d5 +:101e0c00240080102110620000a0043c7030842457 +:101e1c0000e0847c2b206400dbff801421886000b0 +:101e2c002b185102050060142b1822022b184202a9 +:101e3c000500605400a0023c2b182202d2ff601057 +:101e4c002190400000a0023c703042244217020056 +:101e5c00050003241b0043140400032400a0023ccf +:101e6c002588220225904202840171ae880192ae2f +:101e7c00304011ae2400bf8f2000b48f1c00b38ff4 +:101e8c001800b28f1400b18f1000b08f0800e0035f +:101e9c002800bd272b202202e2ff80542b18510270 +:101eac008687400b00a0043c00a0023c0002842466 +:101ebc00684042247587400b211044007187400b09 +:101ecc0068406324070043140080023c25882202ea +:101edc0025104202840171ae880182aea087400bae +:101eec00304011ae21884002840172aea087400bb5 +:041efc00304011aeb3 +:020000040000fa +:020000041d02db +:101f00000c008294d0ffbd27010042301800b0af12 +:101f10002c00bfaf2800b4af2400b3af2000b2af95 +:101f20001c00b1af218080003e004010040080ac56 +:101f300000a0143c6d018282130040501000068ef8 +:101f400000a0113c2c3d3126a0003326d787400b42 +:101f5000020112240b0033526d0180a20c00229664 +:101f600002014230fbff525414003126212020028e +:101f7000fe8c400f14003126f9ff33560c002296d8 +:101f80006d0180a21000068e1700c0100e0004968e +:101f90002288400f0800058e30004010040002ae79 +:101fa000ffff0324350043500c0002960800038e07 +:101fb000ffff4224000003ae040002ae01006424cf +:101fc00000006290000004ae2c00bf8f2800b48f88 +:101fd0002400b38f2000b28f1c00b18f1800b08f87 +:101fe0000800e0033000bd27040000ae1000a52764 +:101ff0002288400f0100062401000324120043142c +:102000002c00bf8f1000a2932800b48f2400b38f40 +:102010002000b28f1c00b18f1800b08f0800e003c1 +:102020003000bd272c00bf8fffff02242800b48f93 +:102030002400b38f2000b28f1c00b18f1800b08f26 +:102040000800e0033000bd270c000396ffff0224c8 +:1020500010006334f287400b0c0003a60c000296bc +:10206000100042340c0002a60800028e040000aeec +:10207000000002aef287400bffff02243000423422 +:082080001a88400b0c0002a6b7 +:020000040000fa +:020000041d02db +:10208800e0ffbd271000b0af1c00bfaf1800b2af13 +:102098001400b1af1c00a0102180a0001b00c0508c +:1020a8001c00bf8f110080142190c0000000023c6a +:1020b800000042241c0040102188a6000000000ceb +:1020c80001000424000002a201001026fbff1116e3 +:1020d8001c00bf8f211040021400b18f1800b28f6e +:1020e8001000b08f0800e0032000bd271c00bf8f40 +:1020f800211040021400b18f1800b28f1000b08f69 +:102108000800e0032000bd271c00bf8f21900000bd +:10211800211040021400b18f1800b28f1000b08f48 +:102128000800e0032000bd2700a0023ca800438c63 +:10213800020002242400621080bf023c80bf023cdf +:1021480080bf053c80bf043c0060428c3060a52401 +:102158001060842400804230050040142190c000a3 +:102168000080033480bf023c086043ac2190c0006b +:102178000000828c0100423009004014a0000224b3 +:102188006688400b000000000500401000000000b9 +:102198000000838c01006330fbff6010ffff4224c6 +:1021a8000000828c01004230d0ff40542390d200be +:1021b8000000a28cffff52260c004012000002a271 +:1021c8005e88400b0100102640684224dbff401067 +:1021d80080bf023c80bf053c80bf043c0068428c45 +:1021e8003068a5245788400b106884243d88400b2c +:0421f8002390d2005e +:020000040000fa +:020000041d02db +:1021fc00211080005600c0100c00ca2c4d00401558 +:10220c002618a40003006330233804002900601052 +:10221c000300e7300600e0102330c7000000a3984d +:10222c000300a3882128a700000083b82120870081 +:10223c000f00c3302338c3001100e01021306000c0 +:10224c002138e5000000a3980300a3880400a89897 +:10225c000700a8880800a9980b00a9880c00aa9868 +:10226c000f00aa88000083ac040088ac080089ac7d +:10227c001000a52410008424f2ffa714fcff8aace4 +:10228c000300c3302338c3002a00e0102130600063 +:10229c002138e5000000a3980300a3880400a524be +:1022ac0004008424fbffa714fcff83ac2100001066 +:1022bc00000000000500e0102330c7000000a398c8 +:1022cc002128a700000083b8212087000f00c3300d +:1022dc002338c3000d00e010213060002138e500e8 +:1022ec000000a38c0400a88c0800a98c0c00aa8cfc +:1022fc00000083ac040088ac080089ac1000a52455 +:10230c0010008424f6ffa714fcff8aac0300c33032 +:10231c002338c3000700e010213060002138e500ad +:10232c000000a38c0400a52404008424fcffa71443 +:10233c00fcff83ac0600c0102138c5000000a39040 +:10234c000100a52401008424fcffa714ffff83a037 +:10235c000800e0030000000000008a9021108000bb +:10236c0003004015000000000800e00300000224f8 +:10237c0001008a9003004015000000000800e003f3 +:10238c000100022402008a900300401500000000a6 +:10239c000800e0030200022403008a9003004015a9 +:1023ac00822004000800e0030300022401008424be +:1023bc008020040000008a8c0101093c01012935b0 +:1023cc00c07909002340490124400f010600001187 +:1023dc0024600a01040088110000000000008a90ab +:1023ec00220000100000842404008b8c234069011f +:1023fc0024400f010600001124600b010400881119 +:10240c000000000004008a901800001004008424ce +:10241c0008008a8c2340490124400f01060000115a +:10242c0024600a01040088110000000008008a9052 +:10243c000e000010080084240c008b8c23406901d2 +:10244c0024400f010600001124600b0104008811c8 +:10245c00000000000c008a90040000100c00842482 +:10246c0010008a8cd7ff0010100084240400401543 +:10247c0000000000000084240800e0032310820008 +:10248c0001008a9004004015000000000100842423 +:10249c000800e0032310820002008a90040040151b +:1024ac0000000000020084240800e00323108200d6 +:1024bc0003008a90030084240800e00323108200a8 +:020000040000fa +:020000041d02db +:1024cc000c00a294e0ffbd27020043301400b0af13 +:1024dc001c00bfaf1800b1af2b0060102180a00012 +:1024ec00000243301c0060100400a38c0002423434 +:1024fc000c00a2a41d006010ff0091300a000424ff +:10250c0028002412800042301000028e3e0062101f +:10251c00010063240000028e01004424040003ae79 +:10252c00000051a00100032400a0023c000004aef6 +:10253c006d0143a00a000224210022520c000296d5 +:10254c001c00bf8f211020021400b08f1800b18f17 +:10255c000800e0032000bd270b0060140002423489 +:10256c000c00a2a4ff009130211800000800048e7a +:10257c00000004ae0a000424e4ff24561000028e6e +:10258c006c89400b800042301c00bf8fffff112470 +:10259c00211020021400b08f1800b18f0800e00346 +:1025ac002000bd27d9ff40541000028e0d000424da +:1025bc003389400f212800024589400b0400038e0b +:1025cc0000014230dfff40101c00bf8f0e0004964c +:1025dc000800058e238d400f0400068e0400038e28 +:1025ec00060043500800028e0c000296ffff1124d7 +:1025fc00300042340c0002a60800028e040000ae2b +:10260c005389400b000002ae2024117c8a89400fb4 +:0c261c00212800025389400b2188400057 +:020000040000fa +:020000041d02db +:102628000c00a294e8ffbd27400043301000b0af73 +:102638001400bfaf2180a0001c0060141800a4a3e0 +:10264800020043303d006050300042341000a38c3b +:102658001b0060500e00a4940800a58c2d00a0500b +:1026680000a0053c0400068e238d400f0e00049642 +:10267800ffff02240800038e040002ae1800a29394 +:10268800000062a01800a28301006324000003aeca +:102698000a000324130043500c0003961400bf8f54 +:1026a8001000b08f0800e0031800bd271400bf8f8a +:1026b8002014047c1000b08f0800e0031800bd2728 +:1026c80001000624238d400f1800a5271400bf8f92 +:1026d8001800a283040000ae1000b08f0800e003c9 +:1026e8001800bd2700016330edff60101400bf8f94 +:1026f8000e0004960800058e238d400f0400068ef8 +:102708000800038e1800a283040000aea989400bbc +:10271800000003ae1040a524200003240800423422 +:10272800080005ae000005ae100003ae040003aebd +:102738000c0002a69c89400b200006240c00a2a4d1 +:0c2748000400a0aca989400bffff022494 +:020000040000fa +:020000041d02db +:10275400e8ffbd271400bfaf1000beaf21f0a003f7 +:10276400029d023ccc41428ca48182af0800042427 +:10277400e8030524eb60400f0000000021e8c003db +:102784001400bf8f1000be8f1800bd270800e0039f +:1027940000000000e8ffbd271400bfaf1000beaf6b +:1027a40021f0a0039d7d400f00000000211840008f +:1027b400010002240700621400000000317e400f73 +:1027c40000000000a48182af01000224f789400bbd +:1027d400000000002110000021e8c0031400bf8f96 +:1027e4001000be8f1800bd270800e00300000000a1 +:1027f400f8ffbd270400beaf21f0a003a481828f9f +:1028040021e8c0030400be8f0800bd270800e003d0 +:1028140000000000e8ffbd271400bfaf1000beafea +:1028240021f0a00308000424fe5f400f0000000014 +:102834000800401000000000317e400f000000003e +:10284400a48182af08000424e8030524eb60400f50 +:102854000000000021e8c0031400bf8f1000be8fe9 +:0c2864001800bd270800e0030000000081 +:020000040000fa +:020000041d02db +:102870000c008394e0ffbd271000b0af01000224dc +:1028800021808000110064301c00bfaf1800b2af7f +:10289000300082141400b1af0002623018004014fe +:1028a0000400028efffd63300c0003a61a00112401 +:1028b0000d00122418004018ffff44240000028e6f +:1028c000040004ae0100442400004290000004ae65 +:1028d00080006430050080141c00bf8f150051502b +:1028e0000800028e0a0052500400028e1800b28fb7 +:1028f0001400b18f1000b08f0800e0032000bd2746 +:1029000014004014211000002a8a400bfffd6330a0 +:10291000eaff401cffff4424400062300d004014d9 +:1029200021200002c087400f00000000348a400bc5 +:102930000c000396080040101c00bf8f0400048e9a +:102940000000028e01008424ffff4224040004ae34 +:10295000000002ae1c00bf8f100063340c0003a601 +:10296000ffff02241800b28f1400b18f1000b08f47 +:082970000800e0032000bd2770 +:020000040000fa +:020000041d02db +:102978000020202020202020202028282828282047 +:10298800202020202020202020202020202020203f +:1029980020801010101010101010101010101010af +:1029a8001004040404040404040404101010101097 +:1029b8001010414141414141010101010101010161 +:1029c80001010101010101010101010110101010b3 +:1029d8001010424242424242020202020202020233 +:1029e8000202020202020202020202021010101087 +:1029f80020000000000000000000000000000000af +:102a080000000000000000000000000000000000be +:102a180000000000000000000000000000000000ae +:102a2800000000000000000000000000000000009e +:102a3800000000000000000000000000000000008e +:102a4800000000000000000000000000000000007e +:102a5800000000000000000000000000000000006e +:102a6800000000000000000000000000000000005e +:102a7800000000000009121b242d363f48415a531c +:102a88006c657e7719100b023d342f265158434a46 +:102a9800757c676e323b2029161f040d7a736861b6 +:102aa8005e574c452b2239300f061d14636a717826 +:102ab800474e555c646d767f4049525b2c253e3706 +:102ac80008011a137d746f6659504b42353c272e06 +:102ad8001118030a565f444d727b60691e170c0576 +:102ae8003a3328214f465d546b627970070e151ce6 +:102af800232a31384148535a656c777e09001b12e6 +:102b08002d243f3658514a437c756e671019020bc5 +:102b1800343d262f737a6168575e454c3b32292035 +:102b28001f160d046a6378714e475c55222b3039a5 +:102b3800060f141d252c373e0108131a6d647f7685 +:102b480049405b523c352e2718110a03747d666f85 +:102b58005059424b171e050c333a21285f564d44f5 +:102b68007b7269600e071c152a233831464f545d65 +:042b7800626b7079a3 +:020000040000fa +:020000041d02db +:102b7c00e0ffbd27040002241800b0af1c00bfaf5b +:102b8c001c00c21021808000000102240300c2102e +:102b9c00000000001300c0141c00bf8f2800a050c0 +:102bac000800058e0c000296080042340c0002a6a8 +:102bbc000c000296080005aefbfe42302530c20028 +:102bcc00100007ae0c0006a6040000ae2110000099 +:102bdc001c00bf8f1800b08f0800e0032000bd2739 +:102bec001c00bf8fffff02241800b08f0800e00309 +:102bfc002000bd270c00829408004230070040548e +:102c0c000c0002960800848c040080500c00029684 +:102c1c005390400f000000000c000296000000ae24 +:102c2c00f7fe4230040042340c0002a6080000ae4d +:102c3c00100000ae040000aef78a400b211000001b +:102c4c000300a01000000000ef8a400b1000078e5c +:102c5c00e58e400f1000a6af21284000e0ff401089 +:0c2c6c001000a68fef8a400b2000072408 +:020000040000fa +:020000041d02db +:102c7800286e756c6c2900003031323334353637a4 +:102c88003839414243444546000000003031323370 +:102c98003435363738396162636465660000000090 +:102ca80001000000000000000a0000000000000011 +:102cb8006400000000000000e803000000000000bd +:102cc8001027000000000000a0860100000000009e +:102cd80040420f00000000008096980000000000ad +:102ce80000e1f5050000000000ca9a3b0000000062 +:102cf80000e40b540200000000e8764817000000ca +:102d08000010a5d4e800000000a0724e18090000c9 +:102d180000407a10f35a00000080c6a47e8d03009c +:102d28000000c16ff286230000008a5d78456301c8 +:102d3800000064a7b3b6e00d0000e8890423c78a41 +:102d48000000803f000020410000003f5f70894084 +:020000040000fa +:020000041d02db +:102d5800a8ffbd270400a1af0800a2af0c00a3afd5 +:102d68001000a4af1400a5af1800a6af1c00a7afb1 +:102d78002000a8af2400a9af2800aaaf2c00abaf51 +:102d88003000acaf3400adaf3800aeaf3c00afaff1 +:102d98004000b8af4400b9af4800bfaf12400000d0 +:102da8004c00a8af104000005000a8af029d1a3c8c +:102db800e83a5a2700000000006804400060054017 +:102dc80009f84003000000005000a88f110000011e +:102dd8004c00a88f130000010400a18f0800a28fe7 +:102de8000c00a38f1000a48f1400a58f1800a68fc5 +:102df8001c00a78f2000a88f2400a98f2800aa8f65 +:102e08002c00ab8f3000ac8f3400ad8f3800ae8f04 +:102e18003c00af8f4000b88f4400b98f4800bf8f87 +:0c2e28005800bd27c00000001800004248 +:020000040000fa +:020000041d02db +:102e3400e8ffbd271400bfaf1000beaf21f0a00310 +:102e440081bf023c00f6428c100042300700401063 +:102e54000000000001000224308182af029d023c88 +:102e6400e43f4424578f400f0000000021e8c003d2 +:102e74001400bf8f1000be8f1800bd270800e003a8 +:102e840000000000f8ffbd270400beaf21f0a0033e +:102e940080bf023c00800334080043ac21e8c00337 +:102ea4000400be8f0800bd270800e00300000000f6 +:102eb400f8ffbd270400beaf21f0a00380bf023c91 +:102ec40000800334040043ac21e8c0030400be8f37 +:102ed4000800bd270800e00300000000f8ffbd273c +:102ee4000400beaf21f0a00380bf023c0100032414 +:102ef400080043ac21e8c0030400be8f0800bd27ce +:102f04000800e00300000000e0ffbd271c00bfaf85 +:102f14001800b2af1400b1af1000b0af2700a0107a +:102f2400211080002020a47020001124238024027a +:102f3400403005002718100004306600061802020d +:102f44002518c30006280502200006320a28660058 +:102f5400042082000100a3340b286400218f400f59 +:102f64002120a0000f001112219040001f00022414 +:102f74000f000212010004248a8e400f0420040270 +:102f8400212840001f86400f212040021c00bf8fd3 +:102f94001800b28f1400b18f1000b08f0800e00346 +:102fa4002000bd27029d023ce28b400bc441458cae +:102fb400029d023ce28b400bc841458c218f400f9f +:102fc400000000001c00bf8f1800b28f1400b18fe6 +:0c2fd4001000b08f0800e0032000bd27b3 +:020000040000fa +:020000041d02db +:102fe00053504920466c61736820636f6e66696751 +:102ff00075726564000000004552524f523a2053ea +:10300000504920466c617368206e6f74206465744b +:103010006563746564000000466c617368207374b6 +:1030200061747573207265676973746572203a20e4 +:10303000307825780a00000053504920466c6173af +:103040006820646574656374696f6e204641494cfd +:1030500045442e202056656e646f723a20307825e4 +:10306000782c20436869702049443a2030782578cc +:103070000a00000053504920466c61736820646563 +:103080007465637465642e202056656e646f723ab1 +:1030900020307825782c20436869702049443a20f4 +:0830a000307825780a000000d9 +:020000040000fa +:020000041d02db +:1030a800e0ffbd271800b0af00a0103c3040028ef2 +:1030b800100040101c00bfaf1b00801821184400ee +:1030c8002b206200110080141c00bf8f00a0043c5c +:1030d8008801848c2b2083000d00805400a0023cc2 +:1030e8001c00bf8f304003ae1800b08f0800e0030b +:1030f8002000bd275b87400f1000a4af3040028e30 +:10310800edff40141000a48f1c00bf8f00a0023cec +:103118000c000324800143ac1800b08fffff022489 +:103128000800e0032000bd272b2043000500801481 +:1031380000a0043c8401848c2b206400e9ff8010eb +:103148001c00bf8f1c00bf8f00a0023c1600032488 +:10315800800143ac1800b08fffff02240800e00391 +:043168002000bd275f +:020000040000fa +:020000041d02db +:10316c00211080002600c0101000ca2c1f00401532 +:10317c00ff00a530005205002528aa0000540500c8 +:10318c002528aa00030083300500601004000724e2 +:10319c002338e3002330c700000085b821208700c6 +:1031ac000f00c3302338c3000800e010213060004a +:1031bc002138e400000085ac040085ac080085ac27 +:1031cc0010008424fbff8714fcff85ac0300c33084 +:1031dc002338c3000500e010213060002138e400e2 +:1031ec0004008424feff8714fcff85ac0400c0108f +:1031fc002138c40001008424feff8714ffff85a042 +:08320c000800e00300000000cf +:020000040000fa +:020000041d02db +:10321400200002240900052400008380feff625080 +:1032240001008424030065542d000224878c400b84 +:1032340001008424190062102b0002241b00625038 +:103244000100842421380000029d063c7829c6240c +:103254002110c30001004290040042300c004010d1 +:103264002110000040280200c01002002110a2001a +:103274000100842421104300000083802128c3001e +:103284000100a5900400a530f6ffa014d0ff42244d +:10329400231802000800e0030b10670001008424d7 +:1032a40000008380938c400b01000724000083807e +:0832b400938c400b213800004f +:020000040000fa +:020000041d02db +:1032bc00e0ffbd271800b0af029d103c7829102606 +:1032cc0021189000010063901c00bfaf0400673010 +:1032dc000900e01021108000d0ff82242a2845002c +:1032ec001100a0101c00bf8fff0042301800b08fdf +:1032fc000800e0032000bd27010067300400e05007 +:10330c00030063300c00c0140000000003006330a5 +:10331c0004006010a9ff42242a284500f2ffa014e3 +:10332c001c00bf8f1c00bf8fff0002241800b08f41 +:10333c000800e0032000bd27ca8f400f1000a5af86 +:10334c002180500001000392c68c400b1000a58f09 +:020000040000fa +:020000041d02db +:10335c00feff082440300400403805002548c70013 +:10336c001b0020110000000000ff013c0100213473 +:10337c002b08c1001a0020100000000000ff013cc7 +:10338c00010021342b08e100150020100000000082 +:10339c000200810442300600233006000200a10422 +:1033ac0042380700233807002a08c7000300201002 +:1033bc000000000007000010ffff02242a08e600ae +:1033cc000300201000000000020000100100022485 +:1033dc00000002240800e0030000000000000000d0 +:0c33ec00fcff001025100800000000008d +:020000040000fa +:020000041d02db +:1033f8000c008294e8ffbd271000b0af0100032441 +:103408002180800001024430170083101400bfaff0 +:103418000202423002020324060043500800058ecf +:10342800211000001400bf8f1000b08f0800e003c7 +:103438001800bd27fbffa010211000000400068e15 +:10344800f9ffc0101400bf8f238d400f0e000496a3 +:103458000400038e040043100c000296300042342e +:10346800ffff42300c0002a60800048e2000433003 +:10347800ffff0224040000ae000004ae0b8d400bd9 +:043488000a10030023 +:020000040000fa +:020000041d02db +:10348c00e0ffbd271c00bfaf1200a0101800b0afaa +:10349c001000c0100300842c060080140000023cb5 +:1034ac001c00bf8f2110c0001800b08f0800e00373 +:1034bc002000bd27000042240b0040102120a0005a +:1034cc002128c0000000000c1400a6af2b8d400b6f +:1034dc001400a68f1c00bf8f211000001800b08fa5 +:1034ec000800e0032000bd272180a6000000a48076 +:1034fc000100a5241000a5af0575400f1400a6af60 +:10350c001000a58ff9ffb0141400a68f2c8d400b62 +:04351c001c00bf8f41 +:020000040000fa +:020000041d02db +:10352000c2350400ff00c630ffffc924fe00212d74 +:103530000b0020100000000082ffc6247f80013ca9 +:10354000ffff213424208100003f013c2520810021 +:103550000000a6ac251004000800e00300000000f5 +:103560000d00c0140000000021488400f8ff201165 +:1035700000000000403a04002040e8702330c800fa +:10358000043807010080013c24208100024a070022 +:10359000e9ff001025208900c0ff043cecff00106b +:0835a0000000062400000000f9 +:020000040000fa +:020000041d02db +:1035a800c8ffbd273400bfaf3000beaf21f0a00375 +:1035b8003800c4af6280400f000000001400c2272a +:1035c80021204000212800001c0006245b8c400fad +:1035d800000000003800c28f0000428c1400c2af07 +:1035e8001400c227212040003e11400f00000000b7 +:1035f8001000c2a31000c2830300401000000000a6 +:10360800828d400b0000000021e8c0033400bf8f0a +:103618003000be8f3800bd270800e003000000001e +:020000040000fa +:020000041d02db +:10362800002a04000080013c2528a100c23d0400b6 +:10363800ff00e7309e0006242330c7000d00c004b9 +:10364800000000002000c128030020140000000032 +:103658000500001000000224020081040628c500ad +:1036680023280500251005000800e00300000000dd +:1036780000000000807f013c010021342b088100fc +:103688000300201400000000f7ff00100080023c37 +:0c369800f5ff0010ffff022400000000fe +:020000040000fa +:020000041d02db +:1036a400e8ffbd271400bfaf6190400f0000000089 +:1036b40088bf023c0030438c0003637c0800601424 +:1036c40099aa033c0010042488bf033c083064ac6e +:1036d4000030438c00086330fdff601499aa033c5a +:1036e40081bf023c5566632430f240ac30f243acf7 +:1036f4006655033caa99633430f243ac81bf023c63 +:103704000100032418f643ac81bf023c10f6428c3e +:08371400c58d400b0000000010 +:020000040000fa +:020000041d02db +:10371c00e0ffbd271800b2af1400b1af1000b0af7e +:10372c001c00bfaf218080002188a000d48d400bed +:10373c00ffff12243389400f000000000b005210d1 +:10374c00010010260000028221282002f9ff4014fb +:10375c00212040001c00bf8f1800b28f1400b18fc5 +:10376c001000b08f0800e0032000bd271c00bf8fa5 +:10377c00ffff02241800b28f1400b18f1000b08f1d +:08378c000800e0032000bd2746 +:020000040000fa +:020000041d02db +:103794001b00c010211000000000828011004010a6 +:1037a4000000a38012004314ffffc624f48d400bd5 +:1037b400ffff072400008280090040100100a524b7 +:1037c4000000a3800b004314ff004230ffffc62417 +:1037d400f8ffc714010084240800e003211000004e +:1037e4000000a380ff0063300800e00323104300bf +:1037f400ff004230ff0063300800e0032310430061 +:083804000800e00300000000d1 +:020000040000fa +:020000041d02db +:10380c00ffff032403008314211080000800e00351 +:10381c00000000000c00a494010003240102843079 +:10382c00030083500800a68c0800e003ffff02246d +:10383c00f6ffc050ffff02240400a48c1000a38ce0 +:10384c00f2ff8350ffff02240000a38c0600c3107c +:10385c00010084240400a4acffff64240000a4ac89 +:10386c000800e003ffff62a001006324198e400be7 +:04387c000000a3acf9 +:020000040000fa +:020000041d02db +:10388000f8ffbd270400beaf21f0a003211880007f +:103890002110a0000800c3a30c00c2a30c00c39316 +:1038a00080bf023c305a43ac0800c39380bf023c47 +:1038b000205a43ac0000000080bf023c105a428cea +:1038c00001004230fcff40100000000080bf023cbd +:1038d000205a428c0800c2a30800c29321e8c0030a +:1038e0000400be8f0800bd270800e00300000000b0 +:1038f000f8ffbd270400beaf21f0a00388bf033c42 +:10390000e060628c8431027ce06062ac21e8c0033c +:103910000400be8f0800bd270800e003000000007f +:10392000f8ffbd270400beaf21f0a00388bf033c11 +:10393000e060628c010004248431827ce06062ac2f +:103940000100022421e8c0030400be8f0800bd2747 +:083950000800e0030000000084 +:020000040000fa +:020000041d02db +:10395800d0ffbd273800a2273800a6af1000a2afbd +:1039680021304000ff7f02242800b0af2400a2af1e +:1039780021808000c20002241400a4272c00bfafbd +:103988001400b0af1c00b0af3c00a7af1800a0af48 +:10399800533d400f2000a2a71400a28f000040a0b2 +:1039a8001400a28f2c00bf8f231050002800b08f66 +:0839b8000800e0033000bd2708 +:020000040000fa +:020000041d02db +:1039c0000000803f000020410000c84200007a440f +:1039d00000401c460050c347002474498096184b91 +:1039e00020bcbe4c286b6e4ef9021550ec78ad60d1 +:1039f000caf249710000803fcdcccc3d0ad7233cb0 +:103a00006f12833a17b7d138acc52737bd37863523 +:103a100095bfd63377cc2b325f708930ffe6db2e33 +:083a200008e53c1e6042a20d06 +:020000040000fa +:020000041d02db +:103a28000080013c120080102430810002008104d3 +:103a380000000000232004009e0005242038877021 +:103a48002328a7000420e400800084248000882c18 +:103a58002128a8000342040001000831232088001f +:103a68004020040042220400c045050025208800ab +:103a7800251086000800e003000000000000000098 +:020000040000fa +:020000041d02db +:103a8800e0ffbd271400b0af029d103c1800b1af95 +:103a98001c00bfaf00a0113c782910261c8a400fdb +:103aa8006040248e21180202010063808800633080 +:103ab800faff6014ffff03240400431000a0033c36 +:103ac8006040658c038e400f212040001c00bf8f92 +:103ad8001800b18f1400b08f0800e0032000bd2744 +:020000040000fa +:020000041d02db +:103ae800e0ffbd271c00bfaf1800beaf21f0a00348 +:103af800004802401000c2af006802401f00423078 +:103b0800008182af00700240088182af00600340ec +:103b1800ff0f023cfeff4234241062000060824026 +:103b2800c00000004000000040000000400000000d +:083b3800a98d400f0000000000 +:020000040000fa +:020000041d02db +:103b4000c8ffbd274000a3273400bfaf4000a6af89 +:103b50004400a7af1000a3af1400a4af1c00a4af93 +:103b6000d988400f2800a5af1000a68f2800a58f88 +:103b70001800a2af2400a2af1400a427c1000224a1 +:103b80009669400f2000a2a73400bf8f0800e00311 +:043b90003800bd2715 +:020000040000fa +:020000041d02db +:103b940000a0033c5c40628ce8ffbd270d00401090 +:103ba4001400bfaf0000448c5c4064acffff0324ee +:103bb400030043101400bf8f0800e0031800bd2762 +:103bc400e966042400a0033c800164ac0800e0031f +:103bd4001800bd27fa8e400f20000424ed8e400b00 +:043be400ffff0324b8 +:020000040000fa +:020000041d02db +:103be800e0ffbd271800b1af1400b0af1c00bfaf95 +:103bf8002a8c400f218880000700201a218040006d +:103c0800ffff0224040002122120000221280000e4 +:103c18005b8c400f213020021c00bf8f2110000256 +:103c28001800b18f1400b08f0800e0032000bd27f2 +:020000040000fa +:020000041d02db +:103c38000000043ce8ffbd27000084240300801036 +:103c48001400bfaf09f880000000000000008430b5 +:103c58000000a530ce73400f000000000000023cb9 +:103c680000004224030040100000000009f8400052 +:0c3c780000000000f9ff00100000000038 +:020000040000fa +:020000041d02db +:103c8400e8ffbd271400bfaf0600800421108000a8 +:103c94008a8e400f000000001400bf8f0800e0036c +:103ca4001800bd2701004230422004008a8e400fd4 +:103cb40025208200212040007281400f21284000ed +:0c3cc4001400bf8f0800e0031800bd27ab +:020000040000fa +:020000041d02db +:103cd0000000023ce8ffbd2700004224060040101f +:103ce0001400bfaf0000023c00004224030040105b +:103cf000029d023c3f000070029d023c183d4224a0 +:103d0000030040100000000009f84000000000001f +:083d1000448f400b000000008d +:020000040000fa +:020000041d02db +:103d180000606041c000000099aa033c81bf023cda +:103d28005566632430f240ac30f243ac6655033c30 +:103d3800aa99633430f243ac81bf023c01000324ea +:103d480018f643ac81bf023c10f6428c488f400bfa +:043d58000000000067 +:020000040000fa +:020000041d02db +:103d5c00e0ffbd271400b0af00a0103c403d05268d +:103d6c001c00bfafc78d400f1800b1af403d0526fa +:103d7c000a0004243389400f218840001c00bf8fa7 +:103d8c00211020021400b08f1800b18f0800e0033e +:043d9c002000bd271f +:020000040000fa +:020000041d02db +:103da000e0ffbd272400a2272118800000a0043cca +:103db0002400a5af2800a6af403d84242128600040 +:103dc000213040001c00bfaf2c00a7af533d400f77 +:103dd0001000a2af1c00bf8f0800e0032000bd2729 +:020000040000fa +:020000041d02db +:103de0000000023c00004224050040100000023c9c +:103df0000000422403004010029d023c3f0000707e +:103e0000029d023c183d4224fdff401000000000ce +:083e100009f840000000000069 +:020000040000fa +:020000041d02db +:103e18004a462e636f6d00004368616c6574447593 +:103e2800696e6f20563220496e697469616c697acf +:103e380065640000746573742025640a000000003e +:020000040000fa +:020000041d02db +:103e4800006803408000023c251062000068824040 +:103e5800040080100010032488bf023c0800e0031f +:103e6800041043ac88bf023c0800e003081043acd0 +:020000040000fa +:020000041d02db +:103e78000900801000a0023c7001438cf8ff8424e4 +:103e88002b18830001006054700144ac0400829038 +:103e9800fe004230040082a00800e0030000000099 +:020000040000fa +:020000041d02db +:103ea8004a462e636f6d0000426174746572792012 +:103eb800766f6c746167653a2025660a0000000019 +:0c3ec80000c07f443d0a5740000030411c +:020000040000fa +:020000041d02db +:103ed40000a0033c3440622401000424080044ace4 +:103ee40000a0043c68408424344064ac0000033cdb +:0c3ef400000263240800e003040043ac5b +:020000040000fa +:020000041d02db +:103f0000496e766572746572207475726e65642090 +:103f10004f4e0000496e766572746572207475723a +:083f20006e6564204f46460067 +:020000040000fa +:020000041d02db +:103f2800029d033c78296324211883002110800016 +:103f38000100649020004324010084300800e0035d +:043f48000b106400f6 +:020000040000fa +:020000041d02db +:103f4c00029d023c782942242110820001004290fb +:103f5c00e0ff8324020042300b2062000800e003e3 +:043f6c0021108000a0 +:020000040000fa +:020000041d02db +:103f7000f8ffbd270400beaf21f0a00321e8c00375 +:103f80000400be8f0800bd270800e0030000000009 +:020000040000fa +:020000041d02db +:103f90005052494e544600005258204649464f2040 +:0c3fa0004f766572666c6f7700000000c1 +:020000040000fa +:020000041d02db +:103fac000100843003008014000000000800e003ce +:0c3fbc00006060410800e00320606041ec +:020000040000fa +:020000041d02db +:103fc8000300a01021300000df8a400b20000724e6 +:0c3fd80004000624df8a400b21380000a2 +:020000040000fa +:020000041d02db +:103fe4005761746368646f672077617320747269c2 +:083ff400676765726564000057 +:020000040000fa +:020000041d02db +:103ffc00f8ff0224008003402410620002004234c7 +:08400c000800e003008082407f +:020000040000fa +:020000041d02db +:10401400f8ff0224008003402410620003004234ad +:084024000800e0030080824067 +:020000040000fa +:020000041d02db +:10402c0000601a40bfff1b3cffff7b3724d05b03b3 +:08403c0000609a4018000042e8 +:020000040000fa +:020000041d02db +:10404400029d023c78294224211044000100429040 +:084054000800e0030700423000 +:020000040000fa +:020000041d02db +:10405c00029d023c78294224211044000100429028 +:08406c000800e00303004230ec +:020000040000fa +:020000041d02db +:10407400029d023c78294224211044000100429010 +:084084000800e00320004230b7 +:020000040000fa +:020000041d02db +:10408c00029d023c782942242110440001004290f8 +:08409c000800e00304004230bb +:020000040000fa +:020000041d02db +:1040a400029d023c782942242110440001004290e0 +:0840b4000800e0031700423090 +:020000040000fa +:020000041d02db +:1040bc00029d023c782942242110440001004290c8 +:0840cc000800e003020042308d +:020000040000fa +:020000041d02db +:1040d400029d023c782942242110440001004280c0 +:0840e4000800e00397004230e0 +:020000040000fa +:020000041d02db +:1040ec00029d023c78294224211044000100429098 +:0840fc000800e003100042304f +:020000040000fa +:020000041d02db +:10410400029d023c7829422421104400010042808f +:084114000800e00388004230be +:020000040000fa +:020000041d02db +:10411c00029d023c78294224211044000100429067 +:08412c000800e003010042302d +:020000040000fa +:020000041d02db +:10413400029d023c7829422421104400010042904f +:084144000800e00344004230d2 +:020000040000fa +:020000041d02db +:10414c0000a0023c5c40438c5c4044ac0800e003a3 +:04415c00000083ac30 +:020000040000fa +:020000041d02db +:104160005541525431204f45525200004a462e6369 +:0c4170006f6d00004a462e636f6d00006a +:020000040000fa +:020000041d02db +:08417c000800e003206062412d +:020000040000fa +:020000041d02db +:084184000800e0030060624145 +:020000040000fa +:020000041d02db +:08418c000800e0030000000040 +:020000040000fa +:020000041d02db +:084194000800e0030000000038 +:020000040000fa +:020000041d02db +:08419c000800e0038000822c02 +:020000040000fa +:020000041d02db +:0841a4000800e0037f008230f7 +:020000040000fa +:020000041d02db +:0841ac000800e003200082245a +:020000040000fa +:020000041d02db +:0841b4000800e003e0ff822493 +:020000040000fa +:020000041d02db +:0841bc000800e003800002246a +:020000040000fa +:020000041d02db +:1041c4000000804f0000004fbfad3a4f0000803d1b +:00000001FF diff --git a/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map new file mode 100644 index 0000000..c3347e0 --- /dev/null +++ b/AudioConsole.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map @@ -0,0 +1,5221 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o (malloc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + (_printf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (_printf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) (__floatunsisf) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +mBatteryCurrent 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +TerminalWorkString 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +gu16BufferSize 0x2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mac_addr 0x6 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mRxData 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +mDeviceID 0x2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o +ActualTemp 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +PowerRelayState 0x4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o +param 0x1c build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +mModuleIPConfig 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +gsockerrno 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +astUartData 0x620 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +I2CSlaveBuffer 0xa build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +DataChunkWritten 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTxData 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mI2CWaitCounter 0x4 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +gastrSockets 0xb0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +at_sb_printf 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +mTerminalTickState 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gfpPingCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gu8OpCode 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +astTimer 0xf0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d003800 0xbd4c 48460 App's exec code +.text._vfprintf_cdfFnop 0x9d00f54c 0x13d4 5076 +.text 0x9d010920 0x7ed4 32468 App's exec code +.dinit 0x9d0187f4 0xb60 2912 +.rodata 0x9d019354 0x990 2448 Read-only const +.text 0x9d019ce4 0x974 2420 App's exec code +.text._vfscanf_s 0x9d01a658 0x868 2152 +.text 0x9d01aec0 0x2a84 10884 App's exec code +.rodata 0x9d01d944 0x494 1172 Read-only const +.text 0x9d01ddd8 0x1108 4360 App's exec code +.rodata 0x9d01eee0 0x404 1028 Read-only const +.text 0x9d01f2e4 0x103c 4156 App's exec code +.text.scale 0x9d020320 0x2a0 672 +.text.fpsubadd 0x9d0205c0 0x278 632 +.text.malloc 0x9d020838 0x278 632 +.text 0x9d020ab0 0x26c 620 App's exec code +.rodata 0x9d020d1c 0x268 616 Read-only const +.text 0x9d020f84 0x4a8 1192 App's exec code +.text.fp32div 0x9d02142c 0x230 560 +.text.__floatdisf 0x9d02165c 0x220 544 +.text.fp32mul 0x9d02187c 0x1bc 444 +.text 0x9d021a38 0x1a0 416 App's exec code +.text.realloc 0x9d021bd8 0x194 404 +.text._sbrk_init 0x9d021d6c 0x194 404 +.text._filbuf 0x9d021f00 0x188 392 +.text.read 0x9d022088 0x174 372 +.text 0x9d0221fc 0x2d0 720 App's exec code +.text.fputc 0x9d0224cc 0x15c 348 +.text._flsbuf 0x9d022628 0x12c 300 +.text 0x9d022754 0x11c 284 App's exec code +.text.fgetc 0x9d022870 0x108 264 +.rodata 0x9d022978 0x204 516 Read-only const +.text.setvbuf 0x9d022b7c 0xfc 252 +.rodata 0x9d022c78 0xe0 224 Read-only const +.text.general_exception 0x9d022d58 0xdc 220 +.text 0x9d022e34 0x1ac 428 App's exec code +.rodata 0x9d022fe0 0xc8 200 Read-only const +.text._sbrk 0x9d0230a8 0xc4 196 +.text 0x9d02316c 0xa8 168 App's exec code +.text.atoi 0x9d023214 0xa8 168 +.text.range 0x9d0232bc 0xa0 160 +.text.fpcmp 0x9d02335c 0x9c 156 +.text.fflush 0x9d0233f8 0x94 148 +.text.write 0x9d02348c 0x94 148 +.text.libm 0x9d023520 0x88 136 +.text 0x9d0235a8 0x80 128 App's exec code +.text.fptoul 0x9d023628 0x7c 124 +.text.SoftReset 0x9d0236a4 0x78 120 +.text.fputs 0x9d02371c 0x78 120 +.text.strncmp 0x9d023794 0x78 120 +.text.ungetc 0x9d02380c 0x74 116 +.text 0x9d023880 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d023958 0x68 104 +.rodata 0x9d0239c0 0x68 104 Read-only const +.text.sitofp 0x9d023a28 0x60 96 +.text.wspace 0x9d023a88 0x60 96 +.text 0x9d023ae8 0x58 88 App's exec code +.text._sscanf_s 0x9d023b40 0x54 84 +.text._bufallo 0x9d023b94 0x54 84 +.text.sbrk 0x9d023be8 0x50 80 +.text.main_entry 0x9d023c38 0x4c 76 +.text 0x9d023c84 0x4c 76 App's exec code +.text._bootstrap_except 0x9d023cd0 0x48 72 +.text 0x9d023d18 0x44 68 App's exec code +.text.puts 0x9d023d5c 0x44 68 +.text._printf_cdfFnopsu 0x9d023da0 0x40 64 +.vector_default 0x9d023de0 0x38 56 +.rodata 0x9d023e18 0x30 48 Read-only const +.text.INTConfigureSyste 0x9d023e48 0x30 48 +.text.free 0x9d023e78 0x30 48 +.rodata 0x9d023ea8 0x2c 44 Read-only const +.text._stub_sbd_memlayo 0x9d023ed4 0x2c 44 +.rodata 0x9d023f00 0x28 40 Read-only const +.text.tolower 0x9d023f28 0x24 36 +.text.toupper 0x9d023f4c 0x24 36 +.text 0x9d023f70 0x20 32 App's exec code +.rodata 0x9d023f90 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d023fac 0x1c 28 +.text.setbuf 0x9d023fc8 0x1c 28 +.rodata 0x9d023fe4 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d023ffc 0x18 24 +.text.CheKseg0CacheOn 0x9d024014 0x18 24 +.text 0x9d02402c 0x18 24 App's exec code +.text.isalnum 0x9d024044 0x18 24 +.text.isalpha 0x9d02405c 0x18 24 +.text.iscntrl 0x9d024074 0x18 24 +.text.isdigit 0x9d02408c 0x18 24 +.text.isgraph 0x9d0240a4 0x18 24 +.text.islower 0x9d0240bc 0x18 24 +.text.isprint 0x9d0240d4 0x18 24 +.text.ispunct 0x9d0240ec 0x18 24 +.text.isspace 0x9d024104 0x18 24 +.text.isupper 0x9d02411c 0x18 24 +.text.isxdigit 0x9d024134 0x18 24 +.text._buffree 0x9d02414c 0x14 20 +.rodata 0x9d024160 0x1c 28 Read-only const +.text.INTEnableInterrup 0x9d02417c 0x8 8 +.text.INTDisableInterru 0x9d024184 0x8 8 +.text._on_reset 0x9d02418c 0x8 8 +.text._on_bootstrap 0x9d024194 0x8 8 +.text.isascii 0x9d02419c 0x8 8 +.text.toascii 0x9d0241a4 0x8 8 +.text._tolower 0x9d0241ac 0x8 8 +.text._toupper 0x9d0241b4 0x8 8 +.text.getpagesize 0x9d0241bc 0x8 8 +.rodata 0x9d0241c4 0x10 16 Read-only const + Total kseg0_program_mem used : 0x209d4 133588 26.2% of 0x7c7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- + Total kseg0_boot_mem used : 0 0 <1% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d002180 0x10 16 General-Exception +.vector_0 0x9d002200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d002220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d002240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d002260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d002280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0022a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0022c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0022e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d002300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d002320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d002340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d002360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d002380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0023a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0023c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0023e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d002400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d002420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d002440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d002460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d002480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0024a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0024c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0024e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d002500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d002520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d002540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d002560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d002580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0025a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0025c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0025e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d002600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d002620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d002640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d002660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d002680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0026a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0026c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0026e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d002700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d002720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d002740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d002760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d002780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0027a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0027c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0027e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d002800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d002820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d002840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d002860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d002880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0028a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0028c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0028e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d002900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d002920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d002940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d002960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d002980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0029a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0029c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0029e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x1f0 496 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x200 512 43.8% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x20de4 134628 26.0% of 0x7e47f + -------------------------------------------------------------------------- + + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.eh_frame 0xa0000000 0x30 48 +.sdata 0xa0000030 0x7c 124 Small init data +.sbss 0xa00000ac 0x194 404 Small uninit data +.bss 0xa0000240 0x2e30 11824 Uninitialized data +.data 0xa0003070 0x4bc 1212 Initialized data +.bss 0xa000352c 0x800 2048 Uninitialized data +.data 0xa0003d2c 0x2c4 708 Initialized data +.bss 0xa0003ff0 0x74 116 Uninitialized data + Total kseg1_data_mem used : 0x4064 16484 25.2% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x4064 16484 25.2% of 0x10000 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa0004068 0x200 512 Reserved for heap +stack 0xa0004280 0xbd70 48496 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_program_mem 0x9d003800 0x0007c7ff xr +kseg0_boot_mem 0x9d003000 0x000007f0 +exception_mem 0x9d002000 0x00001000 +kseg1_boot_mem 0xbfc00000 0x00000490 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +kseg1_data_mem 0xa0000000 0x00010000 w !x +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Uart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Util.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/main.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/system.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/template.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/timer.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/SPI.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/TC77.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d002000 _ebase_address = 0x9d002000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d002180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x1f0 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + *(.reset.startup) + .reset.startup + 0xbfc00008 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d002180 0x10 + *(.gen_handler) + .gen_handler 0x9d002180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d002200 0x8 + *(.vector_0) + .vector_0 0x9d002200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d002200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d002220 0x8 + *(.vector_1) + .vector_1 0x9d002220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d002220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d002240 0x8 + *(.vector_2) + .vector_2 0x9d002240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d002240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d002260 0x8 + *(.vector_3) + .vector_3 0x9d002260 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d002260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d002280 0x8 + *(.vector_4) + .vector_4 0x9d002280 0x8 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0x9d002280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0022a0 0x8 + *(.vector_5) + .vector_5 0x9d0022a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0022a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0022c0 0x8 + *(.vector_6) + .vector_6 0x9d0022c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0022c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0022e0 0x8 + *(.vector_7) + .vector_7 0x9d0022e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0022e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d002300 0x8 + *(.vector_8) + .vector_8 0x9d002300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d002300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d002320 0x8 + *(.vector_9) + .vector_9 0x9d002320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d002320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d002340 0x8 + *(.vector_10) + .vector_10 0x9d002340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d002340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d002360 0x8 + *(.vector_11) + .vector_11 0x9d002360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d002360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d002380 0x8 + *(.vector_12) + .vector_12 0x9d002380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d002380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0023a0 0x8 + *(.vector_13) + .vector_13 0x9d0023a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0023a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0023c0 0x8 + *(.vector_14) + .vector_14 0x9d0023c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0023c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0023e0 0x8 + *(.vector_15) + .vector_15 0x9d0023e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0023e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d002400 0x8 + *(.vector_16) + .vector_16 0x9d002400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d002400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d002420 0x8 + *(.vector_17) + .vector_17 0x9d002420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d002420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d002440 0x8 + *(.vector_18) + .vector_18 0x9d002440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d002440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d002460 0x8 + *(.vector_19) + .vector_19 0x9d002460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d002460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d002480 0x8 + *(.vector_20) + .vector_20 0x9d002480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d002480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0024a0 0x8 + *(.vector_21) + .vector_21 0x9d0024a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0024a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0024c0 0x8 + *(.vector_22) + .vector_22 0x9d0024c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0024c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0024e0 0x8 + *(.vector_23) + .vector_23 0x9d0024e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0024e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d002500 0x8 + *(.vector_24) + .vector_24 0x9d002500 0x8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d002500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d002520 0x8 + *(.vector_25) + .vector_25 0x9d002520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d002520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d002540 0x8 + *(.vector_26) + .vector_26 0x9d002540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d002540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d002560 0x8 + *(.vector_27) + .vector_27 0x9d002560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d002560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d002580 0x8 + *(.vector_28) + .vector_28 0x9d002580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d002580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0025a0 0x8 + *(.vector_29) + .vector_29 0x9d0025a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0025a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0025c0 0x8 + *(.vector_30) + .vector_30 0x9d0025c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0025c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0025e0 0x8 + *(.vector_31) + .vector_31 0x9d0025e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0025e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d002600 0x8 + *(.vector_32) + .vector_32 0x9d002600 0x8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d002600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d002620 0x8 + *(.vector_33) + .vector_33 0x9d002620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d002620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d002640 0x8 + *(.vector_34) + .vector_34 0x9d002640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d002640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d002660 0x8 + *(.vector_35) + .vector_35 0x9d002660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d002660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d002680 0x8 + *(.vector_36) + .vector_36 0x9d002680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d002680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0026a0 0x8 + *(.vector_37) + .vector_37 0x9d0026a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0026a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0026c0 0x8 + *(.vector_38) + .vector_38 0x9d0026c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0026c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0026e0 0x8 + *(.vector_39) + .vector_39 0x9d0026e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0026e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d002700 0x8 + *(.vector_40) + .vector_40 0x9d002700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d002700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d002720 0x8 + *(.vector_41) + .vector_41 0x9d002720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d002720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d002740 0x8 + *(.vector_42) + .vector_42 0x9d002740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d002740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d002760 0x8 + *(.vector_43) + .vector_43 0x9d002760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d002760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d002780 0x8 + *(.vector_44) + .vector_44 0x9d002780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d002780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0027a0 0x8 + *(.vector_45) + .vector_45 0x9d0027a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0027a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0027c0 0x8 + *(.vector_46) + .vector_46 0x9d0027c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0027c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0027e0 0x8 + *(.vector_47) + .vector_47 0x9d0027e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0027e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d002800 0x8 + *(.vector_48) + .vector_48 0x9d002800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d002800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d002820 0x8 + *(.vector_49) + .vector_49 0x9d002820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d002820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d002840 0x8 + *(.vector_50) + .vector_50 0x9d002840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d002840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d002860 0x8 + *(.vector_51) + .vector_51 0x9d002860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d002860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d002880 0x8 + *(.vector_52) + .vector_52 0x9d002880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d002880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0028a0 0x8 + *(.vector_53) + .vector_53 0x9d0028a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0028a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0028c0 0x8 + *(.vector_54) + .vector_54 0x9d0028c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0028c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0028e0 0x8 + *(.vector_55) + .vector_55 0x9d0028e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0028e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d002900 0x8 + *(.vector_56) + .vector_56 0x9d002900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d002900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d002920 0x8 + *(.vector_57) + .vector_57 0x9d002920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d002920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d002940 0x8 + *(.vector_58) + .vector_58 0x9d002940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d002940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d002960 0x8 + *(.vector_59) + .vector_59 0x9d002960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d002960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d002980 0x8 + *(.vector_60) + .vector_60 0x9d002980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d002980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0029a0 0x8 + *(.vector_61) + .vector_61 0x9d0029a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0029a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0029c0 0x8 + *(.vector_62) + .vector_62 0x9d0029c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0029c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0029e0 0x8 + *(.vector_63) + .vector_63 0x9d0029e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0029e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup + *(.startup) + +.text 0x9d003800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d003800 . = ALIGN (0x4) + +.init 0x9d003800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d003800 . = ALIGN (0x4) + +.fini 0x9d003800 0x0 + *(.fini) + 0x9d003800 . = ALIGN (0x4) + +.preinit_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d003800 PROVIDE (__preinit_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.init_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d003800 PROVIDE (__init_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.fini_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d003800 PROVIDE (__fini_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.ctors 0x9d003800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d003800 . = ALIGN (0x4) + +.dtors 0x9d003800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d003800 . = ALIGN (0x4) + +.rodata 0x9d003800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d003800 . = ALIGN (0x4) + +.sdata2 0x9d003000 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d003000 . = ALIGN (0x4) + +.sbss2 0x9d003000 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d003000 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d003000 . = ALIGN (0x4) + +.dbg_data 0xa0000000 0x0 + 0xa0000000 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000000 0x0 + *(.jcr) + 0xa0000000 . = ALIGN (0x4) + +.eh_frame 0xa0000000 0x30 + *(.eh_frame) + .eh_frame 0xa0000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000030 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000030 . = ALIGN (0x4) + +.persist 0xa0000030 0x0 + 0xa0000030 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 _persist_end = . + +.data 0xa0000030 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 . = . + 0xa0008020 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000030 0x0 + *(.got.plt) + *(.got) + 0xa0000030 . = ALIGN (0x4) + +.sdata 0xa0000030 0x7c + 0xa0000030 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000030 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000030 egstrNmBusCapabilities + .sdata 0xa0000034 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .sdata 0xa000003c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sdata 0xa0000040 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sdata 0xa0000044 0x2 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000044 State + *fill* 0xa0000046 0x2 + .sdata 0xa0000048 0xc build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .sdata 0xa0000054 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0xa0000054 gUartStrings + .sdata 0xa0000058 0x8 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .sdata 0xa0000060 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa0000067 TerminalSocket + 0xa0000068 TerminalServerSocket + 0xa0000069 SyslogSocket + 0xa000006a SyslogServerSocket + 0xa000006b NetworkSocket + 0xa000006c NetworkServerSocket + 0xa000006d BootloaderSocket + 0xa000006e BootloaderServerSocket + 0xa000006f mWiFiState + .sdata 0xa0000070 0x4 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + 0xa0000070 mLoraPreamble + .sdata 0xa0000074 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .sdata 0xa000007c 0x8 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .sdata 0xa0000084 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .sdata 0xa000008c 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa0000094 BtldrComputedCRC + 0xa0000098 BootloaderState + 0xa000009c BootloaderDataStartPtr + .sdata 0xa00000a4 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa00000a4 _Files + .sdata 0xa00000a8 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa00000a8 __XC_UART + 0xa00000ac . = ALIGN (0x4) + 0xa00000ac _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa00000ac . = ALIGN (0x4) + 0xa00000ac _data_end = . + 0xa00000ac _bss_begin = . + +.sbss 0xa00000ac 0x194 + 0xa00000ac _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa00000ac 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .sbss 0xa00000b0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0xa00000b8 pfWifiCb + 0xa00000bc pfIpCb + 0xa00000c0 pfOtaCb + 0xa00000c4 pfSigmaCb + 0xa00000c8 pfHifCb + 0xa00000cc pfSSLCb + .sbss 0xa00000d0 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .sbss 0xa00000d8 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sbss 0xa00000e0 0x14 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .sbss 0xa00000f4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sbss 0xa00000f8 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + *fill* 0xa00000f9 0x1 + .sbss 0xa00000fa 0x6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa00000fa gu16SessionID + 0xa00000fc gbSocketInit + .sbss 0xa0000100 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .sbss 0xa0000104 0x4 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa0000104 LoraData + .sbss 0xa0000108 0x18 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000108 DataSize + 0xa000010c DataCtr + 0xa0000110 BufPtr + 0xa0000114 RxPtr + 0xa0000115 Command + 0xa0000116 CRC + 0xa0000117 SenderID + 0xa0000118 SenderAddress + 0xa0000119 Flags + 0xa000011a IsUpdating + 0xa000011c BmpDataPtr + .sbss 0xa0000120 0xc build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .sbss 0xa000012c 0x18 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa000012c gu32HostIp + 0xa0000130 gu8RetryCount + 0xa0000140 mWiFiInitOK + .sbss 0xa0000144 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .sbss 0xa0000148 0x8 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0xa0000148 ina219_currentDivider_mA + 0xa000014c ina219_powerDivider_mW + .sbss 0xa0000150 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + 0xa0000150 WatchdogTriggered + .sbss 0xa0000154 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa0000154 BootloaderHeader + 0xa0000158 BootloaderDataSize + 0xa000015c BootloaderDataCtr + 0xa0000160 BootloaderBufPtr + 0xa0000164 BootloaderCRC + 0xa0000168 BootloaderCommand + .sbss 0xa000016c 0x1 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .sbss 0xa000016d 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000016d _outdone + *fill* 0xa000016e 0x2 + .sbss 0xa0000170 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0000170 __allocp + 0xa0000174 __alloct + 0xa0000178 __allocx + .sbss 0xa0000180 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa0000180 errno + .sbss 0xa0000184 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa0000184 _minbrk + 0xa0000188 _maxbrk + *(.scommon) + .scommon 0xa000018c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0xa000018c at_sb_printf + .scommon 0xa0000190 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000190 mWifiSPIBaudrate + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + *fill* 0xa0000191 0x3 + .scommon 0xa0000194 0x15 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa0000194 gpfAppResolveCb + 0xa0000198 gu16BufferSize + 0xa000019c gpfAppSocketCb + 0xa00001a0 gsockerrno + 0xa00001a4 gfpPingCb + 0xa00001a8 gu8OpCode + .scommon 0xa00001a9 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .scommon 0xa00001a9 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + *fill* 0xa00001a9 0x3 + .scommon 0xa00001ac 0x2 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa00001ac acIntUartRxBuff + *fill* 0xa00001ae 0x2 + .scommon 0xa00001b0 0x14 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0xa00001b0 mTerminalOpened + 0xa00001b4 TerminalDataPtr + 0xa00001b8 mTerminalPendingAction + 0xa00001bc mHelpStringPtr + 0xa00001c0 mTerminalTickState + .scommon 0xa00001c4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0xa00001c4 ActualTemp + .scommon 0xa00001c8 0xa build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa00001c8 u8IsMacAddrValid + 0xa00001cc mac_addr + .scommon 0xa00001d2 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + *fill* 0xa00001d2 0x2 + .scommon 0xa00001d4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + 0xa00001d4 PowerRelayState + .scommon 0xa00001d8 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + 0xa00001d8 mBatteryCurrent + 0xa00001dc mVoltageMeanSum + 0xa00001e0 mVoltageMeanCount + 0xa00001e4 mBatterySOC + 0xa00001e8 mBatteryVoltage + 0xa00001ec mCurrentModuleOK + .scommon 0xa00001f0 0x8 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + 0xa00001f0 mLastTransactionOK + 0xa00001f4 mI2CWaitCounter + .scommon 0xa00001f8 0x2 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0xa00001f8 mSPIFlashHighSpeedBaudrate + 0xa00001f9 mSPIFlashBaudrate + *fill* 0xa00001fa 0x2 + .scommon 0xa00001fc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0xa00001fc mSyslogBufPtr + .scommon 0xa0000200 0x38 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0xa0000200 CurDataChunkSize + 0xa0000204 BootloaderFirmwareChunkWriteCount + 0xa0000208 BootloaderFlashWriteDataPtr + 0xa000020c BootloaderFlashErased + 0xa0000210 BootloaderFlashWriteState + 0xa0000214 BootloaderCurFlashWriteAddress + 0xa0000218 BooloaderFlashEraseState + 0xa000021c BootloaderCurFlashEraseAddress + 0xa0000220 BootloaderFlashWritePollCount + 0xa0000224 BootloaderInterfaceState + 0xa0000228 DataChunkWritten + 0xa000022c BooloaderFlashErasePollCount + 0xa0000230 FirmwareUploaded + 0xa0000234 CurDataChunkIndex + .scommon 0xa0000238 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .scommon 0xa0000238 0x2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + 0xa0000238 mDeviceID + *fill* 0xa000023a 0x2 + .scommon 0xa000023c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa000023c BootloaderRxPtr + 0xa0000240 _sbss_end = . + 0xa0000240 . = ALIGN (0x4) + +.bss 0xa0000240 0x2e30 + *(.dynbss) + *(COMMON) + COMMON 0xa0000240 0xb0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa0000240 gastrSockets + COMMON 0xa00002f0 0x40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa00002f0 astInternalUartData + COMMON 0xa0000330 0x26e build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000330 mRxData + 0xa0000468 mTxData + *fill* 0xa000059e 0x2 + COMMON 0xa00005a0 0x384 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0xa00005a0 TerminalWorkString + 0xa00006cc TerminalPrevDataBuf + 0xa00007f8 TerminalDataBuf + COMMON 0xa0000924 0x620 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0xa0000924 astUartData + COMMON 0xa0000f44 0xf0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0xa0000f44 astTimer + COMMON 0xa0001034 0xd04 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa0001034 NetworkRxBuf + 0xa0001434 TerminalRxBuf + 0xa0001834 BootloaderRxBuf + 0xa0001c34 addr_in + 0xa0001c44 param + 0xa0001c60 mModuleIPConfig + 0xa0001c70 SyslogRxBuf + COMMON 0xa0001d38 0x16 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0xa0001d38 I2CSlaveBuffer + 0xa0001d44 I2CMasterBuffer + *fill* 0xa0001d4e 0x2 + COMMON 0xa0001d50 0x1000 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0xa0001d50 mFlashSectorBuffer + COMMON 0xa0002d50 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0xa0002d50 mSyslogBuffer + COMMON 0xa0002f44 0x12c build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0xa0002f44 BootloaderBuffer + 0xa0003070 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0003070 . = ALIGN (0x4) + 0xa0003070 _end = . + 0xa0003070 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0003070 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x248 + *(.comment) + .comment 0x00000000 0x3c build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xa88 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_aranges + 0x00000440 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_aranges + 0x00000460 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_aranges + 0x00000480 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_aranges + 0x000004a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_aranges + 0x000004c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_aranges + 0x000004e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_aranges + 0x00000500 0x20 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_aranges + 0x00000520 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000540 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000568 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x00000688 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_aranges + 0x000006b8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x000006e0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000708 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000728 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_aranges + 0x00000748 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000768 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x00000788 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000007a8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x000007d0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_aranges + 0x000007f8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000828 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000848 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000868 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x00000888 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000928 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000948 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000968 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000009a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000009c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x000009e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000a08 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000a28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000a48 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_aranges + 0x00000a68 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_pubnames + 0x00000000 0x34ca + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000020 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubnames + 0x000000c6 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubnames + 0x0000016c 0x8f build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubnames + 0x000001fb 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubnames + 0x0000021e 0x173 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubnames + 0x00000391 0xe5 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubnames + 0x00000476 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubnames + 0x0000051c 0x104 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000620 0x6fd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000d1d 0x207 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubnames + 0x00000f24 0xcd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubnames + 0x00000ff1 0xee build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubnames + 0x000010df 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubnames + 0x00001102 0xb8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubnames + 0x000011ba 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubnames + 0x000011dd 0x1ce build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubnames + 0x000013ab 0x75 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubnames + 0x00001420 0x31 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubnames + 0x00001451 0x24 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_pubnames + 0x00001475 0x125 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_pubnames + 0x0000159a 0x194 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_pubnames + 0x0000172e 0x174 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_pubnames + 0x000018a2 0x101 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_pubnames + 0x000019a3 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_pubnames + 0x00001a7b 0x31 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_pubnames + 0x00001aac 0x49 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_pubnames + 0x00001af5 0xec build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_pubnames + 0x00001be1 0x347 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_pubnames + 0x00001f28 0x25 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_pubnames + 0x00001f4d 0x72 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001fbf 0xca build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubnames + 0x00002089 0x41 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_pubnames + 0x000020ca 0x13b build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_pubnames + 0x00002205 0x1af build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_pubnames + 0x000023b4 0x92 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_pubnames + 0x00002446 0x18a build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_pubnames + 0x000025d0 0xa3 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_pubnames + 0x00002673 0x71 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_pubnames + 0x000026e4 0x3b9 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_pubnames + 0x00002a9d 0x7d build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_pubnames + 0x00002b1a 0x5c build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_pubnames + 0x00002b76 0x310 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002e86 0x2f build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_pubnames + 0x00002eb5 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002ed5 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x00002f10 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x00002f39 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002f63 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x00002f8e 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00002fb9 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x00002fec 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x0000300c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x00003030 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00003058 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00003075 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_pubnames + 0x000030a7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x000030cc 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x000030f5 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x00003113 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_pubnames + 0x0000313d 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00003167 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x00003187 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x000031a3 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x000031cf 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_pubnames + 0x000031fb 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x0000321c 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x0000323a 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00003256 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x00003271 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x00003352 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x0000336f 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x0000338d 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x000033e9 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x00003404 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x00003420 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x00003442 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x00003466 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x00003486 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubnames + 0x000034a6 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_info 0x00000000 0x40899 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x37a8 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_info 0x000037a8 0x1cdf build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_info 0x00005487 0x1654 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_info 0x00006adb 0x3e6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_info 0x00006ec1 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_info 0x00006ec1 0x146 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_info 0x00007007 0x118f build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_info 0x00008196 0x98d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_info 0x00008b23 0x47c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_info 0x00008f9f 0xc18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_info 0x00009bb7 0x3a40 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_info 0x0000d5f7 0xa04 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_info 0x0000dffb 0x52c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_info 0x0000e527 0x680 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_info 0x0000eba7 0x141 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_info 0x0000ece8 0x92d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_info 0x0000f615 0x142 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_info 0x0000f757 0x1ddb build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_info 0x00011532 0x7e0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_info 0x00011d12 0x557 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_info 0x00012269 0x115b build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_info 0x000133c4 0x3b38 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_info 0x00016efc 0x1aa3 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_info 0x0001899f 0x1963 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_info 0x0001a302 0x19e8 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_info 0x0001bcea 0x14fb build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_info 0x0001d1e5 0x127b build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_info 0x0001e460 0x113f build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_info 0x0001f59f 0x1a37 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_info 0x00020fd6 0x113b build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_info 0x00022111 0x113d build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_info 0x0002324e 0x214f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_info 0x0002539d 0x31ba build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_info 0x00028557 0x131a build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_info 0x00029871 0x1d66 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_info 0x0002b5d7 0x1791 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_info 0x0002cd68 0x12f5 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_info 0x0002e05d 0x188b build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_info 0x0002f8e8 0x15a7 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_info 0x00030e8f 0x16f7 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_info 0x00032586 0x181c build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_info 0x00033da2 0x159e build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_info 0x00035340 0x1328 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_info 0x00036668 0x2b2e build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_info 0x00039196 0x130c build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_info 0x0003a4a2 0x14cc build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_info 0x0003b96e 0x1f92 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_info 0x0003d900 0x2d0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_info 0x0003dbd0 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003dc7e 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0003dd39 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0003dde7 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0003de97 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0003df49 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0003dffb 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0003e0dd 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0003e199 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0003e25d 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0003e333 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0003e333 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x0003e3e8 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_info 0x0003e4cc 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0003e591 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0003e65c 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0003e713 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_info 0x0003e7d5 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x0003e898 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003e950 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x0003ea03 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0003eadd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0003eadd 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_info 0x0003ebc2 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003eca2 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x0003ed58 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x0003ee0b 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x0003eebc 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x0003eebc 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x0003f0d5 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x0003f0d5 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x0003f18a 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0003f240 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x0003f355 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x0003f400 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x0003f4ad 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x0003f4ad 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x0003f578 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x0003f83a 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x0003ffbc 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_info 0x00040774 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_abbrev 0x00000000 0x5cb8 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1f2 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_abbrev 0x000001f2 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_abbrev 0x000003e6 0x239 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_abbrev 0x0000061f 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_abbrev 0x000006e7 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_abbrev 0x000006e8 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_abbrev 0x0000073d 0x23e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_abbrev 0x0000097b 0x157 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_abbrev 0x00000ad2 0x105 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_abbrev 0x00000bd7 0x1fd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_abbrev 0x00000dd4 0x224 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_abbrev 0x00000ff8 0x1ad build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_abbrev 0x000011a5 0x102 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_abbrev 0x000012a7 0x153 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_abbrev 0x000013fa 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_abbrev 0x0000144f 0x175 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_abbrev 0x000015c4 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_abbrev 0x00001619 0x245 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_abbrev 0x0000185e 0x122 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_abbrev 0x00001980 0xe8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_abbrev 0x00001a68 0x17b build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_abbrev 0x00001be3 0x2bb build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_abbrev 0x00001e9e 0x268 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_abbrev 0x00002106 0x2a0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_abbrev 0x000023a6 0x2c7 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_abbrev 0x0000266d 0x223 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_abbrev 0x00002890 0x1a2 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_abbrev 0x00002a32 0x166 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_abbrev 0x00002b98 0x339 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_abbrev 0x00002ed1 0x166 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_abbrev 0x00003037 0x166 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_abbrev 0x0000319d 0x217 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_abbrev 0x000033b4 0x316 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_abbrev 0x000036ca 0x18e build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_abbrev 0x00003858 0x272 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_abbrev 0x00003aca 0x1c4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_abbrev 0x00003c8e 0x18e build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_abbrev 0x00003e1c 0x220 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_abbrev 0x0000403c 0x24d build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_abbrev 0x00004289 0x1da build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_abbrev 0x00004463 0x298 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_abbrev 0x000046fb 0x233 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_abbrev 0x0000492e 0x18c build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_abbrev 0x00004aba 0x2d9 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_abbrev 0x00004d93 0x1b5 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_abbrev 0x00004f48 0x1b2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_abbrev 0x000050fa 0x2a4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_abbrev 0x0000539e 0x9a build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_abbrev 0x00005438 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x0000546a 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x0000548d 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000054b0 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x000054d3 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x000054f6 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00005519 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x0000553e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x00005563 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x00005588 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x000055ad 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x000055ae 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x000055d3 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_abbrev 0x00005614 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x00005639 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x0000565e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00005683 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_abbrev 0x000056a8 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x000056cd 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x000056f2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x00005717 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x00005760 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x00005761 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_abbrev 0x000057a4 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x000057da 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x000057ff 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00005824 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00005849 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x0000584a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x0000586f 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00005870 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00005895 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x000058ba 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x000058f2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x00005917 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x0000593c 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x0000593d 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x0000596f 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x000059e8 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00005b1a 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_abbrev 0x00005c59 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_line 0x00000000 0x82b9 + *(.debug_line) + .debug_line 0x00000000 0x20d build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_line 0x0000020d 0x251 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_line 0x0000045e 0x339 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_line 0x00000797 0x195 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_line 0x0000092c 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_line 0x0000092c 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_line 0x000009a6 0x3b2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_line 0x00000d58 0x22d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_line 0x00000f85 0x1e8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_line 0x0000116d 0x2cd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_line 0x0000143a 0x568 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_line 0x000019a2 0x34b build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_line 0x00001ced 0x207 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_line 0x00001ef4 0x27e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_line 0x00002172 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_line 0x000021ec 0x2db build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_line 0x000024c7 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_line 0x00002541 0x4ef build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_line 0x00002a30 0x2d2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_line 0x00002d02 0x1f0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_line 0x00002ef2 0x156 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_line 0x00003048 0x2c6 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_line 0x0000330e 0x262 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_line 0x00003570 0x3c5 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_line 0x00003935 0x2ef build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_line 0x00003c24 0x25b build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_line 0x00003e7f 0x161 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_line 0x00003fe0 0x101 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_line 0x000040e1 0x38e build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_line 0x0000446f 0x101 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_line 0x00004570 0x101 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_line 0x00004671 0x22f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_line 0x000048a0 0x574 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_line 0x00004e14 0x155 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_line 0x00004f69 0x23d build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_line 0x000051a6 0x1ad build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_line 0x00005353 0x161 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_line 0x000054b4 0x2cc build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_line 0x00005780 0x23e build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_line 0x000059be 0x1e9 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_line 0x00005ba7 0x299 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_line 0x00005e40 0x2af build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_line 0x000060ef 0x165 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_line 0x00006254 0x4f2 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_line 0x00006746 0x193 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_line 0x000068d9 0x19a build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_line 0x00006a73 0x3d5 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_line 0x00006e48 0x137 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_line 0x00006f7f 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x00007030 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00007092 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x00007103 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00007175 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x000071e8 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x0000725b 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x000072f2 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x00007376 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x000073fe 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x00007494 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00007494 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x00007504 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_line 0x00007574 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x000075e2 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x00007652 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x000076c3 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_line 0x00007733 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x000077a4 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x00007814 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x00007883 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x000078f0 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x000078f0 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_line 0x00007960 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x000079d0 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00007a40 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00007aaf 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00007b1d 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00007b1d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00007b8d 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x00007b8d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00007bfd 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00007c6d 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x00007ce5 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00007d5d 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00007dd6 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00007dd6 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x00007e69 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x00007f6e 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x000080d6 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_line 0x0000822b 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_frame 0x00000000 0x3768 + *(.debug_frame) + .debug_frame 0x00000000 0x2c build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_frame 0x0000002c 0xfc build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_frame 0x00000128 0x9c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_frame 0x000001c4 0xd4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_frame 0x00000298 0x208 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_frame 0x000004a0 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_frame 0x000005ac 0xd4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_frame 0x00000680 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_frame 0x0000078c 0x748 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_frame 0x00000ed4 0x294 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_frame 0x00001168 0x128 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_frame 0x00001290 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_frame 0x0000139c 0x20c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_frame 0x000015a8 0x25c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_frame 0x00001804 0x17c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_frame 0x00001980 0x2c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_frame 0x000019ac 0x2c build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_frame 0x000019d8 0x138 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_frame 0x00001b10 0x130 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_frame 0x00001c40 0xf4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_frame 0x00001d34 0x128 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_frame 0x00001e5c 0x10c build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_frame 0x00001f68 0x2c build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_frame 0x00001f94 0x64 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_frame 0x00001ff8 0x148 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_frame 0x00002140 0x2b8 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_frame 0x000023f8 0x2c build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_frame 0x00002424 0x64 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_frame 0x00002488 0xb8 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_frame 0x00002540 0x48 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_frame 0x00002588 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_frame 0x00002660 0x198 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_frame 0x000027f8 0x9c build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_frame 0x00002894 0x160 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_frame 0x000029f4 0xa0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_frame 0x00002a94 0x80 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_frame 0x00002b14 0x1b4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_frame 0x00002cc8 0x80 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_frame 0x00002d48 0x64 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_frame 0x00002dac 0x198 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_frame 0x00002f44 0x64 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_frame 0x00002fa8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00002fd0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x00003000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x00003020 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x00003040 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00003060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x00003080 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x000030a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x000030c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x000030e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00003108 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00003134 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_frame 0x000031a0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x000031e8 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x00003220 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00003240 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_frame 0x00003268 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x00003294 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x000032bc 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x000032e8 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x00003320 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_frame 0x00003378 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x000033ec 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00003414 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00003444 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00003464 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x00003584 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x000035a4 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x000035d4 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x00003660 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x0000368c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x000036b4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x000036d4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00003700 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00003720 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_frame 0x00003740 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_str 0x00000000 0x3178 + *(.debug_str) + .debug_str 0x00000000 0x242 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_str 0x00000242 0x14a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_str 0x0000038c 0x149 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_str 0x000004d5 0xa build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_str 0x000004df 0x36 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_str 0x00000515 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_str 0x00000515 0xa build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_str 0x0000051f 0x25 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_str 0x00000544 0x178 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_str 0x000006bc 0x2d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_str 0x000006e9 0x31 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_str 0x0000071a 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_str 0x0000072c 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_str 0x0000072c 0x19 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_str 0x00000745 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_str 0x00000745 0x168 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_str 0x000008ad 0x2d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_str 0x000008da 0x16 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_str 0x000008f0 0x12f build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_str 0x00000a1f 0x226 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_str 0x00000c45 0x14f build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_str 0x00000d94 0x1ac build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_str 0x00000f40 0x181 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_str 0x000010c1 0x145 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_str 0x00001206 0x12f build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_str 0x00001335 0x12f build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_str 0x00001464 0x14d build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_str 0x000015b1 0x12f build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_str 0x000016e0 0x12f build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_str 0x0000180f 0x17f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_str 0x0000198e 0x281 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_str 0x00001c0f 0x146 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_str 0x00001d55 0x170 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_str 0x00001ec5 0x15b build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_str 0x00002020 0x138 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_str 0x00002158 0x1ac build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_str 0x00002304 0x18b build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_str 0x0000248f 0x17e build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_str 0x0000260d 0x193 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_str 0x000027a0 0x14b build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_str 0x000028eb 0x15e build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_str 0x00002a49 0x29e build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_str 0x00002ce7 0x13a build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_str 0x00002e21 0x159 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_str 0x00002f7a 0x1fe build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_str 0x00003178 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_loc 0x00000000 0x1489 + *(.debug_loc) + .debug_loc 0x00000000 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x000000c9 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x00000a8c 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_loc 0x00001421 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x33f2 + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x276 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000276 0x149 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubtypes + 0x000003bf 0x14c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubtypes + 0x0000050b 0x3c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubtypes + 0x00000547 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubtypes + 0x00000559 0x5e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubtypes + 0x000005b7 0xa2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000659 0x48 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubtypes + 0x000006a1 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubtypes + 0x000007ad 0x41c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00000bc9 0x40 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubtypes + 0x00000c09 0x56 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubtypes + 0x00000c5f 0x5a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubtypes + 0x00000cb9 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubtypes + 0x00000ccb 0x47 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubtypes + 0x00000d12 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubtypes + 0x00000d24 0x29d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubtypes + 0x00000fc1 0x3c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00000ffd 0xcf build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubtypes + 0x000010cc 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_pubtypes + 0x000011b3 0x1f8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_pubtypes + 0x000013ab 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_pubtypes + 0x000014e1 0x175 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_pubtypes + 0x00001656 0x155 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_pubtypes + 0x000017ab 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_pubtypes + 0x00001892 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_pubtypes + 0x00001979 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_pubtypes + 0x00001a60 0x13c build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_pubtypes + 0x00001b9c 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_pubtypes + 0x00001c83 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_pubtypes + 0x00001d6a 0x145 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_pubtypes + 0x00001eaf 0x2d3 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002182 0xfc build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_pubtypes + 0x0000227e 0x17e build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x000023fc 0x136 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x00002532 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_pubtypes + 0x0000262a 0x12e build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_pubtypes + 0x00002758 0x121 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_pubtypes + 0x00002879 0x110 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_pubtypes + 0x00002989 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_pubtypes + 0x00002a81 0x11a build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_pubtypes + 0x00002b9b 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_pubtypes + 0x00002c93 0x2d0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_pubtypes + 0x00002f63 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_pubtypes + 0x0000304a 0x10d build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_pubtypes + 0x00003157 0x149 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_pubtypes + 0x000032a0 0x2c build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_pubtypes + 0x000032cc 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x0000330c 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x00003365 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubtypes + 0x000033be 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_ranges 0x00000000 0x280 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000050 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_ranges 0x00000070 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000088 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x000000a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x000000f0 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x00000108 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_ranges 0x00000120 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000140 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000160 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000170 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x00000200 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x00000210 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000220 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000250 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .gnu.attributes + 0x00000290 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .gnu.attributes + 0x000002a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .gnu.attributes + 0x000002b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .gnu.attributes + 0x000002c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .gnu.attributes + 0x000002d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .gnu.attributes + 0x000002e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .gnu.attributes + 0x000002f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .gnu.attributes + 0x00000300 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x00000560 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000570 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .gnu.attributes + 0x00000580 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0004280 0x400 + .stack 0xa0004280 0x400 stack + +.data 0xa0003070 0x4bc + .data 0xa0003070 0x4bc build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.bss 0xa000352c 0x800 + .bss 0xa000352c 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .bss 0xa000392c 0x400 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + +.data 0xa0003d2c 0x2c4 + .data 0xa0003d2c 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003d2c _iob + .data 0xa0003dcc 0x6c build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .data 0xa0003e38 0x58 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .data 0xa0003e90 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .data 0xa0003ee8 0x58 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .data 0xa0003f40 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .data 0xa0003f98 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.bss 0xa0003ff0 0x74 + .bss 0xa0003ff0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003ff0 _sibuf + 0xa0004010 _sobuf + .bss 0xa0004030 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa000404c 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa000404c __allocs + .bss 0xa000405c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa0004060 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z23 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z24 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z40 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z41 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z43 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z44 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z60 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.bss%z61 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z62 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z63 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z64 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z65 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z66 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z67 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z68 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z69 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z70 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z71 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z72 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z73 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z74 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z75 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z76 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z77 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z78 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z79 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z80 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z81 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z82 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z83 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z84 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z85 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z86 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z87 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z88 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z89 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z90 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z91 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z92 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z93 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z94 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z95 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z96 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z97 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z98 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z99 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z100 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z101 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z102 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z103 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z104 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z105 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z106 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z107 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z108 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z109 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z110 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z111 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z112 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z113 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z114 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z115 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z116 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z117 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z118 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z119 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z120 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z121 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z122 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z123 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z124 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z125 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z126 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z127 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z128 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z129 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z130 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z131 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z132 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z133 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z134 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z135 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z136 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z137 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z138 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z139 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z140 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z141 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z142 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z143 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z144 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z145 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z146 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z147 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z148 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z149 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z150 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z151 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z152 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z153 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z154 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z155 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z156 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z157 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z158 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z159 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z160 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z161 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z162 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z163 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z164 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z165 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z166 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z167 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z168 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z169 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z170 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z171 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z172 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z173 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z174 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z175 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z176 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z177 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z178 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z179 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z180 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z181 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z182 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z183 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z184 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z185 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z186 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z187 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z188 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z189 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z190 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z191 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z192 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z193 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z194 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z195 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z196 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z197 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z198 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z199 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z200 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z201 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z202 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z203 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z204 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z205 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z208 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z212 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z213 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z214 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z215 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z216 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z217 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z218 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z219 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z220 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z221 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z222 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z229 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.bss%z231 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.data%z232 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.bss%z233 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + +.bss%z239 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.data%z240 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.bss%z241 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + +.data%z242 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + +.bss%z243 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + +.data%z244 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + +.bss%z245 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + +.data%z251 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + +.bss%z252 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + +.data%z253 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + +.bss%z254 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + +.data%z255 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + +.bss%z256 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.data%z257 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.bss%z258 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.data%z259 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.bss%z260 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.data%z262 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.bss%z263 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + +.data%z264 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + +.bss%z265 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + +.data%z266 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + +.bss%z267 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.data%z268 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.bss%z269 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + +.data%z275 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + +.bss%z276 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + +.data%z277 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + +.bss%z278 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.data%z279 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.bss%z280 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + +.data%z281 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + +.bss%z282 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.data%z283 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.bss%z284 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.data%z285 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.bss%z286 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.data%z287 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.bss%z288 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.data%z289 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.bss%z290 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.data%z291 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.bss%z292 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.data%z293 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.bss%z294 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.data%z295 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.bss%z296 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.data%z305 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.bss%z306 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.data%z307 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.bss%z308 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.data%z309 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.bss%z310 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.data%z311 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.bss%z312 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.data%z313 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.bss%z314 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + +.data%z315 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + +.bss%z316 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.data%z317 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.bss%z318 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z319 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +._debug_exception + 0xbfc00480 0x2c + ._debug_exception + 0xbfc00480 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + 0xbfc00480 __DbgExecReturn + +.text 0x9d003800 0xbd4c + .text 0x9d003800 0x2904 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + 0x9d003fb4 m2m_wifi_download_mode + 0x9d0042f4 m2m_wifi_ble_set_gain_table + 0x9d004368 m2m_wifi_init_hold + 0x9d0043ac m2m_wifi_init_start + 0x9d0044f8 m2m_wifi_init + 0x9d004554 m2m_wifi_deinit + 0x9d00459c m2m_wifi_reinit_hold + 0x9d0045d8 m2m_wifi_reinit_start + 0x9d004610 m2m_wifi_reinit + 0x9d004670 m2m_wifi_yield + 0x9d0046a0 m2m_wifi_handle_events + 0x9d0046d4 m2m_wifi_default_connect + 0x9d004720 m2m_wifi_connect + 0x9d004794 m2m_wifi_connect_sc + 0x9d004bd8 m2m_wifi_disconnect + 0x9d004c24 m2m_wifi_set_mac_address + 0x9d004c90 m2m_wifi_set_static_ip + 0x9d004d24 m2m_wifi_request_dhcp_client + 0x9d004d48 m2m_wifi_request_dhcp_server + 0x9d004d70 m2m_wifi_enable_dhcp + 0x9d004de8 m2m_wifi_set_lsn_int + 0x9d004e3c m2m_wifi_set_cust_InfoElement + 0x9d004e9c m2m_wifi_set_scan_options + 0x9d004f14 m2m_wifi_set_scan_region + 0x9d004f84 m2m_wifi_request_scan + 0x9d00502c m2m_wifi_request_scan_passive + 0x9d0050d4 m2m_wifi_wps + 0x9d005160 m2m_wifi_wps_disable + 0x9d0051b8 m2m_wifi_p2p + 0x9d005264 m2m_wifi_p2p_disconnect + 0x9d0052bc m2m_wifi_enable_ap + 0x9d005334 m2m_wifi_disable_ap + 0x9d00538c m2m_wifi_req_curr_rssi + 0x9d0053e4 m2m_wifi_req_restrict_ble + 0x9d00543c m2m_wifi_req_unrestrict_ble + 0x9d005494 m2m_wifi_send_ethernet_pkt + 0x9d005534 m2m_wifi_get_otp_mac_address + 0x9d0055b0 m2m_wifi_get_mac_address + 0x9d005624 m2m_wifi_req_scan_result + 0x9d005690 m2m_wifi_get_num_ap_found + 0x9d0056b8 m2m_wifi_get_sleep_mode + 0x9d0056e8 m2m_wifi_set_sleep_mode + 0x9d005774 m2m_wifi_request_sleep + 0x9d0057f8 m2m_wifi_set_device_name + 0x9d005894 m2m_wifi_get_chipId + 0x9d0058c4 m2m_wifi_get_firmware_version + 0x9d005928 m2m_wifi_check_ota_rb + 0x9d005994 m2m_ota_get_firmware_version + 0x9d0059f8 m2m_wifi_enable_monitoring_mode + 0x9d005aac m2m_wifi_disable_monitoring_mode + 0x9d005af8 m2m_wifi_send_wlan_pkt + 0x9d005b94 m2m_wifi_start_provision_mode + 0x9d005c8c m2m_wifi_stop_provision_mode + 0x9d005cd8 m2m_wifi_get_connection_info + 0x9d005d24 m2m_wifi_set_sytem_time + 0x9d005d78 m2m_wifi_get_sytem_time + 0x9d005dc4 m2m_wifi_enable_sntp + 0x9d005e3c m2m_wifi_set_power_profile + 0x9d005ea8 m2m_wifi_set_tx_power + 0x9d005f14 m2m_wifi_enable_firmware_logs + 0x9d005f80 m2m_wifi_set_battery_voltage + 0x9d005ff0 m2m_wifi_prng_get_random_bytes + 0x9d006090 m2m_wifi_ble_api_send + .text 0x9d006104 0x2140 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0x9d006104 Socket_ReadSocketData + 0x9d006a3c socketInit + 0x9d006ab0 socketDeinit + 0x9d006b10 registerSocketCallback + 0x9d006b48 socket + 0x9d006dd0 bind + 0x9d006f00 listen + 0x9d006fe8 accept + 0x9d00705c connect + 0x9d0071d4 send + 0x9d007378 sendto + 0x9d007510 recv + 0x9d0076f8 close + 0x9d007838 recvfrom + 0x9d007a28 nmi_inet_addr + 0x9d007b9c gethostbyname + 0x9d007fd4 setsockopt + 0x9d008160 getsockopt + 0x9d00819c m2m_ping_req + .text 0x9d008244 0x1a7c build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0x9d008244 InitUart + 0x9d0084f4 UartResetPort + 0x9d0087a8 UartOpenComPort + 0x9d008998 UartReceiveData + 0x9d008ae4 UartGetPendingDataSize + 0x9d008bdc UartTransmitData + 0x9d009320 DataSentNotification + 0x9d0095f4 UartTick + 0x9d009bcc UartBlockAndTick + 0x9d009c2c UartBlockUntillBufEmpty + .text 0x9d009cc0 0x18ac build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0x9d00a83c InitWiFi + 0x9d00ab14 TurnOFFWiFi + 0x9d00aba8 CloseSockets + 0x9d00ac94 GetWiFiSate + 0x9d00acb8 TickWiFi + 0x9d00ada4 OpenTerminalServer + 0x9d00ae60 SendTerminalData + 0x9d00aee8 SentTerminalByte + 0x9d00af64 OpenNetworkServer + 0x9d00b020 SendNetworkData + 0x9d00b0a8 SentNetworkByte + 0x9d00b124 OpenSyslogServer + 0x9d00b1e0 SendSyslogData + 0x9d00b258 SendSyslogByte + 0x9d00b2d4 IsSyslogClientConnected + 0x9d00b314 OpenBootloaderServer + 0x9d00b3d0 CloseBootloaderServer + 0x9d00b438 SendBootloaderData + 0x9d00b4b0 SendSBootloaderByte + 0x9d00b52c IsBootloaderClientConnected + .text 0x9d00b56c 0x1638 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0x9d00b56c BootloaderInterfaceInit + 0x9d00b5c0 BootloaderInterfaceTick + 0x9d00b5f8 BootloaderExecuteCmd + 0x9d00b860 BootloaderCRCError + 0x9d00b8c8 BootloaderInterfaceStateMachine + 0x9d00c178 BootloaderResetStateMachine + 0x9d00c1d4 BootloaderActivateBootloader + 0x9d00c214 BootloaderDeactivateBootloader + 0x9d00c244 BootloaderFlashEraseStateMachine + 0x9d00c478 ResetBootloaderFlashEraseStateMachine + 0x9d00c4ac BootloaderFlashWriteStateMachine + 0x9d00c6d8 BootloaderPrintFlashData + 0x9d00c6f8 BootloaderCheckFlashBootloaderData + 0x9d00caac ResetBootloaderFlashWriteStateMachine + 0x9d00caec BootloaderBytesToInt + .text 0x9d00cba4 0x1584 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + 0x9d00cba4 chip_apply_conf + 0x9d00cc58 nm_clkless_wake + 0x9d00ce98 chip_idle + 0x9d00cf0c enable_rf_blocks + 0x9d00cfac enable_interrupts + 0x9d00d0b4 cpu_start + 0x9d00d230 nmi_get_chipid + 0x9d00d448 nmi_get_rfrevid + 0x9d00d4a0 restore_pmu_settings_after_global_reset + 0x9d00d4f4 nmi_update_pll + 0x9d00d568 nmi_set_sys_clk_src_to_xo + 0x9d00d5c4 chip_wake + 0x9d00d618 chip_reset_and_cpu_halt + 0x9d00d7ac chip_reset + 0x9d00d814 wait_for_bootrom + 0x9d00d9a0 wait_for_firmware_start + 0x9d00dac0 chip_deinit + 0x9d00dbdc set_gpio_dir + 0x9d00dcb0 set_gpio_val + 0x9d00dd84 get_gpio_val + 0x9d00de10 pullup_ctrl + 0x9d00dec8 nmi_get_otp_mac_address + 0x9d00e028 nmi_get_mac_address + .text 0x9d00e128 0x1424 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0x9d00e260 hif_chip_wake + 0x9d00e32c hif_set_sleep_mode + 0x9d00e35c hif_get_sleep_mode + 0x9d00e384 hif_chip_sleep + 0x9d00e4a8 hif_init + 0x9d00e514 hif_deinit + 0x9d00e574 hif_check_compatibility + 0x9d00e5ec hif_enable_access + 0x9d00e70c hif_check_code + 0x9d00e7fc hif_send + 0x9d00f114 hif_yield + 0x9d00f13c hif_handle_isr + 0x9d00f208 hif_receive + 0x9d00f464 hif_register_cb + +.text._vfprintf_cdfFnopsuxX + 0x9d00f54c 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d00f54c 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d00f54c _vfprintf_cdfFnopsuxX + 0x9d00f54c _vfprintf_cdfFnopuxX + 0x9d00f54c _vfprintf_cdnopsuxX + 0x9d00f54c _vfprintf_fF + 0x9d00f54c _vfprintf_cdnopuxX + +.text 0x9d010920 0x7ed4 + .text 0x9d010920 0x1170 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + 0x9d011620 spi_flash_read + 0x9d0116f8 spi_flash_write + 0x9d0118c4 spi_flash_erase + 0x9d011a10 spi_flash_get_size + .text 0x9d011a90 0x1108 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + 0x9d01252c nm_spi_write_reg + 0x9d012604 nm_spi_write_block + 0x9d01270c nm_spi_read_reg_with_ret + 0x9d012858 nm_spi_read_block + 0x9d012a14 nm_spi_init + 0x9d012b2c nm_spi_deinit + 0x9d012b54 nm_spi_read_reg + .text 0x9d012b98 0xf40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d012b98 InternalUartInit + 0x9d012d70 OpenInternalPort + 0x9d012f90 SendInternalUartData + 0x9d0132ac SendInternalUartDataBlocking + 0x9d013384 TickInternalUart + 0x9d01345c InternalUart1AInterrupt + 0x9d013698 InternalUart2Interrupt + 0x9d0138b8 ResetUart1 + 0x9d0139c0 ResetUart2 + 0x9d013ab8 process + .text 0x9d013ad8 0xe68 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0x9d013ad8 InitTerminal + 0x9d013b58 TickTerminal + 0x9d013bb4 RxTerminalBuf + 0x9d013c40 RxTerminalData + 0x9d013d90 ParseNewBuffer + 0x9d01488c TerminalPrintString + 0x9d0148e0 TerminalPrintChar + 0x9d014920 TerminalStateMachine + .text 0x9d014940 0xd9c build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0x9d014940 InitSPIFlash + 0x9d014ab4 SPIFlashCheckAndConfigure + 0x9d014b84 SPIFlashWriteEnable + 0x9d014be8 SPIFlashReadStatusReg + 0x9d014c90 SPIFlashCheckBusy + 0x9d014cec SPIFlashCheckChipID + 0x9d014e28 SPIFlashReadBuffer + 0x9d014fa8 SPIFlashEraseSector + 0x9d0150d0 SPIFlashErase64KSector + 0x9d015224 SPIFlashWriteSectorWorkingBuffer + 0x9d0153e0 SPIFlashWriteByte + 0x9d015534 SPIFlashWriteBuffer + .text 0x9d0156dc 0xce8 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + 0x9d0156dc SwapEndianShort + 0x9d015728 SwapEndianInt + 0x9d015784 ConvertIntToStrLeadingZero + 0x9d015ba8 ConvertIntToStr + 0x9d015efc ConvertCharToStrLeadingZero + 0x9d016064 ConvertStrToValue + 0x9d016250 ConvertCharToStr + 0x9d016308 Crc8 + 0x9d0163a0 Delay + .text 0x9d0163c4 0xca4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0x9d0163c4 BootloaderProtocolInit + 0x9d0163f4 BootloaderProtocolStateMachine + 0x9d01693c BootloaderProtocolProtocolAnalyzeNewData + 0x9d0169b8 BootloaderProtocolResetStateMachine + 0x9d016a0c BootloaderProtocolSendFrame + 0x9d016bd8 BootloaderProtocolGetDataBufferPtr + 0x9d016bfc BootloaderProtocolSendHeartbeat + 0x9d016c44 BootloaderProtocolSendACK + 0x9d016c98 BootloaderProtocolSendNACK + 0x9d016ce8 BootloaderProtocolSendInitUploadResponse + 0x9d016e48 BootloaderProtocolSendDataChunkResult + 0x9d016f3c BootloaderProtocolSendBootloaderState + 0x9d016fa0 BootloaderProtocolSendFirmwareUploadResult + 0x9d017004 BootloaderProtocolSendFlashCheckResult + .text 0x9d017068 0xbf4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + 0x9d017374 m2m_ssl_handshake_rsp + 0x9d0173ec m2m_ssl_send_certs_to_winc + 0x9d017734 m2m_ssl_retrieve_cert + 0x9d017a70 m2m_ssl_retrieve_hash + 0x9d017b30 m2m_ssl_stop_processing_certs + 0x9d017b70 m2m_ssl_ecc_process_done + 0x9d017b94 m2m_ssl_set_active_ciphersuites + 0x9d017bfc m2m_ssl_init + .text 0x9d017c5c 0xb98 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0x9d017c5c TimerInit + 0x9d017d2c IsMilliSecTimerExpired + 0x9d017e94 IsSecTimerExpired + 0x9d017ff8 IsTimerExpired + 0x9d0183ac TimerStart + 0x9d0184d4 TimerStartSeconds + 0x9d018578 TimerReset + 0x9d0185fc IsTimerRunning + 0x9d018640 TimerStop + 0x9d018684 Sleep + 0x9d0186e0 Timer1MilliSecInterrupt + +.dinit 0x9d0187f4 0xb60 + .dinit 0x9d0187f4 0xb60 data_init + +.rodata 0x9d019354 0x990 + .rodata 0x9d019354 0x990 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + +.text 0x9d019ce4 0x974 + .text 0x9d019ce4 0x974 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0x9d019ce4 ProtocolInit + 0x9d019d14 StateMachine + 0x9d01a290 ProtocolAnalyzeNewData + 0x9d01a2d0 ResetStateMachine + 0x9d01a318 ProtocolExecCmd + 0x9d01a354 ProtocolAcknowledge + 0x9d01a3b8 ProtocolCalcCrc + 0x9d01a434 ProtocolIsReceiving + 0x9d01a474 ProtocolGetFrame + 0x9d01a630 ProtocolMsgDataPtr + +.text._vfscanf_s + 0x9d01a658 0x868 + .text._vfscanf_s + 0x9d01a658 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01a658 _vfscanf_s + 0x9d01a658 _vfscanf_0 + +.text 0x9d01aec0 0x2a84 + .text 0x9d01aec0 0x740 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + 0x9d01aec0 nm_get_hif_info + 0x9d01af60 nm_get_firmware_full_info + 0x9d01b0f4 nm_get_ota_firmware_info + 0x9d01b288 nm_drv_init_download_mode + 0x9d01b304 nm_drv_init_hold + 0x9d01b3b0 nm_drv_init_start + 0x9d01b4e4 nm_drv_init + 0x9d01b548 nm_drv_deinit + 0x9d01b5c8 nm_cpu_start + .text 0x9d01b600 0x6fc build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + 0x9d01b600 InitBoard + .text 0x9d01bcfc 0x674 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + 0x9d01bcfc ExecuteMasterCommand + 0x9d01c280 SendLoraNetworkCommand + 0x9d01c328 TestTx + .text 0x9d01c370 0x654 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0x9d01c578 ina219SetCalibration_13V_10A + 0x9d01c5dc ina219SetCalibration_32V_2A + 0x9d01c640 ina219SetCalibration_32V_1A + 0x9d01c6a4 ina219SetCalibration_16V_500mA + 0x9d01c708 ina219SetCalibration_16V_200mA + 0x9d01c76c ina219Init + 0x9d01c7ec ina219GetShuntVoltage + 0x9d01c830 ina219GetBusVoltage + 0x9d01c884 ina219GetPower + 0x9d01c8c8 ina219GetPower_mW + 0x9d01c924 ina219GetCurrent + 0x9d01c968 ina219GetCurrent_mA + .text 0x9d01c9c4 0x574 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + 0x9d01c9c4 I2CInit + 0x9d01ca30 I2CWrite + 0x9d01cbf4 I2CTransmitByte + 0x9d01cc20 I2CRead + 0x9d01cf14 I2CWasLastTransactionOK + .text 0x9d01cf38 0x51c build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0x9d01cf38 main + 0x9d01d414 _mon_putc + .text 0x9d01d454 0x4f0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + 0x9d01d58c m2m_ota_init + 0x9d01d600 m2m_ota_notif_set_url + 0x9d01d674 m2m_ota_notif_check_for_update + 0x9d01d6cc m2m_ota_notif_sched + 0x9d01d728 m2m_ota_start_update + 0x9d01d79c m2m_ota_rollback + 0x9d01d844 m2m_ota_abort + 0x9d01d89c m2m_ota_switch_firmware + +.rodata 0x9d01d944 0x494 + .rodata 0x9d01d944 0x494 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.text 0x9d01ddd8 0x1108 + .text 0x9d01ddd8 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d01ddd8 __umoddi3 + .text 0x9d01e234 0x454 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + 0x9d01e234 nm_bus_iface_init + 0x9d01e280 nm_bus_iface_deinit + 0x9d01e2bc nm_bus_iface_reconfigure + 0x9d01e2e8 nm_read_reg + 0x9d01e320 nm_read_reg_with_ret + 0x9d01e360 nm_write_reg + 0x9d01e3f0 nm_read_block + 0x9d01e564 nm_write_block + .text 0x9d01e688 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01e688 __udivdi3 + .text 0x9d01ead4 0x40c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + 0x9d01ead4 m2m_memcpy + 0x9d01eb58 m2m_checksum + 0x9d01ebc8 m2m_memset + 0x9d01ec40 m2m_strlen + 0x9d01ec9c m2m_strncmp + 0x9d01ed70 m2m_strstr + 0x9d01ee48 m2m_memcmp + +.rodata 0x9d01eee0 0x404 + .rodata 0x9d01eee0 0x404 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + 0x9d01eee4 CRC8_TABLE + +.text 0x9d01f2e4 0x103c + .text 0x9d01f2e4 0x390 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0x9d01f2e4 nm_spi_rw + 0x9d01f4a4 nm_bus_init + 0x9d01f590 nm_bus_ioctl + 0x9d01f624 nm_bus_deinit + 0x9d01f64c nm_bus_reinit + .text 0x9d01f674 0x378 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + 0x9d01f674 TC77Configure + 0x9d01f8c4 TC77GetActualTemp + 0x9d01f9c8 TC77GetDeviceID + .text 0x9d01f9ec 0x374 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + 0x9d01fbf0 m2m_periph_init + 0x9d01fc18 m2m_periph_gpio_set_dir + 0x9d01fc70 m2m_periph_gpio_set_val + 0x9d01fcc8 m2m_periph_gpio_get_val + 0x9d01fd18 m2m_periph_pullup_ctrl + .text 0x9d01fd60 0x2f8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + 0x9d01fd60 InitBatteryMonitor + 0x9d01fdd0 BatteryMonitorTick + 0x9d01ff44 GetBatteryVoltage + 0x9d01ffac GetSolarPanelCurrent + 0x9d01ffd0 GetBatterySOC + 0x9d01fff4 SendNetworkBatteryData + 0x9d020034 GetCurrentModuleOK + .text 0x9d020058 0x2c8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d020058 chip_isr + 0x9d020188 nm_bsp_init + 0x9d0201b0 nm_bsp_deinit + 0x9d0201d4 nm_bsp_reset + 0x9d02025c nm_bsp_sleep + 0x9d020294 nm_bsp_register_isr + 0x9d0202c0 nm_bsp_interrupt_ctrl + +.text.scale 0x9d020320 0x2a0 + .text.scale 0x9d020320 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d0205c0 0x278 + .text.fpsubadd + 0x9d0205c0 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d0205c0 __subsf3 + 0x9d0205c0 fpsub + 0x9d0205c8 __addsf3 + 0x9d0205c8 fpadd + +.text.malloc 0x9d020838 0x278 + .text.malloc 0x9d020838 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d020838 malloc + +.text 0x9d020ab0 0x26c + .text 0x9d020ab0 0x26c build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + 0x9d020ab0 crc_32 + 0x9d020ba8 update_crc_32 + +.rodata 0x9d020d1c 0x268 + .rodata 0x9d020d1c 0x268 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + +.text 0x9d020f84 0x4a8 + .text 0x9d020f84 0x260 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + 0x9d020f84 InitChaletPowerRelay + 0x9d020fe0 ChaletPowerRelayTick + 0x9d0210e4 ChaletPowerRelayKickTimer + 0x9d02111c ChaletPowerRelayTurnOn + 0x9d02116c ChaletPowerRelayTurnOff + 0x9d0211bc GetChaletPowerRelayState + .text 0x9d0211e4 0x248 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0x9d0211e4 InitSyslog + 0x9d021238 SyslogTick + 0x9d0212d4 SyslogNewByte + 0x9d021378 SyslogNewString + 0x9d0213f0 SyslogIsBufferEmpty + +.text.fp32div 0x9d02142c 0x230 + .text.fp32div 0x9d02142c 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d02142c fpdiv + 0x9d02142c __divsf3 + +.text.__floatdisf + 0x9d02165c 0x220 + .text.__floatdisf + 0x9d02165c 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d02165c __floatdisf + +.text.fp32mul 0x9d02187c 0x1bc + .text.fp32mul 0x9d02187c 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d02187c __mulsf3 + 0x9d02187c fpmul + +.text 0x9d021a38 0x1a0 + .text 0x9d021a38 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d021a38 strcpy + +.text.realloc 0x9d021bd8 0x194 + .text.realloc 0x9d021bd8 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d021bd8 realloc + +.text._sbrk_init + 0x9d021d6c 0x194 + .text._sbrk_init + 0x9d021d6c 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d021d6c _sbrk_init + +.text._filbuf 0x9d021f00 0x188 + .text._filbuf 0x9d021f00 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d021f00 _filbuf + +.text.read 0x9d022088 0x174 + .text.read 0x9d022088 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d022088 read + +.text 0x9d0221fc 0x2d0 + .text 0x9d0221fc 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d0221fc memcpy + .text 0x9d022364 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d022364 strlen + +.text.fputc 0x9d0224cc 0x15c + .text.fputc 0x9d0224cc 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d0224cc fputc + +.text._flsbuf 0x9d022628 0x12c + .text._flsbuf 0x9d022628 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d022628 _flsbuf + +.text 0x9d022754 0x11c + .text 0x9d022754 0x11c build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + 0x9d022754 InitTempSensor + 0x9d022798 TempSensorCheckAndConfigure + 0x9d0227f4 TempSensorGetTemp + 0x9d022818 TickTempSensor + +.text.fgetc 0x9d022870 0x108 + .text.fgetc 0x9d022870 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d022870 fgetc + +.rodata 0x9d022978 0x204 + .rodata 0x9d022978 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d022978 _ctype + .rodata 0x9d022a7c 0x100 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.text.setvbuf 0x9d022b7c 0xfc + .text.setvbuf 0x9d022b7c 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d022b7c setvbuf + +.rodata 0x9d022c78 0xe0 + .rodata 0x9d022c78 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d022d58 0xdc + .text.general_exception + 0x9d022d58 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d022d58 _general_exception_context + +.text 0x9d022e34 0x1ac + .text 0x9d022e34 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + 0x9d022e34 InitWatchdog + 0x9d022e88 EnableWatchdog + 0x9d022eb4 DisableWatchdog + 0x9d022ee0 KickWatchdog + .text 0x9d022f0c 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d022f0c __floatundisf + +.rodata 0x9d022fe0 0xc8 + .rodata 0x9d022fe0 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.text._sbrk 0x9d0230a8 0xc4 + .text._sbrk 0x9d0230a8 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0230a8 _sbrk + +.text 0x9d02316c 0xa8 + .text 0x9d02316c 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d02316c memset + +.text.atoi 0x9d023214 0xa8 + .text.atoi 0x9d023214 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d023214 atoi + +.text.range 0x9d0232bc 0xa0 + .text.range 0x9d0232bc 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d02335c 0x9c + .text.fpcmp 0x9d02335c 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d02335c __eqsf2 + 0x9d02335c __lesf2 + 0x9d02335c __gtsf2 + 0x9d02335c __nesf2 + 0x9d02335c fpcmp + 0x9d02335c __gesf2 + 0x9d02335c __ltsf2 + +.text.fflush 0x9d0233f8 0x94 + .text.fflush 0x9d0233f8 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d0233f8 fflush + +.text.write 0x9d02348c 0x94 + .text.write 0x9d02348c 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d02348c write + +.text.libm 0x9d023520 0x88 + .text.libm 0x9d023520 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d023520 frexpf + 0x9d023520 fpfrexp + +.text 0x9d0235a8 0x80 + .text 0x9d0235a8 0x80 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + 0x9d0235a8 wifi_init + +.text.fptoul 0x9d023628 0x7c + .text.fptoul 0x9d023628 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d023628 fptoul + 0x9d023628 fptoui + 0x9d023628 __fixunssfsi + +.text.SoftReset + 0x9d0236a4 0x78 + .text.SoftReset + 0x9d0236a4 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d0236a4 SoftReset + +.text.fputs 0x9d02371c 0x78 + .text.fputs 0x9d02371c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d02371c fputs + +.text.strncmp 0x9d023794 0x78 + .text.strncmp 0x9d023794 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d023794 strncmp + +.text.ungetc 0x9d02380c 0x74 + .text.ungetc 0x9d02380c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d02380c ungetc + +.text 0x9d023880 0xd8 + .text 0x9d023880 0x70 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + 0x9d023880 SPITransaction + .text 0x9d0238f0 0x68 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + 0x9d0238f0 InitHarakiriRelay + 0x9d023920 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d023958 0x68 + .text._sprintf_cdfFnopuxX + 0x9d023958 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d023958 _sprintf_cdnopuxX + 0x9d023958 _sprintf_cdfFnopuxX + +.rodata 0x9d0239c0 0x68 + .rodata 0x9d0239c0 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d0239c0 _powers_f + 0x9d0239f4 _npowers_f + +.text.sitofp 0x9d023a28 0x60 + .text.sitofp 0x9d023a28 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d023a28 sitofp + 0x9d023a28 litofp + 0x9d023a28 __floatsisf + +.text.wspace 0x9d023a88 0x60 + .text.wspace 0x9d023a88 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d023ae8 0x58 + .text 0x9d023ae8 0x58 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + 0x9d023ae8 _general_exception_handler + +.text._sscanf_s + 0x9d023b40 0x54 + .text._sscanf_s + 0x9d023b40 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d023b40 _sscanf_s + 0x9d023b40 _sscanf_0 + +.text._bufallo 0x9d023b94 0x54 + .text._bufallo + 0x9d023b94 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023b94 _bufallo + +.text.sbrk 0x9d023be8 0x50 + .text.sbrk 0x9d023be8 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023be8 sbrk + +.text.main_entry + 0x9d023c38 0x4c + .text.main_entry + 0x9d023c38 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d023c64 __crt0_exit + +.text 0x9d023c84 0x4c + .text 0x9d023c84 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d023c84 __floatunsisf + +.text._bootstrap_exception_handler + 0x9d023cd0 0x48 + .text._bootstrap_exception_handler + 0x9d023cd0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d023cd0 _bootstrap_exception_handler + +.text 0x9d023d18 0x44 + .text 0x9d023d18 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d023d18 __pic32_software_reset + +.text.puts 0x9d023d5c 0x44 + .text.puts 0x9d023d5c 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d023d5c puts + +.text._printf_cdfFnopsuxX + 0x9d023da0 0x40 + .text._printf_cdfFnopsuxX + 0x9d023da0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + 0x9d023da0 _printf_cdnopsuxX + 0x9d023da0 _printf_cdnopuxX + 0x9d023da0 _printf_cdfFnopsuxX + 0x9d023da0 _printf_fF + +.vector_default + 0x9d023de0 0x38 + .vector_default + 0x9d023de0 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d023de0 _DefaultInterrupt + +.rodata 0x9d023e18 0x30 + .rodata 0x9d023e18 0x30 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.text.INTConfigureSystem + 0x9d023e48 0x30 + .text.INTConfigureSystem + 0x9d023e48 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d023e48 INTConfigureSystem + +.text.free 0x9d023e78 0x30 + .text.free 0x9d023e78 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d023e78 free + +.rodata 0x9d023ea8 0x2c + .rodata 0x9d023ea8 0x2c build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + +.text._stub_sbd_memlayout + 0x9d023ed4 0x2c + .text._stub_sbd_memlayout + 0x9d023ed4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023ed4 _sbd_memlayout + 0x9d023ed4 _stub_sbd_memlayout + +.rodata 0x9d023f00 0x28 + .rodata 0x9d023f00 0x28 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.text.tolower 0x9d023f28 0x24 + .text.tolower 0x9d023f28 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f28 tolower + +.text.toupper 0x9d023f4c 0x24 + .text.toupper 0x9d023f4c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f4c toupper + +.text 0x9d023f70 0x20 + .text 0x9d023f70 0x20 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + 0x9d023f70 InitDigitalIO + +.rodata 0x9d023f90 0x1c + .rodata 0x9d023f90 0x1c build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d023fac 0x1c + .text.INTRestoreInterrupts + 0x9d023fac 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d023fac INTRestoreInterrupts + +.text.setbuf 0x9d023fc8 0x1c + .text.setbuf 0x9d023fc8 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d023fc8 setbuf + +.rodata 0x9d023fe4 0x18 + .rodata 0x9d023fe4 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d023ffc 0x18 + .text.CheKseg0CacheOff + 0x9d023ffc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023ffc CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d024014 0x18 + .text.CheKseg0CacheOn + 0x9d024014 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d024014 CheKseg0CacheOn + +.text 0x9d02402c 0x18 + .text 0x9d02402c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d02402c _nmi_handler + +.text.isalnum 0x9d024044 0x18 + .text.isalnum 0x9d024044 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024044 isalnum + +.text.isalpha 0x9d02405c 0x18 + .text.isalpha 0x9d02405c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02405c isalpha + +.text.iscntrl 0x9d024074 0x18 + .text.iscntrl 0x9d024074 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024074 iscntrl + +.text.isdigit 0x9d02408c 0x18 + .text.isdigit 0x9d02408c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02408c isdigit + +.text.isgraph 0x9d0240a4 0x18 + .text.isgraph 0x9d0240a4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240a4 isgraph + +.text.islower 0x9d0240bc 0x18 + .text.islower 0x9d0240bc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240bc islower + +.text.isprint 0x9d0240d4 0x18 + .text.isprint 0x9d0240d4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240d4 isprint + +.text.ispunct 0x9d0240ec 0x18 + .text.ispunct 0x9d0240ec 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240ec ispunct + +.text.isspace 0x9d024104 0x18 + .text.isspace 0x9d024104 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024104 isspace + +.text.isupper 0x9d02411c 0x18 + .text.isupper 0x9d02411c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02411c isupper + +.text.isxdigit 0x9d024134 0x18 + .text.isxdigit + 0x9d024134 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024134 isxdigit + +.text._buffree 0x9d02414c 0x14 + .text._buffree + 0x9d02414c 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d02414c _buffree + +.rodata 0x9d024160 0x1c + .rodata 0x9d024160 0xc build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .rodata 0x9d02416c 0x8 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .rodata 0x9d024174 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d02417c 0x8 + .text.INTEnableInterrupts + 0x9d02417c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d02417c INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d024184 0x8 + .text.INTDisableInterrupts + 0x9d024184 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d024184 INTDisableInterrupts + +.text._on_reset + 0x9d02418c 0x8 + .text._on_reset + 0x9d02418c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d02418c _on_reset + +.text._on_bootstrap + 0x9d024194 0x8 + .text._on_bootstrap + 0x9d024194 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d024194 _on_bootstrap + +.text.isascii 0x9d02419c 0x8 + .text.isascii 0x9d02419c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02419c isascii + +.text.toascii 0x9d0241a4 0x8 + .text.toascii 0x9d0241a4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241a4 toascii + +.text._tolower 0x9d0241ac 0x8 + .text._tolower + 0x9d0241ac 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241ac _tolower + +.text._toupper 0x9d0241b4 0x8 + .text._toupper + 0x9d0241b4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241b4 _toupper + +.text.getpagesize + 0x9d0241bc 0x8 + .text.getpagesize + 0x9d0241bc 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0241bc getpagesize + +.rodata 0x9d0241c4 0x10 + .rodata 0x9d0241c4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .rodata 0x9d0241cc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .rodata 0x9d0241d0 0x4 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z427 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.text%z428 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.text%z429 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.text%z430 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.text%z431 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.text%z432 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.text%z433 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.text%z434 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.text%z435 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.elf b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.elf new file mode 100644 index 0000000..ad47c00 Binary files /dev/null and b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.elf differ diff --git a/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.hex b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.hex new file mode 100644 index 0000000..be4de79 --- /dev/null +++ b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.hex @@ -0,0 +1,8057 @@ +:020000040000fa +:020000041fc01b +:042ff400d9fff8ff0a +:020000040000fa +:020000041fc01b +:042ff800dbcc6cffc3 +:020000040000fa +:020000041fc01b +:042ffc00ffffff7f55 +:020000040000fa +:020000041fc01b +:080000000014400f0000000095 +:020000040000fa +:020000041fc01b +:10038000029d1a3c3c305a27080040030000000040 +:020000040000fa +:020000041d00dd +:10418000029d1a3c9c245a270800400300000000ae +:020000040000fa +:020000041d00dd +:08420000538c400b000000008c +:020000040000fa +:020000041d00dd +:08422000538c400b000000006c +:020000040000fa +:020000041d00dd +:08424000538c400b000000004c +:020000040000fa +:020000041d00dd +:08426000f382400b0000000096 +:020000040000fa +:020000041d00dd +:08428000ad67400b00000000d7 +:020000040000fa +:020000041d00dd +:0842a000538c400b00000000ec +:020000040000fa +:020000041d00dd +:0842c000538c400b00000000cc +:020000040000fa +:020000041d00dd +:0842e000ec78400b0000000027 +:020000040000fa +:020000041d00dd +:08430000538c400b000000008b +:020000040000fa +:020000041d00dd +:08432000538c400b000000006b +:020000040000fa +:020000041d00dd +:08434000538c400b000000004b +:020000040000fa +:020000041d00dd +:08436000538c400b000000002b +:020000040000fa +:020000041d00dd +:08438000538c400b000000000b +:020000040000fa +:020000041d00dd +:0843a000538c400b00000000eb +:020000040000fa +:020000041d00dd +:0843c000538c400b00000000cb +:020000040000fa +:020000041d00dd +:0843e0003c79400b00000000d5 +:020000040000fa +:020000041d00dd +:08440000538c400b000000008a +:020000040000fa +:020000041d00dd +:08442000538c400b000000006a +:020000040000fa +:020000041d00dd +:08444000538c400b000000004a +:020000040000fa +:020000041d00dd +:08446000538c400b000000002a +:020000040000fa +:020000041d00dd +:08448000538c400b000000000a +:020000040000fa +:020000041d00dd +:0844a000538c400b00000000ea +:020000040000fa +:020000041d00dd +:0844c000538c400b00000000ca +:020000040000fa +:020000041d00dd +:0844e000538c400b00000000aa +:020000040000fa +:020000041d00dd +:08450000538c400b0000000089 +:020000040000fa +:020000041d00dd +:08452000538c400b0000000069 +:020000040000fa +:020000041d00dd +:08454000538c400b0000000049 +:020000040000fa +:020000041d00dd +:08456000538c400b0000000029 +:020000040000fa +:020000041d00dd +:08458000538c400b0000000009 +:020000040000fa +:020000041d00dd +:0845a000538c400b00000000e9 +:020000040000fa +:020000041d00dd +:0845c000538c400b00000000c9 +:020000040000fa +:020000041d00dd +:0845e000538c400b00000000a9 +:020000040000fa +:020000041d00dd +:08460000538c400b0000000088 +:020000040000fa +:020000041d00dd +:08462000538c400b0000000068 +:020000040000fa +:020000041d00dd +:08464000538c400b0000000048 +:020000040000fa +:020000041d00dd +:08466000538c400b0000000028 +:020000040000fa +:020000041d00dd +:08468000538c400b0000000008 +:020000040000fa +:020000041d00dd +:0846a000538c400b00000000e8 +:020000040000fa +:020000041d00dd +:0846c000538c400b00000000c8 +:020000040000fa +:020000041d00dd +:0846e000538c400b00000000a8 +:020000040000fa +:020000041d00dd +:08470000538c400b0000000087 +:020000040000fa +:020000041d00dd +:08472000538c400b0000000067 +:020000040000fa +:020000041d00dd +:08474000538c400b0000000047 +:020000040000fa +:020000041d00dd +:08476000538c400b0000000027 +:020000040000fa +:020000041d00dd +:08478000538c400b0000000007 +:020000040000fa +:020000041d00dd +:0847a000538c400b00000000e7 +:020000040000fa +:020000041d00dd +:0847c000538c400b00000000c7 +:020000040000fa +:020000041d00dd +:0847e000538c400b00000000a7 +:020000040000fa +:020000041d00dd +:08480000538c400b0000000086 +:020000040000fa +:020000041d00dd +:08482000538c400b0000000066 +:020000040000fa +:020000041d00dd +:08484000538c400b0000000046 +:020000040000fa +:020000041d00dd +:08486000538c400b0000000026 +:020000040000fa +:020000041d00dd +:08488000538c400b0000000006 +:020000040000fa +:020000041d00dd +:0848a000538c400b00000000e6 +:020000040000fa +:020000041d00dd +:0848c000538c400b00000000c6 +:020000040000fa +:020000041d00dd +:0848e000538c400b00000000a6 +:020000040000fa +:020000041d00dd +:08490000538c400b0000000085 +:020000040000fa +:020000041d00dd +:08492000538c400b0000000065 +:020000040000fa +:020000041d00dd +:08494000538c400b0000000045 +:020000040000fa +:020000041d00dd +:08496000538c400b0000000025 +:020000040000fa +:020000041d00dd +:08498000538c400b0000000005 +:020000040000fa +:020000041d00dd +:0849a000538c400b00000000e5 +:020000040000fa +:020000041d00dd +:0849c000538c400b00000000c5 +:020000040000fa +:020000041d00dd +:0849e000538c400b00000000a5 +:020000040000fa +:020000041d00dd +:1050000000601a40c0045a7f0500401300000000f1 +:10501000029d1a3ccc325a270800400300000000d1 +:1050200001a01d3cf8ffbd2701a01c3c20809c274f +:105030000260094020582001801e2a7d8449497d54 +:1050400002608940c000000000e0dc4102608b404b +:10505000c0000000029d083c0434082509f8000146 +:105060000000000000a0083c9400082500a0093cb6 +:10507000382e29250600001000000000000000adb9 +:10508000040000ad080000ad0c0000ad10000825c4 +:105090002b080901f9ff201400000000019d083cc5 +:1050a000e86008250000098d18002011040008257b +:1050b00000000a8d0400082500000b8d0900601116 +:1050c0000400082500000c91ffff4a250100082577 +:1050d00000002ca1fbff4015010029250500001050 +:1050e00000000000000020a1ffff4a25fdff401541 +:1050f0000100292503000825fcff0a24244048015b +:105100000000098de7ff2015000000000000093ca9 +:105110000000292510002011000000000100093cba +:105120000000292588bf0a3c10204a25000049ad0f +:105130000100093c0000292588bf0a3c20204a259f +:10514000000049ad0100093c0000292588bf0a3c48 +:1051500030204a25000049ad00488040ffff0a2466 +:1051600000588a40009d093c00402925017889406b +:105170000000093c0100292500000a2444492a7d39 +:1051800001608a408000093c006889400080084036 +:105190008005097d404c0900006008405800013c32 +:1051a000244001012540280100608840029d083c00 +:1051b0000c34082509f800010000000000600840d8 +:1051c000bfff013cffff2134244001010060884003 +:1051d000000084300000a530029d083ca82f08255f +:0851e0000800000100000000be +:020000040000fa +:020000041fc01b +:1004800000f89b40c0000000029d1b3c84307b278d +:10049000020060130000000000c09b4000f81b40f9 +:0c04a000c00000001f000042000000002f +:020000040000fa +:020000041d00dd +:1058000028ffbd27d400bfafd000beaf21f0a0035a +:10581000211880002110a000e000c6afd800c3a36b +:10582000dc00c2a7d800c3932c0002241500621428 +:10583000000000001c00c227e000c48f21284000a7 +:105840000400062421380000284c400f000000000e +:10585000e7014014000000008880828fe4014010be +:10586000000000008880828f1c00c3272c000424c5 +:105870002128600009f8400000000000fc17400be0 +:1058800000000000d800c3931d000224150062141c +:10589000000000002000c227e000c48f2128400043 +:1058a0000800062421380000284c400f00000000aa +:1058b000cf014014000000008880828fcc0140108e +:1058c000000000008880828f2000c3271d00042470 +:1058d0002128600009f8400000000000fc17400b80 +:1058e00000000000d800c3930800022415006214d1 +:1058f000000000006400c227e000c48f212840009f +:105900003000062401000724284c400f000000004e +:10591000b7014014000000008880828fb40140105d +:10592000000000008880828f6400c32708000424e0 +:105930002128600009f8400000000000fc17400b1f +:1059400000000000d800c39310000224a8016210d8 +:1059500000000000d800c393320002241500621436 +:10596000000000002800c227e000c48f212840006a +:105970001400062421380000284c400f00000000cd +:105980009b014014000000008880828f9801401025 +:10599000000000008880828f2800c3273200042482 +:1059a0002128600009f8400000000000fc17400baf +:1059b00000000000d800c3932f0002241b006214d3 +:1059c000000000006400c2272120400021280000c0 +:1059d00068000624fa89400f000000006400c22716 +:1059e000e000c48f21284000680006242138000010 +:1059f000284c400f000000007d0140140000000012 +:105a00008880828f7a014010000000008880828f99 +:105a10006400c3272f0004242128600009f84000f7 +:105a200000000000fc17400b00000000d800c393ea +:105a30003400022414006214000000003c00c2275d +:105a4000e000c48f21284000040006242138000013 +:105a5000284c400f000000006501401400000000c9 +:105a60008880828f62014010000000008880828f51 +:105a7000340004242128000009f840000000000040 +:105a8000fc17400b00000000d800c3931300022451 +:105a900017006214000000004000c227e000c48f1d +:105aa000212840000400062421380000284c400f23 +:105ab000000000004e014014000000004000c293ae +:105ac000848082a38880828f4901401000000000fa +:105ad0008880828f4000c32713000424212860009f +:105ae00009f8400000000000fc17400b0000000017 +:105af000d800c393150002241500621400000000b2 +:105b00006400c227e000c48f212840002c00062436 +:105b100021380000284c400f0000000034014014e0 +:105b2000000000008880828f3101401000000000da +:105b30008880828f6400c327150004242128600018 +:105b400009f8400000000000fc17400b00000000b6 +:105b5000d800c39304000224150062140000000062 +:105b60001400c227e000c48f21284000040006244e +:105b700021380000284c400f000000001c01401498 +:105b8000000000008880828f190140100000000092 +:105b90008880828f1400c327040004242128600019 +:105ba00009f8400000000000fc17400b0000000056 +:105bb000d800c393650002241500621400000000a1 +:105bc0001400c227e000c48f2128400004000624ee +:105bd00021380000284c400f000000000401401450 +:105be000000000008880828f01014010000000004a +:105bf0008880828f1400c327650004242128600058 +:105c000009f8400000000000fc17400b00000000f5 +:105c1000d800c3930b00022415006214000000009a +:105c20006400c227e000c48f2128400064000624dd +:105c300001000724284c400f00000000ec00401435 +:105c4000000000008880828fe90040100000000002 +:105c50008880828f6400c3270b0004242128600001 +:105c600009f8400000000000fc17400b0000000095 +:105c7000d800c3932a00022415006214000000001b +:105c80004400c227e000c48f2128400004000624fd +:105c900001000724284c400f00000000d4004014ed +:105ca000000000008880828fd100401000000000ba +:105cb0008880828f4400c3272a00042421286000a2 +:105cc00009f8400000000000fc17400b0000000035 +:105cd000d800c3936900022415006214000000007c +:105ce0004800c227e000c48f212840000400062499 +:105cf00021380000284c400f00000000bc00401478 +:105d0000000000008880828fb90040100000000071 +:105d10008880828f4800c3276900042421286000fe +:105d200009f8400000000000fc17400b00000000d4 +:105d3000d800c3932200022429006214000000004e +:105d40001400c227e000c48f21284000020006246e +:105d500021380000284c400f00000000a40040142f +:105d6000000000001500c29300120200ffff433044 +:105d70001400c293211062001200c2a71200c29741 +:105d80004c00c2a7e000c28f020044244c00c2971e +:105d90004c00c3270200632421286000213040000a +:105da00001000724284c400f000000009000401420 +:105db000000000008880828f8d00401000000000ed +:105dc0008880828f4c00c327220004242128600091 +:105dd00009f8400000000000fc17400b0000000024 +:105de000d800c3933c00022420006214000000008d +:105df0005000c227e000c48f21284000080006247c +:105e000021380000284c400f0000000078004014aa +:105e100000000000e000c28f080044245000c38f3f +:105e20005400c2972128600021304000010007245f +:105e3000284c400f000000006d00401400000000de +:105e40008880828f6a004010000000008880828f66 +:105e50005000c3273c0004242128600009f84000ba +:105e600000000000fc17400b00000000d800c393a6 +:105e70002400022415006214000000005800c2270c +:105e8000e000c48f212840000400062421380000cf +:105e9000284c400f00000000550040140000000096 +:105ea0008880828f52004010000000008880828f1e +:105eb0005800c327240004242128600009f840006a +:105ec00000000000fc17400b00000000d800c39346 +:105ed0001f00022446006214000000005c00c2277c +:105ee000e000c48f2128400004000624213800006f +:105ef000284c400f000000003d004014000000004e +:105f00005e00c2971000c2a75c00c2976200c2a7e1 +:105f10008c80828f36004010000000009080828fbd +:105f20003300401000000000948082973000401041 +:105f300000000000f617400b000000006200c3974d +:105f4000948082972b104300050040100000000051 +:105f5000948082976000c2a7da17400b000000000f +:105f60006200c2976000c2a71000c397e000c28f12 +:105f7000212062009080838f6000c29721286000fa +:105f80002130400021380000284c400f0000000064 +:105f900016004014000000006200c3976000c29722 +:105fa00023106200ffff42306200c2a76000c39767 +:105fb0001000c297211062001000c2a78c80828f4f +:105fc0009080858f6000c3271f000424213060006b +:105fd00009f84000000000006200c297d7ff40149b +:105fe00000000000fc17400b000000000000000053 +:105ff00021e8c003d400bf8fd000be8fd800bd27da +:106000000800e00300000000e0ffbd271c00bfaf58 +:106010001800beaf21f0a0031000c0a35575400fbb +:10602000000000001000c2a31000c283050040144d +:10603000000000009e3d400f000000001218400bc1 +:1060400000000000000000001000c28321e8c0032f +:106050001c00bf8f1800be8f2000bd270800e00382 +:1060600000000000e0ffbd271c00bfaf1800beaf5e +:1060700021f0a0032000c4af1000c0a32000c28ff5 +:106080000500401400000000f4ff02241000c2a329 +:106090009118400b000000002000c28f00004280d9 +:1060a00008004010000000002000c28f21204000a6 +:1060b0006887400f000000002100422c05004014ba +:1060c00000000000f4ff02241000c2a39118400b4e +:1060d000000000002000c28f210042900f00422cdf +:1060e00005004010000000002000c28f21004290f7 +:1060f0000500401400000000f4ff02241000c2a3b9 +:106100009118400b000000002000c28f4100429017 +:106110000d004014000000002000c28f4200429099 +:1061200009004014000000002000c28f430042908c +:106130000500401400000000f4ff02241000c2a378 +:106140009118400b000000002000c28f3f004390d8 +:10615000010002243a006210000000002000c28ffb +:106160003f0043900300022431006214000000004d +:106170002000c28f22004290060040100000000064 +:106180002000c28f220042900500422c05004014de +:1061900000000000f4ff02241000c2a39118400b7d +:1061a000000000002000c28f230043900a00022458 +:1061b0000a006210000000002000c28f23004390fc +:1061c0001a0002240500621000000000f4ff0224ff +:1061d0001000c2a39118400b000000002000c28fe5 +:1061e000240042240e004010000000002000c28f56 +:1061f00024004224000042800900401000000000fa +:106200002000c28f24004224212040006887400fd4 +:10621000000000001b00422c0a0040140000000097 +:10622000f4ff02241000c2a39118400b00000000ec +:10623000f4ff02241000c2a39118400b00000000dc +:10624000000000001000c28321e8c0031c00bf8fc3 +:106250001800be8f2000bd270800e00300000000ea +:10626000f0ffbd270c00beaf21f0a0031000c4afab +:106270000000c0a31000c28f050040140000000001 +:10628000f4ff02240000c2a3c718400b0000000066 +:106290001000c28f00004290030040140000000074 +:1062a000f4ff02240000c2a31000c28f010042903c +:1062b0000a00422c06004014000000001000c28fab +:1062c00001004290fb00422c03004014000000003b +:1062d000f4ff02240000c2a31000c28f020042900b +:1062e00006004010000000001000c28f0200429023 +:1062f0000300422c0300401400000000f4ff0224bd +:106300000000c2a31000c28f0300428003004004bb +:1063100000000000f4ff02240000c2a30000c283ba +:1063200021e8c0030c00be8f1000bd270800e00369 +:1063300000000000d0ffbd272c00bfaf2800beaf7b +:1063400021f0a003211080003000c2a3f4ff02243a +:106350002000c2a32400c0af3000c2932400c2a317 +:106360002400c2271000a0af1400a0af1800a0aff7 +:1063700001000424230005242130400004000724e8 +:106380009b49400f000000002000c2a32000c283f0 +:1063900021e8c0032c00bf8f2800be8f3000bd272e +:1063a0000800e00300000000e0ffbd271c00bfafb5 +:1063b0001800beaf21f0a003f4ff02241000c2a316 +:1063c0007675400f000000001000c2a31000c283c9 +:1063d00021e8c0031c00bf8f1800be8f2000bd271e +:1063e0000800e00300000000c0ffbd273c00bfaf75 +:1063f0003800beaf21f0a0034000c4af1000c0a31e +:10640000010002243000c2a34000c28f05004014e6 +:1064100000000000f4ff02241000c2a35819400b32 +:10642000000000004000c28f0000428c888082afd4 +:106430004000c28f0800428c8c8082af4000c28f27 +:106440000c00428c908082af4000c28f10004294ba +:10645000948082a74000c28f120042903000c2a3f5 +:106460004000c28f12004290030040100000000064 +:10647000030002243000c2a321200000c448400fc2 +:10648000000000001000c2a31000c28327004014c7 +:106490000000000001000424009d023c0058452437 +:1064a000934c400f000000003000c2272120400024 +:1064b0009575400f000000001000c2a31000c283b9 +:1064c00020004014000000001400c22721204000da +:1064d000fc23400f000000001000c2a31400c227dc +:1064e000212040003024400f000000001000c28333 +:1064f00017004014000000001049400f0000000089 +:106500001000c2a31000c283140040140000000059 +:106510004000c28f1400429021204000cd18400f4f +:10652000000000005819400b0000000000000000af +:10653000212000000076400f000000005819400b99 +:1065400000000000000000005819400b000000008f +:10655000000000005819400b00000000000000007f +:106560001000c28321e8c0033c00bf8f3800be8ffb +:106570004000bd270800e00300000000e0ffbd2749 +:106580001c00bfaf1800beaf21f0a0032000c4afb5 +:106590001000c0a3ea18400f000000001000c2a3c2 +:1065a0001000c28305004014000000002000c48fca +:1065b000fa18400f000000001000c2a31000c283b0 +:1065c00021e8c0031c00bf8f1800be8f2000bd272c +:1065d0000800e00300000000e8ffbd271400bfaf83 +:1065e0001000beaf21f0a0031800c4af21200000ae +:1065f000dc48400f00000000212000000076400f22 +:10660000000000002110000021e8c0031400bf8f2b +:106610001000be8f1800bd270800e0030000000036 +:10662000e8ffbd271400bfaf1000beaf21f0a003ec +:10663000212000007619400f00000000ea18400fea +:106640000000000021e8c0031400bf8f1000be8fbf +:106650001800bd270800e00300000000e8ffbd2788 +:106660001400bfaf1000beaf21f0a0031800c4afec +:106670001800c48ffa18400f0000000021e8c00382 +:106680001400bf8f1000be8f1800bd270800e00364 +:1066900000000000e0ffbd271c00bfaf1800beaf28 +:1066a00021f0a0032000c4aff4ff02241000c2a315 +:1066b0008819400f000000001000c2a31000c28320 +:1066c00005004014000000002000c48f9719400fff +:1066d000000000001000c2a31000c28321e8c00324 +:1066e0001c00bf8f1800be8f2000bd270800e003ec +:1066f00000000000e8ffbd271400bfaf1000beafd0 +:1067000021f0a0032f76400f0000000001000324b9 +:106710000c004310000000000100432c0600601430 +:1067200000000000020003240900431000000000e4 +:10673000d719400b0000000021100000d819400bb1 +:106740000000000001000224d819400b00000000e6 +:1067500002000224d819400b0000000021100000a4 +:1067600021e8c0031400bf8f1000be8f1800bd27a2 +:106770000800e00300000000e8ffbd271400bfafe1 +:106780001000beaf21f0a003bd19400f00000000b3 +:1067900021184000020002240500621400000000dd +:1067a000194c400f00000000ed19400b00000000e4 +:1067b0002110000021e8c0031400bf8f1000be8f1d +:1067c0001800bd270800e00300000000b0ffbd274f +:1067d0004c00bfaf4800beaf21f0a0035000c4afd3 +:1067e0002110a0005400c2a32000c2272120400095 +:1067f0002128000024000624fa89400f0000000030 +:10680000ffff02242000c2a31000a0af1400a0af1d +:106810001800a0af01000424690005242000c2274d +:1068200021304000240007249b49400f0000000055 +:1068300021e8c0034c00bf8f4800be8f5000bd2729 +:106840000800e00300000000d8ffbd272400bfaf10 +:106850002000beaf21f0a0031000a0af1400a0af35 +:106860001800a0af010004242900052421300000f5 +:10687000213800009b49400f0000000021e8c003c0 +:106880002400bf8f2000be8f2800bd270800e00332 +:1068900000000000d8ffbd272400bfaf2000beaf1e +:1068a00021f0a0032800c4af2c00c5af2110c00008 +:1068b0003400c7af3000c2a7f4ff02241000c2a307 +:1068c0003000c2972c0042241200c2a73400c28fad +:1068d0007a004010000000003400c28f0400428c97 +:1068e00076004010000000003400c28f0800429083 +:1068f0002100422c71004010000000003800c28fbf +:106900006a004010000000003800c28f1400c2afbf +:106910003800c28f040042241800c2af3800c48f70 +:106920002128000030000624fa89400f00000000f2 +:106930001400c28f1200c397000043a42800c28f26 +:10694000010003240d004310000000000100432c4f +:1069500010006014000000000200032456004314dd +:10696000000000001400c28f020042900200423476 +:10697000ff0043301400c28f020043a01400c28ff6 +:106980000200429001004234ff0043301400c28fe5 +:10699000020043a03400c28f0c00438cff0002248d +:1069a00008006214000000003400c28f0c00428c0a +:1069b000ff0043301400c28f030043a0811a400b34 +:1069c000000000003400c28f0c00428c0f00422ceb +:1069d0003a004010000000003400c28f0c00428cce +:1069e00036004010000000003400c28f0c00428cc2 +:1069f000ff004230ffff4224ff0043301400c28feb +:106a0000030043a02c00c28f2c00401000000000a7 +:106a10002c00c28f0500422c28004010000000000e +:106a20002c00c28fff0043301800c28f280043a003 +:106a30003400c28f080043901800c28f000043a0aa +:106a40001800c28f010044243400c28f0400438c1c +:106a50003400c28f0800429021286000213040009d +:106a60000e87400f000000003400c28f0000428cef +:106a70000d004010000000001800c28f0100032428 +:106a8000210043a01800c28f220043243400c28f8b +:106a90000000428c212060002128400006000624ce +:106aa0000e87400f000000001000c0a31000c2833a +:106ab000b01a400b0000000000000000f1ff0224ab +:106ac00021e8c0032400bf8f2000be8f2800bd270f +:106ad0000800e00300000000e0ffbd271c00bfaf7e +:106ae0001800beaf21f0a0032000c4af2400c5af42 +:106af000f4ff02241000c2a32000c28f02004290c3 +:106b0000020042302b004014000000002000c28f21 +:106b10002500429001004230260040140000000091 +:106b20002400c48f2128000068000624fa89400f41 +:106b3000000000002400c28f460044242000c28fc1 +:106b4000050043242000c28f0400429021286000e9 +:106b5000213040000e87400f000000002000c28f4f +:106b6000040042902400c38f21106200460040a020 +:106b70002000c28f03004290211840002400c28fe1 +:106b8000440043a42000c28f020042900100423022 +:106b90000100422cff0043302400c28f670043a055 +:106ba0002000c28f2c0043902400c28f410043a0dc +:106bb0001000c0a31000c28321e8c0031c00bf8fd7 +:106bc0001800be8f2000bd270800e0030000000071 +:106bd00038ffbd27c400bfafc000beaf21f0a00387 +:106be000c800c4afcc00c5aff1ff02242000c2a38f +:106bf0002400c2271000a2afc800c48f01000524e2 +:106c000021300000cc00c78f251a400f0000000083 +:106c10002000c2a32000c283240040140000000012 +:106c20002400c2271000a0af1400a0af1800a0af2e +:106c3000010004243d0005242130400030000724d9 +:106c40009b49400f000000002000c2a32000c28327 +:106c500016004010000000002400c3275400c22783 +:106c60002120600021284000b61a400f00000000db +:106c70002000c2a32000c2830c00401400000000ca +:106c80005400c2271000a0af1400a0af1800a0af9e +:106c90000100042428000524213040006800072456 +:106ca0009b49400f000000002000c2a32000c283c7 +:106cb00021e8c003c400bf8fc000be8fc800bd273d +:106cc0000800e0030000000028ffbd27d400bfaf8c +:106cd000d000beaf21f0a003d800c4afdc00c5af28 +:106ce000e000c6aff1ff02242000c2a3e000c28f83 +:106cf0007300401000000000e000c28f0000428cd2 +:106d00006f00401000000000e000c28f05004290bc +:106d10006b00401000000000e000c28f05004290b0 +:106d20000500422c6600401000000000e000c28f09 +:106d3000040043901a0002240600621000000000c4 +:106d4000e000c28f040043900a0002245c00621439 +:106d5000000000003800c2271000a2afd800c48f86 +:106d60000300052410000624dc00c78f251a400ffd +:106d7000000000002000c2a32000c2835000401485 +:106d800000000000e000c28f05004290ffff422497 +:106d9000ff0042302800c2a3e000c28f04004290ee +:106da00042100200ff0042302900c2a3e000c28f5f +:106db0000000438c2900c2932800c42702008424c9 +:106dc00021286000213040006583400f0000000052 +:106dd0003800c2272800c3271000a3af10000324e7 +:106de0001400a3af300003241800a3af0100042453 +:106df000bd00052421304000300007249b49400f8e +:106e0000000000002000c2a32000c2832c0040101c +:106e1000000000003800c3276800c227212060005e +:106e200021284000b61a400f000000002000c2a335 +:106e30002000c28322004014000000006800c22726 +:106e40002400c2afe000c28f05004290ffff422441 +:106e5000ff0043302400c28f000043a0e000c28f37 +:106e6000040043902400c28f010043a02400c28f7d +:106e700002004424e000c28f0000438ce000c28f77 +:106e80000400429021286000213040000e87400f0e +:106e9000000000006800c2271000a0af1400a0afdf +:106ea0001800a0af01000424280005242130400070 +:106eb000680007249b49400f000000002000c2a387 +:106ec0002000c28321e8c003d400bf8fd000be8f52 +:106ed000d800bd270800e00300000000c8febd2761 +:106ee0003401bfaf3001beaf21f0a0033801c4af01 +:106ef0003c01c5af4001c6aff1ff02242000c2a390 +:106f00004001c28f8c004010000000002800c22702 +:106f10001000a2af3801c48f020005246c000624c3 +:106f20003c01c78f251a400f000000002000c2a3bb +:106f30002000c2838000401400000000c000c2276f +:106f400021204000212800006c000624fa89400f0f +:106f5000000000004001c28f0000428c250040105c +:106f6000000000004001c28f0400428c0500401068 +:106f700000000000f1ff02242000c2a31a1c400bf5 +:106f80000000000040000224c000c2a34001c28fe4 +:106f90000000438cc000c29342100200ff00423048 +:106fa000c000c42701008424212860002130400053 +:106fb0006583400f00000000030040100000000047 +:106fc000f1ff02242000c2a34001c28f0000438cc5 +:106fd000c000c293c000c42701008424212860009f +:106fe000213040000e87400f000000001a1c400bab +:106ff000000000004001c28f0400428c18004010c5 +:10700000000000004001c28f080042904100422c65 +:107010000500401400000000f1ff02242000c2a37c +:107020001a1c400b000000004001c28f0800429073 +:10703000c000c2a34001c28f0400438cc000c293b1 +:10704000c000c427010084242128600021304000b2 +:107050000e87400f000000001a1c400b00000000cb +:10706000f1ff02242000c2a32000c2830f004014bd +:10707000000000002800c227c000c3271000a3aff3 +:107080006c0003241400a3af300003241800a3af46 +:1070900001000424bd0005242130400030000724f5 +:1070a0009b49400f000000002000c2a32000c283c3 +:1070b00021004010000000002800c3275800c2270c +:1070c0002120600021284000b61a400f0000000077 +:1070d0002000c2a32000c28317004014000000005b +:1070e0005800c2272400c2af4001c28f0400438c65 +:1070f0004001c28f080042902400c48f2128600004 +:10710000213040000e87400f000000005800c227c9 +:107110001000a0af1400a0af1800a0af010004241d +:107120002800052421304000680007249b49400fb7 +:10713000000000002000c2a32000c28321e8c00399 +:107140003401bf8f3001be8f3801bd270800e00336 +:1071500000000000e8ffbd271400bfaf1000beaf65 +:1071600021f0a0031800c4af1c00c5af2000c6afbb +:107170001c00c28f07004014000000002000c28fd6 +:107180000400401000000000f1ff0224061d400b27 +:10719000000000001800c28f010003242a004310e1 +:1071a000000000000100432c0900601400000000f2 +:1071b00002000324580043100000000003000324d1 +:1071c0007300431000000000021d400b000000008f +:1071d0002000c38f0400022404006210000000009d +:1071e000f1ff0224061d400b000000001c00c28fae +:1071f0000000428c0a00401000000000010003243f +:107200000c004314000000001480838ffdff022453 +:1072100024106200148082af901c400b000000001c +:107220001480828f02004234148082af901c400b85 +:1072300000000000f1ff0224061d400b00000000ca +:10724000051d400b000000002000c38f0400022435 +:107250000400621000000000f1ff0224061d400b34 +:10726000000000001c00c28f0000428c01000324bb +:1072700013004310000000000100432c06006014be +:10728000000000000200032415004310000000006d +:10729000c11c400b000000001480838ffbff022400 +:1072a00024106200148082af1480838ff7ff0224c1 +:1072b00024106200148082afc41c400b0000000048 +:1072c0001480828f04004234148082af1480828f35 +:1072d00008004234148082afc41c400b0000000040 +:1072e0001480828f04004234148082af1480838f14 +:1072f000f7ff022424106200148082afc41c400bec +:1073000000000000f1ff0224061d400b00000000f9 +:10731000051d400b000000002000c38f0400022464 +:107320000400621000000000f1ff0224061d400b63 +:10733000000000001c00c28f0000428c09004010b9 +:1073400000000000010003240c00431400000000b2 +:107350001480828f10004234148082afe21c400bf4 +:10736000000000001480838fefff022424106200cd +:10737000148082afe21c400b00000000f1ff0224e9 +:10738000061d400b00000000051d400b0000000022 +:107390002000c28f0f0040100000000014000324e2 +:1073a00016004314000000001480828f4000423415 +:1073b000148082af00a0023ca84044241c00c58f6a +:1073c000140006240e87400f00000000051d400b2e +:1073d000000000001480838fbfff0224241062008d +:1073e000148082af00a0023ca84044242128000061 +:1073f00014000624fa89400f00000000f1ff022467 +:10740000061d400b00000000f1ff0224061d400b8a +:10741000000000002110000021e8c0031400bf8f0d +:107420001000be8f1800bd270800e0030000000018 +:10743000e8ffbd271400bfaf1000beaf21f0a003ce +:107440001800c4af1c00c5af2000c6af1c00c28f1f +:107450000400401400000000f1ff02248c1d400bca +:10746000000000001800c28f010003241e0043101a +:10747000000000000100432c09006014000000001f +:10748000020003243900431000000000030003241d +:107490004800431000000000881d400b0000000061 +:1074a0002000c28f0000428c0400422c04004010d7 +:1074b00000000000f1ff02248c1d400b00000000c2 +:1074c0002000c28f04000324000043ac1c00c28fc4 +:1074d0001480838f020063300100632c000043acf2 +:1074e0008b1d400b000000002000c28f0000428c6a +:1074f0000400422c0400401000000000f1ff0224b0 +:107500008c1d400b000000002000c28f04000324eb +:10751000000043ac1480828f040042300500401408 +:10752000000000001c00c28f000040ac8b1d400b0f +:10753000000000001480828f0800423006004010d6 +:10754000000000001c00c28f01000324000043acb7 +:107550008b1d400b000000001c00c28f02000324a2 +:10756000000043ac8b1d400b000000002000c28fc8 +:107570000000428c0400422c040040100000000077 +:10758000f1ff02248c1d400b000000002000c28f80 +:1075900004000324000043ac1c00c28f1480838fbe +:1075a000100063302b180300000043ac8b1d400b10 +:1075b000000000001480828f400042301400401010 +:1075c000000000002000c28f0000428c1400422cfa +:1075d0000400401000000000f1ff02248c1d400b4d +:1075e000000000002000c28f14000324000043ac00 +:1075f0001c00c48f00a0023ca840452414000624af +:107600000e87400f000000008b1d400b00000000a3 +:107610002000c28f000040ac8b1d400b000000001a +:10762000f1ff02248c1d400b00000000211000001f +:1076300021e8c0031400bf8f1000be8f1800bd27c3 +:107640000800e0030000000070ffbd278c00bfaf02 +:107650008800beaf21f0a0039000c4af9400c5af76 +:107660009800c6aff1ff02242000c2a39800c28f89 +:10767000a7004010000000009800c28f0000428c5c +:1076800003004014000000009800c28f0c0040a4ca +:107690009800c28f0400428c9d0040100000000042 +:1076a0009800c28f0800428c990040100000000032 +:1076b0009800c28f0c004294211840009800c28f9d +:1076c0000e004294211062006500422c9000401090 +:1076d000000000009800c28f100042940101422c6b +:1076e0008b004010000000009800c28f0c004394f3 +:1076f0009800c28f0e00429421106200ffff4330b9 +:107700009800c28f1000429421106200ffff4230a7 +:107710002c0042242800c2a72800c2975800c32783 +:107720001000a3af9000c48f040005242130400056 +:107730009400c78f251a400f000000002000c2a34c +:107740002000c28372004014000000002c00c227f9 +:107750002c0042242400c2af2800c2972c00c3276b +:10776000212060002128000021304000fa89400fcc +:1077700000000000010002242c00c2a39800c28f68 +:107780001400438c01000224060062140000000073 +:107790002c00c39380ff022425106200ff004230ba +:1077a0002c00c2a39800c28f1800438c0100022451 +:1077b00005006214000000002c00c2934000423417 +:1077c000ff0042302c00c2a32c0002242f00c2a3d1 +:1077d0001480828f5000c2af2c00c2270c004224bc +:1077e0002120400000a0023ca840452414000624ab +:1077f0000e87400f000000002d00c0a39800c28f2c +:107800000000428c11004010000000009800c28f60 +:107810000c004294ff0042302d00c2a39800c28f9a +:107820000000438c2d00c2932400c48f21286000e7 +:10783000213040000e87400f000000002d00c29351 +:107840002400c38f211062002400c2af9800c28fb1 +:107850000e004294ff0042302e00c2a39800c28f57 +:107860000400438c2e00c2932400c48f21286000a2 +:10787000213040000e87400f000000002e00c29310 +:107880002400c38f211062002400c2af2400c28fe5 +:10789000ffff43302c00c2272c004224ffff423060 +:1078a00023106200ffff42303000c2a79800c28f51 +:1078b000100042943200c2a79800c28f0800438c87 +:1078c0003200c2972400c48f21286000213040007c +:1078d0000e87400f000000005800c2272800c39701 +:1078e0002c00c4271000a4af1400a3af3000032461 +:1078f0001800a3af01000424bd000524213040007e +:10790000300007249b49400f000000002000c2a364 +:107910002000c28321e8c0038c00bf8f8800be8f87 +:107920009000bd270800e0030000000068ffbd27ad +:107930009400bfaf9000beaf21f0a0039800c4af89 +:107940009c00c5afa000c6aff1ff02242000c2a377 +:10795000a000c28ff600401000000000a000c28fff +:107960000000428c0300401400000000a000c28f01 +:10797000140040a4a000c28f0400428cec00401010 +:1079800000000000a000c28f0800428ce8004010f8 +:1079900000000000a000c28f0c00428ce4004010e8 +:1079a00000000000a000c28f1000428ce0004010d8 +:1079b00000000000a000c28f140042942118400073 +:1079c000a000c28f16004294211062006500422c74 +:1079d000d700401000000000a000c28f18004294a1 +:1079e0000101422cd200401000000000a000c28f14 +:1079f0001a0042943106422ccd00401000000000d5 +:107a0000a000c28f14004394a000c28f16004294bd +:107a100021106200ffff4330a000c28f1800429483 +:107a200040100200ffff423021106200ffff433090 +:107a3000a000c28f1a00429421106200ffff423062 +:107a40002c0042242800c2a72800c2976000c32748 +:107a50001000a3af9800c48f04000524213040001b +:107a60009c00c78f251a400f000000002000c2a311 +:107a70002000c283ae00401400000000a000c28fae +:107a80001a0042942800c397231062002a00c2a75c +:107a90002c00c0af3000c0af3400c2272c004224fd +:107aa0002400c2af2a00c2973400c32721206000ff +:107ab0002128000021304000fa89400f000000001a +:107ac000020002243400c2a3a000c28f1c00438c19 +:107ad0000100022406006214000000003400c39379 +:107ae00080ff022425106200ff0042303400c2a350 +:107af000a000c28f2000438c010002240500621404 +:107b0000000000003400c29340004234ff004230c5 +:107b10003400c2a32c0002243700c2a31480828f39 +:107b20005800c2af3400c2270c004224212040007c +:107b300000a0023ca8404524140006240e87400ff4 +:107b4000000000003500c0a3a000c28f0000428cde +:107b50001100401000000000a000c28f14004294e9 +:107b6000ff0042303500c2a3a000c28f0000438c4a +:107b70003500c2932400c48f2128600021304000ca +:107b80000e87400f000000003500c2932400c38f11 +:107b9000211062002400c2afa000c28f16004294e0 +:107ba000ff0042303600c2a3a000c28f0400438c05 +:107bb0003600c2932400c48f212860002130400089 +:107bc0000e87400f000000003600c2932400c38fd0 +:107bd000211062002400c2af2400c28fffff433097 +:107be0003400c2272c004224ffff423023106200e1 +:107bf000ffff42303800c2a7a000c28f1800429495 +:107c00003a00c2a7a000c28f0800438c3a00c29776 +:107c10002400c48f21286000213040000e87400fcf +:107c2000000000003a00c2972400c38f21106200b8 +:107c30002400c2afa000c28f0c00438c3a00c29750 +:107c40002400c48f21286000213040000e87400f9f +:107c5000000000003a00c2972400c38f2110620088 +:107c60002400c2af2400c28fffff43303400c2277c +:107c70002c004224ffff423023106200ffff4230fd +:107c80003c00c2a7a000c28f1a0042943e00c2a7c7 +:107c9000010002242c00c2a33c00c2973000c2a7fe +:107ca0003e00c2973200c2a7a000c28f1000448cd1 +:107cb000a000c28f1a004294211840002c00c22755 +:107cc0001000a4af1400a3af080003241800a3af52 +:107cd00001000424be0005242130400008000724d0 +:107ce0009b49400f000000002000c2a32000c28377 +:107cf0000f004014000000006000c2272a00c39754 +:107d00003400c4271000a4af1400a3af3000032434 +:107d10001800a3af01000424bd0005242130400059 +:107d2000300007249b49400f000000002000c2a340 +:107d30002000c28321e8c0039400bf8f9000be8f53 +:107d40009800bd270800e00300000000d8ffbd2711 +:107d50002400bfaf2000beaf21f0a0032800c4afb5 +:107d60002120a0002118c0003400c7af3800c28f06 +:107d70002c00c4a33000c3a31800c2a72c00c393d7 +:107d80003000c2931800c4971000a4af1400a0af35 +:107d90002800c48f21286000213040003400c78fa4 +:107da000701f400f0000000021e8c0032400bf8fb7 +:107db0002000be8f2800bd270800e003000000005f +:107dc000a8ffbd275400bfaf5000beaf21f0a003f5 +:107dd0005800c4af2120c0006400c7af6800c38f43 +:107de0006c00c28f5c00c5a36000c4a34800c3a799 +:107df0004c00c2a3f1ff02241000c2a35800c38f9d +:107e00004800c2972000c0af2400c3af5c00c393fa +:107e10002800c3a32c00c2af4c00c2930400401042 +:107e200000000000211000008d1f400b000000002a +:107e3000020002241400c2af5c00c2932100422c55 +:107e400013004010000000009c1f400b00000000c9 +:107e50002400c38f5c00c293211062000000429096 +:107e600003004014000000005c00c2932800c2a37d +:107e70005c00c2932b100200ff0042305c00c393f1 +:107e8000ffff63245c00c3a3f1ff40140000000067 +:107e90006000c293020003240f00431000000000a2 +:107ea000030003242e0043100000000001000324ff +:107eb00045004314000000002000c2271400c48fb6 +:107ec00021284000f41a400f000000001000c2a357 +:107ed000f91f400b000000006400c28f3d004010fd +:107ee000000000003000c0af3400c0af3800c0a3b5 +:107ef0006400c28f212040006887400f000000000e +:107f00001800c2a71800c39740000224050062149d +:107f1000000000006400c28f3000c2afce1f400bd3 +:107f2000000000006400c28f3400c2af1800c29786 +:107f3000ff0042303800c2a32000c3273000c22710 +:107f40001400c48f2128600021304000b71b400f6f +:107f5000000000001000c2a3f91f400b0000000049 +:107f60006400c28f1e004010000000006400c28f39 +:107f70001c00c2af1c00c28f020044241c00c28f30 +:107f800001004290ffff4224ff0043301c00c28fdb +:107f9000000042903c00c4af4000c3a34100c2a314 +:107fa0002000c3273c00c2271400c48f2128600092 +:107fb00021304000321b400f000000001000c2a31f +:107fc000f91f400b0000000000000000f91f400beb +:107fd0000000000000000000f91f400b000000003e +:107fe000000000001000c28321e8c0035400bf8fce +:107ff0005000be8f5800bd270800e00300000000bd +:10800000d8ffbd272400bfaf2000beaf21f0a003e2 +:108010001000a0af1400a0af1800a0af010004240e +:108020002b00052421300000213800009b49400f1f +:108030000000000021e8c0032400bf8f2000be8f95 +:108040002800bd270800e00300000000d0ffbd2786 +:108050002c00bfaf2800beaf21f0a0033000c4af9a +:108060002000c227212040003000c58f06000624d2 +:108070000e87400f000000001000a0af1400a0af5a +:108080001800a0af01000424020005242000c2272c +:1080900021304000080007249b49400f00000000e9 +:1080a00021e8c0032c00bf8f2800be8f3000bd2701 +:1080b0000800e00300000000d8ffbd272400bfaf88 +:1080c0002000beaf21f0a0032800c4af2800c28f5b +:1080d0000800438c2800c28f080043ac2800c28fe0 +:1080e0000400438c2800c28f040043ac2800c28fd8 +:1080f0000000438c2800c28f000043ac2800c28fd0 +:108100000c00438c2800c28f0c0043ac2800c28fa7 +:108110001000a0af1400a0af1800a0af020004240c +:108120000a00052421304000140007249b49400f19 +:108130000000000021e8c0032400bf8f2000be8f94 +:108140002800bd270800e00300000000d0ffbd2785 +:108150002c00bfaf2800beaf21f0a003211080008b +:108160003000c2a33000c2930400401000000000a1 +:108170000b0002246020400b000000000c000224d1 +:108180002000c2a32000c2931000a0af1400a0af33 +:108190001800a0af02000424212840002130000074 +:1081a000213800009b49400f0000000021e8c00377 +:1081b0002c00bf8f2800be8f3000bd270800e003d1 +:1081c00000000000d8ffbd272400bfaf2000beafd5 +:1081d00021f0a0032800c4af2800c28f1000a0af78 +:1081e0001400a0af1800a0af01000424390005243a +:1081f00021304000040007249b49400f000000008c +:1082000021e8c0032400bf8f2000be8f2800bd27b7 +:108210000800e00300000000d8ffbd272400bfaf26 +:108220002000beaf21f0a0032800c4af2800c28ff9 +:108230000000429001004224ffff42301000a0af36 +:108240001400a0af1800a0af010004241100052401 +:108250002800c68f213840009b49400f00000000d5 +:1082600021e8c0032400bf8f2000be8f2800bd2757 +:108270000800e00300000000d0ffbd272c00bfafc6 +:108280002800beaf21f0a0033000c4aff4ff0224e9 +:108290002000c2a33000c48f9818400f00000000d7 +:1082a0000c004014000000003000c28f1000a0af8e +:1082b0001400a0af1800a0af01000424160005248c +:1082c00021304000080007249b49400f00000000b7 +:1082d0002000c2a32000c28321e8c0032c00bf8f6e +:1082e0002800be8f3000bd270800e003000000001a +:1082f000d0ffbd272c00bfaf2800beaf21f0a003e8 +:10830000211080003000c2a3f4ff02242000c2a389 +:108310002400c0af3000c2930200422c1000401075 +:10832000000000003000c2932400c2a32400c22732 +:108330001000a0af1400a0af1800a0af01000424eb +:108340006c00052421304000040007249b49400fa5 +:10835000000000002000c2a3da20400b0000000053 +:10836000f1ff02242000c2a32000c28321e8c00341 +:108370002c00bf8f2800be8f3000bd270800e0030f +:1083800000000000d0ffbd272c00bfaf2800beaf0b +:1083900021f0a003211080003000c2a7f4ff0224c6 +:1083a0002000c2a33000c2972400c2a72400c22725 +:1083b0001000a0af1400a0af1800a0af010004246b +:1083c0001700052421304000040007249b49400f7a +:1083d000000000002000c2a32000c28321e8c003e7 +:1083e0002c00bf8f2800be8f3000bd270800e0039f +:1083f00000000000d0ffbd272c00bfaf2800beaf9b +:1084000021f0a003211080003000c2a32000c0a3ef +:108410003000c29305004010000000003000c293fd +:108420000f00422c05004014000000003000c393f0 +:10843000ff00022410006214000000003000c2930c +:108440002400c2a32400c2271000a0af1400a0afd4 +:108450001800a0af010004241200052421304000c0 +:10846000040007249b49400f000000002000c2a325 +:108470002021400b00000000f1ff02242000c2a3d5 +:108480002000c28321e8c0032c00bf8f2800be8fcc +:108490003000bd270800e00300000000d0ffbd272a +:1084a0002c00bfaf2800beaf21f0a0032110800038 +:1084b0003000c2a32000c0a33000c29305004010ca +:1084c000000000003000c2930f00422c0500401451 +:1084d000000000003000c393ff000224100062146b +:1084e000000000003000c2932400c2a32400c22771 +:1084f0001000a0af1400a0af1800a0af010004242a +:108500002500052421304000040007249b49400f2a +:10851000000000002000c2a34a21400b0000000020 +:10852000f1ff02242000c2a32000c28321e8c0037f +:108530002c00bf8f2800be8f3000bd270800e0034d +:1085400000000000c8ffbd273400bfaf3000beaf41 +:1085500021f0a003211080003c00c5af3800c2a369 +:10856000f1ff02242000c2a33800c293050040108e +:10857000000000003800c2930f00422c0500401498 +:10858000000000003800c393ff0002243d00621485 +:10859000000000003c00c28f3a00401000000000c4 +:1085a0002200c0a72200c2973c00c38f21106200a6 +:1085b000000042902400c2a32400c2930500422c74 +:1085c00030004010000000002200c2970100422449 +:1085d0002200c2a78b21400b000000002200c2979e +:1085e0003c00c38f21106200000042902100422c09 +:1085f00023004010000000002200c2973c00c38fff +:108600002110620000004290211840002200c29711 +:1086100021106200ffff4230010042242200c2a765 +:108620002400c293ffff42242400c2a32400c2936b +:10863000eaff4014000000003800c2932800c2a3e3 +:108640002200c3972800c2273c00c48f1000a4afab +:108650001400a3af040003241800a3af01000424f6 +:10866000eb00052421304000040007249b49400f03 +:10867000000000002000c2a3a121400b0000000068 +:10868000000000002000c28321e8c0033400bf8f37 +:108690003000be8f3800bd270800e0030000000056 +:1086a000c8ffbd273400bfaf3000beaf21f0a0032c +:1086b000211080003c00c5af3800c2a33800c2932f +:1086c0002000c2a33800c29307004014000000003d +:1086d0002100c227212040003c00c58f080006244d +:1086e0000e87400f000000001000a0af1400a0afe4 +:1086f0001800a0af010004242f0005242000c22789 +:10870000213040000c0007249b49400f000000006e +:1087100021e8c0033400bf8f3000be8f3800bd2772 +:108720000800e00300000000d0ffbd272c00bfaf11 +:108730002800beaf21f0a0032000c0a31000a0af0e +:108740001400a0af1800a0af0100042431000524dc +:1087500021300000213800009b49400f000000003c +:108760002000c2a32000c28321e8c0032c00bf8fd9 +:108770002800be8f3000bd270800e0030000000085 +:10878000d0ffbd272c00bfaf2800beaf21f0a00353 +:10879000211080003000c2a32000c0a33000c3938a +:1087a0000100022409006210000000003000c393a1 +:1087b0000600022405006210000000003000c39390 +:1087c0000b00022410006214000000003000c2936d +:1087d0002400c2a32400c2271000a0af1400a0af41 +:1087e0001800a0af010004245b00052421304000e4 +:1087f000040007249b49400f000000002000c2a392 +:108800000422400b00000000f4ff02242000c2a359 +:108810002000c28321e8c0032c00bf8f2800be8f38 +:108820003000bd270800e00300000000d0ffbd2796 +:108830002c00bfaf2800beaf21f0a0032000c0a3d2 +:108840001000a0af1400a0af1800a0af01000424d6 +:108850005c00052421300000213800009b49400fb6 +:10886000000000002000c2a32000c28321e8c00352 +:108870002c00bf8f2800be8f3000bd270800e0030a +:108880000000000090ffbd276c00bfaf6800beafc6 +:1088900021f0a0037000c4af1000c22721204000c7 +:1088a0007000c58f480006240e87400f00000000ae +:1088b0007000c28f410042245800c327212060006d +:1088c00021284000040006240e87400f000000000d +:1088d0007000c28f410042245c00c3272120600049 +:1088e00021284000040006240e87400f00000000ed +:1088f0006000c0a31000c227212040004722400f83 +:108900000000000021e8c0036c00bf8f6800be8f2c +:108910007000bd270800e00300000000d0ffbd2765 +:108920002c00bfaf2800beaf21f0a0033000c4afc1 +:10893000f4ff02242000c2a33000c48f1918400f96 +:10894000000000001b004014000000003000c28f37 +:108950001000a0af1400a0af1800a0af01000424c5 +:108960004800052421304000540007249b49400f53 +:10897000000000002000c2a32000c383ffff0224e8 +:108980000c006214000000003000c28f1000a0af85 +:108990001400a0af1800a0af010004244600052475 +:1089a00021304000480007249b49400f0000000090 +:1089b0002000c2a32000c28321e8c0032c00bf8f87 +:1089c0002800be8f3000bd270800e0030000000033 +:1089d000d0ffbd272c00bfaf2800beaf21f0a00301 +:1089e0002000c0a31000a0af1400a0af1800a0afdb +:1089f0000100042447000524213000002138000034 +:108a00009b49400f000000002000c2a32000c28349 +:108a100021e8c0032c00bf8f2800be8f3000bd2787 +:108a20000800e00300000000d0ffbd272c00bfaf0e +:108a30002800beaf21f0a0032000c0a31000a0af0b +:108a40001400a0af1800a0af010004240300052407 +:108a500021300000213800009b49400f0000000039 +:108a60002000c2a32000c28321e8c0032c00bf8fd6 +:108a70002800be8f3000bd270800e0030000000082 +:108a8000d0ffbd272c00bfaf2800beaf21f0a00350 +:108a90002000c0a31000a0af1400a0af1800a0af2a +:108aa00001000424050005242130000021380000c5 +:108ab0009b49400f000000002000c2a32000c28399 +:108ac00021e8c0032c00bf8f2800be8f3000bd27d7 +:108ad0000800e00300000000d0ffbd272c00bfaf5e +:108ae0002800beaf21f0a0032000c0a31000a0af5b +:108af0001400a0af1800a0af010004240600052454 +:108b000021300000213800009b49400f0000000088 +:108b10002000c2a32000c28321e8c0032c00bf8f25 +:108b20002800be8f3000bd270800e00300000000d1 +:108b3000d0ffbd272c00bfaf2800beaf21f0a0039f +:108b40003000c4af2110a0003400c2a7ffff0224f0 +:108b50002000c2a33000c28f1600401000000000a9 +:108b60003400c29713004010000000003400c29788 +:108b70002400c2a70e0002242600c2a72400c22798 +:108b80003400c3973000c48f1000a4af1400a3af0b +:108b90001a0003241800a3af010004249e0005243a +:108ba00021304000040007249b49400f00000000d2 +:108bb0002000c2a32000c28321e8c0032c00bf8f85 +:108bc0002800be8f3000bd270800e0030000000031 +:108bd000e0ffbd271c00bfaf1800beaf21f0a0030f +:108be0002000c4af2400c5af1000c0a33948400f17 +:108bf000000000001000c2a31000c283080040144f +:108c0000000000002000c48f2400c58f3342400fb5 +:108c1000000000001000c2a39b48400f00000000ad +:108c20001000c28321e8c0031c00bf8f1800be8f54 +:108c30002000bd270800e00300000000e0ffbd2782 +:108c40001c00bfaf1800beaf21f0a0032000c4afce +:108c50001000c0a33948400f000000001000c2a35c +:108c60001000c28307004014000000002000c48fe1 +:108c70008b42400f000000001000c2a39b48400f31 +:108c8000000000001000c28321e8c0031c00bf8f59 +:108c90001800be8f2000bd270800e0030000000080 +:108ca000d0ffbd272c00bfaf2800beaf21f0a0032e +:108cb000211080003000c2a32000c0a33000c29366 +:108cc0002400c2a32400c2271000a0af1400a0af4c +:108cd0001800a0af01000424140005242130400036 +:108ce000040007249b49400f000000002000c2a39d +:108cf0002000c28321e8c0032c00bf8f2800be8f54 +:108d00003000bd270800e00300000000f8ffbd2789 +:108d10000400beaf21f0a00384808293ff004230a4 +:108d200021e8c0030400be8f0800bd270800e0034f +:108d300000000000e8ffbd271400bfaf1000beaf69 +:108d400021f0a0037848400f0000000021e8c00394 +:108d50001400bf8f1000be8f1800bd270800e0036d +:108d600000000000d0ffbd272c00bfaf2800beaf21 +:108d700021f0a003211880002110a0003000c3a31f +:108d80003400c2a32000c0a33000c2932400c2a3b9 +:108d90003400c2932500c2a32400c2271000a0af54 +:108da0001400a0af1800a0af010004242d0005247a +:108db00021304000040007249b49400f00000000c0 +:108dc0002000c2a33000c293212040006b48400f16 +:108dd000000000002000c28321e8c0032c00bf8fe8 +:108de0002800be8f3000bd270800e003000000000f +:108df000d0ffbd272c00bfaf2800beaf21f0a003dd +:108e00003000c4af2000c0a37848400f000000002d +:108e10002100c2a32100c393040002240e006214a7 +:108e2000000000003000c28f2400c2af2400c2271f +:108e30001000a0af1400a0af1800a0af01000424e0 +:108e40003a00052421304000040007249b49400fcc +:108e5000000000002000c2a32000c28321e8c0035c +:108e60002c00bf8f2800be8f3000bd270800e00314 +:108e700000000000a8ffbd275400bfaf5000beafe8 +:108e800021f0a0035800c4af2110a0005c00c2a3d1 +:108e90005c00c2933000422c03004014000000002c +:108ea000300002245c00c2a35c00c2930100422493 +:108eb0005c00c2a35c00c2932000c3272120600095 +:108ec0005800c58f213040000e87400f0000000081 +:108ed0001000a0af1400a0af1800a0af0100042440 +:108ee000090005242000c22721304000300007245b +:108ef0009b49400f0000000021e8c0035400bf8fd1 +:108f00005000be8f5800bd270800e003000000009d +:108f1000a8ffbd275400bfaf5000beaf21f0a00393 +:108f20005800c4af2110a0006000c6af5c00c2a30f +:108f30005c00c2932100422c040040140000000099 +:108f4000f4ff0224ea23400b000000005c00c293ff +:108f50002000c327212060005800c58f2130400029 +:108f60000e87400f000000005c00c2932000c32762 +:108f700021106200000040a06000c28f4400c2af18 +:108f80002000c2271000a0af1400a0af1800a0afaf +:108f90000100042426000524213040002c00072471 +:108fa0009b49400f0000000021e8c0035400bf8f20 +:108fb0005000be8f5800bd270800e00300000000ed +:108fc000e8ffbd271400bfaf1000beaf21f0a00323 +:108fd000553e400f0000000021e8c0031400bf8f81 +:108fe0001000be8f1800bd270800e003000000003d +:108ff000e0ffbd271c00bfaf1800beaf21f0a003eb +:109000002000c4af1000c0a33948400f000000008a +:109010001000c2a31000c28307004014000000002b +:109020002000c48f8d74400f000000001000c2a308 +:109030009b48400f000000001000c28321e8c003dd +:109040001c00bf8f1800be8f2000bd270800e00362 +:1090500000000000e0ffbd271c00bfaf1800beaf3e +:1090600021f0a0031000c0a31200c0a71200c22765 +:1090700021200000212840006574400f00000000fe +:109080001000c2a31000c2830600401400000000bc +:109090001200c29721204000f248400f000000005b +:1090a0001000c2a31000c28321e8c0031c00bf8fc0 +:1090b0001800be8f2000bd270800e003000000005c +:1090c000e0ffbd271c00bfaf1800beaf21f0a0031a +:1090d0002000c4af1000c0a33948400f00000000ba +:1090e0001000c2a31000c28307004014000000005b +:1090f0002000c48ff174400f000000001000c2a3d4 +:109100009b48400f000000001000c28321e8c0030c +:109110001c00bf8f1800be8f2000bd270800e00391 +:109120000000000090ffbd276c00bfaf6800beaf1d +:1091300021f0a0037000c4af7400c5af2110c000bf +:109140007800c2a31000c227212040007000c58f04 +:10915000480006240e87400f000000007000c28ff8 +:10916000410042245800c3272120600021284000ec +:10917000040006240e87400f000000007000c28f1c +:10918000410042245c00c3272120600021284000c8 +:10919000040006240e87400f000000006000c0a3fa +:1091a0007800c2931000c327212060007400c58f8f +:1091b000213040007524400f0000000021e8c0036a +:1091c0006c00bf8f6800be8f7000bd270800e003f1 +:1091d0000000000038ffbd27c400bfafc000beaf15 +:1091e00021f0a003c800c4afcc00c5af2110c0005f +:1091f000d000c2a3f4ff02242000c2a3c800c28f83 +:109200004000401000000000c800c48f1918400f33 +:10921000000000003b00401400000000c800c28fa6 +:109220002400c32721206000212840004800062494 +:109230000e87400f00000000c800c28f4800422483 +:109240002400c327890063242120600021284000d6 +:109250000c0006240e87400f00000000cc00c28fd7 +:10926000000042802700401000000000cc00c28fa8 +:1092700024004010000000002400c22748004224bf +:1092800021204000cc00c58f400006240e87400fef +:1092900000000000d000c293ac00c2a32400c2278b +:1092a0001000a0af1400a0af1800a0af010004246c +:1092b000a700052421304000980007249b49400f57 +:1092c000000000002000c2a32000c383ffff02248f +:1092d0000c006214000000002400c2271000a0afa0 +:1092e0001400a0af1800a0af010004248a000524d8 +:1092f00021304000980007249b49400f00000000e7 +:109300002000c2a32000c28321e8c003c400bf8f95 +:10931000c000be8fc800bd270800e00300000000a9 +:10932000d8ffbd272400bfaf2000beaf21f0a003af +:109330001000a0af1400a0af1800a0af01000424db +:109340000c00052421300000213800009b49400f0b +:109350000000000021e8c0032400bf8f2000be8f62 +:109360002800bd270800e00300000000d8ffbd274b +:109370002400bfaf2000beaf21f0a0031000a0afbb +:109380001400a0af1800a0af0100042407000524ba +:1093900021300000213800009b49400f00000000f0 +:1093a00021e8c0032400bf8f2000be8f2800bd2706 +:1093b0000800e00300000000d8ffbd272400bfaf75 +:1093c0002000beaf21f0a0032800c4af2800c227b0 +:1093d0001000a0af1400a0af1800a0af010004243b +:1093e0000d00052421304000080007249b49400f50 +:1093f0000000000021e8c0032400bf8f2000be8fc2 +:109400002800bd270800e00300000000d8ffbd27aa +:109410002400bfaf2000beaf21f0a0031000a0af1a +:109420001400a0af1800a0af010004241c00052404 +:1094300021300000213800009b49400f000000004f +:1094400021e8c0032400bf8f2000be8f2800bd2765 +:109450000800e00300000000d0ffbd272c00bfafd4 +:109460002800beaf21f0a003211080003000c2a36d +:109470003000c29304004010000000000e000224df +:109480002325400b000000000f0002242000c2a38f +:109490002000c2931000a0af1400a0af1800a0af2e +:1094a0000100042421284000213000002138000060 +:1094b0009b49400f0000000021e8c0032c00bf8f33 +:1094c0002800be8f3000bd270800e0030000000028 +:1094d000d0ffbd272c00bfaf2800beaf21f0a003f6 +:1094e000211080003000c2a32000c0a33000c2932e +:1094f0002400c2a32400c2271000a0af1400a0af14 +:109500001800a0af010004241800052421304000f9 +:10951000040007249b49400f000000002000c2a364 +:109520002000c28321e8c0032c00bf8f2800be8f1b +:109530003000bd270800e00300000000d0ffbd2779 +:109540002c00bfaf2800beaf21f0a0032110800087 +:109550003000c2a32000c0a33000c2932400c2a3e5 +:109560002400c2271000a0af1400a0af1800a0afc5 +:1095700001000424190005242130400004000724c0 +:109580009b49400f000000002000c2a32000c283be +:1095900021e8c0032c00bf8f2800be8f3000bd27fc +:1095a0000800e00300000000d0ffbd272c00bfaf83 +:1095b0002800beaf21f0a003211080003000c2a31c +:1095c0002000c0a33000c2932400c2a32400c227fd +:1095d0001000a0af1400a0af1800a0af0100042439 +:1095e0001b00052421304000040007249b49400f44 +:1095f000000000002000c2a32000c28321e8c003b5 +:109600002c00bf8f2800be8f3000bd270800e0036c +:1096100000000000d0ffbd272c00bfaf2800beaf68 +:1096200021f0a003211080003000c2a72000c0a3b9 +:109630002400c0af3000c2972400c2a72400c22774 +:109640001000a0af1400a0af1800a0af01000424c8 +:109650001a00052421304000040007249b49400fd4 +:10966000000000002000c2a32000c28321e8c00344 +:109670002c00bf8f2800be8f3000bd270800e003fc +:1096800000000000c8ffbd273400bfaf3000beaff0 +:1096900021f0a0033800c4af2110a0003c00c2a7f5 +:1096a000f4ff02242000c2a32400c0af2800c0aff2 +:1096b0003c00c2973406422c13004010000000000a +:1096c0003800c28f10004010000000003c00c2971c +:1096d0002800c2a73800c28f2400c2af2400c227ce +:1096e0001000a0af1400a0af1800a0af0100042428 +:1096f000bb00052421304000080007249b49400f8f +:10970000000000002000c2a32000c28321e8c003a3 +:109710003400bf8f3000be8f3800bd270800e00343 +:1097200000000000c8ffbd273400bfaf3000beaf4f +:1097300021f0a0033800c4af2110a0003c00c2a358 +:10974000f4ff02242000c2a33800c28f140040108e +:10975000000000003c00c2932a00c2a32400c227dc +:10976000212040003800c58f060006240e87400fd8 +:10977000000000002400c2271000a0af1400a0af1a +:109780001800a0af0100042420000524213040006f +:10979000080007249b49400f000000002000c2a3de +:1097a0002000c28321e8c0033400bf8f3000be8f89 +:1097b0003800bd270800e00300000000f0ffbd27cf +:1097c0000c00beaf21f0a0031000c4af2110a00018 +:1097d0001400c2a70000c0a31000c28f07004010f1 +:1097e000000000001000c28f908082af1400c2976a +:1097f000948082a70126400b00000000f4ff0224a1 +:109800000000c2a30000c28321e8c0030c00be8f89 +:109810001000bd270800e00300000000d0ffbd27b6 +:109820002c00bfaf2800beaf21f0a00321108000a4 +:109830003000c2a3010002242000c2a33000c29362 +:1098400005004010000000003000c3930100022416 +:109850000f006214000000003000c2932100c2a378 +:109860001000a0af1400a0af1800a0af01000424a6 +:109870006a0005242000c22721304000040007248c +:109880009b49400f000000002526400b000000000f +:10989000f1ff022421e8c0032c00bf8f2800be8ff7 +:1098a0003000bd270800e00300000000d0ffbd2706 +:1098b0002c00bfaf2800beaf21f0a0032000c0a342 +:1098c0001000a0af1400a0af1800a0af0100042446 +:1098d0006a0005242000c22721304000040007242c +:1098e0009b49400f0000000021e8c0032c00bf8fff +:1098f0002800be8f3000bd270800e00300000000f4 +:10990000d0ffbd272c00bfaf2800beaf21f0a003c1 +:109910003000c4af3400c5af3400c28fffff423007 +:109920002000c2a72000c2273400c38fffff63308e +:109930003000c48f1000a4af1400a3af02000324b2 +:109940001800a3af01000424a10005242130400029 +:10995000020007249b49400f0000000021e8c003db +:109960002c00bf8f2800be8f3000bd270800e00309 +:1099700000000000d0ffbd272c00bfaf2800beaf05 +:1099800021f0a0033400c5af2118c0003c00c7afd0 +:109990004000c28f3000c4a33800c3a32000c2a778 +:1099a0003c00c28f1400c2af3400c28f2000c397a6 +:1099b000060043a42000c2976a0040100000000087 +:1099c0003000c38300a0023c00190300d8014224e8 +:1099d000211062000000428c620040100000000074 +:1099e0003000c38300a0023c00190300d8014224c8 +:1099f0002110620004004294ffff423059004010e1 +:109a0000000000003000c38300a0023c00190300e6 +:109a1000d8014224211062000a004290ff00433026 +:109a2000010002244f006214000000002000c297d1 +:109a30001000c2a73000c38300a0023c001903003d +:109a4000d80142242110620004004294ffff4230fa +:109a50001000c39723106200ffff42301800c2a716 +:109a60001800c28708004018000000003000c383bf +:109a700000a0023c00190300d8014224211062001a +:109a8000040042941000c2a73000c38300a0023c2f +:109a900000190300d8014224211062000000438c09 +:109aa0001000c2971400c48f2128600021304000ac +:109ab00001000724284c400f00000000290040143a +:109ac000000000003000c38300a0023c0019030026 +:109ad000d8014224211062000000438c3400c28f60 +:109ae000000043ac1000c3873400c28f040043a4bd +:109af0003400c28f060043941000c2972310620006 +:109b0000ffff43303400c28f060043a43000c383fc +:109b100000a0023c00190300d80142242110620079 +:109b2000040040a43000c38300a0023c00190300dd +:109b3000d801422421106200000040ac1881828fbd +:109b400008004010000000001881828f3000c4839c +:109b50003800c393212860003400c68f09f8400004 +:109b60000000000021e8c0032c00bf8f2800be8f3a +:109b70003000bd270800e00300000000e0febd2724 +:109b80001c01bfaf1801beaf21f0a0032118800057 +:109b90002110a0002801c6af2001c3a32401c2a741 +:109ba0002001c39341000224190062140000000048 +:109bb0002c00c2272801c48f21284000040006245d +:109bc00021380000284c400f000000000202401421 +:109bd000000000002d00c2833000c2a31881828fd4 +:109be000fd014010000000001881828f2c00c3830b +:109bf000212060003000c3270100052421306000cf +:109c000009f8400000000000f628400b00000000aa +:109c10002001c393420002241900621400000000d6 +:109c20003400c2272801c48f2128400004000624e4 +:109c300021380000284c400f00000000e6014014cd +:109c4000000000003500c2833800c2a31881828f53 +:109c5000e1014010000000001881828f3400c383ae +:109c6000212060003800c327020005242130600055 +:109c700009f8400000000000f628400b000000003a +:109c80002001c393430002244c0062140000000032 +:109c90003c00c2272801c48f212840000c00062464 +:109ca00021380000284c400f00000000ca01401479 +:109cb000000000004500c2832b00400400000000ab +:109cc0004500c2830c00422827004010000000001d +:109cd0004500c2832118400000a0023c0019030087 +:109ce000d8014224211062000b0040a04500c2832d +:109cf0002118400000a0023c00190300d8014224b2 +:109d000021106200010003240a0043a0a48082976e +:109d1000ffff423001004224ffff4230a48082a7af +:109d2000a4808297ffff423006004014000000002c +:109d3000a4808297ffff423001004224ffff42309f +:109d4000a48082a74500c28321204000a48082977e +:109d5000ffff433000a0023c00210400d801422450 +:109d600021108200060043a44500c2834800c2a31c +:109d7000020002244c00c2a73e00c2974e00c2a7b8 +:109d80004000c28f5000c2af1881828f92014010f4 +:109d9000000000001881828f4400c38321206000ee +:109da0004800c327040005242130600009f8400062 +:109db00000000000f628400b000000002001c393c3 +:109dc0004400022409006210000000002001c39337 +:109dd0004b00022405006210000000002001c39324 +:109de0005300022462006214000000005c00c0af57 +:109df0006000c0af080002241800c2a72001c3936e +:109e0000530002240300621000000000040002243a +:109e10001800c2a75c00c3271800c2972801c48f8e +:109e2000212860002130400021380000284c400fdc +:109e30000000000040014014000000005c00c283ec +:109e400040014004000000005c00c2830c00422876 +:109e50003f01401000000000050002241a00c2a3c8 +:109e60005c00c2836400c2a35d00c2836500c2a31c +:109e70006400c2832118400000a0023c00190300c6 +:109e8000d80142242110620008004294ffff4230b2 +:109e900003004010000000000a0002241a00c2a3c0 +:109ea0005d00c28315004014000000006400c283fe +:109eb000212040005e00c297f8ff4224ffff43309c +:109ec00000a0023c00210400d8014224211082009d +:109ed000080043a46400c283212040006000c393b3 +:109ee00000a0023c00210400d8014224211082007d +:109ef0000d0043a0cf27400b000000006400c28388 +:109f0000212040005e00c39300a0023c0021040019 +:109f1000d8014224211082000e0043a06400c283b5 +:109f2000212040005f00c39300a0023c00210400f8 +:109f3000d8014224211082000f0043a01881828f93 +:109f400006014010000000001881828f6400c38366 +:109f5000212060001a00c5936400c32721306000ef +:109f600009f8400000000000f628400b0000000047 +:109f70002001c3934a00022417006214000000006d +:109f8000b000c2272801c48f2128400068000624a1 +:109f900021380000284c400f000000000e01401442 +:109fa000000000001401c28f1401c2af1481828f1f +:109fb00009014010000000001481828fb000c42706 +:109fc0001401c38f2128600009f840000000000040 +:109fd000f628400b000000002001c3934600022435 +:109fe00009006210000000002001c3934800022411 +:109ff00005006210000000002001c3934d00022400 +:10a000006f00621400000000060002241b00c2a3bf +:10a010002001c393480002240300621400000000e2 +:10a02000090002241b00c2a3100002242200c2a7c0 +:10a030006800c3272200c2972801c48f212860002e +:10a040002130400021380000284c400f0000000063 +:10a05000c5004014000000007400c283c500400425 +:10a06000000000007400c2830c004228c4004010ad +:10a07000000000002400c0a77400c2932600c2a301 +:10a080007600c2972400c2a72600c38300a0023c2a +:10a0900000190300d8014224211062000c0040a0e6 +:10a0a0007000c2972800c2a77200c2972a00c2a7f8 +:10a0b0006a00c2978200c2a76c00c28f8400c2af40 +:10a0c0002600c38300a0023c00190300d8014224eb +:10a0d0002110620006004294ffff42302400c39723 +:10a0e0002a006214000000002800c28718004018ef +:10a0f000000000002800c3872401c2972a106200d4 +:10a1000013004010000000002a00c2972801c38fee +:10a11000211062002801c2af2800c2972200c2a706 +:10a120002600c4831b00c2932200c5977800c32772 +:10a130001000a5af21286000213040002801c78f02 +:10a140005d26400f00000000f628400b00000000d4 +:10a150002800c2977c00c2a77800c0af1881828f08 +:10a160008a004010000000001881828f2600c483fe +:10a170001b00c5937800c3272130600009f8400018 +:10a1800000000000f628400b000000002200c397ea +:10a190002401c2972b1062007f00401000000000d5 +:10a1a00021200000212800002130000001000724a8 +:10a1b000284c400f00000000f628400b0000000073 +:10a1c0002001c39345000224090062100000000032 +:10a1d0002001c39347000224050062100000000024 +:10a1e0002001c3934c0002243600621400000000da +:10a1f000070002241c00c2a32001c39347000224cd +:10a200000300621400000000080002241c00c2a326 +:10a210009400c2272801c48f21284000080006248a +:10a2200021380000284c400f000000005d00401461 +:10a23000000000009400c2835d00400400000000a4 +:10a240009400c2830c0042285c0040100000000013 +:10a250001e00c0a79400c2932000c2a39800c2971a +:10a260001e00c2a79600c2879000c2a72000c38329 +:10a2700000a0023c00190300d80142242110620012 +:10a2800006004294ffff42301e00c3974e00621446 +:10a29000000000001881828f4e0040100000000076 +:10a2a0001881828f2000c4831c00c5939000c327af +:10a2b0002130600009f8400000000000f628400b43 +:10a2c000000000002001c3935200022442006214e7 +:10a2d000000000009c00c2272801c48f21284000f4 +:10a2e0001400062401000724284c400f0000000041 +:10a2f0003900401400000000a000c38fac80828fa2 +:10a300003500621400000000a880828f32004010e7 +:10a3100000000000a880828f9c00c48fa400c58f1d +:10a32000ac00c3932130600009f840000000000039 +:10a33000f628400b0000000000000000f628400b4b +:10a340000000000000000000f628400b00000000a4 +:10a3500000000000f628400b000000000000000094 +:10a36000f628400b0000000000000000f628400b1b +:10a370000000000000000000f628400b0000000074 +:10a3800000000000f628400b000000000000000064 +:10a39000f628400b0000000000000000f628400beb +:10a3a0000000000000000000f628400b0000000044 +:10a3b00000000000f628400b000000000000000034 +:10a3c000f628400b0000000000000000f628400bbb +:10a3d000000000000000000021e8c0031c01bf8f46 +:10a3e0001801be8f2001bd270800e0030000000017 +:10a3f000e8ffbd271400bfaf1000beaf21f0a003df +:10a40000a6808293ff0042300f004014000000003d +:10a4100000a0023cd801442421280000c0000624ea +:10a42000fa89400f0000000002000424019d023c54 +:10a430007c9b4524934c400f000000000100022447 +:10a44000a68082a3a48080a721e8c0031400bf8f48 +:10a450001000be8f1800bd270800e00300000000b8 +:10a46000e8ffbd271400bfaf1000beaf21f0a0036e +:10a4700000a0023cd801442421280000c00006248a +:10a48000fa89400f00000000020004242128000087 +:10a49000934c400f00000000188180af148180af02 +:10a4a000a68080a321e8c0031400bf8f1000be8fd8 +:10a4b0001800bd270800e00300000000f8ffbd27da +:10a4c0000400beaf21f0a0030800c4af0c00c5af6c +:10a4d0000800c28f188182af0c00c28f148182af36 +:10a4e00021e8c0030400be8f0800bd270800e00378 +:10a4f00000000000f8ffbd270400beaf21f0a0035c +:10a500000800c4af0800c28f188182af21e8c003e1 +:10a510000400be8f0800bd270800e0030000000013 +:10a52000f8ffbd270400beaf21f0a0030800c4afb0 +:10a530000800c28f148182af21e8c0030400be8fdf +:10a540000800bd270800e00300000000c0ffbd2791 +:10a550003c00bfaf3800beaf21f0a0032118a0001f +:10a560002110c0004000c4a74400c3a34800c2a3f8 +:10a57000ffff02242000c2a32400c0af4000c39705 +:10a5800002000224ba006214000000004400c393d9 +:10a59000010002244b006214000000002100c0a34f +:10a5a000ab29400b00000000b08082932800c2a3ba +:10a5b000b0808293ff0042300019020000a0023cec +:10a5c000d8014224211062002400c2afb0808293df +:10a5d000ff00423001004324070002241a006200f9 +:10a5e000f401400010100000ff004230b08082a350 +:10a5f0002400c28f0a004290ff004230280040141d +:10a60000000000002800c2932000c2a32400c48fd1 +:10a610002128000010000624fa89400f00000000e5 +:10a620004800c29376004010000000002000c29352 +:10a630003000c2a33000c2271000a0af1400a0afaa +:10a640001800a0af0200042450000524213040006f +:10a65000040007249b49400f000000002400c28f23 +:10a66000010003240b0043a04800c393020002240e +:10a6700066006214000000002400c28f0b004290ac +:10a68000ff00433080ff022425106200ff004330aa +:10a690002400c28f0b0043a0042a400b00000000de +:10a6a0002100c293010042242100c2a32100c293d1 +:10a6b0000700422cbcff401400000000042a400b9d +:10a6c000000000004400c39302000224330062141f +:10a6d0000000000000a0023c480242242c00c2af4f +:10a6e0002100c0a3e129400b00000000b18082934b +:10a6f0002800c2a3b1808293ff0042300011020003 +:10a700002c00c38f211062002400c2afb18082935d +:10a71000ff00423001004324c317030082170200e8 +:10a72000211862000300633023106200ff004230f2 +:10a73000b18082a32400c28f0a004290ff00423001 +:10a740000d004014000000002800c29307004224be +:10a75000ff0042302000c2a32400c48f2128000043 +:10a7600010000624fa89400f0000000000000000dd +:10a77000042a400b000000002100c2930100422483 +:10a780002100c2a32100c2930400422cd7ff401431 +:10a7900000000000042a400b000000004400c393a6 +:10a7a000030002241a006214000000004800c39352 +:10a7b00002000224160062140000000000a0023c07 +:10a7c000880242242400c2af2400c28f0a004290b3 +:10a7d000ff0042300e004014000000000b00022475 +:10a7e0002000c2a32400c48f2128000010000624ea +:10a7f000fa89400f00000000042a400b000000000e +:10a8000000000000042a400b0000000000000000cf +:10a810002000c28316004004000000002400c28f04 +:10a82000010003240a0043a0a4808297ffff423066 +:10a8300001004224ffff4230a48082a7a4808297b7 +:10a84000ffff42300600401400000000a480829701 +:10a85000ffff423001004224ffff4230a48082a764 +:10a86000a4808297ffff43302400c28f060043a4d8 +:10a870002000c28321e8c0033c00bf8f3800be8f98 +:10a880004000bd270800e00300000000c8ffbd270e +:10a890003400bfaf3000beaf21f0a003211880000c +:10a8a0003c00c5af2110c0003800c3a34000c2a3c4 +:10a8b000faff02242000c2a33c00c28f3b004010dc +:10a8c000000000003800c28338004004000000008f +:10a8d0003800c2830c004228340040100000000001 +:10a8e0003800c38300a0023c00190300d8014224b1 +:10a8f000211062000a004290ff0043300100022450 +:10a900002a006214000000004000c293270040109b +:10a91000000000003800c2932c00c2a32400c2270c +:10a92000212040003c00c58f080006240e87400f00 +:10a93000000000002400c2972400c2a72600c2978e +:10a940002600c2a72800c28f2800c2af3800c383e8 +:10a9500000a0023c00190300d8014224211062002b +:10a9600006004294ffff42302e00c2a72400c227f7 +:10a970001000a0af1400a0af1800a0af0200042484 +:10a9800041000524213040000c0007249b49400f62 +:10a99000000000002000c2a32000c283030040107a +:10a9a00000000000f7ff02242000c2a32000c283a1 +:10a9b00021e8c0033400bf8f3000be8f3800bd27b0 +:10a9c0000800e00300000000d0ffbd272c00bfaf4f +:10a9d0002800beaf21f0a003211880002110a000a4 +:10a9e0003000c3a33400c2a3faff02242000c2a394 +:10a9f0003000c2832b004004000000003000c283fe +:10aa00000c00422827004010000000003000c383e3 +:10aa100000a0023c00190300d8014224211062006a +:10aa20000a004290ff004330010002241d0062141e +:10aa3000000000003000c2932400c2a33400c2937f +:10aa40002500c2a33000c38300a0023c001903000c +:10aa5000d80142242110620006004294ffff4230d8 +:10aa60002600c2a72400c2271000a0af1400a0af88 +:10aa70001800a0af02000424420005242130400049 +:10aa8000040007249b49400f000000002000c2a3df +:10aa90002000c2830300401000000000f7ff0224e2 +:10aaa0002000c2a32000c28321e8c0032c00bf8f76 +:10aab0002800be8f3000bd270800e0030000000022 +:10aac000f0ffbd270c00beaf21f0a00321108000d5 +:10aad0001400c5af1800c6af1000c2a3faff0224cd +:10aae0000000c2a31000c283100040040000000058 +:10aaf0001000c2830c0042280c004010000000002f +:10ab00001000c38300a0023c00190300d8014224b6 +:10ab1000211062000a004290ff004330010002242d +:10ab200002006214000000000000c0a30000c28305 +:10ab300021e8c0030c00be8f1000bd270800e00311 +:10ab400000000000c8ffbd273400bfaf3000beaf1b +:10ab500021f0a003211880003c00c5af2110c000e7 +:10ab60003800c3a34000c2a3faff02242000c2a3fe +:10ab70003800c2834d004004000000003800c2834a +:10ab80000c00422849004010000000003c00c28f29 +:10ab900046004010000000003800c38300a0023cc3 +:10aba00000190300d8014224211062000a004290db +:10abb000ff004330010002243c006214000000004a +:10abc0004000c293390040100000000044000224fd +:10abd0002100c2a33800c38300a0023c0019030077 +:10abe000d8014224211062000b004290ff00423045 +:10abf00001004230ff0042300b0040100000000016 +:10ac00004b0002242100c2a33800c38300a0023cf1 +:10ac100000190300d8014224211062000b00429069 +:10ac2000ff0042302d00c2a33800c2932c00c2a303 +:10ac30002400c227212040003c00c58f08000624c4 +:10ac40000e87400f000000003800c38300a0023cc4 +:10ac500000190300d801422421106200060042942a +:10ac6000ffff42302e00c2a72100c3932400c22759 +:10ac70001000a0af1400a0af1800a0af0200042481 +:10ac800021286000213040000c0007249b49400f20 +:10ac9000000000002000c2a32000c2830300401077 +:10aca00000000000f7ff02242000c2a32000c2839e +:10acb00021e8c0033400bf8f3000be8f3800bd27ad +:10acc0000800e00300000000c8ffbd273400bfaf4c +:10acd0003000beaf21f0a003211080003800c2a3d5 +:10ace000faff02242000c2a33800c283610040049e +:10acf000000000003800c2830c0042285d004010b4 +:10ad0000000000003800c38300a0023c00190300cb +:10ad1000d8014224211062000a004290ff00433013 +:10ad20000100022453006214000000003800c383b5 +:10ad300000a0023c00190300d80142242110620047 +:10ad40000b004290ff00423001004230ff004230d1 +:10ad500048004010000000003800c38300a0023cff +:10ad600000190300d8014224211062000b00429018 +:10ad7000ff0042302014027c3e004104000000002d +:10ad80003800c38300a0023c00190300d80142240c +:10ad90002110620008004294ffff4230350040104d +:10ada000000000002400c0af2800c0af2c00c0afde +:10adb0003800c4833800c38300a0023c001903009c +:10adc000d8014224211062000b004290ff00423063 +:10add0007f004230ff00433000a0023c002104000d +:10ade000d8014224211082000b0043a03800c38305 +:10adf00000a0023c00190300d80142242110620087 +:10ae00000b004290ff0042302d00c2a33800c293d5 +:10ae10002c00c2a33800c38300a0023c0019030029 +:10ae2000d80142242110620006004294ffff423004 +:10ae30002e00c2a72400c2271000a0af1400a0afac +:10ae40001800a0af02000424550005242130400062 +:10ae50000c0007249b49400f000000002000c2a303 +:10ae60002000c2830300401000000000f7ff02240e +:10ae70002000c2a32000c28321e8c0033400bf8f9a +:10ae80003000be8f3800bd270800e003000000003e +:10ae9000c0ffbd273c00bfaf3800beaf21f0a0030c +:10aea0004400c5af2118c0002110e0004000c4a339 +:10aeb0004800c3a74c00c2a7faff02242000c2a783 +:10aec0004000c28362004004000000004000c283d2 +:10aed0000c0042285e004010000000004400c28fb9 +:10aee0005b004010000000004800c2977905422c2a +:10aef00057004010000000004000c38300a0023c47 +:10af000000190300d8014224211062000a00429077 +:10af1000ff004330010002244d00621400000000d5 +:10af2000450002242400c2a3500002242200c2a72c +:10af30004000c2932800c2a34800c2972a00c2a7bb +:10af40004000c38300a0023c00190300d801422442 +:10af50002110620006004294ffff42303400c2a775 +:10af60004000c28307004228030040140000000094 +:10af7000440002242200c2a74000c38300a0023c78 +:10af800000190300d8014224211062000b004290f6 +:10af9000ff00423001004230ff00423014004010f8 +:10afa000000000004000c38300a0023c0019030021 +:10afb000d8014224211062000b004290ff00423071 +:10afc0002014027c0a004004000000004c0002240f +:10afd0002400c2a34000c38300a0023c0019030068 +:10afe000d801422421106200080042942200c2a726 +:10aff0002400c39380ff022425106200ff0042302a +:10b00000211840002800c2274400c68f4800c59779 +:10b010002200c4971000a6af1400a5af1800a4af7b +:10b020000200042421286000213040001000072481 +:10b030009b49400f000000002000c2a72000c287eb +:10b040000300401000000000f2ff02242000c2a70d +:10b050002000c28721e8c0033c00bf8f3800be8fac +:10b060004000bd270800e00300000000b8ffbd2736 +:10b070004400bfaf4000beaf21f0a00321408000dc +:10b080004c00c5af2120c0002118e0005c00c28f39 +:10b090004800c8a35000c4a75400c3a73800c2a3e7 +:10b0a000faff02242000c2a74800c3830b00022439 +:10b0b000040062140000000024060224322c400b1d +:10b0c00000000000780502242200c2a74800c283c5 +:10b0d00051004004000000004800c2830c004228d8 +:10b0e0004d004010000000004c00c28f4a0040108c +:10b0f000000000005000c3972200c2972b104300ad +:10b1000045004014000000004800c38300a0023c3a +:10b1100000190300d8014224211062000a00429065 +:10b12000ff004330010002243b00621400000000d5 +:10b130002800c227212040002128000010000624fa +:10b14000fa89400f000000004800c2932800c2a303 +:10b150005000c2972a00c2a74800c38300a0023c47 +:10b1600000190300d8014224211062000600429415 +:10b17000ffff42303400c2a75800c28f0c004010bd +:10b18000000000005800c28f2400c2af2400c28f0c +:10b19000000042942c00c2a72400c28f02004294f7 +:10b1a0002e00c2a72400c28f0400428c3000c2af20 +:10b1b0002800c3274c00c58f5000c4974800c683a1 +:10b1c0000b0002240400c214000000002800022426 +:10b1d000772c400b00000000440002241000a5afb3 +:10b1e0001400a4af1800a2af02000424c700052475 +:10b1f00021306000100007249b49400f0000000030 +:10b200002000c2a72000c2870300401000000000f9 +:10b21000f2ff02242000c2a72000c28721e8c00359 +:10b220004400bf8f4000be8f4800bd270800e003e8 +:10b2300000000000c8ffbd273400bfaf3000beaf24 +:10b2400021f0a003211880003c00c5af2110c000f0 +:10b250004400c7af3800c3a34000c2a7faff0224ce +:10b260002000c2a73800c283730040040000000021 +:10b270003800c2830c0042286f004010000000001c +:10b280003c00c28f6c004010000000004000c297dc +:10b2900069004010000000003800c38300a0023c99 +:10b2a00000190300d8014224211062000a004290d4 +:10b2b000ff004330010002245f0062140000000020 +:10b2c0002000c0a73800c4833c00c38f00a0023c0c +:10b2d00000210400d801422421108200000043ac68 +:10b2e0003800c38300a0023c00190300d8014224a7 +:10b2f000211062004000c397040043a43800c383b8 +:10b3000000a0023c00190300d80142242110620071 +:10b310000c004290ff004230470040140000000043 +:10b32000460002242200c2a33800c38300a0023cce +:10b3300000190300d80142242110620001000324f7 +:10b340000c0043a03800c38300a0023c0019030096 +:10b35000d8014224211062000b004290ff004230cd +:10b3600001004230ff0042300d004010000000009c +:10b370003800c38300a0023c00190300d801422416 +:10b38000211062000b004290ff0042302014027c2a +:10b3900003004004000000004d0002242200c2a36c +:10b3a0004400c28f0500401400000000ffff02248b +:10b3b0002400c2aff12c400b000000004400c28ffb +:10b3c0002400c2af3800c2932800c2a33800c38350 +:10b3d00000a0023c00190300d801422421106200a1 +:10b3e00006004294ffff42302a00c2a74000c297e5 +:10b3f0002c00c2a72200c3932400c2271000a0afd4 +:10b400001400a0af1800a0af02000424212860009f +:10b41000213040000c0007249b49400f0000000031 +:10b420002000c2a72000c2870300401000000000d7 +:10b43000f2ff02242000c2a72000c28721e8c00337 +:10b440003400bf8f3000be8f3800bd270800e003f6 +:10b4500000000000d0ffbd272c00bfaf2800beaf0a +:10b4600021f0a003211080003000c2a3faff0224c3 +:10b470002000c2a33000c28343004004000000004b +:10b480003000c2830c0042283f0040100000000042 +:10b490003000c38300a0023c00190300d8014224fd +:10b4a000211062000a004290ff0043300100022494 +:10b4b0003500621400000000490002242100c2a3ec +:10b4c0003000c2932400c2a33000c38300a0023c1a +:10b4d00000190300d80142242110620006004294a2 +:10b4e000ffff42302600c2a73000c38300a0023c09 +:10b4f00000190300d8014224211062000b00429081 +:10b50000ff00423001004230ff0042300300401093 +:10b51000000000004e0002242100c2a32100c393ba +:10b520002400c2271000a0af1400a0af1800a0afe5 +:10b530000200042421286000213040000400072478 +:10b540009b49400f000000002000c2a32000c283de +:10b550000300401000000000f7ff02242000c2a3f7 +:10b560003000c2830019020000a0023cd80142242e +:10b570002110620021204000212800001000062434 +:10b58000fa89400f000000002000c28321e8c003b8 +:10b590002c00bf8f2800be8f3000bd270800e003bd +:10b5a00000000000c8ffbd273400bfaf3000beafb1 +:10b5b00021f0a003211880003c00c5af2110c0007d +:10b5c0004400c7af3800c3a34000c2a72000c0a7f3 +:10b5d0003800c28364004004000000003800c283c9 +:10b5e0000c00422860004010000000003c00c28fa8 +:10b5f0005d004010000000004000c2975a0040105b +:10b60000000000003800c38300a0023c00190300c2 +:10b61000d8014224211062000a004290ff0043300a +:10b620000100022450006214000000003800c383af +:10b6300000a0023c00190300d8014224211062003e +:10b640000a004290ff0042304f004010000000000e +:10b650002000c0a73800c4833c00c38f00a0023c78 +:10b6600000210400d801422421108200000043acd4 +:10b670003800c38300a0023c00190300d801422413 +:10b68000211062004000c397040043a43800c38324 +:10b6900000a0023c00190300d801422421106200de +:10b6a0000c004290ff0042303300401400000000c4 +:10b6b0003800c38300a0023c00190300d8014224d3 +:10b6c00021106200010003240c0043a04400c28f3b +:10b6d0000500401400000000ffff02242400c2af58 +:10b6e000bc2d400b000000004400c28f2400c2affc +:10b6f0003800c2932800c2a33800c38300a0023cd4 +:10b7000000190300d801422421106200060042946f +:10b71000ffff42302a00c2a74000c2972c00c2a7f8 +:10b720002400c2271000a0af1400a0af1800a0afe3 +:10b730000200042448000524213040000c000724a6 +:10b740009b49400f000000002000c2a72000c287d4 +:10b750000c00401000000000f2ff02242000c2a7ed +:10b76000e22d400b00000000faff02242000c2a7d7 +:10b77000e22d400b0000000000000000e22d400b15 +:10b7800000000000000000002000c28721e8c00384 +:10b790003400bf8f3000be8f3800bd270800e003a3 +:10b7a00000000000d0ffbd272c00bfaf2800beafb7 +:10b7b00021f0a0033000c4affaff02242000c2a38e +:10b7c0003000c48f6887400f000000002100c2a332 +:10b7d0002100c2936500422c1500401000000000bb +:10b7e0003000c38f2100c293ffff4230010042248a +:10b7f000ffff42301000a0af1400a0af1800a0afb0 +:10b8000002000424ca0005242130600021384000d1 +:10b810009b49400f000000002000c2a32000c2830b +:10b820000300401000000000f7ff02242000c2a324 +:10b830002000c28321e8c0032c00bf8f2800be8fe8 +:10b840003000bd270800e00300000000c8ffbd274e +:10b850003400bfaf3000beaf21f0a0032118a0001c +:10b860004000c6af2110e0003800c4a33c00c3a3d1 +:10b870004400c2a7faff02242000c2a33800c383f9 +:10b880000b00022427006214000000004400c3974c +:10b89000040002242300621400000000540002246b +:10b8a0002100c2a33c00c2932900c2a33800c29366 +:10b8b0002800c2a34000c28f0000428c2400c2af07 +:10b8c0003800c38300a0023c00190300d8014224c1 +:10b8d0002110620006004294ffff42302a00c2a7f6 +:10b8e0002100c3932400c2271000a0af1400a0af12 +:10b8f0001800a0af0200042421286000213040007d +:10b90000080007249b49400f000000002000c2a34c +:10b910002000c2830300401000000000f7ff022453 +:10b920002000c2a32000c28321e8c0033400bf8fdf +:10b930003000be8f3800bd270800e0030000000083 +:10b9400060ffbd279c00bfaf9800beaf21f0a003f1 +:10b950002118a000a800c6af2110e000a000c4a3d9 +:10b96000a400c3a3ac00c2a7faff02242000c2a314 +:10b97000a000c28307004228a7004010000000007a +:10b98000a000c38300a0023c00190300d801422498 +:10b99000211062000b004290ff0042300100423053 +:10b9a000ff0042309c004010000000002100c0a3b6 +:10b9b0002000c0a3ac00c397040002241700621447 +:10b9c00000000000a400c3930100022405006214db +:10b9d00000000000020002242100c2a3872e400bb9 +:10b9e00000000000a400c3930300022405006214b9 +:10b9f00000000000100002242100c2a3872e400b8b +:10ba000000000000a400c393040002240300621499 +:10ba100000000000400002242100c2a32100c293c4 +:10ba20002f00401000000000a800c28f0000428cd0 +:10ba30002400c2af2400c28f130040100000000099 +:10ba4000a000c483a000c38300a0023c001903002f +:10ba5000d8014224211062000b004290ff004330c5 +:10ba60002100c29325106200ff00433000a0023c79 +:10ba700000210400d8014224211082000b0043a0c1 +:10ba8000062f400b00000000a000c483a000c38369 +:10ba900000a0023c00190300d801422421106200da +:10baa0000b004290ff004230201c027c2100c28328 +:10bab000271002002014027c241062002014027c53 +:10bac000ff00433000a0023c00210400d8014224c2 +:10bad000211082000b0043a0062f400b0000000045 +:10bae000a400c393020002240500621400000000b9 +:10baf000ac00c2976400422c090040140000000012 +:10bb0000a400c393050002243e006214000000005c +:10bb1000ac00c2972100422c3a0040100000000007 +:10bb20002800c3276c000224212060002128000087 +:10bb300021304000fa89400f00000000a000c293ad +:10bb40002800c2a3a000c38300a0023c0019030088 +:10bb5000d80142242110620006004294ffff4230c7 +:10bb60002a00c2a7a400c2932900c2a3ac00c297b6 +:10bb70002c00c2afac00c2972800c3270800632482 +:10bb800021206000a800c58f213040000e87400fa3 +:10bb9000000000002800c2271000a0af1400a0afd2 +:10bba0001800a0af020004245100052421304000f9 +:10bbb0006c0007249b49400f000000002000c2a336 +:10bbc0002000c383fdff0224120062140000000065 +:10bbd0002800c2271000a0af1400a0af1800a0af2b +:10bbe00002000424d1000524213040006c00072409 +:10bbf0009b49400f000000002000c2a3062f400b0d +:10bc000000000000faff02242000c2a3062f400b10 +:10bc100000000000000000002000c28321e8c003f3 +:10bc20009c00bf8f9800be8fa000bd270800e003d6 +:10bc300000000000c0ffbd273c00bfaf3800beaf12 +:10bc400021f0a003214080002120a0002118c00085 +:10bc50004c00c7af5000c28f4000c8a34400c4a32b +:10bc60004800c3a33000c2a7faff02242000c2a3e9 +:10bc70004000c2835a004004000000004000c2831c +:10bc80000c00422856004010000000004c00c28ffb +:10bc900053004010000000004000c38300a0023c9d +:10bca00000190300d8014224211062000a004290ca +:10bcb000ff0043300100022449006214000000002c +:10bcc0004400c393ff0002240c0062140000000033 +:10bcd0004000c4834800c3933000c297212860000d +:10bce0004c00c68f21384000132e400f000000008a +:10bcf0002000c2a3782f400b000000004400c39333 +:10bd0000020002240c006214000000004000c48302 +:10bd10004800c3933000c297212860004c00c68fb2 +:10bd200021384000502e400f000000002000c2a328 +:10bd3000782f400b000000004400c3930100022450 +:10bd400027006214000000003000c39704000224a2 +:10bd500023006214000000004f0002242100c2a34f +:10bd60004800c2932900c2a34000c2932800c2a386 +:10bd70004c00c28f0000428c2400c2af4000c3833d +:10bd800000a0023c00190300d801422421106200e7 +:10bd900006004294ffff42302a00c2a72100c3934d +:10bda0002400c2271000a0af1400a0af1800a0af5d +:10bdb00002000424212860002130400008000724ec +:10bdc0009b49400f000000002000c2a32000c28356 +:10bdd0000300401000000000f7ff02242000c2a36f +:10bde0002000c28321e8c0033c00bf8f3800be8f13 +:10bdf0004000bd270800e00300000000f8ffbd2759 +:10be00000400beaf21f0a0032118a0002110c00043 +:10be10001400c7af0800c4a30c00c3a31000c2a342 +:10be2000faff022421e8c0030400be8f0800bd27ea +:10be30000800e00300000000c8ffbd273400bfafca +:10be40003000beaf21f0a0033800c4af2110a00025 +:10be50004000c6af3c00c2a3f1ff02242000c2a3f1 +:10be60003800c28f1c004010000000004000c28f4c +:10be70001900401000000000010002242c00c2a79d +:10be80003800c28f2400c2afac80828f01004224f0 +:10be9000ac8082afac80828f2800c2af3c00c293de +:10bea0002e00c2a34000c28fa88082af2400c22708 +:10beb0001000a0af1400a0af1800a0af020004242f +:10bec00052000524213040000c0007249b49400ffc +:10bed000000000002000c2a32000c28321e8c003ac +:10bee0003400bf8f3000be8f3800bd270800e0034c +:10bef00000000000b0ffbd274c00bfaf4800beaf40 +:10bf000021f0a003211080005400c5af5000c2a34f +:10bf1000faff02241800c2a35000c2835c00400450 +:10bf2000000000005000c283070042285800401063 +:10bf3000000000005400c28f5500401000000000b7 +:10bf40005400c48f6887400f000000001900c2a38e +:10bf50001900c2934e004010000000001900c29367 +:10bf60001e00422c4a004010000000002400c0af18 +:10bf70002800c0af2c00c0af3000c0af3400c0af4d +:10bf80003800c0af3c00c0af4000c0af1900c29342 +:10bf9000030042242400c327211062001c00c2af0a +:10bfa0002000c0a32400c227030042241900c39329 +:10bfb000212040005400c58f213060000e87400fc3 +:10bfc000000000001900c293010042241900c2a31e +:10bfd0001900c2932500c2a3200002242600c2a398 +:10bfe0000e30400b000000001c00c28fffff4224f7 +:10bff0001c00c2af1c00c28f00004390200002242e +:10c000000a006214000000002000c2931f004010cc +:10c01000000000001c00c28f2000c393000043a05a +:10c020002000c0a30e30400b000000002000c2938f +:10c03000010042242000c2a31900c2932b10020069 +:10c04000ff0042301900c393ffff63241900c3a30c +:10c05000e5ff4014000000005000c3832400c22705 +:10c06000200004241000a4af212060000200052459 +:10c0700005000624213840000d2f400f000000006d +:10c080001800c2a32430400b000000000000000094 +:10c090001800c28321e8c0034c00bf8f4800be8f48 +:10c0a0005000bd270800e00300000000f8ffbd2796 +:10c0b0000400beaf21f0a003211080000800c2a33d +:10c0c0000800c2830700422804004010000000005e +:10c0d0000800c2830400410400000000faff0224ab +:10c0e0005830400b000000000800c38300a0023c51 +:10c0f00000190300d8014224211062000b00429075 +:10c10000ff004230010042300a00401000000000f1 +:10c110000800c38300a0023c00190300d801422498 +:10c12000211062000a004290ff00423004004014d7 +:10c1300000000000faff02245830400b000000000d +:10c140000800c38300a0023c00190300d801422468 +:10c15000211062000d004290ff0042302014027c4a +:10c1600021e8c0030400be8f0800bd270800e003db +:10c1700000000000f8ffbd270400beaf21f0a003bf +:10c18000a6808293ff00423021e8c0030400be8fe6 +:10c190000800bd270800e00300000000f8ffbd27ed +:10c1a0000400beaf21f0a003211080000c00c5af39 +:10c1b0000800c2a30800c2830700422807004010fd +:10c1c000000000000800c2830400400400000000da +:10c1d0000c00c28f0400401400000000faff02248b +:10c1e0009a30400b000000000800c38300a0023c0e +:10c1f00000190300d8014224211062000a00429075 +:10c20000ff0042300400401400000000faff022446 +:10c210009a30400b000000000800c38300a0023cdd +:10c2200000190300d8014224211062000e00429040 +:10c23000ff004230211840000c00c28f000043acc8 +:10c240000800c38300a0023c00190300d801422467 +:10c25000211062000f004290ff0043300c00c28f9b +:10c26000040043a02110000021e8c0030400be8f99 +:10c270000800bd270800e00300000000d8ffbd272c +:10c280002400bfaf2000beaf21f0a0032800c4af40 +:10c290002c00c5af2c00c28fc48082af01000224e5 +:10c2a000d08082af2c00c28f1800c2a32c00c28f96 +:10c2b000021202001900c2a32c00c28f0214020055 +:10c2c0001a00c2a32c00c28f021602001b00c2a3d8 +:10c2d0002c00c28fff0045302c00c28f02120200da +:10c2e000ff0043302c00c28f02140200ff004230d6 +:10c2f0002c00c48f022604001000a4af029d043c51 +:10c30000281184242130600021384000438c400fe4 +:10c3100000000000029d023c441144242800c58f07 +:10c32000438c400f0000000021e8c0032400bf8fb1 +:10c330002000be8f2800bd270800e0030000000099 +:10c34000d0ffbd272c00bfaf2800beaf21f0a00357 +:10c35000211880002110a0003800c6af3000c3a310 +:10c360003400c2a33400c2930800432c9e01601025 +:10c370000000000080180200019d023c90c342248e +:10c38000211062000000428c080040000000000004 +:10c39000e8c9009db0c3009da0c4009de8c9009df0 +:10c3a0000cc5009de8c9009d34c7009de8c9009deb +:10c3b0003800c28f1000c2af1000c28f0000428050 +:10c3c00031004014000000003c8082833000c383b1 +:10c3d00008006214000000003c808283212040009d +:10c3e00021280000722a400f000000007a32400b22 +:10c3f000000000003e8082833000c3830800621486 +:10c40000000000003e80828321204000212800009f +:10c41000722a400f000000007a32400b000000003a +:10c42000408082833000c383080062140000000053 +:10c43000408082832120400021280000722a400f82 +:10c44000000000007a32400b00000000428082832e +:10c450003000c3835a0162140000000042808283ce +:10c460002120400021280000722a400f0000000017 +:10c47000029d023c58114424328c400f0000000001 +:10c480007a32400b00000000029d023c74114424eb +:10c49000328c400f000000007a32400b0000000098 +:10c4a0003800c28f1400c2af1400c28f0000428057 +:10c4b0000c004010000000003000c3831400c28f45 +:10c4c00000004280029d043c8011842421286000e9 +:10c4d00021304000438c400f000000007a32400bb6 +:10c4e000000000003e8082833000c3833701621465 +:10c4f0000000000021200000010005241881400fe9 +:10c50000000000007a32400b000000003800c28fab +:10c510001800c2af1800c28f000042807d004004a6 +:10c52000000000003c8082833000c383220062143c +:10c530000000000000a0023cb011442421280000ab +:10c5400000040624fa89400f000000001800c28f82 +:10c55000000042803b8082a33b80828321204000f8 +:10c5600000a0023cb011452400040624213800003c +:10c570008d2c400f00000000029d023ca4114224bb +:10c58000212040005f0005246735400f00000000b7 +:10c59000029d023c04124424328c400f0000000033 +:10c5a00001000424010005241881400f0000000050 +:10c5b0007a32400b000000003e8082833000c3834b +:10c5c0001e0062140000000000a0023cec1944248c +:10c5d00021280000c8000624fa89400f000000004e +:10c5e0001800c28f000042803d8082a33d8082837c +:10c5f0002120400000a0023cec194524c80006247c +:10c60000213800008d2c400f0000000001000424a0 +:10c61000010005241881400f00000000029d023c2b +:10c6200020124224212040000f0005244736400fed +:10c63000000000007a32400b00000000408082833e +:10c640003000c383180062140000000000a0023c08 +:10c65000b00d44242128000000040624fa89400f6c +:10c66000000000001800c28f000042803f8082a3bb +:10c670003f8082832120400000a0023cb00d452471 +:10c6800000040624213800008d2c400f000000001b +:10c69000029d023c30124424328c400f0000000006 +:10c6a0007a32400b00000000428082833000c38356 +:10c6b000c90062140000000000a0023cb015442430 +:10c6c0002128000000040624fa89400f0000000021 +:10c6d0001800c28f00004280418082a34180828383 +:10c6e0002120400000a0023cb0154524000406248f +:10c6f000213800008d2c400f00000000029d023cfc +:10c700004c124424328c400f000000007a32400b5f +:10c71000000000003000c283029d033c68126424c4 +:10c7200021284000438c400f000000007a32400b6b +:10c73000000000003800c28f1c00c2af1c00c28f76 +:10c740000000428c58004010000000001c00c28f06 +:10c750000400428454004018000000003b808283a3 +:10c760003000c38312006214000000003b8082830b +:10c770002120400000a0023cb01145240004062402 +:10c78000213800008d2c400f000000001c00c28fdb +:10c790000400428400a0033cb0116424212840001e +:10c7a0002968400f000000002732400b0000000005 +:10c7b0003d8082833000c3831200621400000000b9 +:10c7c0003d8082832120400000a0023cec194524da +:10c7d000c8000624213800008d2c400f0000000006 +:10c7e0001c00c28f0400428400a0033cec196424a6 +:10c7f000212840000a82400f000000002732400b31 +:10c80000000000003f8082833000c3830b0062146d +:10c81000000000003f8082832120400000a0023cf5 +:10c82000b00d452400040624213800008d2c400f53 +:10c83000000000002732400b00000000418082838e +:10c840003000c38315006214000000004180828321 +:10c850002120400000a0023cb0154524000406241d +:10c86000213800008d2c400f000000000300401014 +:10c8700000000000010002242000c2a31c00c28f9f +:10c880000000438c1c00c28f040042842120600001 +:10c8900021284000f25c400f000000000000000072 +:10c8a0007a32400b000000003b8082833000c3835b +:10c8b00011006214000000003b80828321204000b0 +:10c8c000058d400f00000000ffff02243b8082a383 +:10c8d000029d023c84124424328c400f0000000070 +:10c8e00001000424212800001881400f00000000ee +:10c8f0007a32400b000000003d8082833000c38309 +:10c900000d006214000000003d8082832120400061 +:10c91000058d400f00000000ffff02243d8082a330 +:10c9200001000424212800001881400f00000000ad +:10c930007a32400b000000003f8082833000c383c6 +:10c940000d006214000000003f808283212040001f +:10c95000058d400f00000000ffff02243f8082a3ee +:10c96000029d023ca4124424328c400f00000000bf +:10c970007a32400b00000000418082833000c38384 +:10c9800018006214000000004180828321204000d2 +:10c99000058d400f00000000ffff0224418082a3ac +:10c9a000029d023cc0124424328c400f0000000063 +:10c9b000bc3a400f000000007a32400b000000003b +:10c9c000000000007a32400b000000000000000070 +:10c9d0007a32400b00000000000000007a32400b69 +:10c9e000000000000000000021e8c0032c00bf8f01 +:10c9f0002800be8f3000bd270800e00300000000c3 +:10ca0000f0ffbd270c00beaf21f0a0031000c4afa3 +:10ca10001400c5af0000c2970500422c75004014f9 +:10ca2000000000000000c297ffff42241000c38fe7 +:10ca3000211862001400c28f0500422400004290b9 +:10ca40000f0042300a0042280a0040140000000093 +:10ca50001400c28f05004224000042900f004230b3 +:10ca6000ff00423037004224ff004230a432400b26 +:10ca7000000000001400c28f050042240000429014 +:10ca80000f004230ff00423030004224ff004230ad +:10ca9000000062a00000c297feff42241000c38f76 +:10caa000211862001400c28f050042240000429049 +:10cab00002110200ff0042300f0042300a004228fb +:10cac0000a004014000000001400c28f0500422438 +:10cad0000000429002110200ff0042303700422461 +:10cae000ff004230c232400b000000001400c28f31 +:10caf000050042240000429002110200ff00423073 +:10cb000030004224ff004230000062a00000c297c3 +:10cb1000fcff42241000c38f211862001400c28f52 +:10cb200004004224000042900f0042300a004228d4 +:10cb30000a004014000000001400c28f04004224c8 +:10cb4000000042900f004230ff0042303700422484 +:10cb5000ff004230de32400b000000001400c28fa4 +:10cb600004004224000042900f004230ff00423097 +:10cb700030004224ff004230000062a00000c29753 +:10cb8000fbff42241000c38f211862001400c28fe3 +:10cb9000040042240000429002110200ff004230d3 +:10cba0000f0042300a0042280a0040140000000032 +:10cbb0001400c28f040042240000429002110200bf +:10cbc000ff00423037004224ff004230fc32400b6d +:10cbd000000000001400c28f0400422400004290b4 +:10cbe00002110200ff00423030004224ff004230b8 +:10cbf000000062a021e8c0030c00be8f1000bd271a +:10cc00000800e00300000000c8ffbd273400bfafec +:10cc10003000beaf2c00b0af21f0a0032110800087 +:10cc20003c00c5af3800c2a33800c29332000324d1 +:10cc30003b004310000000003300432876006010e2 +:10cc4000000000000b0003244d0043100000000012 +:10cc50002c00032473004314000000003c00c28f2a +:10cc60001800c2af1800c28f0000439001000224d8 +:10cc70001600621400000000029d023ce0124424f1 +:10cc8000328c400f000000002c81838301000224bd +:10cc90000a0062100000000000a0023cd8194424e1 +:10cca0002e20400f0000000001000224cc8082af43 +:10ccb00000a0023cd819428c3c8182af01000224c2 +:10ccc000dc8082a38d33400b000000001800c28f6f +:10ccd000000042905600401400000000029d023cfb +:10cce000f4124424328c400f00000000cc8080af4e +:10ccf00002000224dc8082a3ae34400f000000005a +:10cd000021200000212800001881400f00000000b1 +:10cd1000ffff02243c8182af8d33400b00000000f6 +:10cd20003c00c28f1c00c2af1c00c28f0000428cae +:10cd30003c8182af3c81828f2000c2a33c81828fe4 +:10cd4000021202002100c2a33c81828f0214020061 +:10cd50002200c2a33c81828f021602002300c2a3dc +:10cd600001000224cc8082af00a0023cd83e4424c3 +:10cd7000e92d400f000000008d33400b0000000043 +:10cd80003c00c28f2400c2af029d023c0813442421 +:10cd9000328c400f000000002400c28f63004290dc +:10cda00017004014000000002400c28f21804000c2 +:10cdb0002400c28f212040006887400f000000003f +:10cdc000ff004230212840002400c28f62004290c0 +:10cdd000211840002400c28f21004224ff000424b7 +:10cde0001000a4af21200002213060002138400053 +:10cdf000531f400f000000008d33400b0000000067 +:10ce0000029d023c30134424328c400f000000008d +:10ce10008d33400b00000000000000008d33400bfc +:10ce200000000000000000008d33400b00000000f7 +:10ce30000000000021e8c0033400bf8f3000be8f27 +:10ce40002c00b08f3800bd270800e0030000000070 +:10ce5000a8ffbd275400bfaf5000beaf21f0a00314 +:10ce6000d48080af0200042401000524e066400f56 +:10ce700000000000ffff02243c8182aff551400f0b +:10ce800000000000c0ff02241800c2a3a8ff022473 +:10ce90001900c2a3320002241a00c2a37a0002249d +:10cea0001b00c2a3c0ff02241c00c2a3a8ff0224cf +:10ceb0001d00c2a3320002241e00c2a301000224ee +:10cec0001f00c2a300a0023c180a4424029d023c99 +:10ced0004c1345240b0006240e87400f0000000071 +:10cee00000a0023cb00c4424029d023c581345248f +:10cef0000f0006240e87400f000000002c8180a345 +:10cf000000a0023cd8194424212800001400062463 +:10cf1000fa89400f000000001b00c28300160200c7 +:10cf2000211840001a00c283001402002120400092 +:10cf3000ff00023c24108200251862001900c28301 +:10cf400000120200ffff4230251862001800c28361 +:10cf5000ff0042302518620000a0023cd81943ac03 +:10cf600000a0023cd81942240808033c0808633496 +:10cf7000080043ac1f00c2830016020021184000c5 +:10cf80001e00c2830014020021204000ff00023c6a +:10cf900024108200251862001d00c28300120200c6 +:10cfa000ffff4230251862001c00c283ff004230a0 +:10cfb0002518620000a0023cd8194224040043acaa +:10cfc00000a0023cd8194224ff00033cffff633459 +:10cfd0000c0043ac2400c22721204000212800007f +:10cfe00018000624fa89400f00000000019d023c51 +:10cff00008cc42242400c2af2400c22721204000d4 +:10d000005f19400f000000002000c2a32000c2836f +:10d010000700401000000000d88080af0300022409 +:10d02000dc8082a3211000008134400b000000004e +:10d0300001000224d88082af02000224dc8082a397 +:10d04000fc28400f00000000019d023c40c3442426 +:10d05000019d023c7cc245242f29400f00000000a6 +:10d060004081842738818527f422400f000000008a +:10d07000388182930400401400000000348084272b +:10d080001320400f00000000348084270f23400f3e +:10d090000000000000a0023cc83e422421204000c5 +:10d0a000348085278032400f0000000000a0023c41 +:10d0b000803e4424348085278032400f00000000e9 +:10d0c0002c8183830100022406006214000000000a +:10d0d000010004245320400f000000003c34400baa +:10d0e00000000000212000005320400f000000003d +:10d0f00000a0023cb00c44246887400f00000000f0 +:10d10000ff004230ff0003241000a3af00a0033c47 +:10d11000b00c6424212840000200062400a0023c38 +:10d12000180a4724531f400f00000000050040105c +:10d1300000000000029d023c68134424438c400f11 +:10d14000000000003c00c22721204000f880400f72 +:10d150000000000021200000010005240281400f92 +:10d160000000000001000424010005240281400f9a +:10d170000000000002000424010005240281400f89 +:10d180000000000003000424212800000281400f59 +:10d190000000000004000424212800000281400f48 +:10d1a0000000000021200000212800001881400f0d +:10d1b0000000000001000424212800001881400f15 +:10d1c0000000000002000424212800001881400f04 +:10d1d0000000000003000424212800001881400ff3 +:10d1e0000000000004000424212800001881400fe2 +:10d1f000000000000200042410270524e066400f10 +:10d200000000000021e8c0035400bf8f5000be8f13 +:10d210005800bd270800e00300000000e0ffbd2724 +:10d220001c00bfaf1800beaf21f0a003ae34400f0a +:10d23000000000001829400f000000000020400fef +:10d24000000000001000c227212040007619400f86 +:10d250000000000088bf033c2061628c8410027cc7 +:10d26000206162ac88bf033c2061628c0421027c97 +:10d27000206162acd88080afcc8080af88bf033c97 +:10d280002061628c010004248431827c206162acc4 +:10d29000ffff02243c8182afdc8080a301000224d6 +:10d2a00021e8c0031c00bf8f1800be8f2000bd27df +:10d2b0000800e00300000000e8ffbd271400bfaf36 +:10d2c0001000beaf21f0a003d48080af3c808283e9 +:10d2d00021204000058d400f000000003b8083832b +:10d2e000ffff022405006210000000003b808283e3 +:10d2f00021204000058d400f000000004080828307 +:10d3000021204000058d400f000000003f808383f6 +:10d31000ffff022405006210000000003f808283ae +:10d3200021204000058d400f000000003e808283d8 +:10d3300021204000058d400f000000003d808383c8 +:10d34000ffff022405006210000000003d80828380 +:10d3500021204000058d400f0000000042808283a4 +:10d3600021204000058d400f000000004180838394 +:10d37000ffff02240500621000000000418082834c +:10d3800021204000058d400f0000000021e8c0036f +:10d390001400bf8f1000be8f1800bd270800e003e7 +:10d3a00000000000f8ffbd270400beaf21f0a0037d +:10d3b000dc80828321e8c0030400be8f0800bd2703 +:10d3c0000800e00300000000f8ffbd270400beaf26 +:10d3d00021f0a0033c81828f21e8c0030400be8fae +:10d3e0000800bd270800e00300000000e0ffbd27a3 +:10d3f0001c00bfaf1800beaf21f0a003d880828f01 +:10d400003000401000000000dc8083830200022412 +:10d410001c00621400000000cc80828f19004014b0 +:10d420000000000002000424f365400f000000002b +:10d43000140040100000000000a0023cb00c442486 +:10d440006887400f00000000ff004230ff00032407 +:10d450001000a3af00a0033cb00c642421284000be +:10d460000200062400a0023c180a4724531f400f64 +:10d47000000000000200042410270524e066400f8d +:10d4800000000000de19400f00000000cc80828ff9 +:10d490000d00401000000000d480828f0a0040146c +:10d4a000000000003835400f000000001836400f23 +:10d4b0000000000001000224d48082af3235400b0e +:10d4c000000000000000000021e8c0031c00bf8f26 +:10d4d0001800be8f2000bd270800e00300000000f8 +:10d4e000d0ffbd272c00bfaf2800beaf21f0a003a6 +:10d4f0000200042401000524213000005329400fbc +:10d50000000000003c8082a3550002241000c2a746 +:10d510003c8082831a0040040000000002000224c4 +:10d520001400c2a71000c29700120200201e027c45 +:10d530001000c29702120200ffff42302016027c48 +:10d54000251062002016027cffff42301600c2a7a1 +:10d550001800c0af3c808283211840001400c2270d +:10d56000212060002128400010000624232a400fbb +:10d5700000000000010002246135400b00000000a3 +:10d580002110000021e8c0032c00bf8f2800be8faf +:10d590003000bd270800e00300000000e8ffbd27c1 +:10d5a0001400bfaf1000beaf21f0a0031800c4af3d +:10d5b0001c00c5af3b808383ffff02241300621071 +:10d5c000000000003b808283211840001c00c28fb5 +:10d5d000ffff4230212060001800c58f213040003d +:10d5e00021380000a42b400f000000003b80828304 +:10d5f0002120400000a0023cb01145240004062474 +:10d60000213800008d2c400f0000000021e8c003ed +:10d610001400bf8f1000be8f1800bd270800e00364 +:10d6200000000000e8ffbd271400bfaf1000beaf30 +:10d6300021f0a003211080001800c2a33b80838347 +:10d64000ffff022410006210000000003b80828374 +:10d65000212040001800c5270100062421380000c1 +:10d66000a42b400f000000003b808283212040005b +:10d6700000a0023cb011452400040624213800001b +:10d680008d2c400f0000000021e8c0031400bf8f64 +:10d690001000be8f1800bd270800e0030000000046 +:10d6a000d0ffbd272c00bfaf2800beaf21f0a003e4 +:10d6b0000200042401000524213000005329400ffa +:10d6c00000000000408082a3560002241000c2a780 +:10d6d000408082831a0040040000000002000224ff +:10d6e0001400c2a71000c29700120200201e027c84 +:10d6f0001000c29702120200ffff42302016027c87 +:10d70000251062002016027cffff42301600c2a7df +:10d710001800c0af40808283211840001400c22747 +:10d72000212060002128400010000624232a400ff9 +:10d730000000000001000224d135400b0000000071 +:10d740002110000021e8c0032c00bf8f2800be8fed +:10d750003000bd270800e00300000000e8ffbd27ff +:10d760001400bfaf1000beaf21f0a0031800c4af7b +:10d770001c00c5af3f808383ffff022413006210ab +:10d78000000000003f808283211840001c00c28fef +:10d79000ffff4230212060001800c58f213040007b +:10d7a00021380000a42b400f000000003f8082833e +:10d7b0002120400000a0023cb011452400040624b2 +:10d7c000213800008d2c400f0000000021e8c0032c +:10d7d0001400bf8f1000be8f1800bd270800e003a3 +:10d7e00000000000e8ffbd271400bfaf1000beaf6f +:10d7f00021f0a003211080001800c2a33f80838382 +:10d80000ffff022410006210000000003f808283ae +:10d81000212040001800c5270100062421380000ff +:10d82000a42b400f000000003f8082832120400095 +:10d8300000a0023cb0114524000406242138000059 +:10d840008d2c400f0000000021e8c0031400bf8fa2 +:10d850001000be8f1800bd270800e0030000000084 +:10d86000d0ffbd272c00bfaf2800beaf21f0a00322 +:10d870000200042401000524213000005329400f38 +:10d88000000000003e8082a3570002241000c2a7bf +:10d890003e8082831a00400400000000020002243f +:10d8a0001400c2a71000c29700120200201e027cc2 +:10d8b0001000c29702120200ffff42302016027cc5 +:10d8c000251062002016027cffff42301600c2a71e +:10d8d0001800c0af3e808283211840001400c22788 +:10d8e000212060002128400010000624232a400f38 +:10d8f00000000000010002244136400b000000003f +:10d900002110000021e8c0032c00bf8f2800be8f2b +:10d910003000bd270800e00300000000e8ffbd273d +:10d920001400bfaf1000beaf21f0a0031800c4afb9 +:10d930001c00c5af3d808283211840001c00c28faf +:10d94000ffff4230212060001800c58f21304000c9 +:10d9500021380000a42b400f000000003d8082838e +:10d960002120400000a0023cec194524c8000624f8 +:10d97000213800008d2c400f0000000021e8c0037a +:10d980001400bf8f1000be8f1800bd270800e003f1 +:10d9900000000000e8ffbd271400bfaf1000beafbd +:10d9a00021f0a003211080001800c2a33d808383d2 +:10d9b000ffff022410006210000000003d808283ff +:10d9c000212040001800c52701000624213800004e +:10d9d000a42b400f000000003d80828321204000e6 +:10d9e00000a0023cec194524c800062421380000a0 +:10d9f0008d2c400f0000000021e8c0031400bf8ff1 +:10da00001000be8f1800bd270800e00300000000d2 +:10da1000f8ffbd270400beaf21f0a0033d80838343 +:10da2000ffff022404006214000000002110000027 +:10da30008f36400b000000000100022421e8c003e3 +:10da40000400be8f0800bd270800e00300000000ae +:10da5000d0ffbd272c00bfaf2800beaf21f0a00330 +:10da60000200042401000524213000005329400f46 +:10da700000000000428082a3630002241000c2a7bd +:10da8000428082831a004004000000000200022449 +:10da90001400c2a71000c29700120200201e027cd0 +:10daa0001000c29702120200ffff42302016027cd3 +:10dab000251062002016027cffff42301600c2a72c +:10dac0001800c0af42808283211840001400c22792 +:10dad000212060002128400010000624232a400f46 +:10dae0000000000001000224bd36400b00000000d1 +:10daf0002110000021e8c0032c00bf8f2800be8f3a +:10db00003000bd270800e00300000000e8ffbd274b +:10db10001400bfaf1000beaf21f0a003428082838b +:10db200021204000058d400f00000000ffff02246f +:10db3000428082a341808383ffff0224070062109a +:10db4000000000004180828321204000058d400fad +:10db500000000000ffff0224418082a321e8c003ef +:10db60001400bf8f1000be8f1800bd270800e0030f +:10db700000000000e8ffbd271400bfaf1000beafdb +:10db800021f0a0031800c4af1c00c5af4180828300 +:10db9000211840001c00c28fffff4230212060008e +:10dba0001800c58f2130400021380000a42b400f01 +:10dbb00000000000418082832120400000a0023c40 +:10dbc000ec194524c8000624213800008d2c400f94 +:10dbd0000000000021e8c0031400bf8f1000be8fba +:10dbe0001800bd270800e00300000000e8ffbd2783 +:10dbf0001400bfaf1000beaf21f0a00321108000c1 +:10dc00001800c2a341808383ffff0224100062102a +:10dc10000000000041808283212040001800c527b9 +:10dc20000100062421380000a42b400f0000000052 +:10dc3000418082832120400000a0023cec19452451 +:10dc4000c8000624213800008d2c400f0000000081 +:10dc500021e8c0031400bf8f1000be8f1800bd273d +:10dc60000800e00300000000f8ffbd270400beaf7d +:10dc700021f0a00341808383ffff0224040062148b +:10dc800000000000211000002537400b00000000bc +:10dc90000100022421e8c0030400be8f0800bd2754 +:10dca0000800e00300000000e8ffbd271400bfaf3c +:10dcb0001000beaf21f0a003925b400f00000000f7 +:10dcc000953a400f00000000f53b400f00000000b7 +:10dcd0002120000021280000eb83400f00000000fd +:10dce0000100022421e8c0031400bf8f1000be8f82 +:10dcf0001800bd270800e00300000000e8ffbd2772 +:10dd00001400bfaf1000beaf21f0a003212000001f +:10dd1000212800001038400f0000000021e8c00357 +:10dd20001400bf8f1000be8f1800bd270800e0034d +:10dd300000000000e0ffbd271c00bfaf1800beaf11 +:10dd400021f0a003211080002400c5af2000c2a351 +:10dd5000995d400f000000001000c2af2400c28f88 +:10dd60000b00401400000000029d023ce4c9442462 +:10dd7000328c400f0000000001000424070005243d +:10dd80001038400f00000000f037400b000000008a +:10dd90002000c2831b00432c85006010000000009f +:10dda00080180200019d023cbcdd4224211062006b +:10ddb0000000428c0800400000000000bcdf009d15 +:10ddc000bcdf009d28de009dbcdf009d5cde009d69 +:10ddd000bcdf009dbcdf009d84de009dbcdf009d9c +:10dde000acde009dbcdf009dbcdf009dd8de009d49 +:10ddf000bcdf009df0de009dbcdf009d18df009db4 +:10de0000bcdf009d40df009dbcdf009dbcdf009dae +:10de1000bcdf009dbcdf009dbcdf009d60df009d7e +:10de2000bcdf009d88df009d029d023c14ca442493 +:10de3000328c400f000000001000c28f010003244c +:10de4000000043a00300042401000524265d400fc8 +:10de500000000000f037400b00000000029d023c73 +:10de600034ca4424328c400f000000000100042416 +:10de7000020005241038400f00000000f037400b6e +:10de800000000000029d023c60ca4424328c400f16 +:10de90000000000001000424030005241038400f96 +:10dea00000000000f037400b00000000029d023c23 +:10deb00080ca4424328c400f000000007c81828f95 +:10dec0002014027c21204000725e400f0000000000 +:10ded000f037400b0000000001000424040005247a +:10dee0001038400f00000000f037400b0000000029 +:10def000029d023ca0ca4424328c400f0000000066 +:10df000001000424050005241038400f0000000023 +:10df1000f037400b00000000029d023cc4ca4424bc +:10df2000328c400f0000000001000424060005248c +:10df30001038400f00000000f037400b00000000d8 +:10df4000029d023ce8ca4424328c400f00000000cd +:10df500001000424010005241038400f00000000d7 +:10df6000029d023c0ccb4424328c400f0000000088 +:10df700001000424080005241038400f00000000b0 +:10df8000f037400b00000000029d023c0ccb442403 +:10df9000328c400f00000000010004240900052419 +:10dfa0001038400f00000000f037400b0000000068 +:10dfb00000000000f037400b0000000000000000ef +:10dfc00021e8c0031c00bf8f1800be8f2000bd27b2 +:10dfd0000800e00300000000e8ffbd271400bfaf09 +:10dfe0001000beaf21f0a003211080001c00c5afbf +:10dff0002000c6af1800c2a31800c283029d033cd4 +:10e000003ccb6424212840001c00c68f2000c78f11 +:10e01000438c400f00000000010004240700052489 +:10e020001038400f0000000021e8c0031400bf8f2b +:10e030001000be8f1800bd270800e003000000009c +:10e04000b8ffbd274400bfaf4000beaf21f0a00322 +:10e050004800c4af4c00c5af7c81828f0600432cc2 +:10e06000760260100000000080180200019d023c52 +:10e0700084e04224211062000000428c080040002d +:10e08000000000009ce0009d00e1009d54e4009d24 +:10e09000d4e5009de8e8009d70e9009d4800c28f2e +:10e0a00001000324080043100000000002000324c4 +:10e0b0001000431000000000530240140000000054 +:10e0c0003e38400b000000004c00c28f0700401497 +:10e0d00000000000010002247c8182af029d023c0e +:10e0e0008ccb4424328c400f000000003e38400ba3 +:10e0f00000000000000000008f3a400b000000000c +:10e100004800c28f010003240800431000000000f3 +:10e1100002000324cc004310000000003d02401424 +:10e12000000000001339400b000000004c00c28fbb +:10e130000a00422cbc004010000000004c00c28fbe +:10e1400080180200019d023c5ce142242110620023 +:10e150000000428c080040000000000028e4009d00 +:10e1600010e2009d84e1009db8e1009d28e4009d3f +:10e1700028e4009d30e2009d28e4009dd8e2009d47 +:10e1800018e3009d553b400f0000000005000424eb +:10e19000b45d400f00000000020002247c8182afc9 +:10e1a000029d023cbccb4424328c400f0000000096 +:10e1b0001039400b000000006481828f060040147b +:10e1c0000000000002000424dd5d400f000000009c +:10e1d0008238400b0000000001000424dd5d400f88 +:10e1e000000000000b000424b45d400f000000009c +:10e1f000030002247c8182af029d023cf0cb4424c8 +:10e20000328c400f000000001039400b000000006d +:10e21000029d023c24cc4424328c400f00000000bc +:10e22000953a400f000000001039400b000000003c +:10e23000f53b400f000000002118400001000224bf +:10e240001c0062140000000011000424b45d400fa3 +:10e2500000000000029d023c50cc4424328c400f50 +:10e2600000000000010002242000c2a3a8ff022435 +:10e270002100c2a32000c227212040000200052463 +:10e28000213000006a54400f0000000064000424a4 +:10e290009667400f000000008734400f0000000028 +:10e2a000640004249667400f00000000e68a400fd7 +:10e2b0000000000011000424c95d400f00000000b0 +:10e2c000029d023c7ccc4424328c400f00000000b4 +:10e2d0001039400b00000000f53b400f000000002b +:10e2e0002118400001000224060062140000000012 +:10e2f00001000424a45e400f00000000c438400b5d +:10e300000000000021200000a45e400f000000007b +:10e310001039400b000000002400c22721204000db +:10e32000ff00052415000624fa89400f00000000b4 +:10e33000f53b400f000000002118400001000224be +:10e3400004006210000000002400c0a30339400b49 +:10e3500000000000010002242400c2a32400c22700 +:10e360000100432400a0023cd808428c2120600018 +:10e3700021284000fc3c400f000000002400c22780 +:10e380000500432400a0023cd80842240400428c2b +:10e390002120600021284000fc3c400f00000000cc +:10e3a0002400c2270900432400a0023cd8084224cc +:10e3b0000800428c2120600021284000fc3c400fd6 +:10e3c000000000002400c2270d00432400a0023cee +:10e3d000d80842240c00428c2120600021284000f3 +:10e3e000fc3c400f000000002400c2271100432421 +:10e3f00000a0023cd80842241000428c212060007a +:10e4000021284000fc3c400f000000002400c227ef +:10e410002120400015000524bd5e400f00000000d3 +:10e420001039400b000000004c00c28fff0042304a +:10e4300021204000c95d400f0000000000000000e6 +:10e440001339400b00000000000000008f3a400b21 +:10e45000000000004800c28f010003244300431065 +:10e4600000000000020003245700431000000000d9 +:10e470006b0140140000000021200000c83a400f4a +:10e48000000000001000c2af1000c28f0100032482 +:10e490001200431000000000020043280500601035 +:10e4a000000000000b004010000000005939400b34 +:10e4b00000000000020003241500431000000000cb +:10e4c000030003241d004310000000005939400bd5 +:10e4d000000000005939400b00000000029d023c82 +:10e4e000b8cc4424328c400f000000000600042405 +:10e4f000b45d400f00000000010002247c8182af67 +:10e5000001000224648182af5939400b00000000f1 +:10e51000029d023cfccc4424328c400f00000000e1 +:10e5200006000424c95d400f000000000100022421 +:10e530007c8182af5939400b00000000029d023cf3 +:10e5400040cd4424328c400f00000000060004241b +:10e55000c95d400f00000000010002247c8182aff1 +:10e56000000000007339400b000000004c00c38f16 +:10e57000010002240c0062140000000001000424c9 +:10e58000c83a400f00000000029d023c84cd4424a4 +:10e59000328c400f00000000953a400f0000000050 +:10e5a0007039400b000000004c00c28fff00423069 +:10e5b00021204000c95d400f000000000000000065 +:10e5c0007339400b00000000000000008f3a400b40 +:10e5d000000000004800c28f010003243f004310e8 +:10e5e0000000000002000324bc00431000000000f3 +:10e5f0000e0140140000000021200000623b400f8b +:10e60000000000001400c2af1400c28f01000324f8 +:10e6100012004310000000000200432805006010b3 +:10e62000000000000b00401000000000b539400b56 +:10e630000000000002000324180043100000000046 +:10e64000030003242200431000000000b539400bf2 +:10e6500000000000b539400b000000008c81828f63 +:10e660000100042421284000355e400f0000000016 +:10e670008c81828f029d033cb4cd6424212840000c +:10e68000438c400f000000008c81828f01004224e7 +:10e690008c8182afb539400b000000008c81828fe5 +:10e6a0000500042421284000355e400f00000000d2 +:10e6b000953a400f00000000029d023ce8cd442442 +:10e6c000328c400f00000000b539400b0000000004 +:10e6d00000000000383a400b000000004c00c28fe0 +:10e6e000040003241100431000000000050043282b +:10e6f00006006010000000000100032469004310c0 +:10e7000000000000343a400b000000000500032424 +:10e7100045004310000000000700032435004310ab +:10e7200000000000343a400b000000001800c0afa9 +:10e730001c00c0af1c00c0af00a0023ca82c4424a9 +:10e74000ce3c400f000000001800c2af00a0023c09 +:10e75000ac2c4424ce3c400f000000001c00c2af93 +:10e7600000a0023ca82c422408004224608182af11 +:10e770008c81828f211840001800c28f1100621016 +:10e78000000000008c81828f0400042421284000b6 +:10e79000355e400f000000008c81828f029d033c9b +:10e7a0002cce64241800c58f21304000438c400fcc +:10e7b00000000000be3c400f00000000fb39400b91 +:10e7c000000000001c00c28f588182af01000424a9 +:10e7d000623b400f00000000029d023c8cce4424ae +:10e7e0001800c58f438c400f00000000353a400be5 +:10e7f000000000008c81828f020004242128400048 +:10e80000355e400f000000008c81828f029d033c2a +:10e81000d4ce642421284000438c400f0000000027 +:10e82000353a400b00000000029d023c20cf4424fa +:10e83000328c400f00000000f53b400f000000004c +:10e8400021184000010002240a00621400000000a8 +:10e85000010002247c8182af010004248b5e400f02 +:10e860000000000001000224888182af273a400b9b +:10e8700000000000029d023c68cf4424328c400f0f +:10e8800000000000020004248b5e400f0000000026 +:10e89000953a400f00000000888180af353a400b68 +:10e8a00000000000029d023ca8cf4424328c400f9f +:10e8b0000000000002000424623b400f0000000042 +:10e8c000953a400f00000000353a400b0000000070 +:10e8d00000000000383a400b00000000000000007b +:10e8e0008f3a400b000000004800c28f0100032453 +:10e8f0000800431000000000020003241900431028 +:10e90000000000004c004014000000005a3a400b88 +:10e91000000000004c00c38f0100022409006214b3 +:10e9200000000000029d023c24cc4424328c400fa5 +:10e9300000000000953a400f00000000573a400bdd +:10e94000000000004c00c28fff0042302120400038 +:10e95000c95d400f00000000000000005a3a400b63 +:10e9600000000000000000008f3a400b0000000093 +:10e970004800c28f0100032408004310000000007b +:10e980000200032419004310000000001a00401088 +:10e99000000000008f3a400b000000004c00c38fc5 +:10e9a000010002240900621400000000029d023ce4 +:10e9b00024cc4424328c400f00000000953a400fd4 +:10e9c00000000000793a400b000000004c00c28fac +:10e9d000ff00423021204000c95d400f00000000d0 +:10e9e000000000007f3a400b000000000000000023 +:10e9f0007f3a400b00000000000000000000000013 +:10ea00008f3a400b00000000000000008f3a400bde +:10ea100000000000000000008f3a400b00000000e2 +:10ea2000000000008f3a400b0000000000000000d2 +:10ea30008f3a400b000000000000000021e8c003f6 +:10ea40004400bf8f4000be8f4800bd270800e00390 +:10ea500000000000e8ffbd271400bfaf1000beafec +:10ea600021f0a0037c8180af808180af8c8180af5a +:10ea7000888180af8c8180af888180af588180afe2 +:10ea8000553b400f00000000be3c400f000000005e +:10ea9000c336400f0000000021e8c0031400bf8f00 +:10eaa0001000be8f1800bd270800e0030000000022 +:10eab000e8ffbd271400bfaf1000beaf21f0a003d8 +:10eac0009436400f000000000100042421280000bb +:10ead0001038400f0000000021e8c0031400bf8f71 +:10eae0001000be8f1800bd270800e00300000000e2 +:10eaf000e8ffbd271400bfaf1000beaf21f0a00398 +:10eb0000953a400f0000000021e8c0031400bf8fb9 +:10eb10001000be8f1800bd270800e00300000000b1 +:10eb2000e8ffbd271400bfaf1000beaf21f0a00367 +:10eb30001800c4af1800c38f01000224060062143d +:10eb400000000000553b400f0000000003000224bd +:10eb50004f3b400b000000007081828f0500432c6a +:10eb6000750060100000000080180200019d023c4a +:10eb700084eb4224211062000000428c0800400017 +:10eb80000000000098eb009d04ec009d28ed009d26 +:10eb900010ed009d1ced009d7481828f21204000ae +:10eba000212800005153400f000000000c004014c9 +:10ebb000000000007481828f029d033ceccf64242e +:10ebc00021284000438c400f000000000400022474 +:10ebd000708182af020002244f3b400b0000000016 +:10ebe000848180af0500042419000524e066400fed +:10ebf0000000000001000224708182af4e3b400bf8 +:10ec00000000000005000424f365400f0000000030 +:10ec10002118400001000224460062140000000098 +:10ec20004152400f0000000021004014000000008d +:10ec30007481838f1f00023c0e00621400000000ec +:10ec40007481838f8481828f029d043c18d0842438 +:10ec50002128600021304000438c400f000000005c +:10ec600003000224708182af010002244f3b400b5d +:10ec7000000000007481838f8481828f029d043c98 +:10ec800058d084242128600021304000438c400f5c +:10ec9000000000007481838f0100023c211062009b +:10eca000748182af708180af4e3b400b000000004a +:10ecb0008481828f280042280c004014000000004c +:10ecc0008481828f029d033c90d0642421284000df +:10ecd000438c400f0000000004000224708182afca +:10ece000020002244f3b400b0000000005000424fa +:10ecf00019000524e066400f000000008481828f27 +:10ed000001004224848182af4e3b400b0000000092 +:10ed1000010002244f3b400b0000000002000224cf +:10ed20004f3b400b00000000000000004e3b400b3a +:10ed300000000000000000002110000021e8c003d6 +:10ed40001400bf8f1000be8f1800bd270800e0031d +:10ed500000000000f8ffbd270400beaf21f0a003b3 +:10ed6000708180af1800023c748182af848180afd3 +:10ed7000648180af21e8c0030400be8f0800bd2776 +:10ed80000800e00300000000e0ffbd271c00bfaf4b +:10ed90001800beaf21f0a0032000c4af6881828fad +:10eda0000600432c7b006010000000008018020069 +:10edb000019d023cc8ed4224211062000000428cfb +:10edc0000800400000000000e0ed009d14ee009df2 +:10edd00038ef009d6cef009d54ef009d60ef009dab +:10ede0002000c28f64004010000000002000c38f8c +:10edf00001000224630062140000000001000224ec +:10ee0000688182af5c8180af21100000e73b400b3e +:10ee1000000000006081828f3c0040140000000070 +:10ee2000be3c400f0000000002000224e73b400b04 +:10ee3000000000006c81828f2120400001004224ec +:10ee40006c8182af6081828f000043800100422488 +:10ee5000608182af21286000010006241554400f14 +:10ee6000000000000a00401400000000029d023c67 +:10ee7000dcd04424328c400f000000000500022446 +:10ee8000688182af02000224e73b400b00000000d3 +:10ee90001000c0afa83b400b0000000000000000c5 +:10eea0004152400f00000000060040140000000026 +:10eeb0005c81828f010042245c8182afc43b400ba5 +:10eec000000000001000c28fc90042280100423833 +:10eed000ff0042301000c38f010063241000c3af55 +:10eee000eeff401000000000029d023c18d14424b7 +:10eef000328c400f0000000005000224688182afc0 +:10ef000002000224e73b400b00000000000000006c +:10ef10005c81838f5881828f2a106200c5ff401464 +:10ef20000000000002000224688182af211000006e +:10ef3000e73b400b000000002000c28f140040148b +:10ef400000000000688180af01000224e73b400b15 +:10ef50000000000001000224e73b400b000000001d +:10ef600002000224e73b400b00000000000000000c +:10ef7000e53b400b0000000000000000e53b400bbb +:10ef80000000000000000000e53b400b0000000016 +:10ef900000000000e73b400b0000000021e8c00338 +:10efa0001c00bf8f1800be8f2000bd270800e003a3 +:10efb00000000000f8ffbd270400beaf21f0a00351 +:10efc00021e8c0030400be8f0800bd270800e0034d +:10efd00000000000f0fcbd270c03bfaf0803beaf6c +:10efe00021f0a0031800023c1000c2afffff022472 +:10eff0001400c2af029d023c64d14424328c400f05 +:10f00000000000001000c28f4800c32721206000cc +:10f010001800052421304000a752400f00000000d6 +:10f020004800c22721204000ce3c400f00000000d5 +:10f030002000c2af4800c227040042242120400023 +:10f04000ce3c400f000000002400c2af4800c227a1 +:10f050000800422421204000ce3c400f0000000068 +:10f060002800c2af4800c2270c00422421204000e3 +:10f07000ce3c400f000000002c00c2af4800c22769 +:10f080001000422421204000ce3c400f0000000030 +:10f090003000c2af4800c2271400422421204000a3 +:10f0a000ce3c400f000000003400c2af00a0023c84 +:10f0b0002400c38fd80843ac00a0023cd8084224e7 +:10f0c0002800c38f040043ac00a0023cd8084224af +:10f0d0002c00c38f080043ac00a0023cd808422497 +:10f0e0003000c38f0c0043ac00a0023cd80842247f +:10f0f0003400c38f100043ac2000c38fadba023c74 +:10f10000efbe423404006210000000002110000035 +:10f11000b83c400b000000002800c28f04004014df +:10f120000000000021100000b83c400b000000006f +:10f130001000c28f180042241000c2af1800c0afe8 +:10f140003800c0af8b3c400b000000001000c28fa5 +:10f150004800c327212060000c0005242130400016 +:10f16000a752400f000000004800c22721204000a5 +:10f17000ce3c400f000000003c00c2af4800c22758 +:10f180000400422421204000ce3c400f000000003b +:10f190004000c2af4800c22708004224212040009e +:10f1a000ce3c400f000000004400c2af1000c28ff0 +:10f1b0000c0042241000c2af3c00c38fadde023c05 +:10f1c000efbe423404006210000000002110000075 +:10f1d000b83c400b000000004000c28f0400401407 +:10f1e0000000000021100000b83c400b00000000af +:10f1f0001800c28f010042241800c2af1800c38f4c +:10f200002800c28f050062140000000001000224e3 +:10f210003800c2af8e3c400b000000004000c28f9f +:10f220001000c38f211062001000c2af3800c28fdf +:10f23000c6ff4010000000001800023c18004234d5 +:10f240001000c2af1c00c0afa83c400b0000000083 +:10f250000403c3271000c28f1000c48f0100842450 +:10f260001000c4af212060000100052421304000bf +:10f27000a752400f000000000403c283ff00423089 +:10f280001400c48f21284000eb83400f00000000d1 +:10f290001400c2af1c00c28f010042241c00c2af88 +:10f2a0001c00c38f2c00c28f2b106200e8ff40149b +:10f2b000000000001400c28f271002001400c2af2b +:10f2c0001400c38f3400c28f0400621400000000d9 +:10f2d00001000224b83c400b000000002110000097 +:10f2e00021e8c0030c03bf8f0803be8f1003bd27a6 +:10f2f0000800e00300000000f8ffbd270400beafd7 +:10f3000021f0a003688180af1800023c6c8182afbd +:10f31000788180af5c8180af608180af5c8180af9d +:10f320000100022421e8c0030400be8f0800bd27ad +:10f330000800e00300000000f0ffbd270c00beaf96 +:10f3400021f0a0031000c4af1000c28f04004014cd +:10f350000000000021100000f73c400b00000000fe +:10f360001000c28f000042900000c2af0000c28fa8 +:10f37000001202000000c2af1000c28f0100422440 +:10f38000000042900000c38f211062000000c2af55 +:10f390000000c28f001202000000c2af1000c28f36 +:10f3a00002004224000042900000c38f211062003e +:10f3b0000000c2af0000c28f001202000000c2af06 +:10f3c0001000c28f03004224000042900000c38f4f +:10f3d000211062000000c2af0000c28f21e8c0030c +:10f3e0000c00be8f1000bd270800e00300000000e5 +:10f3f000f8ffbd270400beaf21f0a0030800c4af92 +:10f400000c00c5af0800c28f0400401400000000cb +:10f4100021100000273d400b000000000800c28fb3 +:10f42000030042240c00c38fff006330000043a0a0 +:10f430000c00c28f021202000c00c2af0800c28f83 +:10f44000020042240c00c38fff006330000043a081 +:10f450000c00c28f021202000c00c2af0800c28f63 +:10f46000010042240c00c38fff006330000043a062 +:10f470000c00c28f021202000c00c2af0c00c28f3f +:10f48000ff0043300800c28f000043a00c00c28f71 +:10f49000021202000c00c2af0100022421e8c003e6 +:10f4a0000400be8f0800bd270800e0030000000034 +:10f4b000d8ffbd272400bfaf2000beaf21f0a003be +:10f4c0002800c4af1000c0a32800c28f1400c2af30 +:10f4d0003a3d400b00000000000000003a3d400ba8 +:10f4e0000000000000000000a01404241400c58fd8 +:10f4f000827b400f000000001400c28f11004010fa +:10f50000000000001800c0af1800c227a014042497 +:10f5100021284000727b400f000000001000c2a3b1 +:10f520001000c283ecff4014000000001800c38fdd +:10f530001400c28febff621400000000523d400b2c +:10f5400000000000000000002110000021e8c003be +:10f550002400bf8f2000be8f2800bd270800e003d5 +:10f5600000000000e0ffbd271c00bfaf1800beafc9 +:10f5700021f0a0031000c0af010004241000c22736 +:10f5800021284000727b400f000000001000c28f55 +:10f59000020042300a004010000000001000c38f3b +:10f5a000fdff0224241062001000c2af1000c28fc1 +:10f5b0000100042421284000827b400f000000004d +:10f5c00021e8c0031c00bf8f1800be8f2000bd279c +:10f5d0000800e00300000000e8ffbd271400bfaff3 +:10f5e0001000beaf21f0a00306000424db000524b8 +:10f5f000827b400f00000000070004240600052461 +:10f60000827b400f000000000a0004241183400f99 +:10f61000000000008014042421280000827b400f99 +:10f62000000000008414042421280000827b400f85 +:10f63000000000000a0004241183400f00000000b5 +:10f640000600042421280000827b400f00000000f7 +:10f650000700042421280000827b400f00000000e6 +:10f6600021e8c0031400bf8f1000be8f1800bd2713 +:10f670000800e00300000000e0ffbd271c00bfaf52 +:10f680001800beaf21f0a0031400c0af1000c0a34b +:10f690001400c2270814042421284000727b400f64 +:10f6a000000000001000c2a31000c283040040103c +:10f6b00000000000faff0224dc3d400b00000000c7 +:10f6c0001400c28f000142341400c2af1400c28f74 +:10f6d0000814042421284000827b400f0000000011 +:10f6e0001000c2a31000c2830400401000000000fc +:10f6f000faff0224dc3d400b000000001400c2278a +:10f70000001a042421284000727b400f00000000f2 +:10f710001000c2a31000c2830400401000000000cb +:10f72000faff0224dc3d400b000000001400c38ff0 +:10f730000100023c251062001400c2af1400c28f09 +:10f74000001a042421284000827b400f00000000a2 +:10f750001000c2a31000c28304004010000000008b +:10f76000faff0224dc3d400b0000000021100000e5 +:10f7700021e8c0031c00bf8f1800be8f2000bd27ea +:10f780000800e00300000000e0ffbd271c00bfaf41 +:10f790001800beaf21f0a0031400c0af0c00023c63 +:10f7a0000c00443421280000827b400f0000000040 +:10f7b0001000c2a38c10042421280000827b400f7b +:10f7c00000000000ff0043301000c29321106200cf +:10f7d000ff0042301000c2a30200023cac074434d8 +:10f7e00021280000827b400f00000000ff00433012 +:10f7f0001000c29321106200ff0042301000c2a32b +:10f800001400c2271811042421284000727b400fe5 +:10f8100000000000ff0043301000c293211062007e +:10f82000ff0042301000c2a31000c283030040104a +:10f8300000000000faff02241000c2a31400c28fcf +:10f84000010042341400c2af1400c28f1811042406 +:10f8500021284000827b400f00000000ff00433061 +:10f860001000c29321106200ff0042301000c2a3ba +:10f870001500023c1400443401000524827b400f33 +:10f88000000000001000c2a31400c22700140424ca +:10f8900021284000727b400f00000000ff00433031 +:10f8a0001000c29321106200ff0042301000c2a37a +:10f8b0001400c28f000442300f004010000000000e +:10f8c0001400c38ffffb0224241062001400c2af97 +:10f8d0001400c28f0014042421284000827b400fb2 +:10f8e00000000000ff0043301000c29321106200ae +:10f8f000ff0042301000c2a31400c28f0004423443 +:10f900001400c2af1400c28f001404242128400048 +:10f91000827b400f00000000ff0043301000c293c4 +:10f9200021106200ff0042301000c2a30100042435 +:10f930001183400f000000001000c28321e8c003c3 +:10f940001c00bf8f1800be8f2000bd270800e003f9 +:10f9500000000000e0ffbd271c00bfaf1800beafd5 +:10f9600021f0a0039880828f7900401400000000ed +:10f970000010042498808527727b400f000000004f +:10f980000500401000000000988080af21100000aa +:10f99000d53e400b00000000f41304241000c227e1 +:10f9a00021284000727b400f00000000050040103d +:10f9b00000000000988080af21100000d53e400b71 +:10f9c000000000009880838f1000023ca0024234a7 +:10f9d0000a006214000000001000c38f010002241e +:10f9e00041006210000000001000023ca1024234fd +:10f9f000988082afba3e400b000000009880838f51 +:10fa00001000023cb00242341300621400000000f7 +:10fa10001000c38f030002243300621000000000b6 +:10fa20001000c38f040002240600621400000000ce +:10fa30001000023cb1024234988082afba3e400bc3 +:10fa4000000000001000023cb2024234988082aff5 +:10fa5000ba3e400b000000009880838f1000023ceb +:10fa6000f000423420006214000000003b00043c1f +:10fa700098808527727b400f000000000500401031 +:10fa800000000000988080af21100000d53e400ba0 +:10fa9000000000009880838f3000023cd000423488 +:10faa00011006214000000001000c38f0600022441 +:10fab00006006214000000003000023cd100423415 +:10fac000988082afba3e400b000000001000c38f48 +:10fad0000200022404006214000000003000023c16 +:10fae000d2004234988082af9880838ff000023c2d +:10faf000241862003000023c0c0062140000000078 +:10fb00009880838ff0ff023cffff42342410620094 +:10fb1000988082af9880838f0400023c2510620099 +:10fb2000988082afd43e400b000000009880838f05 +:10fb3000f0ff023cffff423424106200988082af45 +:10fb40009880838f0500023c25106200988082af68 +:10fb50009880828f21e8c0031c00bf8f1800be8fe1 +:10fb60002000bd270800e00300000000e0ffbd27e3 +:10fb70001c00bfaf1800beaf21f0a003f413042493 +:10fb80001000c22721284000727b400f00000000b7 +:10fb900002004010000000001000c0af1000c28f33 +:10fba00021e8c0031c00bf8f1800be8f2000bd27b6 +:10fbb0000800e00300000000e8ffbd271400bfaf0d +:10fbc0001000beaf21f0a003553e400f0000000022 +:10fbd000ff0f4230b002422c06004014000000002b +:10fbe000481e042484b7023cce694534827b400f12 +:10fbf0000000000021e8c0031400bf8f1000be8f7a +:10fc00001800bd270800e00300000000e0ffbd274a +:10fc10001c00bfaf1800beaf21f0a00328140424bd +:10fc2000647b400f000000001000c2af1000c38fc3 +:10fc3000feff0224241062001000c2af2814042426 +:10fc40001000c58f827b400f000000001000c28fa3 +:10fc5000010042341000c2af281404241000c58fe4 +:10fc6000827b400f0000000021e8c0031c00bf8f12 +:10fc70001800be8f2000bd270800e0030000000030 +:10fc8000e0ffbd271c00bfaf1800beaf21f0a003ee +:10fc90001c140424647b400f000000001000c2af5d +:10fca0001000c28f040042341000c2af1c140424a0 +:10fcb0001000c58f827b400f00000000033f400f03 +:10fcc0000000000021e8c0031c00bf8f1800be8f99 +:10fcd0002000bd270800e00300000000e0ffbd2772 +:10fce0001c00bfaf1800beaf21f0a0031000c0a3de +:10fcf0003f3f400b00000000000000001400c2273e +:10fd00001400042421284000727b400f00000000f2 +:10fd10001000c2a31000c28339004014000000008c +:10fd20001400c28f01004230f3ff401400000000b5 +:10fd30001400c2270100042421284000727b400fd8 +:10fd4000000000001000c2a31000c2832f00401466 +:10fd5000000000001400c28f020042300e0040106c +:10fd6000000000001400c38ffdff02242410620075 +:10fd70001400c2af1400c28f0100042421284000e7 +:10fd8000827b400f000000001000c2a31000c2835d +:10fd900021004014000000001400c2270e000424bb +:10fda00021284000727b400f000000001000c2a319 +:10fdb0001000c2831b004014000000001400c28f1a +:10fdc00001004230ff0042301700401000000000e8 +:10fdd0001400c38ffeff0224241062001400c2af7f +:10fde0001400c28f0e00042421284000827b400fa3 +:10fdf000000000001000c2a38a3f400b000000007a +:10fe0000000000008a3f400b0000000000000000de +:10fe10008a3f400b00000000000000008a3f400bba +:10fe200000000000000000001000c28321e8c003b1 +:10fe30001c00bf8f1800be8f2000bd270800e00304 +:10fe400000000000d8ffbd272400bfaf2000beafd8 +:10fe500021f0a0031000c0a31800c0af1c00c0af69 +:10fe60001400c0af1c00c227130004242128400046 +:10fe7000727b400f000000001800c2270e0004240f +:10fe800021284000727b400f000000001000c2a338 +:10fe90001000c28344004014000000001800c28f0c +:10fea000010042300b004014000000001800c28f17 +:10feb000010042340e00042421284000827b400fc0 +:10fec000000000001000c2a31000c28339004014db +:10fed000000000001800c22701000424212840006f +:10fee000727b400f000000001000c2a31000c2830c +:10fef00033004014000000001800c28f020042309e +:10ff00000e004014000000001800c28f02004234ae +:10ff10000100042421284000827b400f00000000e3 +:10ff20001000c2a31000c28328004014000000008b +:10ff3000cf3f400b00000000000000001c00c22763 +:10ff40001300042421284000727b400f00000000b1 +:10ff50001000c2a31000c2831f0040140000000064 +:10ff60001c00c28f040042301e004014000000003c +:10ff7000020004241183400f000000001400c28f0f +:10ff8000010042241400c2af1400c28f0500422cad +:10ff9000e9ff401400000000fcff02241000c2a38f +:10ffa000fa3f400b0000000000000000fa3f400b49 +:10ffb0000000000000000000fa3f400b00000000bd +:10ffc00000000000fa3f400b0000000000000000ad +:10ffd000fa3f400b0000000000000000fa3f400b19 +:10ffe00000000000000000001000c28321e8c003f0 +:10fff0002400bf8f2000be8f2800bd270800e0032b +:020000041d01dc +:1000000000000000e0ffbd271c00bfaf1800beaf1e +:1000100021f0a0031000c0a31400c0af913f400f17 +:10002000000000001000c2a31000c28304004010b2 +:10003000000000001000c2836040400b0000000080 +:100040006640400f000000001400c227181104246d +:1000500021284000727b400f000000001000c2a366 +:100060001000c2830300401000000000faff0224c9 +:100070001000c2a31400c28f010042341400c2afaa +:100080001400c28f1811042421284000827b400fe5 +:10009000000000001000c2a31400c22700140424b2 +:1000a00021284000727b400f00000000ff00433019 +:1000b0001000c29321106200ff0042301000c2a362 +:1000c0001400c28f000442301900401000000000ec +:1000d0001400c38ffffb0224241062001400c2af7f +:1000e0001400c28f0014042421284000827b400f9a +:1000f00000000000ff0043301000c2932110620096 +:10010000ff0042301000c2a31400c22700140424d0 +:1001100021284000727b400f00000000ff004330a8 +:100120001000c29321106200ff0042301000c2a3f1 +:100130000c00023c0c00443421280000827b400f5c +:10014000000000008c10042421280000827b400f56 +:10015000000000000200023cac07443421280000eb +:10016000827b400f00000000081404241111023c9f +:1001700000104534827b400f000000001000c28355 +:1001800021e8c0031c00bf8f1800be8f2000bd27d0 +:100190000800e00300000000e0ffbd271c00bfaf27 +:1001a0001800beaf21f0a0031000c0a30014042467 +:1001b00021280000827b400f00000000ff00433038 +:1001c0001000c29321106200ff0042301000c2a351 +:1001d000320004241183400f000000001000c2838d +:1001e00021e8c0031c00bf8f1800be8f2000bd2770 +:1001f0000800e00300000000d8ffbd272400bfafc7 +:100200002000beaf21f0a003211080002800c2a36f +:100210001000c0a31400c0af1800c0af1c00c0afd6 +:100220001400c0af14100424647b400f00000000d1 +:100230001400c2af1400c28f0e0041040000000081 +:100240000200023cbc074434647b400f0000000005 +:100250001400c2af1400c28f010042301400c2afbc +:100260001400c28f1b00401000000000ba40400b79 +:1002700000000000010004241183400f0000000072 +:100280008940400b00000000010004241183400f4e +:10029000000000000c00023c0c004434647b400f62 +:1002a000000000001400c2af1800c28f01004224f9 +:1002b0001800c2af1800c28fd107422c05004014ad +:1002c00000000000fbff02241000c2a3e240400b2c +:1002d000000000001400c38fad10023c9ed04234d9 +:1002e000e9ff6214000000002800c393020002240a +:1002f00009006214000000000200023cac07443414 +:100300001c3c023c7dd54534827b400f0000000040 +:10031000cc40400b000000002800c39303000224df +:100320000300621400000000800002241c00c2af21 +:10033000553e400f00000000ff0f4330a003022491 +:1003400008006214000000001c00c28f020042344a +:10035000212040002c3d400f00000000dc40400bfd +:10036000000000001c00c48f2c3d400f0000000066 +:100370000c00023c0c00443452ef023c612f453427 +:10038000827b400f000000001000c28321e8c00300 +:100390002400bf8f2000be8f2800bd270800e00387 +:1003a00000000000d0ffbd272c00bfaf2800beaf6b +:1003b00021f0a003211080003000c2a31000c0a3d0 +:1003c0001800c0af1400c0af8c1002241c00c2afd4 +:1003d0005302023c362642342000c2af3000c393a1 +:1003e0000200022422006214000000000200023c0d +:1003f000ac0742341c00c2af1c3c023c7dd54234e9 +:100400002000c2af1d41400b000000000200042488 +:100410001183400f000000001c00c38f1800c2278a +:100420002120600021284000727b400f0000000066 +:1004300004004010000000002000c28f0100422c88 +:100440001800c2af1400c28f010042241400c2afd2 +:100450001400c28fd107422c060040140000000097 +:10046000fbff02241000c2a32a41400b0000000041 +:10047000000000002000c38f1800c28fe3ff621449 +:10048000000000002000c38f5302023c3626423495 +:1004900005006214000000008c10042421280000d4 +:1004a000827b400f000000001000c28321e8c003df +:1004b0002c00bf8f2800be8f3000bd270800e0034e +:1004c00000000000e0ffbd271c00bfaf1800beaf5a +:1004d00021f0a0031400c0af0a0002241100c2a33f +:1004e0001400c2270014042421284000727b400f0e +:1004f000000000001000c2a31400c38ffffb022401 +:10050000241062001400c2af1400c28f001404242f +:1005100021284000827b400f000000001000c2a391 +:100520001000c28304004010000000001000c283cd +:100530007241400b000000001400c2270014042484 +:1005400021284000727b400f000000001000c2a371 +:100550001000c28304004010000000001000c2839d +:100560007241400b000000001400c28f00044230b2 +:1005700013004010000000001400c38ffffb022492 +:10058000241062001400c2af1400c28f00140424af +:1005900021284000827b400f000000001000c2a311 +:1005a0001100c293ffff42241100c2a31100c293a5 +:1005b000e1ff4014000000007141400b000000000a +:1005c000000000001000c28321e8c0031c00bf8fa0 +:1005d0001800be8f2000bd270800e00300000000c7 +:1005e000e0ffbd271c00bfaf1800beaf21f0a00385 +:1005f000211880002110a0002000c3a32400c2a362 +:100600001400c2270200033c080164342128400082 +:10061000727b400f000000001000c2a31000c283d4 +:100620001c004014000000002400c2930900401088 +:10063000000000002000c2930100032404184300be +:100640001400c28f251062001400c2af9c41400b01 +:10065000000000002000c2930100032404104300a6 +:10066000271802001400c28f241062001400c2afc9 +:100670001400c28f0200033c0801643421284000aa +:10068000827b400f000000001000c2a3a641400b77 +:1006900000000000000000001000c28321e8c00339 +:1006a0001c00bf8f1800be8f2000bd270800e0038c +:1006b00000000000e0ffbd271c00bfaf1800beaf68 +:1006c00021f0a003211880002110a0002000c3a366 +:1006d0002400c2a31400c2270200033c00016434ba +:1006e00021284000727b400f000000001000c2a3d0 +:1006f0001000c2831c004014000000002400c293bc +:1007000009004010000000002000c29301000324f3 +:10071000041843001400c28f251062001400c2aff9 +:10072000d141400b000000002000c29301000324cf +:1007300004104300271802001400c28f2410620026 +:100740001400c2af1400c28f0200033c00016434e5 +:1007500021284000827b400f000000001000c2a34f +:10076000db41400b00000000000000001000c283cd +:1007700021e8c0031c00bf8f1800be8f2000bd27da +:100780000800e00300000000e0ffbd271c00bfaf31 +:100790001800beaf21f0a003211080002400c5afd7 +:1007a0002000c2a31400c2270200033c04016434e9 +:1007b00021284000727b400f000000001000c2a3ff +:1007c0001000c2830b004014000000001400c38f0f +:1007d0002000c29306104300ff0042300100423067 +:1007e000ff0043302400c28f000043a0fe41400bb5 +:1007f00000000000000000001000c28321e8c003d8 +:100800001c00bf8f1800be8f2000bd270800e0032a +:1008100000000000e0ffbd271c00bfaf1800beaf06 +:1008200021f0a0032000c4af2110a0002400c2a327 +:100830001400c2272c14042421284000727b400f8e +:10084000000000001000c2a31000c2831700401473 +:10085000000000002400c2930800401000000000c7 +:100860002000c28f271802001400c28f24106200db +:100870001400c2af2342400b000000001400c38fdd +:100880002000c28f251062001400c2af1400c28f76 +:100890002c14042421284000827b400f000000001b +:1008a0001000c2a32c42400b00000000000000001a +:1008b0001000c28321e8c0031c00bf8f1800be8f48 +:1008c0002000bd270800e00300000000d0ffbd2786 +:1008d0002c00bfaf2800beaf21f0a0033000c4af92 +:1008e0003400c5af2000c0af2400c0af1400c22741 +:1008f0009c14042421284000727b400f000000005b +:100900001000c2a31000c283380040140000000091 +:100910001400c38f0300023c251862002000c22788 +:10092000212060002128400008000624a67b400ffb +:10093000000000001000c2a31000c2832e0040146b +:10094000000000002000c28f1400c2af1400c38f4b +:10095000ffff023c24106200080040140000000069 +:100960003000c48f2128000006000624fa89400fb9 +:10097000000000007f42400b000000001400c28f06 +:10098000021402001400c2af1400c38f0300023c23 +:10099000251862001800c22721206000212840008d +:1009a00006000624a67b400f000000001000c2a332 +:1009b0001800c2273000c48f2128400006000624fa +:1009c0000e87400f000000003400c28f040040106a +:1009d000000000003400c28f01000324000043a087 +:1009e0001000c2838542400b0000000000000000a0 +:1009f0007f42400b00000000000000003400c28f66 +:100a000003004010000000003400c28f000040a02e +:100a10001000c28321e8c0032c00bf8f2800be8fc6 +:100a20003000bd270800e00300000000d0ffbd2714 +:100a30002c00bfaf2800beaf21f0a0033000c4af30 +:100a40002000c0af2400c0af1400c2279c140424af +:100a500021284000727b400f000000001000c2a35c +:100a60001000c28325004014000000001400c38f52 +:100a70000300023c251862002000c22721206000ec +:100a80002128400008000624a67b400f000000003b +:100a90001000c2a31000c2831b004014000000001d +:100aa0002000c28f1400c2af1400c28fffff42307b +:100ab0001400c2af1400c38f0300023c251862006b +:100ac0001800c227212060002128400006000624cb +:100ad000a67b400f000000001000c2a31800c22730 +:100ae0003000c48f21284000060006240e87400fe6 +:100af00000000000c342400b0000000000000000a6 +:100b0000c342400b00000000000000001000c28340 +:100b100021e8c0032c00bf8f2800be8f3000bd2706 +:100b20000800e00300000000e0ffbd271c00bfaf8d +:100b30001800beaf21f0a0032000c4af2110a00018 +:100b40002400c2a788bf033c2061628c0400027ca1 +:100b5000206162ac1000c0afe642400b0000000014 +:100b600011818293aa000424212840005d8b400f4c +:100b700000000000211840002000c28f000043a0a8 +:100b80002000c28f010042242000c2af1000c28f9b +:100b9000010042241000c2af2400c3971000c28f8e +:100ba0002a104300eeff40140000000088bf033c01 +:100bb0002061628c010004240400827c206162ac0c +:100bc0002110000021e8c0031c00bf8f1800be8f59 +:100bd0002000bd270800e00300000000e0ffbd2763 +:100be0001c00bfaf1800beaf21f0a0032000c4afaf +:100bf0002110a0002400c2a788bf033c2061628ca2 +:100c00000400027c206162ac1000c0af1343400bb3 +:100c1000000000002000c28f000042902118400018 +:100c20002000c28f010042242000c2af11818293b4 +:100c300021206000212840005d8b400f0000000053 +:100c40001000c28f010042241000c2af2400c397dd +:100c50001000c28f2a104300eeff40140000000075 +:100c600088bf033c2061628c010004240400827c64 +:100c7000206162ac2110000021e8c0031c00bf8f7e +:100c80001800be8f2000bd270800e0030000000010 +:100c9000f8ffbd270400beaf21f0a003211880009b +:100ca0002110a0000800c3a30c00c2a30800c29337 +:100cb000401802000c00c29326186200029d023cfc +:100cc0009c234224211062000000429021e8c003ce +:100cd0000400be8f0800bd270800e00300000000ec +:100ce000e8ffbd271400bfaf1000beaf21f0a00386 +:100cf000211080001c00c5af2000c6af1800c2a3a1 +:100d00004d43400b000000001800c3931c00c28f2d +:100d1000000042901c00c48f010084241c00c4af5a +:100d200021206000212840002443400f00000000e3 +:100d30001800c2a32000c28f2b100200ff00423017 +:100d40002000c38fffff63242000c3afeeff4014d9 +:100d5000000000001800c29321e8c0031400bf8ff8 +:100d60001000be8f1800bd270800e003000000003f +:100d7000c8ffbd273400bfaf3000beaf2c00b0affe +:100d800021f0a003211880003c00c5af4000c6af91 +:100d90004400c7af4800c28f3800c3a32000c2a3dd +:100da000050002241000c2a33800c2931400c2a39d +:100db0003800c2933dff42240d00432c9c0060107c +:100dc0000000000080180200019d023ce00d42245a +:100dd000211062000000428c08004000000000006a +:100de000300f019d500e019d3010019d3010019d6e +:100df000c80e019dc80e019db80f019d140e019de6 +:100e00003010019d3010019d3010019d3010019d6a +:100e1000a00e019d3c00c28f02140200ff00423070 +:100e20001500c2a33c00c28f02120200ff00423034 +:100e30001600c2a33c00c28fff0042301700c2a3bd +:100e4000050002241000c2a30f44400b0000000064 +:100e50003c00c28f02120200ff0042301500c2a304 +:100e60002000c29306004010000000001500c3934c +:100e700080ff022425106200ff0042301500c2a34b +:100e80003c00c28fff0042301600c2a31700c0a36f +:100e9000050002241000c2a30f44400b0000000014 +:100ea000ffff02241500c2a3ffff02241600c2a305 +:100eb000ffff02241700c2a3050002241000c2a3f2 +:100ec0000f44400b000000003c00c28f02140200df +:100ed000ff0042301500c2a33c00c28f0212020084 +:100ee000ff0042301600c2a33c00c28fff00423018 +:100ef0001700c2a34400c28f02140200ff00423058 +:100f00001800c2a34400c28f02120200ff00423048 +:100f10001900c2a34400c28fff0042301a00c2a3ce +:100f2000080002241000c2a30f44400b0000000080 +:100f30003c00c28f02120200ff0042301500c2a323 +:100f40002000c29306004010000000001500c3936b +:100f500080ff022425106200ff0042301500c2a36a +:100f60003c00c28fff0042301600c2a34000c28f77 +:100f700002160200ff0042301700c2a34000c28fd9 +:100f800002140200ff0042301800c2a34000c28fca +:100f900002120200ff0042301900c2a34000c28fbb +:100fa000ff0042301a00c2a3080002241000c2a3ae +:100fb0000f44400b000000003c00c28f02140200ee +:100fc000ff0042301500c2a33c00c28f0212020093 +:100fd000ff0042301600c2a33c00c28fff00423027 +:100fe0001700c2a34000c28f02160200ff00423069 +:100ff0001800c2a34000c28f02140200ff0042305a +:101000001900c2a34000c28f02120200ff0042304a +:101010001a00c2a34000c28fff0042301b00c2a3cf +:10102000090002241000c2a30f44400b000000007e +:10103000ffff02243244400b00000000a080829396 +:1010400012004014000000001000c293ffff502463 +:101050001000c293ffff42241400c3277f00042422 +:1010600021286000213040003843400f000000007c +:1010700040100200ff0043301000c2272110500032 +:10108000040043a02644400b000000001000c2935f +:10109000ffff42241000c2a31000c2931400c32714 +:1010a0002120600021284000f742400f000000008e +:1010b0000400401000000000ffff02243244400bf7 +:1010c000000000002110000021e8c0033400bf8fa1 +:1010d0003000be8f2c00b08f3800bd270800e00321 +:1010e00000000000e0ffbd271c00bfaf1800beaf2e +:1010f00021f0a003211080002000c2a32000c39390 +:10110000cf0002240b006214000000001100c2276f +:101110002120400001000524ca42400f00000000c9 +:101120000400401000000000ffff02248944400b2f +:10113000000000000a0002241000c2a31100c22710 +:101140002120400001000524ca42400f0000000099 +:101150000400401000000000ffff02248944400bff +:10116000000000001100c2932000c3930900621028 +:10117000000000001000c2832a100200ff0042306d +:101180001000c393ffff63241000c3a3ebff4014c0 +:10119000000000001000c2830400410400000000b1 +:1011a000ffff02248944400b000000000a000224d3 +:1011b0001000c2a31100c227212040000100052415 +:1011c000ca42400f00000000040040100000000070 +:1011d000ffff02248944400b000000001100c2936d +:1011e00009004010000000001000c2832a10020015 +:1011f000ff0042301000c393ffff63241000c3a31d +:10120000ecff4014000000001000c2830400410401 +:1012100000000000ffff02248944400b0000000092 +:101220002110000021e8c0031c00bf8f1800be8ff2 +:101230002000bd270800e00300000000e0ffbd27fc +:101240001c00bfaf1800beaf21f0a00301000424b2 +:101250001183400f000000001000a0afcf00042455 +:101260002128000021300000213800005c43400f9d +:1012700000000000cf0004243944400f00000000ab +:10128000010004241183400f0000000021e8c00386 +:101290001c00bf8f1800be8f2000bd270800e00390 +:1012a00000000000d8ffbd272400bfaf2000beaf64 +:1012b00021f0a0032800c4af2118a0002110c00015 +:1012c0002c00c3a73000c2a31600c0a31200c0a701 +:1012d0002c00c2970120422c0500401000000000a5 +:1012e0002c00c2971400c2a7be44400b00000000af +:1012f000002002241400c2a70a0002241000c2a782 +:101300001a00c2272120400001000524ca42400fd4 +:10131000000000000500401000000000ffff022454 +:101320001600c2a3db44400b000000001a00c29369 +:10133000f0004330f00002240b00621000000000b7 +:101340001000c2872b100200ff0042301000c3972c +:10135000ffff63241000c3a7e9ff40140000000052 +:10136000db44400b00000000000000001600c383b7 +:10137000ffff022435006210000000001000c28749 +:101380000500401c00000000ffff02241600c2a35d +:101390001445400b000000001200c2872800c38fd4 +:1013a000211862001400c29721206000212840000b +:1013b000ca42400f0000000005004010000000007d +:1013c000ffff02241600c2a31445400b00000000da +:1013d0003000c2930f00401400000000a0808293f0 +:1013e0000c004014000000001800c227212040001b +:1013f00002000524ca42400f000000000500401012 +:1014000000000000ffff02241600c2a31445400b99 +:10141000000000001200c3971400c2972110620060 +:10142000ffff42301200c2a71400c2972c00c397de +:10143000231062002c00c2a72c00c297a4ff401406 +:10144000000000001445400b0000000000000000f8 +:101450001600c28321e8c0032400bf8f2000be8f86 +:101460002800bd270800e00300000000d8ffbd27ca +:101470002400bfaf2000beaf21f0a0032800c4affe +:101480002110a0002c00c2a71000c0a71400c0a308 +:101490001800c0a72c00c2970120422c0500401064 +:1014a000000000002c00c2971200c2a72f45400b7d +:1014b00000000000002002241200c2a7f0ff022456 +:1014c0001600c2a31000c2870d00401400000000e7 +:1014d0002c00c2970120422c0500401000000000a3 +:1014e000030002241500c2a34a45400b000000007f +:1014f000010002241500c2a34a45400b0000000071 +:101500002c00c2970120422c050040100000000072 +:10151000030002241500c2a34a45400b000000004e +:10152000020002241500c2a31600c3931500c29343 +:1015300025106200ff0042301600c2a31600c22729 +:101540002120400001000524f742400f0000000068 +:101550000500401000000000ffff02241400c2a399 +:101560008245400b000000001000c2872800c38f96 +:10157000211862001200c29721206000212840003b +:10158000f742400f0000000005004010000000007e +:10159000ffff02241400c2a38245400b000000009c +:1015a000a08082930c004014000000001800c227a5 +:1015b0002120400002000524f742400f00000000f7 +:1015c0000500401000000000ffff02241400c2a329 +:1015d0008245400b000000001000c3971200c29724 +:1015e00021106200ffff42301000c2a72c00c397f9 +:1015f0001200c297231062002c00c2a72c00c297d1 +:10160000a4ff4014000000001400c28321e8c003be +:101610002400bf8f2000be8f2800bd270800e003f4 +:1016200000000000d8ffbd272400bfaf2000beafe0 +:1016300021f0a0032800c4af2c00c5afc9ff0224cd +:101640001800c2a31900c0a32800c28f3100422c89 +:101650000500401000000000c3ff02241800c2a3d0 +:10166000010002241900c2a31800c2931900c393f9 +:101670001000a3af212040002800c58f2c00c68f8a +:10168000040007245c43400f0000000004004010e9 +:1016900000000000ffff0224b245400b00000000e4 +:1016a0001800c293212040003944400f0000000080 +:1016b0000400401000000000ffff0224b245400b70 +:1016c000000000002110000021e8c0032400bf8fab +:1016d0002000be8f2800bd270800e00300000000a6 +:1016e000d8ffbd272400bfaf2000beaf21f0a0036c +:1016f0002800c4af2c00c5af2110c0003000c2a725 +:101700003000c2971000a0afc70004242800c58f86 +:1017100021300000213840005c43400f00000000f1 +:101720000400401000000000ffff02240646400baa +:1017300000000000c70004243944400f00000000ee +:101740000400401000000000ffff02240646400b8a +:10175000000000003000c2972c00c48f21284000f8 +:101760001b45400f00000000040040100000000076 +:10177000ffff02240646400b00000000a080829379 +:101780000500401400000000020002241800c2a35b +:10179000e845400b00000000030002241800c2a32b +:1017a0001800c2931c00c32721206000212840009c +:1017b000ca42400f0000000004004010000000007a +:1017c000ffff02240646400b000000001800c293f1 +:1017d000ffff42241800c32721106200040042903a +:1017e00009004014000000001800c293feff4224cc +:1017f0001800c3272110620004004390c300022494 +:101800000400621000000000ffff02240646400ba7 +:10181000000000002110000021e8c0032400bf8f59 +:101820002000be8f2800bd270800e0030000000054 +:10183000d8ffbd272400bfaf2000beaf21f0a0031a +:101840002800c4af2c00c5afcaff02241800c2a3f1 +:101850001900c0a32800c28f0001422c05004010cf +:1018600000000000c4ff02241800c2a301000224eb +:101870001900c2a31800c2931900c3931000a3afac +:10188000212040002800c58f2130000004000724db +:101890005c43400f00000000040040100000000006 +:1018a000ffff02244e46400b000000001800c293c8 +:1018b000212040003944400f000000000400401087 +:1018c00000000000ffff02244e46400b0000000015 +:1018d0001900c2931c00c3272120600004000524c6 +:1018e00021304000a944400f0000000004004010d7 +:1018f00000000000ffff02244e46400b00000000e5 +:101900001c00c293211840001d00c2930012020067 +:10191000251862001e00c293001402002518620000 +:101920001f00c29300160200251862002c00c28f0f +:10193000000043ac2110000021e8c0032400bf8f49 +:101940002000be8f2800bd270800e0030000000033 +:10195000e0ffbd271c00bfaf1800beaf21f0a00301 +:101960002000c4af2400c5af2110c0002800c2a7ca +:101970002800c2971000a0afc80004242000c58f23 +:1019800021300000213840005c43400f000000007f +:101990000400401000000000ffff02247d46400bc1 +:1019a00000000000c80004243944400f000000007b +:1019b0000400401000000000ffff02247d46400ba1 +:1019c000000000002800c2972400c48f2128400096 +:1019d00021300000a944400f000000000400401026 +:1019e00000000000ffff02247d46400b00000000c5 +:1019f0002110000021e8c0031c00bf8f1800be8f1b +:101a00002000bd270800e00300000000e0ffbd2724 +:101a10001c00bfaf1800beaf21f0a00324e80434bf +:101a20003147400f000000001000c2af1000c38f0c +:101a30008fff0224241062001000c2af1000c28f7a +:101a4000500042341000c2af24e804341000c58fa7 +:101a50006647400f0000000021e8c0031c00bf8f54 +:101a60001800be8f2000bd270800e0030000000022 +:101a7000e0ffbd271c00bfaf1800beaf21f0a003e0 +:101a80001000a0afcf000424212800002130000066 +:101a9000213800005c43400f00000000cf00042408 +:101aa0003944400f000000002110000021e8c0036d +:101ab0001c00bf8f1800be8f2000bd270800e00368 +:101ac00000000000f8ffbd270400beaf21f0a00316 +:101ad00021e8c0030400be8f0800bd270800e00312 +:101ae00000000000d0ffbd272c00bfaf2800beaf14 +:101af00021f0a0032000c0afc404023c00b4423473 +:101b00001000c2afe400023cc0e142341400c2af96 +:101b10001400c28f401002001000c38f1b0062002f +:101b2000f401400010180000121000001800c2afad +:101b30001400c28f401002001000c38f1b0062000f +:101b4000f4014000101000000400401000000000ec +:101b50001800c28f010042241800c2af1800c28fc3 +:101b60000101422c03004014000000000001022487 +:101b70001800c2af1800c28f04004010000000001f +:101b80001800c28fffff42241800c2af1800c28f96 +:101b9000ff004230118182a3a08080a32000c227d1 +:101ba00024e80434212840004247400f0000000090 +:101bb0000d0040100000000001000224a08082a35c +:101bc0002000c22724e80434212840004247400f67 +:101bd000000000000400401000000000faff022492 +:101be0002147400b00000000a080829318004014a1 +:101bf000000000002000c38ff3ff022424106200c5 +:101c00002000c2af2000c38f8fff02242410620087 +:101c10002000c2af2000c28f500042342000c2af6b +:101c20002000c28f24e80434212840006647400f7a +:101c3000000000000400401000000000faff022431 +:101c40002147400b0000000001000224a08082a375 +:101c50001c00c22700100424212840004247400fe6 +:101c6000000000000400401000000000faff022401 +:101c70002147400b000000008346400f0000000099 +:101c80002110000021e8c0032c00bf8f2800be8f68 +:101c90003000bd270800e00300000000f8ffbd276a +:101ca0000400beaf21f0a003a08080a3211000009b +:101cb00021e8c0030400be8f0800bd270800e00330 +:101cc00000000000e0ffbd271c00bfaf1800beaf42 +:101cd00021f0a0032000c4af2000c48f1000c22751 +:101ce000212840004247400f000000001000c28f32 +:101cf00021e8c0031c00bf8f1800be8f2000bd2745 +:101d00000800e00300000000e0ffbd271c00bfaf9b +:101d10001800beaf21f0a0032000c4af2400c5af5f +:101d20000a0002241000c2a35747400b0000000025 +:101d30002000c48f2400c58f0c46400f0000000017 +:101d40000400401400000000211000006047400b18 +:101d5000000000008f44400f000000001000c293fc +:101d60002b100200ff0042301000c393ffff6324da +:101d70001000c3a3eeff401400000000faff02248d +:101d800021e8c0031c00bf8f1800be8f2000bd27b4 +:101d90000800e00300000000e0ffbd271c00bfaf0b +:101da0001800beaf21f0a0032000c4af2400c5afcf +:101db0000a0002241000c2a37b47400b0000000071 +:101dc0002000c48f2400c58f8945400f000000000b +:101dd0000400401400000000211000008447400b64 +:101de000000000008f44400f000000001000c2936c +:101df0002b100200ff0042301000c393ffff63244a +:101e00001000c3a3eeff401400000000faff0224fc +:101e100021e8c0031c00bf8f1800be8f2000bd2723 +:101e20000800e00300000000d8ffbd272400bfaf7a +:101e30002000beaf21f0a0032800c4af2c00c5af26 +:101e40002110c0003000c2a70a0002241000c2a363 +:101e50001800c0a31900c0a33000c39701000224da +:101e60000700621400000000020002243000c2a734 +:101e70001800c2271400c2afb847400b0000000092 +:101e80002c00c28f1400c2afb847400b0000000006 +:101e90003000c2972800c48f1400c58f2130400045 +:101ea0005446400f000000000b00401400000000ea +:101eb0001800c2271400c38f040062140000000041 +:101ec0001800c3932c00c28f000043a02110000013 +:101ed000c147400b000000008f44400f000000008d +:101ee0001000c2932b100200ff0042301000c39379 +:101ef000ffff63241000c3a3e5ff401400000000af +:101f0000faff022421e8c0032400bf8f2000be8f07 +:101f10002800bd270800e00300000000e0ffbd2707 +:101f20001c00bfaf1800beaf21f0a0032000c4af5b +:101f30002400c5af2110c0002800c2a70a00022457 +:101f40001000c2a32800c3970100022414006214e9 +:101f500000000000020002242800c2a7e947400b4d +:101f6000000000002800c2972000c48f2400c58f05 +:101f700021304000b845400f00000000040040142c +:101f80000000000021100000f247400b000000009c +:101f90008f44400f00000000e947400b00000000a4 +:101fa000000000001000c2932b100200ff0042301e +:101fb0001000c393ffff63241000c3a3e9ff401484 +:101fc00000000000faff022421e8c0031c00bf8fbc +:101fd0001800be8f2000bd270800e00300000000ad +:101fe000e0ffbd271c00bfaf1800beaf21f0a0036b +:101ff0001000c0a300a0023cb4014224020040a093 +:10200000553e400f0000000021184000f0ff023c48 +:1020100000f04234241862003000023c08006214d0 +:1020200000000000a810042401000524827b400f5a +:10203000000000001000c2a32548400b0000000073 +:102040001400c2277010042421284000727b400f26 +:10205000000000001000c2a31000c2830c00401456 +:10206000000000001400c28f020042341400c2af0e +:102070001400c28f7010042421284000827b400f7e +:10208000000000001000c2a32548400b0000000023 +:10209000000000001000c28321e8c0031c00bf8fb5 +:1020a0001800be8f2000bd270800e00300000000dc +:1020b000f8ffbd270400beaf21f0a0032118800067 +:1020c0002110a0001000c6af0800c3a30c00c2a7d7 +:1020d00021e8c0030400be8f0800bd270800e0030c +:1020e00000000000e0ffbd271c00bfaf1800beaf1e +:1020f00021f0a0031000c0a300a0023cb4014224c0 +:1021000002004290ff004230040040100000000036 +:102110001000c2836548400b0000000000a0023c94 +:10212000b401422401004290ff0042300c004014f0 +:102130000000000000a0023cb4014290ff004230c9 +:102140000700401000000000913f400f0000000019 +:102150001000c2a31000c2830c0040140000000055 +:1021600000a0023cb401422401004290ff00423032 +:1021700001004224ff00433000a0023cb40142248d +:10218000010043a06448400b000000000000000074 +:102190001000c28321e8c0031c00bf8f1800be8f4f +:1021a0002000bd270800e00300000000f8ffbd2765 +:1021b0000400beaf21f0a003211080000800c2a3dc +:1021c00000a0023c0800c393b40143a021e8c0036f +:1021d0000400be8f0800bd270800e00300000000d7 +:1021e000f8ffbd270400beaf21f0a00300a0023c11 +:1021f000b4014290ff00423021e8c0030400be8fca +:102200000800bd270800e00300000000f8ffbd271c +:102210000400beaf21f0a00300a0023cb4014224a0 +:1022200001004290ff0042300a0040100000000010 +:1022300000a0023cb401422401004290ff00423061 +:10224000ffff4224ff00433000a0023cb4014224bf +:10225000010043a02110000021e8c0030400be8f4c +:102260000800bd270800e00300000000e0ffbd27d4 +:102270001c00bfaf1800beaf21f0a0031000c0a328 +:1022800000a0023cb401422401004290ff00423011 +:102290000a0040100000000000a0023cb4014224eb +:1022a00001004290ff004230ffff4224ff00433014 +:1022b00000a0023cb4014224010043a000a0023c63 +:1022c000b401422401004290ff0042300900401452 +:1022d0000000000000a0023cb4014290ff00423028 +:1022e0000400401000000000373f400f00000000d5 +:1022f0001000c2a31000c28321e8c0031c00bf8fde +:102300001800be8f2000bd270800e0030000000079 +:10231000e8ffbd271400bfaf1000beaf21f0a0033f +:102320001800c4af00a0023cb401442421280000de +:1023300024000624fa89400f000000000300042452 +:10234000019d023cb0204524934c400f000000004a +:102350009b48400f0000000021e8c0031400bf8f1d +:102360001000be8f1800bd270800e0030000000029 +:10237000e0ffbd271c00bfaf1800beaf21f0a003d7 +:102380002000c4af1000c0a33948400f0000000077 +:102390001000c2a300a0023cb40144242128000084 +:1023a00024000624fa89400f000000001000c283b8 +:1023b00021e8c0031c00bf8f1800be8f2000bd277e +:1023c0000800e00300000000f0ffbd270c00beafd6 +:1023d00021f0a003211080001000c2a7f3ff022407 +:1023e0000000c2a31000c29782130200ffff423018 +:1023f000ff00423003004330020002240a0062144e +:10240000000000001000c29702120200ffff4230dd +:10241000ff0042303f0043300100022402006214fa +:10242000000000000000c0a30000c28321e8c00338 +:102430000c00be8f1000bd270800e0030000000064 +:10244000e0ffbd271c00bfaf1800beaf21f0a00306 +:102450001000c0a31200c0a71200c2272120400014 +:10246000212800006574400f000000001000c2a386 +:102470001000c28339004014000000001200c2970f +:1024800021204000f248400f000000001000c2a3cd +:102490001000c28330004014000000001200c297f8 +:1024a000ff0042300600432c2700601000000000af +:1024b00080180200019d023ccc24422421106200bd +:1024c0000000428c0800400000000000e424019d50 +:1024d000f424019d0425019d1425019d2425019dc1 +:1024e0003425019d01000224748082a35749400bca +:1024f0000000000002000224748082a35749400bb0 +:102500000000000002000224748082a35749400b9f +:102510000000000003000224748082a35749400b8e +:10252000000000000a000224748082a35749400b77 +:10253000000000000d000224748082a3000000004f +:102540005749400b000000000d000224748082a354 +:102550005749400b00000000748080a31000c28324 +:1025600021e8c0031c00bf8f1800be8f2000bd27cc +:102570000800e00300000000f0ffbd270c00beaf24 +:1025800021f0a003211880002110a0001000c3a397 +:102590001400c2a31000c29300120200201e027c8d +:1025a0001400c2932016027c251062002016027cc3 +:1025b0000200c2a70200c39769040224050062104a +:1025c000000000000200c3976804022404006214a3 +:1025d00000000000211000009649400b00000000a0 +:1025e000748082930400401400000000ffff022466 +:1025f0009649400b00000000748082930000c2a343 +:102600009149400b000000000000c39300a0023c71 +:10261000401803008c4042242110620000004294c4 +:102620000200c3970400621400000000ffff0224b0 +:102630009649400b000000000000c29301004224b4 +:102640000000c2a30000c2930d00422ceeff401414 +:10265000000000002110000021e8c0030c00be8f24 +:102660001000bd270800e00300000000c0ffbd27e8 +:102670003c00bfaf3800beaf21f0a0032140800076 +:102680004800c6af2120e0005400c38f5800c28f1d +:102690004000c8a34400c5a34c00c4a73000c3a792 +:1026a0003400c2a7ffff02241000c2a33400c29767 +:1026b0001400c2af4400c2937f004230ff0042309a +:1026c0001900c2a34000c2931800c2a3080002244c +:1026d0001a00c2a74800c28f0e0040100000000080 +:1026e0004c00c2973506422c270140100000000024 +:1026f0001a00c3974c00c29721106200ffff4230be +:102700001a00c2a74c00c2971400c38f23106200a6 +:102710001400c2af5000c28f100040100000000033 +:102720003400c3973000c297211062003506422c56 +:1027300018014010000000001a00c3971400c28f57 +:10274000ffff44303000c29721108200ffff42306b +:1027500021106200ffff42301a00c2a71800c29386 +:10276000211840001900c293212060002128400058 +:102770005e49400f000000001000c2a31000c28399 +:1027800007014014000000001a00c2973d06422cc9 +:10279000dc004010000000003948400f000000003d +:1027a0001000c2a31000c28300014014000000000a +:1027b0002000c0af2400c0a71c00c0af4000c393de +:1027c0001c00c28f251062001c00c2af4400c293df +:1027d000001a02001c00c28f251062001c00c2af4c +:1027e0001a00c297001c02001c00c28f2510620054 +:1027f0001c00c2af1c00c28f8c1004242128400092 +:10280000827b400f000000001000c2a31000c283b2 +:10281000c6004014000000001c00c0af1c00c28fa6 +:10282000020042341c00c2af1c00c28f7810042486 +:1028300021284000827b400f000000001000c2a34e +:102840001000c283bc00401400000000553e400f41 +:102850000000000021184000f0ff023c00f042346c +:10286000241862003000023c0900621400000000dd +:10287000ac10042401000524827b400f00000000fe +:102880001000c2a31000c283ae004014000000007c +:102890002000c0af2400c0a7504a400b0000000039 +:1028a0001c00c2277810042421284000727b400fae +:1028b000000000001000c2a31000c28327004014d3 +:1028c000000000002400c297ffff4230e803422cc2 +:1028d00005004014000000002400c29705000424f5 +:1028e0001183400f000000001c00c28f0200423024 +:1028f0000e004014000000002000c2271500033c19 +:102900000004643421284000727b400f0000000066 +:102910001000c2a31000c28313004010000000008a +:102920002000c0afde4a400b000000002400c29728 +:10293000ffff423001004224ffff42302400c2a7c3 +:102940002400c297ffff42308813422cd4ff40146a +:10295000000000005b4a400b000000000000000087 +:102960005b4a400b00000000000000002000c28f06 +:102970005d004010000000002000c28f2800c2afa0 +:102980001a00c2971a00c2a72800c38f1800c227d6 +:10299000212060002128400008000624037c400f0d +:1029a000000000001000c2a31000c28368004014a1 +:1029b000000000002800c28f080042242800c2af97 +:1029c0004800c28f10004010000000002800c38f94 +:1029d0004c00c297212060004800c58f2130400084 +:1029e000037c400f000000001000c2a31000c2834f +:1029f0005a004014000000004c00c3972800c28f0a +:102a0000211062002800c2af5000c28f1400401095 +:102a1000000000002800c38f1400c28f2110620044 +:102a20002800c2af2800c38f3000c2972120600069 +:102a30005000c58f21304000037c400f0000000093 +:102a40001000c2a31000c283470040140000000021 +:102a50003000c3972800c28f211062002800c2af47 +:102a60002000c28f801002001c00c2af1c00c28f69 +:102a7000020042341c00c2af1c00c28f6c10042440 +:102a800021284000827b400f000000001000c2a3fc +:102a90001000c2833700401400000000553e400f74 +:102aa0000000000021184000f0ff023c00f042341a +:102ab000241862003000023c16006214000000007e +:102ac000b010042401000524827b400f00000000a8 +:102ad0001000c2a31000c2830e00401000000000ce +:102ae000de4a400b000000009b48400f0000000041 +:102af0001000c2a3fdff02241000c2a3ec4a400b49 +:102b000000000000ffff02241000c2a3ec4a400bab +:102b1000000000009b48400f000000001000c2a30e +:102b20001000c283ed4a400b0000000000000000ce +:102b3000de4a400b0000000000000000de4a400baf +:102b40000000000000000000de4a400b0000000012 +:102b500000000000de4a400b000000000000000002 +:102b6000de4a400b0000000000000000de4a400b7f +:102b700000000000000000008348400f000000003b +:102b8000ec4a400b0000000000000000ec4a400b43 +:102b90000000000000000000ec4a400b00000000b4 +:102ba00000000000ec4a400b0000000000000000a4 +:102bb0001000c28321e8c0033c00bf8f3800be8fe5 +:102bc0004000bd270800e00300000000d8ffbd273b +:102bd0002400bfaf2000beaf21f0a0031000c0a3af +:102be0001400c2277010042421284000727b400f7b +:102bf000000000001000c2a31000c28312014014a4 +:102c0000000000001400c28f01004230ff0042307b +:102c1000fc004010000000001400c22770100424c3 +:102c200021284000727b400f000000001000c2a36a +:102c30001000c283f7004014000000001400c38f8e +:102c4000feff0224241062001400c2af1400c28fe1 +:102c50007010042421284000827b400f00000000f7 +:102c60001000c2a31000c283ed0040140000000059 +:102c70001400c2277010042421284000727b400fea +:102c8000000000001000c2a31000c283e70040143f +:102c90000000000000a0023cb40142240100032413 +:102ca000020043a01400c28f82100200ffff4230d6 +:102cb000ff0f42301200c2a71200c297cd00401091 +:102cc000000000001c00c0af1c00c22784100424b8 +:102cd00021284000727b400f000000001000c2a3ba +:102ce0001000c283d4004014000000001c00c38ff9 +:102cf00000a0023cb4014224040043ac1200c3977c +:102d000000a0023cb4014224080043ac1c00c38f65 +:102d10001800c2272120600021284000040006245a +:102d2000a67b400f000000001000c2a31a00c2974b +:102d3000ffff42301a00c2a71000c283c100401436 +:102d4000000000001a00c297ffff42301200c39734 +:102d50000c006210000000001200c3971a00c29716 +:102d6000ffff423023106200050042280500401496 +:102d700000000000faff02241000c2a3124c400b16 +:102d8000000000001800c293ff004330010002243d +:102d9000180062140000000000a0023cb4014224ac +:102da0000c00428c860040100000000000a0023c95 +:102db000b40142240c00428c1900c393ff0063301d +:102dc000212060001a00c397ffff6330f8ff6324df +:102dd000ffff6330212860001c00c38f08006324bc +:102de0002130600009f8400000000000f04b400b6b +:102df000000000001800c293ff00433002000224cc +:102e0000180062140000000000a0023cb40142243b +:102e10001000428c6a0040100000000000a0023c3c +:102e2000b40142241000428c1900c393ff006330a8 +:102e3000212060001a00c397ffff6330f8ff63246e +:102e4000ffff6330212860001c00c38f080063244b +:102e50002130600009f8400000000000f04b400bfa +:102e6000000000001800c293ff0043300400022459 +:102e7000180062140000000000a0023cb4014224cb +:102e80001400428c4e0040100000000000a0023ce4 +:102e9000b40142241400428c1900c393ff00633034 +:102ea000212060001a00c397ffff6330f8ff6324fe +:102eb000ffff6330212860001c00c38f08006324db +:102ec0002130600009f8400000000000f04b400b8a +:102ed000000000001800c293ff00433006000224e7 +:102ee000180062140000000000a0023cb40142245b +:102ef0001800428c320040100000000000a0023c8c +:102f0000b40142241800428c1900c393ff006330bf +:102f1000212060001a00c397ffff6330f8ff63248d +:102f2000ffff6330212860001c00c38f080063246a +:102f30002130600009f8400000000000f04b400b19 +:102f4000000000001800c293ff0043300500022477 +:102f5000180062140000000000a0023cb4014224ea +:102f60002000428c160040100000000000a0023c2f +:102f7000b40142242000428c1900c393ff00633047 +:102f8000212060001a00c397ffff6330f8ff63241d +:102f9000ffff6330212860001c00c38f08006324fa +:102fa0002130600009f8400000000000f04b400ba9 +:102fb00000000000faff0224134c400b0000000048 +:102fc00000a0023cb401422402004290ff004230c3 +:102fd0000500401000000000f847400f000000000e +:102fe000134c400b0000000021100000134c400b5c +:102ff00000000000feff02241000c2a3124c400b90 +:1030000000000000f4ff02241000c2a3124c400b89 +:103010000000000000000000124c400b0000000007 +:1030200000000000124c400b0000000000000000f7 +:10303000124c400b0000000000000000124c400b3e +:1030400000000000000000001000c28321e8c0035f +:103050002400bf8f2000be8f2800bd270800e0039a +:1030600000000000e0ffbd271c00bfaf1800beaf8e +:1030700021f0a0031000c0a3f34a400f000000009d +:103080001000c2a31000c28321e8c0031c00bf8f40 +:103090001800be8f2000bd270800e00300000000dc +:1030a000e0ffbd271c00bfaf1800beaf21f0a0039a +:1030b0002000c4af2400c5af2118c0002110e000db +:1030c0002800c3a72c00c2a31000c0a32000c28ff9 +:1030d00007004010000000002400c28f04004010d0 +:1030e000000000002800c2970d00401400000000fe +:1030f0002c00c2930600401000000000f847400f6b +:10310000000000001000c2a38c4c400b0000000027 +:10311000f4ff02241000c2a38c4c400b00000000fe +:103120002800c39700a0023cb40142240800428c4e +:103130002b1043000500401000000000f4ff0224a3 +:103140001000c2a38c4c400b0000000000a0023c09 +:10315000b40142240400438c2000c28f2b10430092 +:103160000e004014000000002800c3972000c28f0a +:103170002118620000a0023cb40142240400448ce7 +:1031800000a0023cb40142240800428c21108200bd +:103190002b1043000500401000000000f4ff022443 +:1031a0001000c2a38c4c400b000000002800c29706 +:1031b0002000c48f2400c58f21304000a67b400f23 +:1031c000000000001000c2a31000c28317004014ca +:1031d000000000002c00c2930f004014000000000b +:1031e00000a0023cb40142240400438c00a0023c35 +:1031f000b40142240800428c211862002800c497c0 +:103200002000c28f21108200231062000400422c93 +:103210000700401000000000f847400f00000000c9 +:103220001000c2a38c4c400b000000000000000006 +:103230001000c28321e8c0031c00bf8f1800be8f9e +:103240002000bd270800e00300000000f0ffbd27bc +:103250000c00beaf21f0a003211080001400c5af08 +:103260001000c2a30000c0a31000c2930700432cab +:10327000330060100000000080180200019d023c35 +:1032800094324224211062000000428c0800400069 +:10329000000000004033019dc832019db032019d05 +:1032a000f832019de032019d2833019d1033019dcc +:1032b00000a0023cb40142241400c38f100043acb0 +:1032c000d34c400b0000000000a0023cb40142249b +:1032d0001400c38f0c0043acd34c400b0000000023 +:1032e00000a0023cb40142241400c38f140043ac7c +:1032f000d34c400b0000000000a0023cb40142246b +:103300001400c38f1c0043acd34c400b00000000e2 +:1033100000a0023cb40142241400c38f180043ac47 +:10332000d34c400b0000000000a0023cb40142243a +:103330001400c38f200043acd34c400b00000000ae +:10334000f4ff02240000c2a3000000000000c283ba +:1033500021e8c0030c00be8f1000bd270800e00369 +:1033600000000000d8ffbd272400bfaf2000beaf83 +:1033700021f0a0032800c4af1000c0a30500022460 +:103380001400c2a30100023c0802443404000524d6 +:10339000827b400f00000000ff0043301000c2930a +:1033a00021106200ff0042301000c2a31400c2933b +:1033b0000100033c0c02643421284000827b400f52 +:1033c00000000000ff0043301000c2932110620093 +:1033d000ff0042301000c2a30100023c140244343a +:1033e00001000524827b400f00000000ff004330f5 +:1033f0001000c29321106200ff0042301000c2a3ef +:103400000100023c1c02443484100524827b400fde +:1034100000000000ff0043301000c2932110620042 +:10342000ff0042301000c2a30100023c04024434f9 +:1034300081000524827b400f00000000ff00433024 +:103440001000c29321106200ff0042301000c2a39e +:103450001800c2270100033c1802643421284000f0 +:10346000727b400f00000000ff0043301000c29349 +:1034700021106200ff0042301000c2a31000c2837e +:1034800007004014000000001800c38f0100022450 +:10349000efff621400000000294d400b0000000007 +:1034a000000000001000c28306004014000000006d +:1034b00084100424647b400f00000000324d400b58 +:1034c00000000000211000001800c2af1800c28fd9 +:1034d000ff0043302800c28f000043a01000c283c9 +:1034e00021e8c0032400bf8f2000be8f2800bd2725 +:1034f0000800e00300000000d8ffbd272400bfaf94 +:103500002000beaf21f0a0032800c4af2c00c5af3f +:103510003000c6af1c00c0af1000c0a30b000224d7 +:103520001400c2a32c00c28f02140200ff0042301c +:103530001500c2a32c00c28f02120200ff0042300d +:103540001600c2a32c00c28fff0042301700c2a396 +:10355000a5ff02241800c2a30100023c0802443463 +:103560003000c58f827b400f00000000ff00433019 +:103570001000c29321106200ff0042301000c2a36d +:103580001400c293211840001500c29300120200db +:10359000251862001600c29300140200251862006c +:1035a0001700c29300160200251062000100033cc0 +:1035b0000c02643421284000827b400f0000000090 +:1035c000ff0043301000c29321106200ff00423020 +:1035d0001000c2a31800c2930100033c100264341f +:1035e00021284000827b400f00000000ff00433094 +:1035f0001000c29321106200ff0042301000c2a3ed +:103600000100023c140244341f000524827b400f59 +:1036100000000000ff0043301000c2932110620040 +:10362000ff0042301000c2a30100023c1c024434df +:103630002800c58f827b400f00000000ff00433050 +:103640001000c29321106200ff0042301000c2a39c +:103650000100023c0402443485000524827b400fb3 +:1036600000000000ff0043301000c29321106200f0 +:10367000ff0042301000c2a31c00c2270100033c1f +:103680001802643421284000727b400f00000000c3 +:10369000ff0043301000c29321106200ff0042304f +:1036a0001000c2a31000c2830700401400000000f5 +:1036b0001c00c38f01000224efff62140000000011 +:1036c000b34d400b00000000000000001000c2835a +:1036d00021e8c0032400bf8f2000be8f2800bd2733 +:1036e0000800e00300000000d8ffbd272400bfafa2 +:1036f0002000beaf21f0a0032800c4af1800c0af67 +:103700001000c0a3200002241400c2a32800c28f0e +:1037100002140200ff0042301500c2a32800c28f2d +:1037200002120200ff0042301600c2a32800c28f1e +:10373000ff0042301700c2a30100023c08024434db +:1037400021280000827b400f00000000ff00433072 +:103750001000c29321106200ff0042301000c2a38b +:103760001400c293211840001500c29300120200f9 +:10377000251862001600c29300140200251862008a +:103780001700c29300160200251062000100033cde +:103790000c02643421284000827b400f00000000ae +:1037a000ff0043301000c29321106200ff0042303e +:1037b0001000c2a30100023c140244340f0005248f +:1037c000827b400f00000000ff0043301000c293d6 +:1037d00021106200ff0042301000c2a30100023c31 +:1037e0001c02443421280000827b400f00000000ae +:1037f000ff0043301000c29321106200ff004230ee +:103800001000c2a30100023c0402443484000524d9 +:10381000827b400f00000000ff0043301000c29385 +:1038200021106200ff0042301000c2a31800c2271e +:103830000100033c1802643421284000727b400fd1 +:1038400000000000ff0043301000c293211062000e +:10385000ff0042301000c2a31000c28307004014d2 +:10386000000000001800c38f01000224efff621463 +:1038700000000000204e400b00000000000000008f +:103880001000c28321e8c0032400bf8f2000be8f38 +:103890002800bd270800e00300000000d8ffbd2776 +:1038a0002400bfaf2000beaf21f0a0031800c0afbe +:1038b0001000c0a3060002241400c2a30100023cb1 +:1038c0000802443421280000827b400f00000000e1 +:1038d000ff0043301000c29321106200ff0042300d +:1038e0001000c2a31400c2930100033c0c02643414 +:1038f00021284000827b400f00000000ff00433081 +:103900001000c29321106200ff0042301000c2a3d9 +:103910000100023c1402443401000524827b400f64 +:1039200000000000ff0043301000c293211062002d +:10393000ff0042301000c2a30100023c1c024434cc +:1039400021280000827b400f00000000ff00433070 +:103950001000c29321106200ff0042301000c2a389 +:103960000100023c0402443481000524827b400fa4 +:1039700000000000ff0043301000c29321106200dd +:10398000ff0042301000c2a31800c2270100033c10 +:103990001802643421284000727b400f00000000b0 +:1039a000ff0043301000c29321106200ff0042303c +:1039b0001000c2a31000c2830700401400000000e2 +:1039c0001800c38f01000224efff62140000000002 +:1039d000774e400b00000000000000001000c28382 +:1039e00021e8c0032400bf8f2000be8f2800bd2720 +:1039f0000800e00300000000d8ffbd272400bfaf8f +:103a00002000beaf21f0a0031800c0af1000c0a37b +:103a1000040002241400c2a30100023c0802443442 +:103a200021280000827b400f00000000ff0043308f +:103a30001000c29321106200ff0042301000c2a3a8 +:103a40001400c2930100033c0c026434212840009e +:103a5000827b400f00000000ff0043301000c29343 +:103a600021106200ff0042301000c2a30100023c9e +:103a70001402443401000524827b400f0000000042 +:103a8000ff0043301000c29321106200ff0042305b +:103a90001000c2a30100023c1c0244342128000093 +:103aa000827b400f00000000ff0043301000c293f3 +:103ab00021106200ff0042301000c2a30100023c4e +:103ac0000402443481000524827b400f0000000082 +:103ad000ff0043301000c29321106200ff0042300b +:103ae0001000c2a31800c2270100033c180264346e +:103af00021284000727b400f00000000ff0043308f +:103b00001000c29321106200ff0042301000c2a3d7 +:103b10001000c28307004014000000001800c38f8b +:103b200001000224efff621400000000ce4e400ba3 +:103b300000000000000000001000c28321e8c00364 +:103b40002400bf8f2000be8f2800bd270800e0039f +:103b500000000000d8ffbd272400bfaf2000beaf8b +:103b600021f0a0032800c4af2c00c5af3000c6afc1 +:103b70001800c0af1000c0a3020002241400c2a3aa +:103b80002c00c28f02140200ff0042301500c2a3b5 +:103b90002c00c28f02120200ff0042301600c2a3a6 +:103ba0002c00c28fff0042301700c2a30100023c6c +:103bb0000802443421280000827b400f00000000ee +:103bc000ff0043301000c29321106200ff0042301a +:103bd0001000c2a31400c293211840001500c29324 +:103be00000120200251862001600c29300140200a1 +:103bf000251862001700c29300160200251062000b +:103c00000100033c0c02643421284000827b400ff9 +:103c100000000000ff0043301000c293211062003a +:103c2000ff0042301000c2a30100023c14024434e1 +:103c30000f000524827b400f00000000ff0043308e +:103c40001000c29321106200ff0042301000c2a396 +:103c50000100023c1c0244342800c58f827b400fc7 +:103c600000000000ff0043301000c29321106200ea +:103c7000ff0042301000c2a33000c28f0098427c87 +:103c800000120200840042340100033c0402643448 +:103c900021284000827b400f00000000ff004330dd +:103ca0001000c29321106200ff0042301000c2a336 +:103cb0001800c2270100033c180264342128400088 +:103cc000727b400f00000000ff0043301000c293e1 +:103cd00021106200ff0042301000c2a31000c28316 +:103ce00007004014000000001800c38f01000224e8 +:103cf000efff621400000000414f400b0000000085 +:103d0000000000001000c28321e8c0032400bf8f20 +:103d10002000be8f2800bd270800e003000000003f +:103d2000e0ffbd271c00bfaf1800beaf21f0a0030d +:103d30002000c4af2400c5af2800c6af1000c0a348 +:103d40000d00043c2400c58f2800c68f3e4d400f57 +:103d5000000000001000c2a31000c283090040143c +:103d6000000000000d00043c2000c58f2800c68f15 +:103d7000a67b400f000000001000c2a3624f400b62 +:103d800000000000000000001000c28321e8c00312 +:103d90001c00bf8f1800be8f2000bd270800e00365 +:103da00000000000d0ffbd272c00bfaf2800beaf31 +:103db00021f0a0033000c4af3400c5af2110c00013 +:103dc0003800c2a71000c0a33800c2970d00043c01 +:103dd0003400c58f21304000037c400f00000000fc +:103de000ff0043301000c29321106200ff004230f8 +:103df0001000c2a31400c0af1800c0afad4f400bfd +:103e000000000000274e400f000000002600401474 +:103e1000000000003800c2970d00043c3000c58f40 +:103e200021304000d54e400f000000001e0040141d +:103e3000000000001c00c0af9f4f400b00000000be +:103e40002000c22721204000d94c400f0000000074 +:103e500014004014000000002000c2930100423012 +:103e600006004014000000001800c28f0100422428 +:103e70001800c2afaa4f400b000000001c00c28f08 +:103e8000010042241c00c2af1c00c38f50c3023487 +:103e90002a106200eaff401400000000aa4f400b05 +:103ea00000000000000000001400c28f0100422446 +:103eb0001400c2af1400c28f040042280500401055 +:103ec000000000001800c28f02004228cdff4014fd +:103ed000000000007e4e400f000000001000c2a352 +:103ee0001800c28f020042280300401000000000aa +:103ef000f4ff02241000c2a31000c28321e8c00313 +:103f00002c00bf8f2800be8f3000bd270800e003c3 +:103f100000000000d8ffbd272400bfaf2000beafc7 +:103f200021f0a0031c00c0af1000c0af1400c0a35c +:103f30009fff02241800c2a30100023c080244347f +:103f400004000524827b400f00000000ff00433086 +:103f50001400c29321106200ff0042301400c2a37b +:103f60001800c2930100033c0c0264342128400075 +:103f7000827b400f00000000ff0043301400c2931a +:103f800021106200ff0042301400c2a30100023c75 +:103f90001402443401000524827b400f000000001d +:103fa000ff0043301400c29321106200ff00423032 +:103fb0001400c2a30100023c1c02443484100524f6 +:103fc000827b400f00000000ff0043301400c293ca +:103fd00021106200ff0042301400c2a30100023c25 +:103fe0000402443481000524827b400f000000005d +:103ff000ff0043301400c29321106200ff004230e2 +:104000001400c2a31c00c2270100033c1802643440 +:1040100021284000727b400f00000000ff00433069 +:104020001400c29321106200ff0042301400c2a3aa +:104030001400c28312004014000000001000c28f60 +:10404000010042241000c2af1000c28ff501422cc3 +:104050000500401400000000fbff02241400c2a36e +:104060002150400b000000001c00c38f01000224ff +:10407000e4ff6214000000002150400b000000002b +:10408000000000001400c28306004014000000007d +:1040900084100424647b400f000000002a50400b71 +:1040a00000000000211000001c00c2af1c00c28fe5 +:1040b00021e8c0032400bf8f2000be8f2800bd2749 +:1040c0000800e00300000000e0ffbd271c00bfafb8 +:1040d0001800beaf21f0a0032000c4af2400c5af7c +:1040e0002800c6af1000c0a32800c38f018002348f +:1040f0002b1062001a004014000000002000c48f42 +:104100002400c58f00800634484f400f0000000097 +:104110001000c2a31000c283190040140000000068 +:104120002800c28f008042242800c2af2400c38f21 +:1041300000800234211062002400c2af2000c38f2f +:1041400000800234211062002000c2af2800c38f1b +:10415000018002342b106200e8ff401000000000d4 +:104160002000c48f2400c58f2800c68f484f400f01 +:10417000000000001000c2a36150400b00000000ce +:10418000000000001000c28321e8c0031c00bf8fa4 +:104190001800be8f2000bd270800e00300000000cb +:1041a000d8ffbd272400bfaf2000beaf21f0a00381 +:1041b0002800c4af2c00c5af3000c6af1000c0a3ac +:1041c000000102241400c2af2c00c38f1400c28f60 +:1041d0001b006200f4014000101000001800c2af84 +:1041e0003000c28f0500401400000000f4ff0224dc +:1041f0001000c2a3d450400b000000001800c28f72 +:104200004d004010000000001400c38f1800c28f42 +:10421000231062001c00c2af3000c38f1c00c28f8d +:104220002b10430005004010000000001c00c28f4e +:10423000ffff42309150400b000000003000c28f61 +:10424000ffff42302c00c48f2800c58f2130400072 +:10425000694f400f00000000050040100000000002 +:10426000f4ff02241000c2a3d450400b0000000051 +:104270003000c38f1c00c28f2b106200330040142b +:10428000000000002800c38f1c00c28f21106200b4 +:104290002800c2af2c00c38f1c00c28f2110620007 +:1042a0002c00c2af3000c38f1c00c28f23106200ed +:1042b0003000c2afce50400b000000001400c28f8f +:1042c0003000c38f3000c48f2b2044000a106400dc +:1042d0001c00c2af1c00c28fffff42302c00c48ff5 +:1042e0002800c58f21304000694f400f00000000ba +:1042f0000500401000000000f4ff02241000c2a3db +:10430000d450400b000000002800c38f1c00c28f57 +:10431000211062002800c2af2c00c38f1c00c28f86 +:10432000211062002c00c2af3000c38f1c00c28f6e +:10433000231062003000c2af3000c28fdfff401494 +:1043400000000000d450400b0000000000000000fe +:104350001000c28321e8c0032400bf8f2000be8f5d +:104360002800bd270800e00300000000d0ffbd27a3 +:104370002c00bfaf2800beaf21f0a0033000c4afb7 +:104380003400c5af1000c0af2000c0a33000c28f02 +:104390001000c2af3251400b000000001800c0af47 +:1043a0001400c0af2051400b00000000274e400f0a +:1043b000000000002f004014000000002000c22771 +:1043c00021204000d94c400f00000000290040147b +:1043d000000000001000c48fba4d400f0000000024 +:1043e00024004014000000002000c22721204000cb +:1043f000d94c400f000000001e00401400000000d7 +:104400001c00c0af1251400b000000002000c2276a +:1044100021204000d94c400f00000000140040143f +:10442000000000002000c29301004230060040144a +:10443000000000001400c28f010042241400c2af2b +:104440001d51400b000000001c00c28f01004224df +:104450001c00c2af1c00c38f50c302342a1062007c +:10446000eaff4014000000001d51400b0000000056 +:10447000000000001800c28f010042241800c2afe3 +:104480001800c28f04004228050040100000000000 +:104490001400c28f02004228c4ff40140000000034 +:1044a0001400c38f02000224040062100000000008 +:1044b000f4ff02243a51400b000000001000c28fac +:1044c000001042241000c2af3400c38f3000c28fee +:1044d000211862001000c28f2b104300afff401460 +:1044e000000000002110000021e8c0032c00bf8f55 +:1044f0002800be8f3000bd270800e0030000000048 +:10450000e0ffbd271c00bfaf1800beaf21f0a00325 +:104510001000c0af1400c0afb480828f11004014ef +:1045200000000000c54f400f000000001000c2afa7 +:104530001000c38fffff02240a0062100000000079 +:104540001000c28f02140200ff004230efff42242d +:104550001400c2af1400c28f0100032404104300f2 +:10456000b48082afb480828f21e8c0031c00bf8f6b +:104570001800be8f2000bd270800e00300000000e7 +:10458000e0ffbd271c00beaf21f0a00388bf033ca5 +:104590002061628c01000424c418827c206162ac1a +:1045a000c404023c00b442340000c2af7d01023cae +:1045b000407842340400c2af0400c28f40100200b1 +:1045c0000000c38f1b006200f401400010180000bf +:1045d000121000000800c2af0400c28f4010020099 +:1045e0000000c38f1b006200f401400010100000a7 +:1045f00004004010000000000800c28f01004224a7 +:104600000800c2af0800c28f0101422c0300401411 +:1046100000000000000102240800c2af0800c28fa1 +:1046200004004010000000000800c28fffff422479 +:104630000800c2af0800c28fff004230498182a348 +:10464000c404023c00b442340c00c2af1602023c67 +:10465000c00e42341000c2af1000c28f40100200e2 +:104660000c00c38f1b006200f40140001018000012 +:10467000121000001400c2af1000c28f40100200e0 +:104680000c00c38f1b006200f401400010100000fa +:1046900004004010000000001400c28f01004224fa +:1046a0001400c2af1400c28f0101422c0300401459 +:1046b00000000000000102241400c2af1400c28fe9 +:1046c00004004010000000001400c28fffff4224cd +:1046d0001400c2af1400c28fff004230488182a391 +:1046e0004c8180af21e8c0031c00be8f2000bd2795 +:1046f0000800e00300000000e8ffbd271400bfaf82 +:104700001000beaf21f0a0035852400f000000007f +:104710002118400001000224220062140000000061 +:10472000fe51400f0000000088bf033c2061628cf6 +:10473000c418027c206162ac488182930100042489 +:10474000212840005d8b400f0000000048818293cb +:1047500021200000212840005d8b400f0000000058 +:1047600088bf033c2061628c01000424c418827c51 +:10477000206162ac010004241752400f00000000c9 +:10478000010002244c8182af029d023c2027442478 +:10479000328c400f0000000001000224ef51400b5a +:1047a000000000004c8180af029d023c3827442469 +:1047b000328c400f000000002110000021e8c003ef +:1047c0001400bf8f1000be8f1800bd270800e00343 +:1047d00000000000f8ffbd270400beaf21f0a003d9 +:1047e0004c81828f21e8c0030400be8f0800bd27e2 +:1047f0000800e00300000000e8ffbd271400bfaf81 +:104800001000beaf21f0a00388bf033c2061628c82 +:10481000c418027c206162ac4881829306000424a3 +:10482000212840005d8b400f0000000088bf033c42 +:104830002061628c01000424c418827c206162ac77 +:104840000100022421e8c0031400bf8f1000be8fb6 +:104850001800bd270800e00300000000e0ffbd27ae +:104860001c00bfaf1800beaf21f0a0032000c4aff2 +:1048700088bf033c2061628cc418027c206162ac5a +:104880004981829305000424212840005d8b400f5c +:10489000000000001000c2a3498182932120000083 +:1048a000212840005d8b400f000000001000c2a3d3 +:1048b00088bf033c2061628c01000424c418827c00 +:1048c000206162ac2000c28f070040100000000091 +:1048d0001000c293029d033c582764242128400005 +:1048e000438c400f000000001000c29321e8c00379 +:1048f0001c00bf8f1800be8f2000bd270800e003fa +:1049000000000000e0ffbd271c00bfaf1800beafd5 +:1049100021f0a003212000001752400f00000000ea +:104920001000c2a31000c29301004230ff004230c9 +:104930000400401000000000010002245252400b0d +:10494000000000002110000021e8c0031c00bf8f00 +:104950001800be8f2000bd270800e0030000000003 +:10496000e0ffbd271c00bfaf1800beaf21f0a003c1 +:1049700088bf033c2061628cc418027c206162ac59 +:104980004981829390000424212840005d8b400fd0 +:10499000000000004981829321200000212840006e +:1049a0005d8b400f000000004981829321200000b0 +:1049b000212840005d8b400f000000004981829358 +:1049c00021200000212840005d8b400f00000000e6 +:1049d0004981829321200000212840005d8b400ff7 +:1049e000000000001000c2a3498182932120000032 +:1049f000212840005d8b400f000000001100c2a381 +:104a000088bf033c2061628c01000424c418827cae +:104a1000206162ac1000c393bf0002240500621441 +:104a2000000000001100c393410002240c0062103a +:104a3000000000001000c3931100c293029d043ccb +:104a4000782784242128600021304000438c400fc7 +:104a50000000000021100000a152400b00000000e7 +:104a60001000c3931100c293029d043cb427842418 +:104a70002128600021304000438c400f00000000de +:104a80000100022421e8c0031c00bf8f1800be8f64 +:104a90002000bd270800e00300000000e0ffbd2764 +:104aa0001c00bfaf1800beaf21f0a0032000c4afb0 +:104ab0002400c5af2800c6af2800c38f2400c28fd2 +:104ac00021106200ffff43242000023c2a106200f4 +:104ad0000400401400000000211000000153400bae +:104ae0000000000088bf033c2061628cc418027c77 +:104af000206162ac498182930b000424212840008c +:104b00005d8b400f000000002800c38fff00023cb7 +:104b10002410620003140200ff00423021184000fc +:104b20004881829321206000212840005d8b400f46 +:104b3000000000002800c28f00ff42300312020074 +:104b4000ff004230211840004881829321206000fc +:104b5000212840005d8b400f000000002800c28f1c +:104b6000ff004230211840004881829321206000dc +:104b7000212840005d8b400f000000004881829397 +:104b800021200000212840005d8b400f0000000024 +:104b90001000c0aff652400b000000004881829325 +:104ba000de000424212840005d8b400f000000003f +:104bb0001400c2a32000c28f1400c393000043a0be +:104bc0002000c28f010042242000c2af1000c28f1b +:104bd000010042241000c2af1000c38f2400c28f16 +:104be0002a106200edff40140000000088bf033c63 +:104bf0002061628c01000424c418827c206162acb4 +:104c00000100022421e8c0031c00bf8f1800be8fe2 +:104c10002000bd270800e00300000000e8ffbd27da +:104c20001400bfaf1000beaf21f0a0031800c4af46 +:104c30001800c28fff0f4230040040100000000037 +:104c4000211000004b53400b00000000fe51400fac +:104c50000000000088bf033c2061628cc418027c05 +:104c6000206162ac48818293200004242128400006 +:104c70005d8b400f000000001800c38fff00023c56 +:104c80002410620003140200ff004230211840008b +:104c90004881829321206000212840005d8b400fd5 +:104ca000000000001800c28f00ff42300312020013 +:104cb000ff0042302118400048818293212060008b +:104cc000212840005d8b400f000000001800c28fbb +:104cd000ff0042302118400048818293212060006b +:104ce000212840005d8b400f0000000088bf033c7e +:104cf0002061628c01000424c418827c206162acb3 +:104d00001800c28f010042241800c2af000000004a +:104d10004152400f00000000211840000100022411 +:104d2000fbff6210000000000100022421e8c00324 +:104d30001400bf8f1000be8f1800bd270800e003cd +:104d400000000000e8ffbd271400bfaf1000beaf99 +:104d500021f0a0031800c4af1c00c5af1800c28f1b +:104d6000ffff42300400401000000000211000004e +:104d7000a053400b000000001800c38fffff023457 +:104d8000211862002000023c2a1062000400401436 +:104d90000000000021100000a053400b00000000a4 +:104da000fe51400f0000000088bf033c2061628c70 +:104db000c418027c206162ac48818293d80004242c +:104dc000212840005d8b400f000000001800c38fb9 +:104dd000ff00023c2410620003140200ff00423076 +:104de0002118400048818293212060002128400042 +:104df0005d8b400f000000001800c28f00ff4230a2 +:104e000003120200ff0042302118400048818293c3 +:104e100021206000212840005d8b400f0000000031 +:104e20001800c28fff004230211840004881829351 +:104e300021206000212840005d8b400f0000000011 +:104e400088bf033c2061628c01000424c418827c6a +:104e5000206162ac1c00c28f0800401000000000fe +:104e6000000000004152400f0000000021184000e7 +:104e700001000224fbff6210000000000100022478 +:104e800021e8c0031400bf8f1000be8f1800bd279b +:104e90000800e00300000000d8ffbd272400bfafda +:104ea0002000beaf21f0a0032800c4af2c00c5af86 +:104eb0002800c28fff0f42300400401000000000a5 +:104ec000211000000f54400b000000002c00c38f85 +:104ed0000100022404006214000000002800c48fb6 +:104ee0000753400f0000000000a0023cb41a422407 +:104ef0001000c2af1400c0af0a54400b0000000005 +:104f00001000c28f000042901800c2a3fe51400f53 +:104f1000000000002800c38fff00023c2410620044 +:104f2000031402001900c2a32800c28f00ff423000 +:104f3000031202001a00c2a32800c28f1b00c2a3e2 +:104f40001c00c0af88bf033c2061628cc418027c87 +:104f5000206162ac48818293020004242128400031 +:104f60005d8b400f000000001900c2932118400023 +:104f70004881829321206000212840005d8b400ff2 +:104f8000000000001a00c29321184000488182935b +:104f900021206000212840005d8b400f00000000b0 +:104fa0001b00c29321184000488182932120600099 +:104fb000212840005d8b400f000000001800c393c3 +:104fc0004881829321206000212840005d8b400fa2 +:104fd0000000000088bf033c2061628c01000424b3 +:104fe000c418827c206162ac1000c28f0100422490 +:104ff0001000c2af2800c28f010042242800c2afb7 +:10500000000000004152400f000000002118400045 +:1050100001000224fbff6210000000001400c28f98 +:10502000010042241400c2af1400c28f00104228b5 +:10503000b3ff4014000000000100022421e8c00377 +:105040002400bf8f2000be8f2800bd270800e0038a +:1050500000000000e8ffbd271400bfaf1000beaf86 +:1050600021f0a0031800c4af2110a0002000c6af9b +:105070001c00c2a31800c38f2000023c2b1062004a +:105080000400401400000000211000006454400b94 +:1050900000000000fe51400f0000000088bf033cec +:1050a0002061628cc418027c206162ac48818293ca +:1050b00002000424212840005d8b400f0000000006 +:1050c0001800c38fff00023c24106200021402008b +:1050d000ff00423021184000488182932120600067 +:1050e000212840005d8b400f000000001800c28f97 +:1050f00000ff423002120200ff004230211840003f +:105100004881829321206000212840005d8b400f60 +:10511000000000001800c28fff004230211840003c +:105120004881829321206000212840005d8b400f40 +:10513000000000001c00c2932118400048818293a7 +:1051400021206000212840005d8b400f00000000fe +:1051500088bf033c2061628c01000424c418827c57 +:10516000206162ac2000c28f0800401000000000e7 +:10517000000000004152400f0000000021184000d4 +:1051800001000224fbff6210000000000100022465 +:1051900021e8c0031400bf8f1000be8f1800bd2788 +:1051a0000800e00300000000c8ffbd273400bfafc7 +:1051b0003000beaf21f0a0033800c4af3c00c5af43 +:1051c0004000c6af1c00c0af4000c38f3c00c28f80 +:1051d000211062002000c2af4000c28f1000c2af99 +:1051e0003800c28f1400c2af2000c38f2000023ce1 +:1051f0002a1062004c004014000000002110000042 +:10520000ce54400b000000001000c28fff0f43245b +:10521000000044280b106400031302000013020076 +:105220002400c2af00a0023cb41a4424001005249c +:105230002400c68fa752400f000000002118400034 +:105240000100022404006210000000002110000090 +:10525000ce54400b0000000000a0023cb41a4324ce +:105260001000c48f2400c28f23108200211062001e +:105270001800c2af2800c0afc754400b00000000a8 +:105280001400c28f000043801800c28f000043a0aa +:105290001800c28f010042241800c2af1400c28f50 +:1052a000010042241400c2af1000c28f010042244a +:1052b0001000c2af1000c38f2000c28f0b00621419 +:1052c00000000000010002242800c2af01000224f7 +:1052d0001c00c2af2400c48f01000524a653400f58 +:1052e00000000000ca54400b000000001000c28ff4 +:1052f000ff0f4230090040140000000001000224aa +:105300002800c2af2400c48f01000524a653400f1b +:1053100000000000ca54400b000000002800c28fab +:10532000d7ff4010000000001c00c28fb6ff4010e5 +:10533000000000000100022421e8c0033400bf8ff8 +:105340003000be8f3800bd270800e00300000000d9 +:1053500060ffbd279c00bfaf9800beaf21f0a00347 +:10536000211880002110a000a800c6afa000c3a390 +:10537000a400c2a71100c0a3a000c293060003248a +:1053800020004310000000000700032433004310f6 +:105390000000000001000324aa00431400000000e4 +:1053a0002800c227a800c48f2128400070000624ce +:1053b00021380000284c400f000000001100c2a35b +:1053c0001100c2838f004014000000007c80828f97 +:1053d0008f00401000000000a800c28f700042241f +:1053e000808082af7c80828f2800c3270100042444 +:1053f0002128600009f84000000000009155400b92 +:10540000000000001c00c227a800c48f2128400013 +:105410000400062421380000284c400f0000000042 +:105420001100c2a31100c2837c00401400000000e0 +:105430007c80828f7c004010000000007c80828f86 +:105440001c00c327060004242128600009f840003e +:10545000000000009155400b0000000001000224f4 +:105460001000c2a32000c227a800c48f212840003a +:105470000800062421380000284c400f00000000de +:105480001100c2a31100c2835100401400000000ab +:105490002400c2971200c2a72600c2971400c2a718 +:1054a0002200c2971600c2a72000c2971800c2af00 +:1054b0001200c29703004014000000000100022403 +:1054c000108082af1200c3971400c29721186200a7 +:1054d0001600c29702006210000000001000c0a376 +:1054e0001800c28f010003242c00431000000000ac +:1054f0000100432c09006014000000000200032496 +:105500000e00431000000000030003240f004310ae +:10551000000000005f55400b000000001080838fea +:105520000100022420006214000000001800c28f55 +:10553000108082af7455400b000000001800c28f2d +:10554000108082af7455400b000000001080838fe4 +:105550000200022417006210000000001080838ff8 +:105560000400022416006210000000001800c28f20 +:10557000108082af7455400b000000001080838fb4 +:105580000200022411006210000000000400022446 +:10559000108082af7455400b000000000000000036 +:1055a0007455400b00000000000000007455400bd3 +:1055b00000000000000000007455400b00000000d7 +:1055c000000000007455400b0000000000000000c7 +:1055d0001000c29317004010000000007c80828ff2 +:1055e00017004010000000007c80828f0700042418 +:1055f0001080852709f84000000000009155400bfd +:1056000000000000000000009155400b0000000069 +:10561000000000009155400b000000000000000059 +:105620009155400b00000000000000009155400b18 +:1056300000000000000000009155400b0000000039 +:105640000000000021e8c0039c00bf8f9800be8fbf +:10565000a000bd270800e00300000000e0ffbd2718 +:105660001c00bfaf1800beaf21f0a0032000c4afe4 +:105670001000c0a32000c28f7c8082af808080afea +:1056800004000224108082af05000424019d023c26 +:1056900050534524934c400f000000001000c2a35b +:1056a0001000c28321e8c0031c00bf8f1800be8f0a +:1056b0002000bd270800e00300000000d0ffbd2748 +:1056c0002c00bfaf2800beaf21f0a0033000c4af54 +:1056d0003400c5af2110c0003800c2a72000c0a30d +:1056e0003000c28f3800c3973400c48f1000a4afbd +:1056f0001400a3af700003241800a3af0500042416 +:105700008200052421304000700007249b49400f8f +:10571000000000002000c2a32000c28321e8c003d3 +:105720002c00bf8f2800be8f3000bd270800e0038b +:1057300000000000b8ffbd274400bfaf4000beaf6f +:1057400021f0a0034800c4af4c00c5af2000c0a3a7 +:105750004c00c28f0106422c2300401000000000c4 +:105760004800c28f2800c2af2800c28fc86e032431 +:10577000000043a44c00c28f0300422482100200a8 +:10578000ffff43302800c28f020043a42800c28fcd +:10579000040040a44c00c28f030042248210020087 +:1057a000ffff43302800c28f060043a44c00c28f85 +:1057b000ffff42304800c38f1000a3af1400a2af18 +:1057c0001800a0af05000424840005242130000047 +:1057d000213800009b49400f000000002000c2a3b8 +:1057e0009856400b000000002400c0af2c00c0af52 +:1057f0004800c38f2400c28f211062003400c327e9 +:105800002120600021284000080006240e87400f58 +:10581000000000004c00c38f2400c28f23106200e0 +:10582000000503240105442c0a1064002c00c2afbb +:105830004800c38f2400c28f211062003000c2af25 +:105840003000c28fc86e0324000043a44c00c28ff6 +:105850000300422482100200ffff43303000c28f59 +:10586000020043a42400c28f0300422482100200dd +:10587000ffff43303000c28f040043a42c00c28fce +:105880000300422482100200ffff43303000c28f29 +:10589000060043a44800c38f2400c28f2118620071 +:1058a0002c00c28fffff42301000a3af1400a2af44 +:1058b0001800a0af05000424840005242130000056 +:1058c000213800009b49400f000000002000c2a3c7 +:1058d0004800c38f2400c28f211862003400c22701 +:1058e0002120600021284000080006240e87400f78 +:1058f000000000002400c38f2c00c28f2110620022 +:105900002400c2af9356400b000000002400c28f59 +:10591000f8ff42244800c38f211062003400c327df +:105920002120600021284000080006240e87400f37 +:10593000000000004c00c38f2400c28f23106200bf +:10594000000503240105442c0a1064002c00c2af9a +:105950002c00c28f03004324fcff022424106200a9 +:105960002c00c2af2400c28ff8ff42244800c38f2e +:10597000211062003000c2af3000c28fc86e032415 +:10598000000043a44c00c28f030042248210020096 +:10599000ffff43303000c28f020043a42400c28fb7 +:1059a0000300422482100200ffff43303000c28f08 +:1059b000040043a42c00c28f030042248210020082 +:1059c000ffff43303000c28f060043a42400c28f83 +:1059d000f8ff42244800c38f211862002c00c28fb8 +:1059e000ffff423008004224ffff42301000a3af07 +:1059f0001400a2af1800a0af050004248400052401 +:105a000021300000213800009b49400f00000000b9 +:105a10002000c2a32400c28ff8ff42244800c38f95 +:105a2000211862003400c227212060002128400094 +:105a3000080006240e87400f000000002400c38fda +:105a40002c00c28f211062002400c2af2400c38f3b +:105a50004c00c28f2b106200acff4014000000000d +:105a60002000c28321e8c0034400bf8f4000be8fe6 +:105a70004800bd270800e00300000000e0ffbd274c +:105a80001c00bfaf1800beaf21f0a0032000c4afc0 +:105a90002400c5af2800c6af2c00c7aff4ff022416 +:105aa0001000c2a38080828f040040140000000018 +:105ab000f4ff0224a657400b000000002000c28f14 +:105ac00010004010000000002400c28f0d004010a4 +:105ad000000000002800c28f0a00401000000000f3 +:105ae0002c00c28f07004010000000003000c28f61 +:105af00004004010000000003400c28f0500401474 +:105b000000000000f1ff02241000c2a39f57400bc9 +:105b1000000000008080838f1600c22721206000d3 +:105b2000212840000200062421380000284c400fa4 +:105b300000000000b2004014000000001600c297f0 +:105b400000120200201e027c1600c2970212020000 +:105b5000ffff42302016027c251062002016027cd6 +:105b6000ffff4230211840002000c28f000043acec +:105b70008080828f02004224808082af8080838f69 +:105b80001600c227212060002128400002000624c0 +:105b900021380000284c400f000000009b004014fa +:105ba000000000001600c29700120200201e027cb6 +:105bb0001600c29702120200ffff42302016027c3c +:105bc000251062002016027cffff42301600c2a79b +:105bd0001600c2972100422c8f00401000000000e8 +:105be0001600c3973400c28f400043a48080828f88 +:105bf00002004224808082af8080838f1200c227ff +:105c000021206000212840000200062421380000e5 +:105c1000284c400f000000008200401400000000eb +:105c20001200c29700120200201e027c1200c297ce +:105c300002120200ffff42302016027c2510620093 +:105c40002016027cffff42301200c2a72800c28f3c +:105c5000000043941200c2972b106200740040149d +:105c6000000000001200c3972800c28f000043a468 +:105c70008080828f02004224808082af8080838f68 +:105c80001400c227212060002128400002000624c1 +:105c900021380000284c400f00000000670040142d +:105ca000000000001400c29700120200201e027cb7 +:105cb0001400c29702120200ffff42302016027c3d +:105cc000251062002016027cffff42301400c2a79c +:105cd0003000c28f000043941400c2972b10620062 +:105ce00059004014000000001400c3973000c28f18 +:105cf000000043a48080828f02004224808082af13 +:105d00008080848f3400c38f1600c29721286000e2 +:105d10002130400021380000284c400f00000000d6 +:105d20004c004014000000001600c29721184000eb +:105d30008080828f21106200808082af8080848f7b +:105d40003400c28f200043241600c297212860002f +:105d50002130400021380000284c400f0000000096 +:105d60003f004014000000001600c29721184000b8 +:105d70008080828f21106200808082af8080838f3c +:105d80001200c297212060002400c58f21304000fe +:105d900021380000284c400f000000003300401460 +:105da000000000001200c297211840008080828ffe +:105db00021106200808082af8080838f1400c297a0 +:105dc000212060002c00c58f2130400021380000c8 +:105dd000284c400f00000000270040140000000085 +:105de0001400c297211840008080828f2110620029 +:105df000808082af21100000a657400b00000000f9 +:105e0000000000009f57400b000000000000000051 +:105e10009f57400b00000000000000009f57400b00 +:105e200000000000000000009f57400b0000000031 +:105e3000000000009f57400b000000000000000021 +:105e40009f57400b00000000000000009f57400bd0 +:105e500000000000000000009f57400b0000000001 +:105e6000000000009f57400b0000000000000000f1 +:105e70009f57400b000000000000000021200000a0 +:105e8000212800002130000001000724284c400f89 +:105e9000000000001000c28321e8c0031c00bf8f77 +:105ea0001800be8f2000bd270800e003000000009e +:105eb000d8ffbd272400bfaf2000beaf21f0a00354 +:105ec0002800c4af2c00c5af3000c6af3400c7af48 +:105ed000200002241800c2a7400002241a00c2a712 +:105ee0002800c28f1a00c3271000a3af3400c38f4d +:105ef0001400a3af212040002c00c58f1800c2273a +:105f0000213040003000c78f9f56400f0000000036 +:105f100021e8c0032400bf8f2000be8f2800bd27ca +:105f20000800e00300000000e0ffbd271c00bfaf39 +:105f30001800beaf21f0a0032000c4af2110a000c4 +:105f40002400c2a7f4ff02241000c2a38080828f25 +:105f50000400401400000000f4ff0224f557400b39 +:105f6000000000002000c28f050040140000000067 +:105f7000f1ff02241000c2a3ee57400b0000000006 +:105f80008080838f2400c297212060002000c58f6d +:105f90002130400021380000284c400f0000000054 +:105fa000040040140000000021100000f557400bd1 +:105fb0000000000000000000212000002128000057 +:105fc0002130000001000724284c400f0000000091 +:105fd0001000c28321e8c0031c00bf8f1800be8fd1 +:105fe0002000bd270800e00300000000e8ffbd27f7 +:105ff0001400bfaf1000beaf21f0a00321200000ad +:10600000212800002130000001000724284c400f07 +:106010000000000021e8c0031400bf8f1000be8ff5 +:106020001800bd270800e00300000000e8ffbd27be +:106030001400bfaf1000beaf21f0a003fb57400f0c +:106040000000000021e8c0031400bf8f1000be8fc5 +:106050001800bd270800e00300000000f8ffbd277e +:106060000400beaf21f0a003808080af21e8c00310 +:106070000400be8f0800bd270800e00300000000f8 +:10608000d0ffbd272c00bfaf2800beaf21f0a0037a +:106090003000c4af2000c0a33000c28f2400c2afc4 +:1060a0002400c2271000a0af1400a0af1800a0afba +:1060b00005000424050005242130400004000724c5 +:1060c0009b49400f000000002000c2a32000c283b3 +:1060d00021e8c0032c00bf8f2800be8f3000bd27f1 +:0860e0000800e00300000000cd +:020000040000fa +:020000041d01dc +:1060e8008c4000a01c00000001000000ffff040518 +:1060f80025013d013e0169012701480154026a0159 +:1061080055026b016c010000940000a00100000022 +:1061180000000000b40100a02400000000000000fe +:10612800980000a004000000000000009c0000a0ef +:106138000800000000000000300000a0040000007b +:106148000100000004000000a84000a014000000a6 +:1061580000000000a40000a01400000000000000df +:10616800340000a004000000010000001600000038 +:10617800b80000a00400000000000000380000a0e3 +:10618800040000000100000000010000bc0000a0a5 +:106198000400000000000000c00000a00100000092 +:1061a80000000000c40000a0100000000000000073 +:1061b800d80100a0c000000000000000d40000a02a +:1061c80004000000000000003c0000a001000000e6 +:1061d8000100000009000000980200a0400600002d +:1061e80000000000382e00a0a807000001000000f1 +:1061f80057494e43333430305f30303a3030000046 +:106208000000000000000000000000000000000086 +:106218000001000a3132333435464646464600000e +:106228000000000000000000000000000000000165 +:1062380000c0a8320100000057494e4333343030c3 +:106248005f30303a3030000048657265206973204d +:10625800746865206c697374206f662074686520a3 +:10626800617661696c61626c6520636f6d6d616eea +:1062780064733a0a0d0a0d68656c70203a205368f9 +:106288006f777320746869732077696e646f770a13 +:106298000d0a706f776572205b73746174655d2099 +:1062a800536574206368616c6574277320313256b6 +:1062b80020496e7665727465722066656564207023 +:1062c8006f7765722073746174652e202054686935 +:1062d8007320636f6d6d616e6420636f6e74726f8f +:1062e8006c7320746865206d61696e20706f7765c6 +:1062f800722072656c61790a202020202d20417659 +:1063080061696c61626c65205b73746174655d20a2 +:10631800617267756d656e74206172653a206f6e83 +:106328000a2020202020202020202020202020207b +:106338002020202020202020202020202020202055 +:10634800202020202020206f66660a0a7769666967 +:10635800205b636f6d6d616e645d20636f6e747238 +:106368006f6c204368616c65744475696e6f277340 +:106378002057694669206d6f64756c652073746178 +:106388007465250a202020202d20417661696c61e2 +:10639800626c65205b636f6d6d616e645d20617218 +:1063a80067756d656e74206172653a206f6e20287e +:1063b8007475726e73204f4e206d6f64756c65290d +:1063c8000a202020202020202020202020202020db +:1063d80020202020202020202020202020202020b5 +:1063e8002020202020202020206f66662028747519 +:1063f800726e73204f4646206d6f64756c65290a6e +:106408002020202020202020202020202020202084 +:106418002020202020202020202020202020202074 +:106428002020202020202020737461747573202878 +:1064380072657475726e732063757272656e7420fe +:10644800737461747573290a0a6261747465727968 +:10645800205b73656e736f725d2072657475726e02 +:10646800732063757272656e7420626174746572ec +:10647800792073656e736f72732072656164696edb +:1064880067730a202020202d20417661696c6162a3 +:106498006c65205b73656e736f725d2061726775e2 +:1064a8006d656e74206172653a20766f6c746167f1 +:1064b800650a2020202020202020202020202020a5 +:1064c80020202020202020202020202020202020c4 +:1064d80020202020202020202063757272656e7491 +:1064e8000a202020202020202020202020202020ba +:1064f8002020202020202020202020202020202094 +:106508002020202020202020736f632028737461ae +:106518007465206f6620636861726765290a2020a8 +:106528002020202020456d707479205b73656e7380 +:106538006f725d20617267756d656e742070726927 +:106548006e747320616c6c2076616c7565730a0ad1 +:10655800737461747573203a206765742067656e7b +:106568006572616c2073797374656d2073746174de +:1065780075730a0a626f6f746c6f61646572205b71 +:10658800636f6d6d616e645d203a20626f6f746c2d +:106598006f61646572206d6f646520636f6e7472dd +:1065a8006f6c0a202020202d20417661696c616281 +:1065b8006c65205b636f6d6d616e645d20617267f1 +:1065c800756d656e74206172653a207374617274ba +:1065d8002028656e61626c6520626f6f746c6f61f4 +:1065e80064657220616e64206f70656e7320706fd1 +:1065f8007274290a202020202020202020202020fa +:106608002020202020202020202020202020202082 +:1066180020202020202020202020202073746f702c +:10662800202864697361626c657320626f6f746c93 +:106638006f61646572206966206e6f74206275737d +:1066480079290a20202020202020202020202020f6 +:106658002020202020202020202020202020202032 +:1066680020202020202020202020207374617465a1 +:1066780020287072696e74732061637475616c2070 +:106688007374617465206f662074686520626f6f2b +:10669800746c6f61646572290a0000000a6c746585 +:1066a800205b636f6d6d616e645d205b76616c75f8 +:1066b800655d203a20626f6f746c6f61646572204b +:1066c8006d6f646520636f6e74726f6c0a20202092 +:1066d800202d20417661696c61626c65205b636f77 +:1066e8006d6d616e645d20617267756d656e742095 +:1066f8006172653a20706173737468726f75676848 +:106708002028656e61626c65207573696e672073f9 +:1067180079736c6f67206173206120706173737483 +:1067280068726f75676820696e7465726661636503 +:106738002077697468206c7465206d6f64756c656a +:10674800290a20202020202020202020202020204e +:1067580020202020202020202d417661696c616254 +:106768006c6520706173737468726f756768205bfd +:1067780076616c75655d3a206f6e2028656e616282 +:106788006c6520706173737468726f756768290a25 +:1067980020202020202020202020202020202020f1 +:1067a80020202020202020202020202020202020e1 +:1067b80020202020202020202020202020202020d1 +:1067c800202020202020206f6666202864697361bd +:1067d800626c6520706173737468726f756768297d +:1067e8000a202020202020202020202020202020b7 +:1067f8002020202020202020202020202020202091 +:10680800202064656275672028656e61626c65206a +:106818007573696e67207379736c6f672061732075 +:106828006120646562756720696e7465726661636c +:10683800652077697468206c7465206d6f64756c69 +:1068480065290a2020202020202020202020202008 +:106858002020202020202020202d417661696c6195 +:10686800626c65206465627567205b76616c75652e +:106878005d3a206d6f64756c652028646562756784 +:10688800204c5445206d6f64756c6520636f6d6d89 +:10689800206f6e6c79290a202020202020202020bb +:1068a80020202020202020202020202020202020e0 +:1068b80020202020202020202020202020202020d0 +:1068c80020202020202020706963202864656275bc +:1068d800672050494320636f6d6d206f6e6c792976 +:1068e8000a202020202020202020202020202020b6 +:1068f8002020202020202020202020202020202090 +:10690800202020202020202020202020202020207f +:1069180020626f74682028646562756720626f74ee +:10692800682050494320616e64204c5445206d6fa7 +:1069380064756c6520636f6d6d20290a2020202006 +:10694800202020202020202020202020202020203f +:10695800202020202020202020202020202020202f +:106968002020202020202020202020206f66662044 +:106978002864697361626c65204c544520646562c3 +:106988007567290a0a48617665206120676f6f6418 +:1069980020646179210a0000400000a00c0000007a +:1069a80001000000f8f00545d48400000000009db7 +:1069b800d80800a01804000000000000d80000a0bb +:1069c8000c00000000000000ec3e00a05800000091 +:1069d8000100000057494e43333430305f30303abd +:1069e800303000000000000000000000000000003f +:1069f800000000000001000a3132333435464646b3 +:106a080046460000000000000000000000000000f2 +:106a18000000000100c0a8320100000057494e43a1 +:106a2800333430305f30303a303000004c0000a052 +:106a38000800000001000000f8f00545d4840000bb +:106a4800f00c00a0c000000000000000803e00a084 +:106a58006c0000000100000057494e4333343030c9 +:106a68005f30303a303000000000000000000000c5 +:106a780000000000000000000001000a3132333439 +:106a8800354646464646000000000000000000006b +:106a9800000000000000000100c0a8320100000052 +:106aa80057494e43333430305f30303a303000008d +:106ab8006f70656e776561746865726d61702e6f51 +:106ac80072670000e03500a000040000000000002c +:106ad800540000a01000000001000000f8f0054577 +:106ae800d484ffffffffffffffffff00e40000a0cb +:106af8001c00000000000000b00d00a0040d000004 +:106b080000000000b41a00a00010000000000000ff +:106b1800443f00a0580000000100000057494e43c0 +:106b2800333430305f30303a30300000000000003d +:106b38000000000000000000000000000001000a42 +:106b480031323334354646464646000000000000e0 +:106b580000000000000000000000000100c0a83292 +:106b68000100000057494e43333430305f30303a2b +:106b780030300000640000a00800000001000000a0 +:106b8800f8f00545d4840000b42a00a0f401000000 +:106b980000000000000100a0040000000000000048 +:106ba8009c3f00a0580000000100000057494e43d8 +:106bb800333430305f30303a3030000000000000ad +:106bc8000000000000000000000000000001000ab2 +:106bd8003132333435464646464600000000000050 +:106be80000000000000000000000000100c0a83202 +:106bf8000100000057494e43333430305f30303a9b +:106c0800303000006c0000a0080000000100000007 +:106c1800f8f00545d4840000a82c00a02c01000041 +:106c280000000000f43f00a0580000000100000030 +:106c380057494e43333430305f30303a30300000fb +:106c4800000000000000000000000000000000003c +:106c58000001000a313233343546464646460000c4 +:106c6800000000000000000000000000000000011b +:106c780000c0a8320100000057494e433334303079 +:106c88005f30303a30300000740000a01800000077 +:106c980001000000f8f00545d4840000ffffffff65 +:106ca80001000000b12c00a009000000040100a0b0 +:106cb8001800000000000000e03900a000040000f7 +:106cc800000000001c0100a00100000000000000fe +:106cd800200100a01000000000000000d42d00a03a +:106ce8006400000000000000e03d00a0a0000000db +:106cf800010000004c4000a0000000004c4000a033 +:106d080009000000200000006c4000a00000000006 +:106d18006c4000a00e02010000000000000000000e +:106d28000000000000000000060202000000000051 +:106d3800000000000000000000000000000000004b +:106d4800000000000000000000000000000000003b +:106d5800000000000000000000000000000000002b +:106d6800000000000000000000000000000000001b +:106d7800000000000000000000000000000000000b +:106d880000000000000000000000000000000000fb +:106d9800000000004c4000a040000000000000007f +:106da8008c0000a00400000001000000e03d00a0ed +:106db800300100a00100000000000000bc4000a05d +:106dc8000400000000000000900000a00400000083 +:106dd8000100000002000000000000a020000000e8 +:106de800010000000c000000000000000100017c10 +:106df8001f0c1d000c000000140000008cf5019d04 +:106e08004c040000200000a0100000000100000059 +:106e18000c0000002400000060e2033a5c0400005b +:106e280000000000222222222222222222222222c2 +:106e3800222222222222222222222222222222222a +:020000040000fa +:020000041d01dc +:106e4800e8ffbd271400bfaf1000beaf21f0a003bc +:106e5800115d400f0000000021e8c0031400bf8f3f +:106e68001000be8f1800bd270800e00300000000d6 +:106e7800e8ffbd271400bfaf1000beaf21f0a0038c +:106e8800211080001800c2a3608082930f00432c59 +:106e98003f0160100000000080180200019d023cc4 +:106ea800bc6e4224211062000000428c08004000a1 +:106eb80000000000f86e019d206f019d886f019d04 +:106ec800f06f019d5870019dc470019df870019d7f +:106ed8002c71019d7471019dbc71019d4072019dd1 +:106ee800a072019db872019de472019d1073019d0d +:106ef800e88080aff08080aff88080a3f48080af16 +:106f080001000224608082a3ffff02245c8082af1c +:106f1800ec5c400b00000000e480828f001202004d +:106f2800e48082af1800c393e480828f211062004e +:106f3800e48082af5c80838f1800c29321206000b8 +:106f480021284000eb83400f000000005c8082afe6 +:106f58001800c393de00022405006214000000003c +:106f680002000224608082a3ec5c400b0000000059 +:106f7800115d400f00000000ec5c400b00000000b9 +:106f8800e480828f00120200e48082af1800c3936d +:106f9800e480828f21106200e48082af5c80838f5e +:106fa8001800c2932120600021284000eb83400f85 +:106fb800000000005c8082af1800c393ad0002247b +:106fc800050062140000000003000224608082a310 +:106fd800ec5c400b00000000115d400f0000000059 +:106fe800ec5c400b00000000e480828f001202007d +:106ff800e48082af1800c393e480828f211062007e +:10700800e48082af5c80838f1800c29321206000e7 +:1070180021284000eb83400f000000005c8082af15 +:107028001800c393be00022405006214000000008b +:1070380004000224608082a3ec5c400b0000000086 +:10704800115d400f00000000ec5c400b00000000e8 +:10705800e480828f00120200e48082af1800c3939c +:10706800e480828f21106200e48082af5c80838f8d +:107078001800c2932120600021284000eb83400fb4 +:10708800000000005c8082afe480838fadde023cac +:10709800efbe42340500621000000000115d400f91 +:1070a80000000000ec5c400b00000000050002241a +:1070b800608082a3ec5c400b000000001800c293c3 +:1070c800f88082a306000224608082a35c80838ffc +:1070d8001800c2932120600021284000eb83400f54 +:1070e800000000005c8082afec5c400b00000000f8 +:1070f8001800c293e88082af07000224608082a350 +:107108005c80838f1800c2932120600021284000f2 +:10711800eb83400f000000005c8082afec5c400b0a +:1071280000000000e880828f00120200e88082af31 +:107138001800c393e880828f21106200e88082af34 +:107148005c80838f1800c2932120600021284000b2 +:10715800eb83400f000000005c8082af080002242f +:10716800608082a3ec5c400b00000000e880828f06 +:1071780000120200e88082af1800c393e880828f73 +:1071880021106200e88082af5c80838f1800c29370 +:107198002120600021284000eb83400f0000000000 +:1071a8005c8082af09000224608082a3ec5c400b03 +:1071b80000000000e880828f00120200e88082afa1 +:1071c8001800c393e880828f21106200e88082afa4 +:1071d8005c80838f1800c293212060002128400022 +:1071e800eb83400f000000005c8082afe880828f54 +:1071f8009f00422c0500401400000000115d400f64 +:1072080000000000ec5c400b00000000e880828f6a +:1072180005004014000000000b000224608082a3d7 +:10722800ec5c400b000000000a000224608082a38e +:10723800ec5c400b000000009081828f1800c39323 +:10724800000043a09081828f01004224908182af88 +:10725800ec80828f01004224ec8082af5c80838fb7 +:107268001800c2932120600021284000eb83400fc2 +:10727800000000005c8082afec80838fe880828f02 +:1072880048006214000000000b000224608082a302 +:10729800ec5c400b000000001800c293f48082af41 +:1072a8000c000224608082a3ec5c400b000000000c +:1072b800f480828f00120200f48082af1800c3931a +:1072c800f480828f21106200f48082af0d000224c6 +:1072d800608082a3ec5c400b00000000f480828f89 +:1072e80000120200f48082af1800c393f480828fea +:1072f80021106200f48082af0e000224608082a315 +:10730800ec5c400b00000000f480828f0012020049 +:10731800f48082af1800c393f480828f211062003a +:10732800f48082af5c80828f271002005c8082af7d +:10733800f480838f5c80828f0b0062100000000055 +:10734800f88082932014027c21204000212800002c +:107358004d37400f00000000115d400f0000000095 +:10736800ec5c400b00000000f88082932014027c43 +:1073780021204000010005244d37400f0000000087 +:10738800115d400f00000000ec5c400b00000000a5 +:10739800115d400f0000000000000000ec5c400b95 +:1073a800000000000000000021e8c0031400bf8fa7 +:1073b8001000be8f1800bd270800e0030000000081 +:1073c800e0ffbd271c00bfaf1800beaf21f0a0032f +:1073d8002000c4af2400c5af1000c0af065d400b4d +:1073e800000000002000c28f000042902000c38fe0 +:1073f800010063242000c3af212040009e5b400fa2 +:10740800000000001000c28f010042241000c2af2b +:107418001000c38f2400c28f2a106200f1ff4014ad +:107428000000000021e8c0031c00bf8f1800be8fb9 +:107438002000bd270800e00300000000f8ffbd277a +:107448000400beaf21f0a003e88080afe48080afe5 +:10745800f08080aff88080a3f48080af0100022420 +:10746800608082a3ec8080afffff02245c8082af43 +:1074780000a0023ca82c4224908182af21e8c003de +:107488000400be8f0800bd270800e00300000000cc +:10749800d8ffbd272400bfaf2000beaf21f0a00356 +:1074a800211080002c00c5af2800c2a300a0023c18 +:1074b800deff0324a82c43a000a0023ca82c4224f1 +:1074c800adff0324010043a000a0023ca82c4224e5 +:1074d800beff0324020043a000a0023ca82c4224c3 +:1074e800efff0324030043a000a0023ca82c422481 +:1074f8002800c393040043a02c00c28f0316020087 +:107508001000c2a31000c39300a0023ca82c422480 +:10751800050043a02c00c28f031402001000c2a370 +:107528001000c39300a0023ca82c4224060043a0ec +:107538002c00c28f031202001000c2a31000c393d4 +:1075480000a0023ca82c4224070043a02c00c28fb4 +:107558001000c2a31000c39300a0023ca82c422430 +:10756800080043a0ffff02241400c2af2c00c28f02 +:107578000900422400a0033ca82c642421284000d0 +:10758800ad83400f000000001400c2af6480838ff9 +:107598002c00c28f211062001800c2af1400c28fe5 +:1075a800021602001000c2a31000c3931800c28f75 +:1075b800000043a01800c28f010042241800c2af87 +:1075c8001400c28f021402001000c2a31000c3935b +:1075d8001800c28f000043a01800c28f0100422487 +:1075e8001800c2af1400c28f021202001000c2a31a +:1075f8001000c3931800c28f000043a01800c28f68 +:10760800010042241800c2af1400c28f1000c2a3a8 +:107618001000c3931800c28f000043a01800c28f47 +:10762800010042241800c2af2c00c28f0d00422472 +:1076380000a0033ca82c642421284000dd36400f1c +:107648000000000021e8c0032400bf8f2000be8f87 +:107658002800bd270800e00300000000f8ffbd2750 +:107668000400beaf21f0a0036480828f21e8c0032c +:107678000400be8f0800bd270800e00300000000da +:10768800e8ffbd271400bfaf1000beaf21f0a00374 +:10769800995d400f0000000001000324000043a092 +:1076a8000300042401000524265d400f00000000ab +:1076b80021e8c0031400bf8f1000be8f1800bd273b +:1076c8000800e00300000000e8ffbd271400bfaf7a +:1076d8001000beaf21f0a003211080001800c2a343 +:1076e800995d400f0000000001000324000043a042 +:1076f8001800c2932120400001000524265d400f98 +:107708000000000021e8c0031400bf8f1000be8fe6 +:107718001800bd270800e00300000000e8ffbd27af +:107728001400bfaf1000beaf21f0a00321108000ed +:107738001800c2a3995d400f00000000000040a09f +:107748001800c2932120400001000524265d400f47 +:107758000000000021e8c0031400bf8f1000be8f96 +:107768001800bd270800e00300000000d8ffbd276f +:107778002400bfaf2000beaf21f0a003211080007d +:107788002800c2a3960002241000c2af995d400fe2 +:10779800000000001400c2af1400c28f2800c39379 +:1077a800000043a01400c28f010042241400c2af9d +:1077b8002800c38301000224260062140000000090 +:1077c8001000c28f031602001800c2a31400c28f53 +:1077d8001800c393000043a01400c28f0100422484 +:1077e8001400c2af1000c28f031402001800c2a315 +:1077f8001400c28f1800c393000043a01400c28f66 +:10780800010042241400c2af1000c28f031202000c +:107818001800c2a31400c28f1800c393000043a02d +:107828001400c28f010042241400c2af1000c28f9e +:107838001800c2a31400c28f1800c393000043a00d +:107848001400c28f010042241400c2af2b5e400b0b +:10785800000000001400c28f000040a01400c28f76 +:10786800010042241400c2af1400c28f000040a0df +:107878001400c28f010042241400c2af1400c28f4a +:10788800000040a01400c28f010042241400c2afbf +:107898001400c28f000040a01400c28f01004224cf +:1078a8001400c2af0800042405000524265d400f1b +:1078b8000000000021e8c0032400bf8f2000be8f15 +:1078c8002800bd270800e00300000000e0ffbd27f6 +:1078d8001c00bfaf1800beaf21f0a003211080002c +:1078e8002400c5af2000c2a3995d400f000000002e +:1078f8001000c2af1000c28f2000c393000043a045 +:107908001000c28f010042241000c2af2400c28fb1 +:10791800031602001400c2a31000c28f1400c39300 +:10792800000043a01000c28f010042241000c2af23 +:107938002400c28f031402001400c2a31000c28fd7 +:107948001400c393000043a01000c28f010042241a +:107958001000c2af2400c28f031202001400c2a399 +:107968001000c28f1400c393000043a01000c28f00 +:10797800010042241000c2af2400c28f1400c2a329 +:107988001000c28f1400c393000043a01000c28fe0 +:10799800010042241000c2af0d0004240500052494 +:1079a800265d400f0000000021e8c0031c00bf8fc7 +:1079b8001800be8f2000bd270800e003000000006b +:1079c800e0ffbd271c00bfaf1800beaf21f0a00329 +:1079d800211080002000c2a3995d400f0000000024 +:1079e8001000c2af1000c28f2000c393000043a054 +:1079f8001000c28f010042241000c2af0a00042404 +:107a080001000524265d400f0000000021e8c003a6 +:107a18001c00bf8f1800be8f2000bd270800e003a0 +:107a280000000000e0ffbd271c00bfaf1800beaf7c +:107a380021f0a003211080002000c2a3995d400f0f +:107a4800000000001000c2af1000c28f2000c393d6 +:107a5800000043a01000c28f010042241000c2aff2 +:107a68000f00042401000524265d400f00000000db +:107a780021e8c0031c00bf8f1800be8f2000bd275f +:107a88000800e00300000000e0ffbd271c00bfafb6 +:107a98001800beaf21f0a003211080002000c2a36f +:107aa800995d400f000000001000c2af1000c28fa7 +:107ab8002000c393000043a01000c28f010042249d +:107ac8001000c2af1900042401000524265d400ff0 +:107ad8000000000021e8c0031c00bf8f1800be8f03 +:107ae8002000bd270800e00300000000e0ffbd27dc +:107af8001c00bfaf1800beaf21f0a0032000c4af28 +:107b08002400c5af995d400f000000001000c2af0f +:107b18001400c0af1400c0afd85e400b00000000d6 +:107b28002000c28f00004290201c027c1000c28fef +:107b3800000043a01000c28f010042241000c2af11 +:107b48002000c28f010042242000c2af1400c28f5f +:107b5800010042241400c2af1400c38f2400c28f56 +:107b68002a106200eeff4014000000001b000424ed +:107b78002400c58f265d400f0000000021e8c003e7 +:107b88001c00bf8f1800be8f2000bd270800e0032f +:107b980000000000f8ffbd270400beaf21f0a003dd +:107ba800211080000800c2a70800c28700ff4230e9 +:107bb80003120200201e027c0800c2970012020075 +:107bc8002016027c251062002016027c21e8c003e2 +:107bd8000400be8f0800bd270800e0030000000075 +:107be800f8ffbd270400beaf21f0a0030800c4af12 +:107bf8000800c28f021e02000800c48fff00023c6a +:107c08002410820003120200251862000800c28fa7 +:107c180000ff423000120200251862000800c28fdf +:107c2800001602002510620021e8c0030400be8f80 +:107c38000800bd270800e00300000000d8ffbd27aa +:107c48002400bfaf2000beaf21f0a0032800c4afbe +:107c58002c00c5af3000c6af1000c0af1400c2275b +:107c680021204000029d023cd8f945242c00c68ff3 +:107c7800798b400f000000002c00c28f0f00422caf +:107c88001f004010000000001000c0af2f5f400b25 +:107c9800000000001000c28f2800c38f211062006e +:107ca80030000324000043a01000c28f01004224ca +:107cb8001000c2af3000c28fffff43241000c28ff4 +:107cc8002a104300f3ff4014000000001000c28f88 +:107cd8002800c38f212062003000c38f1000c28f9c +:107ce800231062001400c3272128600021304000bf +:107cf8000e87400f000000001360400b00000000da +:107d08002c00c28fff00422c1f0040100000000012 +:107d18001000c0af515f400b000000001000c28f80 +:107d28002800c38f2110620030000324000043a004 +:107d38001000c28f010042241000c2af3000c28f71 +:107d4800feff43241000c28f2a104300f3ff4014a3 +:107d5800000000001000c28f2800c38f212062009d +:107d68003000c38f1000c28f231062001400c32795 +:107d780021286000213040000e87400f00000000dd +:107d88001360400b000000002c00c28fff0f422c34 +:107d98001f004010000000001000c0af735f400bd0 +:107da800000000001000c28f2800c38f211062005d +:107db80030000324000043a01000c28f01004224b9 +:107dc8001000c2af3000c28ffdff43241000c28fe5 +:107dd8002a104300f3ff4014000000001000c28f77 +:107de8002800c38f212062003000c38f1000c28f8b +:107df800231062001400c3272128600021304000ae +:107e08000e87400f000000001360400b00000000c8 +:107e18002c00c38fffff02342b1062001f0040109c +:107e2800000000001000c0af965f400b000000008b +:107e38001000c28f2800c38f211062003000032475 +:107e4800000043a01000c28f010042241000c2affe +:107e58003000c28ffcff43241000c28f2a10430059 +:107e6800f3ff4014000000001000c28f2800c38fe9 +:107e7800212062003000c38f1000c28f23106200df +:107e88001400c32721286000213040000e87400fce +:107e9800000000001360400b000000002c00c38f9e +:107ea8000f00023cffff42342b1062001f004010fd +:107eb800000000001000c0afba5f400b00000000d7 +:107ec8001000c28f2800c38f2110620030000324e5 +:107ed800000043a01000c28f010042241000c2af6e +:107ee8003000c28ffbff43241000c28f2a104300ca +:107ef800f3ff4014000000001000c28f2800c38f59 +:107f0800212062003000c38f1000c28f231062004e +:107f18001400c32721286000213040000e87400f3d +:107f2800000000001360400b000000002c00c38f0d +:107f3800ff00023cffff42342b1062001f0040107c +:107f4800000000001000c0afde5f400b0000000022 +:107f58001000c28f2800c38f211062003000032454 +:107f6800000043a01000c28f010042241000c2afdd +:107f78003000c28ffaff43241000c28f2a1043003a +:107f8800f3ff4014000000001000c28f2800c38fc8 +:107f9800212062003000c38f1000c28f23106200be +:107fa8001400c32721286000213040000e87400fad +:107fb800000000001360400b000000002c00c38f7d +:107fc800ff0f023cffff42342b1062001d004010df +:107fd800000000001000c0af0260400b000000006d +:107fe8001000c28f2800c38f2110620030000324c4 +:107ff800000043a01000c28f010042241000c2af4d +:108008003000c28ff9ff43241000c28f2a104300aa +:10801800f3ff4014000000001000c28f2800c38f37 +:10802800212062003000c38f1000c28f231062002d +:108038001400c32721286000213040000e87400f1c +:10804800000000000100022421e8c0032400bf8fc3 +:108058002000be8f2800bd270800e00300000000b4 +:10806800d8ffbd272400bfaf2000beaf21f0a0037a +:108078002800c4af2c00c5af1000c0af1400c22741 +:1080880021204000029d023cd8f945242c00c68fcf +:10809800798b400f000000002c00c28f0f00422c8b +:1080a80007004010000000001400c3832800c28f9e +:1080b800000043a001000224e960400b000000001a +:1080c8002c00c28fff00422c160040100000000058 +:1080d8001000c0af4460400b000000001000c28fc9 +:1080e8002800c38f211062001000c38f1000c4271e +:1080f8002118830004006380000043a01000c28f91 +:10810800010042241000c2af1000c28f02004228b2 +:10811800f2ff40140000000002000224e960400b56 +:10812800000000002c00c28fff0f422c16004010e8 +:10813800000000001000c0af5d60400b00000000b0 +:108148001000c28f2800c38f211062001000c38f57 +:108158001000c4272118830004006380000043a096 +:108168001000c28f010042241000c2af1000c28f5d +:1081780003004228f2ff401400000000030002241c +:10818800e960400b000000002c00c38fffff0234a1 +:108198002b10620016004010000000001000c0af55 +:1081a8007760400b000000001000c28f2800c38fca +:1081b800211062001000c38f1000c427211883000b +:1081c80004006380000043a01000c28f0100422415 +:1081d8001000c2af1000c28f04004228f2ff401402 +:1081e8000000000004000224e960400b00000000c9 +:1081f8002c00c38f0f00023cffff42342b1062009b +:1082080016004010000000001000c0af9260400b44 +:10821800000000001000c28f2800c38f21106200e8 +:108228001000c38f1000c427211883000400638046 +:10823800000043a01000c28f010042241000c2af0a +:108248001000c28f05004228f2ff40140000000011 +:1082580005000224e960400b000000002c00c38fd9 +:10826800ff00023cffff42342b1062001600401052 +:10827800000000001000c0afad60400b000000001f +:108288001000c28f2800c38f211062001000c38f16 +:108298001000c4272118830004006380000043a055 +:1082a8001000c28f010042241000c2af1000c28f1c +:1082b80006004228f2ff40140000000006000224d5 +:1082c800e960400b000000002c00c38fff0f023c48 +:1082d800ffff42342b10620016004010000000001f +:1082e8001000c0afc860400b000000001000c28f33 +:1082f8002800c38f211062001000c38f1000c4270c +:108308002118830004006380000043a01000c28f7e +:10831800010042241000c2af1000c28f070042289b +:10832800f2ff40140000000007000224e960400b3f +:10833800000000002c00c38fffff0224160062100b +:10834800000000001000c0afe160400b000000001a +:108358001000c28f2800c38f211062001000c38f45 +:108368001000c4272118830004006380000043a084 +:108378001000c28f010042241000c2af1000c28f4b +:1083880008004228f2ff4014000000000800022400 +:10839800e960400b000000002110000021e8c00344 +:1083a8002400bf8f2000be8f2800bd270800e003ef +:1083b80000000000e0ffbd271c00bfaf1800beafe3 +:1083c80021f0a0032000c4af2110a0002800c6aff0 +:1083d8002400c2a31000c0af2400c2931400c32716 +:1083e80021206000029d033cd8f96524213040001b +:1083f800798b400f000000002400c2930f00422c2c +:108408001f004010000000001000c0af0f61400bbb +:10841800000000001000c28f2000c38f21106200ee +:1084280030000324000043a01000c28f0100422442 +:108438001000c2af2800c28fffff43241000c28f74 +:108448002a104300f3ff4014000000001000c28f00 +:108458002000c38f212062002800c38f1000c28f24 +:10846800231062001400c327212860002130400037 +:108478000e87400f000000004261400b0000000022 +:108488002400c393ff0002241d00621000000000b6 +:108498001000c0af3161400b000000001000c28f17 +:1084a8002000c38f2110620030000324000043a085 +:1084b8001000c28f010042241000c2af2800c28ff2 +:1084c800feff43241000c28f2a104300f3ff40141c +:1084d800000000001000c28f2000c38f212062001e +:1084e8002800c38f1000c28f231062001400c32716 +:1084f80021286000213040000e87400f0000000056 +:108508000100022421e8c0031c00bf8f1800be8fa1 +:108518002000bd270800e00300000000e8ffbd2799 +:108528001400beaf21f0a0031800c4af1c00c5aff3 +:108538002000c6af0000c0af0400c0af0800c0af45 +:10854800010002240c00c2af2000c38f10000224d7 +:1085580036006214000000001c00c28fffff422496 +:108568000000c2af8861400b000000001c00c28ff1 +:10857800ffff43240000c28f0900621400000000be +:108588000000c28f1800c38f2110620000004280d3 +:10859800d0ff42240800c2af8561400b00000000f4 +:1085a8000000c28f0400c2af7461400b00000000dd +:1085b8000c00c28f001102000c00c2af0400c28f71 +:1085c800010042240400c2af1c00c28ffeff4324f6 +:1085d8000400c28f2a106200f5ff4010000000005e +:1085e8000000c28f1800c38f211062000000428073 +:1085f800d0ff4224211840000c00c28f021862707c +:108608000800c28f211043000800c2af0000c28fcb +:10861800ffff42240000c2af0000c28fd3ff410415 +:1086280000000000be61400b000000002000c38f66 +:108638000a0002242e006214000000000000c0afef +:10864800b961400b000000000000c28f0500401413 +:1086580000000000010002240c00c2afab61400b17 +:10866800000000000400c0afa661400b000000003d +:108678000c00c28f40100200801802002110430035 +:108688000c00c2af0400c28f010042240400c2af34 +:108698000400c38f0000c28f2a106200f4ff401448 +:1086a800000000000000c28f1800c38f2110620074 +:1086b80000004280d0ff4224211840000c00c28fe5 +:1086c800021862700800c28f211043000800c2af70 +:1086d8000000c28f010042240000c2af0000c38f17 +:1086e8001c00c28f2a106200d7ff4014000000004f +:1086f8000800c28f21e8c0031400be8f1800bd27f0 +:108708000800e00300000000e0ffbd271c00bfaf29 +:108718001800beaf21f0a0032000c4af2110a000b4 +:108728002400c2a32400c2931000c32721206000a4 +:10873800029d033cd8f9652421304000798b400f15 +:10874800000000002400c2930f00422c07004010d4 +:10875800000000001000c3832000c28f000043a067 +:1087680001000224ec61400b000000002400c393c8 +:10877800ff0002240b006210000000001000c383f9 +:108788002000c28f000043a02000c28f01004224b5 +:108798001100c383000043a002000224ec61400bd7 +:1087a800000000002110000021e8c0031c00bf8f5a +:1087b8001800be8f2000bd270800e003000000005d +:1087c800e8ffbd271400beaf21f0a0031800c4af16 +:1087d8001c00c5af0400c0af0000c0af0d62400b65 +:1087e80000000000029d023c0400c38f80180300b3 +:1087f800dcf94224211062000000428c0800c2af5c +:108808000000c28f1800c38f211062000000428050 +:10881800211840000800c28f261062000400c2af71 +:108828000000c28f010042240000c2af0000c38fc5 +:108838001c00c28f2a106200eaff401400000000ea +:108848000400c28f21e8c0031400be8f1800bd27a2 +:108858000800e00300000000f8ffbd270400beafd9 +:1088680021f0a0030800c4af21e8c0030400be8fb4 +:108878000800bd270800e0030000000058ffbd27de +:10888800a400bfafa000beaf21f0a003a800c4aff2 +:10889800ac00c5afb000c6af1000c0a31400c0af95 +:1088a8005762400b00000000800002241800c2af8d +:1088b800b000c38f1400c28f231862001800c28f43 +:1088c8002b1062000500401000000000b000c38fac +:1088d8001400c28f231062001800c2afac00c38f0f +:1088e8001400c28f211062001c00c32721206000e1 +:1088f800212840001800c68f3250400f00000000a9 +:108908001000c2a31000c283190040140000000028 +:10891800a800c38f1400c28f211062001c00c32757 +:1089280021206000212840001800c68f768a400f59 +:10893800000000001000c2a31000c2830f00401402 +:10894800000000001400c38f1800c28f21106200bd +:108958001400c2af1400c38fb000c28f2b10620086 +:10896800d1ff4014000000006262400b00000000cc +:10897800000000006262400b0000000000000000e0 +:108988001000c28321e8c003a400bf8fa000be8fdf +:10899800a800bd270800e00300000000e0ffbd2795 +:1089a8001c00bfaf1800beaf21f0a0032000c4af69 +:1089b8002400c5af2800c6aff4ff02241000c2a3ec +:1089c800140002241100c2a38562400b00000000bd +:1089d8002000c48f2400c58f2800c68f6850400f20 +:1089e800000000001000c2a31000c283070040145a +:1089f800000000002000c48f2400c58f2800c68f07 +:108a08002162400f000000001000c2a31000c283c2 +:108a180009004010000000001100c2932b10020052 +:108a2800ff0042301100c393ffff63241100c3a36a +:108a3800e7ff4014000000001000c28321e8c003d3 +:108a48001c00bf8f1800be8f2000bd270800e00360 +:108a580000000000f0ffbd270c00beaf21f0a0030e +:108a6800211880001400c5af2110c0001000c3a356 +:108a78001800c2a71000c2930000c2a30200c0a73a +:108a8800d262400b000000000400c0a7cb62400b7c +:108a9800000000000200c2971400c38f211062007a +:108aa80000004290211840000400c29704104300bf +:108ab80080004230c3110200201c027c0000c293d7 +:108ac80082110200ff0042302014027c0100423073 +:108ad8002014027c261062002014027c0600c2a327 +:108ae8000000c293401002002014027c7f00423034 +:108af8002024027c0600c39321106000c0100200ed +:108b080021104300ff0042302014027c261082000e +:108b18002014027c0000c2a30400c2970100422472 +:108b28000400c2a70400c2970800422cd9ff4014d1 +:108b3800000000000200c297010042240200c2a700 +:108b48000200c3971800c2972b106200ceff401492 +:108b5800000000000000c29321e8c0030c00be8f93 +:108b68001000bd270800e00300000000d8ffbd2763 +:108b78002400bfaf2000beaf1c00b0af21f0a0039f +:108b88002800c4af1000c0a32800c28f0000438c87 +:108b9800bc1a023cf9de42340300621000000000f7 +:108ba800f4ff02241000c2a32800c28f4400508c96 +:108bb8002800c28f7f000424212840004400062496 +:108bc8009762400f0000000003000212000000003e +:108bd800f4ff02241000c2a31000c28321e8c003de +:108be8002400bf8f2000be8f1c00b08f2800bd2737 +:108bf8000800e00300000000e0ffbd271c00bfaf35 +:108c08001800beaf21f0a0032000c4af2000c28f1f +:108c18002120400000100524480006243250400f4f +:108c2800000000001000c2a31000c2830500401419 +:108c3800000000002000c48fdd62400f000000002b +:108c48001000c2a31000c2830f00401000000000f3 +:108c58002000c28f2120400000200524480006245f +:108c68003250400f000000001000c2a31000c28361 +:108c780005004014000000002000c48fdd62400f92 +:108c8800000000001000c2a31000c28321e8c00346 +:108c98001c00bf8f1800be8f2000bd270800e0030e +:108ca80000000000e0ffbd271c00bfaf1800beafea +:108cb80021f0a0032000c4aff4ff02241000c2a3d7 +:108cc8000020042400100524db50400f00000000a1 +:108cd8001000c2a31000c283360040140000000038 +:108ce8002000c28f0800428c010043242000c28f5c +:108cf800080043ac2000c28f7f00042421284000d4 +:108d0800440006249762400f00000000211840002c +:108d18002000c28f440043ac2000c28f21204000b5 +:108d280000200524480006246962400f0000000066 +:108d38001000c2a31000c2831e00401400000000ef +:108d48000010042400100524db50400f0000000030 +:108d58001000c2a31000c2831600401400000000d7 +:108d68002000c28f0800428c010043242000c28fdb +:108d7800080043ac2000c28f7f0004242128400053 +:108d8800440006249762400f0000000021184000ac +:108d98002000c28f440043ac2000c28f2120400035 +:108da80000100524480006246962400f00000000f6 +:108db8001000c2a31000c28321e8c0031c00bf8fab +:108dc8001800be8f2000bd270800e0030000000047 +:108dd800a0ffbd275c00bfaf5800beaf21f0a003c5 +:108de8006000c4af6400c5af6800c6af6400c28f3e +:108df80008004010000000006800c28f0500401005 +:108e0800000000006000c28f0a00422c04004014d9 +:108e18000000000021100000ec63400b000000007f +:108e28006000c28f0300432c0600601000000000a1 +:108e38002b10020012004014000000009863400b41 +:108e480000000000090003240d004310000000008a +:108e5800da63400b000000006400c28f000040ace1 +:108e68004051400f0000000040140200211840004b +:108e78006800c28f000043aceb63400b00000000a9 +:108e88002f76400f00000000211840000100022446 +:108e9800040062100000000021100000ec63400b89 +:108ea800000000001000c227212040000063400f8e +:108eb8000000000004004010000000002110000025 +:108ec800ec63400b000000006000c38f0200022426 +:108ed80006006214000000002c00c38f6400c28fdb +:108ee800000043acd063400b000000006000c38f5b +:108ef8000100022406006214000000002000c38f55 +:108f08006400c28f000043acd063400b0000000037 +:108f18006000c38f090002240700621400000000eb +:108f28002000c38f0400023c00c0423421186200b4 +:108f38006400c28f000043ac029d033c6000c28ff6 +:108f4800582f6324c0100200211062000400438cd3 +:108f58006800c28f000043aceb63400b00000000c8 +:108f6800029d023c6000c38fc0180300582f4224a2 +:108f7800211062000000438c6400c28f000043ace3 +:108f8800029d033c6000c28f582f6324c01002006a +:108f9800211062000400438c6800c28f000043acbb +:108fa800000000000100022421e8c0035c00bf8f1c +:108fb8005800be8f6000bd270800e00300000000d5 +:108fc800e0ffbd271c00bfaf1800beaf21f0a00313 +:108fd8002000c4af2118a0002110c0002400c3a3a2 +:108fe8002800c2a32f76400f00000000211840007f +:108ff800010002240400621000000000f4ff0224b3 +:109008003b64400b000000002000c28f0a00422c85 +:109018000400401400000000f1ff02243b64400bf0 +:10902800000000001400c2272000c48f1000c327ce +:1090380021286000213040007663400f00000000c6 +:109048000400401400000000f4ff02243b64400bbd +:10905800000000001000c28fff0f423004004010d3 +:1090680000000000f1ff02243b64400b00000000f8 +:109078002400c3932800c29321106200001b020041 +:109088001400c28f2b1043000400401000000000a1 +:10909800f4ff02243b64400b000000002400c2934c +:1090a800001b02001000c28f211062001000c2af26 +:1090b8001000c38f2800c293001302002120600013 +:1090c80021284000db50400f000000000400401041 +:1090d80000000000f4ff02243b64400b0000000085 +:1090e8002110000021e8c0031c00bf8f1800be8fac +:1090f8002000bd270800e00300000000e0ffbd27b6 +:109108001c00bfaf1800beaf21f0a0032000c4af01 +:109118002400c5af2800c6af2c00c7af2f76400f7c +:109128000000000021184000010002240400621021 +:1091380000000000f4ff02248964400b00000000d6 +:109148002400c28f05004010000000002000c28fdc +:109158000a00422c0400401400000000f1ff022421 +:109168008964400b000000001400c2272000c48f4f +:109178001000c32721286000213040007663400f8b +:10918800000000000400401400000000f4ff022466 +:109198008964400b000000002800c38f2c00c28f98 +:1091a800211862001400c28f2b10430008004014dd +:1091b800000000002800c38f2c00c28f2118620015 +:1091c8002800c28f2b10620004004010000000002d +:1091d800f4ff02248964400b000000001000c38fd4 +:1091e8002800c28f211062001000c2af1000c28f89 +:1091f8002400c48f212840002c00c68f6850400fdf +:10920800000000000400401000000000f4ff0224e9 +:109218008964400b000000002110000021e8c00311 +:109228001c00bf8f1800be8f2000bd270800e00378 +:1092380000000000e0ffbd271c00bfaf1800beaf54 +:1092480021f0a0032000c4af2400c5af2800c6af9a +:109258002c00c7af2f76400f0000000021184000f7 +:10926800010002240400621000000000f4ff022440 +:10927800d764400b000000002400c28f0500401096 +:10928800000000002000c28f0a00422c0400401495 +:1092980000000000f1ff0224d764400b000000002a +:1092a8001400c2272000c48f1000c32721286000a3 +:1092b800213040007663400f000000000400401495 +:1092c80000000000f4ff0224d764400b00000000f7 +:1092d8002800c38f2c00c28f211862001400c28f8f +:1092e8002b10430008004014000000002800c38f22 +:1092f8002c00c28f211862002800c28f2b10620038 +:109308000400401000000000f4ff0224d764400b62 +:10931800000000001000c38f2800c28f21106200d7 +:109328001000c2af1000c28f2400c48f2128400053 +:109338002c00c68f3250400f00000000040040107f +:1093480000000000f4ff0224d764400b0000000076 +:109358002110000021e8c0031c00bf8f1800be8f39 +:109368002000bd270800e0030000000098ffbd278b +:109378006400bfaf6000beaf21f0a0032f76400f9e +:1093880000000000211840000100022404006210bf +:1093980000000000f4ff02240665400b00000000f6 +:1093a8001400c227212040000063400f0000000085 +:1093b8000400401000000000f4ff02240665400b82 +:1093c800000000003000c28f1000c2af2400c28f1e +:1093d8003000c2af1000c28f2400c2af9823023cf5 +:1093e800187742343400c2af1400c227212040004d +:1093f8002b63400f00000000040040100000000034 +:10940800f4ff02240665400b000000002110000054 +:1094180021e8c0036400bf8f6000be8f6800bd27cd +:109428000800e00300000000e8ffbd271400bfaffc +:109438001000beaf21f0a00380bf023c000640ac84 +:1094480080bf033c0006628c010004240429827c4e +:10945800000662ac80bf023c100640ac80bf023cf4 +:1094680010270324200643ac88bf033ca010628c5d +:10947800020004248420827ca01062ac88bf033cd4 +:10948800a010628c030004240408827ca01062ac43 +:1094980088bf033c3010628c0421027c301062ac1f +:1094a80088bf033c6010628c010004240421827c84 +:1094b800601062ac80bf033c0006628c010004248b +:1094c800c47b827c000662ac00a0023cf00c442401 +:1094d80021280000c0000624fa89400f000000007f +:1094e80021e8c0031400bf8f1000be8f1800bd27ed +:1094f8000800e00300000000f0ffbd270c00beaf2d +:1095080021f0a0031000c4af0000c0af1000c28f4c +:10951800c0100200801802002318620000a0023c5c +:10952800f00c4224211062001400428c46004010c6 +:10953800000000001000c28fc01002008018020056 +:109548002318620000a0023cf00c422421106200a3 +:109558000400438c1000c28fc0100200802002005b +:109568002320820000a0023cf00c4224211082003b +:109578000000428c231062000000c2af0000c38fbd +:109588001000c28fc0100200802002002320820039 +:1095980000a0023cf00c4224211082000c00428cf6 +:1095a8002b1062000c004014000000001000c28f55 +:1095b800c0100200801802002318620000a0023cbc +:1095c800f00c422421106200040040ac0100022487 +:1095d8009565400b000000000000c28f1a0041048e +:1095e800000000000000c28fe80342242118400058 +:1095f8001000c28fc01002008020020023208200c9 +:1096080000a0023cf00c4224211082000c00428c85 +:109618002b1062000c004014000000001000c28fe4 +:10962800c0100200801802002318620000a0023c4b +:10963800f00c422421106200040040ac0100022416 +:109648009565400b000000002110000021e8c003d0 +:109658000c00be8f1000bd270800e00300000000ca +:10966800f0ffbd270c00beaf21f0a0031000c4af6f +:109678000000c0af1000c28fc010020080180200a6 +:109688002318620000a0023cf00c42242110620062 +:109698001400428c45004010000000001000c28fea +:1096a800c0100200801802002318620000a0023ccb +:1096b800f00c4224211062000800438c1000c28f75 +:1096c800c0100200802002002320820000a0023c7b +:1096d800f00c4224211082000000428c231062000a +:1096e8000000c2af0000c38f1000c28fc01002007c +:1096f800802002002320820000a0023cf00c4224bb +:10970800211082001000428c2b1062000c004014c3 +:10971800000000001000c28fc01002008018020074 +:109728002318620000a0023cf00c422421106200c1 +:10973800080040ac01000224ee65400b0000000068 +:109748000000c28f19004104000000000000c28f11 +:10975800ffff43241000c28fc010020080200200c7 +:109768002320820000a0023cf00c42242110820039 +:109778001000428c2b1062000c0040140000000006 +:109788001000c28fc0100200801802002318620067 +:1097980000a0023cf00c422421106200080040acfa +:1097a80001000224ee65400b0000000021100000bb +:1097b80021e8c0030c00be8f1000bd270800e0039d +:1097c80000000000f0ffbd270c00beaf21f0a00391 +:1097d8001000c4af0000c0af1000c28fc01002005c +:1097e800801802002318620000a0023cf00c4224fa +:1097f800211062001400428cd900401000000000c3 +:109808001000c28fc01002008018020023186200e6 +:1098180000a0023cf00c4224211062000800438c96 +:109828001000c28fc0100200802002002320820096 +:1098380000a0023cf00c4224211082000000428c5f +:10984800231062000000c2af0000c38f1000c28f57 +:10985800c0100200802002002320820000a0023ce9 +:10986800f00c4224211082001000428c2b10620060 +:1098780056004014000000001000c28fc010020003 +:10988800801802002318620000a0023cf00c422459 +:10989800211062000400438c1000c28fc010020027 +:1098a800802002002320820000a0023cf00c422409 +:1098b800211082000000428c231062000000c2af19 +:1098c8000000c38f1000c28fc01002008020020069 +:1098d8002320820000a0023cf00c422421108200c8 +:1098e8000c00428c2b106200140040140000000091 +:1098f8001000c28fc01002008018020023186200f6 +:1099080000a0023cf00c422421106200080040ac88 +:109918001000c28fc01002008018020023186200d5 +:1099280000a0023cf00c422421106200040040ac6c +:1099380001000224db66400b000000000000c28f1b +:1099480087004104000000000000c28fe8034224a1 +:10995800211840001000c28fc010020080200200b1 +:109968002320820000a0023cf00c42242110820037 +:109978000c00428c2b10620079004014000000009b +:109988001000c28fc0100200801802002318620065 +:1099980000a0023cf00c422421106200080040acf8 +:1099a8001000c28fc0100200801802002318620045 +:1099b80000a0023cf00c422421106200040040acdc +:1099c80001000224db66400b000000000000c28f8b +:1099d80063004104000000000000c28fffff432421 +:1099e8001000c28fc01002008020020023208200d5 +:1099f80000a0023cf00c4224211082001000428c8e +:109a08002b10620056004014000000001000c28fa6 +:109a1800c0100200801802002318620000a0023c57 +:109a2800f00c4224211062000400438c1000c28f05 +:109a3800c0100200802002002320820000a0023c07 +:109a4800f00c4224211082000000428c2310620096 +:109a58000000c2af0000c38f1000c28fc010020008 +:109a6800802002002320820000a0023cf00c422447 +:109a7800211082000c00428c2b106200140040144c +:109a8800000000001000c28fc01002008018020001 +:109a98002318620000a0023cf00c4224211062004e +:109aa800080040ac1000c28fc010020080180200ed +:109ab8002318620000a0023cf00c4224211062002e +:109ac800040040ac01000224db66400b00000000eb +:109ad8000000c28f22004104000000000000c28f75 +:109ae800e8034224211840001000c28fc010020071 +:109af800802002002320820000a0023cf00c4224b7 +:109b0800211082000c00428c2b10620014004014bb +:109b1800000000001000c28fc01002008018020070 +:109b28002318620000a0023cf00c422421106200bd +:109b3800080040ac1000c28fc0100200801802005c +:109b48002318620000a0023cf00c4224211062009d +:109b5800040040ac01000224db66400b000000005a +:109b68002110000021e8c0030c00be8f1000bd27a3 +:109b78000800e00300000000e8ffbd271400bfafa5 +:109b88001000beaf21f0a0031800c4af1c00c5af81 +:109b98001800c28fc010020080180200231862004b +:109ba80000a0023cf00c42242110620001000324b2 +:109bb800140043ac1c00c28fe803422c1e00401462 +:109bc800000000001800c28fc010020080180200b8 +:109bd8002318620000a0023cf00c4224211062000d +:109be8001c00c48fe80303241b008300f4016000f9 +:109bf8001020000012180000100043ac1800c28f9b +:109c0800c0100200801802002318620000a0023c65 +:109c1800f00c4224211062001c00c48fe8030324c6 +:109c28001b008300f4016000101800000c0043ac16 +:109c38002167400b000000001800c28fc01002000e +:109c4800801802002318620000a0023cf00c422495 +:109c580021106200100040ac1800c28fc010020032 +:109c6800801802002318620000a0023cf00c422475 +:109c7800211062001c00c38f0c0043ac1800c48f75 +:109c88005367400f0000000021e8c0031400bf8f95 +:109c98001000be8f1800bd270800e0030000000078 +:109ca800e8ffbd271400bfaf1000beaf21f0a0032e +:109cb8001800c4af1c00c5af1800c28fc010020046 +:109cc800801802002318620000a0023cf00c422415 +:109cd8002110620001000324140043ac1800c28f55 +:109ce800c0100200801802002318620000a0023c85 +:109cf800f00c4224211062001c00c38f100043acfa +:109d08001800c28fc01002008018020023186200d9 +:109d180000a0023cf00c4224211062000c0040ac70 +:109d28001800c48f5367400f0000000021e8c003eb +:109d38001400bf8f1000be8f1800bd270800e00375 +:109d480000000000f8ffbd270400beaf21f0a0030b +:109d58000800c4af0800c28fc010020080180200bb +:109d68002318620000a0023cf00c4224211062007b +:109d7800000040ac0800c28fc0100200801802002a +:109d88002318620000a0023cf00c4224211062005b +:109d9800040040ac0800c28fc01002008018020006 +:109da8002318620000a0023cf00c4224211062003b +:109db800080040ac21e8c0030400be8f0800bd279e +:109dc8000800e00300000000f8ffbd270400beaf54 +:109dd80021f0a0030800c4af0800c28fc010020021 +:109de800801802002318620000a0023cf00c4224f4 +:109df800211062001400428c21e8c0030400be8fc9 +:109e08000800bd270800e00300000000f8ffbd2798 +:109e18000400beaf21f0a0030800c4af0800c28f41 +:109e2800c0100200801802002318620000a0023c43 +:109e3800f00c422421106200140040ac21e8c00359 +:109e48000400be8f0800bd270800e00300000000e2 +:109e5800e8ffbd271400bfaf1000beaf21f0a0037c +:109e68001800c4af01000424e066400f1800c58f35 +:109e7800a167400b0000000040000000010004241e +:109e8800f365400f00000000fbff401000000000d9 +:109e98008567400f0100042421e8c0031400bf8f28 +:109ea8001000be8f0800e0031800bd2700e85d41e0 +:109eb80000701a4000601b40e0ffbd271c00baafcd +:109ec8001800bbaf44781b7c00087b3700609b40c0 +:109ed8001400beaf1000a4af0c00a3af0800a2afdf +:109ee80021f0a00300a0023cf00c42240400c2af01 +:109ef8000000c0afdc67400b000000000400c28f08 +:109f08001400428c12004010000000000400c28fb0 +:109f18000400428ce80343380100632cff006330df +:109f2800010044240400c28f040044ac08006010ff +:109f3800000000000400c28f040040ac0400c28f7f +:109f48000800428c010043240400c28f080043ac7f +:109f58000400c28f180042240400c2af0000c28f60 +:109f6800010042240000c2af0000c28f0800422c4a +:109f7800e2ff40140000000088bf033c3010628cf0 +:109f88000421027c301062ac21e8c0031400be8fab +:109f98001000a48f0c00a38f0800a28f00606041fe +:109fa800c00000001c00ba8f1800bb8f00709a40d8 +:109fb8002000bd2700e8dd4100609b4018000042fa +:109fc800e8ffbd271400bfaf1000beaf21f0a0030b +:109fd80000a0023c840b4224208182af00a0023cf6 +:109fe800840b4424212800002c010624fa89400f00 +:109ff8000000000000a0023c580a44242128000068 +:10a008002c010624fa89400f0000000000a0023c41 +:10a01800ec084424212800002c010624fa89400f6a +:10a0280000000000248180af21e8c0031400bf8f26 +:10a038001000be8f1800bd270800e00300000000d4 +:10a04800e8ffbd271400bfaf1000beaf21f0a0038a +:10a058002481828f0a0040100000000001000324c0 +:10a068000800431400000000248180af8734400fab +:10a0780000000000000000002368400b0000000002 +:10a088000000000021e8c0031400bf8f1000be8f3d +:10a098001800bd270800e00300000000e0ffbd270e +:10a0a8001c00bfaf1800beaf21f0a0032000c4af52 +:10a0b8002400c5af2000c28f15004010000000002a +:10a0c8001000c0af1000c0af4168400b0000000096 +:10a0d8002000c28f000042902000c38f010063243b +:10a0e8002000c3af212040004c68400f0000000052 +:10a0f8001000c28f010042241000c2af1000c38fad +:10a108002400c28f2a106200f1ff401400000000f2 +:10a1180021e8c0031c00bf8f1800be8f2000bd2798 +:10a128000800e00300000000e8ffbd271400bfafef +:10a138001000beaf21f0a003211080001800c2a3b8 +:10a148001800c3930d0002241d00621400000000d3 +:10a15800029d023ce4fd4424a76a400f0000000071 +:10a1680000a0023c840b42240000428009004010f9 +:10a178000000000000a0023c580a442400a0023c51 +:10a18800840b4524e785400f00000000a068400fbd +:10a198000000000000a0023c840b4224208182af12 +:10a1a80000a0023c840b4424212800002c01062432 +:10a1b800fa89400f000000009a68400b0000000078 +:10a1c8001800c39308000224050062100000000074 +:10a1d8001800c3937f0002241100621400000000dd +:10a1e8001800c28321204000bc6a400f0000000014 +:10a1f8002081838f00a0023c840b42241800621047 +:10a20800000000002081828fffff4224208182af5e +:10a218002081828f000040a09a68400b0000000057 +:10a228001800c28321204000bc6a400f00000000d3 +:10a238002081838f00a0023cb00c42242b106200c6 +:10a2480007004010000000002081828f1800c3839f +:10a25800000043a02081828f01004224208182af28 +:10a2680021e8c0031400bf8f1000be8f1800bd275f +:10a278000800e0030000000038ffbd27c400bfaf9e +:10a28800c000beaf21f0a0032000c227212040005b +:10a29800212800001e000624fa89400f0000000053 +:10a2a8004000c22721204000212800001e0006246b +:10a2b800fa89400f000000006000c22721204000fa +:10a2c800212800001e000624fa89400f0000000023 +:10a2d8008000c22721204000212800001e000624fb +:10a2e800fa89400f00000000a000c227212040008a +:10a2f800212800001e000624fa89400f00000000f3 +:10a308004000c2276000c3271000a3af8000c32706 +:10a318001400a3afa000c3271800a3af00a0033cfc +:10a32800840b6424029d033ce8fd65242000c327b8 +:10a338002130600021384000c18b400f0000000030 +:10a348002000c22721204000029d023cf8fd452440 +:10a3580004000624228b400f000000001700401460 +:10a368000000000000a0023c902e42242120400062 +:10a378006887400f0000000000a0033c902e642472 +:10a38800212840006735400f0000000000a0023c73 +:10a39800e4324224212040006887400f000000007a +:10a3a80000a0033ce4326424212840006735400fb4 +:10a3b80000000000a16a400b000000002000c22736 +:10a3c80021204000029d023c00fe45240500062491 +:10a3d800228b400f000000003300401400000000f2 +:10a3e8004000c2270000428007004014000000001f +:10a3f800029d023c08fe4424a76a400f00000000aa +:10a40800a16a400b000000004000c2272120400044 +:10a41800029d023c44fe452402000624228b400f84 +:10a42800000000000700401400000000029d023cec +:10a4380048fe4424a76a400f000000002669400b2c +:10a44800000000004000c22721204000029d023c7d +:10a4580068fe452403000624228b400f00000000fc +:10a468000700401400000000029d023c6cfe4424da +:10a47800a76a400f000000002669400b000000009a +:10a48800029d023c8cfe4424a76a400f0000000095 +:10a49800029d023cccfe4424a76a400f0000000045 +:10a4a800a16a400b000000002000c22721204000c4 +:10a4b800029d023cd0fe452404000624228b400f56 +:10a4c8000000000080004014000000004000c22787 +:10a4d800000042800700401400000000029d023c7a +:10a4e800d8fe4424a76a400f00000000a16a400b70 +:10a4f800000000004000c22721204000029d023ccd +:10a5080044fe452402000624228b400f0000000070 +:10a518001500401400000000e934400f000000005e +:10a528002118400001000224090062100000000008 +:10a53800029d023c14ff4424a76a400f000000005b +:10a548009433400f00000000ae69400b000000008b +:10a55800029d023c2cff4424a76a400f0000000023 +:10a56800ae69400b000000004000c22721204000d7 +:10a57800029d023c68fe452403000624228b400ffe +:10a58800000000001300401400000000e934400ff0 +:10a59800000000000900401000000000029d023c7d +:10a5a80048ff4424a76a400f00000000010002246d +:10a5b800248182afae69400b00000000029d023c7e +:10a5c80070ff4424a76a400f00000000ae69400bea +:10a5d800000000004000c22721204000029d023cec +:10a5e8009cff452406000624228b400f0000000033 +:10a5f8002f00401400000000e934400f0000000064 +:10a608000500432c2a00601000000000801802009a +:10a61800029d023c30a64224211062000000428cb8 +:10a62800080040000000000044a6019d5ca6019db2 +:10a6380074a6019d8ca6019da4a6019d029d023cc5 +:10a64800a4ff4424a76a400f00000000ae69400b35 +:10a6580000000000029d023cb8ff4424a76a400f96 +:10a6680000000000ae69400b00000000029d023ca3 +:10a67800c8ff4424a76a400f00000000ae69400be1 +:10a6880000000000029d023cdcff4424a76a400f42 +:10a6980000000000ae69400b00000000029d023c73 +:10a6a800e8ff4424a76a400f0000000000000000f3 +:10a6b800029d023cccfe4424a76a400f0000000023 +:10a6c800a16a400b000000002000c22721204000a2 +:10a6d800029d023c0000452407000624228b400fff +:10a6e80000000000e5004010000000002000c22724 +:10a6f80021204000029d023c9cff452406000624c0 +:10a70800228b400f000000004c00401400000000a5 +:10a71800029d023c08004424a76a400f0000000084 +:10a72800e934400f00000000010003241600431024 +:10a73800000000000200432805006010000000002f +:10a748000b00401000000000f669400b00000000fc +:10a758000200032412004310000000000300032439 +:10a768001500431000000000f669400b00000000cf +:10a77800029d023c1c004424a76a400f0000000010 +:10a78800fb69400b00000000029d023c3800442495 +:10a79800a76a400f00000000fb69400b00000000a2 +:10a7a800029d023c50004424a76a400f00000000ac +:10a7b800fb69400b00000000029d023c6c00442431 +:10a7c800a76a400f00000000fb69400b0000000072 +:10a7d800029d023c90004424a76a400f000000003c +:10a7e800000000002880828f0000438cadba023c34 +:10a7f800feca42340700621400000000029d023cb9 +:10a80800a8004424a76a400f000000000b6a400b10 +:10a8180000000000029d023cc0004424a76a400fcb +:10a8280000000000029d023cccfe4424a76a400fb1 +:10a8380000000000a16a400b000000002000c227b1 +:10a8480021204000029d023cdc0045240a00062429 +:10a85800228b400f000000004a0040140000000056 +:10a868004000c2270000428007004014000000009a +:10a87800029d023ce8004424a76a400f0000000043 +:10a88800a16a400b000000004000c22721204000c0 +:10a89800029d023c2801452405000624228b400f16 +:10a8a800000000000900401400000000ac3a400f0e +:10a8b80000000000029d023c30014424a76a400fba +:10a8c80000000000a16a400b000000004000c22701 +:10a8d80021204000029d023c480145240400062432 +:10a8e800228b400f00000000090040140000000007 +:10a8f800029d023c50014424a76a400f000000005a +:10a90800bc3a400f00000000a16a400b00000000a4 +:10a918004000c22721204000029d023c9cff4524a4 +:10a9280006000624228b400f00000000530040144c +:10a93800000000001a37400f000000000700401018 +:10a9480000000000029d023c6c014424a76a400fed +:10a9580000000000a16a400b000000001a37400ff9 +:10a96800000000004500401000000000029d023c6d +:10a978008c014424a76a400f00000000a16a400b24 +:10a98800000000002000c22721204000029d023c58 +:10a99800b001452403000624228b400f000000006c +:10a9a80025004014000000004000c227000042803b +:10a9b8000700401400000000029d023ce800442407 +:10a9c800a76a400f00000000a16a400b00000000c9 +:10a9d8006000c22700004280070040140000000009 +:10a9e800029d023cd8fe4424a76a400f00000000e4 +:10a9f800a16a400b000000004000c227212040004f +:10aa0800029d023cb40145240b000624228b400f12 +:10aa1800000000004000c22721204000029d023ca7 +:10aa2800c001452405000624228b400f00000000c9 +:10aa3800a16a400b000000002000c227212040002e +:10aa48006887400f000000002000c3272120600015 +:10aa5800029d033cc001652421304000228b400f39 +:10aa6800000000000500401000000000029d023cac +:10aa7800c8014424a76a400f0000000021e8c00371 +:10aa8800c400bf8fc000be8fc800bd270800e00308 +:10aa980000000000e0ffbd271c00bfaf1800beafdc +:10aaa8001400b0af21f0a0032000c4af2000d08f65 +:10aab8002000c48f6887400f00000000212000029a +:10aac800212840006735400f0000000021e8c0033e +:10aad8001c00bf8f1800be8f1400b08f2000bd2748 +:10aae8000800e00300000000e8ffbd271400bfaf26 +:10aaf8001000beaf21f0a003211080001800c2a3ef +:10ab08001800c293212040008935400f0000000042 +:10ab180021e8c0031400bf8f1000be8f1800bd27a6 +:10ab28000800e00300000000f8ffbd270400beafe6 +:10ab380021f0a00321e8c0030400be8f0800bd2750 +:10ab48000800e00300000000e0ffbd271c00bfafc5 +:10ab58001800beaf21f0a0032000c4af2000c28fb0 +:10ab68000600401000000000010003240800431004 +:10ab780000000000ed6a400b0000000000a0023c4d +:10ab8800d00342241000c2afea6a400b0000000064 +:10ab980000a0023c540642241000c2af000000008e +:10aba8001000c48fc46c400f0000000021e8c003ef +:10abb8001c00bf8f1800be8f2000bd270800e003cf +:10abc80000000000e8ffbd271400bfaf1000beafb3 +:10abd80021f0a003211080001c00c5af1800c2a3fb +:10abe8001c00c28f7a0242900e00432c960160101e +:10abf8000000000080180200029d023c18ac4224ac +:10ac0800211062000000428c080040000000000093 +:10ac180050ac019d8cac019d0cad019d6cad019dae +:10ac2800ccad019d20ae019da8ae019d08af019d50 +:10ac380068af019de4af019d64b0019de4b0019d42 +:10ac480094b1019d14b2019d1c00c28f6c0240acee +:10ac58001c00c28f740240ac1c00c28f780240a056 +:10ac68001c00c28f790240a01c00c28f7b0240a04a +:10ac78001c00c28f010003247a0243a09b6c400b86 +:10ac8800000000001800c3938a0002241600621412 +:10ac9800000000001c00c28f7402428c1c00c38f8d +:10aca800211862001800c493000064a00100432426 +:10acb8001c00c28f740243ac1c00c28f0200032424 +:10acc8007a0243a01c00c28f7b0243901800c293f3 +:10acd80026106200ff0043301c00c28f7b0243a095 +:10ace8009b6c400b000000001c00c28f6c0240ac43 +:10acf8001c00c48fc46c400f000000009b6c400b0c +:10ad0800000000001c00c28f1800c3937d0243a0fe +:10ad18001c00c28f7402428c1c00c38f2118620071 +:10ad28001800c493000064a0010043241c00c28fd3 +:10ad3800740243ac1c00c28f030003247a0243a0b0 +:10ad48001c00c28f7b0243901800c2932610620039 +:10ad5800ff0043301c00c28f7b0243a09b6c400b5a +:10ad6800000000001c00c28f7402428c1c00c38fbc +:10ad7800211862001800c493000064a00100432455 +:10ad88001c00c28f740243ac1c00c28f0400032451 +:10ad98007a0243a01c00c28f1800c3937c0243a010 +:10ada8001c00c28f7b0243901800c29326106200d9 +:10adb800ff0043301c00c28f7b0243a09b6c400bfa +:10adc800000000001c00c28f7402428c1c00c38f5c +:10add800211862001800c493000064a001004324f5 +:10ade8001c00c28f740243ac1c00c28f05000324f0 +:10adf8007a0243a01c00c28f7b0243901800c293c2 +:10ae080026106200ff0043301c00c28f7b0243a063 +:10ae18009b6c400b000000001800c3930100022443 +:10ae28000a006210000000001800c393ff0002240b +:10ae380006006210000000001c00c48fc46c400fa4 +:10ae4800000000009b6c400b000000001c00c28f3b +:10ae58007402428c1c00c38f211862001800c4932e +:10ae6800000064a0010043241c00c28f740243ac9c +:10ae78001c00c28f060003247a0243a01c00c28f64 +:10ae88007b0243901800c29326106200ff004330f3 +:10ae98001c00c28f7b0243a09b6c400b000000008b +:10aea8001c00c28f1800c3937e0243a01c00c28fef +:10aeb8007402428c1c00c38f211862001800c493ce +:10aec800000064a0010043241c00c28f740243ac3c +:10aed8001c00c28f070003247a0243a01c00c28f03 +:10aee8007b0243901800c29326106200ff00433093 +:10aef8001c00c28f7b0243a09b6c400b000000002b +:10af08001c00c28f1800c393790243a01c00c28f93 +:10af18007402428c1c00c38f211862001800c4936d +:10af2800000064a0010043241c00c28f740243acdb +:10af38001c00c28f080003247a0243a01c00c28fa1 +:10af48007b0243901800c29326106200ff00433032 +:10af58001c00c28f7b0243a09b6c400b00000000ca +:10af68001c00c28f6c0240ac1800c3931c00c28f37 +:10af78006c0243ac1c00c28f6c02428c001a0200a7 +:10af88001c00c28f6c0243ac1c00c28f7402428c3e +:10af98001c00c38f211862001800c493000064a02d +:10afa800010043241c00c28f740243ac1c00c28ff2 +:10afb800090003247a0243a01c00c28f7b0243903d +:10afc8001800c29326106200ff0043301c00c28f95 +:10afd8007b0243a09b6c400b000000001c00c28f4a +:10afe8006c02438c1800c293251862001c00c28fa3 +:10aff8006c0243ac1c00c28f6c02428c001a020027 +:10b008001c00c28f6c0243ac1c00c28f7402428cbd +:10b018001c00c38f211862001800c493000064a0ac +:10b02800010043241c00c28f740243ac1c00c28f71 +:10b038000a0003247a0243a01c00c28f7b024390bb +:10b048001800c29326106200ff0043301c00c28f14 +:10b058007b0243a09b6c400b000000001c00c28fc9 +:10b068006c02438c1800c293251862001c00c28f22 +:10b078006c0243ac1c00c28f6c02428c001a0200a6 +:10b088001c00c28f6c0243ac1c00c28f7402428c3d +:10b098001c00c38f211862001800c493000064a02c +:10b0a800010043241c00c28f740243ac1c00c28ff1 +:10b0b8000b0003247a0243a01c00c28f7b0243903a +:10b0c8001800c29326106200ff0043301c00c28f94 +:10b0d8007b0243a09b6c400b000000001c00c28f49 +:10b0e8006c02438c1800c293251862001c00c28fa2 +:10b0f8006c0243ac1c00c28f7402428c1c00c38fcc +:10b10800211862001800c493000064a001004324c1 +:10b118001c00c28f740243ac1c00c28f6c02428cac +:10b128002d01422c04004014000000001c00c48fb4 +:10b13800c46c400f000000001c00c28f6c02428cdf +:10b1480006004014000000001c00c28f0d000324fc +:10b158007a0243a05c6c400b000000001c00c28f08 +:10b168000c0003247a0243a01c00c28f7b02439088 +:10b178001800c29326106200ff0043301c00c28fe3 +:10b188007b0243a09b6c400b000000001c00c28f98 +:10b198007b0243901800c29326106200ff004330e0 +:10b1a8001c00c28f7b0243a01c00c28f7402428c19 +:10b1b8001c00c38f211862001800c493000064a00b +:10b1c800010043241c00c28f740243ac1c00c28fd0 +:10b1d8007002428c010043241c00c28f700243acf1 +:10b1e8001c00c28f7002438c1c00c28f6c02428c00 +:10b1f8001b006214000000001c00c28f0d00032415 +:10b208007a0243a09b6c400b000000001c00c28f18 +:10b218007b0242901800c3930600621000000000f1 +:10b228001c00c48fc46c400f000000009b6c400bd6 +:10b23800000000001c00c48fc46c400f0000000018 +:10b248009b6c400b000000001c00c48fc46c400fb6 +:10b2580000000000000000009b6c400b0000000094 +:10b268000000000021e8c0031400bf8f1000be8f4b +:10b278001800bd270800e00300000000e0ffbd271c +:10b288001c00bfaf1800beaf21f0a0032110800042 +:10b298002400c5af2000c2a32400c28f06004010be +:10b2a8000000000001000324080043100000000013 +:10b2b800be6c400b0000000000a0023cd0034224fa +:10b2c8001000c2afb96c400b0000000000a0023ca7 +:10b2d800540642241000c2af000000002000c293b0 +:10b2e800212040001000c58ff36a400f00000000c5 +:10b2f80021e8c0031c00bf8f1800be8f2000bd27a7 +:10b308000800e00300000000f8ffbd270400beaffe +:10b3180021f0a0030800c4af0800c28f6c0240ac43 +:10b328000800c28f740240ac0800c28f780240a0a7 +:10b338000800c28f790240a00800c28f7b0240a09b +:10b348000800c28f010003247a0243a00800c28fbc +:10b35800700240ac0800c28f7e0240a00800c28f75 +:10b368007d0240a021e8c0030400be8f0800bd276d +:10b378000800e00300000000f8ffbd270400beaf8e +:10b3880021f0a00321e8c0030400be8f0800bd27f8 +:10b398000800e00300000000f0ffbd270c00beaf6e +:10b3a80021f0a0032118a0002110c0001000c4a3a0 +:10b3b8001400c3a31800c2a31000c3930100022401 +:10b3c8000500621400000000a3ff02240000c2a3cd +:10b3d800fa6c400b0000000090ff02240000c2a39a +:10b3e8001400c2930100c2a321e8c0030c00be8f61 +:10b3f8001000bd270800e00300000000f0ffbd2793 +:10b408000c00beaf21f0a0031000c4af2110a000b3 +:10b418001400c2a30000c0a30100c0a3156d400b17 +:10b42800000000000100c2931000c38f21106200c9 +:10b43800000043900000c293261062000000c2a3df +:10b448000100c293010042240100c2a30100c3937a +:10b458001400c2932b106200f2ff40140000000099 +:10b468000000c29321e8c0030c00be8f1000bd2766 +:10b478000800e00300000000f8ffbd270400beaf8d +:10b4880021f0a00321e8c0030400be8f0800bd27f7 +:10b498000800e00300000000d8ffbd272400bfaf6c +:10b4a8002000beaf1c00b0af21f0a00321408000f7 +:10b4b8002120c0002118e0004000c28f2800c8a346 +:10b4c8002c00c5a33000c4a33400c3a31000c2a33a +:10b4d8003c00c28f2d01422c0700401400000000e0 +:10b4e8004400c28f000040ac00a0023c98024224f5 +:10b4f800916d400b0000000000a0023c8aff03246d +:10b50800980243a000a0023c9802422401000324b0 +:10b51800010043a03000c38300a0023c98024224eb +:10b52800020043a02800c38300a0023c98024224e2 +:10b53800030043a02c00c38300a0023c98024224cd +:10b54800040043a01000c38300a0023c98024224d8 +:10b55800050043a03400c38300a0023c98024224a3 +:10b56800060043a03c00c28f02160200201c027c89 +:10b5780000a0023c98024224070043a03c00c28f6e +:10b5880002140200201c027c00a0023c9802422403 +:10b59800080043a03c00c28f02120200201c027c5b +:10b5a80000a0023c98024224090043a03c00c28f3c +:10b5b800201c027c00a0023c980242240a0043a0fe +:10b5c80000a0023ca3024224212040003800c58f7d +:10b5d8003c00c68f0e87400f000000003c00c28f61 +:10b5e8000b00502400a0023c980243243c00c28f68 +:10b5f800ff0042300b004224ff004230212060004f +:10b6080021284000016d400f00000000201c027c32 +:10b6180000a0023c9802422421100202000043a02c +:10b628003c00c28f0c004224211840004400c28f05 +:10b63800000043ac00a0023c9802422421e8c00369 +:10b648002400bf8f2000be8f1c00b08f2800bd27ac +:10b658000800e00300000000f8ffbd270400beafab +:10b6680021f0a0030800c4af0800c28f0b004224d9 +:10b6780021e8c0030400be8f0800bd270800e003ce +:04b6880000000000be +:020000040000fa +:020000041d01dc +:10b68c00a8ffbd274800b6af3c00b3af3000b0af49 +:10b69c005400bfaf5000beaf4c00b7af4400b5afc5 +:10b6ac004000b4af3800b2af3400b1af21b080006d +:10b6bc002198a0006000a6af2180000000006482e9 +:10b6cc00420080101000a4a32500022470008214f4 +:10b6dc000100712602006426ffff82802d000624e3 +:10b6ec002118000030000824200007242b00092416 +:10b6fc0064004610ffff93242e0045285a00a0102a +:10b70c00000000006b004750010063346700495093 +:10b71c0002006334029d053c9822a5242120a2003e +:10b72c0002006630feff6530010084900b18a60005 +:10b73c0008006630fbff6530040084305f00801029 +:10b74c000b18a6002140000040880800c0400800eb +:10b75c00214028020100732621400201029d073c72 +:10b76c00000062829822e7242120e20001008490ec +:10b77c0004008430f4ff8014d0ff08252e0004242c +:10b78c001f00445001007326218800006c00042423 +:10b79c0010000624008005241000a2a341014410cf +:10b7ac00010073266d0044284b00801073000424a4 +:10b7bc006300042452014410640044282701805083 +:10b7cc00640004246c014014580004245400bf8ffe +:10b7dc00211000025000be8f4c00b78f4800b68f6e +:10b7ec004400b58f4000b48f3c00b38f3800b28f4b +:10b7fc003400b18f3000b08f0800e0035800bd2733 +:10b80c00000062822a0004241e02441000406334ab +:10b81c00029d053c9822a5242120a20001008490c1 +:10b82c0004008430d8ff80102188000040201100d3 +:10b83c00c088110021889100010073262188220202 +:10b84c00029d073c000062829822e7242120e2003e +:10b85c000100849004008430f4ff8014d0ff312662 +:10b86c00e76d400b6c000424abff4814029d053cb3 +:10b87c000400633401008424ffff82809eff461481 +:10b88c00ffff932408006334216e400b01008424d5 +:10b89c00c287400f2128c002ffff032487ff4310fb +:10b8ac0021982002b26d400b01001026216e400b36 +:10b8bc0001008424216e400b010084242a000424fe +:10b8cc00ec0044102e000424afff4414214000006f +:10b8dc00036e400b01007326f900441074004428d9 +:10b8ec00d6008010750004246f0004243500441029 +:10b8fc007000042423014450200063341000b72747 +:10b90c0001001224040020122b1048022b103202ca +:10b91c000b9022022b1048020200401021880000dc +:10b92c0023881201080075301400a016ffff1424a0 +:10b93c00576e400bffff3126c287400f00000000fe +:10b94c0027100200010003260b806200ffff312646 +:10b95c0020000424f8ff34162128c002626e400b2c +:10b96c00ffff14240000e482c287400f0100f72679 +:10b97c0027100200010003260b806200ffff5226f5 +:10b98c00f8ff54162128c0024dffa052000064821b +:10b99c006e6e400bffff1224c287400f00000000a8 +:10b9ac0027100200010003260b806200ffff3126e6 +:10b9bc0020000424f8ff32162128c002b36d400b7e +:10b9cc000000648240006334c00062309100401477 +:10b9dc002016037cbb0140046000a68f100062306f +:10b9ec00de0040106000a28f6000a78f0000e48c86 +:10b9fc000400e724c31704006000a7af21b880003f +:10ba0c0021f04000050041042310020023b804007b +:10ba1c002b2017000300633423f04400030020168e +:10ba2c00c00075302588fe020100312e4000022432 +:10ba3c005601a2124100a22a2f01401080000224bc +:10ba4c001500a0161000a28301000224b701c01338 +:10ba5c001000a2a3029d043c90268424020007241b +:10ba6c00020002249f6e400b140009242138400070 +:10ba7c000400858c010042242b30c5039e01c014a8 +:10ba8c002014027c9901be500000858cf7ff4914ec +:10ba9c00080084241000a2a32a2051001401801055 +:10baac002a2022022014117c1000a2a305000011f0 +:10babc000040643003006530ffff04250b40850017 +:10bacc0000406430060080102a2048002a202802fa +:10badc000200805021400000234011012a20480020 +:10baec00030080501800a0af231002011800a2af71 +:10bafc0004006230eb0040101800a28f020062308c +:10bb0c000301401001006230010065302d00022459 +:10bb1c002b0004240b2045002128c002c287400fb3 +:10bb2c002c00a3af27100200010004262c00a38fc9 +:10bb3c000b8082001800a48f950080143000042420 +:10bb4c00080065302800a5afffff3126401011001a +:10bb5c00029d073cc0a011008026e72480901100b4 +:10bb6c004100a42a218851002000633040101e009f +:10bb7c0021a0f4002000a2af1c00a4affb6e400b70 +:10bb8c002400a3af0e00a0161000a4830000868e24 +:10bb9c000400878e2120e002637d400f2128c00322 +:10bbac0021204000212860000a0006244c7c400f14 +:10bbbc0021380000300042242024027c1000a4a371 +:10bbcc00c287400f2128c002271002000100032663 +:10bbdc000b806200f8ff9426fcff5226fdff3126f5 +:10bbec00fdff02249d002212400002247b00a212c1 +:10bbfc001c00a58fe3ffa014800002248300a21276 +:10bc0c00c0000224e1ffa2121000a483f36e400bcb +:10bc1c000000000022014004100062304a00401075 +:10bc2c006000a28f6000a78f21f000000000f78c4d +:10bc3c000400e7248a6e400b6000a7af0500441097 +:10bc4c00780004242eff44141000b727756e400ba7 +:10bc5c0080006334756e400bc00063345aff44108f +:10bc6c006900042458ff44101000b727446e400ba1 +:10bc7c00010012246000a28f6000a48f01007326c3 +:10bc8c000000488c04008424000062826000a4af91 +:10bc9c002e000424bdfe441421880000036e400bca +:10bcac0001007326100062302138a0000a38c2004f +:10bcbc002518e300ffff6330e96d400b0000628242 +:10bccc006000a28f0000448c0400452411018010f8 +:10bcdc0021b8800000008280120140506000a5afa6 +:10bcec002190000001005226211092000000428099 +:10bcfc00fdff405401005226446e400b6000a5af7e +:10bd0c006000a48f10006530010082800000868cda +:10bd1c00040084242c00a0101000a2a32b0040507f +:10bd2c001400a6a3ffff0524280045501400a6a369 +:10bd3c001400a2a31500a6a3020012241400b72716 +:10bd4c00446e400b6000a4af21f000000000578c43 +:10bd5c00040042248a6e400b6000a2af0000448ca9 +:10bd6c00040042246000a2afc317040021b8800075 +:10bd7c00846e400b21f04000e1fe44141000b72704 +:10bd8c0020006334756e400b800063343000042453 +:10bd9c002128c002c287400f2c00a3af1800a68f29 +:10bdac002710020001000426ffffc6241800a6afce +:10bdbc000b808200f5ffc0142c00a38f08006730a5 +:10bdcc00d56e400b2800a7af1400a6a301001224c7 +:10bddc001400b727446e400b6000a4af2000a68f60 +:10bdec0027101100041046000620370225204400bd +:10bdfc002000233206103e020b2043000700843043 +:10be0c0030008424f36e400b1000a4a32400a68ff2 +:10be1c001000c010029d023c029d073c5826e324f2 +:10be2c002000a58f27201200042085000610570241 +:10be3c00251082002000453206205e020b10850082 +:10be4c000f0042302110620000004480f36e400b62 +:10be5c001000a4a38b6f400b6c2643242800a78fe3 +:10be6c0017fee050000064821800a28f14fe4058a8 +:10be7c000000648220000424c287400f2128c002e5 +:10be8c001800a48f2710020001000326ffff842452 +:10be9c001800a4aff7ff80140b806200b36d400b49 +:10beac0000006482670040140800653008006430ac +:10bebc002800a4af020062305e0040100100623026 +:10becc00010065302d0002242b0004240b204500ba +:10bedc002128c002c287400f2c00a3af27100200fc +:10beec00010004260b808200d56e400b2c00a38f22 +:10befc00ae6e400b0b8844000900a212c000022455 +:10bf0c00d1fea2121000a283aa6e400b2a2051006f +:10bf1c0009ff40501800a48fc96e400b2000042468 +:10bf2c00010002248600c0131000a2a30200022408 +:10bf3c0002000b240001042421280000d66f400bc2 +:10bf4c0010000c242128e00021584000003105008d +:10bf5c0000490400025704002550460121302001fd +:10bf6c002b48c50301006b25cafe20152138400162 +:10bf7c006400c5132b20e40220140b7cf1ff4c143d +:10bf8c002120c000a96e400b1000aca301000224bc +:10bf9c007000c0131000a2a340000424212800004c +:10bfac00c0300500c04804000200022442570400bf +:10bfbc002550460101004224213020012b48c503a5 +:10bfcc0002000b2415000c242014027c11002015f7 +:10bfdc00213840011200c5132b20e402adfe4c1099 +:10bfec002120c0002128e000c0300500c04804001a +:10bffc0042570400255046012158400021302001b1 +:10c00c00010042242b48c5032014027cf1ff2011af +:10c01c00213840011000aba3a96e400b2110600128 +:10c02c00eeff8010000000001000aba3a96e400bc7 +:10c03c0021106001c5fe4050ffff3126b76f400b49 +:10c04c00200004249bffa0142800a5af200004248a +:10c05c002128c002c287400f2c00a3af1800a68f66 +:10c06c002710020001000426ffffc6241800a6af0b +:10c07c000b808200f5ffc0142c00a38fb16f400b16 +:10c08c00020062306000a68f010073260000d18c84 +:10c09c000400c62400006282e66d400b6000a6af6f +:10c0ac006000a58ff8ff02240700a424241082004e +:10c0bc00080046246000a6af0000578c8a6e400b27 +:10c0cc0004005e8cf8ff02240700c5242428a2007b +:10c0dc000000a48c0400a28c0800a5246000a5af6d +:10c0ec0021b88000846e400b21f040002b28e50223 +:10c0fc0066fea010000000001000a7a3a96e400b64 +:10c10c002110e0009dff805020140b7ca96e400b89 +:10c11c001000a2a3029d173c5026f726386f400b47 +:10c12c002120e002446e400b219000000a00e22e18 +:10c13c0049fe4010029d043ca96e400b01000224f4 +:10c14c001000e22e7aff405002000224a96e400b30 +:10c15c00010002240800e22e90ff4010400004244d +:08c16c00a96e400b0100022442 +:020000040000fa +:020000041d01dc +:10c17400b8ffbd273c00b7af3400b5af029d173cf4 +:10c1840000a0153c3800b6af2000b0af4400bfafec +:10c194004000beaf3000b4af2c00b3af2800b2af44 +:10c1a4002400b1af9822f7262180a0005000a6af4a +:10c1b400bc40a4ae21b000001800a0af0000119252 +:10c1c400c80020124400bf8f2110f10201004280f8 +:10c1d40088004230bd0040140100102625000224ce +:10c1e400a500221604000324000013822188000005 +:10c1f4001400a3af21f0000004001424ff007332e4 +:10c204007900622e1c004014010012262110f30252 +:10c214000100429004004230e6014010000000009a +:10c22400248a400f2120000200005382029d033c17 +:10c2340098226324208c027c211063020100429026 +:10c2440004004230edff401021804002010010261e +:10c25400000013822110f3020100429004004230d6 +:10c26400fbff405401001026ff0073327900622e58 +:10c27400e6ff401001001226029d043c80101300ca +:10c2840098c28424211082000000428c08004000df +:10c294000000000028c8019d10c2019d10c2019d2c +:10c2a40010c2019d10c2019d10c2019d10c2019dca +:10c2b40010c2019d10c2019d10c2019d10c2019dba +:10c2c40010c2019d10c2019d10c2019d10c2019daa +:10c2d40010c2019d10c2019d10c2019d10c2019d9a +:10c2e40010c2019d10c2019d10c2019d10c2019d8a +:10c2f40010c2019d10c2019d10c2019d10c2019d7a +:10c3040010c2019d10c2019d10c2019d10c2019d69 +:10c3140010c2019d10c2019d10c2019d10c2019d59 +:10c3240010c2019d10c2019d10c2019d10c2019d49 +:10c3340010c2019d10c2019d10c2019d14c8019d2f +:10c3440010c2019d10c2019d10c2019d10c2019d29 +:10c3540010c2019d10c2019d10c2019d10c2019d19 +:10c3640010c2019d10c2019d10c2019d10c2019d09 +:10c3740010c2019d10c2019d10c2019d10c2019df9 +:10c3840010c2019d10c2019d10c2019d10c2019de9 +:10c3940010c2019d10c2019d10c2019d10c2019dd9 +:10c3a40010c2019d10c2019d10c2019d10c2019dc9 +:10c3b40010c2019d10c2019d10c2019d10c2019db9 +:10c3c40010c2019df8c7019d10c2019d10c2019dbc +:10c3d40010c2019d10c2019d10c2019d10c2019d99 +:10c3e40010c2019d10c2019d10c2019d10c2019d89 +:10c3f40010c2019de8c7019d10c2019d10c2019d9c +:10c4040010c2019d10c2019d10c2019d10c2019d68 +:10c4140010c2019d10c2019d10c2019d10c2019d58 +:10c42400a0c7019d94c7019d10c2019d10c2019d2a +:10c4340010c2019d80c7019d94c7019d10c2019d3a +:10c4440010c2019df8c7019d10c2019d10c2019d3b +:10c45400e0c6019d10c2019d10c2019d10c2019d44 +:10c464002cc6019d10c2019d94c7019d10c2019d5f +:10c4740010c2019d18c5019d6488400fbc40a48e64 +:10c484004fff225200001192ffff03244401431482 +:10c4940000a0033c1800a38f0b1063004400bf8f5f +:10c4a4004000be8f3c00b78f3800b68f3400b58f84 +:10c4b4003000b48f2c00b38f2800b28f2400b18fca +:10c4c4002000b08f0800e0034800bd27938b400f85 +:10c4d40000000000000011923cff20162110f10220 +:10c4e4004400bf8f1800a28f4000be8f3c00b78f5e +:10c4f4003800b68f3400b58f3000b48f2c00b38f62 +:10c504002800b28f2400b18f2000b08f0800e00310 +:10c514004800bd27218040021000132421b00000f0 +:10c52400938b400f000000006488400fbc40a48e31 +:10c53400219040002d0002247100421200a0033c0f +:10c5440021204002212860022130c0024e8a400f7f +:10c554001c00a0afff00032476004310bc40a58e4e +:10c5640030000224d30042120000000021a0000089 +:10c5740002a0937221204002212860022130c002cf +:10c584004e8a400fffff3126208c117c0b002012b5 +:10c5940021a054006488400fbc40a48e2120400098 +:10c5a400212860022130c0024e8a400f21904000b1 +:10c5b400ff000324efff435402a0937221204002a2 +:10c5c400212860024e8a400f2130c002ff0003245c +:10c5d400e2004310bc40a58e1c00a48f231014005d +:10c5e400f6fec0170ba044001800a38f1400a48ffc +:10c5f40001006224ff0042301800a2af04000224ac +:10c60400d00082101400a48f02000224d7008210ec +:10c614005000a48f0000828c040084245000a4af36 +:10c624007070400b000054ac938b400f000000006e +:10c634009a00c0135000a38f6488400fbc40a48e9e +:10c64400ffff032494ff43101800a38f1400401429 +:10c6540001004324af71400b21804002c9006210e5 +:10c66400000000000500c017ffff31261000a48f52 +:10c67400000082a0010084241000a4af208c117c4f +:10c684000d002012218040026488400fbc40a48e1b +:10c69400010043240200642c07008014218040021e +:10c6a4002118e3020000638088006330ebff6050d0 +:10c6b4000000438221804002c1fec0570000119255 +:10c6c4001800a38f1000a48f01006224ff004230e1 +:10c6d4001800a2af7070400b000080a0938b400f35 +:10c6e400218040026488400fbc40a48e2190400009 +:10c6f4002d00022492ff42160800132400a0033cdc +:10c70400bc40648c010002246488400f1c00a2af6a +:10c714002190400021204002212860024e8a400fcf +:10c724002130c002ff0003248eff43143000022492 +:10c73400bc40a58e408b400f212040021800a38fdf +:10c744006900601000a0023c211060004400bf8f0b +:10c754004000be8f3c00b78f3800b68f3400b58fd1 +:10c764003000b48f2c00b38f2800b28f2400b18f17 +:10c774002000b08f0800e0034800bd270200022417 +:10c7840000005382218040028070400b1400a2af4d +:10c79400218040024971400b0a0013243500c01364 +:10c7a4001800a38fffff10246488400fbc40a48ea0 +:10c7b400780050101800a38f0500c017ffff312622 +:10c7c4001000a48f000082a0010084241000a4aff4 +:10c7d400208c117cf4ff201e000000007070400bc0 +:10c7e4002180400221804002100013244971400b33 +:10c7f400010016241400a48f0700941008000224da +:10c8040000005382218040028070400b1400a2afcc +:10c814000100de27ff00de33000053828070400bee +:10c82400218040021800a38fc8ff6014211060000b +:10c83400bc40a38e4400bf8f0c006394ffff02240e +:10c84400100063300a1003004000be8f3c00b78f15 +:10c854003800b68f3400b58f3000b48f2c00b38ffe +:10c864002800b28f2400b18f2000b08f0800e003ad +:10c874004800bd275000a48f01006224ff0042300d +:10c884000000848c1800a2af5000a28f1000a4af47 +:10c8940004004224ea71400b5000a2af5000a48f60 +:10c8a4000000638c040084241000a3af8f71400b3c +:10c8b4005000a4af6488400fbc40a48e78000324c9 +:10c8c4001a004310580003241a004314bc40a58ed8 +:10c8d4001800c012000000006488400fbc40a48e01 +:10c8e4005c71400b21904000bc40438c4400bf8fde +:10c8f4000c006394ffff0224100063300a1003004d +:10c904004000be8f3c00b78f3800b68f3400b58f1f +:10c914003000b48f2c00b38f2800b28f2400b18f65 +:10c924002000b08f0800e0034800bd27eaffc012d2 +:10c93400bc40a58e408b400f212040005d71400b10 +:10c9440021a000005000a38f0000628c0400632427 +:10c954005000a3af7070400b000054ac408b400fec +:10c96400212040027871400b1c00a48f5000a38f3b +:10c974000000628c040063245000a3af7070400b6d +:10c98400000054a40dfec01701005026b271400be4 +:10c994001800a38fffff02242871400b0b106300c3 +:10c9a400bc40658c408b400f21204000d471400b6b +:10c9b4001800a28f6488400fbc40a48e87ff6212c7 +:10c9c400ffff0324f6ff431400a0033c1800a48fc8 +:08c9d400d471400b0b1084002c +:020000040000fa +:020000041d01dc +:10c9dc004a462e636f6d0000426f6f746c6f61641a +:10c9ec006572207265636569766564206120667284 +:10c9fc00616d65207769746820696e76616c696415 +:10ca0c002043524300000000426f6f746c6f6164ee +:10ca1c00657220486561727462656174205265713b +:10ca2c007565737400000000424f4f544c4f4144e5 +:10ca3c0045525f45524153455f424f4f544c4f4115 +:10ca4c004445525f464c4153485f524551554553fe +:10ca5c0054000000424f4f544c4f414445525f49e3 +:10ca6c004e49545f55504c4f41445f5245515545ca +:10ca7c0053540000424f4f544c4f414445525f4772 +:10ca8c0045545f53544154455f5245515545535499 +:10ca9c0000000000424f4f544c4f414445525f55eb +:10caac00504c4f41445f46494e49534845445f52b0 +:10cabc004551554553540000424f4f544c4f41443f +:10cacc0045525f455845435554455f555047524173 +:10cadc0047455f524551554553540000424f4f5402 +:10caec004c4f414445525f41424f52545f4f504569 +:10cafc00524154494f4e5f524551554553540000d5 +:10cb0c00424f4f544c4f414445525f434845434b71 +:10cb1c005f464c4153485f4649524d575f494e540e +:10cb2c004547524954595f5245515545535400009d +:10cb3c00426f6f746c6f6164657250726f746f6367 +:10cb4c006f6c206465746563746564206120435266 +:10cb5c0043206572726f722e2020436d643a20253b +:10cb6c00642c2052784352433a307825782c204557 +:10cb7c00787065637465643a5b307825785d0a007b +:10cb8c00426f6f746c6f6164657220496e7465726c +:10cb9c006661636520676f696e6720696e746f20cc +:10cbac0061637469766520737461746500000000bc +:10cbbc00426f6f746c6f6164657220496e7465723c +:10cbcc006661636520676f696e6720696e746f209c +:10cbdc00457261736520466c61736820737461746f +:10cbec0065000000426f6f746c6f61646572204960 +:10cbfc006e7465726661636520676f696e67206924 +:10cc0c006e746f204669726d776172652052582080 +:10cc1c00737461746500000041626f7274696e67b1 +:10cc2c002075706c6f61642c20676f696e6720696a +:10cc3c006e746f205354414e444259206d6f64659d +:10cc4c0000000000426f6f746c6f61646572207736 +:10cc5c00696c6c206e6f77207570677261646520eb +:10cc6c00616e64207265626f6f7421210000000098 +:10cc7c00426f6f746c6f616465722075706772615e +:10cc8c00646520726571756573742064656e696581 +:10cc9c00643a204669726d77617265206e6f7420fc +:10ccac0075706c6f6164656400000000466c6173a4 +:10ccbc00682065726173652066696e697368656466 +:10cccc002e2020426f6f746c6f6164657220496e08 +:10ccdc007465726661636520676f696e6720696e43 +:10ccec00746f204163746976652073746174650098 +:10ccfc00466c617368206572617365206572726f32 +:10cd0c00722e2020426f6f746c6f616465722049c3 +:10cd1c006e7465726661636520676f696e67206902 +:10cd2c006e746f20416374697665207374617465e9 +:10cd3c0000000000466c61736820657261736520a9 +:10cd4c0061626f72742e2020426f6f746c6f61641d +:10cd5c00657220496e7465726661636520676f69e0 +:10cd6c006e6720696e746f204163746976652073f9 +:10cd7c00746174650000000041626f7274696e67c3 +:10cd8c0020466c6173682065726173652c20676f37 +:10cd9c00696e6720696e746f205354414e4442593a +:10cdac00206d6f6465000000426f6f746c6f61647e +:10cdbc006572204368756e6b202564207375636300 +:10cdcc0065737366756c79207772697474656e20ff +:10cddc00746f20666c6173680a000000426f6f7498 +:10cdec006c6f6164657220466c6173682077726940 +:10cdfc007465206572726f722e2041626f72746955 +:10ce0c006e6720616e6420676f696e6720696e744f +:10ce1c006f205354414e4442592073746174650021 +:10ce2c00426f6f746c6f6164657220496e746572c9 +:10ce3c00666163652041424f5254494e472055501c +:10ce4c004c4f41442e2052656365697665642069b8 +:10ce5c006e76616c6964206368756e6b20696e64b4 +:10ce6c0065782e202052783a205b25645d202d2099 +:10ce7c0045787065637465643a205b25645d0a00cf +:10ce8c00426f6f746c6f6164657220496e74657269 +:10ce9c00666163652e205278206e6577206461741c +:10ceac0061206368756e6b2e202057726974696ef1 +:10cebc006720746f20666c6173682e2020496e6445 +:10cecc0065783a2025640a00426f6f746c6f616458 +:10cedc00657220496e7465726661636520696e7651 +:10ceec00616c6964206368756e6b204352432e201d +:10cefc0052657175657374696e6720726573656ec2 +:10cf0c0064206368756e6b20696e646578205b25a0 +:10cf1c00645d0a00426f6f746c6f616465722049c6 +:10cf2c006e74657266616365206669726d77617295 +:10cf3c00652075706c6f61642066696e69736865d5 +:10cf4c00642e20436865636b20666c61736820698e +:10cf5c006e746567726974792e0000004669726d93 +:10cf6c007761726520696e74656772697479206384 +:10cf7c006865636b206661696c65642e2020476f61 +:10cf8c00696e67206261636b20746f205354414e4d +:10cf9c004442592073746174652e0000426f6f74a3 +:10cfac006c6f616465722061626f7274696e672068 +:10cfbc006669726d7761726520646f776e6c6f61f4 +:10cfcc00642e2020476f696e67206261636b20744a +:10cfdc006f205354414e4442592073746174650060 +:10cfec00426f6f746c6f6164657220496e74657208 +:10cffc00666163652045726173696e672073656352 +:10d00c00746f722025307825780a0000426f6f7497 +:10d01c006c6f6164657220496e74657266616365dc +:10d02c003a204c61737420736563746f722030788e +:10d03c002578206572617365642061667465722061 +:10d04c00256420706f6c6c730a000000426f6f7463 +:10d05c006c6f6164657220496e746572666163659c +:10d06c0020736563746f7220307825782065726147 +:10d07c0073656420616674657220256420706f6c22 +:10d08c006c730a00426f6f746c6f61646572204937 +:10d09c006e7465726661636520466c6173682065a9 +:10d0ac0072617365206572726f722e20204d6178eb +:10d0bc0020706f6c6c20636f756e74207265616389 +:10d0cc00686564203a2025642121210a00000000b3 +:10d0dc00426f6f746c6f6164657220666c6173680b +:10d0ec00206572726f722e202041626f7274696ead +:10d0fc006720616e6420676f696e67206261636b85 +:10d10c0020746f205354414e44425900426f6f7447 +:10d11c006c6f6164657220666c61736820777269ec +:10d12c0074652074696d656f7574206572726f72a9 +:10d13c002e202041626f7274696e6720616e6420cc +:10d14c00676f696e67206261636b20746f20535444 +:10d15c00414e444259000000436865636b696e6739 +:10d16c0020466c61736820626f6f746c6f616465cc +:10d17c0072206461746120696e7465677269747978 +:08d18c002e2e2e2000000000f1 +:020000040000fa +:020000041d01dc +:10d19400e0ffbd271c00bfaf1800beaf21f0a00305 +:10d1a4002000c4af2400c5af1000c0a31400c0af5a +:10d1b4001400c2270200033cac0764342128400059 +:10d1c400727b400f000000001000c2a31000c28355 +:10d1d40010004014000000002000c28f0500401021 +:10d1e400000000001400c28fffff43302000c28ff4 +:10d1f400000043a42400c28f060040100000000079 +:10d204001400c28f02140200ffff43302400c28fb7 +:10d21400000043a41000c28321e8c0031c00bf8f98 +:10d224001800be8f2000bd270800e00300000000a6 +:10d23400d8ffbd272400bfaf2000beaf21f0a0035c +:10d244002800c4af1200c0a71400c0af1000c0a3d0 +:10d254001800c0af1c00c0af2800c48f21280000f4 +:10d264001c000624fa89400f000000001200c227a7 +:10d2740021204000212800006574400f00000000b8 +:10d284001200c29782130200ffff4230ff004230b7 +:10d294000300433002000224400062140000000036 +:10d2a4001400c2279c14042421284000727b400fe0 +:10d2b400000000001000c2a31000c2833900401413 +:10d2c400000000001400c28f300040100000000075 +:10d2d4001400c38f0300023c251862001800c22703 +:10d2e400212060002128400008000624a67b400f6e +:10d2f400000000001000c2a31000c28329004014e3 +:10d30400000000001c00c28f1400c2af1400c28fc2 +:10d31400ffff42301400c2af1400c28f1700401048 +:10d32400000000001400c38f0300023c25186200b3 +:10d334002800c28f21206000212840001c00062400 +:10d34400a67b400f000000001000c2a31000c2839f +:10d3540014004014000000002800c28f0000439411 +:10d364001200c2970f00621000000000f4ff0224b4 +:10d374001000c2a3ea74400b00000000f4ff022472 +:10d384001000c2a3ea74400b00000000f4ff022462 +:10d394001000c2a3ea74400b00000000f4ff022452 +:10d3a4001000c2a31000c28321e8c0032400bf8f71 +:10d3b4002000be8f2800bd270800e0030000000005 +:10d3c400d8ffbd272400bfaf2000beaf21f0a003cb +:10d3d4002800c4af1200c0a71400c0af1000c0a33f +:10d3e4001800c0af1c00c0af2800c48f2128000063 +:10d3f4001c000624fa89400f000000001200c22716 +:10d4040021200000212840006574400f0000000026 +:10d414001200c29782130200ffff4230ff00423025 +:10d4240003004330020002244000621400000000a4 +:10d434001400c2279c14042421284000727b400f4e +:10d44400000000001000c2a31000c2833900401481 +:10d45400000000001400c28f3000401000000000e3 +:10d464001400c38f0300023c251862001800c22771 +:10d47400212060002128400008000624a67b400fdc +:10d48400000000001000c2a31000c2832900401451 +:10d49400000000001c00c28f1400c2af1400c28f31 +:10d4a400021402001400c2af1400c28f170040100f +:10d4b400000000001400c38f0300023c2518620022 +:10d4c4002800c28f21206000212840001c0006246f +:10d4d400a67b400f000000001000c2a31000c2830e +:10d4e40014004014000000002800c28f0000439480 +:10d4f4001200c2970f00621000000000f4ff022423 +:10d504001000c2a34e75400b00000000f4ff02247b +:10d514001000c2a34e75400b00000000f4ff02246b +:10d524001000c2a34e75400b00000000f4ff02245b +:10d534001000c2a31000c28321e8c0032400bf8fdf +:10d544002000be8f2800bd270800e0030000000073 +:10d55400e0ffbd271c00bfaf1800beaf21f0a00341 +:10d564001000c0a3212000002d7b400f000000000c +:10d574001000c2a31000c2830e004014000000007b +:10d58400b146400f00000000b946400f0000000003 +:10d594000200023c0003443421280000827b400f37 +:10d5a40000000000010002249c8082af6f75400bd4 +:10d5b40000000000000000001000c28321e8c00346 +:10d5c4001c00bf8f1800be8f2000bd270800e00399 +:10d5d40000000000e0ffbd271c00bfaf1800beaf75 +:10d5e40021f0a0031000c0a3b146400f00000000ca +:10d5f400212000002d7b400f000000001000c2a37a +:10d604001000c2830a00401400000000b946400f15 +:10d6140000000000593d400f0000000001000224fa +:10d624009c8082af1000c2838f75400b0000000005 +:10d63400000000001000c28321e8c0031c00bf8f5b +:10d644001800be8f2000bd270800e0030000000082 +:10d65400e0ffbd271c00bfaf1800beaf21f0a00340 +:10d664002000c4af1000c0a3010002241100c2a313 +:10d674002000c28f0d004010000000002000c28f67 +:10d68400000042901100c2a31100c2930500401093 +:10d69400000000001100c2930400422c0300401457 +:10d6a40000000000010002241100c2a3e23d400f6b +:10d6b400000000001000c2a31000c2832000401428 +:10d6c400000000001100c293212040007e40400f62 +:10d6d400000000001000c2a31000c2831b0040140d +:10d6e400000000001100c29321204000e940400fd7 +:10d6f400000000001000c2a31000c28316004014f2 +:10d70400000000001100c393020002241c006210f8 +:10d71400000000009e3d400f000000001000c2a366 +:10d724001000c2830f004014000000000200022415 +:10d734009c8082af1000c283e375400b00000000a0 +:10d7440000000000db75400b00000000000000003a +:10d75400db75400b0000000000000000db75400b8f +:10d7640000000000000000003e7b400f00000000ad +:10d774002747400f00000000e275400b0000000046 +:10d78400000000001000c28321e8c0031c00bf8f0a +:10d794001800be8f2000bd270800e0030000000031 +:10d7a400e0ffbd271c00bfaf1800beaf21f0a003ef +:10d7b4002000c4af1000c0a37675400f0000000025 +:10d7c4001000c2a31000c283050040140000000032 +:10d7d4002000c48f9575400f000000001000c2a304 +:10d7e4001000c28321e8c0031c00bf8f1800be8f45 +:10d7f4002000bd270800e00300000000e0ffbd2773 +:10d804001c00bfaf1800beaf21f0a0032000c4afbe +:10d814003141400f000000001000c2a31000c28379 +:10d824000b004014000000003e7b400f000000008d +:10d834001000c2a31000c2830800401400000000be +:10d844002747400f000000001976400b000000003d +:10d85400000000001976400b0000000000000000ea +:10d864009c8080af1000c28321e8c0031c00bf8fde +:10d874001800be8f2000bd270800e0030000000050 +:10d88400e0ffbd271c00bfaf1800beaf21f0a0030e +:10d89400e23d400f000000001000c2a31000c2834c +:10d8a40021e8c0031c00bf8f1800be8f2000bd27d5 +:10d8b4000800e00300000000f8ffbd270400beaf2d +:10d8c40021f0a0039c80828f21e8c0030400be8f56 +:10d8d4000800bd270800e0030000000098ffbd27f2 +:10d8e4006400bfaf6000beaf21f0a00301000224ba +:10d8f4001000c2afc404023c00b442341400c2afee +:10d90400050002241800c2afff8c400f0000000085 +:10d914001c00c2af88bf023c40000324042043ac77 +:10d924001800c28f01004230ff0042301d00401039 +:10d93400000000001400c28f2000c2af2400c0af5a +:10d944005b76400b000000002400c28f01004224db +:10d954002400c2af2000c38f36fe023c803c423418 +:10d96400211062002000c2af2000c38fc901023c15 +:10d9740081c342342b106200f3ff4010000000000a +:10d98400ff8c400f000000002800c2af88bf023c9b +:10d994002400c38f004043ac2800c48f9a8c400fee +:10d9a400000000001800c28f0200423068004010de +:10d9b400000000001400c28f2c00c2af2c00c28fe4 +:10d9c4003000c2af2c00c38fc404023c01b4423403 +:10d9d4002b10620008004014000000000800023c04 +:10d9e4003400c2af3000c28f421002003000c2af18 +:10d9f4008076400b000000003400c0af3400c28fba +:10da04003800c2afff8c400f000000003c00c2afe2 +:10da140088bf023c0030428c0003427cff0042304d +:10da24004000c2af4000c28f090040140000000053 +:10da340088bf023c00100324083043ac88bf023c7a +:10da44000030428c00084230fcff4014000000000b +:10da54004000c28f4400c2af81bf023c30f240acf0 +:10da640081bf023c99aa033c5566633430f243ac4f +:10da740081bf023c6655033caa99633430f243ac3f +:10da840081bf023c00f0428c5800c2af5800c28fe4 +:10da9400c4a4027c5800c2af5800c38f3800c28fa0 +:10daa400251062005800c2af5800c38f81bf023cea +:10dab40000f043ac81bf023c00f0428c5800c2af7e +:10dac40081bf023c3333033c3333633430f243ac21 +:10dad4004400c28f4800c2af4800c28f13004010f8 +:10dae4000000000088bf023c0030428c0003427cee +:10daf400ff0042304c00c2af4c00c28f10004014f3 +:10db04000000000088bf023c00100324083043ac2e +:10db140088bf023c0030428c00084230fcff4014b5 +:10db240000000000d276400b0000000088bf023cd9 +:10db340000100324043043acd276400b00000000f4 +:10db4400000000003c00c48f9a8c400f00000000cd +:10db54001800c28f040042300c0040100000000086 +:10db640088bf023c0040428c5000c2af5000c28fbc +:10db7400300042345000c2af88bf023c5000c38f13 +:10db8400004043acad8c400f000000001400c28f75 +:10db94005400c2af81bf023c00f0428cc00c427cf6 +:10dba400ff0042305400c38f061043005400c2af3c +:10dbb4001c00c48f9a8c400f00000000212000003c +:10dbc4006d8c400f0000000081bf033c00f0628cac +:10dbd4004408027c00f062ac81bf023cffff0334c6 +:10dbe400609043ac8c79400f00000000fd8c400f26 +:10dbf400000000000c65400f000000005e89400f2b +:10dc0400000000006051400f00000000e577400f65 +:10dc1400000000005481400f00000000029d023cff +:10dc24008c314424328c400f00000000be51400f60 +:10dc3400000000002a37400f00000000f267400f88 +:10dc4400000000009433400f000000002120000079 +:10dc540090010524e066400f00000000029d023c94 +:10dc6400a831442401000524438c400f0000000027 +:10dc74007389400f000000008989400f00000000f4 +:10dc8400010002241000c2afbe77400b0000000068 +:10dc94008989400f00000000fb34400f00000000a1 +:10dca4001268400f000000006a81400f000000006d +:10dcb4003f37400f000000003e78400f0000000096 +:10dcc40021200000f365400f00000000890040108f +:10dcd4000000000088bf023c2061428c8001427c2d +:10dce400ff00423027100200ff00423001004230a2 +:10dcf400ff00443088bf033c2061628c8431827c05 +:10dd0400206162ac88bf023c2061428c8001427c6d +:10dd1400ff00423027100200ff0042300100423071 +:10dd2400ff00443088bf033ca061628c444a827c7b +:10dd3400a06162ac88bf023c2061428c8001427cbd +:10dd4400ff00423027100200ff0042300100423041 +:10dd5400ff00443088bf033ce060628cc418827cbe +:10dd6400e06062ac88bf023c2061428c8001427c4e +:10dd7400ff00423027100200ff0042300100423011 +:10dd8400ff00443088bf033c6061628c0400827ce5 +:10dd9400606162ac88bf023c2061428c8001427c9d +:10dda400ff00423027100200ff00423001004230e1 +:10ddb400ff00443088bf033c6060628c8473827cc3 +:10ddc400606062ac88bf023cd060428c100042307c +:10ddd4000100422cff00443088bf033c6060628c29 +:10dde4000442827c606062ac88bf023cd060428c9a +:10ddf400200042300100422cff00443088bf033c25 +:10de04006060628c444a827c606062ac88bf023c81 +:10de1400d060428c400042300100422cff0044306c +:10de240088bf033c6060628c8452827c606062ac18 +:10de340088bf023cd060428c800042300100422cfa +:10de4400ff00443088bf033c6060628cc45a827c0b +:10de5400606062ac88bf023c9060428c002042301b +:10de64000100422cff00443088bf033c6060628c98 +:10de74000463827c606062ac88bf023c9060428c28 +:10de8400004042300100422cff00443088bf033c74 +:10de94006060628c446b827c606062ac88bf023cd0 +:10dea4005060428c008042300100422cff0044301c +:10deb40088bf033c6060628c4408827c606062ac12 +:10dec40088bf033ce060628c8410027ce06062ac3a +:10ded40088bf033ce060628c010004248410827ccf +:10dee400e06062ac2120000090010524e066400f50 +:10def400000000001000c38f0100022464ff6210c0 +:10df0400000000001000c28f21e8c0036400bf8f2e +:10df14006000be8f6800bd270800e0030000000019 +:10df2400e8ffbd271400bfaf1000beaf21f0a0036f +:10df34008c79400f0000000021e8c0031400bf8f5b +:10df44001000be8f1800bd270800e0030000000089 +:10df5400e8ffbd271400bfaf1000beaf21f0a0033f +:10df6400211080001800c2a31800c28321204000a1 +:10df74009181400f0000000021e8c0031400bf8f0e +:10df84001000be8f1800bd270800e0030000000049 +:10df9400f8ffbd270400beaf21f0a00388bf033cf7 +:10dfa4006010628cc439027c601062ac88bf033c90 +:10dfb4003010628cc439027c301062ac88bf023ce1 +:10dfc400d060428c00014230070040100000000085 +:10dfd40088bf033c0010628c4408027c001062acd1 +:10dfe4000078400b0000000088bf033c0010628ce6 +:10dff400010004244408827c001062ac88bf033c06 +:10e00400a010628c0200042484e6827ca01062ac1e +:10e0140088bf033ca010628c0100042404ce827cdf +:10e02400a01062ac88bf033c6010628c0100042421 +:10e03400c439827c601062ac88bf033c6010628c7f +:10e04400c47b027c601062ac88bf033c3010628cdd +:10e05400c47b027c301062ac88bf023cd060428c2e +:10e0640000044230070040100000000088bf033c59 +:10e074000010628cc418027c001062ac2778400b3c +:10e084000000000088bf033c0010628c01000424df +:10e09400c418827c001062ac88bf033cc010628c40 +:10e0a4000200042484e6827cc01062ac88bf033c76 +:10e0b400c010628c0200042404ce827cc01062acc6 +:10e0c40088bf033c6010628c01000424c47b827c02 +:10e0d400601062ac008180af048180af0100022433 +:10e0e40021e8c0030400be8f0800bd270800e00338 +:10e0f40000000000e8ffbd271400bfaf1000beaf52 +:10e1040021f0a0030081838f010002244f006214d8 +:10e114000000000006000424f365400f0000000026 +:10e12400211840000100022448006214000000008d +:10e13400060004248567400f0000000088bf023ced +:10e14400d060428c0002427cff00433088bf023c16 +:10e15400d060428c4002427cff00423012006214c4 +:10e16400000000000881828fceff4224088182af24 +:10e174000881828f00a0033cd42d6424029d033cbb +:10e184004c32652421304000798b400f00000000a0 +:10e1940000a0023cd42d4424be81400f00000000a6 +:10e1a4007a78400b000000000881828f32004224fc +:10e1b400088182af0881828f00a0033cd42d64249f +:10e1c400029d033c4c32652421304000798b400f82 +:10e1d4000000000000a0023cd42d4424be81400f66 +:10e1e4000000000088bf023cd060428c0001423035 +:10e1f400070040100000000088bf033c0010628c40 +:10e204004408027c001062ac8a78400b00000000d5 +:10e2140088bf033c0010628c010004244408827c03 +:10e22400001062ac88bf033c3010628cc439027c9d +:10e23400301062ac88bf033c6010628c010004247f +:10e24400c439827c601062ac008180af0481838f0a +:10e25400010002244f00621400000000070004249f +:10e26400f365400f00000000211840000100022463 +:10e274004800621400000000070004248567400f72 +:10e284000000000088bf023cd060428c8002427cc7 +:10e29400ff00433088bf023cd060428cc002427c05 +:10e2a400ff00423012006214000000000c81828fd3 +:10e2b400ceff42240c8182af0c81828f00a0033cec +:10e2c400d42d6424029d033c58326524213040003f +:10e2d400798b400f0000000000a0023cd42d4424a0 +:10e2e400be81400f00000000cc78400b000000000d +:10e2f4000c81828f320042240c8182af0c81828f88 +:10e3040000a0033cd42d6424029d033c58326524b0 +:10e3140021304000798b400f0000000000a0023c37 +:10e32400d42d4424be81400f0000000088bf023c6d +:10e33400d060428c0004423007004010000000000e +:10e3440088bf033c0010628cc418027c001062accd +:10e35400dc78400b0000000088bf033c0010628c96 +:10e3640001000424c418827c001062ac88bf033c02 +:10e374003010628cc47b027c301062ac88bf033cda +:10e384006010628c01000424c47b827c601062ac47 +:10e39400048180af21e8c0031400bf8f1000be8f3a +:10e3a4001800bd270800e0030000000000e85d41fc +:10e3b40000701a4000601b4090ffbd276c00baaf8c +:10e3c4006800bbaf44781b7c00087b3700609b402f +:10e3d4005c00bfaf5800beaf5400b9af5000b8af37 +:10e3e4004c00afaf4800aeaf4400adaf4000acaf9f +:10e3f4003c00abaf3800aaaf3400a9af3000a8afdf +:10e404002c00a7af2800a6af2400a5af2000a4af1e +:10e414001c00a3af1800a2af1400a1af121000009b +:10e424006400a2af101800006000a3af21f0a003a5 +:10e4340088bf033c6010628cc439027c601062acfb +:10e44400060004240a000524e066400f00000000d2 +:10e4540001000224008182af88bf033c3010628c2b +:10e46400c439027c301062ac21e8c0036400a28f7e +:10e47400130040006000a38f110060005c00bf8f98 +:10e484005800be8f5400b98f5000b88f4c00af8f26 +:10e494004800ae8f4400ad8f4000ac8f3c00ab8f82 +:10e4a4003800aa8f3400a98f3000a88f2c00a78fc2 +:10e4b4002800a68f2400a58f2000a48f1c00a38f02 +:10e4c4001800a28f1400a18f00606041c0000000fa +:10e4d4006c00ba8f6800bb8f00709a407000bd2733 +:10e4e40000e8dd4100609b401800004200e85d4107 +:10e4f40000701a4000601b4090ffbd276c00baaf4b +:10e504006800bbaf44781b7c00087b3700609b40ed +:10e514005c00bfaf5800beaf5400b9af5000b8aff5 +:10e524004c00afaf4800aeaf4400adaf4000acaf5d +:10e534003c00abaf3800aaaf3400a9af3000a8af9d +:10e544002c00a7af2800a6af2400a5af2000a4afdd +:10e554001c00a3af1800a2af1400a1af121000005a +:10e564006400a2af101800006000a3af21f0a00364 +:10e5740088bf033c6010628cc47b027c601062ac78 +:10e58400070004240a000524e066400f0000000090 +:10e5940001000224048182af88bf033c3010628ce6 +:10e5a400c47b027c301062ac21e8c0036400a28ffb +:10e5b400130040006000a38f110060005c00bf8f57 +:10e5c4005800be8f5400b98f5000b88f4c00af8fe5 +:10e5d4004800ae8f4400ad8f4000ac8f3c00ab8f41 +:10e5e4003800aa8f3400a98f3000a88f2c00a78f81 +:10e5f4002800a68f2400a58f2000a48f1c00a38fc1 +:10e604001800a28f1400a18f00606041c0000000b8 +:10e614006c00ba8f6800bb8f00709a407000bd27f1 +:10e6240000e8dd4100609b4018000042e8ffbd2780 +:10e634001400beaf21f0a00381bf033c00f2628c42 +:10e64400c418027c00f262ac88bf033c0061628c97 +:10e654004429027c006162ac88bf033c0061628c87 +:10e664008431027c006162ac88bf033c2061628c0f +:10e67400010004248431827c206162ac88bf033ca5 +:10e684002061628c4429027c206162ac88bf033c17 +:10e694008061628c01000424c439827c806162ac94 +:10e6a40088bf033c4060628c446b027c406062ac77 +:10e6b40088bf033c8061628c0442027c806162ac4e +:10e6c40088bf033c8061628c8431027c806162accf +:10e6d40088bf033c0061628cc418027c006162ac98 +:10e6e40088bf033c2061628c01000424c418827c2e +:10e6f400206162ac88bf033c0061628c0400027c30 +:10e70400006162ac88bf033c2061628c0100042478 +:10e714000400827c206162ac88bf033cc060628cd0 +:10e72400010004240400827cc06062ac88bf033c06 +:10e734000061628c8410027c006162ac88bf033c7f +:10e744002061628c8410027c206162ac88bf033c2f +:10e754000061628c0421027c006162ac88bf033cce +:10e764002061628c0421027c206162ac88bf033c7e +:10e774006010628cc418027c601062ac88bf033cd9 +:10e784003010628cc418027c301062ac88bf033c29 +:10e794000010628c0400027c001062ac88bf033c51 +:10e7a4009010628c0300042484e6827c901062ac96 +:10e7b40088bf033c9010628c04ce027c901062ac43 +:10e7c40088bf033c6010628c01000424c418827c5e +:10e7d400601062ac80bf023c005a40ac80bf033c76 +:10e7e400005a628c010004244429827c005a62ace1 +:10e7f40080bf033c005a628c010004240442827ce2 +:10e80400005a62ac80bf033c005a628c444a027cca +:10e81400005a62ac80bf033c005a628c8431027c93 +:10e82400005a62acc404023c00b442340000c2afdb +:10e834000f00023c404242340400c2af0400c28fc5 +:10e84400401002000000c38f1b006200f40140006e +:10e8540010180000121000000800c2af0400c28f9c +:10e86400401002000000c38f1b006200f40140004e +:10e874001010000004004010000000000800c28fc7 +:10e88400010042240800c2af0800c28f0101422cdb +:10e894000300401400000000000102240800c2af7d +:10e8a4000800c28f04004010000000000800c28f5e +:10e8b400ffff42240800c2af0800c28fff004230ad +:10e8c4002118400080bf023c305a43ac80bf033c57 +:10e8d400005a628c01000424c47b827c005a62ac1e +:10e8e40081bf023cffff0334609043ac81bf033c13 +:10e8f4006090628c4408027c609062ac81bf033cef +:10e904006090628c8410027c609062ac81bf023c97 +:10e91400009040ac81bf023c109040ac81bf023cef +:10e92400209040ac88bf033c8061628c444a027ce6 +:10e93400806162ac88bf033ca061628c0100042446 +:10e94400444a827ca06162ac88bf033cc060628c94 +:10e95400c418027cc06062ac88bf033ce060628c77 +:10e9640001000424c418827ce06062ac88bf033ccc +:10e974004061628c0400027c406162ac88bf033c4d +:10e984006061628c010004240400827c606162acda +:10e9940088bf033c4060628c8473027c406062ac3c +:10e9a40088bf033c6060628c010004248473827c11 +:10e9b400606062ac88bf033c4060628c0442027cad +:10e9c400406062ac88bf033c6060628c0100042438 +:10e9d4000442827c606062ac88bf033c4060628c0d +:10e9e400444a027c406062ac88bf033c6060628c35 +:10e9f40001000424444a827c606062ac88bf033c0a +:10ea04004060628c8452027c406062ac88bf033cec +:10ea14006060628c010004248452827c606062ac79 +:10ea240088bf033c4060628cc45a027c406062ac84 +:10ea340088bf033c6060628c01000424c45a827c59 +:10ea4400606062ac88bf033c4060628c0463027cfb +:10ea5400406062ac88bf033c6060628c01000424a7 +:10ea64000463827c606062ac88bf033c4060628c5b +:10ea7400446b027c406062ac88bf033c6060628c83 +:10ea840001000424446b827c606062ac88bf033c58 +:10ea94004060628c4408027c406062ac88bf033ce6 +:10eaa4006060628c010004244408827c606062ac73 +:10eab40088bf033cc060628c010004240421827c72 +:10eac400c06062ac88bf033cc060628c0100042457 +:10ead4004429827cc06062ac88bf033cc060628c05 +:10eae400010004248431827cc06062ac88bf033c92 +:10eaf400c060628c01000424c439827cc06062acb2 +:10eb040088bf033c8060628c01000424446b827cd7 +:10eb1400806062ac88bf033c8060628c0100042486 +:10eb24008473827c806062ac88bf033c4060628cea +:10eb340001000424c47b827c406062ac88bf033c37 +:10eb44008061628c8410027c806162ac88bf033c6b +:10eb5400a061628c010004248410827ca06162acf8 +:10eb640088bf033cc060628c8410027cc06062accd +:10eb740088bf033ce060628c010004248410827c22 +:10eb8400e06062ac88bf033c8061628cc418027c84 +:10eb9400806162ac88bf033ca061628c01000424e4 +:10eba400c418827ca06162ac88bf033cc060628ce4 +:10ebb4004408027cc06062ac88bf033ce060628ca5 +:10ebc400010004244408827ce06062ac88bf033cfa +:10ebd400c060628c01000424444a827cc06062ac40 +:10ebe40088bf033cc060628c010004240442827c20 +:10ebf400c06062ac88bf033cc060628c0100042426 +:10ec04000442827cc06062ac88bf033cc060628cfa +:10ec1400010004240442827cc06062ac80bf033cd7 +:10ec24000002628c01000424c47b827c000262ac7a +:10ec34000100022421e8c0031400be8f1800bd2780 +:10ec44000800e00300000000e8ffbd271400bfaf88 +:10ec54001000beaf21f0a0031800c4af1f83400f03 +:10ec640000000000010004241183400f0000000094 +:10ec74002110000021e8c0031400bf8f1000be8fd4 +:10ec84001800bd270800e00300000000f8ffbd27be +:10ec94000400beaf21f0a0032110000021e8c0034e +:10eca4000400be8f0800bd270800e0030000000038 +:10ecb400e0ffbd271c00bfaf1800beaf21f0a003ca +:10ecc4002000c4af1000c0a32000c48f137b400fea +:10ecd400000000001000c2a31000c28321e8c0039a +:10ece4001c00bf8f1800be8f2000bd270800e00362 +:10ecf40000000000e0ffbd271c00bfaf1800beaf3e +:10ed040021f0a0031000c0a3247b400f00000000ea +:10ed14001000c2a31000c28321e8c0031c00bf8fef +:10ed24001800be8f2000bd270800e003000000008b +:10ed3400e8ffbd271400bfaf1000beaf21f0a00351 +:10ed44009c46400f0000000021e8c0031400bf8f60 +:10ed54001000be8f1800bd270800e003000000006b +:10ed6400f0ffbd270c00beaf21f0a0031000c4af1c +:10ed74000000c0a30000c28321e8c0030c00be8fc2 +:10ed84001000bd270800e00300000000e8ffbd27d5 +:10ed94001400bfaf1000beaf21f0a0031800c4af31 +:10eda4001800c48f3147400f0000000021e8c00361 +:10edb4001400bf8f1000be8f1800bd270800e003a9 +:10edc40000000000e8ffbd271400bfaf1000beaf75 +:10edd40021f0a0031800c4af1c00c5af1800c48ff5 +:10ede4001c00c58f4247400f0000000021e8c0030b +:10edf4001400bf8f1000be8f1800bd270800e00369 +:10ee040000000000e8ffbd271400bfaf1000beaf34 +:10ee140021f0a0031800c4af1c00c5af1800c48fb4 +:10ee24001c00c58f6647400f0000000021e8c003a6 +:10ee34001400bf8f1000be8f1800bd270800e00328 +:10ee440000000000e8ffbd271400bfaf1000beaff4 +:10ee540021f0a0031800c4af1c00c5af2110c000ee +:10ee64002000c2a72000c2971800c48f1c00c58fc1 +:10ee7400213040008a47400f0000000021e8c00311 +:10ee84001400bf8f1000be8f1800bd270800e003d8 +:10ee940000000000e0ffbd271c00bfaf1800beaf9c +:10eea40021f0a0032000c4af2400c5af2800c6afe2 +:10eeb40018808297f8ff42241600c2a71000c0af42 +:10eec4001400c0a31600c3972800c28f2b10620041 +:10eed40012004014000000002400c38f1000c28ff1 +:10eee400211862002800c28fffff42302000c48f27 +:10eef4002128600021304000927b400f0000000078 +:10ef0400ff0043301400c29321106200ff0042301e +:10ef14001400c2a3e87b400b000000002400c38f50 +:10ef24001000c28f211862001600c2972000c48fff +:10ef34002128600021304000927b400f0000000037 +:10ef4400ff0043301400c29321106200ff004230de +:10ef54001400c2a31400c2830f0040140000000078 +:10ef64001600c2972800c38f231062002800c2af86 +:10ef74001600c2971000c38f211062001000c2afa8 +:10ef84001600c2972000c38f211062002000c2af78 +:10ef9400b27b400b00000000000000001400c2839c +:10efa40021e8c0031c00bf8f1800be8f2000bd27be +:10efb4000800e00300000000e8ffbd271400bfaf15 +:10efc4001000beaf21f0a0031800c4af1c00c5aff1 +:10efd4002110c0002000c2a72000c2971800c48fcf +:10efe4001c00c58f21304000c747400f00000000bf +:10eff40021e8c0031400bf8f1000be8f1800bd2786 +:10f004000800e00300000000e0ffbd271c00bfafc4 +:10f014001800beaf21f0a0032000c4af2400c5af88 +:10f024002800c6af18808297f8ff42241600c2a7b2 +:10f034001000c0af1400c0a31600c3972800c28fed +:10f044002b10620012004014000000002400c38f43 +:10f054001000c28f211862002800c28fffff4230c7 +:10f064002000c48f2128600021304000ef7b400f36 +:10f0740000000000ff0043301400c293211062001e +:10f08400ff0042301400c2a3457c400b0000000086 +:10f094002400c38f1000c28f211862001600c2978b +:10f0a4002000c48f2128600021304000ef7b400ff6 +:10f0b40000000000ff0043301400c29321106200de +:10f0c400ff0042301400c2a31400c2830f00401496 +:10f0d400000000001600c2972800c38f23106200ae +:10f0e4002800c2af1600c2971000c38f211062001f +:10f0f4001000c2af1600c2972000c38f2110620017 +:10f104002000c2af0f7c400b000000000000000094 +:10f114001400c28321e8c0031c00bf8f1800be8ff7 +:10f124002000bd270800e003000000002148c000c3 +:10f13400214080003b00e0142118a0002b10a60001 +:10f14400480040102010c27008004010023c090022 +:10f1540023200200062088000418450004484600c5 +:10f164002518830004404800023c09001b00670086 +:10f17400f401e000ffff2b31022c080012500000c4 +:10f184001020000002504b71003404002530c500eb +:10f194002b60ca001b006700f401e00009008051e5 +:10f1a4002330ca002130c9002b18c900050060545f +:10f1b4002330ca002b20ca002118c9000b30640078 +:10f1c4002330ca001b00c700f401e000ffff083130 +:10f1d400122000001018000002208b70001c030095 +:10f1e400254068002b1804011b00c700f401e0004f +:10f1f4000900605023400401214009012b18090132 +:10f2040005006054234004012b180401214809011e +:10f214000b40230123400401061048000800e003ca +:10f22400211800002b10a700470040142050ea705a +:10f234004800401520000c242b10e5000500401464 +:10f24400231086002b108600cd004054211080002e +:10f25400231086002328a7002b2082000800e00347 +:10f264002318a4000600c0142010227101000224f7 +:10f274001b004600f401c000124800002010227157 +:10f2840082004054200008242328a900021c0900fd +:10f29400ffff27311b00a300f4016000025c08009b +:10f2a40012200000105000000220877000340a0071 +:10f2b4002530cb002b50c4001b00a300f4016000d8 +:10f2c400090040512330c4002130c9002b28c90053 +:10f2d4000500a0542330c4002b50c4002128c900c9 +:10f2e4000b30aa002330c4001b00c300f4016000eb +:10f2f400ffff083112200000102800000238877038 +:10f30400002c05002540a8002b2007011b00c3008a +:10f31400f4016000090080502340070121400901e5 +:10f324002b18090105006054234007012b1807011d +:10f33400214809010b40230123400701061048001e +:10f344000800e00321180000211080000800e003f9 +:10f354002118a00023608a01043847010658860159 +:10f364002558670106688501023c0b001b00a701b4 +:10f37400f401e000ffff6f31061084010428450109 +:10f3840025284500021405000430460112700000cf +:10f394001018000002c0cf71004c03002548220160 +:10f3a4002b1038011b00a701f401e0000a004010f3 +:10f3b4000420440121482b012b102b01060040148a +:10f3c400ffffce252b10380104004050234838019c +:10f3d400ffffce2521482b01234838011b002701bc +:10f3e400f401e000ffffa5301268000010180000cf +:10f3f4000278af7100140300251045002b184f004c +:10f404001b002701f401e0000b00601000440e0013 +:10f4140021104b002b184b0007006014ffffad2593 +:10f424002b184f00050060102540a801ffffad25f3 +:10f4340021104b0000440e002540a80119000601cc +:10f4440023784f0010480000124000002b28e901e7 +:10f4540021182001213820013d00a01412100000c1 +:10f464004300e9512b1882002318e301233088005c +:10f474002b208600231864000460830106104601d3 +:10f4840025104c000800e003061843012340020144 +:10f494000448490006300501021c09001b00c30092 +:10f4a400f4016000ffff27310658040104284500d9 +:10f4b40025586501022c0b00044044001250000042 +:10f4c400106000000250477100640c002520ac005d +:10f4d4002b288a001b00c300f40160000600a05022 +:10f4e40023208a00212089002b2889001d00a010d8 +:10f4f4002b308a0023208a001b008300f401600063 +:10f50400ffff6b3112300000105000000230c77052 +:10f51400002c0a002528ab002b50a6001b008300fa +:10f52400f40160005bff40512328a6002128a900b4 +:10f534002b20a90057ff80542328a6002b50a60097 +:10f544002120a9000b288a00a67c400b2328a600b2 +:10f55400234046002318eb002b1048001b7d400b72 +:10f5640023186200212889003e7d400b0b20a60051 +:10f57400f8ff6054234046001c7d400b2118000016 +:10f584000800e003000000002110c00021408000ba +:10f594003e00e0142118a0002b30a6004600c01045 +:10f5a400000000002020447008008010022c02009b +:10f5b400232804000628a8000418830004108200ed +:10f5c4002518a30004408800022c02001b006500db +:10f5d400f401a000ffff493002640800125000004b +:10f5e4001058000002204971003c0b002538ec0043 +:10f5f4002b30e4001b006500f401a0000b00c010d8 +:10f604002318e4002138e2002b18e20006006014fd +:10f61400ffff4a252b18e400040060102318e400bf +:10f62400ffff4a252138e2002318e4001b0065008f +:10f63400f401a000ffff0831122000001038000080 +:10f6440002488970003c07002540e8002b3009017e +:10f654001b006500f401a0000600c0102140020157 +:10f664002b10020103004014ffff84242b480901de +:10f6740023208900004c0a00254889002128000025 +:10f68400211020010800e0032118a0002b10a7007e +:10f6940042004054212800002018e3704300601405 +:10f6a40020000a242b28e500c500a0142b20860086 +:10f6b400a17d400b0100892c0600401420184370e2 +:10f6c400010003241b006200f4014000121000003a +:10f6d400201843707a006054200008242348a200b4 +:10f6e400023c0200ffff4b30010005241b002701f0 +:10f6f400f401e000026c08001250000010600000e9 +:10f7040002204b71001c0c0025186d002b30640086 +:10f714001b002701f401e0000900c0502318640015 +:10f72400211862002b3062000400c014ffff4a2538 +:10f734002b306400a500c054ffff4a252318640041 +:10f744001b006700f401e000ffff083112200000f5 +:10f754001048000002588b70004c09002540280115 +:10f764002b300b011b006700f401e0000600c01001 +:10f77400214002012b10020103004014ffff8424e6 +:10f784002b580b0123208b00004c0a0025488900cc +:10f79400211020010800e0032118a00021480000e6 +:10f7a400211020010800e0032118a0002350430188 +:10f7b400061046010438670025384700064845010d +:10f7c400021407001b002201f4014000ffffec308b +:10f7d400065044010428650025284501025405000b +:10f7e400125800001070000002686c7100440e0092 +:10f7f40025400a012b500d011b002201f401400099 +:10f804000a00401104306600214007012b4807011b +:10f8140006002015ffff6b252b480d010400205125 +:10f8240023400d01ffff6b252140070123400d01fb +:10f834001b000201f4014000ffffa5301248000044 +:10f844001068000002602c71006c0d002528a501d1 +:10f854002b50ac001b000201f40140000b0040518e +:10f86400005c0b002128a7002b10a7000600401401 +:10f87400ffff29252b10ac0004004050005c0b0056 +:10f88400ffff29252128a700005c0b0025482b0138 +:10f89400190026012328ac00103800002b40a700d3 +:10f8a40044000015123000003f00a75004206400fb +:10f8b40021280000211020010800e0032118a000e5 +:10f8c400234003010410620006300501023c0200db +:10f8d4001b00c700f401e000ffff4b300428650063 +:10f8e400064804010440640025482501026c09000f +:10f8f400125000001060000002204b7100640c00e4 +:10f904002518ac012b2864001b00c700f401e0009b +:10f914000b00a05023186400211862002b286200f9 +:10f924000600a014ffff4a252b2864000400a05001 +:10f9340023186400ffff4a2521186200231864007d +:10f944001b006700f401e000ffff293112200000d2 +:10f954001060000002308b7000640c00254889019f +:10f964002b2826011b006700f401e0000b00a050c7 +:10f97400002c0a00214822012b18220106006014e1 +:10f98400ffff84242b18260104006050002c0a0079 +:10f99400ffff842421482201002c0a002348260169 +:10f9a400bc7d400b252885002b308600c1ffc0504c +:10f9b40021280000ffff29252e7e400b212800006e +:10f9c40021280000a17d400b01000924d07d400bbb +:04f9d4002118620094 +:020000040000fa +:020000041d01dc +:10f9d8002558000000000000c70000004900000092 +:10f9e8008e0000009200000055000000db000000bf +:10f9f8001c000000e300000024000000aa00000032 +:10fa08006d00000071000000b60000003800000022 +:10fa1800ff00000001000000c600000048000000d0 +:10fa28008f0000009300000054000000da0000007e +:10fa38001d000000e200000025000000ab000000ef +:10fa48006c00000070000000b700000039000000e2 +:10fa5800fe00000002000000c50000004b0000008e +:10fa68008c0000009000000057000000d900000042 +:10fa78001e000000e100000026000000a8000000b1 +:10fa88006f00000073000000b40000003a0000009e +:10fa9800fd00000003000000c40000004a00000050 +:10faa8008d0000009100000056000000d800000002 +:10fab8001f000000e000000027000000a90000006f +:10fac8006e00000072000000b50000003b0000005e +:10fad800fc00000004000000c30000004d0000000e +:10fae8008a0000009600000051000000df000000be +:10faf80018000000e700000020000000ae00000031 +:10fb08006900000075000000b20000003c00000021 +:10fb1800fb00000005000000c20000004c000000cf +:10fb28008b0000009700000050000000de0000007d +:10fb380019000000e600000021000000af000000ee +:10fb48006800000074000000b30000003d000000e1 +:10fb5800fa00000006000000c10000004f0000008d +:10fb6800880000009400000053000000dd00000041 +:10fb78001a000000e500000022000000ac000000b0 +:10fb88006b00000077000000b00000003e0000009d +:10fb9800f900000007000000c00000004e0000004f +:10fba800890000009500000052000000dc00000001 +:10fbb8001b000000e400000023000000ad0000006e +:10fbc8006a00000076000000b10000003f0000005d +:10fbd800f800000008000000cf000000410000000d +:10fbe800860000009a0000005d000000d3000000bd +:10fbf80014000000eb0000002c000000a200000030 +:10fc08006500000079000000be0000003000000020 +:10fc1800f700000009000000ce00000040000000ce +:10fc2800870000009b0000005c000000d20000007c +:10fc380015000000ea0000002d000000a3000000ed +:10fc48006400000078000000bf00000031000000e0 +:10fc5800f60000000a000000cd000000430000008c +:10fc680084000000980000005f000000d100000040 +:10fc780016000000e90000002e000000a0000000af +:10fc8800670000007b000000bc000000320000009c +:10fc9800f50000000b000000cc000000420000004e +:10fca80085000000990000005e000000d000000000 +:10fcb80017000000e80000002f000000a10000006d +:10fcc800660000007a000000bd000000330000005c +:10fcd800f40000000c000000cb000000450000000c +:10fce800820000009e00000059000000d7000000bc +:10fcf80010000000ef00000028000000a60000002f +:10fd0800610000007d000000ba000000340000001f +:10fd1800f30000000d000000ca00000044000000cd +:10fd2800830000009f00000058000000d60000007b +:10fd380011000000ee00000029000000a7000000ec +:10fd4800600000007c000000bb00000035000000df +:10fd5800f20000000e000000c9000000470000008b +:10fd6800800000009c0000005b000000d50000003f +:10fd780012000000ed0000002a000000a4000000ae +:10fd8800630000007f000000b8000000360000009b +:10fd9800f10000000f000000c8000000460000004d +:10fda800810000009d0000005a000000d4000000ff +:10fdb80013000000ec0000002b000000a50000006c +:10fdc800620000007e000000b9000000370000005b +:10fdd800f00000004a462e636f6d00000a0d000017 +:10fde8002573202573202573202573202573000093 +:10fdf80068656c7000000000706f77657200000025 +:10fe08000a5b73746174655d20706172616d6574fd +:10fe1800657220697320696e76616c69642e202092 +:10fe280054797065202768656c702720666f72208a +:10fe38006d6f726520696e666f0a00006f6e000054 +:10fe48005475726e696e67206368616c6574277398 +:10fe580020696e766572746572204f4e0a00000044 +:10fe68006f6666005475726e696e67206368616cb0 +:10fe78006574277320696e766572746572204f46c3 +:10fe8800460a00000a5b73746174655d20706172d4 +:10fe9800616d6574657220697320696e76616c693d +:10fea800642e202054797065202768656c7027209f +:10feb800666f722076616c69642076616c75657313 +:10fec8000a0000000a000000776966690000000067 +:10fed8000a5b76616c75655d20706172616d657431 +:10fee800657220697320696e76616c69642e2020c2 +:10fef80054797065202768656c702720666f7220ba +:10ff08006d6f726520696e666f0a00005475726eb7 +:10ff1800696e672057694669206d6f64756c652046 +:10ff28004f4e0a005769466920616c7265616479b1 +:10ff380020636f6e6e65637465642e2e2e0a000052 +:10ff48005475726e696e672057694669206d6f64d3 +:10ff5800756c65204f46462e2e2e20476f6f6462c3 +:10ff68007965210a0000000057694669206d6f64b1 +:10ff7800756c6520616c7265616479204f46462e08 +:10ff88002e2e207468617427732077656972642146 +:10ff98000a0000007374617475730000576946693c +:10ffa800206d6f64756c65204f46460a000000009e +:10ffb8005769466920436f6e6e65637465640a000d +:10ffc8005769466920446973636f6e6e656374652b +:10ffd800640a000057694669204552524f520a0088 +:10ffe8005769466920737461746520556e6b6e6f2e +:10fff800776e210a000000006261747465727900ee +:020000041d02db +:1000080047656e6572616c207374617475733a0a22 +:1000180000000000576946693a204d6f64756c65a9 +:10002800206973207475726e6564204f46460a0015 +:10003800576946693a20436f6e6e6563746564203c +:10004800746f2041500a0000576946693a20446994 +:1000580073636f6e6e65637465642066726f6d207e +:1000680041500a00576946693a204d6f64756c65be +:1000780020696e697469616c697a6174696f6e2050 +:100088006572726f720a0000576946693a20556ea8 +:100098006b6e6f776e2073746174650a00000000e0 +:1000a800426f6f746c6f616465723a204465746561 +:1000b800637465640a000000426f6f746c6f61645a +:1000c80065723a204e6f7420446574656374656484 +:1000d8000a000000626f6f746c6f616465720000e3 +:1000e8000a5b636f6d6d616e645d20706172616d36 +:1000f8006574657220697320696e76616c69642e17 +:10010800202054797065202768656c702720666ff9 +:1001180072206d6f726520696e666f0a00000000bc +:100128007374617274000000416374697661746964 +:100138006e6720626f6f746c6f616465720a00008d +:1001480073746f70000000004465616374697661c0 +:1001580074696e6720626f6f746c6f616465720a90 +:10016800000000000a426f6f746c6f616465722052 +:10017800636c69656e7420636f6e6e656374656425 +:100188000a0000000a426f6f746c6f616465722028 +:10019800636c69656e74206e6f7420636f6e6e6534 +:1001a800637465640a0000006c74650070617373a1 +:1001b8007468726f7567680064656275670000002f +:1001c800556e6b6e6f776e20636f6d6d616e640a2e +:0401d8000a00000019 +:020000040000fa +:020000041d02db +:1001dc00f8ffbd270400beaf21f0a0032110800062 +:1001ec000800c2a30800c2930500422c040040146e +:1001fc0000000000ffff0224a680400b000000005e +:10020c000800c29304004014000000000300022404 +:10021c00a680400b000000000800c39301000224dc +:10022c00040062140000000004000224a680400bad +:10023c00000000000800c3930200022404006214b2 +:10024c00000000000f000224a680400b00000000fc +:10025c000800c39303000224040062140000000091 +:10026c0010000224a680400b000000000800c3937d +:10027c000400022404006214000000001200022496 +:10028c00a680400b00000000feff022421e8c00302 +:10029c000400be8f0800bd270800e003000000002a +:1002ac00e0ffbd271c00bfaf1800beaf21f0a003bc +:1002bc002118a0002110c0002c00c7af2000c4a33f +:1002cc002400c3a32800c2a33948400f000000003b +:1002dc001000c2a31000c2833600401400000000be +:1002ec002400c293212040007780400f00000000c2 +:1002fc001100c2a31100c2832800400400000000ba +:10030c002000c2930b004014000000001100c293a7 +:10031c00211840002800c2932120600021284000b1 +:10032c007841400f000000001000c2a3eb80400b8e +:10033c00000000002000c393010002240b00621493 +:10034c00000000001100c293211840002800c29345 +:10035c002120600021284000ad41400f000000002a +:10036c001000c2a3eb80400b000000002000c393e0 +:10037c00020002240a006214000000001100c29363 +:10038c00212040002c00c58fe241400f00000000ee +:10039c001000c2a3eb80400b000000000000000026 +:1003ac009b48400f000000001000c2a3f180400bde +:1003bc0000000000000000001000c28321e8c00310 +:1003cc001c00bf8f1800be8f2000bd270800e00363 +:1003dc0000000000f8ffbd270400beaf21f0a00311 +:1003ec000800c4af2110000021e8c0030400be8f38 +:1003fc000800bd270800e00300000000e8ffbd274f +:10040c001400bfaf1000beaf21f0a0032118800074 +:10041c002110a0001800c3a31c00c2a31800c39392 +:10042c001c00c293212000002128600021304000d4 +:10043c0021380000ab80400f0000000021e8c00311 +:10044c001400bf8f1000be8f1800bd270800e003fa +:10045c0000000000e8ffbd271400bfaf1000beafc6 +:10046c0021f0a003211880002110a0001800c3a3c4 +:10047c001c00c2a31800c3931c00c29301000424e7 +:10048c00212860002130400021380000ab80400f53 +:10049c000000000021e8c0031400bf8f1000be8fc5 +:1004ac001800bd270800e00300000000e8ffbd278e +:1004bc001400bfaf1000beaf21f0a00321108000cc +:1004cc001c00c5af1800c2a31800c293020004247c +:1004dc0021284000213000001c00c78fab80400f4a +:1004ec000000000021e8c0031400bf8f1000be8f75 +:1004fc001800bd270800e00300000000e8ffbd273e +:10050c001400bfaf1000beaf21f0a0031800c4afa1 +:10051c002110a0001c00c2a31c00c2931800c48fa1 +:10052c00212840000542400f0000000021e8c003d4 +:10053c001400bf8f1000be8f1800bd270800e00309 +:10054c0000000000e8ffbd271400bfaf1000beafd5 +:10055c0021f0a003508180af548180af00a0023cf9 +:10056c00b42a442421280000f4010624fa89400fff +:10057c000000000004000424c8000524e066400fbd +:10058c000000000021e8c0031400bf8f1000be8fd4 +:10059c001800bd270800e00300000000e8ffbd279d +:1005ac001400bfaf1000beaf21f0a0038436400f83 +:1005bc00000000000400401400000000508180afd7 +:1005cc008b81400b000000005081828f1400401082 +:1005dc000000000004000424f365400f000000003c +:1005ec0021184000010002240d00621400000000dc +:1005fc0000a0023cb42a43245081828f2120600049 +:10060c00212840004736400f00000000508180af89 +:10061c0004000424c8000524e066400f000000001c +:10062c0021e8c0031400bf8f1000be8f1800bd2737 +:10063c000800e00300000000e8ffbd271400bfaf76 +:10064c001000beaf21f0a003211080001800c2a33f +:10065c008436400f0000000005004014000000002c +:10066c00508180af21100000b881400b00000000c9 +:10067c005081838f00a0023cb42a422421106200d6 +:10068c001800c393000043a05081828f01004224c4 +:10069c00508182af5081838ff401022408006214d0 +:1006ac000000000000a0023cb42a4224212040009b +:1006bc00f40105244736400f00000000508180af44 +:1006cc0004000424c8000524e066400f000000006c +:1006dc000100022421e8c0031400bf8f1000be8f5c +:1006ec001800bd270800e00300000000e0ffbd2754 +:1006fc001c00bfaf1800beaf1400b0af21f0a003b8 +:10070c002000c4af8436400f0000000005004014e8 +:10071c0000000000508180af21100000d581400bfb +:10072c00000000002000d08f2000c48f6887400f8d +:10073c000000000021200002212840004736400f15 +:10074c00000000000100022421e8c0031c00bf8f40 +:10075c001800be8f1400b08f2000bd270800e003e6 +:10076c0000000000f8ffbd270400beaf21f0a0037d +:10077c005081828f0400401400000000010002240c +:10078c00e681400b000000002110000021e8c003ae +:10079c000400be8f0800bd270800e0030000000025 +:1007ac00e8ffbd271400bfaf1000beaf21f0a003bf +:1007bc001800c4af1800c28f548182af1800c38fc9 +:1007cc00010002240900621400000000029d023c9a +:1007dc00fc2f4224212040001f0005244736400fe7 +:1007ec00000000000482400b00000000029d023c4f +:1007fc001c304224212040001e0005244736400fa7 +:10080c000000000021e8c0031400bf8f1000be8f51 +:10081c001800bd270800e00300000000f0ffbd2712 +:10082c000c00beaf21f0a0031000c4af1400c5af84 +:10083c005481838f010002240d006214000000001b +:10084c000000c0af0000c0af1a82400b00000000d7 +:10085c000000c28f010042240000c2af0000c38f11 +:10086c001400c28f2a106200f9ff4014000000002f +:10087c0021e8c0030c00be8f1000bd270800e00368 +:10088c0000000000e0ffbd271c00bfaf1800beaf8a +:10089c0021f0a003211880002110a0002800c6af71 +:1008ac002000c3a32400c2a71000c0a32000c39340 +:1008bc006c0002241c006214000000001400c2270b +:1008cc00212040002128000004000624fa89400f52 +:1008dc00000000001400c2272800c48f212840000b +:1008ec000400062421380000284c400f00000000b2 +:1008fc001000c2a31000c2830b00401400000000c3 +:10090c007880828f08004010000000007880828f71 +:10091c001400c393212060001500c39321286000ac +:10092c0009f840000000000021e8c0031c00bf8f44 +:10093c001800be8f2000bd270800e0030000000057 +:10094c00e0ffbd271c00bfaf1800beaf21f0a00315 +:10095c002000c4af1000c0a32000c28f03004010c1 +:10096c00000000002000c28f788082af04000424b5 +:10097c00029d023c90084524934c400f000000005f +:10098c001000c28321e8c0031c00bf8f1800be8f6b +:10099c002000bd270800e00300000000d0ffbd27a9 +:1009ac002c00bfaf2800beaf21f0a0033000c4afb5 +:1009bc002000c0a33000c28f212040006887400f68 +:1009cc0000000000ffff4230010042242200c2a7b9 +:1009dc002200c2971000a0af1400a0af1800a0af67 +:1009ec0004000424670005243000c68f2138400021 +:1009fc009b49400f000000002000c2a32000c283ce +:100a0c0021e8c0032c00bf8f2800be8f3000bd270b +:100a1c000800e00300000000b8ffbd274400bfaf92 +:100a2c004000beaf21f0a0032000c0a32400c227c9 +:100a3c00212040003024400f000000002000c2a301 +:100a4c002000c28317004014000000002400c2974d +:100a5c0082130200ffff4230ff004230030043309c +:100a6c00020002240d006214000000001000a0af70 +:100a7c001400a0af1800a0af0400042469000524e2 +:100a8c0021300000213800009b49400f000000007d +:100a9c002000c2a3ac82400b00000000f4ff022433 +:100aac002000c2a32000c28321e8c0034400bf8ff2 +:100abc004000be8f4800bd270800e0030000000086 +:100acc00d0ffbd272c00bfaf2800beaf21f0a00384 +:100adc002000c0a31000a0af1400a0af1800a0af5e +:100aec00040004246a000524213000002138000091 +:100afc009b49400f000000002000c2a32000c283cd +:100b0c0021e8c0032c00bf8f2800be8f3000bd270a +:100b1c000800e00300000000b8ffbd274400bfaf91 +:100b2c004000beaf21f0a0032000c0a32400c227c8 +:100b3c00212040003024400f000000002000c2a300 +:100b4c002000c28317004014000000002400c2974c +:100b5c0082130200ffff4230ff004230030043309b +:100b6c00020002240d006214000000001000a0af6f +:100b7c001400a0af1800a0af0400042468000524e2 +:100b8c0021300000213800009b49400f000000007c +:100b9c002000c2a3ec82400b00000000f4ff0224f2 +:100bac002000c2a32000c28321e8c0034400bf8ff1 +:100bbc004000be8f4800bd270800e0030000000085 +:100bcc0000e85d4100701a4000601b40e8ffbd2743 +:100bdc001400baaf1000bbaf44781b7c000c7b3701 +:100bec0000609b400c00beaf0800a3af0400a2af96 +:100bfc0021f0a00388bf033c3010628cc418027c27 +:100c0c00301062ac21e8c0030c00be8f0800a38f2b +:100c1c000400a28f00606041c00000001400ba8f75 +:100c2c001000bb8f00709a401800bd2700e8dd4112 +:100c3c0000609b4018000042e8ffbd271400bfafc6 +:100c4c001000beaf21f0a0031800c4af1800c48f71 +:100c5c009667400f0000000021e8c0031400bf8f0e +:100c6c001000be8f1800bd270800e0030000000034 +:100c7c00e8ffbd271400bfaf1000beaf21f0a003ea +:100c8c0088bf033c2061628c8410027c206162acc2 +:100c9c0088bf033c2061628c0421027c206162ac21 +:100cac00640004249667400f0000000088bf033cda +:100cbc002061628c010004248410827c206162ac6f +:100ccc00960004249667400f0000000088bf033c88 +:100cdc002061628c010004240421827c206162acbe +:100cec0021e8c0031400bf8f1000be8f1800bd2771 +:100cfc000800e00300000000f8ffbd270400beafb1 +:100d0c0021f0a003211080000800c2a30800c293a8 +:100d1c00d0ff42240800c2a30800c2930a00422c50 +:100d2c0004004010000000000800c2936083400bd8 +:100d3c00000000000800c293200042340800c2a347 +:100d4c000800c293cfff42240800c2a30800c2933c +:100d5c000600422c06004010000000000800c29360 +:100d6c000a004224ff0042306083400b0000000068 +:100d7c00ff00022421e8c0030400be8f0800bd2739 +:100d8c000800e00300000000e0ffbd271c00bfaf1f +:100d9c001800beaf21f0a0032000c4af2400c5afe3 +:100dac002110c0002800c2a39e83400b000000004d +:100dbc002400c28f000042902400c38f01006324e2 +:100dcc002400c3af212040004183400f00000000ed +:100ddc001000c2a31000c2931000422c0400401457 +:100dec0000000000f1ff0224a783400b000000006c +:100dfc001000c29300110200ff0043302000c28f8c +:100e0c00000043a02400c28f000042902400c38f36 +:100e1c00010063242400c3af212040004183400f14 +:100e2c00000000001000c2a31000c2931000422c5e +:100e3c000400401400000000f1ff0224a783400bc3 +:100e4c00000000002000c28f000043901000c293ed +:100e5c0021106200ff0043302000c28f000043a02d +:100e6c002000c28f010042242000c2af2800c29390 +:100e7c002b100200ff0042302800c393ffff6324b5 +:100e8c002800c3a3caff401400000000211000007a +:100e9c0021e8c0031c00bf8f1800be8f2000bd27a7 +:100eac000800e00300000000d0ffbd272c00bfaffe +:100ebc002800beaf21f0a0033000c4af3400c5af92 +:100ecc00fc80829301004238ff0042300300401046 +:100edc00000000001184400f00000000ffff0224fe +:100eec001000c2af3000c28f1400c2af1400c28f0a +:100efc0021004010000000001800c0afdc83400b44 +:100f0c00000000001400c28f000042901c00c2af11 +:100f1c001000c38f1c00c28f261062002000c2afcd +:100f2c001000c28f021a02002000c28fff00443052 +:100f3c0000a0023c80200400e039422421108200f1 +:100f4c000000428c261062001000c2af1400c28f49 +:100f5c00010042241400c2af1800c28f01004224c9 +:100f6c001800c2af1800c38f3400c28f2b10620060 +:100f7c00e4ff4014000000001000c28f2710020094 +:100f8c001000c2af1000c28f21e8c0032c00bf8f2d +:100f9c002800be8f3000bd270800e00300000000d1 +:100fac00e0ffbd271c00bfaf1800beaf21f0a003af +:100fbc002000c4af2110a0002400c2a32400c293bf +:100fcc001000c2affc80829301004238ff00423017 +:100fdc0003004010000000001184400f00000000ce +:100fec002000c38f1000c28f261062001400c2af05 +:100ffc002000c28f021a02001400c28fff0044307e +:10100c0000a0023c80200400e03942242110820020 +:10101c000000428c261062002000c2af2000c28f5c +:10102c0021e8c0031c00bf8f1800be8f2000bd2715 +:10103c000800e00300000000e8ffbd271400beaf6d +:10104c0021f0a0030000c0af3d84400b0000000065 +:10105c000000c28f0800c2af0400c0af2f84400b49 +:10106c00000000000800c28f01004230ff00423037 +:10107c0009004010000000000800c28f4218020056 +:10108c00b8ed023c20834234261062000800c2af47 +:10109c002c84400b000000000800c28f421002009c +:1010ac000800c2af0400c28f010042240400c2af8a +:1010bc000400c28f0800422ceaff4014000000001c +:1010cc0000a0023c0000c38f80180300e0394224ca +:1010dc00211062000800c38f000043ac0000c28fd7 +:1010ec00010042240000c2af0000c28f0001422c5c +:1010fc00d7ff40140000000001000224fc8082a3f2 +:10110c0021e8c0031400be8f1800bd270800e003bf +:04111c0000000000cf +:020000040000fa +:020000041d02db +:101120004a462e636f6d0000486f7374204950204b +:1011300069732025642e25642e25642e25640d0aee +:1011400000000000486f7374204e616d6520697364 +:101150002025730d0a000000426f6f746c6f61648c +:10116000657220736572766572207374617274653e +:101170006400000042696e64204661696c65640029 +:10118000736f636b6574202564206c697374656e7e +:10119000204661696c65642e204572726f723a2038 +:1011a00025640a004269656e76656e756520617515 +:1011b000206368616c6574210a4c65206368616c0a +:1011c0006574207061726c6520656e20616e676c5d +:1011d00061697320636f6d6d65204d722e205065bf +:1011e00070696e0a496620796f75206e65656420a6 +:1011f00068656c702e2e2e20747970652068656c81 +:10120000700a0a005465726d696e616c20636c69c6 +:10121000656e7420636f6e6e6563746564000000b4 +:101220005379736c6f672057656c636f6d650a0047 +:101230004e6574776f726b20636c69656e742063a2 +:101240006f6e6e656374656400000000426f6f74ba +:101250006c6f6164657220636c69656e7420636f86 +:101260006e6e656374656400536f636b65742025ef +:1012700064203a20416363657074204661696c653f +:10128000640a00005465726d696e616c20636c695c +:10129000656e7420646973636f6e6e6563746564f4 +:1012a000000000004e6574776f726b20636c696597 +:1012b0006e7420646973636f6e6e65637465640039 +:1012c000426f6f746c6f6164657220636c69656ee8 +:1012d0007420646973636f6e6e6563746564000087 +:1012e00057692d466920636f6e6e65637465640d82 +:1012f0000000000057692d466920646973636f6eb2 +:101300006e65637465640d00776966695f63623a50 +:10131000204d324d5f574946495f524553505f500b +:10132000524f564953494f4e5f494e464f2e0d007e +:10133000776966695f63623a2050726f7669736994 +:101340006f6e206661696c65642e0d003132333436 +:101350003566666666660000496d707256696c6c2b +:1013600065456d61726400005769666920436f6e60 +:0c1370006e656374206572726f7200007d +:020000040000fa +:020000041d02db +:10137c00e8ffbd271400beaf21f0a0031800c4afd6 +:10138c000400c0af0000c0a36685400b0000000045 +:10139c000200c0a70400c28f021202000400c2aff8 +:1013ac000100c0a3fd84400b000000000100c293ab +:1013bc001800c38f21106200000042900800c2a3e5 +:1013cc000800c3832e0002240b00621000000000f2 +:1013dc000800c28308004010000000000100c29306 +:1013ec00010042240100c2a30100c2930400422c5c +:1013fc00eeff4014000000000100c29305004010f5 +:10140c00000000000100c3930400022404006214d5 +:10141c0000000000211000006b85400b0000000054 +:10142c001800c28f000042900800c2a31800c28f9f +:10143c00010042241800c2af0100c2930200422cea +:10144c0026004014000000000800c3833000022472 +:10145c002500621400000000211000006b85400b79 +:10146c00000000000800c283300042280500401430 +:10147c00000000000800c2833a0042280400401417 +:10148c0000000000211000006b85400b00000000e4 +:10149c000200c29740100200801802002110430085 +:1014ac00ffff43300800c283ffff4230211062006f +:1014bc00ffff4230d0ff42240200c2a71800c28fa7 +:1014cc00000042900800c2a31800c28f0100422401 +:1014dc001800c2af3e85400b000000000000000069 +:1014ec003e85400b00000000000000000100c2938c +:1014fc002b100200ff0042300100c393ffff632456 +:10150c000100c3a3d7ff4014000000000200c297e3 +:10151c000001422c040040140000000021100000c7 +:10152c006b85400b000000000200c2970016020001 +:10153c000400c38f251062000400c2af0800c283f0 +:10154c0005004014000000000000c39303000224b7 +:10155c0008006214000000000800c283080040105c +:10156c00000000000000c393030002240400621476 +:10157c0000000000211000006b85400b00000000f3 +:10158c000000c293010042240000c2a30000c293d9 +:10159c000400422c7eff4014000000000400c28fa7 +:1015ac0021e8c0031400be8f1800bd270800e0031b +:1015bc0000000000e8ffbd271400beaf21f0a0031f +:1015cc001800c4af1c00c5af2000c6af2400c7afc5 +:1015dc002000c28f0c00c2af1c00c28f0000428cd6 +:1015ec000800c2af1c00c28f0800401000000000b1 +:1015fc002000c28f05004010000000002400c28fa4 +:10160c001000422c040040100000000021100000cb +:10161c00e285400b000000000000c0a3dd85400bfc +:10162c00000000000800c28f0200c2a36400022464 +:10163c000100c2a30200c2932e0040100000000063 +:10164c000400c0a3300002240300c2a39f85400bfa +:10165c00000000000300c293010042240300c2a357 +:10166c000200c3930100c293231062000200c2a3c4 +:10167c000200c3930100c2932b106200f5ff4010cf +:10168c00000000000100c3930a0002241b0062004a +:10169c00f401400010180000121000000100c2a359 +:1016ac000300c39330000224040062140000000005 +:1016bc000400c2930a004010000000000300c38322 +:1016cc002000c28f000043a02000c28f01004224e2 +:1016dc002000c2af0400c293010042240400c2a344 +:1016ec000100c293d7ff401400000000c685400bd8 +:1016fc00000000002000c28f30000324000043a033 +:10170c002000c28f010042242000c2af0000c3930e +:10171c000300022408006214000000002000c28fa5 +:10172c00000040a02000c28f010042242000c2af64 +:10173c00d785400b000000002000c28f2e00032430 +:10174c00000043a02000c28f010042242000c2af41 +:10175c000800c28f021202000800c2af0000c29340 +:10176c00010042240000c2a30000c2930400422cda +:10177c00acff4014000000000c00c28f21e8c00335 +:10178c001400be8f1800bd270800e0030000000005 +:10179c002540850003000831030000112110800052 +:1017ac00380000100000aa900000aa8c0101093c2e +:1017bc0001012935c07909002340490124400f015a +:1017cc000700001124600a010500881100000000c8 +:1017dc000000a5240000aa902a0000100000842418 +:1017ec000400ab8c00008aac2340690124400f013b +:1017fc000700001124600b01050088110000000097 +:10180c000400a5240000aa901e00001004008424eb +:10181c000800aa8c04008bac2340490124400f0122 +:10182c000700001124600a01050088110000000067 +:10183c000800a5240000aa901200001008008424bf +:10184c000c00ab8c08008aac2340690124400f01ca +:10185c000700001124600b01050088110000000036 +:10186c000c00a5240000aa90060000100c00842493 +:10187c001000aa8c0c008bac10008424ceff00103e +:10188c001000a5240300401500008aa00800e00306 +:10189c00000000000100ab900300601501008ba05c +:1018ac000800e003000000000200aa9003004015ad +:1018bc0002008aa00800e003000000000300ab90c7 +:1018cc000300601503008ba00800e003000000007b +:1018dc000400aa900300401504008aa00800e0034d +:1018ec00000000000500ab900300601505008ba004 +:1018fc000800e003000000000600aa900300401559 +:10190c0006008aa00800e003000000000700ab906e +:10191c000300601507008ba00800e0030000000026 +:10192c000800aa9008008424d6ff00100800a52403 +:020000040000fa +:020000041d02db +:10193c000c008294d0ffbd27010042301800b0afdc +:10194c002c00bfaf2800b4af2400b3af2000b2af5f +:10195c001c00b1af218080003e004010040080ac20 +:10196c0000a0143c30018282130040501000068eff +:10197c0000a0113ce03d3126a00033266686400bca +:10198c00020112240b003352300180a20c0022966b +:10199c0002014230fbff5254140031262120200258 +:1019ac009c8a400f14003126f9ff33560c00229606 +:1019bc00300180a21000068e1700c0100e00049695 +:1019cc00b186400f0800058e30004010040002aeb6 +:1019dc00ffff0324350043500c0002960800038ed1 +:1019ec00ffff4224000003ae040002ae0100642499 +:1019fc0000006290000004ae2c00bf8f2800b48f52 +:101a0c002400b38f2000b28f1c00b18f1800b08f50 +:101a1c000800e0033000bd27040000ae1000a5272d +:101a2c00b186400f01000624010003241200431468 +:101a3c002c00bf8f1000a2932800b48f2400b38f0a +:101a4c002000b28f1c00b18f1800b08f0800e0038b +:101a5c003000bd272c00bf8fffff02242800b48f5d +:101a6c002400b38f2000b28f1c00b18f1800b08ff0 +:101a7c000800e0033000bd270c000396ffff022492 +:101a8c00100063348186400b0c0003a60c000296f8 +:101a9c00100042340c0002a60800028e040000aeb6 +:101aac00000002ae8186400bffff0224300042345e +:081abc00a986400b0c0002a6f4 +:020000040000fa +:020000041d02db +:101ac400e0ffbd271000b0af1c00bfaf1800b2afdd +:101ad4001400b1af1c00a0102180a0001b00c05056 +:101ae4001c00bf8f110080142190c0000000023c34 +:101af400000042241c0040102188a6000000000cb5 +:101b040001000424000002a201001026fbff1116ac +:101b14001c00bf8f211040021400b18f1800b28f37 +:101b24001000b08f0800e0032000bd271c00bf8f09 +:101b3400211040021400b18f1800b28f1000b08f32 +:101b44000800e0032000bd271c00bf8f2190000087 +:101b5400211040021400b18f1800b28f1000b08f12 +:101b64000800e0032000bd2700a0023c9000438c45 +:101b7400020002242400621080bf023c80bf023ca9 +:101b840080bf053c80bf043c0060428c3060a524cb +:101b94001060842400804230050040142190c0006d +:101ba4000080033480bf023c086043ac2190c00035 +:101bb4000000828c0100423009004014a00002247d +:101bc400f586400b000000000500401000000000f6 +:101bd4000000838c01006330fbff6010ffff422490 +:101be4000000828c01004230d0ff40542390d20088 +:101bf4000000a28cffff52260c004012000002a23b +:101c0400ed86400b0100102640684224dbff4010a3 +:101c140080bf023c80bf053c80bf043c0068428c0e +:101c24003068a524e686400b10688424cc86400bdb +:041c34002390d20027 +:020000040000fa +:020000041d02db +:101c3800211080005600c0100c00ca2c4d00401521 +:101c48002618a4000300633023380400290060101c +:101c58000300e7300600e0102330c7000000a39817 +:101c68000300a3882128a700000083b8212087004b +:101c78000f00c3302338c3001100e010213060008a +:101c88002138e5000000a3980300a3880400a89861 +:101c98000700a8880800a9980b00a9880c00aa9832 +:101ca8000f00aa88000083ac040088ac080089ac47 +:101cb8001000a52410008424f2ffa714fcff8aacae +:101cc8000300c3302338c3002a00e010213060002d +:101cd8002138e5000000a3980300a3880400a52488 +:101ce80004008424fbffa714fcff83ac2100001030 +:101cf800000000000500e0102330c7000000a39892 +:101d08002128a700000083b8212087000f00c330d6 +:101d18002338c3000d00e010213060002138e500b1 +:101d28000000a38c0400a88c0800a98c0c00aa8cc5 +:101d3800000083ac040088ac080089ac1000a5241e +:101d480010008424f6ffa714fcff8aac0300c330fc +:101d58002338c3000700e010213060002138e50077 +:101d68000000a38c0400a52404008424fcffa7140d +:101d7800fcff83ac0600c0102138c5000000a3900a +:101d88000100a52401008424fcffa714ffff83a001 +:101d98000800e0030000000000008a902110800085 +:101da80003004015000000000800e00300000224c2 +:101db80001008a9003004015000000000800e003bd +:101dc8000100022402008a90030040150000000070 +:101dd8000800e0030200022403008a900300401573 +:101de800822004000800e003030002240100842488 +:101df8008020040000008a8c0101093c010129357a +:101e0800c07909002340490124400f010600001150 +:101e180024600a01040088110000000000008a9074 +:101e2800220000100000842404008b8c23406901e8 +:101e380024400f010600001124600b0104008811e2 +:101e48000000000004008a90180000100400842498 +:101e580008008a8c2340490124400f010600001124 +:101e680024600a01040088110000000008008a901c +:101e78000e000010080084240c008b8c234069019c +:101e880024400f010600001124600b010400881192 +:101e9800000000000c008a90040000100c0084244c +:101ea80010008a8cd7ff001010008424040040150d +:101eb80000000000000084240800e00323108200d2 +:101ec80001008a90040040150000000001008424ed +:101ed8000800e0032310820002008a9004004015e5 +:101ee80000000000020084240800e00323108200a0 +:101ef80003008a90030084240800e0032310820072 +:020000040000fa +:020000041d02db +:101f08000c00a294e0ffbd27020043301400b0afdc +:101f18001c00bfaf1800b1af2b0060102180a000db +:101f2800000243301c0060100400a38c00024234fd +:101f38000c00a2a41d006010ff0091300a000424c8 +:101f480028002412800042301000028e3e006210e9 +:101f5800010063240000028e01004424040003ae43 +:101f6800000051a00100032400a0023c000004aec0 +:101f7800300143a00a000224210022520c000296dc +:101f88001c00bf8f211020021400b08f1800b18fe1 +:101f98000800e0032000bd270b0060140002423453 +:101fa8000c00a2a4ff009130211800000800048e44 +:101fb800000004ae0a000424e4ff24561000028e38 +:101fc800fb87400b800042301c00bf8fffff1124ad +:101fd800211020021400b08f1800b18f0800e00310 +:101fe8002000bd27d9ff40541000028e0d000424a4 +:101ff800c287400f21280002d487400b0400038ebb +:1020080000014230dfff40101c00bf8f0e00049615 +:102018000800058ec18a400f0400068e0400038e56 +:10202800060043500800028e0c000296ffff1124a0 +:10203800300042340c0002a60800028e040000aef4 +:10204800e287400b000002ae2024117c1988400f63 +:0c20580021280002e287400b2188400094 +:020000040000fa +:020000041d02db +:102064000c00a294e8ffbd27400043301000b0af3d +:102074001400bfaf2180a0001c0060141800a4a3aa +:10208400020043303d006050300042341000a38c05 +:102094001b0060500e00a4940800a58c2d00a050d5 +:1020a40000a0053c0400068ec18a400f0e00049671 +:1020b400ffff02240800038e040002ae1800a2935e +:1020c400000062a01800a28301006324000003ae94 +:1020d4000a000324130043500c0003961400bf8f1e +:1020e4001000b08f0800e0031800bd271400bf8f54 +:1020f4002014047c1000b08f0800e0031800bd27f2 +:1021040001000624c18a400f1800a5271400bf8fc0 +:102114001800a283040000ae1000b08f0800e00392 +:102124001800bd2700016330edff60101400bf8f5d +:102134000e0004960800058ec18a400f0400068e26 +:102144000800038e1800a283040000ae3888400bf8 +:10215400000003ae6c40a524200003240800423490 +:10216400080005ae000005ae100003ae040003ae87 +:102174000c0002a62b88400b200006240c00a2a40d +:0c2184000400a0ac3888400bffff0224d0 +:020000040000fa +:020000041d02db +:102190000c008394e0ffbd271000b0af01000224c3 +:1021a00021808000110064301c00bfaf1800b2af66 +:1021b000300082141400b1af0002623018004014e5 +:1021c0000400028efffd63300c0003a61a001124e8 +:1021d0000d00122418004018ffff44240000028e56 +:1021e000040004ae0100442400004290000004ae4c +:1021f00080006430050080141c00bf8f1500515012 +:102200000800028e0a0052500400028e1800b28f9d +:102210001400b18f1000b08f0800e0032000bd272c +:1022200014004014211000007288400bfffd633041 +:10223000eaff401cffff4424400062300d004014c0 +:10224000212000024f86400f000000007c88400bd8 +:102250000c000396080040101c00bf8f0400048e81 +:102260000000028e01008424ffff4224040004ae1b +:10227000000002ae1c00bf8f100063340c0003a6e8 +:10228000ffff02241800b28f1400b18f1000b08f2e +:082290000800e0032000bd2757 +:020000040000fa +:020000041d02db +:10229800002020202020202020202828282828202e +:1022a8002020202020202020202020202020202026 +:1022b8002080101010101010101010101010101096 +:1022c800100404040404040404040410101010107e +:1022d8001010414141414141010101010101010148 +:1022e800010101010101010101010101101010109a +:1022f800101042424242424202020202020202021a +:10230800020202020202020202020202101010106d +:102318002000000000000000000000000000000095 +:1023280000000000000000000000000000000000a5 +:102338000000000000000000000000000000000095 +:102348000000000000000000000000000000000085 +:102358000000000000000000000000000000000075 +:102368000000000000000000000000000000000065 +:102378000000000000000000000000000000000055 +:102388000000000000000000000000000000000045 +:10239800000000000009121b242d363f48415a5303 +:1023a8006c657e7719100b023d342f265158434a2d +:1023b800757c676e323b2029161f040d7a7368619d +:1023c8005e574c452b2239300f061d14636a71780d +:1023d800474e555c646d767f4049525b2c253e37ed +:1023e80008011a137d746f6659504b42353c272eed +:1023f8001118030a565f444d727b60691e170c055d +:102408003a3328214f465d546b627970070e151ccc +:10241800232a31384148535a656c777e09001b12cc +:102428002d243f3658514a437c756e671019020bac +:10243800343d262f737a6168575e454c3b3229201c +:102448001f160d046a6378714e475c55222b30398c +:10245800060f141d252c373e0108131a6d647f766c +:1024680049405b523c352e2718110a03747d666f6c +:102478005059424b171e050c333a21285f564d44dc +:102488007b7269600e071c152a233831464f545d4c +:04249800626b70798a +:020000040000fa +:020000041d02db +:10249c00a8ffbd270400a1af0800a2af0c00a3af9a +:1024ac001000a4af1400a5af1800a6af1c00a7af76 +:1024bc002000a8af2400a9af2800aaaf2c00abaf16 +:1024cc003000acaf3400adaf3800aeaf3c00afafb6 +:1024dc004000b8af4400b9af4800bfaf1240000095 +:1024ec004c00a8af104000005000a8af029d1a3c51 +:1024fc00ac2e5a2700000000006804400060054024 +:10250c0009f84003000000005000a88f11000001e2 +:10251c004c00a88f130000010400a18f0800a28fab +:10252c000c00a38f1000a48f1400a58f1800a68f89 +:10253c001c00a78f2000a88f2400a98f2800aa8f29 +:10254c002c00ab8f3000ac8f3400ad8f3800ae8fc9 +:10255c003c00af8f4000b88f4400b98f4800bf8f4c +:0c256c005800bd27c0000000180000420d +:020000040000fa +:020000041d02db +:10257800e8ffbd271400bfaf1000beaf21f0a003d5 +:1025880081bf023c00f6428c100042300700401028 +:102598000000000001000224e08082af029d023c9e +:1025a80084324424328c400f0000000021e8c0032c +:1025b8001400bf8f1000be8f1800bd270800e0036d +:1025c80000000000f8ffbd270400beaf21f0a00303 +:1025d80080bf023c00800334080043ac21e8c003fc +:1025e8000400be8f0800bd270800e00300000000bb +:1025f800f8ffbd270400beaf21f0a00380bf023c56 +:1026080000800334040043ac21e8c0030400be8ffb +:102618000800bd270800e00300000000f8ffbd2700 +:102628000400beaf21f0a00380bf023c01000324d8 +:10263800080043ac21e8c0030400be8f0800bd2792 +:082648000800e003000000009f +:020000040000fa +:020000041d02db +:10265000286e756c6c2900003031323334353637d2 +:10266000383941424344454600000000303132339e +:1026700034353637383961626364656600000000be +:1026800001000000000000000a000000000000003f +:102690006400000000000000e803000000000000eb +:1026a0001027000000000000a086010000000000cc +:1026b00040420f00000000008096980000000000db +:1026c00000e1f5050000000000ca9a3b0000000090 +:1026d00000e40b540200000000e8764817000000f8 +:1026e0000010a5d4e800000000a0724e18090000f8 +:1026f00000407a10f35a00000080c6a47e8d0300cb +:102700000000c16ff286230000008a5d78456301f6 +:10271000000064a7b3b6e00d0000e8890423c78a6f +:1027200053504920466c61736820636f6e66696719 +:1027300075726564000000004552524f523a2053b2 +:10274000504920466c617368206e6f742064657414 +:102750006563746564000000466c6173682073747f +:1027600061747573207265676973746572203a20ad +:10277000307825780a00000053504920466c617378 +:102780006820646574656374696f6e204641494cc6 +:1027900045442e202056656e646f723a20307825ad +:1027a000782c20436869702049443a203078257895 +:1027b0000a00000053504920466c6173682064652c +:1027c0007465637465642e202056656e646f723a7a +:1027d00020307825782c20436869702049443a20bd +:0827e000307825780a000000a2 +:020000040000fa +:020000041d02db +:1027e800211080002600c0101000ca2c1f004015c0 +:1027f800ff00a530005205002528aa000054050056 +:102808002528aa000300833005006010040007246f +:102818002338e3002330c700000085b82120870053 +:102828000f00c3302338c3000800e01021306000d7 +:102838002138e400000085ac040085ac080085acb4 +:1028480010008424fbff8714fcff85ac0300c33011 +:102858002338c3000500e010213060002138e4006f +:1028680004008424feff8714fcff85ac0400c0101c +:102878002138c40001008424feff8714ffff85a0cf +:082888000800e003000000005d +:020000040000fa +:020000041d02db +:10289000200002240900052400008380feff62500e +:1028a00001008424030065542d000224268a400b75 +:1028b00001008424190062102b0002241b006250c6 +:1028c0000100842421380000029d063c9822c62481 +:1028d0002110c30001004290040042300c0040105f +:1028e0002110000040280200c01002002110a200a8 +:1028f0000100842421104300000083802128c300ac +:102900000100a5900400a530f6ffa014d0ff4224da +:10291000231802000800e0030b1067000100842464 +:1029200000008380328a400b01000724000083806e +:08293000328a400b213800003f +:020000040000fa +:020000041d02db +:10293800e0ffbd271800b0af029d103c982210267a +:1029480021189000010063901c00bfaf040067309d +:102958000900e01021108000d0ff82242a284500b9 +:102968001100a0101c00bf8fff0042301800b08f6c +:102978000800e0032000bd27010067300400e05094 +:10298800030063300c00c014000000000300633033 +:1029980004006010a9ff42242a284500f2ffa01471 +:1029a8001c00bf8f1c00bf8fff0002241800b08fcf +:1029b8000800e0032000bd27798c400f1000a5af68 +:1029c8002180500001000392658a400b1000a58ffa +:020000040000fa +:020000041d02db +:1029d8000400c92805002011213886001700c01cf2 +:1029e800000000000800e0032110000025408500d9 +:1029f800030008310300001100000000100000105f +:102a0800000088900000888c0000a98c04008424b1 +:102a1800050009110400a524fcffa524fcff84245b +:102a28000700001000008890fcffc624f5ffc01cba +:102a3800000000000800e00321100000000088905a +:102a48000000a99001008424030009110100a524b5 +:102a58000800e00323100901f8ff871400000000b4 +:082a68000800e003211000004a +:020000040000fa +:020000041d02db +:102a70000c008294e8ffbd271000b0af01000324d2 +:102a80002180800001024430170083101400bfaf82 +:102a90000202423002020324060043500800058e61 +:102aa000211000001400bf8f1000b08f0800e00359 +:102ab0001800bd27fbffa010211000000400068ea7 +:102ac000f9ffc0101400bf8fc18a400f0e0004969a +:102ad0000400038e040043100c00029630004234c0 +:102ae000ffff42300c0002a60800048e2000433095 +:102af000ffff0224040000ae000004aea98a400bd0 +:042b00000a100300b4 +:020000040000fa +:020000041d02db +:102b0400e0ffbd271c00bfaf1200a0101800b0af3b +:102b14001000c0100300842c060080140000023c46 +:102b24001c00bf8f2110c0001800b08f0800e00304 +:102b34002000bd27000042240b0040102120a000eb +:102b44002128c0000000000c1400a6afc98a400b65 +:102b54001400a68f1c00bf8f211000001800b08f36 +:102b64000800e0032000bd272180a6000000a48007 +:102b74000100a5241000a5afd577400f1400a6af1f +:102b84001000a58ff9ffb0141400a68fca8a400b59 +:042b94001c00bf8fd3 +:020000040000fa +:020000041d02db +:102b9800e8ffbd271400bfafff8c400f0000000006 +:102ba80088bf023c0030438c0003637c080060143b +:102bb80099aa033c0010042488bf033c083064ac85 +:102bc8000030438c00086330fdff601499aa033c71 +:102bd80081bf023c5566632430f240ac30f243ac0e +:102be8006655033caa99633430f243ac81bf023c7a +:102bf8000100032418f643ac81bf023c10f6428c56 +:082c0800028b400b00000000ec +:020000040000fa +:020000041d02db +:102c1000e0ffbd271800b2af1400b1af1000b0af95 +:102c20001c00bfaf218080002188a000118b400bc9 +:102c3000ffff1224c287400f000000000b0052105b +:102c4000010010260000028221282002f9ff401412 +:102c5000212040001c00bf8f1800b28f1400b18fdc +:102c60001000b08f0800e0032000bd271c00bf8fbc +:102c7000ffff02241800b28f1400b18f1000b08f34 +:082c80000800e0032000bd275d +:020000040000fa +:020000041d02db +:102c88001b00c010211000000000828011004010bd +:102c98000000a38012004314ffffc624318b400bb1 +:102ca800ffff072400008280090040100100a524ce +:102cb8000000a3800b004314ff004230ffffc6242e +:102cc800f8ffc714010084240800e0032110000065 +:102cd8000000a380ff0063300800e00323104300d6 +:102ce800ff004230ff0063300800e0032310430078 +:082cf8000800e00300000000e9 +:020000040000fa +:020000041d02db +:102d0000ffff032403008314211080000800e00368 +:102d1000000000000c00a494010003240102843090 +:102d2000030083500800a68c0800e003ffff022484 +:102d3000f6ffc050ffff02240400a48c1000a38cf7 +:102d4000f2ff8350ffff02240000a38c0600c31093 +:102d5000010084240400a4acffff64240000a4aca0 +:102d60000800e003ffff62a001006324568b400bc4 +:042d70000000a3ac10 +:020000040000fa +:020000041d02db +:102d7400f8ffbd270400beaf21f0a0032118800096 +:102d84002110a0000800c3a30c00c2a30c00c3932d +:102d940080bf023c305a43ac0800c39380bf023c5e +:102da400205a43ac0000000080bf023c105a428c01 +:102db40001004230fcff40100000000080bf023cd4 +:102dc400205a428c0800c2a30800c29321e8c00321 +:102dd4000400be8f0800bd270800e00300000000c7 +:020000040000fa +:020000041d02db +:102de400d0ffbd273800a2273800a6af1000a2af3d +:102df40021304000ff7f02242800b0af2400a2af9e +:102e040021808000c20002241400a4272c00bfaf3c +:102e14001400b0af1c00b0af3c00a7af1800a0afc7 +:102e2400a36d400f2000a2a71400a28f000040a0b1 +:102e34001400a28f2c00bf8f231050002800b08fe5 +:082e44000800e0033000bd2787 +:020000040000fa +:020000041d02db +:102e4c00e0ffbd271400b0af029d103c1800b1afdd +:102e5c001c00bfaf00a0113c982210266488400fc4 +:102e6c00bc40248e2118020201006380880063306c +:102e7c00faff6014ffff03240400431000a0033c7e +:102e8c00bc40658c408b400f212040001c00bf8f44 +:102e9c001800b18f1400b08f0800e0032000bd278c +:020000040000fa +:020000041d02db +:102eac00e0ffbd271c00bfaf1800beaf21f0a00390 +:102ebc00004802401000c2af006802401f004230c0 +:102ecc00b88082af00700240c08082af00600340c7 +:102edc00ff0f023cfeff423424106200006082406f +:102eec00c000000040000000400000004000000056 +:082efc00e68a400f000000000f +:020000040000fa +:020000041d02db +:102f0400c8ffbd274000a3273400bfaf4000a6afd1 +:102f14004400a7af1000a3af1400a4af1c00a4afdb +:102f24006887400f2800a5af1000a68f2800a58f42 +:102f34001800a2af2400a2af1400a427c1000224e9 +:102f44005d70400f2000a2a73400bf8f0800e0038b +:042f54003800bd275d +:020000040000fa +:020000041d02db +:102f58000000000000000000000000000060070002 +:102f680000000000006007000030000000080000ba +:102f780000380000001800000030000000200000a9 +:102f88000050000000100000006000000020000059 +:102f98000080000000100000000000000020000079 +:020000040000fa +:020000041d02db +:102fa8000000043ce8ffbd270000842403008010d3 +:102fb8001400bfaf09f88000000000000000843052 +:102fc8000000a5303876400f000000000000023ce9 +:102fd80000004224030040100000000009f84000ef +:0c2fe80000000000f9ff001000000000d5 +:020000040000fa +:020000041d02db +:102ff4004a462e636f6d00000a456e746572696ef1 +:1030040067204c544520706173737468726f7567e0 +:1030140068206d6f64650a000a45786974696e6793 +:10302400204c544520706173737468726f756768bf +:08303400206d6f64650a0000c5 +:020000040000fa +:020000041d02db +:10303c000000023ce8ffbd270000422406004010bf +:10304c001400bfaf0000023c0000422403004010fb +:10305c00029d023c3f000070029d023c84304224e1 +:10306c00030040100000000009f8400000000000c0 +:08307c001f8c400b0000000056 +:020000040000fa +:020000041d02db +:1030840000606041c000000099aa033c81bf023c7b +:103094005566632430f240ac30f243ac6655033cd1 +:1030a400aa99633430f243ac81bf023c010003248b +:1030b40018f643ac81bf023c10f6428c238c400bc3 +:0430c4000000000008 +:020000040000fa +:020000041d02db +:1030c800e0ffbd271400b0af00a0103cf43d05267a +:1030d8001c00bfaf048b400f1800b1aff43d0526ac +:1030e8000a000424c287400f218840001c00bf8fbb +:1030f800211020021400b08f1800b18f0800e003df +:043108002000bd27bf +:020000040000fa +:020000041d02db +:10310c00e0ffbd272400a2272118800000a0043c6a +:10311c002400a5af2800a6aff43d8424212860002c +:10312c00213040001c00bfaf2c00a7afa36d400f97 +:10313c001000a2af1c00bf8f0800e0032000bd27c9 +:020000040000fa +:020000041d02db +:10314c000000023c00004224050040100000023c3c +:10315c000000422403004010029d023c3f0000701e +:10316c00029d023c84304224fdff40100000000010 +:08317c0009f84000000000000a +:020000040000fa +:020000041d02db +:103184004a462e636f6d00004368616c6574447534 +:10319400696e6f20563220496e697469616c697a70 +:1031a40065640000746573742025640a00000000df +:020000040000fa +:020000041d02db +:1031b400006803408000023c2510620000688240e1 +:1031c400040080100010032488bf023c0800e003c0 +:1031d400041043ac88bf023c0800e003081043ac71 +:020000040000fa +:020000041d02db +:1031e400029d033c9822632421188300211080004f +:1031f4000100649020004324010084300800e003af +:043204000b10640047 +:020000040000fa +:020000041d02db +:10320800029d023c98224224211082000100429033 +:10321800e0ff8324020042300b2062000800e00334 +:0432280021108000f1 +:020000040000fa +:020000041d02db +:10322c00f8ffbd270400beaf21f0a00321e8c003c6 +:10323c000400be8f0800bd270800e003000000005a +:020000040000fa +:020000041d02db +:10324c004275726561753a2025640a00437569738d +:0c325c00696e653a2025640a000000003d +:020000040000fa +:020000041d02db +:103268000100843003008014000000000800e0031f +:0c327800006060410800e003206060413d +:020000040000fa +:020000041d02db +:103284005761746368646f6720776173207472692f +:083294006767657265640000c4 +:020000040000fa +:020000041d02db +:10329c00f8ff022400800340241062000200423434 +:0832ac000800e00300808240ed +:020000040000fa +:020000041d02db +:1032b400f8ff02240080034024106200030042341b +:0832c4000800e00300808240d5 +:020000040000fa +:020000041d02db +:1032cc0000601a40bfff1b3cffff7b3724d05b0321 +:0832dc0000609a401800004256 +:020000040000fa +:020000041d02db +:1032e400029d023c98224224211044000100429095 +:0832f4000800e003070042306e +:020000040000fa +:020000041d02db +:1032fc00029d023c9822422421104400010042907d +:08330c000800e0030300423059 +:020000040000fa +:020000041d02db +:10331400029d023c98224224211044000100429064 +:083324000800e0032000423024 +:020000040000fa +:020000041d02db +:10332c00029d023c9822422421104400010042904c +:08333c000800e0030400423028 +:020000040000fa +:020000041d02db +:10334400029d023c98224224211044000100429034 +:083354000800e00317004230fd +:020000040000fa +:020000041d02db +:10335c00029d023c9822422421104400010042901c +:08336c000800e00302004230fa +:020000040000fa +:020000041d02db +:10337400029d023c98224224211044000100428014 +:083384000800e003970042304d +:020000040000fa +:020000041d02db +:10338c00029d023c982242242110440001004290ec +:08339c000800e00310004230bc +:020000040000fa +:020000041d02db +:1033a400029d023c982242242110440001004280e4 +:0833b4000800e003880042302c +:020000040000fa +:020000041d02db +:1033bc00029d023c982242242110440001004290bc +:0833cc000800e003010042309b +:020000040000fa +:020000041d02db +:1033d400029d023c982242242110440001004290a4 +:0833e4000800e0034400423040 +:020000040000fa +:020000041d02db +:0833ec004a462e636f6d0000dc +:020000040000fa +:020000041d02db +:0833f4000800e00320606241c3 +:020000040000fa +:020000041d02db +:0833fc000800e00300606241db +:020000040000fa +:020000041d02db +:083404000800e00300000000d5 +:020000040000fa +:020000041d02db +:08340c000800e00300000000cd +:020000040000fa +:020000041d02db +:083414000800e0032110000094 +:020000040000fa +:020000041d02db +:08341c000800e0038000822c8f +:020000040000fa +:020000041d02db +:083424000800e0037f00823084 +:020000040000fa +:020000041d02db +:08342c000800e00320008224e7 +:020000040000fa +:020000041d02db +:083434000800e003e0ff822420 +:00000001FF diff --git a/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.map b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.map new file mode 100644 index 0000000..b566d25 --- /dev/null +++ b/AudioConsole.X/dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.map @@ -0,0 +1,4348 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o (memcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o (close) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_24) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_32) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) (__umoddi3) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mFrameData 0x136 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +mCurIPAddress 0x4 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mStoredBootloaderInfo + 0x14 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +TerminalWorkString 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +gstrHifCxt 0x24 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o +mac_addr 0x6 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mSyslogLTEPassthroughEnabled + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +mAPPassword 0x40 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +ActualTemp 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +param 0x18 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +VolDebug 0x64 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o +mModuleIPConfig 0x14 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mLoraProtocolData 0x284 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mLTEProtocolData 0x284 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +mUseDHCP 0x1 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +DataChunkWritten 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mSPIFlashOK 0x4 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +gastrSockets 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +mTerminalTickState 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +astTimer 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mAPName 0x40 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d005800 0x108e8 67816 App's exec code +.dinit 0x9d0160e8 0xd60 3424 +.text 0x9d016e48 0x4844 18500 App's exec code +.text._vfprintf_cdnopsu 0x9d01b68c 0xae8 2792 +.text._vfscanf_s 0x9d01c174 0x868 2152 +.rodata 0x9d01c9dc 0x7b8 1976 Read-only const +.text 0x9d01d194 0x2844 10308 App's exec code +.rodata 0x9d01f9d8 0x804 2052 Read-only const +.text 0x9d0201dc 0xf44 3908 App's exec code +.rodata 0x9d021120 0x25c 604 Read-only const +.text 0x9d02137c 0x5c0 1472 App's exec code +.text._filbuf 0x9d02193c 0x188 392 +.text.read 0x9d021ac4 0x174 372 +.text 0x9d021c38 0x2d0 720 App's exec code +.text.fputc 0x9d021f08 0x15c 348 +.text._flsbuf 0x9d022064 0x12c 300 +.text.fgetc 0x9d022190 0x108 264 +.rodata 0x9d022298 0x204 516 Read-only const +.text.general_exception 0x9d02249c 0xdc 220 +.text 0x9d022578 0xd8 216 App's exec code +.rodata 0x9d022650 0x198 408 Read-only const +.text 0x9d0227e8 0xa8 168 App's exec code +.text.atoi 0x9d022890 0xa8 168 +.text.range 0x9d022938 0xa0 160 +.text 0x9d0229d8 0x98 152 App's exec code +.text.fflush 0x9d022a70 0x94 148 +.text.write 0x9d022b04 0x94 148 +.text.SoftReset 0x9d022b98 0x78 120 +.text.fputs 0x9d022c10 0x78 120 +.text.strncmp 0x9d022c88 0x78 120 +.text.ungetc 0x9d022d00 0x74 116 +.text 0x9d022d74 0x70 112 App's exec code +.text._sprintf_cdnopuxX 0x9d022de4 0x68 104 +.text.wspace 0x9d022e4c 0x60 96 +.text 0x9d022eac 0x58 88 App's exec code +.text._sscanf_s 0x9d022f04 0x54 84 +.rodata 0x9d022f58 0x50 80 Read-only const +.text.main_entry 0x9d022fa8 0x4c 76 +.rodata 0x9d022ff4 0x48 72 Read-only const +.text._bootstrap_except 0x9d02303c 0x48 72 +.text 0x9d023084 0x44 68 App's exec code +.text.puts 0x9d0230c8 0x44 68 +.text._printf_cdnopsuxX 0x9d02310c 0x40 64 +.vector_default 0x9d02314c 0x38 56 +.rodata 0x9d023184 0x30 48 Read-only const +.text.INTConfigureSyste 0x9d0231b4 0x30 48 +.text.tolower 0x9d0231e4 0x24 36 +.text.toupper 0x9d023208 0x24 36 +.text 0x9d02322c 0x20 32 App's exec code +.rodata 0x9d02324c 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d023268 0x1c 28 +.rodata 0x9d023284 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d02329c 0x18 24 +.text.CheKseg0CacheOn 0x9d0232b4 0x18 24 +.text 0x9d0232cc 0x18 24 App's exec code +.text.isalnum 0x9d0232e4 0x18 24 +.text.isalpha 0x9d0232fc 0x18 24 +.text.iscntrl 0x9d023314 0x18 24 +.text.isdigit 0x9d02332c 0x18 24 +.text.isgraph 0x9d023344 0x18 24 +.text.islower 0x9d02335c 0x18 24 +.text.isprint 0x9d023374 0x18 24 +.text.ispunct 0x9d02338c 0x18 24 +.text.isspace 0x9d0233a4 0x18 24 +.text.isupper 0x9d0233bc 0x18 24 +.text.isxdigit 0x9d0233d4 0x18 24 +.rodata 0x9d0233ec 0x8 8 Read-only const +.text.INTEnableInterrup 0x9d0233f4 0x8 8 +.text.INTDisableInterru 0x9d0233fc 0x8 8 +.text._on_reset 0x9d023404 0x8 8 +.text._on_bootstrap 0x9d02340c 0x8 8 +.text.close 0x9d023414 0x8 8 +.text.isascii 0x9d02341c 0x8 8 +.text.toascii 0x9d023424 0x8 8 +.text._tolower 0x9d02342c 0x8 8 +.text._toupper 0x9d023434 0x8 8 + Total kseg0_program_mem used : 0x1dc3c 121916 24.3% of 0x7a7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.startup 0x9d005000 0x1e8 488 C startup code + Total kseg0_boot_mem used : 0x1e8 488 24.0% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d004180 0x10 16 General-Exception +.vector_0 0x9d004200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d004220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d004240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d004260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d004280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0042a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0042c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0042e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d004300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d004320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d004340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d004360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d004380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0043a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0043c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0043e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d004400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d004420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d004440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d004460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d004480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0044a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0044c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0044e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d004500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d004520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d004540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d004560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d004580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0045a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0045c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0045e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d004600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d004620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d004640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d004660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d004680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0046a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0046c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0046e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d004700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d004720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d004740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d004760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d004780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0047a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0047c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0047e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d004800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d004820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d004840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d004860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d004880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0048a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0048c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0048e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d004900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d004920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d004940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d004960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d004980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0049a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0049c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0049e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x8 8 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x18 24 2.1% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x1e04c 122956 24.2% of 0x7c47f + -------------------------------------------------------------------------- + + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.eh_frame 0xa0000000 0x30 48 +.sdata 0xa0000030 0x64 100 Small init data +.sbss 0xa0000094 0x120 288 Small uninit data +.bss 0xa00001b4 0x2c84 11396 Uninitialized data +.data 0xa0002e38 0x7a8 1960 Initialized data +.bss 0xa00035e0 0x800 2048 Uninitialized data +.data 0xa0003de0 0x26c 620 Initialized data +.bss 0xa000404c 0x40 64 Uninitialized data +.data 0xa000408c 0x1c 28 Initialized data +.bss 0xa00040a8 0x18 24 Uninitialized data + Total kseg1_data_mem used : 0x40c0 16576 25.3% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x40c0 16576 25.3% of 0x10000 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa00040c8 0x80 128 Reserved for heap +stack 0xa0004160 0xbe98 48792 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_program_mem 0x9d005800 0x0007a7ff xr +kseg0_boot_mem 0x9d005000 0x000007f0 +exception_mem 0x9d004000 0x00001000 +kseg1_boot_mem 0xbfc00000 0x00000490 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +kseg1_data_mem 0xa0000000 0x00010000 w !x +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Util.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/main.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/system.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/template.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/timer.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/SPI.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/crc32.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d004000 _ebase_address = 0x9d004000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d004180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x8 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d004180 0x10 + *(.gen_handler) + .gen_handler 0x9d004180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d004200 0x8 + *(.vector_0) + .vector_0 0x9d004200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d004200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d004220 0x8 + *(.vector_1) + .vector_1 0x9d004220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d004220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d004240 0x8 + *(.vector_2) + .vector_2 0x9d004240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d004240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d004260 0x8 + *(.vector_3) + .vector_3 0x9d004260 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + 0x9d004260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d004280 0x8 + *(.vector_4) + .vector_4 0x9d004280 0x8 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0x9d004280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0042a0 0x8 + *(.vector_5) + .vector_5 0x9d0042a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0042a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0042c0 0x8 + *(.vector_6) + .vector_6 0x9d0042c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0042c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0042e0 0x8 + *(.vector_7) + .vector_7 0x9d0042e0 0x8 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0x9d0042e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d004300 0x8 + *(.vector_8) + .vector_8 0x9d004300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d004300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d004320 0x8 + *(.vector_9) + .vector_9 0x9d004320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d004320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d004340 0x8 + *(.vector_10) + .vector_10 0x9d004340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d004340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d004360 0x8 + *(.vector_11) + .vector_11 0x9d004360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d004360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d004380 0x8 + *(.vector_12) + .vector_12 0x9d004380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d004380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0043a0 0x8 + *(.vector_13) + .vector_13 0x9d0043a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0043a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0043c0 0x8 + *(.vector_14) + .vector_14 0x9d0043c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0043c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0043e0 0x8 + *(.vector_15) + .vector_15 0x9d0043e0 0x8 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0x9d0043e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d004400 0x8 + *(.vector_16) + .vector_16 0x9d004400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d004400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d004420 0x8 + *(.vector_17) + .vector_17 0x9d004420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d004420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d004440 0x8 + *(.vector_18) + .vector_18 0x9d004440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d004440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d004460 0x8 + *(.vector_19) + .vector_19 0x9d004460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d004460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d004480 0x8 + *(.vector_20) + .vector_20 0x9d004480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d004480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0044a0 0x8 + *(.vector_21) + .vector_21 0x9d0044a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0044a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0044c0 0x8 + *(.vector_22) + .vector_22 0x9d0044c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0044c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0044e0 0x8 + *(.vector_23) + .vector_23 0x9d0044e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0044e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d004500 0x8 + *(.vector_24) + .vector_24 0x9d004500 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + 0x9d004500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d004520 0x8 + *(.vector_25) + .vector_25 0x9d004520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d004520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d004540 0x8 + *(.vector_26) + .vector_26 0x9d004540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d004540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d004560 0x8 + *(.vector_27) + .vector_27 0x9d004560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d004560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d004580 0x8 + *(.vector_28) + .vector_28 0x9d004580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d004580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0045a0 0x8 + *(.vector_29) + .vector_29 0x9d0045a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0045a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0045c0 0x8 + *(.vector_30) + .vector_30 0x9d0045c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0045c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0045e0 0x8 + *(.vector_31) + .vector_31 0x9d0045e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0045e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d004600 0x8 + *(.vector_32) + .vector_32 0x9d004600 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + 0x9d004600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d004620 0x8 + *(.vector_33) + .vector_33 0x9d004620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d004620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d004640 0x8 + *(.vector_34) + .vector_34 0x9d004640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d004640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d004660 0x8 + *(.vector_35) + .vector_35 0x9d004660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d004660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d004680 0x8 + *(.vector_36) + .vector_36 0x9d004680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d004680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0046a0 0x8 + *(.vector_37) + .vector_37 0x9d0046a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0046a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0046c0 0x8 + *(.vector_38) + .vector_38 0x9d0046c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0046c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0046e0 0x8 + *(.vector_39) + .vector_39 0x9d0046e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0046e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d004700 0x8 + *(.vector_40) + .vector_40 0x9d004700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d004700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d004720 0x8 + *(.vector_41) + .vector_41 0x9d004720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d004720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d004740 0x8 + *(.vector_42) + .vector_42 0x9d004740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d004740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d004760 0x8 + *(.vector_43) + .vector_43 0x9d004760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d004760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d004780 0x8 + *(.vector_44) + .vector_44 0x9d004780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d004780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0047a0 0x8 + *(.vector_45) + .vector_45 0x9d0047a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0047a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0047c0 0x8 + *(.vector_46) + .vector_46 0x9d0047c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0047c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0047e0 0x8 + *(.vector_47) + .vector_47 0x9d0047e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0047e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d004800 0x8 + *(.vector_48) + .vector_48 0x9d004800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d004800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d004820 0x8 + *(.vector_49) + .vector_49 0x9d004820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d004820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d004840 0x8 + *(.vector_50) + .vector_50 0x9d004840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d004840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d004860 0x8 + *(.vector_51) + .vector_51 0x9d004860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d004860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d004880 0x8 + *(.vector_52) + .vector_52 0x9d004880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d004880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0048a0 0x8 + *(.vector_53) + .vector_53 0x9d0048a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0048a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0048c0 0x8 + *(.vector_54) + .vector_54 0x9d0048c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0048c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0048e0 0x8 + *(.vector_55) + .vector_55 0x9d0048e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0048e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d004900 0x8 + *(.vector_56) + .vector_56 0x9d004900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d004900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d004920 0x8 + *(.vector_57) + .vector_57 0x9d004920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d004920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d004940 0x8 + *(.vector_58) + .vector_58 0x9d004940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d004940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d004960 0x8 + *(.vector_59) + .vector_59 0x9d004960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d004960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d004980 0x8 + *(.vector_60) + .vector_60 0x9d004980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d004980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0049a0 0x8 + *(.vector_61) + .vector_61 0x9d0049a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0049a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0049c0 0x8 + *(.vector_62) + .vector_62 0x9d0049c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0049c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0049e0 0x8 + *(.vector_63) + .vector_63 0x9d0049e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0049e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup 0x9d005000 0x1e8 + *(.startup) + *(.reset.startup) + .reset.startup + 0x9d005000 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.text 0x9d005800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d005800 . = ALIGN (0x4) + +.init 0x9d005800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d005800 . = ALIGN (0x4) + +.fini 0x9d005800 0x0 + *(.fini) + 0x9d005800 . = ALIGN (0x4) + +.preinit_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d005800 PROVIDE (__preinit_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.init_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d005800 PROVIDE (__init_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.fini_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d005800 PROVIDE (__fini_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.ctors 0x9d005800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d005800 . = ALIGN (0x4) + +.dtors 0x9d005800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d005800 . = ALIGN (0x4) + +.rodata 0x9d005800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d005800 . = ALIGN (0x4) + +.sdata2 0x9d0051e8 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d0051e8 . = ALIGN (0x4) + +.sbss2 0x9d0051e8 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d0051e8 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d0051e8 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d0051e8 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d0051e8 . = ALIGN (0x4) + +.dbg_data 0xa0000000 0x0 + 0xa0000000 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000000 0x0 + *(.jcr) + 0xa0000000 . = ALIGN (0x4) + +.eh_frame 0xa0000000 0x30 + *(.eh_frame) + .eh_frame 0xa0000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000030 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000030 . = ALIGN (0x4) + +.persist 0xa0000030 0x0 + 0xa0000030 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 _persist_end = . + +.data 0xa0000030 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 . = . + 0xa0008020 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000030 0x0 + *(.got.plt) + *(.got) + 0xa0000030 . = ALIGN (0x4) + +.sdata 0xa0000030 0x64 + 0xa0000030 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000030 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .sdata 0xa0000034 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .sdata 0xa0000038 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + 0xa0000038 egstrNmBusCapabilities + .sdata 0xa000003c 0x1 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + *fill* 0xa000003d 0x3 + .sdata 0xa0000040 0xc build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0xa0000048 mBootloaderMagicWord + .sdata 0xa000004c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .sdata 0xa0000054 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa000005b TerminalSocket + 0xa000005c TerminalServerSocket + 0xa000005d SyslogSocket + 0xa000005e SyslogServerSocket + 0xa000005f NetworkSocket + 0xa0000060 NetworkServerSocket + 0xa0000061 BootloaderSocket + 0xa0000062 BootloaderServerSocket + .sdata 0xa0000064 0x8 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .sdata 0xa000006c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .sdata 0xa0000074 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa000007c BtldrComputedCRC + 0xa0000080 BootloaderState + 0xa0000084 BootloaderDataStartPtr + .sdata 0xa000008c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000008c _Files + .sdata 0xa0000090 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa0000090 __XC_UART + 0xa0000094 . = ALIGN (0x4) + 0xa0000094 _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa0000094 . = ALIGN (0x4) + 0xa0000094 _data_end = . + 0xa0000094 _bss_begin = . + +.sbss 0xa0000094 0x120 + 0xa0000094 _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa0000094 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + *fill* 0xa0000095 0x3 + .sbss 0xa0000098 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .sbss 0xa000009c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .sbss 0xa00000a4 0x14 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .sbss 0xa00000b8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .sbss 0xa00000bc 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .sbss 0xa00000c0 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + *fill* 0xa00000c1 0x3 + .sbss 0xa00000c4 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa00000c4 gu16SessionID + 0xa00000c6 gbSocketInit + .sbss 0xa00000d4 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .sbss 0xa00000d8 0xc build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .sbss 0xa00000e4 0x1c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa00000e4 gu32HostIp + 0xa00000e8 gu8RetryCount + 0xa00000f8 mWiFiInitOK + 0xa00000fc mWiFiState + .sbss 0xa0000100 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + 0xa0000100 WatchdogTriggered + .sbss 0xa0000104 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa0000104 BootloaderHeader + 0xa0000108 BootloaderDataSize + 0xa000010c BootloaderDataCtr + 0xa0000110 BootloaderBufPtr + 0xa0000114 BootloaderCRC + 0xa0000118 BootloaderCommand + .sbss 0xa000011c 0x1 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + *fill* 0xa000011d 0x3 + .sbss 0xa0000120 0x10 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0xa0000120 mDebouncingBureau + 0xa0000124 mDebouncingCuisine + 0xa0000128 mBureauVolume + 0xa000012c mCuisineVolume + .sbss 0xa0000130 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0000130 _outdone + *(.scommon) + .scommon 0xa0000131 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + 0xa0000131 mWifiSPIBaudrate + *fill* 0xa0000132 0x2 + .scommon 0xa0000134 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa0000134 gpfAppResolveCb + 0xa0000138 gpfAppSocketCb + .scommon 0xa000013c 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0xa000013c mTerminalOpened + 0xa0000140 TerminalDataPtr + 0xa0000144 mTerminalPendingAction + 0xa0000148 mHelpStringPtr + 0xa000014c mUseDHCP + 0xa0000150 mTerminalTickState + .scommon 0xa0000154 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0xa0000154 ActualTemp + .scommon 0xa0000158 0xe build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa0000158 u8IsMacAddrValid + 0xa000015c mCurIPAddress + 0xa0000160 mac_addr + *fill* 0xa0000166 0x2 + .scommon 0xa0000168 0x8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0xa0000168 mSPIFlashHighSpeedBaudrate + 0xa0000169 mSPIFlashBaudrate + 0xa000016c mSPIFlashOK + .scommon 0xa0000170 0x8 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0xa0000170 mSyslogBufPtr + 0xa0000174 mSyslogLTEPassthroughEnabled + .scommon 0xa0000178 0x38 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0xa0000178 CurDataChunkSize + 0xa000017c BootloaderFirmwareChunkWriteCount + 0xa0000180 BootloaderFlashWriteDataPtr + 0xa0000184 BootloaderFlashErased + 0xa0000188 BootloaderFlashWriteState + 0xa000018c BootloaderCurFlashWriteAddress + 0xa0000190 BooloaderFlashEraseState + 0xa0000194 BootloaderCurFlashEraseAddress + 0xa0000198 BootloaderFlashWritePollCount + 0xa000019c BootloaderInterfaceState + 0xa00001a0 DataChunkWritten + 0xa00001a4 BooloaderFlashErasePollCount + 0xa00001a8 FirmwareUploaded + 0xa00001ac CurDataChunkIndex + .scommon 0xa00001b0 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa00001b0 BootloaderRxPtr + 0xa00001b4 _sbss_end = . + 0xa00001b4 . = ALIGN (0x4) + +.bss 0xa00001b4 0x2c84 + *(.dynbss) + *(COMMON) + COMMON 0xa00001b4 0x24 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + 0xa00001b4 gstrHifCxt + COMMON 0xa00001d8 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa00001d8 gastrSockets + COMMON 0xa0000298 0x640 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0xa0000298 mFrameData + 0xa00003d0 mLoraProtocolData + 0xa0000654 mLTEProtocolData + COMMON 0xa00008d8 0x418 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0xa00008d8 mStoredBootloaderInfo + 0xa00008ec TerminalWorkString + 0xa0000a18 mAPPassword + 0xa0000a58 TerminalPrevDataBuf + 0xa0000b84 TerminalDataBuf + 0xa0000cb0 mAPName + COMMON 0xa0000cf0 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0xa0000cf0 astTimer + COMMON 0xa0000db0 0xd04 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa0000db0 NetworkRxBuf + 0xa00011b0 TerminalRxBuf + 0xa00015b0 BootloaderRxBuf + 0xa00019b0 addr_in + 0xa00019c0 param + 0xa00019d8 mModuleIPConfig + 0xa00019ec SyslogRxBuf + COMMON 0xa0001ab4 0x1000 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0xa0001ab4 mFlashSectorBuffer + COMMON 0xa0002ab4 0x1f4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0xa0002ab4 mSyslogBuffer + COMMON 0xa0002ca8 0x12c build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0xa0002ca8 BootloaderBuffer + COMMON 0xa0002dd4 0x64 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0xa0002dd4 VolDebug + 0xa0002e38 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0002e38 . = ALIGN (0x4) + 0xa0002e38 _end = . + 0xa0002e38 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0002e38 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .mdebug.abi32 0xa0002e38 0x0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0002e38 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x177 + *(.comment) + .comment 0x00000000 0x3c build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x000000a8 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000c1 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000da 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000128 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0x860 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_aranges + 0x00000400 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000420 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000448 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x00000468 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x00000488 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000004a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x000004c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x000004e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000508 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000528 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_aranges + 0x00000548 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000568 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x00000590 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x000005b0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_aranges + 0x000005d0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_aranges + 0x000005f0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x00000610 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x00000630 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_aranges + 0x00000650 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000680 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x000006a0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x000006c0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x000006e0 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000780 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x000007a0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x000007c0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x000007e0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x00000800 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x00000820 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000840 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_pubnames + 0x00000000 0x2d52 + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000020 0x4c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_pubnames + 0x0000006c 0x72 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_pubnames + 0x000000de 0x119 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_pubnames + 0x000001f7 0x7f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_pubnames + 0x00000276 0x95 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_pubnames + 0x0000030b 0x137 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000442 0x83d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000c7f 0x1f1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_pubnames + 0x00000e70 0xe8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_pubnames + 0x00000f58 0xee build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_pubnames + 0x00001046 0xe2 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_pubnames + 0x00001128 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_pubnames + 0x00001148 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_pubnames + 0x00001168 0x1ef build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_pubnames + 0x00001357 0x64 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_pubnames + 0x000013bb 0x24 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_pubnames + 0x000013df 0x123 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_pubnames + 0x00001502 0x1bf build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_pubnames + 0x000016c1 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_pubnames + 0x00001799 0x31 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_pubnames + 0x000017ca 0x61 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_pubnames + 0x0000182b 0xec build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_pubnames + 0x00001917 0x385 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_pubnames + 0x00001c9c 0x25 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_pubnames + 0x00001cc1 0x1b0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_pubnames + 0x00001e71 0x108 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_pubnames + 0x00001f79 0x71 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_pubnames + 0x00001fea 0x404 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_pubnames + 0x000023ee 0x377 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002765 0x2f build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_pubnames + 0x00002794 0xe0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_pubnames + 0x00002874 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002894 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x000028cf 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x000028f8 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002922 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x0000294d 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00002978 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x000029ab 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x000029cb 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x000029ef 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_pubnames + 0x00002a0b 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00002a33 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x00002a58 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x00002a76 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_pubnames + 0x00002a9e 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_pubnames + 0x00002ac6 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x00002ae6 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x00002b02 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_pubnames + 0x00002b2c 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x00002b4d 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x00002b6b 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00002b87 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x00002ba2 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x00002c83 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x00002ca0 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x00002cbe 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00002cdb 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x00002cf6 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x00002d12 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x00002d32 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_info 0x00000000 0x412d2 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x2fb0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_info 0x00002fb0 0x181e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_info 0x000047ce 0x1c5a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_info 0x00006428 0x274e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_info 0x00008b76 0x175d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_info 0x0000a2d3 0x149f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_info 0x0000b772 0x1d97 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_info 0x0000d509 0x624e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_info 0x00013757 0x1a98 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_info 0x000151ef 0x15b0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_info 0x0001679f 0x1725 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_info 0x00017ec4 0x1bc7 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_info 0x00019a8b 0x1209 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_info 0x0001ac94 0x1278 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_info 0x0001bf0c 0x3387 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_info 0x0001f293 0x19af build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_info 0x00020c42 0x115f build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_info 0x00021da1 0x1a2a build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_info 0x000237cb 0x1946 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_info 0x00025111 0x14ff build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_info 0x00026610 0x127f build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_info 0x0002788f 0x1143 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_info 0x000289d2 0x2309 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_info 0x0002acdb 0x113f build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_info 0x0002be1a 0x1141 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_info 0x0002cf5b 0x211b build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_info 0x0002f076 0x34af build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_info 0x00032525 0x131e build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_info 0x00033843 0x1863 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_info 0x000350a6 0x166c build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_info 0x00036712 0x132c build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_info 0x00037a3e 0x2e50 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_info 0x0003a88e 0x217e build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_info 0x0003ca0c 0x2d4 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_info 0x0003cce0 0x20f2 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_info 0x0003edd2 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003ee80 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0003ef3b 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0003efe9 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0003f099 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0003f14b 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0003f1fd 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0003f2df 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0003f39b 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0003f45f 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_info 0x0003f50c 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0003f5e2 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0003f6a7 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0003f75e 0xc0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_info 0x0003f81e 0xc1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_info 0x0003f8df 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003f997 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0003f997 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x0003fa4a 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_info 0x0003fb0d 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003fbed 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x0003fca3 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x0003fd56 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x0003fe07 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x0003fe07 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x00040020 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x000400d5 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0004018b 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x00040240 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x000402eb 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x00040398 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x00040398 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x00040b1a 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_abbrev 0x00000000 0x5337 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1d0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_abbrev 0x000001d0 0x1e9 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_abbrev 0x000003b9 0x27f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_abbrev 0x00000638 0x2f1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_abbrev 0x00000929 0x1f9 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_abbrev 0x00000b22 0x1ed build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_abbrev 0x00000d0f 0x2d4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_abbrev 0x00000fe3 0x2d5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_abbrev 0x000012b8 0x29b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_abbrev 0x00001553 0x225 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_abbrev 0x00001778 0x238 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_abbrev 0x000019b0 0x2d7 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_abbrev 0x00001c87 0x19d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_abbrev 0x00001e24 0x1b1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_abbrev 0x00001fd5 0x334 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_abbrev 0x00002309 0x260 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_abbrev 0x00002569 0x17b build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_abbrev 0x000026e4 0x28c build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_abbrev 0x00002970 0x26f build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_abbrev 0x00002bdf 0x223 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_abbrev 0x00002e02 0x1a2 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_abbrev 0x00002fa4 0x166 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_abbrev 0x0000310a 0x349 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_abbrev 0x00003453 0x166 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_abbrev 0x000035b9 0x166 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_abbrev 0x0000371f 0x217 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_abbrev 0x00003936 0x392 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_abbrev 0x00003cc8 0x18e build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_abbrev 0x00003e56 0x298 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_abbrev 0x000040ee 0x24d build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_abbrev 0x0000433b 0x18c build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_abbrev 0x000044c7 0x2e2 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_abbrev 0x000047a9 0x2a0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_abbrev 0x00004a49 0x9a build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_abbrev 0x00004ae3 0x1c0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_abbrev 0x00004ca3 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x00004cd5 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x00004cf8 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x00004d1b 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x00004d3e 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x00004d61 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00004d84 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x00004da9 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x00004dce 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x00004df3 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_abbrev 0x00004e18 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x00004e3d 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x00004e62 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00004e87 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_abbrev 0x00004eac 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_abbrev 0x00004ed1 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x00004ef6 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x00004ef7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x00004f1c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_abbrev 0x00004f41 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x00004f77 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x00004f9c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00004fc1 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00004fe6 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x00004fe7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x0000500c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00005031 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x00005056 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x0000507b 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x000050a0 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x000050c5 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x000050c6 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x000051f8 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_line 0x00000000 0x72c6 + *(.debug_line) + .debug_line 0x00000000 0x1fe build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_line 0x000001fe 0x200 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_line 0x000003fe 0x336 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_line 0x00000734 0x415 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_line 0x00000b49 0x287 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_line 0x00000dd0 0x275 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_line 0x00001045 0x381 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_line 0x000013c6 0x81c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_line 0x00001be2 0x44b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_line 0x0000202d 0x231 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_line 0x0000225e 0x301 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_line 0x0000255f 0x3f5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_line 0x00002954 0x1f6 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_line 0x00002b4a 0x25e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_line 0x00002da8 0x63f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_line 0x000033e7 0x36c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_line 0x00003753 0x15a build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_line 0x000038ad 0x290 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_line 0x00003b3d 0x342 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_line 0x00003e7f 0x25f build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_line 0x000040de 0x165 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_line 0x00004243 0x101 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_line 0x00004344 0x350 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_line 0x00004694 0x101 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_line 0x00004795 0x101 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_line 0x00004896 0x233 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_line 0x00004ac9 0x509 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_line 0x00004fd2 0x159 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_line 0x0000512b 0x2a4 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_line 0x000053cf 0x269 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_line 0x00005638 0x169 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_line 0x000057a1 0x4c1 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_line 0x00005c62 0x388 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_line 0x00005fea 0x13b build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_line 0x00006125 0x1d9 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_line 0x000062fe 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x000063af 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00006411 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x00006482 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x000064f4 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x00006567 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x000065da 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x00006671 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x000066f5 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x0000677d 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_line 0x000067f6 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x0000688c 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x000068fa 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x0000696b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_line 0x000069db 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_line 0x00006a4c 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x00006abc 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00006abc 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x00006b2b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_line 0x00006b9b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x00006c0b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00006c7b 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00006cea 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00006d58 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00006d58 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00006dc8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00006e38 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00006ea8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x00006f18 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00006f90 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00007009 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00007009 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x00007171 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_frame 0x00000000 0x3200 + *(.debug_frame) + .debug_frame 0x00000000 0x2c build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_frame 0x0000002c 0xa0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_frame 0x000000cc 0x148 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_frame 0x00000214 0x1ec build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_frame 0x00000400 0xb8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_frame 0x000004b8 0xd4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_frame 0x0000058c 0x144 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_frame 0x000006d0 0x8d0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_frame 0x00000fa0 0x294 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_frame 0x00001234 0x17c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_frame 0x000013b0 0x128 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_frame 0x000014d8 0x298 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_frame 0x00001770 0x2c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_frame 0x0000179c 0x2c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_frame 0x000017c8 0x320 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_frame 0x00001ae8 0x17c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_frame 0x00001c64 0x2c build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_frame 0x00001c90 0x12c build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_frame 0x00001dbc 0xf4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_frame 0x00001eb0 0x10c build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_frame 0x00001fbc 0x2c build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_frame 0x00001fe8 0x64 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_frame 0x0000204c 0x148 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_frame 0x00002194 0x2d0 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_frame 0x00002464 0x2c build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_frame 0x00002490 0x17c build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_frame 0x0000260c 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_frame 0x000026e4 0x80 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_frame 0x00002764 0x1d0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_frame 0x00002934 0x1b4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_frame 0x00002ae8 0x64 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_frame 0x00002b4c 0xd0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_frame 0x00002c1c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00002c44 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x00002c74 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x00002c94 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x00002cb4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00002cd4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x00002cf4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x00002d1c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x00002d3c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x00002d5c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_frame 0x00002d7c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00002d9c 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x00002de4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00002e04 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_frame 0x00002e2c 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_frame 0x00002e58 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x00002e80 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x00002eac 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_frame 0x00002ee4 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x00002f58 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00002f80 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00002fb0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00002fd0 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x000030f0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x00003110 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x00003140 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x0000316c 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x00003198 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x000031c0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x000031e0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_str 0x00000000 0x366b + *(.debug_str) + .debug_str 0x00000000 0x1f3 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_str 0x000001f3 0x141 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_str 0x00000334 0x1ba build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_str 0x000004ee 0x158 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_str 0x00000646 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_str 0x00000775 0x139 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_str 0x000008ae 0x166 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_str 0x00000a14 0x406 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_str 0x00000e1a 0x15c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_str 0x00000f76 0x160 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_str 0x000010d6 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_str 0x00001205 0x17f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_str 0x00001384 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_str 0x000014b3 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_str 0x000015e2 0x2e5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_str 0x000018c7 0x18a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_str 0x00001a51 0x12f build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_str 0x00001b80 0x175 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_str 0x00001cf5 0x1a2 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_str 0x00001e97 0x145 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_str 0x00001fdc 0x12f build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_str 0x0000210b 0x12f build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_str 0x0000223a 0x18f build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_str 0x000023c9 0x12f build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_str 0x000024f8 0x12f build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_str 0x00002627 0x17f build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_str 0x000027a6 0x29e build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_str 0x00002a44 0x146 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_str 0x00002b8a 0x19f build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_str 0x00002d29 0x168 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_str 0x00002e91 0x15e build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_str 0x00002fef 0x2cb build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_str 0x000032ba 0x1fe build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_str 0x000034b8 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_str 0x000034b8 0x1b3 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x0000366b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_loc 0x00000000 0x1358 + *(.debug_loc) + .debug_loc 0x00000000 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x000009c3 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x378f + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x229 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000229 0x133 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_pubtypes + 0x0000035c 0x164 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_pubtypes + 0x000004c0 0x155 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_pubtypes + 0x00000615 0x15e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000773 0x128 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_pubtypes + 0x0000089b 0x216 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_pubtypes + 0x00000ab1 0x756 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00001207 0x120 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_pubtypes + 0x00001327 0x13a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_pubtypes + 0x00001461 0x14e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_pubtypes + 0x000015af 0x13f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_pubtypes + 0x000016ee 0x113 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_pubtypes + 0x00001801 0x11b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_pubtypes + 0x0000191c 0x3c3 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_pubtypes + 0x00001cdf 0x120 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00001dff 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_pubtypes + 0x00001ee6 0x15b build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_pubtypes + 0x00002041 0x1a3 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_pubtypes + 0x000021e4 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_pubtypes + 0x000022cb 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_pubtypes + 0x000023b2 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_pubtypes + 0x00002499 0x1d5 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_pubtypes + 0x0000266e 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_pubtypes + 0x00002755 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_pubtypes + 0x0000283c 0x145 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_pubtypes + 0x00002981 0x2f4 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002c75 0xfc build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_pubtypes + 0x00002d71 0xf8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_pubtypes + 0x00002e69 0x139 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_pubtypes + 0x00002fa2 0xf8 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_pubtypes + 0x0000309a 0x344 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_pubtypes + 0x000033de 0x183 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_pubtypes + 0x00003561 0x2c build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_pubtypes + 0x0000358d 0x150 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .debug_pubtypes + 0x000036dd 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x00003736 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_ranges 0x00000000 0x1f8 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000050 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000068 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x00000078 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_ranges 0x00000088 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .debug_ranges 0x00000098 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000a8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x000000b8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .debug_ranges 0x000000c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x000000e8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x000000f8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000108 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000118 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x000001a8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x000001b8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x000001c8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x000001d8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x000001e8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + .gnu.attributes + 0x00000230 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x00000240 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x00000250 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000280 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000290 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x000002a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x000002b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x000002c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .gnu.attributes + 0x000002d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x000002e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000002f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000300 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x00000080 _min_heap_size = 0x80 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0004160 0x400 + .stack 0xa0004160 0x400 stack + +.data 0xa0002e38 0x7a8 + .data 0xa0002e38 0x7a8 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.bss 0xa00035e0 0x800 + .bss 0xa00035e0 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .bss 0xa00039e0 0x400 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + +.data 0xa0003de0 0x26c + .data 0xa0003de0 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003de0 _iob + .data 0xa0003e80 0x6c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .data 0xa0003eec 0x58 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .data 0xa0003f44 0x58 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .data 0xa0003f9c 0x58 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .data 0xa0003ff4 0x58 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.bss 0xa000404c 0x40 + .bss 0xa000404c 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000404c _sibuf + 0xa000406c _sobuf + +.data 0xa000408c 0x1c + .data 0xa000408c 0x1c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + +.bss 0xa00040a8 0x18 + .bss 0xa00040a8 0x14 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .bss 0xa00040bc 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z23 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z24 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z25 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z26 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z40 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z41 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.bss%z42 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z43 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z44 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z60 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z61 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z62 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z63 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z64 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z65 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z66 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z67 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z68 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z69 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z70 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z71 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z72 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z73 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z74 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z75 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z76 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z77 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z78 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z79 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z80 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z81 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z82 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z83 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z84 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z85 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z86 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z87 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z88 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z89 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z90 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z91 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z92 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z93 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z94 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z95 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z96 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z97 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z98 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z99 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z100 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z101 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z102 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z103 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z104 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z105 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z106 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + +.data%z107 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + +.bss%z108 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z109 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z110 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z111 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z112 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z113 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z114 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z115 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z116 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z117 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z118 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z119 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z120 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z121 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z122 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + +.data%z123 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + +.bss%z124 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z125 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z126 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z127 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z128 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z129 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z130 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z131 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z132 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z133 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z134 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z135 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z136 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z137 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z138 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z139 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z140 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z141 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z142 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z143 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z144 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z145 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z146 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z147 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z148 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z149 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z150 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z151 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z152 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z153 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z154 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z155 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z156 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z157 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z158 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z159 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z160 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z161 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z162 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z163 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z164 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z165 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z166 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.data%z167 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.bss%z168 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z169 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z170 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z171 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z172 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z173 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z174 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z175 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z176 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z177 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z178 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z179 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z180 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z181 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z182 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z183 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z184 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + +.data%z185 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + +.bss%z186 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z187 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z188 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z189 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.bss%z190 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z191 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z192 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z193 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z194 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z195 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z196 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z197 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z198 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z199 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z200 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z201 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z202 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z203 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z204 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + +.data%z205 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.bss%z208 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + +.bss%z212 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.data%z213 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.bss%z214 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + +.data%z215 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + +.bss%z216 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + +.data%z217 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + +.bss%z218 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.data%z219 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.bss%z220 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.data%z221 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.bss%z222 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + +.bss%z229 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + +.data%z231 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + +.bss%z232 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + +.data%z233 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + +.bss%z234 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + +.data%z235 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + +.data%z239 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + +.bss%z240 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + +.data%z241 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + +.bss%z242 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.data%z243 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.bss%z244 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + +.data%z245 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + +.data%z250 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + +.bss%z251 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + +.data%z252 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + +.bss%z253 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + +.data%z254 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + +.bss%z255 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + +.data%z256 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + +.bss%z257 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + +.bss%z258 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.data%z259 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.bss%z260 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + +.data%z261 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + +.bss%z262 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + +.data%z263 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + +.bss%z264 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.data%z265 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.bss%z266 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z267 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +._debug_exception + 0xbfc00480 0x2c + ._debug_exception + 0xbfc00480 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + 0xbfc00480 __DbgExecReturn + +.text 0x9d005800 0x108e8 + .text 0x9d005800 0x4174 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + 0x9d006008 m2m_wifi_download_mode + 0x9d006334 m2m_wifi_ble_set_gain_table + 0x9d0063a8 m2m_wifi_init_hold + 0x9d0063e8 m2m_wifi_init_start + 0x9d00657c m2m_wifi_init + 0x9d0065d8 m2m_wifi_deinit + 0x9d006620 m2m_wifi_reinit_hold + 0x9d00665c m2m_wifi_reinit_start + 0x9d006694 m2m_wifi_reinit + 0x9d0066f4 m2m_wifi_get_state + 0x9d006778 m2m_wifi_handle_events + 0x9d0067cc m2m_wifi_delete_sc + 0x9d006848 m2m_wifi_default_connect + 0x9d006bd0 m2m_wifi_connect_open + 0x9d006cc8 m2m_wifi_connect_wep + 0x9d006edc m2m_wifi_connect_psk + 0x9d007154 m2m_wifi_1x_set_option + 0x9d007430 m2m_wifi_1x_get_option + 0x9d007648 m2m_wifi_connect_1x_mschap2 + 0x9d00792c m2m_wifi_connect_1x_tls + 0x9d007d4c m2m_wifi_connect + 0x9d007dc0 m2m_wifi_connect_sc + 0x9d008000 m2m_wifi_disconnect + 0x9d00804c m2m_wifi_set_mac_address + 0x9d0080b8 m2m_wifi_set_static_ip + 0x9d00814c m2m_wifi_enable_dhcp + 0x9d0081c4 m2m_wifi_set_lsn_int + 0x9d008218 m2m_wifi_set_cust_InfoElement + 0x9d008278 m2m_wifi_set_scan_options + 0x9d0082f0 m2m_wifi_set_stop_scan_on_first + 0x9d008384 m2m_wifi_set_scan_region + 0x9d0083f4 m2m_wifi_request_scan + 0x9d00849c m2m_wifi_request_scan_passive + 0x9d008544 m2m_wifi_request_scan_ssid_list + 0x9d0086a0 m2m_wifi_wps + 0x9d008728 m2m_wifi_wps_disable + 0x9d008780 m2m_wifi_p2p + 0x9d00882c m2m_wifi_p2p_disconnect + 0x9d008884 m2m_wifi_enable_ap + 0x9d00891c m2m_wifi_enable_ap_ext + 0x9d0089d0 m2m_wifi_disable_ap + 0x9d008a28 m2m_wifi_req_curr_rssi + 0x9d008a80 m2m_wifi_req_restrict_ble + 0x9d008ad8 m2m_wifi_req_unrestrict_ble + 0x9d008b30 m2m_wifi_send_ethernet_pkt + 0x9d008bd0 m2m_wifi_get_otp_mac_address + 0x9d008c3c m2m_wifi_get_mac_address + 0x9d008ca0 m2m_wifi_req_scan_result + 0x9d008d0c m2m_wifi_get_num_ap_found + 0x9d008d34 m2m_wifi_get_sleep_mode + 0x9d008d64 m2m_wifi_set_sleep_mode + 0x9d008df0 m2m_wifi_request_sleep + 0x9d008e74 m2m_wifi_set_device_name + 0x9d008f10 m2m_wifi_configure_sntp + 0x9d008fc0 m2m_wifi_get_chipId + 0x9d008ff0 m2m_wifi_get_firmware_version + 0x9d009054 m2m_wifi_check_ota_rb + 0x9d0090c0 m2m_ota_get_firmware_version + 0x9d009124 m2m_wifi_start_provision_mode + 0x9d0091d4 m2m_wifi_start_provision_mode_ext + 0x9d009320 m2m_wifi_stop_provision_mode + 0x9d00936c m2m_wifi_get_connection_info + 0x9d0093b8 m2m_wifi_set_system_time + 0x9d00940c m2m_wifi_get_system_time + 0x9d009458 m2m_wifi_enable_sntp + 0x9d0094d0 m2m_wifi_set_power_profile + 0x9d00953c m2m_wifi_set_tx_power + 0x9d0095a8 m2m_wifi_enable_firmware_logs + 0x9d009614 m2m_wifi_set_battery_voltage + 0x9d009684 m2m_wifi_prng_get_random_bytes + 0x9d009724 m2m_wifi_enable_mac_mcast + 0x9d0097bc m2m_wifi_set_receive_buffer + 0x9d00981c m2m_wifi_enable_roaming + 0x9d0098ac m2m_wifi_disable_roaming + 0x9d009900 m2m_wifi_ble_api_send + .text 0x9d009974 0x2908 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0x9d00a3f0 socketInit + 0x9d00a460 socketDeinit + 0x9d00a4bc registerSocketCallback + 0x9d00a4f4 registerSocketEventCallback + 0x9d00a520 registerSocketResolveCallback + 0x9d00a54c socket + 0x9d00a88c bind + 0x9d00a9c8 listen + 0x9d00aac0 accept + 0x9d00ab44 connect + 0x9d00acc8 secure + 0x9d00ae90 send + 0x9d00b06c sendto + 0x9d00b234 recv + 0x9d00b454 shutdown + 0x9d00b5a4 recvfrom + 0x9d00b7a4 gethostbyname + 0x9d00bc34 setsockopt + 0x9d00bdfc getsockopt + 0x9d00be38 m2m_ping_req + 0x9d00bef4 set_alpn_list + 0x9d00c0ac get_alpn_index + 0x9d00c174 IsSocketReady + 0x9d00c19c get_error_detail + .text 0x9d00c27c 0x1a2c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0x9d00ce50 InitWiFi + 0x9d00d21c TurnOFFWiFi + 0x9d00d2b8 CloseSockets + 0x9d00d3a4 GetWiFiSate + 0x9d00d3c8 GetCurIPAddress + 0x9d00d3ec TickWiFi + 0x9d00d4e0 OpenTerminalServer + 0x9d00d59c SendTerminalData + 0x9d00d624 SentTerminalByte + 0x9d00d6a0 OpenNetworkServer + 0x9d00d75c SendNetworkData + 0x9d00d7e4 SentNetworkByte + 0x9d00d860 OpenSyslogServer + 0x9d00d91c SendSyslogData + 0x9d00d994 SendSyslogByte + 0x9d00da10 IsSyslogClientConnected + 0x9d00da50 OpenBootloaderServer + 0x9d00db0c CloseBootloaderServer + 0x9d00db74 SendBootloaderData + 0x9d00dbec SendSBootloaderByte + 0x9d00dc68 IsBootloaderClientConnected + .text 0x9d00dca8 0x1808 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0x9d00dca8 BootloaderInterfaceInit + 0x9d00dcfc BootloaderInterfaceTick + 0x9d00dd34 BootloaderExecuteCmd + 0x9d00dfd8 BootloaderCRCError + 0x9d00e040 BootloaderInterfaceStateMachine + 0x9d00ea54 BootloaderResetStateMachine + 0x9d00eab0 BootloaderActivateBootloader + 0x9d00eaf0 BootloaderDeactivateBootloader + 0x9d00eb20 BootloaderFlashEraseStateMachine + 0x9d00ed54 ResetBootloaderFlashEraseStateMachine + 0x9d00ed88 BootloaderFlashWriteStateMachine + 0x9d00efb4 BootloaderPrintFlashData + 0x9d00efd4 BootloaderCheckFlashBootloaderData + 0x9d00f2f8 ResetBootloaderFlashWriteStateMachine + 0x9d00f338 BootloaderBytesToInt + 0x9d00f3f0 BootloaderIntToBytes + .text 0x9d00f4b0 0x1678 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + 0x9d00f4b0 chip_apply_conf + 0x9d00f564 chip_idle + 0x9d00f5d8 enable_rf_blocks + 0x9d00f678 enable_interrupts + 0x9d00f788 cpu_start + 0x9d00f954 nmi_get_chipid + 0x9d00fb6c nmi_get_rfrevid + 0x9d00fbb8 restore_pmu_settings_after_global_reset + 0x9d00fc0c nmi_update_pll + 0x9d00fc80 nmi_set_sys_clk_src_to_xo + 0x9d00fcdc chip_sleep + 0x9d00fe44 chip_wake + 0x9d010004 chip_reset_and_cpu_halt + 0x9d010198 chip_reset + 0x9d0101f8 wait_for_bootrom + 0x9d0103a4 wait_for_firmware_start + 0x9d0104c4 chip_deinit + 0x9d0105e0 set_gpio_dir + 0x9d0106b4 set_gpio_val + 0x9d010788 get_gpio_val + 0x9d010814 pullup_ctrl + 0x9d0108cc nmi_get_otp_mac_address + 0x9d010a2c nmi_get_mac_address + .text 0x9d010b28 0x14b8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + 0x9d011a70 nm_spi_reset + 0x9d011ac4 nm_spi_lock_init + 0x9d011ae4 nm_spi_init + 0x9d011c9c nm_spi_deinit + 0x9d011cc4 nm_spi_read_reg + 0x9d011d08 nm_spi_read_reg_with_ret + 0x9d011d98 nm_spi_write_reg + 0x9d011e28 nm_spi_read_block + 0x9d011f1c nm_spi_write_block + .text 0x9d011fe0 0x1384 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + 0x9d0120e4 hif_chip_wake + 0x9d0121ac hif_set_sleep_mode + 0x9d0121e0 hif_get_sleep_mode + 0x9d01226c hif_chip_sleep + 0x9d012310 hif_init + 0x9d012370 hif_deinit + 0x9d0123c8 hif_check_compatibility + 0x9d012440 hif_enable_access + 0x9d012578 hif_check_code + 0x9d01266c hif_send + 0x9d013064 hif_handle_isr + 0x9d0130a0 hif_receive + 0x9d01324c hif_register_cb + .text 0x9d013364 0x121c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + 0x9d0140c8 spi_flash_read + 0x9d0141a0 spi_flash_write + 0x9d01436c spi_flash_erase + 0x9d014500 spi_flash_get_size + .text 0x9d014580 0xdd0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0x9d014580 InitSPIFlash + 0x9d0146f8 SPIFlashCheckAndConfigure + 0x9d0147d4 SPIFlashIsPresent + 0x9d0147f8 SPIFlashWriteEnable + 0x9d01485c SPIFlashReadStatusReg + 0x9d014904 SPIFlashCheckBusy + 0x9d014960 SPIFlashCheckChipID + 0x9d014a9c SPIFlashReadBuffer + 0x9d014c1c SPIFlashEraseSector + 0x9d014d44 SPIFlashErase64KSector + 0x9d014e98 SPIFlashWriteSectorWorkingBuffer + 0x9d015054 SPIFlashWriteByte + 0x9d0151a8 SPIFlashWriteBuffer + .text 0x9d015350 0xd98 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + 0x9d01565c m2m_ssl_init + 0x9d0156bc m2m_ssl_handshake_rsp + 0x9d015734 m2m_ssl_send_certs_to_winc + 0x9d015a7c m2m_ssl_retrieve_next_for_verifying + 0x9d015eb0 m2m_ssl_retrieve_cert + 0x9d015f28 m2m_ssl_retrieve_hash + 0x9d015fec m2m_ssl_stop_retrieving + 0x9d01602c m2m_ssl_stop_processing_certs + 0x9d01605c m2m_ssl_ecc_process_done + 0x9d016080 m2m_ssl_set_active_ciphersuites + +.dinit 0x9d0160e8 0xd60 + .dinit 0x9d0160e8 0xd60 data_init + +.text 0x9d016e48 0x4844 + .text 0x9d016e48 0xd54 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0x9d016e48 BootloaderProtocolInit + 0x9d016e78 BootloaderProtocolStateMachine + 0x9d0173c8 BootloaderProtocolProtocolAnalyzeNewData + 0x9d017444 BootloaderProtocolResetStateMachine + 0x9d017498 BootloaderProtocolSendFrame + 0x9d017664 BootloaderProtocolGetDataBufferPtr + 0x9d017688 BootloaderProtocolSendHeartbeat + 0x9d0176d0 BootloaderProtocolSendACK + 0x9d017724 BootloaderProtocolSendNACK + 0x9d017774 BootloaderProtocolSendInitUploadResponse + 0x9d0178d4 BootloaderProtocolSendDataChunkResult + 0x9d0179c8 BootloaderProtocolSendBootloaderState + 0x9d017a2c BootloaderProtocolSendFirmwareUploadResult + 0x9d017a90 BootloaderProtocolSendFlashCheckResult + 0x9d017af4 BootloaderProtocolSendStoredFirmwareInfoResponse + .text 0x9d017b9c 0xce8 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + 0x9d017b9c SwapEndianShort + 0x9d017be8 SwapEndianInt + 0x9d017c44 ConvertIntToStrLeadingZero + 0x9d018068 ConvertIntToStr + 0x9d0183bc ConvertCharToStrLeadingZero + 0x9d018524 ConvertStrToValue + 0x9d018710 ConvertCharToStr + 0x9d0187c8 Crc8 + 0x9d018860 Delay + .text 0x9d018884 0xbac build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + 0x9d018fc8 m2m_flash_erase_sector + 0x9d019104 m2m_flash_write + 0x9d01923c m2m_flash_read + 0x9d019374 m2m_flash_switch_firmware + .text 0x9d019430 0xb98 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0x9d019430 TimerInit + 0x9d019500 IsMilliSecTimerExpired + 0x9d019668 IsSecTimerExpired + 0x9d0197cc IsTimerExpired + 0x9d019b80 TimerStart + 0x9d019ca8 TimerStartSeconds + 0x9d019d4c TimerReset + 0x9d019dd0 IsTimerRunning + 0x9d019e14 TimerStop + 0x9d019e58 Sleep + 0x9d019eb4 Timer1MilliSecInterrupt + .text 0x9d019fc8 0xb88 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0x9d019fc8 InitTerminal + 0x9d01a048 TickTerminal + 0x9d01a0a4 RxTerminalBuf + 0x9d01a130 RxTerminalData + 0x9d01a280 ParseNewBuffer + 0x9d01aa9c TerminalPrintString + 0x9d01aaf0 TerminalPrintChar + 0x9d01ab30 TerminalStateMachine + .text 0x9d01ab50 0xb3c build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0x9d01ab50 ProtocolInit + 0x9d01abcc StateMachine + 0x9d01b284 ProtocolAnalyzeNewData + 0x9d01b310 ResetStateMachine + 0x9d01b380 ProtocolExecCmd + 0x9d01b3a0 ProtocolAcknowledge + 0x9d01b404 ProtocolCalcCrc + 0x9d01b480 ProtocolIsReceiving + 0x9d01b4a0 ProtocolGetFrame + 0x9d01b660 ProtocolMsgDataPtr + +.text._vfprintf_cdnopsuxX + 0x9d01b68c 0xae8 + .text._vfprintf_cdnopsuxX + 0x9d01b68c 0xae8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + 0x9d01b68c _vfprintf_cdnopsuxX + 0x9d01b68c _vfprintf_cdnopuxX + +.text._vfscanf_s + 0x9d01c174 0x868 + .text._vfscanf_s + 0x9d01c174 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01c174 _vfscanf_s + 0x9d01c174 _vfscanf_0 + +.rodata 0x9d01c9dc 0x7b8 + .rodata 0x9d01c9dc 0x7b8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + +.text 0x9d01d194 0x2844 + .text 0x9d01d194 0x74c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + 0x9d01d194 nm_get_hif_info + 0x9d01d234 nm_get_firmware_full_info + 0x9d01d3c4 nm_get_ota_firmware_info + 0x9d01d554 nm_drv_init_download_mode + 0x9d01d5d8 nm_drv_init_hold + 0x9d01d654 nm_drv_init_start + 0x9d01d7a4 nm_drv_init + 0x9d01d800 nm_drv_deinit + 0x9d01d884 nm_cpu_start + 0x9d01d8bc nm_get_state + .text 0x9d01d8e0 0x6b4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0x9d01d8e0 main + 0x9d01df54 _mon_putc + .text 0x9d01df94 0x69c build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + 0x9d01df94 VolumeTransducerInit + 0x9d01e0f8 VolumeTransducerTick + 0x9d01e3b0 BureauTransducerInterrupt + 0x9d01e4f0 CuisineTransducerInterrupt + .text 0x9d01e630 0x61c build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + 0x9d01e630 InitBoard + .text 0x9d01ec4c 0x4e4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + 0x9d01ecb4 nm_bus_iface_init + 0x9d01ecf8 nm_bus_iface_deinit + 0x9d01ed34 nm_bus_reset + 0x9d01ed64 nm_bus_iface_reconfigure + 0x9d01ed90 nm_read_reg + 0x9d01edc8 nm_read_reg_with_ret + 0x9d01ee08 nm_write_reg + 0x9d01ee98 nm_read_block + 0x9d01f00c nm_write_block + .text 0x9d01f130 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d01f130 __umoddi3 + .text 0x9d01f58c 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01f58c __udivdi3 + +.rodata 0x9d01f9d8 0x804 + .rodata 0x9d01f9d8 0x404 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + 0x9d01f9dc CRC8_TABLE + .rodata 0x9d01fddc 0x400 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.text 0x9d0201dc 0xf44 + .text 0x9d0201dc 0x374 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + 0x9d0203e0 m2m_periph_init + 0x9d020408 m2m_periph_gpio_set_dir + 0x9d020460 m2m_periph_gpio_set_val + 0x9d0204b8 m2m_periph_gpio_get_val + 0x9d020508 m2m_periph_pullup_ctrl + .text 0x9d020550 0x340 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0x9d020550 InitSyslog + 0x9d0205a8 SyslogTick + 0x9d020644 SyslogNewByte + 0x9d0206f8 SyslogNewString + 0x9d020770 SyslogIsBufferEmpty + 0x9d0207ac SyslogSetLTEPassthrough + 0x9d020828 RxSyslogBuf + .text 0x9d020890 0x33c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + 0x9d02094c m2m_ota_init + 0x9d0209a8 m2m_ota_start_update + 0x9d020a24 m2m_ota_rollback + 0x9d020acc m2m_ota_abort + 0x9d020b24 m2m_ota_switch_firmware + .text 0x9d020bcc 0x2e8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + 0x9d020bcc chip_isr + 0x9d020c44 nm_sleep + 0x9d020c7c nm_reset + 0x9d020d94 hexstr_2_bytes + .text 0x9d020eb4 0x26c build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + 0x9d020eb4 crc_32 + 0x9d020fac update_crc_32 + +.rodata 0x9d021120 0x25c + .rodata 0x9d021120 0x25c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + +.text 0x9d02137c 0x5c0 + .text 0x9d02137c 0x244 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + 0x9d02137c inet_addr + .text 0x9d0215c0 0x1dc build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + 0x9d0215c0 inet_ntop + .text 0x9d02179c 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d02179c strcpy + +.text._filbuf 0x9d02193c 0x188 + .text._filbuf 0x9d02193c 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d02193c _filbuf + +.text.read 0x9d021ac4 0x174 + .text.read 0x9d021ac4 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d021ac4 read + +.text 0x9d021c38 0x2d0 + .text 0x9d021c38 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d021c38 memcpy + .text 0x9d021da0 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d021da0 strlen + +.text.fputc 0x9d021f08 0x15c + .text.fputc 0x9d021f08 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d021f08 fputc + +.text._flsbuf 0x9d022064 0x12c + .text._flsbuf 0x9d022064 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d022064 _flsbuf + +.text.fgetc 0x9d022190 0x108 + .text.fgetc 0x9d022190 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d022190 fgetc + +.rodata 0x9d022298 0x204 + .rodata 0x9d022298 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d022298 _ctype + .rodata 0x9d02239c 0x100 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.text.general_exception + 0x9d02249c 0xdc + .text.general_exception + 0x9d02249c 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d02249c _general_exception_context + +.text 0x9d022578 0xd8 + .text 0x9d022578 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + 0x9d022578 InitWatchdog + 0x9d0225cc EnableWatchdog + 0x9d0225f8 DisableWatchdog + 0x9d022624 KickWatchdog + +.rodata 0x9d022650 0x198 + .rodata 0x9d022650 0xd0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + .rodata 0x9d022720 0xc8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.text 0x9d0227e8 0xa8 + .text 0x9d0227e8 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d0227e8 memset + +.text.atoi 0x9d022890 0xa8 + .text.atoi 0x9d022890 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d022890 atoi + +.text.range 0x9d022938 0xa0 + .text.range 0x9d022938 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d0229d8 0x98 + .text 0x9d0229d8 0x98 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + 0x9d0229d8 memcmp + +.text.fflush 0x9d022a70 0x94 + .text.fflush 0x9d022a70 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d022a70 fflush + +.text.write 0x9d022b04 0x94 + .text.write 0x9d022b04 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d022b04 write + +.text.SoftReset + 0x9d022b98 0x78 + .text.SoftReset + 0x9d022b98 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d022b98 SoftReset + +.text.fputs 0x9d022c10 0x78 + .text.fputs 0x9d022c10 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d022c10 fputs + +.text.strncmp 0x9d022c88 0x78 + .text.strncmp 0x9d022c88 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d022c88 strncmp + +.text.ungetc 0x9d022d00 0x74 + .text.ungetc 0x9d022d00 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d022d00 ungetc + +.text 0x9d022d74 0x70 + .text 0x9d022d74 0x70 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + 0x9d022d74 SPITransaction + +.text._sprintf_cdnopuxX + 0x9d022de4 0x68 + .text._sprintf_cdnopuxX + 0x9d022de4 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + 0x9d022de4 _sprintf_cdnopuxX + +.text.wspace 0x9d022e4c 0x60 + .text.wspace 0x9d022e4c 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d022eac 0x58 + .text 0x9d022eac 0x58 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + 0x9d022eac _general_exception_handler + +.text._sscanf_s + 0x9d022f04 0x54 + .text._sscanf_s + 0x9d022f04 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d022f04 _sscanf_s + 0x9d022f04 _sscanf_0 + +.rodata 0x9d022f58 0x50 + .rodata 0x9d022f58 0x50 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.text.main_entry + 0x9d022fa8 0x4c + .text.main_entry + 0x9d022fa8 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d022fd4 __crt0_exit + +.rodata 0x9d022ff4 0x48 + .rodata 0x9d022ff4 0x48 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + +.text._bootstrap_exception_handler + 0x9d02303c 0x48 + .text._bootstrap_exception_handler + 0x9d02303c 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d02303c _bootstrap_exception_handler + +.text 0x9d023084 0x44 + .text 0x9d023084 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d023084 __pic32_software_reset + +.text.puts 0x9d0230c8 0x44 + .text.puts 0x9d0230c8 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d0230c8 puts + +.text._printf_cdnopsuxX + 0x9d02310c 0x40 + .text._printf_cdnopsuxX + 0x9d02310c 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + 0x9d02310c _printf_cdnopuxX + 0x9d02310c _printf_cdnopsuxX + +.vector_default + 0x9d02314c 0x38 + .vector_default + 0x9d02314c 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d02314c _DefaultInterrupt + +.rodata 0x9d023184 0x30 + .rodata 0x9d023184 0x30 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.text.INTConfigureSystem + 0x9d0231b4 0x30 + .text.INTConfigureSystem + 0x9d0231b4 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d0231b4 INTConfigureSystem + +.text.tolower 0x9d0231e4 0x24 + .text.tolower 0x9d0231e4 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0231e4 tolower + +.text.toupper 0x9d023208 0x24 + .text.toupper 0x9d023208 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023208 toupper + +.text 0x9d02322c 0x20 + .text 0x9d02322c 0x20 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + 0x9d02322c InitDigitalIO + +.rodata 0x9d02324c 0x1c + .rodata 0x9d02324c 0x1c build/ChaletDuinoV2_795F512H_/production/Source/VolumeTransducer.o + +.text.INTRestoreInterrupts + 0x9d023268 0x1c + .text.INTRestoreInterrupts + 0x9d023268 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d023268 INTRestoreInterrupts + +.rodata 0x9d023284 0x18 + .rodata 0x9d023284 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d02329c 0x18 + .text.CheKseg0CacheOff + 0x9d02329c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d02329c CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d0232b4 0x18 + .text.CheKseg0CacheOn + 0x9d0232b4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d0232b4 CheKseg0CacheOn + +.text 0x9d0232cc 0x18 + .text 0x9d0232cc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d0232cc _nmi_handler + +.text.isalnum 0x9d0232e4 0x18 + .text.isalnum 0x9d0232e4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0232e4 isalnum + +.text.isalpha 0x9d0232fc 0x18 + .text.isalpha 0x9d0232fc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0232fc isalpha + +.text.iscntrl 0x9d023314 0x18 + .text.iscntrl 0x9d023314 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023314 iscntrl + +.text.isdigit 0x9d02332c 0x18 + .text.isdigit 0x9d02332c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02332c isdigit + +.text.isgraph 0x9d023344 0x18 + .text.isgraph 0x9d023344 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023344 isgraph + +.text.islower 0x9d02335c 0x18 + .text.islower 0x9d02335c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02335c islower + +.text.isprint 0x9d023374 0x18 + .text.isprint 0x9d023374 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023374 isprint + +.text.ispunct 0x9d02338c 0x18 + .text.ispunct 0x9d02338c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02338c ispunct + +.text.isspace 0x9d0233a4 0x18 + .text.isspace 0x9d0233a4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0233a4 isspace + +.text.isupper 0x9d0233bc 0x18 + .text.isupper 0x9d0233bc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0233bc isupper + +.text.isxdigit 0x9d0233d4 0x18 + .text.isxdigit + 0x9d0233d4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0233d4 isxdigit + +.rodata 0x9d0233ec 0x8 + .rodata 0x9d0233ec 0x8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d0233f4 0x8 + .text.INTEnableInterrupts + 0x9d0233f4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d0233f4 INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d0233fc 0x8 + .text.INTDisableInterrupts + 0x9d0233fc 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d0233fc INTDisableInterrupts + +.text._on_reset + 0x9d023404 0x8 + .text._on_reset + 0x9d023404 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d023404 _on_reset + +.text._on_bootstrap + 0x9d02340c 0x8 + .text._on_bootstrap + 0x9d02340c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d02340c _on_bootstrap + +.text.close 0x9d023414 0x8 + .text.close 0x9d023414 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + 0x9d023414 close + +.text.isascii 0x9d02341c 0x8 + .text.isascii 0x9d02341c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02341c isascii + +.text.toascii 0x9d023424 0x8 + .text.toascii 0x9d023424 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023424 toascii + +.text._tolower 0x9d02342c 0x8 + .text._tolower + 0x9d02342c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02342c _tolower + +.text._toupper 0x9d023434 0x8 + .text._toupper + 0x9d023434 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023434 _toupper + +.text%z268 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z269 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z270 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z271 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z272 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z273 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z274 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z275 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z276 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z277 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z278 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z279 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z280 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + +.text%z281 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z282 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z283 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z284 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + +.text%z285 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.text%z286 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z287 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z288 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z289 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z290 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z291 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z292 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z293 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z294 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z295 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z296 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z297 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z298 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z299 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z300 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z301 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z302 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z303 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z304 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z305 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z306 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z307 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z308 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z309 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z310 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z311 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z312 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z313 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z314 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z315 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z316 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z317 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z318 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z319 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector32.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector24.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/AudioConsole.X/elf32pic32mx.x b/AudioConsole.X/elf32pic32mx.x new file mode 100644 index 0000000..4d37b6e --- /dev/null +++ b/AudioConsole.X/elf32pic32mx.x @@ -0,0 +1,668 @@ +/* Default linker script, for normal executables */ +OUTPUT_FORMAT("elf32-tradlittlemips") +OUTPUT_ARCH(pic32mx) +ENTRY(_reset) +/* + * Provide for a minimum stack and heap size + * - _min_stack_size - represents the minimum space that must be made + * available for the stack. Can be overridden from + * the command line using the linker's --defsym option. + * - _min_heap_size - represents the minimum space that must be made + * available for the heap. Can be overridden from + * the command line using the linker's --defsym option. + */ +EXTERN (_min_stack_size _min_heap_size) +PROVIDE(_min_stack_size = 0x400) ; +/* PROVIDE(_min_heap_size = 0) ; Defined on the command line */ +INCLUDE procdefs.ld +PROVIDE(_DBG_CODE_ADDR = 0xBFC02000) ; +PROVIDE(_DBG_CODE_SIZE = 0xFF0) ; +SECTIONS +{ + /* Boot Sections */ + .reset _RESET_ADDR : + { + KEEP(*(.reset)) + /* KEEP(*(.reset.startup))*/ + } > kseg1_boot_mem + .bev_excpt _BEV_EXCPT_ADDR : + { + KEEP(*(.bev_handler)) + } > kseg1_boot_mem + .dbg_excpt _DBG_EXCPT_ADDR (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? 0x8 : 0x0); + } > kseg1_boot_mem + .dbg_code _DBG_CODE_ADDR (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0); + } > debug_exec_mem + .app_excpt _GEN_EXCPT_ADDR : + { + KEEP(*(.gen_handler)) + } > exception_mem + .vector_0 _ebase_address + 0x200 : + { + KEEP(*(.vector_0)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large") + .vector_1 _ebase_address + 0x200 + (_vector_spacing << 5) * 1 : + { + KEEP(*(.vector_1)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large") + .vector_2 _ebase_address + 0x200 + (_vector_spacing << 5) * 2 : + { + KEEP(*(.vector_2)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large") + .vector_3 _ebase_address + 0x200 + (_vector_spacing << 5) * 3 : + { + KEEP(*(.vector_3)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large") + .vector_4 _ebase_address + 0x200 + (_vector_spacing << 5) * 4 : + { + KEEP(*(.vector_4)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large") + .vector_5 _ebase_address + 0x200 + (_vector_spacing << 5) * 5 : + { + KEEP(*(.vector_5)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_5) <= (_vector_spacing << 5), "function at exception vector 5 too large") + .vector_6 _ebase_address + 0x200 + (_vector_spacing << 5) * 6 : + { + KEEP(*(.vector_6)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_6) <= (_vector_spacing << 5), "function at exception vector 6 too large") + .vector_7 _ebase_address + 0x200 + (_vector_spacing << 5) * 7 : + { + KEEP(*(.vector_7)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_7) <= (_vector_spacing << 5), "function at exception vector 7 too large") + .vector_8 _ebase_address + 0x200 + (_vector_spacing << 5) * 8 : + { + KEEP(*(.vector_8)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_8) <= (_vector_spacing << 5), "function at exception vector 8 too large") + .vector_9 _ebase_address + 0x200 + (_vector_spacing << 5) * 9 : + { + KEEP(*(.vector_9)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_9) <= (_vector_spacing << 5), "function at exception vector 9 too large") + .vector_10 _ebase_address + 0x200 + (_vector_spacing << 5) * 10 : + { + KEEP(*(.vector_10)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_10) <= (_vector_spacing << 5), "function at exception vector 10 too large") + .vector_11 _ebase_address + 0x200 + (_vector_spacing << 5) * 11 : + { + KEEP(*(.vector_11)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_11) <= (_vector_spacing << 5), "function at exception vector 11 too large") + .vector_12 _ebase_address + 0x200 + (_vector_spacing << 5) * 12 : + { + KEEP(*(.vector_12)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_12) <= (_vector_spacing << 5), "function at exception vector 12 too large") + .vector_13 _ebase_address + 0x200 + (_vector_spacing << 5) * 13 : + { + KEEP(*(.vector_13)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_13) <= (_vector_spacing << 5), "function at exception vector 13 too large") + .vector_14 _ebase_address + 0x200 + (_vector_spacing << 5) * 14 : + { + KEEP(*(.vector_14)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_14) <= (_vector_spacing << 5), "function at exception vector 14 too large") + .vector_15 _ebase_address + 0x200 + (_vector_spacing << 5) * 15 : + { + KEEP(*(.vector_15)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_15) <= (_vector_spacing << 5), "function at exception vector 15 too large") + .vector_16 _ebase_address + 0x200 + (_vector_spacing << 5) * 16 : + { + KEEP(*(.vector_16)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_16) <= (_vector_spacing << 5), "function at exception vector 16 too large") + .vector_17 _ebase_address + 0x200 + (_vector_spacing << 5) * 17 : + { + KEEP(*(.vector_17)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_17) <= (_vector_spacing << 5), "function at exception vector 17 too large") + .vector_18 _ebase_address + 0x200 + (_vector_spacing << 5) * 18 : + { + KEEP(*(.vector_18)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_18) <= (_vector_spacing << 5), "function at exception vector 18 too large") + .vector_19 _ebase_address + 0x200 + (_vector_spacing << 5) * 19 : + { + KEEP(*(.vector_19)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_19) <= (_vector_spacing << 5), "function at exception vector 19 too large") + .vector_20 _ebase_address + 0x200 + (_vector_spacing << 5) * 20 : + { + KEEP(*(.vector_20)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_20) <= (_vector_spacing << 5), "function at exception vector 20 too large") + .vector_21 _ebase_address + 0x200 + (_vector_spacing << 5) * 21 : + { + KEEP(*(.vector_21)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_21) <= (_vector_spacing << 5), "function at exception vector 21 too large") + .vector_22 _ebase_address + 0x200 + (_vector_spacing << 5) * 22 : + { + KEEP(*(.vector_22)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_22) <= (_vector_spacing << 5), "function at exception vector 22 too large") + .vector_23 _ebase_address + 0x200 + (_vector_spacing << 5) * 23 : + { + KEEP(*(.vector_23)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_23) <= (_vector_spacing << 5), "function at exception vector 23 too large") + .vector_24 _ebase_address + 0x200 + (_vector_spacing << 5) * 24 : + { + KEEP(*(.vector_24)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_24) <= (_vector_spacing << 5), "function at exception vector 24 too large") + .vector_25 _ebase_address + 0x200 + (_vector_spacing << 5) * 25 : + { + KEEP(*(.vector_25)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_25) <= (_vector_spacing << 5), "function at exception vector 25 too large") + .vector_26 _ebase_address + 0x200 + (_vector_spacing << 5) * 26 : + { + KEEP(*(.vector_26)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_26) <= (_vector_spacing << 5), "function at exception vector 26 too large") + .vector_27 _ebase_address + 0x200 + (_vector_spacing << 5) * 27 : + { + KEEP(*(.vector_27)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_27) <= (_vector_spacing << 5), "function at exception vector 27 too large") + .vector_28 _ebase_address + 0x200 + (_vector_spacing << 5) * 28 : + { + KEEP(*(.vector_28)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_28) <= (_vector_spacing << 5), "function at exception vector 28 too large") + .vector_29 _ebase_address + 0x200 + (_vector_spacing << 5) * 29 : + { + KEEP(*(.vector_29)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_29) <= (_vector_spacing << 5), "function at exception vector 29 too large") + .vector_30 _ebase_address + 0x200 + (_vector_spacing << 5) * 30 : + { + KEEP(*(.vector_30)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_30) <= (_vector_spacing << 5), "function at exception vector 30 too large") + .vector_31 _ebase_address + 0x200 + (_vector_spacing << 5) * 31 : + { + KEEP(*(.vector_31)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_31) <= (_vector_spacing << 5), "function at exception vector 31 too large") + .vector_32 _ebase_address + 0x200 + (_vector_spacing << 5) * 32 : + { + KEEP(*(.vector_32)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_32) <= (_vector_spacing << 5), "function at exception vector 32 too large") + .vector_33 _ebase_address + 0x200 + (_vector_spacing << 5) * 33 : + { + KEEP(*(.vector_33)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_33) <= (_vector_spacing << 5), "function at exception vector 33 too large") + .vector_34 _ebase_address + 0x200 + (_vector_spacing << 5) * 34 : + { + KEEP(*(.vector_34)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_34) <= (_vector_spacing << 5), "function at exception vector 34 too large") + .vector_35 _ebase_address + 0x200 + (_vector_spacing << 5) * 35 : + { + KEEP(*(.vector_35)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_35) <= (_vector_spacing << 5), "function at exception vector 35 too large") + .vector_36 _ebase_address + 0x200 + (_vector_spacing << 5) * 36 : + { + KEEP(*(.vector_36)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_36) <= (_vector_spacing << 5), "function at exception vector 36 too large") + .vector_37 _ebase_address + 0x200 + (_vector_spacing << 5) * 37 : + { + KEEP(*(.vector_37)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_37) <= (_vector_spacing << 5), "function at exception vector 37 too large") + .vector_38 _ebase_address + 0x200 + (_vector_spacing << 5) * 38 : + { + KEEP(*(.vector_38)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_38) <= (_vector_spacing << 5), "function at exception vector 38 too large") + .vector_39 _ebase_address + 0x200 + (_vector_spacing << 5) * 39 : + { + KEEP(*(.vector_39)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_39) <= (_vector_spacing << 5), "function at exception vector 39 too large") + .vector_40 _ebase_address + 0x200 + (_vector_spacing << 5) * 40 : + { + KEEP(*(.vector_40)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_40) <= (_vector_spacing << 5), "function at exception vector 40 too large") + .vector_41 _ebase_address + 0x200 + (_vector_spacing << 5) * 41 : + { + KEEP(*(.vector_41)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_41) <= (_vector_spacing << 5), "function at exception vector 41 too large") + .vector_42 _ebase_address + 0x200 + (_vector_spacing << 5) * 42 : + { + KEEP(*(.vector_42)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_42) <= (_vector_spacing << 5), "function at exception vector 42 too large") + .vector_43 _ebase_address + 0x200 + (_vector_spacing << 5) * 43 : + { + KEEP(*(.vector_43)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_43) <= (_vector_spacing << 5), "function at exception vector 43 too large") + .vector_44 _ebase_address + 0x200 + (_vector_spacing << 5) * 44 : + { + KEEP(*(.vector_44)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_44) <= (_vector_spacing << 5), "function at exception vector 44 too large") + .vector_45 _ebase_address + 0x200 + (_vector_spacing << 5) * 45 : + { + KEEP(*(.vector_45)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_45) <= (_vector_spacing << 5), "function at exception vector 45 too large") + .vector_46 _ebase_address + 0x200 + (_vector_spacing << 5) * 46 : + { + KEEP(*(.vector_46)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_46) <= (_vector_spacing << 5), "function at exception vector 46 too large") + .vector_47 _ebase_address + 0x200 + (_vector_spacing << 5) * 47 : + { + KEEP(*(.vector_47)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_47) <= (_vector_spacing << 5), "function at exception vector 47 too large") + .vector_48 _ebase_address + 0x200 + (_vector_spacing << 5) * 48 : + { + KEEP(*(.vector_48)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_48) <= (_vector_spacing << 5), "function at exception vector 48 too large") + .vector_49 _ebase_address + 0x200 + (_vector_spacing << 5) * 49 : + { + KEEP(*(.vector_49)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_49) <= (_vector_spacing << 5), "function at exception vector 49 too large") + .vector_50 _ebase_address + 0x200 + (_vector_spacing << 5) * 50 : + { + KEEP(*(.vector_50)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_50) <= (_vector_spacing << 5), "function at exception vector 50 too large") + .vector_51 _ebase_address + 0x200 + (_vector_spacing << 5) * 51 : + { + KEEP(*(.vector_51)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_51) <= (_vector_spacing << 5), "function at exception vector 51 too large") + .vector_52 _ebase_address + 0x200 + (_vector_spacing << 5) * 52 : + { + KEEP(*(.vector_52)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_52) <= (_vector_spacing << 5), "function at exception vector 52 too large") + .vector_53 _ebase_address + 0x200 + (_vector_spacing << 5) * 53 : + { + KEEP(*(.vector_53)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_53) <= (_vector_spacing << 5), "function at exception vector 53 too large") + .vector_54 _ebase_address + 0x200 + (_vector_spacing << 5) * 54 : + { + KEEP(*(.vector_54)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_54) <= (_vector_spacing << 5), "function at exception vector 54 too large") + .vector_55 _ebase_address + 0x200 + (_vector_spacing << 5) * 55 : + { + KEEP(*(.vector_55)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_55) <= (_vector_spacing << 5), "function at exception vector 55 too large") + .vector_56 _ebase_address + 0x200 + (_vector_spacing << 5) * 56 : + { + KEEP(*(.vector_56)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_56) <= (_vector_spacing << 5), "function at exception vector 56 too large") + .vector_57 _ebase_address + 0x200 + (_vector_spacing << 5) * 57 : + { + KEEP(*(.vector_57)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_57) <= (_vector_spacing << 5), "function at exception vector 57 too large") + .vector_58 _ebase_address + 0x200 + (_vector_spacing << 5) * 58 : + { + KEEP(*(.vector_58)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_58) <= (_vector_spacing << 5), "function at exception vector 58 too large") + .vector_59 _ebase_address + 0x200 + (_vector_spacing << 5) * 59 : + { + KEEP(*(.vector_59)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_59) <= (_vector_spacing << 5), "function at exception vector 59 too large") + .vector_60 _ebase_address + 0x200 + (_vector_spacing << 5) * 60 : + { + KEEP(*(.vector_60)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_60) <= (_vector_spacing << 5), "function at exception vector 60 too large") + .vector_61 _ebase_address + 0x200 + (_vector_spacing << 5) * 61 : + { + KEEP(*(.vector_61)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_61) <= (_vector_spacing << 5), "function at exception vector 61 too large") + .vector_62 _ebase_address + 0x200 + (_vector_spacing << 5) * 62 : + { + KEEP(*(.vector_62)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_62) <= (_vector_spacing << 5), "function at exception vector 62 too large") + .vector_63 _ebase_address + 0x200 + (_vector_spacing << 5) * 63 : + { + KEEP(*(.vector_63)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_63) <= (_vector_spacing << 5), "function at exception vector 63 too large") + /* Starting with C32 v2.00, the startup code is in the .reset.startup section. + * Keep this here for backwards compatibility. + */ + .startup ORIGIN(kseg0_boot_mem) : + { + KEEP(*(.startup)) + KEEP(*(.reset.startup)) + } > kseg0_boot_mem + /* Code Sections - Note that input sections *(.text) and *(.text.*) + ** are not mapped here. Starting in C32 v2.00, the best-fit allocator + ** locates them, so that .text may flow around absolute sections + ** as needed. + */ + .text : + { + *(.stub .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + . = ALIGN(4) ; + } >kseg0_program_mem + /* Global-namespace object initialization */ + .init : + { + KEEP (*crti.o(.init)) + KEEP (*crtbegin.o(.init)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o *crtn.o ).init)) + KEEP (*crtend.o(.init)) + KEEP (*crtn.o(.init)) + . = ALIGN(4) ; + } >kseg0_program_mem + .fini : + { + KEEP (*(.fini)) + . = ALIGN(4) ; + } >kseg0_program_mem + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .ctors : + { + /* XC32 uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4) ; + } >kseg0_program_mem + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4) ; + } >kseg0_program_mem + /* Read-only sections */ + .rodata : + { + *( .gnu.linkonce.r.*) + *(.rodata1) + . = ALIGN(4) ; + } >kseg0_program_mem + /* + * Small initialized constant global and static data can be placed in the + * .sdata2 section. This is different from .sdata, which contains small + * initialized non-constant global and static data. + */ + .sdata2 ALIGN(4) : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + . = ALIGN(4) ; + } >kseg0_program_mem + /* + * Uninitialized constant global and static data (i.e., variables which will + * always be zero). Again, this is different from .sbss, which contains + * small non-initialized, non-constant global and static data. + */ + .sbss2 ALIGN(4) : + { + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + . = ALIGN(4) ; + } >kseg0_program_mem + .eh_frame_hdr : + { + *(.eh_frame_hdr) + } >kseg0_program_mem + . = ALIGN(4) ; + .eh_frame : ONLY_IF_RO + { + KEEP (*(.eh_frame)) + } >kseg0_program_mem + . = ALIGN(4) ; + .gcc_except_table : ONLY_IF_RO + { + *(.gcc_except_table .gcc_except_table.*) + } >kseg0_program_mem + . = ALIGN(4) ; + .dbg_data (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? 0x200 : 0x0); + } >kseg1_data_mem + .jcr : + { + KEEP (*(.jcr)) + . = ALIGN(4) ; + } >kseg1_data_mem + .eh_frame : ONLY_IF_RW + { + KEEP (*(.eh_frame)) + } >kseg1_data_mem + . = ALIGN(4) ; + .gcc_except_table : ONLY_IF_RW + { + *(.gcc_except_table .gcc_except_table.*) + } >kseg1_data_mem + . = ALIGN(4) ; + /* Persistent data - Use the new C 'persistent' attribute instead. */ + .persist : + { + _persist_begin = .; + *(.persist .persist.*) + *(.pbss .pbss.*) + . = ALIGN(4) ; + _persist_end = .; + } >kseg1_data_mem + /* + * Note that input sections named .data* are no longer mapped here. + * Starting in C32 v2.00, the best-fit allocator locates them, so + * that they may flow around absolute sections as needed. + */ + .data : + { + *( .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + *(.data1) + . = ALIGN(4) ; + } >kseg1_data_mem + . = .; + _gp = ALIGN(16) + 0x7ff0; + .got ALIGN(4) : + { + *(.got.plt) *(.got) + . = ALIGN(4) ; + } >kseg1_data_mem /* AT>kseg0_program_mem */ + /* + * Note that "small" data sections are still mapped in the linker + * script. This ensures that they are grouped together for + * gp-relative addressing. Absolute sections are allocated after + * the "small" data sections so small data cannot flow around them. + */ + /* + * We want the small data sections together, so single-instruction offsets + * can access them all, and initialized data all before uninitialized, so + * we can shorten the on-disk segment size. + */ + .sdata ALIGN(4) : + { + _sdata_begin = . ; + *(.sdata .sdata.* .gnu.linkonce.s.*) + . = ALIGN(4) ; + _sdata_end = . ; + } >kseg1_data_mem + .lit8 : + { + *(.lit8) + } >kseg1_data_mem + .lit4 : + { + *(.lit4) + } >kseg1_data_mem + . = ALIGN (4) ; + _data_end = . ; + _bss_begin = . ; + .sbss ALIGN(4) : + { + _sbss_begin = . ; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + _sbss_end = . ; + . = ALIGN(4) ; + } >kseg1_data_mem + /* + * Align here to ensure that the .bss section occupies space up to + * _end. Align after .bss to ensure correct alignment even if the + * .bss section disappears because there are no input sections. + * + * Note that input sections named .bss* are no longer mapped here. + * Starting in C32 v2.00, the best-fit allocator locates them, so + * that they may flow around absolute sections as needed. + * + */ + .bss : + { + *(.dynbss) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(. != 0 ? 4 : 1); + } >kseg1_data_mem + . = ALIGN(4) ; + _end = . ; + _bss_end = . ; + /* Starting with C32 v2.00, the heap and stack are dynamically + * allocated by the linker. + */ + /* + * RAM functions go at the end of our stack and heap allocation. + * Alignment of 2K required by the boundary register (BMXDKPBA). + * + * RAM functions are now allocated by the linker. The linker generates + * _ramfunc_begin and _bmxdkpba_address symbols depending on the + * location of RAM functions. + */ + _bmxdudba_address = LENGTH(kseg1_data_mem) ; + _bmxdupba_address = LENGTH(kseg1_data_mem) ; + /* The .pdr section belongs in the absolute section */ + /DISCARD/ : { *(.pdr) } + .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } + .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } + .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) } + .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) } + .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) } + .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) } + .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) } + .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) } + .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) } + .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) } + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /DISCARD/ : { *(.rel.dyn) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.discard) } +} diff --git a/AudioConsole.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk b/AudioConsole.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk new file mode 100644 index 0000000..97d2f06 --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk @@ -0,0 +1,566 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk)" "nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk" +include nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk +endif +endif + +# Environment +MKDIR=gnumkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=ChaletDuinoV2_795F512H_ +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD= +else +COMPARISON_BUILD= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=Source/ChaletduinoV2Board.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/NetworkProtocol.c Source/Terminal.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/BootloaderProtocol.c Source/crc32.c Source/VolumeTransducer.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/Source/ChaletduinoV2Board.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/BootloaderProtocol.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/VolumeTransducer.o +POSSIBLE_DEPFILES=${OBJECTDIR}/Source/ChaletduinoV2Board.o.d ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d ${OBJECTDIR}/Source/DigitalIO.o.d ${OBJECTDIR}/Source/NetworkProtocol.o.d ${OBJECTDIR}/Source/Terminal.o.d ${OBJECTDIR}/Source/Util.o.d ${OBJECTDIR}/Source/exceptions.o.d ${OBJECTDIR}/Source/interrupts.o.d ${OBJECTDIR}/Source/main.o.d ${OBJECTDIR}/Source/system.o.d ${OBJECTDIR}/Source/template.o.d ${OBJECTDIR}/Source/timer.o.d ${OBJECTDIR}/Source/WiFiCtrl.o.d ${OBJECTDIR}/Source/SPI.o.d ${OBJECTDIR}/Source/SPI_Flash.o.d ${OBJECTDIR}/Source/Syslog.o.d ${OBJECTDIR}/Source/Watchdog.o.d ${OBJECTDIR}/Source/BootloaderInterface.o.d ${OBJECTDIR}/Source/BootloaderProtocol.o.d ${OBJECTDIR}/Source/crc32.o.d ${OBJECTDIR}/Source/VolumeTransducer.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/Source/ChaletduinoV2Board.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/BootloaderProtocol.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/VolumeTransducer.o + +# Source Files +SOURCEFILES=Source/ChaletduinoV2Board.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/NetworkProtocol.c Source/Terminal.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/BootloaderProtocol.c Source/crc32.c Source/VolumeTransducer.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-ChaletDuinoV2_795F512H_.mk ${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=32MX795F512H +MP_LINKER_FILE_OPTION=,--script="elf32pic32mx.x" +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/Source/ChaletduinoV2Board.o: Source/ChaletduinoV2Board.c .generated_files/flags/ChaletDuinoV2_795F512H_/ea0177c03d652f90f36aebfb54891e31a43aff4e .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" -o ${OBJECTDIR}/Source/ChaletduinoV2Board.o Source/ChaletduinoV2Board.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c .generated_files/flags/ChaletDuinoV2_795F512H_/75f49f62adf1bc879f508d1e6760ef1d38f42ea9 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/2b9e3461898372f45c52171b9d0cc541608aa693 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c .generated_files/flags/ChaletDuinoV2_795F512H_/d96fb68049ac3e8d78c8f36ecb63847d376f7f38 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c .generated_files/flags/ChaletDuinoV2_795F512H_/c387ea70b73cd042994093e4955dd7f44720c3c0 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c .generated_files/flags/ChaletDuinoV2_795F512H_/a9f871d0189d8e6f3709d9cb137f772b9f05927e .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c .generated_files/flags/ChaletDuinoV2_795F512H_/2e363ec71dd36f823eca952d1317df8f04f213e6 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c .generated_files/flags/ChaletDuinoV2_795F512H_/16efc202dae433d3856688ab0b42b9b42ce27a7 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c .generated_files/flags/ChaletDuinoV2_795F512H_/3915cb001f0eb54d43f7d5b3369565f31fe392c3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c .generated_files/flags/ChaletDuinoV2_795F512H_/9c4a3ad6685403a01952d5f764417b823c88a209 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c .generated_files/flags/ChaletDuinoV2_795F512H_/869c1970a51216000efcbbbf20d73509d90dd6c4 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c .generated_files/flags/ChaletDuinoV2_795F512H_/6382d60d7109d6bebde4262114baa99951d5a66 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c .generated_files/flags/ChaletDuinoV2_795F512H_/b94e0b5cf9d023126f26304ce2e15ab3e7058c44 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c .generated_files/flags/ChaletDuinoV2_795F512H_/df38d20c6f69367b05a1f9ba6aba43236260d722 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c .generated_files/flags/ChaletDuinoV2_795F512H_/1602d4e921e51e062b51f2ee2b7753f49115b306 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/99a713d37289d4360b5fc4e2aaa27a2ac23ca732 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c .generated_files/flags/ChaletDuinoV2_795F512H_/9a8afe855b71b0a0b5425fe01c098b3d006d4853 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c .generated_files/flags/ChaletDuinoV2_795F512H_/9940dffc919eca065999520d9c3ec65d9e6da115 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c .generated_files/flags/ChaletDuinoV2_795F512H_/86d1fd3989ddb34dc7033cae17fb576f46abcf1c .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Util.o: Source/Util.c .generated_files/flags/ChaletDuinoV2_795F512H_/742bca3c0d5d96e464958d16049e9c860f8d4db6 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c .generated_files/flags/ChaletDuinoV2_795F512H_/48a610fb11bd8350ba66be20f98c8b534a9cd061 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c .generated_files/flags/ChaletDuinoV2_795F512H_/4db21999b3de567ac118f1373648603a9fc03ae8 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/main.o: Source/main.c .generated_files/flags/ChaletDuinoV2_795F512H_/d38bf4b642ae25a0c50dc439ca34c55e678b92e8 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/system.o: Source/system.c .generated_files/flags/ChaletDuinoV2_795F512H_/40552fb7a32385b66fd527135f71b22173a9c507 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/template.o: Source/template.c .generated_files/flags/ChaletDuinoV2_795F512H_/76612b6229b7b2d11559f99850017c359d93b40b .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/timer.o: Source/timer.c .generated_files/flags/ChaletDuinoV2_795F512H_/e2335418dbd424c155e30ce9b6ea87f607856e22 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c .generated_files/flags/ChaletDuinoV2_795F512H_/cc2832952091c3b73c75e713b1dbcc45240d2a5f .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c .generated_files/flags/ChaletDuinoV2_795F512H_/5cb0996a1cecdbf405ccea2a075b7989280e6a93 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/5c2bc86b9dc75abf2e85e46dec8636c6460cf085 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c .generated_files/flags/ChaletDuinoV2_795F512H_/8e29483e572e869218b97e67cb5a9f2ebb167b12 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c .generated_files/flags/ChaletDuinoV2_795F512H_/97f6f7adb5d6edf4a6f048cf0b88138ec387e360 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c .generated_files/flags/ChaletDuinoV2_795F512H_/22694ae7e3a2c8a3850dc4db8bcb96698d7177b .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderProtocol.o: Source/BootloaderProtocol.c .generated_files/flags/ChaletDuinoV2_795F512H_/1ccbdca9f4ec115548bfcddfd19c12338f629e5e .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderProtocol.o.d" -o ${OBJECTDIR}/Source/BootloaderProtocol.o Source/BootloaderProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c .generated_files/flags/ChaletDuinoV2_795F512H_/c6d90cdceff6f8a0f40792a5045b16a6e686a3d4 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/VolumeTransducer.o: Source/VolumeTransducer.c .generated_files/flags/ChaletDuinoV2_795F512H_/ee06be021bd0b70b3ff15d21c8544b78829d2cc9 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/VolumeTransducer.o.d + @${RM} ${OBJECTDIR}/Source/VolumeTransducer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/VolumeTransducer.o.d" -o ${OBJECTDIR}/Source/VolumeTransducer.o Source/VolumeTransducer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +else +${OBJECTDIR}/Source/ChaletduinoV2Board.o: Source/ChaletduinoV2Board.c .generated_files/flags/ChaletDuinoV2_795F512H_/155eb6acafee7b16d4a84f7fa101fd44ca9797a8 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" -o ${OBJECTDIR}/Source/ChaletduinoV2Board.o Source/ChaletduinoV2Board.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c .generated_files/flags/ChaletDuinoV2_795F512H_/dbc42104fb043babfd0e129c23f1f36c728794d .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/58efaad0a9a8d1c4cb7f36e9559122026a24d5db .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c .generated_files/flags/ChaletDuinoV2_795F512H_/c3da9ce09cca3e132490f7a89a1f6a009e5aab4b .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c .generated_files/flags/ChaletDuinoV2_795F512H_/69c9bfebb7824873fd4b6c8dedb310bb59c7091c .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c .generated_files/flags/ChaletDuinoV2_795F512H_/79b8e1a7f418feb5e9751c7c5950abe6291ed80e .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c .generated_files/flags/ChaletDuinoV2_795F512H_/f9d0d497d04cbfd967a06629ad890450ee9e9a07 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c .generated_files/flags/ChaletDuinoV2_795F512H_/43f35d29d9017868f211756417a5b631e37df3c9 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c .generated_files/flags/ChaletDuinoV2_795F512H_/7fb74e74f031e8c57148387f8da89ab63c421fff .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c .generated_files/flags/ChaletDuinoV2_795F512H_/94ad646e053ba7000799ad26eceb009933d79e25 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c .generated_files/flags/ChaletDuinoV2_795F512H_/6fd7f06d3a414f57693c34fde4fa83ddfa942ef1 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c .generated_files/flags/ChaletDuinoV2_795F512H_/265d6e0b48fd001909238010b00ed95bfe8e905f .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c .generated_files/flags/ChaletDuinoV2_795F512H_/64df684859a369e5eccabee1d5bab099d5fbf8e2 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c .generated_files/flags/ChaletDuinoV2_795F512H_/674eba27877297e3ffea5ca4f365497f809617dd .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c .generated_files/flags/ChaletDuinoV2_795F512H_/4f4031b973563807c0ba0cc9e18c395671b92003 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/12dca7b21b643f1dfbdef6c54303a09619673750 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c .generated_files/flags/ChaletDuinoV2_795F512H_/2b75790a87ea16476a3c6bb90638a6b669a8ca45 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c .generated_files/flags/ChaletDuinoV2_795F512H_/eddf72a1c6099783f295bce79f8461e408130691 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c .generated_files/flags/ChaletDuinoV2_795F512H_/dc752be1ffe54a93a8f6bf4fa1c4fe02a13348c3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Util.o: Source/Util.c .generated_files/flags/ChaletDuinoV2_795F512H_/c7a9c6ebc29355283c13b74a4aa9249d5a25c56e .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c .generated_files/flags/ChaletDuinoV2_795F512H_/3cb45db0d440dd071e30800a01a075a6e0f1d8d1 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c .generated_files/flags/ChaletDuinoV2_795F512H_/45645d405d43d7701268167ed952ffd038a0e8e2 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/main.o: Source/main.c .generated_files/flags/ChaletDuinoV2_795F512H_/b4bfc2a7214329529e9aa47e9597ac7722caa4b .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/system.o: Source/system.c .generated_files/flags/ChaletDuinoV2_795F512H_/dc29332267b820c9892bf737817b789cfffa28e3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/template.o: Source/template.c .generated_files/flags/ChaletDuinoV2_795F512H_/5c9e25251ad015689682a37a36b0509de776461c .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/timer.o: Source/timer.c .generated_files/flags/ChaletDuinoV2_795F512H_/75d67935f12e10a82d5a9a3f931b66a6f24208d3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c .generated_files/flags/ChaletDuinoV2_795F512H_/8607df3a7ee3db91e625f18639b9c67243b0ca97 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c .generated_files/flags/ChaletDuinoV2_795F512H_/c6c4e18499dd38482896ce4989420e161475ff81 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c .generated_files/flags/ChaletDuinoV2_795F512H_/a7fa11fb515fb4290ab75afe9df86b6d273ecace .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c .generated_files/flags/ChaletDuinoV2_795F512H_/48ef6f4fd644ef835942be1592d1bcd7d8f2fcf9 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c .generated_files/flags/ChaletDuinoV2_795F512H_/7206c2cf8a703af5bb50395f85460f0dfe1adbb3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c .generated_files/flags/ChaletDuinoV2_795F512H_/2b9bc2d49b42ce7279eb340a8a3b474bcea430f0 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderProtocol.o: Source/BootloaderProtocol.c .generated_files/flags/ChaletDuinoV2_795F512H_/5cf706b396545e3c793f30152a8634b78131ceb3 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderProtocol.o.d" -o ${OBJECTDIR}/Source/BootloaderProtocol.o Source/BootloaderProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c .generated_files/flags/ChaletDuinoV2_795F512H_/90a743e31936b21f07bebb71ca9ab613d312000a .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/VolumeTransducer.o: Source/VolumeTransducer.c .generated_files/flags/ChaletDuinoV2_795F512H_/62181e4909a098d0db91ed7eca6d5944e50ab7b5 .generated_files/flags/ChaletDuinoV2_795F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/VolumeTransducer.o.d + @${RM} ${OBJECTDIR}/Source/VolumeTransducer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/VolumeTransducer.o.d" -o ${OBJECTDIR}/Source/VolumeTransducer.o Source/VolumeTransducer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compileCPP +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk elf32pic32mx.x + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_ICD3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC02000:0x1FC02FEF -mreserve=boot@0x1FC02000:0x1FC024FF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_ICD3=1,--defsym=_min_heap_size=128,-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map" + +else +${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk elf32pic32mx.x + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=128,-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map" + ${MP_CC_DIR}\\xc32-bin2hex ${DISTDIR}/AudioConsole.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${OBJECTDIR} + ${RM} -r ${DISTDIR} + +# Enable dependency checking +.dep.inc: .depcheck-impl + +DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/AudioConsole.X/nbproject/Makefile-ChaletDuino_775F512H_.mk b/AudioConsole.X/nbproject/Makefile-ChaletDuino_775F512H_.mk new file mode 100644 index 0000000..302e7fa --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-ChaletDuino_775F512H_.mk @@ -0,0 +1,698 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-ChaletDuino_775F512H_.mk)" "nbproject/Makefile-local-ChaletDuino_775F512H_.mk" +include nbproject/Makefile-local-ChaletDuino_775F512H_.mk +endif +endif + +# Environment +MKDIR=gnumkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=ChaletDuino_775F512H_ +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD= +else +COMPARISON_BUILD= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=Source/ChaletduinoBoard.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/InternalUart.c Source/NetworkProtocol.c Source/Terminal.c Source/Uart.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/ChaletPowerRelay.c Source/HarakiriRelay.c Source/BatteryMonitor.c Source/ina219.c Source/I2C.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/TemperatureSensor.c Source/TC77.c Source/crc32.c Source/LoraWatchdog.c Source/hd44780.c Source/LCDCtrl.c Source/LoraNetworkInterface.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/Source/ChaletduinoBoard.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/InternalUart.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Uart.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/ChaletPowerRelay.o ${OBJECTDIR}/Source/HarakiriRelay.o ${OBJECTDIR}/Source/BatteryMonitor.o ${OBJECTDIR}/Source/ina219.o ${OBJECTDIR}/Source/I2C.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/TemperatureSensor.o ${OBJECTDIR}/Source/TC77.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/LoraWatchdog.o ${OBJECTDIR}/Source/hd44780.o ${OBJECTDIR}/Source/LCDCtrl.o ${OBJECTDIR}/Source/LoraNetworkInterface.o +POSSIBLE_DEPFILES=${OBJECTDIR}/Source/ChaletduinoBoard.o.d ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d ${OBJECTDIR}/Source/DigitalIO.o.d ${OBJECTDIR}/Source/InternalUart.o.d ${OBJECTDIR}/Source/NetworkProtocol.o.d ${OBJECTDIR}/Source/Terminal.o.d ${OBJECTDIR}/Source/Uart.o.d ${OBJECTDIR}/Source/Util.o.d ${OBJECTDIR}/Source/exceptions.o.d ${OBJECTDIR}/Source/interrupts.o.d ${OBJECTDIR}/Source/main.o.d ${OBJECTDIR}/Source/system.o.d ${OBJECTDIR}/Source/template.o.d ${OBJECTDIR}/Source/timer.o.d ${OBJECTDIR}/Source/WiFiCtrl.o.d ${OBJECTDIR}/Source/SPI.o.d ${OBJECTDIR}/Source/ChaletPowerRelay.o.d ${OBJECTDIR}/Source/HarakiriRelay.o.d ${OBJECTDIR}/Source/BatteryMonitor.o.d ${OBJECTDIR}/Source/ina219.o.d ${OBJECTDIR}/Source/I2C.o.d ${OBJECTDIR}/Source/SPI_Flash.o.d ${OBJECTDIR}/Source/Syslog.o.d ${OBJECTDIR}/Source/Watchdog.o.d ${OBJECTDIR}/Source/BootloaderInterface.o.d ${OBJECTDIR}/Source/TemperatureSensor.o.d ${OBJECTDIR}/Source/TC77.o.d ${OBJECTDIR}/Source/crc32.o.d ${OBJECTDIR}/Source/LoraWatchdog.o.d ${OBJECTDIR}/Source/hd44780.o.d ${OBJECTDIR}/Source/LCDCtrl.o.d ${OBJECTDIR}/Source/LoraNetworkInterface.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/Source/ChaletduinoBoard.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/InternalUart.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Uart.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/ChaletPowerRelay.o ${OBJECTDIR}/Source/HarakiriRelay.o ${OBJECTDIR}/Source/BatteryMonitor.o ${OBJECTDIR}/Source/ina219.o ${OBJECTDIR}/Source/I2C.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/TemperatureSensor.o ${OBJECTDIR}/Source/TC77.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/LoraWatchdog.o ${OBJECTDIR}/Source/hd44780.o ${OBJECTDIR}/Source/LCDCtrl.o ${OBJECTDIR}/Source/LoraNetworkInterface.o + +# Source Files +SOURCEFILES=Source/ChaletduinoBoard.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/InternalUart.c Source/NetworkProtocol.c Source/Terminal.c Source/Uart.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/ChaletPowerRelay.c Source/HarakiriRelay.c Source/BatteryMonitor.c Source/ina219.c Source/I2C.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/TemperatureSensor.c Source/TC77.c Source/crc32.c Source/LoraWatchdog.c Source/hd44780.c Source/LCDCtrl.c Source/LoraNetworkInterface.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-ChaletDuino_775F512H_.mk ${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=32MX795F512H +MP_LINKER_FILE_OPTION=,--script="procdefs.ld" +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/Source/ChaletduinoBoard.o: Source/ChaletduinoBoard.c .generated_files/flags/ChaletDuino_775F512H_/a0ddfbe151c7c769485b2fdcbbee9c0094067c .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoBoard.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoBoard.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletduinoBoard.o.d" -o ${OBJECTDIR}/Source/ChaletduinoBoard.o Source/ChaletduinoBoard.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c .generated_files/flags/ChaletDuino_775F512H_/aab071606b7599af65057f438abb88e5c2b544a7 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c .generated_files/flags/ChaletDuino_775F512H_/8dabf7fbf0089734886f35dfc922d123dc025a3a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c .generated_files/flags/ChaletDuino_775F512H_/7235887b8b93290aef5df57423e628dabdb751ca .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c .generated_files/flags/ChaletDuino_775F512H_/f17ccb8c36cf30fea5afbc749d8c60cd565dc2c8 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c .generated_files/flags/ChaletDuino_775F512H_/180b86aaf6486d25599a253fea71bc46ca506ba3 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c .generated_files/flags/ChaletDuino_775F512H_/cc5c84abe2602ff3c23ffa909e427a8fd770a6d8 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c .generated_files/flags/ChaletDuino_775F512H_/43052c09f6a893f678828c3692140386130adb70 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c .generated_files/flags/ChaletDuino_775F512H_/1f642cb39aec32c0a5d4c14c3503a554f89a2d68 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c .generated_files/flags/ChaletDuino_775F512H_/ead803b9a36edbcec106729141a99dfe12b6371 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c .generated_files/flags/ChaletDuino_775F512H_/4dc715206bf544359cb2ddd372019fc135357ed5 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c .generated_files/flags/ChaletDuino_775F512H_/d05edf191fc15bff274c0092b9e977a38e1e135a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c .generated_files/flags/ChaletDuino_775F512H_/ed2349e9ac1827fbd803732e1092a7ece36caedd .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c .generated_files/flags/ChaletDuino_775F512H_/883b7ed1a9e7f16ae71bb6e296f42d30cdee7884 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c .generated_files/flags/ChaletDuino_775F512H_/c71b230bb642181928c0da937341e166a4b56c8e .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c .generated_files/flags/ChaletDuino_775F512H_/1e5f41c96ad6d8a4657960452e11313734e70e7f .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c .generated_files/flags/ChaletDuino_775F512H_/291ce500b5d42235f17e66ef1ff99808304dfd6 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/InternalUart.o: Source/InternalUart.c .generated_files/flags/ChaletDuino_775F512H_/57e4c8ba4f5b4ba6c0c48c150e852e02ca29677d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/InternalUart.o.d + @${RM} ${OBJECTDIR}/Source/InternalUart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/InternalUart.o.d" -o ${OBJECTDIR}/Source/InternalUart.o Source/InternalUart.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c .generated_files/flags/ChaletDuino_775F512H_/92f9a9055cbfee5c7de9bcf9279a39887dc5851f .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c .generated_files/flags/ChaletDuino_775F512H_/9b7772f7e9103c1b769f42b1befd41038e8e6e91 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Uart.o: Source/Uart.c .generated_files/flags/ChaletDuino_775F512H_/82d739cd400769ba3fc191aca39b55bd18cdc3fb .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Uart.o.d + @${RM} ${OBJECTDIR}/Source/Uart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Uart.o.d" -o ${OBJECTDIR}/Source/Uart.o Source/Uart.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Util.o: Source/Util.c .generated_files/flags/ChaletDuino_775F512H_/1bc563f09bdaeaf9fd4dc742168060352f0b945a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c .generated_files/flags/ChaletDuino_775F512H_/b0ee46e7ad6b60130269edb928dfb7b08ad1a566 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c .generated_files/flags/ChaletDuino_775F512H_/851bb5ef52da7e4ae8d866e8348aa457c856140f .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/main.o: Source/main.c .generated_files/flags/ChaletDuino_775F512H_/29989dc72765fd5ecc01c2351e26a8ed770bfcb6 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/system.o: Source/system.c .generated_files/flags/ChaletDuino_775F512H_/600c19f00ceb51447bd6d9bab4a04540982e7a5a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/template.o: Source/template.c .generated_files/flags/ChaletDuino_775F512H_/14e4c74226cc2dc4bceb53296615a178a0509190 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/timer.o: Source/timer.c .generated_files/flags/ChaletDuino_775F512H_/5e071eb2c40ce66615abd33d763cd2b0e6cefc72 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c .generated_files/flags/ChaletDuino_775F512H_/25429cc23845e2b33847eeb96114ffa6bb0ae451 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c .generated_files/flags/ChaletDuino_775F512H_/90fa9ae879ab9a6bb97e937e6db5047770645dfb .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/ChaletPowerRelay.o: Source/ChaletPowerRelay.c .generated_files/flags/ChaletDuino_775F512H_/2e00c70a848ca480a75de3131fa624c992da2c52 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o.d + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" -o ${OBJECTDIR}/Source/ChaletPowerRelay.o Source/ChaletPowerRelay.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/HarakiriRelay.o: Source/HarakiriRelay.c .generated_files/flags/ChaletDuino_775F512H_/bc69b11d2787ae5dcb6804bd38bec073e2921d02 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o.d + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/HarakiriRelay.o.d" -o ${OBJECTDIR}/Source/HarakiriRelay.o Source/HarakiriRelay.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BatteryMonitor.o: Source/BatteryMonitor.c .generated_files/flags/ChaletDuino_775F512H_/fe5af6b32aab3709e545d94fc8a5887b87ea35e1 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o.d + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BatteryMonitor.o.d" -o ${OBJECTDIR}/Source/BatteryMonitor.o Source/BatteryMonitor.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/ina219.o: Source/ina219.c .generated_files/flags/ChaletDuino_775F512H_/21e0caed0b7141d5926a503ac1b61713600d054f .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ina219.o.d + @${RM} ${OBJECTDIR}/Source/ina219.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ina219.o.d" -o ${OBJECTDIR}/Source/ina219.o Source/ina219.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/I2C.o: Source/I2C.c .generated_files/flags/ChaletDuino_775F512H_/5383fad3c8bce723e51b8d7f02af203c5fcf93ad .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/I2C.o.d + @${RM} ${OBJECTDIR}/Source/I2C.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/I2C.o.d" -o ${OBJECTDIR}/Source/I2C.o Source/I2C.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c .generated_files/flags/ChaletDuino_775F512H_/b4701870d8efa440d6be7fe1f87e5a5f788162fd .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c .generated_files/flags/ChaletDuino_775F512H_/437334a7e456d98717c81c626a962fe71e7eea5a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c .generated_files/flags/ChaletDuino_775F512H_/55e94512dc159fb4619628f0eb9565db3ec6e8fd .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c .generated_files/flags/ChaletDuino_775F512H_/4794278e987d79e96642df04fa27504e6f01cce7 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/TemperatureSensor.o: Source/TemperatureSensor.c .generated_files/flags/ChaletDuino_775F512H_/41b055a4acdcead9931858ffb5dd50cb64e70579 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o.d + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/TemperatureSensor.o.d" -o ${OBJECTDIR}/Source/TemperatureSensor.o Source/TemperatureSensor.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/TC77.o: Source/TC77.c .generated_files/flags/ChaletDuino_775F512H_/fe98092c7d55c0105bb075ebbf9f9a6c7cc259db .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TC77.o.d + @${RM} ${OBJECTDIR}/Source/TC77.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/TC77.o.d" -o ${OBJECTDIR}/Source/TC77.o Source/TC77.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c .generated_files/flags/ChaletDuino_775F512H_/12954c57b2e155c5ec4a4440409b8d9e058eb83a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LoraWatchdog.o: Source/LoraWatchdog.c .generated_files/flags/ChaletDuino_775F512H_/c1917b32ae5aac4138ef2318a402c7bf6623456e .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o.d + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LoraWatchdog.o.d" -o ${OBJECTDIR}/Source/LoraWatchdog.o Source/LoraWatchdog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/hd44780.o: Source/hd44780.c .generated_files/flags/ChaletDuino_775F512H_/6e033d8bb9fdff07618f9f08352fe173abc76ac8 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/hd44780.o.d + @${RM} ${OBJECTDIR}/Source/hd44780.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/hd44780.o.d" -o ${OBJECTDIR}/Source/hd44780.o Source/hd44780.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LCDCtrl.o: Source/LCDCtrl.c .generated_files/flags/ChaletDuino_775F512H_/1c7a4a91daa77e40b9c31f4e8ab5c55ec1b397d7 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LCDCtrl.o.d + @${RM} ${OBJECTDIR}/Source/LCDCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LCDCtrl.o.d" -o ${OBJECTDIR}/Source/LCDCtrl.o Source/LCDCtrl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LoraNetworkInterface.o: Source/LoraNetworkInterface.c .generated_files/flags/ChaletDuino_775F512H_/a2cebe01d2821c3ca4817ca3ed974e6c8522803b .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o.d + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" -o ${OBJECTDIR}/Source/LoraNetworkInterface.o Source/LoraNetworkInterface.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +else +${OBJECTDIR}/Source/ChaletduinoBoard.o: Source/ChaletduinoBoard.c .generated_files/flags/ChaletDuino_775F512H_/c4f8162c5763dd0894ed9298835580f519baa98f .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoBoard.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoBoard.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletduinoBoard.o.d" -o ${OBJECTDIR}/Source/ChaletduinoBoard.o Source/ChaletduinoBoard.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c .generated_files/flags/ChaletDuino_775F512H_/497d713bf320e4d1f59f60e9777cb391b17c3dec .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c .generated_files/flags/ChaletDuino_775F512H_/721688482cf6c2066fa3650ad18a235008201551 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c .generated_files/flags/ChaletDuino_775F512H_/37b2ffa60e43e627a242de61899909c36bd09b68 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c .generated_files/flags/ChaletDuino_775F512H_/2a171cb896110a8eb198d70afc7113ac3ff8548c .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c .generated_files/flags/ChaletDuino_775F512H_/9cd362d5043053e09cb23fde5ad69c9c5c9afb8e .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c .generated_files/flags/ChaletDuino_775F512H_/a420785c06c2bbbdbe314bb179321071e33176e4 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c .generated_files/flags/ChaletDuino_775F512H_/698761c85ae41c14fffb81d7778c0eb1b529467d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c .generated_files/flags/ChaletDuino_775F512H_/66fa95fdb6c7f032bc6af919c450c08c9337893a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c .generated_files/flags/ChaletDuino_775F512H_/c20a42e4a886b04862f5c8d6c975a938c9f69c74 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c .generated_files/flags/ChaletDuino_775F512H_/9c808a66ad1187f03c30dc5bf28691b94c97328d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c .generated_files/flags/ChaletDuino_775F512H_/b55554364ef808436e2e8ce33a6488f7694cbee6 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c .generated_files/flags/ChaletDuino_775F512H_/2613105d98a9fd3fe5392a8091bf8a397858aad5 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c .generated_files/flags/ChaletDuino_775F512H_/1fe3d205e1674fb3e6941f18b5d82411b748b6b6 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c .generated_files/flags/ChaletDuino_775F512H_/e837131cf09fb24960f8e486e62b9d574f68b7ec .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c .generated_files/flags/ChaletDuino_775F512H_/64d0ddb1fe2c87b7d4781ed9a70807fdab1bf70b .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c .generated_files/flags/ChaletDuino_775F512H_/c053c123489ba83ba5c779b68dfede5bb83bea90 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/InternalUart.o: Source/InternalUart.c .generated_files/flags/ChaletDuino_775F512H_/e9387010dd01355540b899de1925e31e5848689e .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/InternalUart.o.d + @${RM} ${OBJECTDIR}/Source/InternalUart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/InternalUart.o.d" -o ${OBJECTDIR}/Source/InternalUart.o Source/InternalUart.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c .generated_files/flags/ChaletDuino_775F512H_/55d17994ae5b2f4899707f331124443a35dd62a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c .generated_files/flags/ChaletDuino_775F512H_/64d80732bad376f880c844d75a34ad0520db72fb .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Uart.o: Source/Uart.c .generated_files/flags/ChaletDuino_775F512H_/67a12e8958f7dffeef7098f5d158bc7cae2f329d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Uart.o.d + @${RM} ${OBJECTDIR}/Source/Uart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Uart.o.d" -o ${OBJECTDIR}/Source/Uart.o Source/Uart.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Util.o: Source/Util.c .generated_files/flags/ChaletDuino_775F512H_/a28875c10745f113497230e132443e4029cab753 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c .generated_files/flags/ChaletDuino_775F512H_/8f3b9ff17d92498d3fd94aff8eb1e0b3288a1b64 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c .generated_files/flags/ChaletDuino_775F512H_/24f99bb7523a02e74d4e5d4eff8575595891a0b5 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/main.o: Source/main.c .generated_files/flags/ChaletDuino_775F512H_/b31392ea171dce74e1b5855c892d974a2ca47b53 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/system.o: Source/system.c .generated_files/flags/ChaletDuino_775F512H_/aa608671445290a42d418528d1f9e29017561022 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/template.o: Source/template.c .generated_files/flags/ChaletDuino_775F512H_/f904a81f2b89a410abdcf89ab6f7a15e304d5095 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/timer.o: Source/timer.c .generated_files/flags/ChaletDuino_775F512H_/bfc8f6f32a28aadc4d9d01f1ea8297bdb70f71e3 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c .generated_files/flags/ChaletDuino_775F512H_/c41f818787946113f33503118ee777c2f874f5d1 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c .generated_files/flags/ChaletDuino_775F512H_/a6a83f619f7bb4d7a5bf8a89ef28fb8f89381431 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/ChaletPowerRelay.o: Source/ChaletPowerRelay.c .generated_files/flags/ChaletDuino_775F512H_/2e73b3220fef8b22c6edf306a9c50e37c4da6881 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o.d + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" -o ${OBJECTDIR}/Source/ChaletPowerRelay.o Source/ChaletPowerRelay.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/HarakiriRelay.o: Source/HarakiriRelay.c .generated_files/flags/ChaletDuino_775F512H_/ac72d3b9c5791a868311c6eccb84086555c6bd5a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o.d + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/HarakiriRelay.o.d" -o ${OBJECTDIR}/Source/HarakiriRelay.o Source/HarakiriRelay.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BatteryMonitor.o: Source/BatteryMonitor.c .generated_files/flags/ChaletDuino_775F512H_/2326370deedcf3d8c1b9e6e3ee8c4dee9cd287f6 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o.d + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BatteryMonitor.o.d" -o ${OBJECTDIR}/Source/BatteryMonitor.o Source/BatteryMonitor.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/ina219.o: Source/ina219.c .generated_files/flags/ChaletDuino_775F512H_/3e683355f0d6db4d0a3b80dbe4bee790c4e37b14 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ina219.o.d + @${RM} ${OBJECTDIR}/Source/ina219.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/ina219.o.d" -o ${OBJECTDIR}/Source/ina219.o Source/ina219.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/I2C.o: Source/I2C.c .generated_files/flags/ChaletDuino_775F512H_/1ec01ffbdc33183b158b5a29787ca10bda4bc9d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/I2C.o.d + @${RM} ${OBJECTDIR}/Source/I2C.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/I2C.o.d" -o ${OBJECTDIR}/Source/I2C.o Source/I2C.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c .generated_files/flags/ChaletDuino_775F512H_/7d87e98bde396cc0e7a72816fa5b482a75f8d0d0 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c .generated_files/flags/ChaletDuino_775F512H_/680865695eb8e6d76d15aeb0608f987227dd0cd8 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c .generated_files/flags/ChaletDuino_775F512H_/4a0ddab397803f8fe9762b33e0f2c917afb7a37 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c .generated_files/flags/ChaletDuino_775F512H_/f588a6133c3bb16ecd14934b3aacf55f69eb094d .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/TemperatureSensor.o: Source/TemperatureSensor.c .generated_files/flags/ChaletDuino_775F512H_/cf08499ad7826b93dbfcf7cae9b1bf885ed54b43 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o.d + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/TemperatureSensor.o.d" -o ${OBJECTDIR}/Source/TemperatureSensor.o Source/TemperatureSensor.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/TC77.o: Source/TC77.c .generated_files/flags/ChaletDuino_775F512H_/31d9b95a87c063c78cc34c1c7e7944f437a8f340 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TC77.o.d + @${RM} ${OBJECTDIR}/Source/TC77.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/TC77.o.d" -o ${OBJECTDIR}/Source/TC77.o Source/TC77.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c .generated_files/flags/ChaletDuino_775F512H_/cd99ad981a84f1514a7ad13a1940f32d8720ccd5 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LoraWatchdog.o: Source/LoraWatchdog.c .generated_files/flags/ChaletDuino_775F512H_/d8f6c8f83ea085f5af64a68eb7f4712e472c678a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o.d + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LoraWatchdog.o.d" -o ${OBJECTDIR}/Source/LoraWatchdog.o Source/LoraWatchdog.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/hd44780.o: Source/hd44780.c .generated_files/flags/ChaletDuino_775F512H_/ac0e8657c047b8b8f6beb02dc256e2176df6176 .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/hd44780.o.d + @${RM} ${OBJECTDIR}/Source/hd44780.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/hd44780.o.d" -o ${OBJECTDIR}/Source/hd44780.o Source/hd44780.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LCDCtrl.o: Source/LCDCtrl.c .generated_files/flags/ChaletDuino_775F512H_/762e0e872399c7d70818c62127bb8ce18c1bf5a .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LCDCtrl.o.d + @${RM} ${OBJECTDIR}/Source/LCDCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LCDCtrl.o.d" -o ${OBJECTDIR}/Source/LCDCtrl.o Source/LCDCtrl.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +${OBJECTDIR}/Source/LoraNetworkInterface.o: Source/LoraNetworkInterface.c .generated_files/flags/ChaletDuino_775F512H_/457ae3033439448e919a18cea4adc1d2eaa099df .generated_files/flags/ChaletDuino_775F512H_/da39a3ee5e6b4b0d3255bfef95601890afd80709 + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o.d + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source/winc3400" -I"Source" -DCHALETDUINO_BRD -D_SUPPRESS_PLIB_WARNING -MP -MMD -MF "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" -o ${OBJECTDIR}/Source/LoraNetworkInterface.o Source/LoraNetworkInterface.c -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compileCPP +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk procdefs.ld + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_ICD3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_ICD3=1 + +else +${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk procdefs.ld + @${MKDIR} ${DISTDIR} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuino_775F512H_=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION) + ${MP_CC_DIR}\\xc32-bin2hex ${DISTDIR}/ChaletLora.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${OBJECTDIR} + ${RM} -r ${DISTDIR} + +# Enable dependency checking +.dep.inc: .depcheck-impl + +DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/AudioConsole.X/nbproject/Makefile-genesis.properties b/AudioConsole.X/nbproject/Makefile-genesis.properties new file mode 100644 index 0000000..7db62a1 --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-genesis.properties @@ -0,0 +1,23 @@ +# +#Sat Feb 15 09:25:53 EST 2025 +ChaletDuinoV2_795F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin +default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin +proj.dir=D\:\\Main\\PicDev\\Projets\\AudioConsole\\AudioConsole.X +com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=bcd6e5453a11ce86aaffd5305e838602 +ChaletDuinoV2_795F512H_.com-microchip-mplab-mdbcore-ICD3Tool-ICD3DbgToolManager.md5=b8062f7a3afd14c7a6d50c4bb4696d24 +default.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=de2d3bc95a22a3f432c2e39f49efafbc +default.com-microchip-mplab-mdbcore-ICD3Tool-ICD3DbgToolManager.md5=b8062f7a3afd14c7a6d50c4bb4696d24 +configurations-xml=4a5e2e18a343946ed826a5d2147db378 +ChaletDuino_775F512H_.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=de2d3bc95a22a3f432c2e39f49efafbc +host.platform=windows +ChaletDuinoV2_795F512H_.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=de2d3bc95a22a3f432c2e39f49efafbc +ChaletDuinoV2_795F512H_.Pack.dfplocation=C\:\\Users\\JF\\.mchp_packs\\Microchip\\PIC32MX_DFP\\1.3.231 +ChaletDuino_775F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin +host.id=1ig4-46sv-sm +conf.ids=default,ChaletDuino_775F512H_,ChaletDuinoV2_795F512H_ +default.languagetoolchain.version=1.33 +ChaletDuinoV2_795F512H_.languagetoolchain.version=1.33 +ChaletDuino_775F512H_.Pack.dfplocation=C\:\\Users\\JF\\.mchp_packs\\Microchip\\PIC32MX_DFP\\1.3.231 +ChaletDuino_775F512H_.com-microchip-mplab-mdbcore-ICD3Tool-ICD3DbgToolManager.md5=b8062f7a3afd14c7a6d50c4bb4696d24 +default.Pack.dfplocation=C\:\\Users\\JF\\.mchp_packs\\Microchip\\PIC32MX_DFP\\1.2.228 +ChaletDuino_775F512H_.languagetoolchain.version=1.33 diff --git a/AudioConsole.X/nbproject/Makefile-impl.mk b/AudioConsole.X/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..1c2fe23 --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-impl.mk @@ -0,0 +1,73 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=AudioConsole.X + +# Active Configuration +DEFAULTCONF=ChaletDuinoV2_795F512H_ +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=default ChaletDuino_775F512H_ ChaletDuinoV2_795F512H_ + + +# build +.build-impl: .build-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuino_775F512H_ clean + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuinoV2_795F512H_ clean + + + +# all +.all-impl: .all-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuino_775F512H_ build + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuinoV2_795F512H_ build + + + +# dependency checking support +.depcheck-impl: +# @echo "# This code depends on make tool being used" >.dep.inc +# @if [ -n "${MAKE_VERSION}" ]; then \ +# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ +# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ +# echo "include \$${DEPFILES}" >>.dep.inc; \ +# echo "endif" >>.dep.inc; \ +# else \ +# echo ".KEEP_STATE:" >>.dep.inc; \ +# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ +# fi diff --git a/AudioConsole.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk b/AudioConsole.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk new file mode 100644 index 0000000..450e02c --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk @@ -0,0 +1,37 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +SHELL=cmd.exe +PATH_TO_IDE_BIN=C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="C:\Program Files\Microchip\MPLABX\v6.05\sys\java\zulu8.64.0.19-ca-fx-jre8.0.345-win_x64/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-gcc.exe" +MP_CPPC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-g++.exe" +# MP_BC is not defined +MP_AS="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-as.exe" +MP_LD="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ld.exe" +MP_AR="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ar.exe" +DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_CPPC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +# MP_BC_DIR is not defined +MP_AS_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_LD_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_AR_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +DFP_DIR=C:/Users/JF/.mchp_packs/Microchip/PIC32MX_DFP/1.3.231 diff --git a/AudioConsole.X/nbproject/Makefile-local-ChaletDuino_775F512H_.mk b/AudioConsole.X/nbproject/Makefile-local-ChaletDuino_775F512H_.mk new file mode 100644 index 0000000..450e02c --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-local-ChaletDuino_775F512H_.mk @@ -0,0 +1,37 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +SHELL=cmd.exe +PATH_TO_IDE_BIN=C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="C:\Program Files\Microchip\MPLABX\v6.05\sys\java\zulu8.64.0.19-ca-fx-jre8.0.345-win_x64/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-gcc.exe" +MP_CPPC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-g++.exe" +# MP_BC is not defined +MP_AS="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-as.exe" +MP_LD="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ld.exe" +MP_AR="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ar.exe" +DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files/Microchip/MPLABX/v6.05/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_CPPC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +# MP_BC_DIR is not defined +MP_AS_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_LD_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_AR_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +DFP_DIR=C:/Users/JF/.mchp_packs/Microchip/PIC32MX_DFP/1.3.231 diff --git a/AudioConsole.X/nbproject/Makefile-variables.mk b/AudioConsole.X/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..83904cd --- /dev/null +++ b/AudioConsole.X/nbproject/Makefile-variables.mk @@ -0,0 +1,18 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +# default configuration +CND_ARTIFACT_DIR_default=dist/default/production +CND_ARTIFACT_NAME_default=AudioConsole.X.production.hex +CND_ARTIFACT_PATH_default=dist/default/production/AudioConsole.X.production.hex +# ChaletDuino_775F512H_ configuration +CND_ARTIFACT_DIR_ChaletDuino_775F512H_=dist/ChaletDuino_775F512H_/production +CND_ARTIFACT_NAME_ChaletDuino_775F512H_=AudioConsole.X.production.hex +CND_ARTIFACT_PATH_ChaletDuino_775F512H_=dist/ChaletDuino_775F512H_/production/AudioConsole.X.production.hex +# ChaletDuinoV2_795F512H_ configuration +CND_ARTIFACT_DIR_ChaletDuinoV2_795F512H_=dist/ChaletDuinoV2_795F512H_/production +CND_ARTIFACT_NAME_ChaletDuinoV2_795F512H_=AudioConsole.X.production.hex +CND_ARTIFACT_PATH_ChaletDuinoV2_795F512H_=dist/ChaletDuinoV2_795F512H_/production/AudioConsole.X.production.hex diff --git a/AudioConsole.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash b/AudioConsole.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash new file mode 100644 index 0000000..4e29d18 --- /dev/null +++ b/AudioConsole.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash @@ -0,0 +1,73 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_CONF=ChaletDuinoV2_795F512H_ +CND_DISTDIR=dist +TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +OUTPUT_BASENAME=ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +PACKAGE_TOP_DIR=chaletlora.x/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/chaletlora.x/bin +copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/package/chaletlora.x.tar +cd ${TMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/chaletlora.x.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/AudioConsole.X/nbproject/Package-ChaletDuino_775F512H_.bash b/AudioConsole.X/nbproject/Package-ChaletDuino_775F512H_.bash new file mode 100644 index 0000000..2375aa3 --- /dev/null +++ b/AudioConsole.X/nbproject/Package-ChaletDuino_775F512H_.bash @@ -0,0 +1,73 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_CONF=ChaletDuino_775F512H_ +CND_DISTDIR=dist +TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +OUTPUT_BASENAME=ChaletLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +PACKAGE_TOP_DIR=chaletlora.x/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/chaletlora.x/bin +copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/package/chaletlora.x.tar +cd ${TMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/chaletlora.x.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/AudioConsole.X/nbproject/configurations.xml b/AudioConsole.X/nbproject/configurations.xml new file mode 100644 index 0000000..4e7a838 --- /dev/null +++ b/AudioConsole.X/nbproject/configurations.xml @@ -0,0 +1,1675 @@ + + + + + + Source/BoardCfg.h + Source/BoardCfg_Chaletduino.h + Source/BoardCfg_Fubarino.h + Source/BoardCfg_Pinguino.h + Source/BoardCfg_ChaletduinoV2.h + + + + + Source/winc3400_142/bsp/include/nm_bsp.h + + + + + Source/winc3400_142/common/include/nm_common.h + Source/winc3400_142/common/include/nm_debug.h + + + + + + + Source/winc3400_142/driver/include/ecc_types.h + Source/winc3400_142/driver/include/m2m_flash.h + Source/winc3400_142/driver/include/m2m_hif.h + Source/winc3400_142/driver/include/m2m_ota.h + Source/winc3400_142/driver/include/m2m_periph.h + Source/winc3400_142/driver/include/m2m_ssl.h + Source/winc3400_142/driver/include/m2m_types.h + Source/winc3400_142/driver/include/m2m_wifi.h + Source/winc3400_142/driver/include/nmasic.h + Source/winc3400_142/driver/include/nmbus.h + Source/winc3400_142/driver/include/nmdrv.h + Source/winc3400_142/driver/include/nmspi.h + + + + + + + Source/winc3400_142/socket/include/m2m_socket_host_if.h + Source/winc3400_142/socket/include/netinet_in.h + Source/winc3400_142/socket/include/socket.h + + + + + + + Source/winc3400_142/spi_flash/include/spi_flash.h + Source/winc3400_142/spi_flash/include/spi_flash_map.h + + + + + + Source/define.h + Source/DigitalIO.h + Source/InternalUart.h + Source/main.h + Source/ProtocolDefs.h + Source/PWMCtrl.h + Source/SPI.h + Source/system.h + Source/Terminal.h + Source/timer.h + Source/Uart.h + Source/Util.h + Source/versionbuild.h + Source/winc1500_config.h + Source/WiFiCtrl.h + Source/winc3400_config.h + Source/SPI_Flash.h + Source/Syslog.h + Source/Watchdog.h + Source/BootloaderInterface.h + Source/BootloaderProtocol.h + Source/FlashMapping.h + Source/checksum.h + Source/ATCmdInterpreter.h + Source/VolumeTransducer.h + + + procdefs.ld + elf32pic32mx.x + + + + Source/FubarinoBoard.c + Source/PinguinoBoard.c + Source/ChaletduinoBoard.c + Source/ChaletduinoV2Board.c + + + + + + + + + + + Source/winc3400_142/common/source/nm_common.c + + + + + + + Source/winc3400_142/driver/source/m2m_flash.c + Source/winc3400_142/driver/source/m2m_hif.c + Source/winc3400_142/driver/source/m2m_ota.c + Source/winc3400_142/driver/source/m2m_periph.c + Source/winc3400_142/driver/source/m2m_ssl.c + Source/winc3400_142/driver/source/m2m_wifi.c + Source/winc3400_142/driver/source/nmasic.c + Source/winc3400_142/driver/source/nmbus.c + Source/winc3400_142/driver/source/nmdrv.c + Source/winc3400_142/driver/source/nmspi.c + + + + + + + Source/winc3400_142/socket/source/inet_addr.c + Source/winc3400_142/socket/source/inet_ntop.c + Source/winc3400_142/socket/source/socket.c + + + + + + + Source/winc3400_142/spi_flash/source/spi_flash.c + + + + Source/DigitalIO.c + Source/InternalUart.c + Source/MasterCtrlInterface.c + Source/NetworkProtocol.c + Source/Terminal.c + Source/Uart.c + Source/Util.c + Source/exceptions.c + Source/interrupts.c + Source/main.c + Source/system.c + Source/template.c + Source/timer.c + Source/WiFiCtrl.c + Source/SPI.c + Source/SPI_Flash.c + Source/Syslog.c + Source/Watchdog.c + Source/BootloaderInterface.c + Source/BootloaderProtocol.c + Source/crc32.c + Source/ATCmdInterpreter.c + Source/VolumeTransducer.c + + + Makefile + dist/ChaletDuinoV2_795F512H_/production/ChaletLora.X.production.map + + + + . + ../../Bootloader_PIC32/Bootloader_PIC32.X/Source + + Makefile + + + + localhost + PIC32MX775F512H + + + ICD3PlatformTool + XC32 + 1.33 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + PIC32MX795F512H + + + ICD3PlatformTool + XC32 + 1.33 + 3 + + + + + + + + + + + + + + + false + true + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + PIC32MX795F512H + + + ICD3PlatformTool + XC32 + 1.33 + 3 + + + + + + + + + + + + + + + false + true + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AudioConsole.X/nbproject/private/configurations.xml b/AudioConsole.X/nbproject/private/configurations.xml new file mode 100644 index 0000000..ed723a1 --- /dev/null +++ b/AudioConsole.X/nbproject/private/configurations.xml @@ -0,0 +1,61 @@ + + + Makefile + 2 + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v1.33\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v1.33\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v1.33\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/AudioConsole.X/nbproject/private/private.xml b/AudioConsole.X/nbproject/private/private.xml new file mode 100644 index 0000000..bf0109e --- /dev/null +++ b/AudioConsole.X/nbproject/private/private.xml @@ -0,0 +1,54 @@ + + + + + Source/hd44780.c + + + 340 + + + + + Source/SIM7080GInterface.c + + + 119 + + + + + 201 + + + + + 443 + + + + + 560 + + + + + Source/BootloaderInterface.c + + + 387 + + + + + 437 + + + + + + + file:/D:/Main/PicDev/Projets/AudioConsole/AudioConsole.X/Source/main.c + + + diff --git a/AudioConsole.X/nbproject/project.xml b/AudioConsole.X/nbproject/project.xml new file mode 100644 index 0000000..a86d387 --- /dev/null +++ b/AudioConsole.X/nbproject/project.xml @@ -0,0 +1,42 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + AudioConsole + ChaletLora + ChaletDuinoV2Base + LoraMonitor + AnalogTest + 81932de6-c3d1-4745-813f-25f2b7b2f867 + 0 + c + + h + + ISO-8859-1 + + + . + ../../Bootloader_PIC32/Bootloader_PIC32.X/Source + + + + default + 2 + + + ChaletDuino_775F512H_ + 2 + + + ChaletDuinoV2_795F512H_ + 2 + + + + false + + + + diff --git a/AudioConsole.X/procdefs.ld b/AudioConsole.X/procdefs.ld new file mode 100644 index 0000000..05ff51f --- /dev/null +++ b/AudioConsole.X/procdefs.ld @@ -0,0 +1,89 @@ +/************************************************************************* + * Processor-specific object file. Contains SFR definitions. + *************************************************************************/ +INPUT("processor.o") + +/************************************************************************* + * Processor-specific peripheral libraries are optional + *************************************************************************/ +OPTIONAL("libmchp_peripheral.a") +OPTIONAL("libmchp_peripheral_32MX795F512H.a") + +/************************************************************************* + * For interrupt vector handling + *************************************************************************/ +PROVIDE(_vector_spacing = 0x00000001); +_ebase_address = 0x9D004000; /*0x9FC01000;*/ + +/************************************************************************* + * Memory Address Equates + * _RESET_ADDR -- Reset Vector + * _BEV_EXCPT_ADDR -- Boot exception Vector + * _DBG_EXCPT_ADDR -- In-circuit Debugging Exception Vector + * _DBG_CODE_ADDR -- In-circuit Debug Executive address + * _DBG_CODE_SIZE -- In-circuit Debug Executive size + * _GEN_EXCPT_ADDR -- General Exception Vector + *************************************************************************/ +_RESET_ADDR = 0xBFC00000; +_BEV_EXCPT_ADDR = 0xBFC00380; +_DBG_EXCPT_ADDR = 0xBFC00480; +_DBG_CODE_ADDR = 0xBFC02000; +_DBG_CODE_SIZE = 0xFF0; +_GEN_EXCPT_ADDR = _ebase_address + 0x180; + +/************************************************************************* + * Memory Regions + * + * Memory regions without attributes cannot be used for orphaned sections. + * Only sections specifically assigned to these regions can be allocated + * into these regions. + * + * The Debug exception vector is located at 0x9FC00480. + * + * The config_
sections are used to locate the config words at + * their absolute addresses. + *************************************************************************/ +MEMORY +{ + /*kseg0_program_mem (rx) : ORIGIN = 0x9D000100, LENGTH = 0x80000*/ + /*kseg0_boot_mem : ORIGIN = 0x9FC00490, LENGTH = 0x970*/ + /*kexception_mem : ORIGIN = 0x9FC01000, LENGTH = 0x1000*/ + + /* kseg0_program_mem (rx) : ORIGIN = 0x9D003800, LENGTH = 0x7C7FF*/ /*App code. MAX address = 9D07FFFF */ + /* kseg0_boot_mem : ORIGIN = 0x9D003000, LENGTH = 0x7F0*/ /* startup code */ + /* exception_mem : ORIGIN = 0x9D002000, LENGTH = 0x1000*/ + + kseg0_program_mem (rx) : ORIGIN = 0x9D005800, LENGTH = 0x7A7FF /*App code. MAX address = 9D07FFFF */ + kseg0_boot_mem : ORIGIN = 0x9D005000, LENGTH = 0x7F0 /* startup code */ + exception_mem : ORIGIN = 0x9D004000, LENGTH = 0x1000 + + kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x490 + debug_exec_mem : ORIGIN = 0xBFC02000, LENGTH = 0xFF0 + config3 : ORIGIN = 0xBFC02FF0, LENGTH = 0x4 + config2 : ORIGIN = 0xBFC02FF4, LENGTH = 0x4 + config1 : ORIGIN = 0xBFC02FF8, LENGTH = 0x4 + config0 : ORIGIN = 0xBFC02FFC, LENGTH = 0x4 + kseg1_data_mem (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x10000 + sfrs : ORIGIN = 0xBF800000, LENGTH = 0x100000 + configsfrs : ORIGIN = 0xBFC02FF0, LENGTH = 0x10 +} + +/************************************************************************* + * Configuration-word sections. Map the config-pragma input sections to + * absolute-address output sections. + *************************************************************************/ +SECTIONS +{ + .config_BFC02FF0 : { + KEEP(*(.config_BFC02FF0)) + } > config3 + .config_BFC02FF4 : { + KEEP(*(.config_BFC02FF4)) + } > config2 + .config_BFC02FF8 : { + KEEP(*(.config_BFC02FF8)) + } > config1 + .config_BFC02FFC : { + KEEP(*(.config_BFC02FFC)) + } > config0 +}