From b55c56d3c5feb1d5330474489185540959723a2c Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:01:59 +0100 Subject: [PATCH 01/67] [targets/magia_v2] Add spatz as sub-target for magia_v2 --- targets/magia_v2/CMakeLists.txt | 19 ++- targets/magia_v2/link.ld | 15 +- targets/magia_v2/spatz/bootrom/spatz_init.S | 36 +++++ targets/magia_v2/spatz/bootrom/spatz_init.ld | 62 ++++++++ targets/magia_v2/spatz/src/spatz_crt0.S | 156 +++++++++++++++++++ targets/magia_v2/spatz/src/spatz_program.ld | 86 ++++++++++ 6 files changed, 372 insertions(+), 2 deletions(-) create mode 100644 targets/magia_v2/spatz/bootrom/spatz_init.S create mode 100644 targets/magia_v2/spatz/bootrom/spatz_init.ld create mode 100644 targets/magia_v2/spatz/src/spatz_crt0.S create mode 100644 targets/magia_v2/spatz/src/spatz_program.ld diff --git a/targets/magia_v2/CMakeLists.txt b/targets/magia_v2/CMakeLists.txt index 94a77028..cffe91a9 100644 --- a/targets/magia_v2/CMakeLists.txt +++ b/targets/magia_v2/CMakeLists.txt @@ -66,4 +66,21 @@ target_link_options(runtime -Wno-incompatible-pointer-types #ZL-MOD 03072025 -Wno-int-conversion #ZL-MOD 03072025 -Wl,--gc-sections #ZL-MOD 03072025 -) \ No newline at end of file +) + + +# ==================== SPATZ INTEGRATION ==================== + +# Include Spatz configuration and helpers if Spatz is available +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/spatz") + include(${CMAKE_SOURCE_DIR}/cmake/spatz_config.cmake) + include(${CMAKE_SOURCE_DIR}/cmake/spatz_helpers.cmake) + include(${CMAKE_SOURCE_DIR}/cmake/bootrom_helpers.cmake) + + # Build bootrom once at target level (shared by all tests) + add_spatz_bootrom(${CMAKE_BINARY_DIR}/bin) + + message(STATUS "[MAGIA-SDK] Spatz integration enabled for magia_v2") +endif() + +# ========================================================= diff --git a/targets/magia_v2/link.ld b/targets/magia_v2/link.ld index 80d235ba..3c3703ec 100644 --- a/targets/magia_v2/link.ld +++ b/targets/magia_v2/link.ld @@ -61,6 +61,19 @@ SECTIONS _endtext = .; } > instrram + /* Spatz embedded binary - inlined from header file */ + /* Positioned right after CV32 .text in instrram */ + + . = ALIGN(4); + _spatz_binary_start = .; + + .spatz_binary : { + KEEP(*(.spatz_binary)) + } > instrram + + _spatz_binary_end = .; + _spatz_binary_size = _spatz_binary_end - _spatz_binary_start; + /*--------------------------------------------------------------------*/ /* Global constructor/destructor segment */ /*--------------------------------------------------------------------*/ @@ -131,4 +144,4 @@ SECTIONS _stack = . ; } > stack -} \ No newline at end of file +} diff --git a/targets/magia_v2/spatz/bootrom/spatz_init.S b/targets/magia_v2/spatz/bootrom/spatz_init.S new file mode 100644 index 00000000..43f5e9c3 --- /dev/null +++ b/targets/magia_v2/spatz/bootrom/spatz_init.S @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018-2019 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * + * Authors: Luca Balboni + * + * All initialization (stack, regs, vector, BSS) done in spatz_crt0.S + * Minimal Boot ROM - only read FUNC_PTR and jump + */ + +#define TASKBIN_ADDR 0x00001708 // OBI slave ctrl exchange register + + .section .text.bootrom + .global _start + .option norvc + +_start: + // Read dispatcher loop address from TASKBIN_REG (set by CV32) + li t0, TASKBIN_ADDR + lw t1, 0(t0) + + // Jump to _start in spatz binary (does all init) + jr t1 diff --git a/targets/magia_v2/spatz/bootrom/spatz_init.ld b/targets/magia_v2/spatz/bootrom/spatz_init.ld new file mode 100644 index 00000000..0ecdffc6 --- /dev/null +++ b/targets/magia_v2/spatz/bootrom/spatz_init.ld @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 ETH Zurich and University of Bologna + * + * Licensed under the Solderpad Hardware License, Version 0.51 + * (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: SHL-0.51 +/* + * Spatz Boot ROM Linker Script for MAGIA Tile + * + * Maps bootrom to 0x10000000 (outside L2 range to avoid AXI address decode overlap). + * The bootrom is synthesized as a hardware module (spatz_bootrom.sv) mapped via AXI slave. + * + * Boot sequence: + * 1. Spatz resets with PC = 0x10000000 (SPATZ_BOOT_ADDR in magia_tile.sv) + * 2. Bootrom initializes core (clear regs, setup interrupts) + * 3. Bootrom waits for MEIP interrupt via WFI + * 4. CV32 writes entry point to FUNC_PTR (0x1704) + * 5. CV32 triggers START_TRIGGER (0x1700) → MEIP interrupt + * 6. Bootrom reads FUNC_PTR and jumps to user program + */ + +SEARCH_DIR(.) +OUTPUT_ARCH(riscv) +ENTRY(_start) + +MEMORY +{ + bootrom : ORIGIN = 0x10000000, LENGTH = 0x100 /* 256B at 0x10000000 (outside L2 range to avoid AXI overlap) */ +} + +SECTIONS +{ + .text.bootrom : { + KEEP(*(.text.bootrom)) + *(.text) + *(.text.*) + } > bootrom + + .rodata : { + *(.rodata) + *(.rodata.*) + } > bootrom + + /* Discard all other sections */ + /DISCARD/ : { + *(.data) + *(.data.*) + *(.bss) + *(.bss.*) + *(.comment) + *(.note.*) + } +} diff --git a/targets/magia_v2/spatz/src/spatz_crt0.S b/targets/magia_v2/spatz/src/spatz_crt0.S new file mode 100644 index 00000000..49bb7566 --- /dev/null +++ b/targets/magia_v2/spatz/src/spatz_crt0.S @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2018-2019 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * Spatz Runtime + * Entry: Bootrom should jumps here + * + */ + +#define START_ADDR 0x00001704 +#define TASKBIN_ADDR 0x00001708 +#define DATA_ADDR 0x0000170C +#define RETURN_ADDR 0x00001710 +#define DONE_ADDR 0x00001714 +#define MSTATUS_VS 0x200 // Vector Status [9:8] = 01 +#define MSTATUS_MIE 0x8 // Machine Interrupt Enable +#define MIE_MEIE 0x800 // External interrupt enable + +.section .text.start, "ax" +.global _start + +_start: + /* Init stack pointer */ + li sp, 0x0001FFF8 + + /* Clear ALL integer registers */ + mv x1, x0 + // x2 = sp just initialized + mv x3, x0 + mv x4, x0 + mv x5, x0 + mv x6, x0 + mv x7, x0 + mv x8, x0 + mv x9, x0 + mv x10, x0 + mv x11, x0 + mv x12, x0 + mv x13, x0 + mv x14, x0 + mv x15, x0 + mv x16, x0 + mv x17, x0 + mv x18, x0 + mv x19, x0 + mv x20, x0 + mv x21, x0 + mv x22, x0 + mv x23, x0 + mv x24, x0 + mv x25, x0 + mv x26, x0 + mv x27, x0 + mv x28, x0 + mv x29, x0 + mv x30, x0 + mv x31, x0 + + /* Enable vector extension (VS=Initial for Spatz) */ + li t0, MSTATUS_VS + csrs mstatus, t0 + + /* Clear BSS section */ + la a0, __bss_start + la a1, __bss_end +1: bgeu a0, a1, 2f + sw zero, 0(a0) + addi a0, a0, 4 + j 1b +2: + /* Setup trap handler for interrupt */ + la t0, _trap_handler + csrw mtvec, t0 + + /* Enable external interrupts (MEIE) */ + li t0, MIE_MEIE + csrs mie, t0 + + /* Enable global interrupts (MIE bit in mstatus) */ + li t0, MSTATUS_MIE + csrs mstatus, t0 + + /* Fall through to dispatcher loop */ + +dispatcher_loop: + /* Wait for interrupt from CV32 */ + wfi + + /* After wakeup from interrupt, task has been executed */ + /* Loop back */ + j dispatcher_loop + +/* Trap handler - distinguishes interrupts from exceptions */ +_trap_handler: + csrr t0, mcause + bltz t0, _handle_interrupt // mcause[31]=1 → interrupt + + /* EXCEPTION: Write error code to EXCHANGE_REG, signal DONE, halt */ +_handle_exception: + csrr t1, mcause // Read full mcause + andi t1, t1, 0xFF // Extract exception code [7:0] + ori t1, t1, 0x100 // Set bit 8 to distinguish from task errors + li t0, RETURN_ADDR + sw t1, 0(t0) + + li t0, DONE_ADDR + li t1, 1 + sw t1, 0(t0) + + /* Halt */ +1: wfi + j 1b + +_handle_interrupt: + /* Check if external interrupt */ + andi t0, t0, 0x7FF + li t1, 11 + bne t0, t1, _trap_ret + + /* Read task address from EXCHANGE_REG and save it in t1 */ + li t0, TASKBIN_ADDR + lw t1, 0(t0) + beqz t1, _trap_ret + + /* Clear START */ + li t0, START_ADDR + sw zero, 0(t0) + + /* Jump to saved task address */ + jalr ra, 0(t1) + + /* Task completed - write exit code 0 (success, no exceptions) */ + li t0, RETURN_ADDR + sw zero, 0(t0) + + /* Signal done */ + li t0, DONE_ADDR + li t1, 1 + sw t1, 0(t0) + +_trap_ret: + mret diff --git a/targets/magia_v2/spatz/src/spatz_program.ld b/targets/magia_v2/spatz/src/spatz_program.ld new file mode 100644 index 00000000..765a5344 --- /dev/null +++ b/targets/magia_v2/spatz/src/spatz_program.ld @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2018-2019 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Memory Layout (when embedded in CV32 instrram): + * 0xCC000000: CV32 .text + * 0xCC000000 + CV32_size: .spatz_binary (Spatz code inline) + * + * Stack: Spatz uses remaining 16KB after CV32 (0x0001C000-0x00020000) + * - CV32 uses: 0x00010000-0x0001C000 (48KB) + * - Spatz uses: 0x0001C000-0x00020000 (16KB) + */ + +OUTPUT_ARCH(riscv) +ENTRY(_start) + +MEMORY +{ + prog (rwxa) : ORIGIN = 0x00000000, LENGTH = 0x10000 /* 64KB max - relative addressing */ +} + +/* Stack configuration - Spatz uses remaining 16KB after CV32 */ +/* CV32 uses: 0x00010000-0x0001C000 (48KB, from CV32 link.ld) */ +/* Spatz uses: 0x0001C000-0x00020000 (16KB) */ +_stack_start = 0x0001FFF8; /* Top of Spatz stack (grows downward) */ + +SECTIONS +{ + .text : { + . = ALIGN(4); + KEEP(*(.text.start)) + *(.text) + *(.text.*) + . = ALIGN(4); + } > prog + + .rodata : { + . = ALIGN(4); + *(.rodata) + *(.rodata.*) + . = ALIGN(4); + } > prog + + .data : { + . = ALIGN(4); + *(.data) + *(.data.*) + *(.sdata) + *(.sdata.*) + . = ALIGN(4); + } > prog + + .bss : { + . = ALIGN(4); + __bss_start = .; + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(COMMON) + . = ALIGN(4); + __bss_end = .; + } > prog + + /* Stack symbol for spatz_crt0.S */ + /* spatz_crt0.S uses: la sp, stack */ + stack = _stack_start; + + /* Discard debug sections */ + /DISCARD/ : { + *(.comment) + *(.note.*) + } +} From 3ec966c0758799f72d2f60349d71e9e0ed2cb381 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:23:31 +0100 Subject: [PATCH 02/67] [cmake] Add cmake file for spatz configuration --- cmake/spatz_config.cmake | 108 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 cmake/spatz_config.cmake diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake new file mode 100644 index 00000000..580a5120 --- /dev/null +++ b/cmake/spatz_config.cmake @@ -0,0 +1,108 @@ +# Spatz task global config + +set(SPATZ_LLVM_PATH "/opt/riscv/spatz-14-llvm" CACHE PATH "Path to Spatz LLVM installation") + +# Toolchain paths [MAGIA/spatz/sw/Makefile] +find_program(SPATZ_CLANG clang PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) +find_program(SPATZ_OBJCOPY llvm-objcopy PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) +find_program(SPATZ_OBJDUMP llvm-objdump PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) + +# Spatz configuration options [MAGIA/Makefile] +set(SPATZ_RVD 0 CACHE INT "0: 32-bit TCDM w/ ELEN=32, 1: 64-bit TCDM w/ ELEN=64") +set(SPATZ_VLEN 256 CACHE INT "Vector length in bits (128, 256, 512, ...)") +set(SPATZ_NRVREG 32 CACHE INT "Number of vector registers - RISC-V standar=32") +set(SPATZ_NR_VRF_BANKS 4 CACHE INT "Number of VRF banks (banking parallelism: 2, 4, 8)") +set(SPATZ_N_IPU 1 CACHE INT "Number of Integer Processing Units (1-8)") +set(SPATZ_N_FPU 4 CACHE INT "Number of Floating Point Units (1-8)") +set(SPATZ_NR_PARALLEL_INSTR 4 CACHE INT "Number of parallel vector instructions (scoreboard depth)") +set(SPATZ_XDIVSQRT 0 CACHE INT "0: FP div/sqrt disabled, 1: enabled") +set(SPATZ_XDMA 0 CACHE INT "0: DMA disabled, 1: enabled") +set(SPATZ_RVF 1 CACHE INT "0: single-precision FP disabled, 1: enabled") +set(SPATZ_RVV 1 CACHE INT "0: vector extension disabled, 1: enabled") + +# Spatz ISA configuration [MAGIA/spatz/sw/Makefile] +set(SPATZ_ARCH rv CACHE STRING "Spatz ARCH prefix (e.g. rv)") +set(SPATZ_XLEN 32 CACHE STRING "Spatz XLEN (32 or 64)") +set(SPATZ_ABI ilp CACHE STRING "Spatz ABI prefix (e.g. ilp)") + +# Build isa string dynamically [MAGIA/spatz/sw/Makefile] +set(SPATZ_XTEN "ima") +if(SPATZ_RVD) + set(SPATZ_XTEN "${SPATZ_XTEN}fd") + set(SPATZ_XABI "32d") +elseif(SPATZ_RVF) + set(SPATZ_XTEN "${SPATZ_XTEN}f") + set(SPATZ_XABI "32f") +else() + set(SPATZ_XABI "32") +endif() + +if(SPATZ_RVV) + set(SPATZ_XTEN "${SPATZ_XTEN}v") +endif() + +set(SPATZ_XTEN "${SPATZ_XTEN}_zfh") +set(SPATZ_MARCH "-march=${SPATZ_ARCH}${SPATZ_XLEN}${SPATZ_XTEN}") +set(SPATZ_MABI "-mabi=${SPATZ_ABI}${SPATZ_XABI}") + +# CV32 configuration options [MAGIA/Makefile] +set(CV32_ARCH rv CACHE STRING "CV32 ARCH prefix (e.g. rv)") +set(CV32_XLEN 32 CACHE STRING "CV32 XLEN (32 or 64)") +set(CV32_XTEN imfcxpulpv2 CACHE STRING "CV32 XTEN (ISA extensions)") +set(CV32_ABI ilp CACHE STRING "CV32 ABI prefix (e.g. ilp)") +set(CV32_XABI f CACHE STRING "CV32 XABI (32, 32f, 32d)") +set(CV32_MARCH "-march=${CV32_ARCH}${CV32_XLEN}${CV32_XTEN}") +set(CV32_MABI "-mabi=${CV32_ABI}${CV32_XLEN}${CV32_XABI}") + +# Architecture and Compiler flags [MAGIA/spatz/sw/Makefile] +set(SPATZ_COMPILE_FLAGS + "--target=riscv32" + ${SPATZ_MARCH} + ${SPATZ_MABI} + "-menable-experimental-extensions" + "-static" + "-nostartfiles" + "-nostdlib" + "-O2" + "-g" + "-Wall" + "-Wextra" + "-fno-common" + "-ffunction-sections" + "-fdata-sections" + "-fPIC" + "-fno-builtin-memset" + "-fno-builtin-memcpy" + "-mcmodel=medany" +) + +# Spatz defines [MAGIA/spatz/sw/Makefile] +set(SPATZ_CFLAGS_DEFINES + "-DSPATZ_RVD=${SPATZ_RVD}" + "-DSPATZ_VLEN=${SPATZ_VLEN}" + "-DSPATZ_N_IPU=${SPATZ_N_IPU}" + "-DSPATZ_N_FPU=${SPATZ_N_FPU}" + "-DSPATZ_XDIVSQRT=${SPATZ_XDIVSQRT}" + "-DSPATZ_XDMA=${SPATZ_XDMA}" + "-DSPATZ_RVF=${SPATZ_RVF}" + "-DSPATZ_RVV=${SPATZ_RVV}" +) + +# Linker flags [MAGIA/spatz/sw/Makefile] +set(SPATZ_LINK_FLAGS + "-fuse-ld=lld" + "-Wl,-z,norelro" + "-Wl,--allow-multiple-definition" +) + +# TODO: check if needed +# Mesh tile config from root Makefile +set(TILES 2 CACHE INT "Mesh dimension (e.g. 2 implies 2x2 grid = 4 tiles)") + + +# Log info +message(STATUS "Spatz Configuration:") +message(STATUS " LLVM Path: ${SPATZ_LLVM_PATH}") +message(STATUS " ISA: rv32${SPATZ_XTEN}") +message(STATUS " VLEN: ${SPATZ_VLEN} bits") +message(STATUS " Mesh: ${TILES}x${TILES} (${TILES_2} tiles)") From 7490645d7373642bdc877d68e0307ac5c7ac5f16 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:36:03 +0100 Subject: [PATCH 03/67] [cmake] Add spatz helper cmake functions --- cmake/spatz_helpers.cmake | 229 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 cmake/spatz_helpers.cmake diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake new file mode 100644 index 00000000..39bcc8ec --- /dev/null +++ b/cmake/spatz_helpers.cmake @@ -0,0 +1,229 @@ +# Spatz task compilation and embedding helpers + +include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) + +# Function: add_spatz_task +# Compiles Spatz task binary, generates header with binary array + task symbols, and stimuli +function(add_spatz_task) + set(options) + set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR) + set(multiValueArgs TASK_SOURCES FIRST_TASK_NAME) + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") + set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") + endif() + if(NOT IS_ABSOLUTE "${ARG_LINKER_SCRIPT}") + set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") + endif() + + set(TASK_CRT0_OBJ "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_crt0.o") + set(TASK_ELF "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.elf") + set(TASK_BIN "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.bin") + set(TASK_HEADER "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task_bin.h") + set(TASK_DUMP "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.dump") + + # Compile crt0.S [MAGIA/spatz/sw/Makefile: $(CRT0_OBJ)] + add_custom_command( + OUTPUT ${TASK_CRT0_OBJ} + COMMAND ${SPATZ_CLANG} + ${SPATZ_COMPILE_FLAGS} + -c -o ${TASK_CRT0_OBJ} + ${ARG_CRT0_SRC} + DEPENDS ${ARG_CRT0_SRC} + COMMENT "[SPATZ] Compiling crt0..." + VERBATIM + ) + + # Build ELF with crt0 + task sources [MAGIA/spatz/sw/Makefile: $(ELF)] + add_custom_command( + OUTPUT ${TASK_ELF} + COMMAND ${SPATZ_CLANG} + ${SPATZ_COMPILE_FLAGS} + ${SPATZ_CFLAGS_DEFINES} + ${SPATZ_LINK_FLAGS} + -T${ARG_LINKER_SCRIPT} + -Wl,--defsym,__first_task=${ARG_FIRST_TASK_NAME} + -o ${TASK_ELF} + ${TASK_CRT0_OBJ} + ${ARG_TASK_SOURCES} + DEPENDS + ${TASK_CRT0_OBJ} + ${ARG_TASK_SOURCES} + ${ARG_LINKER_SCRIPT} + COMMENT "[SPATZ] Building ELF..." + VERBATIM + ) + + # Generate binary from ELF [MAGIA/spatz/sw/Makefile: $(BIN)] + add_custom_command( + OUTPUT ${TASK_BIN} + COMMAND ${SPATZ_OBJCOPY} -O binary ${TASK_ELF} ${TASK_BIN} + DEPENDS ${TASK_ELF} + COMMENT "[SPATZ] Generating binary..." + VERBATIM + ) + + # Generate disassembly [MAGIA/spatz/sw/Makefile: $(DUMP)] + add_custom_command( + OUTPUT ${TASK_DUMP} + COMMAND ${SPATZ_OBJDUMP} -D -S ${TASK_ELF} > ${TASK_DUMP} + DEPENDS ${TASK_ELF} + COMMENT "[SPATZ] Generating disassembly..." + VERBATIM + ) + + + set(BIN2HEADER_SCRIPT "${CMAKE_SOURCE_DIR}/scripts/bin2header.py") + + # Generate header with binary array [MAGIA/spatz/sw/Makefile: $(HEADER)] + add_custom_command( + OUTPUT ${TASK_HEADER} + COMMAND python3 ${BIN2HEADER_SCRIPT} + ${TASK_BIN} ${TASK_HEADER} + --name ${ARG_TEST_NAME}_task_bin + --section .spatz_binary + --address "dynamic (_spatz_binary_start)" + DEPENDS ${TASK_BIN} ${BIN2HEADER_SCRIPT} + COMMENT "[SPATZ] Generating header with binary array..." + VERBATIM + ) + + # Extract task symbols and append to header [MAGIA/spatz/sw/Makefile: $(HEADER)] + add_custom_command( + OUTPUT ${TASK_HEADER} + APPEND + COMMAND bash -c " + GUARD_NAME=\$(echo '${ARG_TEST_NAME}_TASK_BIN' | tr 'a-z' 'A-Z') + sed -i \"/#endif.*__\$${GUARD_NAME}_H__/d\" ${TASK_HEADER} + echo '' >> ${TASK_HEADER} + echo '/* Binary start address - defined by CV32 linker */' >> ${TASK_HEADER} + echo 'extern uint32_t _spatz_binary_start;' >> ${TASK_HEADER} + echo '#define SPATZ_BINARY_START ((uint32_t)&_spatz_binary_start)' >> ${TASK_HEADER} + echo '' >> ${TASK_HEADER} + echo '/* Dispatcher loop address - for spatz_run() */' >> ${TASK_HEADER} + DISP_ADDR=\$(${SPATZ_OBJDUMP} -t ${TASK_ELF} | grep 'dispatcher_loop\$\$' | awk '{print \$1}') + echo \"#define SPATZ_DISPATCHER_LOOP (SPATZ_BINARY_START + 0x\$${DISP_ADDR})\" >> ${TASK_HEADER} + echo '' >> ${TASK_HEADER} + echo '/* Task function entry points - OFFSETS from SPATZ_BINARY_START */' >> ${TASK_HEADER} + ${SPATZ_OBJDUMP} -t ${TASK_ELF} | grep '_task\$\$' | grep -v '__first_task\$\$' | awk '{print \$1, \$NF}' | while read addr name; do + TASK_NAME=\$(echo \$name | tr 'a-z' 'A-Z') + echo \"#define \$${TASK_NAME} (SPATZ_BINARY_START + 0x\$${addr})\" >> ${TASK_HEADER} + done + echo '' >> ${TASK_HEADER} + echo \"#endif /* __\$${GUARD_NAME}_H__ */\" >> ${TASK_HEADER} + " + COMMENT "[SPATZ] Extracting task symbols..." + VERBATIM + ) + + add_custom_target(${ARG_TEST_NAME}_spatz_header ALL + DEPENDS + ${TASK_HEADER} + ${TASK_BIN} + ${TASK_DUMP} + ) + + set(${ARG_OUTPUT_VAR} ${TASK_HEADER} PARENT_SCOPE) + set(${ARG_TEST_NAME}_TASK_BIN ${TASK_BIN} PARENT_SCOPE) +endfunction() + +# Function: add_cv32_executable_with_spatz +# Builds CV32 executable with embedded Spatz task binary +function(add_cv32_executable_with_spatz) + set(options) + set(oneValueArgs TARGET_NAME SPATZ_HEADER LINK_SCRIPT CRT0_SRC) + set(multiValueArgs SOURCES INCLUDE_DIRS) + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") + set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") + endif() + if(ARG_LINK_SCRIPT AND NOT IS_ABSOLUTE "${ARG_LINK_SCRIPT}") + set(ARG_LINK_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINK_SCRIPT}") + endif() + + add_executable(${ARG_TARGET_NAME} ${ARG_CRT0_SRC} ${ARG_SOURCES}) + + target_include_directories(${ARG_TARGET_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/inc + ${CMAKE_CURRENT_SOURCE_DIR}/utils + ${CMAKE_SOURCE_DIR}/hal/include + ${CMAKE_SOURCE_DIR}/drivers/eventunit32/include + ${ARG_INCLUDE_DIRS} + ) + + if(ARG_SPATZ_HEADER) + get_filename_component(SPATZ_HEADER_DIR "${ARG_SPATZ_HEADER}" DIRECTORY) + target_include_directories(${ARG_TARGET_NAME} PRIVATE ${SPATZ_HEADER_DIR}) + endif() + + # Compiler flags [MAGIA/Makefile: CC_OPTS] + target_compile_options(${ARG_TARGET_NAME} PRIVATE + ${CV32_MARCH} + ${CV32_MABI} + -D__riscv__ + -O2 + -g + -Wall + -Wextra + -Wno-unused-parameter + -Wno-unused-variable + -Wno-unused-function + -Wundef + -fdata-sections + -ffunction-sections + -MMD + -MP + -nostartfiles + -nostdlib + ) + + # Linker flags [MAGIA/Makefile: LD_OPTS] + target_link_options(${ARG_TARGET_NAME} PRIVATE + ${CV32_MARCH} + ${CV32_MABI} + -D__riscv__ + -MMD + -MP + -nostartfiles + -nostdlib + -Wl,--gc-sections + ) + + if(ARG_LINK_SCRIPT) + target_link_options(${ARG_TARGET_NAME} PRIVATE -T${ARG_LINK_SCRIPT}) + endif() + + if(ARG_SPATZ_HEADER) + get_filename_component(HEADER_FILENAME "${ARG_SPATZ_HEADER}" NAME) + string(REGEX MATCH "^([^_]+_[^_]+_[^_]+)" TEST_NAME "${HEADER_FILENAME}") + add_dependencies(${ARG_TARGET_NAME} ${TEST_NAME}_spatz_header) + endif() + + # Post-build: disassembly and stimuli [MAGIA/Makefile: $(STIM_INSTR) $(STIM_DATA)] + set(ELF_DUMP "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.dump") + set(ELF_OBJDUMP "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.objdump") + set(ELF_ITB "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.itb") + set(ELF_S19 "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.s19") + set(ELF_TXT "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.txt") + set(STIM_INSTR "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}_stim_instr.txt") + set(STIM_DATA "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}_stim_data.txt") + + add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_OBJDUMP} -D -S $ > ${ELF_DUMP} + COMMAND ${CMAKE_OBJDUMP} -h -S $ > ${ELF_OBJDUMP} + COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/objdump2itb.py ${ELF_OBJDUMP} > ${ELF_ITB} + COMMENT "[CV32] Generating disassembly and ITB for ${ARG_TARGET_NAME}" + VERBATIM + ) + + add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} --srec-len 1 --output-target=srec $ ${ELF_S19} + COMMAND perl ${CMAKE_SOURCE_DIR}/scripts/parse_s19.pl ${ELF_S19} > ${ELF_TXT} + COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/s19tomem.py ${ELF_TXT} ${STIM_INSTR} ${STIM_DATA} + COMMENT "[CV32] Generating stimuli for ${ARG_TARGET_NAME}" + VERBATIM + ) +endfunction() From 06f001a2e9861dcdaa922b62723f3f5ef5298234 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:36:31 +0100 Subject: [PATCH 04/67] [cmake] Add bootrom cmake helper functions --- cmake/bootrom_helpers.cmake | 80 +++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 cmake/bootrom_helpers.cmake diff --git a/cmake/bootrom_helpers.cmake b/cmake/bootrom_helpers.cmake new file mode 100644 index 00000000..478b6937 --- /dev/null +++ b/cmake/bootrom_helpers.cmake @@ -0,0 +1,80 @@ +# Spatz bootrom compilation helpers + +include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) + +# Function: add_spatz_bootrom_binary +# Compiles Spatz bootrom +function(add_spatz_bootrom_binary) + set(options) + set(oneValueArgs BOOTROM_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR SV_OUTPUT) + set(multiValueArgs) + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT ARG_OUTPUT_DIR) + set(ARG_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + endif() + + if(NOT IS_ABSOLUTE "${ARG_BOOTROM_SRC}") + set(ARG_BOOTROM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_BOOTROM_SRC}") + endif() + if(NOT IS_ABSOLUTE "${ARG_LINKER_SCRIPT}") + set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") + endif() + + set(BOOTROM_ELF "${ARG_OUTPUT_DIR}/spatz_init.elf") + set(BOOTROM_BIN "${ARG_OUTPUT_DIR}/spatz_init.bin") + set(BOOTROM_DUMP "${ARG_OUTPUT_DIR}/spatz_init.dump") + + # Compile bootrom ELF [MAGIA/spatz/bootrom/Makefile: $(ELF)] + add_custom_command( + OUTPUT ${BOOTROM_ELF} + COMMAND ${SPATZ_CLANG} + ${SPATZ_COMPILE_FLAGS} + ${SPATZ_CFLAGS_DEFINES} + ${SPATZ_LINK_FLAGS} + -T${ARG_LINKER_SCRIPT} + -o ${BOOTROM_ELF} + ${ARG_BOOTROM_SRC} + DEPENDS ${ARG_BOOTROM_SRC} ${ARG_LINKER_SCRIPT} + COMMENT "[SPATZ-BOOTROM] Compiling bootrom ELF..." + VERBATIM + ) + + # Extract binary [MAGIA/spatz/bootrom/Makefile: $(BIN)] + add_custom_command( + OUTPUT ${BOOTROM_BIN} + COMMAND ${SPATZ_OBJCOPY} -O binary ${BOOTROM_ELF} ${BOOTROM_BIN} + DEPENDS ${BOOTROM_ELF} + COMMENT "[SPATZ-BOOTROM] Generating bootrom binary..." + VERBATIM + ) + + # Generate disassembly [MAGIA/spatz/bootrom/Makefile: $(DUMP)] + add_custom_command( + OUTPUT ${BOOTROM_DUMP} + COMMAND ${SPATZ_OBJDUMP} -D ${BOOTROM_ELF} > ${BOOTROM_DUMP} + DEPENDS ${BOOTROM_ELF} + COMMENT "[SPATZ-BOOTROM] Generating disassembly..." + VERBATIM + ) + + set(BOOTROM_TARGET_OUTPUTS ${BOOTROM_BIN} ${BOOTROM_DUMP}) + + # Generate SystemVerilog bootrom module [MAGIA/spatz/bootrom/Makefile: "sv"] + if(ARG_SV_OUTPUT) + add_custom_command( + OUTPUT ${ARG_SV_OUTPUT} + COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/generate_spatz_bootrom.py + ${BOOTROM_BIN} + -o ${ARG_SV_OUTPUT} + DEPENDS ${BOOTROM_BIN} + COMMENT "[SPATZ-BOOTROM] Generating hardware bootrom: ${ARG_SV_OUTPUT}" + VERBATIM + ) + list(APPEND BOOTROM_TARGET_OUTPUTS ${ARG_SV_OUTPUT}) + endif() + + add_custom_target(spatz_bootrom ALL DEPENDS ${BOOTROM_TARGET_OUTPUTS}) + + set(${ARG_OUTPUT_VAR} ${BOOTROM_BIN} PARENT_SCOPE) +endfunction() From 3b492bd37a13b72edd8e1022137cd505c5816d93 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:48:21 +0100 Subject: [PATCH 05/67] [scripts] s19tomeme.py: Fix data memory start address and size --- scripts/s19tomem.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) mode change 100755 => 100644 scripts/s19tomem.py diff --git a/scripts/s19tomem.py b/scripts/s19tomem.py old mode 100755 new mode 100644 index 59257728..9ee9475e --- a/scripts/s19tomem.py +++ b/scripts/s19tomem.py @@ -19,15 +19,15 @@ import sys # Instructions start at 0xcc00_0000 -# Data starts at 0xcc10_0000 +# Data starts at 0xcc01_0000 # Stack starts at 0x0001_0000 # We only keep last 2 bytes so memory will be filled with no offset. # The CPU will also reference it as to not have any offset. MEM_START = 0xcc000000 INSTR_SIZE = 0x8000 INSTR_END = MEM_START + INSTR_SIZE -DATA_BASE = MEM_START + 0x100000 -DATA_SIZE = 0xf00000 +DATA_BASE = MEM_START + 0x10000 +DATA_SIZE = 0x30000 DATA_END = DATA_BASE + DATA_SIZE STACK_BASE = 0x10000 STACK_SIZE = 0x10000 @@ -80,20 +80,16 @@ instr_mem[int(rel_imem_addr) + 6] = whhl instr_mem[int(rel_imem_addr) + 7] = whhh -f = open(instr_txt, "w") -s = "@%08x\n" % MEM_START -f.write(s) - +s = "" +s += "@%08x\n" % MEM_START for m in instr_mem: - s = "%02x\n" % m + s += "%02x\n" % m +with open(instr_txt, "w") as f: f.write(s) -f.close() - -f = open(data_txt, "w") -s = "@%08x\n" % DATA_BASE -f.write(s) +s = "" +s += "@%08x\n" % DATA_BASE for m in data_mem: - s = "%02x\n" % m - f.write(s) -f.close() \ No newline at end of file + s += "%02x\n" % m +with open(data_txt, "w") as f: + f.write(s.rstrip('\n')) From 599930ae558b38edef764816e37cac815555ad4f Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:49:18 +0100 Subject: [PATCH 06/67] [scripts] Add python scripts to generate spatz header from binary and bootrom --- scripts/bin2header.py | 67 ++++++++++++++++++++++ scripts/generate_spatz_bootrom.py | 95 +++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 scripts/bin2header.py create mode 100644 scripts/generate_spatz_bootrom.py diff --git a/scripts/bin2header.py b/scripts/bin2header.py new file mode 100644 index 00000000..41955778 --- /dev/null +++ b/scripts/bin2header.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +""" +Convert binary file to C header with embedded array. +Generates a header with the binary as uint32_t array in custom linker section. +""" + +import argparse + +def bytes_to_words(data): + """Convert bytes to uint32_t words (little-endian).""" + words = [] + for i in range(0, len(data), 4): + # Read up to 4 bytes, pad with zeros if needed + chunk = data[i:i+4] + word = sum(byte << (8 * j) for j, byte in enumerate(chunk)) + words.append(f"0x{word:08X}") + return words + +def generate_header(binary_path, output_path, array_name, section_name, address): + """Generate C header with binary array in custom section.""" + + # Read binary file + with open(binary_path, 'rb') as f: + data = f.read() + + # Convert to words + words = bytes_to_words(data) + guard = f"__{array_name.upper()}_H__" + + # Write header file + with open(output_path, 'w') as f: + # Header guard and includes + f.write(f"/* Auto-generated from {binary_path} ({len(data)} bytes) */\n") + f.write(f"#ifndef {guard}\n") + f.write(f"#define {guard}\n\n") + f.write(f"#include \n\n") + + # Binary array with section attribute + f.write(f"/* Binary array in {section_name} section (target: {address}) */\n") + f.write(f"const uint32_t {array_name}[] ") + f.write(f"__attribute__((section(\"{section_name}\"), aligned(4), used)) = {{\n") + + # Write words (8 per line for readability) + for i in range(0, len(words), 8): + line = words[i:i+8] + f.write(" " + ", ".join(line)) + f.write(",\n" if i + 8 < len(words) else "\n") + + f.write("};\n\n") + f.write(f"#endif /* {guard} */\n") + + print(f"Generated: {output_path} ({len(data)} bytes = {len(words)} words)") + +def main(): + parser = argparse.ArgumentParser(description='Convert binary to C header') + parser.add_argument('binary', help='Input binary file') + parser.add_argument('output', help='Output header file') + parser.add_argument('--name', default='spatz_program', help='Array name') + parser.add_argument('--section', default='.spatz_binary', help='Linker section name') + parser.add_argument('--address', default='dynamic (_spatz_binary_start)', + help='Target address (informational)') + + args = parser.parse_args() + generate_header(args.binary, args.output, args.name, args.section, args.address) + +if __name__ == '__main__': + main() diff --git a/scripts/generate_spatz_bootrom.py b/scripts/generate_spatz_bootrom.py new file mode 100644 index 00000000..e6a7898f --- /dev/null +++ b/scripts/generate_spatz_bootrom.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +# Copyright 2024 ETH Zurich and University of Bologna. +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 +# +# Generate SystemVerilog bootrom module from binary file + +import argparse +import sys + +def generate_bootrom_sv(bin_file, output_file): + """Generate SystemVerilog bootrom module from binary file.""" + + # Read binary file + with open(bin_file, 'rb') as f: + data = f.read() + + # Pad to 32-bit word boundary + if len(data) % 4 != 0: + padding = 4 - (len(data) % 4) + data = data + b'\x00' * padding + + num_bytes = len(data) + num_words = num_bytes // 4 + + # Convert bytes to 32-bit words (little-endian, in address order) + words = [] + for i in range(0, num_bytes, 4): + word = int.from_bytes(data[i:i+4], byteorder='little') + words.append(word) + + # Generate SystemVerilog module (like spatz_cluster) + sv_content = f'''// Copyright 2024 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 +// +// Auto-generated bootrom for Spatz core complex +// Generated from: {bin_file} +// Size: {num_bytes} bytes ({num_words} words) + +module spatz_bootrom #( + parameter int unsigned DataWidth = 32, + parameter int unsigned AddrWidth = 32 +) ( + input logic clk_i, + input logic req_i, + input logic [AddrWidth-1:0] addr_i, + output logic [DataWidth-1:0] rdata_o +); + localparam int RomSize = {num_words}; + localparam int AddrBits = RomSize > 1 ? $clog2(RomSize) : 1; + + const logic [RomSize-1:0][DataWidth-1:0] mem = {{ +''' + + # Add ROM content in REVERSE order (high index first) + # This is because packed arrays fill from high to low index + for i in range(num_words - 1, -1, -1): + sv_content += f" 32'h{words[i]:08x}" + if i > 0: + sv_content += "," + sv_content += "\n" + + sv_content += ''' }; + + // Combinatorial read - no flop to avoid 1-cycle delay + logic [AddrBits-1:0] addr_idx; + assign addr_idx = addr_i[AddrBits-1+2:2]; + + // Return data immediately based on address + assign rdata_o = (addr_idx < RomSize) ? mem[addr_idx] : '0; +endmodule +''' + + # Write output file + with open(output_file, 'w') as f: + f.write(sv_content) + + print(f"Generated {output_file}: {num_words} words ({num_bytes} bytes)") + +def main(): + parser = argparse.ArgumentParser(description='Generate SystemVerilog bootrom from binary') + parser.add_argument('binary', help='Input binary file') + parser.add_argument('-o', '--output', required=True, help='Output SystemVerilog file') + + args = parser.parse_args() + + try: + generate_bootrom_sv(args.binary, args.output) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + +if __name__ == '__main__': + main() From c88461c80a910940e112edc2243b03a940f2e1a7 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:52:41 +0100 Subject: [PATCH 07/67] Update main CMakeLists.txt to include Spatz helper files --- CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e0cb396..404fbf1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) set(CMAKE_VERBOSE_MAKEFILE TRUE) set(CMAKE_EXE_LINKER_FLAGS_INIT "--specs=nosys.specs") -set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE +set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE "-Wl,--whole-archive -Wl,--no-whole-archive" ) set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED True) @@ -57,6 +57,11 @@ endif() include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) +# Spatz support +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/spatz_config.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/spatz_helpers.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/bootrom_helpers.cmake) + ################################################################################ # Add subdirectories # ################################################################################ @@ -74,4 +79,4 @@ add_subdirectory(drivers) # Testing # ################################################################################ -add_subdirectory(tests) \ No newline at end of file +add_subdirectory(tests) From f242c53e9ff8eba3576aa618b4af389a10510d82 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:58:20 +0100 Subject: [PATCH 08/67] [scripts] update scripts permission (755) --- scripts/bin2header.py | 0 scripts/generate_spatz_bootrom.py | 0 scripts/s19tomem.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/bin2header.py mode change 100644 => 100755 scripts/generate_spatz_bootrom.py mode change 100644 => 100755 scripts/s19tomem.py diff --git a/scripts/bin2header.py b/scripts/bin2header.py old mode 100644 new mode 100755 diff --git a/scripts/generate_spatz_bootrom.py b/scripts/generate_spatz_bootrom.py old mode 100644 new mode 100755 diff --git a/scripts/s19tomem.py b/scripts/s19tomem.py old mode 100644 new mode 100755 From 871404007eb13fe49671dd42cf86078ecd4d9414 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 14:18:04 +0100 Subject: [PATCH 09/67] [test] Import utils from MAGIA --- tests/utils/cache_fill.h | 8201 +++++++++++++++++++++++++++++++ tests/utils/event_unit_utils.h | 415 ++ tests/utils/fsync_mm_api.h | 107 + tests/utils/fsync_mm_utils.h | 62 + tests/utils/idma_mm_utils.h | 355 ++ tests/utils/magia_spatz_utils.h | 84 + tests/utils/magia_tile_utils.h | 237 + tests/utils/magia_utils.h | 143 + tests/utils/perf_counters.h | 46 + tests/utils/redmule_mm_utils.h | 146 + tests/utils/spatz_workers.h | 1381 ++++++ tests/utils/tinyprintf.h | 702 +++ tests/utils/w_input.h | 74 + tests/utils/x_input.h | 106 + tests/utils/y_input.h | 106 + tests/utils/z_output.h | 106 + 16 files changed, 12271 insertions(+) create mode 100644 tests/utils/cache_fill.h create mode 100644 tests/utils/event_unit_utils.h create mode 100644 tests/utils/fsync_mm_api.h create mode 100644 tests/utils/fsync_mm_utils.h create mode 100644 tests/utils/idma_mm_utils.h create mode 100644 tests/utils/magia_spatz_utils.h create mode 100644 tests/utils/magia_tile_utils.h create mode 100644 tests/utils/magia_utils.h create mode 100644 tests/utils/perf_counters.h create mode 100644 tests/utils/redmule_mm_utils.h create mode 100644 tests/utils/spatz_workers.h create mode 100644 tests/utils/tinyprintf.h create mode 100644 tests/utils/w_input.h create mode 100644 tests/utils/x_input.h create mode 100644 tests/utils/y_input.h create mode 100644 tests/utils/z_output.h diff --git a/tests/utils/cache_fill.h b/tests/utils/cache_fill.h new file mode 100644 index 00000000..728f91c3 --- /dev/null +++ b/tests/utils/cache_fill.h @@ -0,0 +1,8201 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// Authors: Victor Isachi +// + +void fill_icache(){ + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); + asm volatile("nop" ::); +} diff --git a/tests/utils/event_unit_utils.h b/tests/utils/event_unit_utils.h new file mode 100644 index 00000000..754f9bb8 --- /dev/null +++ b/tests/utils/event_unit_utils.h @@ -0,0 +1,415 @@ +/* + * Copyright (C) 2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * MAGIA Event Unit Utilities + * Two modes: POLLING (non-blocking) and WFE (blocking with p.elw sleep) + */ + +#ifndef EVENT_UNIT_UTILS_H +#define EVENT_UNIT_UTILS_H + +#include +#include "magia_tile_utils.h" + +//============================================================================= +// REGISTER DEFINITIONS AND CONSTANTS +//============================================================================= + +#define EU_BASE EVENT_UNIT_BASE + +// Control and status registers +#define EU_CORE_MASK (EU_BASE + 0x00) +#define EU_CORE_MASK_AND (EU_BASE + 0x04) +#define EU_CORE_MASK_OR (EU_BASE + 0x08) +#define EU_CORE_IRQ_MASK (EU_BASE + 0x0C) +#define EU_CORE_IRQ_MASK_AND (EU_BASE + 0x10) +#define EU_CORE_IRQ_MASK_OR (EU_BASE + 0x14) +#define EU_CORE_STATUS (EU_BASE + 0x18) +#define EU_CORE_BUFFER (EU_BASE + 0x1C) +#define EU_CORE_BUFFER_MASKED (EU_BASE + 0x20) +#define EU_CORE_BUFFER_IRQ_MASKED (EU_BASE + 0x24) +#define EU_CORE_BUFFER_CLEAR (EU_BASE + 0x28) + +// Wait registers (blocking with p.elw) +#define EU_CORE_EVENT_WAIT (EU_BASE + 0x38) +#define EU_CORE_EVENT_WAIT_CLEAR (EU_BASE + 0x3C) + +// Hardware mutex registers (0x04 * mutex_id offset) +#define EU_CORE_HW_MUTEX (EU_BASE + 0x0C0) // R/W: HW mutex management + +// Hardware barrier registers (0x20 * barr_id offset) +#define HW_BARR_TRIGGER_MASK (EU_BASE + 0x400) // R/W: Barrier trigger mask +#define HW_BARR_STATUS (EU_BASE + 0x404) // R: Barrier status +#define HW_BARR_TARGET_MASK (EU_BASE + 0x40C) // R/W: Barrier target mask +#define HW_BARR_TRIGGER (EU_BASE + 0x410) // W: Manual barrier trigger +#define HW_BARR_TRIGGER_SELF (EU_BASE + 0x414) // R: Automatic trigger +#define HW_BARR_TRIGGER_WAIT (EU_BASE + 0x418) // R: Trigger + sleep +#define HW_BARR_TRIGGER_WAIT_CLEAR (EU_BASE + 0x41C) // R: Trigger + sleep + clear + +// Software event trigger registers (0x04 * sw_event_id offset) +#define EU_CORE_TRIGG_SW_EVENT (EU_BASE + 0x600) // W: Generate SW event +#define EU_CORE_TRIGG_SW_EVENT_WAIT (EU_BASE + 0x640) // R: Generate event + sleep +#define EU_CORE_TRIGG_SW_EVENT_WAIT_CLEAR (EU_BASE + 0x680) // R: Generate event + sleep + clear + +// SoC event FIFO register +#define EU_CORE_CURRENT_EVENT (EU_BASE + 0x700) // R: SoC event FIFO + +// Event bit mapping +#define EU_DMA_EVT_0_BIT 2 +#define EU_DMA_EVT_1_BIT 3 +#define EU_TIMER_EVT_0_BIT 4 +#define EU_TIMER_EVT_1_BIT 5 + +#define EU_REDMULE_UNUSED_BIT 8 +#define EU_REDMULE_BUSY_BIT 9 +#define EU_REDMULE_DONE_BIT 10 +#define EU_REDMULE_EVT1_BIT 11 + +// RedMulE event masks +#define EU_REDMULE_DONE_MASK (1 << EU_REDMULE_DONE_BIT) +#define EU_REDMULE_BUSY_MASK (1 << EU_REDMULE_BUSY_BIT) +#define EU_REDMULE_ALL_MASK 0x0F00 + +// iDMA events (DMA events [3:2] + extended [31:26]) +#define EU_IDMA_A2O_DONE_BIT 2 +#define EU_IDMA_O2A_DONE_BIT 3 +#define EU_IDMA_A2O_DONE_MASK (1 << EU_IDMA_A2O_DONE_BIT) +#define EU_IDMA_O2A_DONE_MASK (1 << EU_IDMA_O2A_DONE_BIT) +#define EU_IDMA_ALL_DONE_MASK (EU_IDMA_A2O_DONE_MASK | EU_IDMA_O2A_DONE_MASK) +#define EU_IDMA_A2O_ERROR_BIT 26 +#define EU_IDMA_O2A_ERROR_BIT 27 +#define EU_IDMA_A2O_START_BIT 28 +#define EU_IDMA_O2A_START_BIT 29 +#define EU_IDMA_A2O_BUSY_BIT 30 +#define EU_IDMA_O2A_BUSY_BIT 31 +#define EU_IDMA_A2O_ERROR_MASK (1 << EU_IDMA_A2O_ERROR_BIT) +#define EU_IDMA_O2A_ERROR_MASK (1 << EU_IDMA_O2A_ERROR_BIT) +#define EU_IDMA_A2O_START_MASK (1 << EU_IDMA_A2O_START_BIT) +#define EU_IDMA_O2A_START_MASK (1 << EU_IDMA_O2A_START_BIT) +#define EU_IDMA_A2O_BUSY_MASK (1 << EU_IDMA_A2O_BUSY_BIT) +#define EU_IDMA_O2A_BUSY_MASK (1 << EU_IDMA_O2A_BUSY_BIT) + +// FSync events (cluster events [25:24]) +#define EU_FSYNC_DONE_BIT 24 +#define EU_FSYNC_ERROR_BIT 25 +#define EU_FSYNC_DONE_MASK (1 << EU_FSYNC_DONE_BIT) +#define EU_FSYNC_ERROR_MASK (1 << EU_FSYNC_ERROR_BIT) +#define EU_FSYNC_ALL_MASK (EU_FSYNC_DONE_MASK | EU_FSYNC_ERROR_MASK) + +// Spatz events (accelerator events [8] + cluster events [23]) +#define EU_SPATZ_DONE_BIT 8 // acc_events_array[0][0] - Spatz completion +#define EU_SPATZ_START_BIT 23 // other_events_array[0][23] - Spatz start trigger +#define EU_SPATZ_DONE_MASK (1 << EU_SPATZ_DONE_BIT) +#define EU_SPATZ_START_MASK (1 << EU_SPATZ_START_BIT) +#define EU_SPATZ_ALL_MASK (EU_SPATZ_DONE_MASK | EU_SPATZ_START_MASK) + +// Wait modes +typedef enum { + EU_WAIT_MODE_POLLING = 0, + EU_WAIT_MODE_WFE = 1 +} eu_wait_mode_t; + +//============================================================================= +// LOW-LEVEL HAL (PULP-compatible evt_read32) +//============================================================================= + +// evt_read32: blocking read with p.elw instruction +static inline unsigned int evt_read32(unsigned int base, unsigned int offset) { + unsigned int value; + unsigned int addr = base + offset; + // Direct p.elw inline assembly for PULP cores (RI5CY, CV32E40P) + __asm__ __volatile__ ( + "p.elw %0, 0(%1)" + : "=r" (value) + : "r" (addr) + : "memory" + ); + return value; +} + +//============================================================================= +// BASIC CONTROL FUNCTIONS +//============================================================================= + +static inline void eu_init(void) { + mmio32(EU_CORE_BUFFER_CLEAR) = 0xFFFFFFFF; + mmio32(EU_CORE_MASK) = 0x00000000; + mmio32(EU_CORE_IRQ_MASK) = 0x00000000; +} + +static inline void eu_enable_events(uint32_t event_mask) { + mmio32(EU_CORE_MASK_OR) = event_mask; +} + +static inline void eu_disable_events(uint32_t event_mask) { + mmio32(EU_CORE_MASK_AND) = event_mask; +} + +static inline void eu_enable_irq(uint32_t irq_mask) { + mmio32(EU_CORE_IRQ_MASK_OR) = irq_mask; +} + +static inline void eu_disable_irq(uint32_t irq_mask) { + mmio32(EU_CORE_IRQ_MASK_AND) = irq_mask; +} + +static inline void eu_clear_events(uint32_t event_mask) { + mmio32(EU_CORE_BUFFER_CLEAR) = event_mask; +} + +//============================================================================= +// STATUS READ FUNCTIONS (non-blocking) +//============================================================================= + +static inline uint32_t eu_get_events(void) { + return mmio32(EU_CORE_BUFFER); +} + +static inline uint32_t eu_get_events_masked(void) { + return mmio32(EU_CORE_BUFFER_MASKED); +} + +static inline uint32_t eu_check_events(uint32_t event_mask) { + return mmio32(EU_CORE_BUFFER_MASKED) & event_mask; +} + +//============================================================================= +// WAIT FUNCTIONS (polling and blocking) +//============================================================================= + +// POLLING mode: non-blocking busy-wait +static inline uint32_t eu_wait_events_polling(uint32_t event_mask, uint32_t timeout_cycles) { + uint32_t cycles = 0; + uint32_t detected_events; + do { + detected_events = eu_check_events(event_mask); + if (detected_events){ + eu_clear_events(detected_events); + return detected_events; + } + wait_nop(10); + cycles += 10; + } while (timeout_cycles == 0 || cycles < timeout_cycles); + return 0; +} + +// WFE mode: blocking sleep with p.elw +static inline uint32_t eu_wait_events_wfe(uint32_t event_mask) { + eu_enable_events(event_mask); + return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); +} + +// Generic wait with mode selection +static inline uint32_t eu_wait_events(uint32_t event_mask, eu_wait_mode_t mode, uint32_t timeout_cycles) { + if (mode == EU_WAIT_MODE_WFE) + return eu_wait_events_wfe(event_mask); + else + return eu_wait_events_polling(event_mask, timeout_cycles); +} + +// PULP HAL compatible functions +static inline unsigned int eu_evt_wait(void) { + return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT - EU_BASE); +} + +static inline unsigned int eu_evt_waitAndClr(void) { + return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); +} + +static inline unsigned int eu_evt_maskWaitAndClr(unsigned int evtMask) { + eu_enable_events(evtMask); + unsigned int result = eu_evt_waitAndClr(); + eu_disable_events(evtMask); + return result; +} + +//============================================================================= +// REDMULE FUNCTIONS +//============================================================================= + +static inline void eu_redmule_init(void) { + eu_clear_events(0xFFFFFFFF); + eu_enable_events(EU_REDMULE_DONE_MASK); +} + +static inline uint32_t eu_redmule_wait_completion(eu_wait_mode_t mode) { + return eu_wait_events(EU_REDMULE_DONE_MASK, mode, 1000000); +} + +static inline uint32_t eu_redmule_is_busy(void) { + return eu_check_events(EU_REDMULE_BUSY_MASK); +} + +static inline uint32_t eu_redmule_is_done(void) { + return eu_check_events(EU_REDMULE_DONE_MASK); +} + +//============================================================================= +// IDMA FUNCTIONS +//============================================================================= + +static inline void eu_idma_init(void) { + eu_clear_events(0xFFFFFFFF); + eu_enable_events(EU_IDMA_ALL_DONE_MASK); +} + +static inline uint32_t eu_idma_wait_completion(eu_wait_mode_t mode) { + return eu_wait_events(EU_IDMA_ALL_DONE_MASK, mode, 1000000); +} + +static inline uint32_t eu_idma_wait_direction_completion(uint32_t direction, eu_wait_mode_t mode) { + uint32_t wait_mask = direction ? EU_IDMA_O2A_DONE_MASK : EU_IDMA_A2O_DONE_MASK; + return eu_wait_events(wait_mask, mode, 1000000); +} + +static inline uint32_t eu_idma_wait_a2o_completion(eu_wait_mode_t mode) { + return eu_wait_events(EU_IDMA_A2O_DONE_MASK, mode, 1000000); +} + +static inline uint32_t eu_idma_wait_o2a_completion(eu_wait_mode_t mode) { + return eu_wait_events(EU_IDMA_O2A_DONE_MASK, mode, 1000000); +} + +static inline uint32_t eu_idma_is_done(void) { + return eu_check_events(EU_IDMA_ALL_DONE_MASK); +} + +static inline uint32_t eu_idma_a2o_is_done(void) { + return eu_check_events(EU_IDMA_A2O_DONE_MASK); +} + +static inline uint32_t eu_idma_o2a_is_done(void) { + return eu_check_events(EU_IDMA_O2A_DONE_MASK); +} + +static inline uint32_t eu_idma_is_busy(void) { + uint32_t events = eu_get_events(); + return events & (EU_IDMA_A2O_BUSY_MASK | EU_IDMA_O2A_BUSY_MASK); +} + +static inline uint32_t eu_idma_has_error(void) { + uint32_t events = eu_get_events(); + return events & (EU_IDMA_A2O_ERROR_MASK | EU_IDMA_O2A_ERROR_MASK); +} + +//============================================================================= +// FSYNC FUNCTIONS +//============================================================================= + +static inline void eu_fsync_init(void) { + eu_clear_events(0xFFFFFFFF); + eu_enable_events(EU_FSYNC_ALL_MASK); +} + +static inline uint32_t eu_fsync_wait_completion(eu_wait_mode_t mode) { + return eu_wait_events(EU_FSYNC_DONE_MASK, mode, 1000000); +} + +static inline uint32_t eu_fsync_is_done(void) { + return eu_check_events(EU_FSYNC_DONE_MASK); +} + +static inline uint32_t eu_fsync_has_error(void) { + return eu_check_events(EU_FSYNC_ERROR_MASK); +} + +//============================================================================= +// SPATZ FUNCTIONS +//============================================================================= + +static inline void eu_spatz_init(void) { + eu_clear_events(0xFFFFFFFF); + eu_enable_events(EU_SPATZ_DONE_MASK); +} + +static inline uint32_t eu_spatz_is_done(void) { + return eu_check_events(EU_SPATZ_DONE_MASK); +} + + +static inline void eu_wait_spatz_wfe(uint32_t event_mask) { + while (!eu_check_events(event_mask)) { + eu_evt_wait(); + } + eu_clear_events(event_mask); +} + +static inline void eu_wait_spatz_polling(uint32_t event_mask) { + while (!eu_check_events(event_mask)) { + wait_nop(10); + } + eu_clear_events(event_mask); +} + +//============================================================================= +// MULTI-ACCELERATOR FUNCTIONS +//============================================================================= + +static inline void eu_multi_init(uint32_t redmule_en, uint32_t idma_a2o_en, + uint32_t idma_o2a_en, uint32_t fsync_en) { + eu_clear_events(0xFFFFFFFF); + uint32_t event_mask = 0; + + if (redmule_en) { + event_mask |= EU_REDMULE_ALL_MASK; + } + if (idma_a2o_en) { + event_mask |= EU_IDMA_A2O_DONE_MASK; + } + if (idma_o2a_en) { + event_mask |= EU_IDMA_O2A_DONE_MASK; + } + if (fsync_en) { + event_mask |= EU_FSYNC_ALL_MASK; + } + + if (event_mask) eu_enable_events(event_mask); +} + +static inline uint32_t eu_multi_wait_all(uint32_t wait_redmule, uint32_t wait_idma_a2o, + uint32_t wait_idma_o2a, uint32_t wait_fsync, + eu_wait_mode_t mode) { + uint32_t required_mask = 0; + if (wait_redmule) required_mask |= EU_REDMULE_DONE_MASK; + if (wait_idma_a2o) required_mask |= EU_IDMA_A2O_DONE_MASK; + if (wait_idma_o2a) required_mask |= EU_IDMA_O2A_DONE_MASK; + if (wait_fsync) required_mask |= EU_FSYNC_DONE_MASK; + + eu_enable_events(required_mask); + + if (mode == EU_WAIT_MODE_WFE) { + uint32_t accumulated = 0; + while ((accumulated & required_mask) != required_mask) { + uint32_t new_events = evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); + accumulated |= new_events; + } + return accumulated; + } else { + uint32_t timeout = 1000000; + uint32_t cycles = 0; + uint32_t accumulated = 0; + while (cycles < timeout && (accumulated & required_mask) != required_mask) { + accumulated |= eu_check_events(required_mask); + wait_nop(10); + cycles += 10; + } + return accumulated; + } +} + +#endif /* EVENT_UNIT_UTILS_H */ diff --git a/tests/utils/fsync_mm_api.h b/tests/utils/fsync_mm_api.h new file mode 100644 index 00000000..8f271290 --- /dev/null +++ b/tests/utils/fsync_mm_api.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * Based on fsync_api.h by Victor Isachi + * + * MAGIA FractalSync Memory-Mapped Synchronization Patterns API + */ + +#ifndef FSYNC_MM_API_H +#define FSYNC_MM_API_H + + #include "fsync_mm_utils.h" + #include "magia_tile_utils.h" + #include "magia_utils.h" + + #define _FS_MM_GLOBAL_AGGR (0xFFFFFFFF >> (1+__builtin_clz(NUM_HARTS))) + #define _FS_MM_GLOBAL_ID (-1) + #define _FS_MM_HNBR_AGGR (0x1) + #define _FS_MM_HNBR_ID (0) + #define _FS_MM_VNBR_AGGR (0x1) + #define _FS_MM_VNBR_ID (1) + #define _FS_MM_HRING_AGGR (0x1) + #define _FS_MM_HRING_ID (2) + #define _FS_MM_VRING_AGGR (0x1) + #define _FS_MM_VRING_ID (3) + #define _FS_MM_RC_LVL (0x1 << (29-__builtin_clz(NUM_HARTS))) + #define _FS_MM_RC_AGGR (0x155 >> (__builtin_clz(NUM_HARTS)-21)) + + // Lookup table indicating the id of row synchronization + uint32_t row_id_lookup_mm(volatile uint32_t hartid_y){ + if (hartid_y < MESH_Y_TILES/2) return 2*hartid_y; + else return 2*(hartid_y-MESH_Y_TILES/2); + } + + // Lookup table indicating the id of column synchronization + uint32_t col_id_lookup_mm(volatile uint32_t hartid_x){ + if (hartid_x < MESH_X_TILES/2) return 2*hartid_x+1; + else return 2*(hartid_x-MESH_X_TILES/2)+1; + } + + static inline void fsync_mm_hnbr(){ + fsync_mm(_FS_MM_HNBR_ID, _FS_MM_HNBR_AGGR); + } + + static inline void fsync_mm_vnbr(){ + fsync_mm(_FS_MM_VNBR_ID, _FS_MM_VNBR_AGGR); + } + + void fsync_mm_hring(){ + uint32_t hartid = get_hartid(); + uint32_t hartid_x = GET_X_ID(hartid); + uint32_t hartid_y = GET_Y_ID(hartid); + if ((hartid_x == 0) || (hartid_x == MESH_X_TILES-1)){ + uint32_t id = row_id_lookup_mm(hartid_y); + fsync_mm(id, _FS_MM_RC_LVL); + } else { + fsync_mm(_FS_MM_HRING_ID, _FS_MM_HRING_AGGR); + } + } + + void fsync_mm_vring(){ + uint32_t hartid = get_hartid(); + uint32_t hartid_x = GET_X_ID(hartid); + uint32_t hartid_y = GET_Y_ID(hartid); + if ((hartid_y == 0) || (hartid_y == MESH_Y_TILES-1)){ + uint32_t id = col_id_lookup_mm(hartid_x); + fsync_mm(id, _FS_MM_RC_LVL); + } else { + fsync_mm(_FS_MM_VRING_ID, _FS_MM_VRING_AGGR); + } + } + + void fsync_mm_rows(){ + uint32_t hartid = get_hartid(); + uint32_t hartid_y = GET_Y_ID(hartid); + uint32_t id = row_id_lookup_mm(hartid_y); + fsync_mm(id, _FS_MM_RC_AGGR); + } + + void fsync_mm_cols(){ + uint32_t hartid = get_hartid(); + uint32_t hartid_x = GET_X_ID(hartid); + uint32_t id = col_id_lookup_mm(hartid_x); + fsync_mm(id, _FS_MM_RC_AGGR); + } + + static inline void fsync_mm_global(){ + fsync_mm(_FS_MM_GLOBAL_ID, _FS_MM_GLOBAL_AGGR); + } + + + +#endif /*FSYNC_MM_API_H*/ diff --git a/tests/utils/fsync_mm_utils.h b/tests/utils/fsync_mm_utils.h new file mode 100644 index 00000000..036d6735 --- /dev/null +++ b/tests/utils/fsync_mm_utils.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * Based on fsync_isa_utils.h by Victor Isachi + * + * MAGIA FractalSync Memory-Mapped Utils + * WARNING: Make sure to undefine EVENT_UNIT in this file if POLLING in registers mm is desired, otherwise polling mode will not work correctly + */ + +#ifndef FSYNC_MM_UTILS_H +#define FSYNC_MM_UTILS_H +#define EVENT_UNIT + +#include "magia_tile_utils.h" + +/* Memory-mapped FractalSync register offsets */ +#define FSYNC_MM_AGGR_REG_OFFSET (0x00) +#define FSYNC_MM_ID_REG_OFFSET (0x04) +#define FSYNC_MM_CONTROL_REG_OFFSET (0x08) +#define FSYNC_MM_STATUS_REG_OFFSET (0x0C) + +/* Status register bits */ +#define FSYNC_MM_STATUS_BUSY_MASK (1 << 2) + +/* Memory-mapped sync function */ +static inline void fsync_mm(volatile uint32_t id, volatile uint32_t aggregate){ + volatile char *fsync_base = (volatile char *)(FSYNC_BASE); + + *(volatile uint32_t *)(fsync_base + FSYNC_MM_AGGR_REG_OFFSET) = aggregate; + *(volatile uint32_t *)(fsync_base + FSYNC_MM_ID_REG_OFFSET) = id; + *(volatile uint32_t *)(fsync_base + FSYNC_MM_CONTROL_REG_OFFSET) = 1; + +#ifndef EVENT_UNIT + // Polling mode - wait for completion + volatile uint32_t status; + do { + status = *(volatile uint32_t *)(fsync_base + FSYNC_MM_STATUS_REG_OFFSET); + if (status & FSYNC_MM_STATUS_BUSY_MASK) { + printf("FSYNC_MM still busy...\n"); + // Still busy, optionally add a small delay here + } + } while (status & FSYNC_MM_STATUS_BUSY_MASK); +#endif + // In non-stalling mode, the function returns immediately + // and the caller should do wfi to wait for interrupt +} + +#endif /*FSYNC_MM_UTILS_H*/ diff --git a/tests/utils/idma_mm_utils.h b/tests/utils/idma_mm_utils.h new file mode 100644 index 00000000..4b29c509 --- /dev/null +++ b/tests/utils/idma_mm_utils.h @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * Based on idma_utils.h by Victor Isachi + * + * MAGIA iDMA Memory-Mapped I/O Utils + */ + +#ifndef IDMA_MM_UTILS_H +#define IDMA_MM_UTILS_H + +#include +#include "magia_tile_utils.h" + +//============================================================================= +// Register Definitions and Constants +//============================================================================= + +// iDMA Memory-Mapped Register Base Addresses +#define IDMA_MM_DIRECTION_OFFSET (0x200) +#define IDMA_MM_BASE_AXI2OBI (IDMA_BASE) // direction=0, L2 to L1 +#define IDMA_MM_BASE_OBI2AXI (IDMA_BASE + IDMA_MM_DIRECTION_OFFSET) // direction=1, L1 to L2 + +#define IDMA_CONF_OFFSET (0x00) +#define IDMA_STATUS_OFFSET (0x04) +#define IDMA_NEXT_ID_OFFSET (0x44) +#define IDMA_DONE_ID_OFFSET (0x84) +#define IDMA_DST_ADDR_LOW_OFFSET (0xD0) +#define IDMA_SRC_ADDR_LOW_OFFSET (0xD8) +#define IDMA_LENGTH_LOW_OFFSET (0xE0) +#define IDMA_DST_STRIDE_2_LOW_OFFSET (0xE8) +#define IDMA_SRC_STRIDE_2_LOW_OFFSET (0xF0) +#define IDMA_REPS_2_LOW_OFFSET (0xF8) +#define IDMA_DST_STRIDE_3_LOW_OFFSET (0x100) +#define IDMA_SRC_STRIDE_3_LOW_OFFSET (0x108) +#define IDMA_REPS_3_LOW_OFFSET (0x110) + +// Register Addresses - now direction-aware +#define IDMA_CONF_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_CONF_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_CONF_OFFSET)) +#define IDMA_STATUS_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_STATUS_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_STATUS_OFFSET + ((id) * 4))) +#define IDMA_NEXT_ID_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_NEXT_ID_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_NEXT_ID_OFFSET + ((id) * 4))) +#define IDMA_DONE_ID_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DONE_ID_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_DONE_ID_OFFSET + ((id) * 4))) +#define IDMA_DST_ADDR_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_ADDR_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_ADDR_LOW_OFFSET)) +#define IDMA_SRC_ADDR_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_ADDR_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_ADDR_LOW_OFFSET)) +#define IDMA_LENGTH_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_LENGTH_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_LENGTH_LOW_OFFSET)) +#define IDMA_DST_STRIDE_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_STRIDE_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_STRIDE_2_LOW_OFFSET)) +#define IDMA_SRC_STRIDE_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_STRIDE_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_STRIDE_2_LOW_OFFSET)) +#define IDMA_REPS_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_REPS_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_REPS_2_LOW_OFFSET)) +#define IDMA_DST_STRIDE_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_STRIDE_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_STRIDE_3_LOW_OFFSET)) +#define IDMA_SRC_STRIDE_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_STRIDE_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_STRIDE_3_LOW_OFFSET)) +#define IDMA_REPS_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_REPS_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_REPS_3_LOW_OFFSET)) + +// Configuration Register Bit Fields +#define IDMA_CONF_DECOUPLE_AW_BIT (0) +#define IDMA_CONF_DECOUPLE_RW_BIT (1) +#define IDMA_CONF_SRC_REDUCE_LEN_BIT (2) +#define IDMA_CONF_DST_REDUCE_LEN_BIT (3) +#define IDMA_CONF_SRC_MAX_LLEN_MASK (0x70) // bits 6:4 +#define IDMA_CONF_SRC_MAX_LLEN_SHIFT (4) +#define IDMA_CONF_DST_MAX_LLEN_MASK (0x380) // bits 9:7 +#define IDMA_CONF_DST_MAX_LLEN_SHIFT (7) +#define IDMA_CONF_ENABLE_ND_MASK (0xC00) // bits 11:10 +#define IDMA_CONF_ENABLE_ND_SHIFT (10) + +// Status Register Bit Fields +#define IDMA_STATUS_BUSY_MASK (0x3FF) // bits 9:0 + +// Transfer Direction Constants +#define IDMA_DIR_L2_TO_L1 (0) // AXI2OBI direction +#define IDMA_DIR_L1_TO_L2 (1) // OBI2AXI direction + +// Direction aliases +#define IDMA_EXT2LOC 0 // L2 to L1 (AXI2OBI) +#define IDMA_LOC2EXT 1 // L1 to L2 (OBI2AXI) + +// Transfer dimensions +#define IDMA_1D 0 +#define IDMA_2D 1 +#define IDMA_3D 2 + +// Protocol definitions +typedef enum { + IDMA_PROT_AXI = 0, // AXI protocol: L2 memory + IDMA_PROT_OBI = 1 // OBI protocol: L1 memory +} idma_prot_t; + +typedef unsigned int dma_ext_t; + +// Configuration macros +#define IDMA_DEFAULT_CONFIG 0x0 + +//============================================================================= +// Low-Level Register Access Functions +//============================================================================= + +static inline void idma_mm_conf_dir(uint32_t is_l1_to_l2, uint32_t decouple_aw, uint32_t decouple_rw, + uint32_t src_reduce_len, uint32_t dst_reduce_len, + uint32_t src_max_llen, uint32_t dst_max_llen, + uint32_t enable_nd) { + uint32_t conf_val = 0; + + if (decouple_aw) conf_val |= (1 << IDMA_CONF_DECOUPLE_AW_BIT); + if (decouple_rw) conf_val |= (1 << IDMA_CONF_DECOUPLE_RW_BIT); + if (src_reduce_len) conf_val |= (1 << IDMA_CONF_SRC_REDUCE_LEN_BIT); + if (dst_reduce_len) conf_val |= (1 << IDMA_CONF_DST_REDUCE_LEN_BIT); + + conf_val |= ((src_max_llen & 0x7) << IDMA_CONF_SRC_MAX_LLEN_SHIFT); + conf_val |= ((dst_max_llen & 0x7) << IDMA_CONF_DST_MAX_LLEN_SHIFT); + conf_val |= ((enable_nd & 0x3) << IDMA_CONF_ENABLE_ND_SHIFT); + + mmio32(IDMA_CONF_ADDR(is_l1_to_l2)) = conf_val; +} + +static inline void idma_mm_conf_default_dir(uint32_t is_l1_to_l2) { + idma_mm_conf_dir(is_l1_to_l2, 0, 0, 0, 0, 0, 0, 3); +} + +static inline uint32_t idma_mm_is_busy_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { + if (stream_id >= 16) return 0; + uint32_t status = mmio32(IDMA_STATUS_ADDR(is_l1_to_l2, stream_id)); + return (status & IDMA_STATUS_BUSY_MASK) ? 1 : 0; +} + +static inline uint32_t idma_mm_start_transfer_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { + if (stream_id >= 16) return 0; + uint32_t transfer_id = mmio32(IDMA_NEXT_ID_ADDR(is_l1_to_l2, stream_id)); + return transfer_id; +} + +static inline uint32_t idma_mm_get_done_id_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { + if (stream_id >= 16) return 0; + return mmio32(IDMA_DONE_ID_ADDR(is_l1_to_l2, stream_id)); +} + +static inline void idma_mm_set_addr_len_dir(uint32_t is_l1_to_l2, uint32_t dst_addr, uint32_t src_addr, uint32_t length) { + mmio32(IDMA_DST_ADDR_LOW_ADDR(is_l1_to_l2)) = dst_addr; + mmio32(IDMA_SRC_ADDR_LOW_ADDR(is_l1_to_l2)) = src_addr; + mmio32(IDMA_LENGTH_LOW_ADDR(is_l1_to_l2)) = length; +} + +static inline void idma_mm_set_2d_params_dir(uint32_t is_l1_to_l2, uint32_t dst_stride_2, uint32_t src_stride_2, uint32_t reps_2) { + mmio32(IDMA_DST_STRIDE_2_LOW_ADDR(is_l1_to_l2)) = dst_stride_2; + mmio32(IDMA_SRC_STRIDE_2_LOW_ADDR(is_l1_to_l2)) = src_stride_2; + mmio32(IDMA_REPS_2_LOW_ADDR(is_l1_to_l2)) = reps_2; +} + +static inline void idma_mm_set_3d_params_dir(uint32_t is_l1_to_l2, uint32_t dst_stride_3, uint32_t src_stride_3, uint32_t reps_3) { + mmio32(IDMA_DST_STRIDE_3_LOW_ADDR(is_l1_to_l2)) = dst_stride_3; + mmio32(IDMA_SRC_STRIDE_3_LOW_ADDR(is_l1_to_l2)) = src_stride_3; + mmio32(IDMA_REPS_3_LOW_ADDR(is_l1_to_l2)) = reps_3; +} + +static inline uint32_t idma_mm_wait_for_completion(uint32_t direction, uint32_t transfer_id) { + if (transfer_id == 0) return 0; + + uint32_t is_l1_to_l2 = (direction == IDMA_DIR_L1_TO_L2) ? 1 : 0; + uint32_t stream_id = 0; + uint32_t timeout = 1000000; + + while (timeout-- > 0) { + uint32_t is_busy = idma_mm_is_busy_dir(is_l1_to_l2, stream_id); + + if (!is_busy) { + uint32_t done_id = idma_mm_get_done_id_dir(is_l1_to_l2, stream_id); + if (done_id == transfer_id) { + return 1; + } + } + + wait_nop(10); + } + + return 0; +} + +//============================================================================= +// High-Level DMA API - 1D Transfers +//============================================================================= + +// Forward declarations +static inline int idma_L1ToL2(unsigned int src, unsigned int dst, unsigned short size); +static inline int idma_L2ToL1(unsigned int src, unsigned int dst, unsigned short size); +static inline int idma_L1ToL1(unsigned int src, unsigned int dst, unsigned short size); +static inline int idma_L1ToL2_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); +static inline int idma_L2ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); +static inline int idma_L1ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); + +static inline int dma_memcpy(dma_ext_t ext, unsigned int loc, unsigned short size, int ext2loc) { + if (ext2loc) + return idma_L2ToL1(ext, loc, size); + else + return idma_L1ToL2(loc, ext, size); +} + +static inline int dma_l1ToExt(dma_ext_t ext, unsigned int loc, unsigned short size) { + return idma_L1ToL2(loc, ext, size); +} + +static inline int dma_extToL1(unsigned int loc, dma_ext_t ext, unsigned short size) { + return idma_L2ToL1(ext, loc, size); +} + +static inline int idma_memcpy(unsigned int src, unsigned int dst, unsigned int size, + idma_prot_t src_prot, idma_prot_t dst_prot) { + if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_AXI) { + return idma_L1ToL2(src, dst, size); + } else if (src_prot == IDMA_PROT_AXI && dst_prot == IDMA_PROT_OBI) { + return idma_L2ToL1(src, dst, size); + } else if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_OBI) { + return idma_L1ToL1(src, dst, size); + } + return 0; +} + +static inline int idma_L1ToL2(unsigned int src, unsigned int dst, unsigned short size) { + idma_mm_conf_default_dir(1); + idma_mm_set_addr_len_dir(1, dst, src, size); + idma_mm_set_2d_params_dir(1, 0, 0, 1); + idma_mm_set_3d_params_dir(1, 0, 0, 1); + return idma_mm_start_transfer_dir(1, 0); +} + +static inline int idma_L2ToL1(unsigned int src, unsigned int dst, unsigned short size) { + idma_mm_conf_default_dir(0); + idma_mm_set_addr_len_dir(0, dst, src, size); + idma_mm_set_2d_params_dir(0, 0, 0, 1); + idma_mm_set_3d_params_dir(0, 0, 0, 1); + return idma_mm_start_transfer_dir(0, 0); +} + +// L1-to-L1 transfers: Remote to Local (PULL) +static inline int idma_L1ToL1_pull(unsigned int remote_src, unsigned int local_dst, unsigned short size) { + idma_mm_conf_default_dir(0); // AXI2OBI: read from remote (AXI), write to local (OBI) + idma_mm_set_addr_len_dir(0, local_dst, remote_src, size); + idma_mm_set_2d_params_dir(0, 0, 0, 1); + idma_mm_set_3d_params_dir(0, 0, 0, 1); + return idma_mm_start_transfer_dir(0, 0); +} + +// L1-to-L1 transfers: Local to Remote (PUSH) +static inline int idma_L1ToL1_push(unsigned int local_src, unsigned int remote_dst, unsigned short size) { + idma_mm_conf_default_dir(1); // OBI2AXI: read from local (OBI), write to remote (AXI) + idma_mm_set_addr_len_dir(1, remote_dst, local_src, size); + idma_mm_set_2d_params_dir(1, 0, 0, 1); + idma_mm_set_3d_params_dir(1, 0, 0, 1); + return idma_mm_start_transfer_dir(1, 0); +} + + +//============================================================================= +// High-Level DMA API - 2D Transfers +//============================================================================= + +static inline int idma_memcpy_2d(unsigned int src, unsigned int dst, unsigned int size, + unsigned int src_stride, unsigned int dst_stride, + unsigned int num_reps, idma_prot_t src_prot, idma_prot_t dst_prot) { + if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_AXI) { + return idma_L1ToL2_2d(src, dst, size, src_stride, dst_stride, num_reps); + } else if (src_prot == IDMA_PROT_AXI && dst_prot == IDMA_PROT_OBI) { + return idma_L2ToL1_2d(src, dst, size, src_stride, dst_stride, num_reps); + } else if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_OBI) { + return idma_L1ToL1_2d(src, dst, size, src_stride, dst_stride, num_reps); + } + return 0; +} + +static inline int idma_L1ToL2_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { + idma_mm_conf_default_dir(1); + idma_mm_set_addr_len_dir(1, dst, src, size); + idma_mm_set_2d_params_dir(1, dst_stride, src_stride, num_reps); + idma_mm_set_3d_params_dir(1, 0, 0, 1); + return idma_mm_start_transfer_dir(1, 0); +} + +static inline int idma_L2ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { + idma_mm_conf_default_dir(0); + idma_mm_set_addr_len_dir(0, dst, src, size); + idma_mm_set_2d_params_dir(0, dst_stride, src_stride, num_reps); + idma_mm_set_3d_params_dir(0, 0, 0, 1); + return idma_mm_start_transfer_dir(0, 0); +} + +// L1-to-L1 2D transfers: Remote to Local (PULL) +static inline int idma_L1ToL1_pull_2d(unsigned int remote_src, unsigned int local_dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { + idma_mm_conf_default_dir(0); // AXI2OBI + idma_mm_set_addr_len_dir(0, local_dst, remote_src, size); + idma_mm_set_2d_params_dir(0, dst_stride, src_stride, num_reps); + idma_mm_set_3d_params_dir(0, 0, 0, 1); + return idma_mm_start_transfer_dir(0, 0); +} + +// L1-to-L1 2D transfers: Local to Remote (PUSH) +static inline int idma_L1ToL1_push_2d(unsigned int local_src, unsigned int remote_dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { + idma_mm_conf_default_dir(1); // OBI2AXI + idma_mm_set_addr_len_dir(1, remote_dst, local_src, size); + idma_mm_set_2d_params_dir(1, dst_stride, src_stride, num_reps); + idma_mm_set_3d_params_dir(1, 0, 0, 1); + return idma_mm_start_transfer_dir(1, 0); +} + +// Legacy L1-to-L1 2D function (assumes remote->local for backward compatibility) +static inline int idma_L1ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, + unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { + return idma_L1ToL1_pull_2d(src, dst, size, src_stride, dst_stride, num_reps); +} + +//============================================================================= +// Status and Wait Functions +//============================================================================= + +static inline unsigned int idma_tx_cplt(unsigned int dma_tx_id) { + uint32_t done_id_axi2obi = idma_mm_get_done_id_dir(0, 0); + uint32_t done_id_obi2axi = idma_mm_get_done_id_dir(1, 0); + + return (done_id_axi2obi == dma_tx_id) || (done_id_obi2axi == dma_tx_id); +} + +static inline unsigned int dma_status() { + return idma_mm_is_busy_dir(0, 0) || idma_mm_is_busy_dir(1, 0); +} + +static inline void dma_wait(unsigned int dma_tx_id) { + while(!idma_tx_cplt(dma_tx_id)) { + wait_nop(1); + } +} + +static inline void dma_barrier() { + while(dma_status()) { + wait_nop(1); + } +} + +#endif /*IDMA_MM_UTILS_H*/ diff --git a/tests/utils/magia_spatz_utils.h b/tests/utils/magia_spatz_utils.h new file mode 100644 index 00000000..b5969a9e --- /dev/null +++ b/tests/utils/magia_spatz_utils.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * Spatz Utility Functions + */ +#ifndef MAGIA_SPATZ_UTILS_H +#define MAGIA_SPATZ_UTILS_H + +#include +#include "magia_tile_utils.h" + +#define SPATZ_CLK_EN (SPATZ_CTRL_BASE + 0x00) +#define SPATZ_START (SPATZ_CTRL_BASE + 0x04) +#define SPATZ_TASKBIN (SPATZ_CTRL_BASE + 0x08) +#define SPATZ_DATA (SPATZ_CTRL_BASE + 0x0C) +#define SPATZ_RETURN (SPATZ_CTRL_BASE + 0x10) +#define SPATZ_DONE (SPATZ_CTRL_BASE + 0x14) + +#define mmio32(x) (*(volatile uint32_t *)(x)) + +static inline void spatz_clk_en(void) { + mmio32(SPATZ_CLK_EN) = 1; +} + +static inline void spatz_clk_dis(void) { + mmio32(SPATZ_CLK_EN) = 0; +} + +static inline void spatz_set_func(uint32_t addr) { + mmio32(SPATZ_TASKBIN) = addr; +} + +static inline void spatz_trigger_en_irq(void) { + mmio32(SPATZ_START) = 1; +} + +static inline void spatz_trigger_dis_irq(void) { + mmio32(SPATZ_START) = 0; +} + +static inline void spatz_done(void) { + mmio32(SPATZ_DONE) = 1; +} + +static inline uint32_t spatz_get_exit_code(void) { + return mmio32(SPATZ_RETURN); +} + +static inline void spatz_run_task(uint32_t spatz_task_addr) { + spatz_set_func(spatz_task_addr); + spatz_trigger_en_irq(); + while(mmio32(SPATZ_START) != 0); +} + +static inline void spatz_pass_params(uint32_t params_ptr) { + mmio32(SPATZ_DATA) = params_ptr; +} + +static inline void spatz_run_task_with_params(uint32_t spatz_task_addr, uint32_t params_ptr) { + spatz_pass_params(params_ptr); + spatz_run_task(spatz_task_addr); +} + +static inline void spatz_init(uint32_t spatz_start_addr) { + spatz_set_func(spatz_start_addr); + spatz_clk_en(); +} + +#endif diff --git a/tests/utils/magia_tile_utils.h b/tests/utils/magia_tile_utils.h new file mode 100644 index 00000000..38e57896 --- /dev/null +++ b/tests/utils/magia_tile_utils.h @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Victor Isachi + * + * MAGIA Tile Utils + */ + +#ifndef MAGIA_TILE_UTILS_H +#define MAGIA_TILE_UTILS_H + +#include +#include "tinyprintf.h" + + +#define NUM_L1_BANKS (32) +#define WORDS_BANK (8192) +#define BITS_WORD (32) +#define BITS_BYTE (8) + +#define REDMULE_BASE (0x00000100) +#define REDMULE_END (0x000001FF) +#define IDMA_BASE (0x00000200) +#define IDMA_END (0x000005FF) +#define FSYNC_BASE (0x00000600) +#define FSYNC_END (0x000006FF) +#define EVENT_UNIT_BASE (0x00000700) +#define EVENT_UNIT_END (0x000016FF) +#define SPATZ_CTRL_BASE (0x00001700) +#define SPATZ_CTRL_END (0x000017FF) +#define RESERVED_START (0x00001800) +#define RESERVED_END (0x0000FFFF) +#define STACK_START (0x00010000) +#define STACK_END (0x0001FFFF) +#define L1_BASE (0x00020000) +#define L1_SIZE (0x000DFFFF) +#define L1_TILE_OFFSET (0x00100000) +#define L2_BASE (0xCC000000) +#define TEST_END_ADDR (0xCCFF0000) + +#define DEFAULT_EXIT_CODE (0xDEFC) +#define PASS_EXIT_CODE (0xAAAA) +#define FAIL_EXIT_CODE (0xFFFF) + +// Individual IRQ indices removed - Event Unit provides unified interrupt management +// Use Event Unit API (event_unit_utils.h) for event handling + +#define mmio64(x) (*(volatile uint64_t *)(x)) +#define mmio32(x) (*(volatile uint32_t *)(x)) +#define mmio16(x) (*(volatile uint16_t *)(x)) +#define mmio8(x) (*(volatile uint8_t *)(x)) + +// Spatz Control: Use magia_spatz_utils.h for Spatz programming functions + +#define addr64(x) (*(uint64_t *)(&x)) +#define addr32(x) (*(uint32_t *)(&x)) +#define addr16(x) (*(uint16_t *)(&x)) +#define addr8(x) (*(uint8_t *)(&x)) + +void wait_print(unsigned int cycles){ + for(int i = 0; i <= cycles; i++){ + printf("Waiting: ["); + for(int j = 0; j < i; j++) + printf("+"); + for(int j = 0; j < cycles - i; j++) + printf("-"); + printf("]\n"); + } +} + +static inline void irq_en(volatile uint32_t index_oh){ + asm volatile("addi t0, %0, 0\n\t" + "csrrs zero, mie, t0" + ::"r"(index_oh)); +} + +static inline uint32_t irq_st(){ + uint32_t irq_status; + asm volatile("csrr %0, mip" + :"=r"(irq_status):); + return irq_status; +} + +static inline void wait_nop(uint32_t nops){ + for (int i = 0; i < nops; i++) asm volatile("addi x0, x0, 0" ::); +} + +static inline void sentinel_instr_id(){ + asm volatile("addi x0, x0, 0x404" ::); +} + +static inline void sentinel_instr_ex(){ + asm volatile("addi x0, x0, 0x505" ::); +} + +static inline void sentinel_start(){ + asm volatile("addi x0, x0, 0x5AA" ::); +} + +static inline void sentinel_end(){ + asm volatile("addi x0, x0, 0x5FF" ::); +} + +static inline void ccount_en(){ + uint32_t pcmr = 1; + asm volatile("csrw 0x7e1, %0" ::"r"(pcmr)); +} + +static inline void ccount_dis(){ + uint32_t pcmr = 0; + asm volatile("csrw 0x7e1, %0" ::"r"(pcmr)); +} + +static inline uint32_t get_cyclel(){ + uint32_t cyclel; + asm volatile("csrr %0, 0x780" + :"=r"(cyclel):); + return cyclel; +} + +static inline uint32_t get_cycleh(){ + uint32_t cycleh; + asm volatile("csrr %0, cycleh" + :"=r"(cycleh):); + return cycleh; +} + +uint32_t get_cycle(){ + uint32_t cyclel = get_cyclel(); + uint32_t cycleh = get_cycleh(); + if (cycleh) return 0; + return cyclel; +} + +static inline uint32_t get_timel(){ + uint32_t timel; + asm volatile("csrr %0, 0x781" + :"=r"(timel):); + return timel; +} + +static inline uint32_t get_timeh(){ + uint32_t timeh; + // RI5CY doesn't have separate timeh, return 0 + asm volatile("csrr %0, timeh" + :"=r"(timeh):); + return timeh; +} + +uint32_t get_time(){ + uint32_t timel = get_timel(); + uint32_t timeh = get_timeh(); + if (timeh) return 0; + return timel; +} + +static inline uint32_t get_mstatus(){ + uint32_t mstatus; + asm volatile("csrr %0, 0x300" :"=r"(mstatus):); // MSTATUS (0x300) + return mstatus; +} + +static inline void set_mstatus(uint32_t value){ + asm volatile("csrw 0x300, %0" ::"r"(value)); // MSTATUS (0x300) +} + +static inline uint32_t get_mtvec(){ + uint32_t mtvec; + asm volatile("csrr %0, 0x305" :"=r"(mtvec):); // MTVEC (0x305) + return mtvec; +} + +static inline void set_mtvec(uint32_t value){ + asm volatile("csrw 0x305, %0" ::"r"(value)); // MTVEC (0x305) +} + +static inline uint32_t get_mepc(){ + uint32_t mepc; + asm volatile("csrr %0, 0x341" :"=r"(mepc):); // MEPC (0x341) + return mepc; +} + +static inline void set_mepc(uint32_t value){ + asm volatile("csrw 0x341, %0" ::"r"(value)); // MEPC (0x341) +} + +static inline uint32_t get_mcause(){ + uint32_t mcause; + asm volatile("csrr %0, 0x342" :"=r"(mcause):); // MCAUSE (0x342) + return mcause; +} + +static inline uint32_t get_privlv(){ + uint32_t privlv; + asm volatile("csrr %0, 0xc10" :"=r"(privlv):); // PRIVLV (0xC10) + return privlv; +} + +static inline uint32_t get_uhartid(){ + uint32_t uhartid; + asm volatile("csrr %0, 0x014" :"=r"(uhartid):); // UHARTID (0x014) + return uhartid; +} + + +// CV32E40P Performance Counter Functions +static inline void cv32e40p_ccount_enable(){ + asm volatile("csrw 0x7E0, %0" :: "r"(0x1)); // Enable PCCR[0] + asm volatile("csrw 0x7E1, %0" :: "r"(0x1)); // Enable counting, , no saturation +} + +// Read CV32E40P cycle counter +static inline uint32_t cv32e40p_get_cycles(){ + uint32_t cycles; + asm volatile("csrr %0, 0x780" : "=r"(cycles)); // Read PCCR[0] + return cycles; +} + +// Disable CV32E40P cycle counter +static inline void cv32e40p_ccount_disable(){ + asm volatile("csrw 0x7E1, %0" :: "r"(0x0)); // Disable counting +} + +#endif /*MAGIA_TILE_UTILS_H*/ diff --git a/tests/utils/magia_utils.h b/tests/utils/magia_utils.h new file mode 100644 index 00000000..0290d2d3 --- /dev/null +++ b/tests/utils/magia_utils.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Victor Isachi + * + * MAGIA Utils + */ + +#ifndef MAGIA_UTILS_H +#define MAGIA_UTILS_H + +#include "magia_tile_utils.h" + +#define STR_OFFSET (0x00000000) +#define STR_BASE (RESERVED_START + STR_OFFSET) +#define SYNC_OFFSET (0x0000F000) +#define SYNC_BASE (RESERVED_START + SYNC_OFFSET) +#define SYNC_EN (SYNC_BASE + 0x4) + +#define MESH_Y_TILES (4) +#define MESH_X_TILES (4) +#define NUM_HARTS (MESH_Y_TILES*MESH_X_TILES) + +#define GET_Y_ID(mhartid) ((mhartid)/MESH_X_TILES) +#define GET_X_ID(mhartid) ((mhartid)%MESH_X_TILES) +#define GET_ID(y_id, x_id) (((y_id)*MESH_X_TILES)+(x_id)) + +#define h_pprintf(x) (h_psprint(get_hartid(), x)) +#define n_pprintf(x) (n_psprint(get_hartid(), x)) +#define pprintf(x) ( psprint(get_hartid(), x)) +#define pprintln ( pprintf("\n")) + +static inline uint32_t get_hartid(){ + uint32_t hartid; + // In MAGIA: hartid = tile_id (each tile contains exactly one Flex-V core) + // mhartid_i is passed to each magia_tile and represents both tile and hart ID + asm volatile("csrr %0, mhartid" + :"=r"(hartid):); + return hartid; // Hart ID = Tile ID in MAGIA architecture +} + +static inline void amo_increment(volatile uint32_t addr, volatile uint32_t amnt){ + asm volatile("amoadd.w x0, %1, (%0)" ::"r"(addr), "r"(amnt):"memory"); +} + +char* utoa(unsigned int value, unsigned int base, char* result) { + if (base < 2 || base > 16){ + *result = '\0'; + return result; + } + + char *ptr0 = result; + char *ptr1 = result; + char tmp_char; + unsigned int tmp_value; + + do { + tmp_value = value; + value /= base; + *ptr0++ = "0123456789ABCDEF"[tmp_value - value * base]; + } while (value); + + *ptr0-- = '\0'; + + // Reverse the string + while(ptr1 < ptr0) { + tmp_char = *ptr0; + *ptr0-- = *ptr1; + *ptr1++ = tmp_char; + } + return result; +} + +char* bs(uint32_t x) { + uint32_t hartid = get_hartid(); + char *address = STR_BASE + L1_TILE_OFFSET*hartid; + + return utoa(x, 2, address); +} + +char* ds(uint32_t x) { + uint32_t hartid = get_hartid(); + char *address = STR_BASE + L1_TILE_OFFSET*hartid; + + return utoa(x, 10, address); +} + +char* hs(uint32_t x) { + uint32_t hartid = get_hartid(); + char *address = STR_BASE + L1_TILE_OFFSET*hartid; + + return utoa(x, 16, address); +} + +void h_psprint(uint32_t hartid, const char* string){ + mmio8(0xFFFF0004 + (hartid*4)) = '['; + mmio8(0xFFFF0004 + (hartid*4)) = 'm'; + mmio8(0xFFFF0004 + (hartid*4)) = 'h'; + mmio8(0xFFFF0004 + (hartid*4)) = 'a'; + mmio8(0xFFFF0004 + (hartid*4)) = 'r'; + mmio8(0xFFFF0004 + (hartid*4)) = 't'; + mmio8(0xFFFF0004 + (hartid*4)) = 'i'; + mmio8(0xFFFF0004 + (hartid*4)) = 'd'; + mmio8(0xFFFF0004 + (hartid*4)) = ' '; + char* mhardid_str = ds(hartid); + uint8_t mhartid_idx = 0; + while (mhardid_str[mhartid_idx] != '\0') + mmio8(0xFFFF0004 + (hartid*4)) = mhardid_str[mhartid_idx++]; + mmio8(0xFFFF0004 + (hartid*4)) = ']'; + mmio8(0xFFFF0004 + (hartid*4)) = ' '; + + uint8_t index = 0; + while (string[index] != '\0') + mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; +} + +void n_psprint(uint32_t hartid, const char* string){ + uint8_t index = 0; + while (string[index] != '\0') + mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; + mmio8(0xFFFF0004 + (hartid*4)) = '\n'; +} + +void psprint(uint32_t hartid, const char* string){ + uint8_t index = 0; + while (string[index] != '\0') + mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; +} + +#endif /*MAGIA_UTILS_H*/ diff --git a/tests/utils/perf_counters.h b/tests/utils/perf_counters.h new file mode 100644 index 00000000..8f83a71e --- /dev/null +++ b/tests/utils/perf_counters.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * Performance Counter Utilities for Snitch + */ + +#ifndef __PERF_COUNTERS_H__ +#define __PERF_COUNTERS_H__ + +#include + +static inline uint32_t read_mcyclel(void) { + uint32_t cyclel; + asm volatile("csrr %0, mcycle" : "=r"(cyclel)); + return cyclel; +} + +static inline uint32_t read_mcycleh(void) { + uint32_t cycleh; + asm volatile("csrr %0, mcycleh" : "=r"(cycleh)); + return cycleh; +} + +static inline uint32_t read_mcycle(void) { + return read_mcyclel(); +} + +#define PERF_START() read_mcycle() +#define PERF_END(start) (read_mcycle() - (start)) + +#endif // __PERF_COUNTERS_H__ diff --git a/tests/utils/redmule_mm_utils.h b/tests/utils/redmule_mm_utils.h new file mode 100644 index 00000000..d054fe9b --- /dev/null +++ b/tests/utils/redmule_mm_utils.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * + * RedMulE MM Utilities + * + * This header contains MM-related definitions and functions for RedMulE control + * using MMIO-based register access. + */ + +#ifndef REDMULE_MM_UTILS_H +#define REDMULE_MM_UTILS_H + +#include +#include "magia_tile_utils.h" + +/* OBI2HWPE Protocol Stamps */ +#define REDMULE_ADDR_BASE REDMULE_BASE + +#define HWPE_WRITE(value, offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) = value +#define HWPE_READ(offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) + +/* Register offsets (RedMulE hwpe-ctrl) */ +#define REDMULE_REG_OFFS 0x00 +#define REDMULE_TRIGGER 0x00 +#define REDMULE_ACQUIRE 0x04 +#define REDMULE_EVT_ENABLE 0x08 +#define REDMULE_STATUS 0x0C +#define REDMULE_RUNNING_JOB 0x10 +#define REDMULE_SOFT_CLEAR 0x14 + +/* RedMulE configuration registers */ +#define REDMULE_REG_X_PTR 0x40 +#define REDMULE_REG_W_PTR 0x44 +#define REDMULE_REG_Z_PTR 0x48 +#define REDMULE_MCFG0_PTR 0x4C +#define REDMULE_MCFG1_PTR 0x50 +#define REDMULE_ARITH_PTR 0x54 + +/* Operations and formats */ +#define gemm_ops 0x1 +#define Float16 0x1 +#define Float16Alt 0x2 +#define Float8 0x3 +#define Float8Alt 0x4 + +/* HWPE Register Access Functions */ +static inline void redmule_x_add_set(unsigned int value) { + HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_X_PTR); +} + +static inline void redmule_w_add_set(unsigned int value) { + HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_W_PTR); +} + +static inline void redmule_z_add_set(unsigned int value) { + HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_Z_PTR); +} + +static inline void redmule_mcfg_set(uint32_t mcfg0, uint32_t mcfg1) { + HWPE_WRITE(mcfg0, REDMULE_REG_OFFS + REDMULE_MCFG0_PTR); + HWPE_WRITE(mcfg1, REDMULE_REG_OFFS + REDMULE_MCFG1_PTR); +} + +static inline void redmule_arith_set(uint32_t arith) { + HWPE_WRITE(arith, REDMULE_REG_OFFS + REDMULE_ARITH_PTR); +} + +static inline void hwpe_trigger_job() { + HWPE_WRITE(0, REDMULE_TRIGGER); +} + +static inline int hwpe_acquire_job() { + int result = HWPE_READ(REDMULE_ACQUIRE); + return result; +} + +static inline unsigned int hwpe_get_status() { + unsigned int result = HWPE_READ(REDMULE_STATUS); + return result; +} + +static inline void hwpe_soft_clear() { + HWPE_WRITE(0, REDMULE_SOFT_CLEAR); +} + +static inline void hwpe_cg_enable() { + return; +} + +static inline void hwpe_cg_disable() { + return; +} + +static inline void hwpe_wait_for_completion() { + // Polling-based completion detection + unsigned int status; + unsigned int poll_count = 0; + unsigned int max_polls = 100000; + + do { + status = hwpe_get_status(); + poll_count++; + + // Small pause to not overload system + if (poll_count % 50 == 0) { + wait_nop(10); + } + + // Exit conditions: idle status (0) or timeout + if (status == 0 || poll_count >= max_polls) { + break; + } + + } while (1); +} + +/* RedMulE Configuration Function */ +static inline void redmule_cfg(unsigned int x, unsigned int w, unsigned int z, uint16_t m_size, uint16_t n_size, + uint16_t k_size, uint8_t gemm_op, uint8_t gemm_fmt) { + + uint32_t mcfg_reg0 = (k_size << 16) | (m_size << 0); + uint32_t mcfg_reg1 = n_size << 0; + uint32_t arith_reg = (gemm_op << 10) | (gemm_fmt << 7); + + redmule_x_add_set((unsigned int)x); + redmule_w_add_set((unsigned int)w); + redmule_z_add_set((unsigned int)z); + redmule_mcfg_set((unsigned int)mcfg_reg0, (unsigned int)mcfg_reg1); + redmule_arith_set((unsigned int)arith_reg); +} + +#endif /* REDMULE_MM_UTILS_H */ diff --git a/tests/utils/spatz_workers.h b/tests/utils/spatz_workers.h new file mode 100644 index 00000000..2ef5ad38 --- /dev/null +++ b/tests/utils/spatz_workers.h @@ -0,0 +1,1381 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Spatz Vector Utilities - Based on Spatz Benchmarks + * Provides optimized vector kernels for various operations + */ + + +#ifndef _SPATZ_UTILS_H_ +#define _SPATZ_UTILS_H_ + +#include + +// FP16 type alias +typedef uint16_t fp16_t; +typedef _Float16 float16_t; + +// ============================================================================= +// Dot Product Kernels (from spatzBenchmarks/dp-fdotp) +// ============================================================================= + +// 64-bit dot-product: a * b +static inline double fdotp_v64b(const double *a, const double *b, unsigned int avl) { + const unsigned int orig_avl = avl; + unsigned int vl; + double red; + + // Clean the accumulator + asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); + asm volatile("vmv.s.x v0, zero"); + + // Stripmine and accumulate a partial reduced vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load chunk a and b + asm volatile("vle64.v v8, (%0)" ::"r"(a)); + asm volatile("vle64.v v16, (%0)" ::"r"(b)); + + // Multiply and accumulate + if (avl == orig_avl) { + asm volatile("vfmul.vv v24, v8, v16"); + } else { + asm volatile("vfmacc.vv v24, v8, v16"); + } + + // Bump pointers + a += vl; + b += vl; + avl -= vl; + } while (avl > 0); + + // Reduce and return + asm volatile("vsetvli zero, %0, e64, m8, ta, ma" ::"r"(orig_avl)); + asm volatile("vfredusum.vs v0, v24, v0"); + asm volatile("vfmv.f.s %0, v0" : "=f"(red)); + + return red; +} + +// 32-bit dot-product: a * b +static inline float fdotp_v32b(const float *a, const float *b, unsigned int avl) { + const unsigned int orig_avl = avl; + unsigned int vl; + float red; + + asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); + asm volatile("vmv.s.x v0, zero"); + + // Stripmine and accumulate a partial reduced vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load chunk a and b + asm volatile("vle32.v v8, (%0)" ::"r"(a)); + asm volatile("vle32.v v16, (%0)" ::"r"(b)); + + // Multiply and accumulate + if (avl == orig_avl) { + asm volatile("vfmul.vv v24, v8, v16"); + } else { + asm volatile("vfmacc.vv v24, v8, v16"); + } + + // Bump pointers + a += vl; + b += vl; + avl -= vl; + } while (avl > 0); + + // Reduce and return + asm volatile("vsetvli zero, %0, e32, m8, ta, ma" ::"r"(orig_avl)); + asm volatile("vfredusum.vs v0, v24, v0"); + asm volatile("vfmv.f.s %0, v0" : "=f"(red)); + return red; +} + +// 16-bit dot-product: a * b +static inline float16_t fdotp_v16b(const float16_t *a, const float16_t *b, unsigned int avl) { + const unsigned int orig_avl = avl; + unsigned int vl; + float16_t red; + + asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + asm volatile("vmv.s.x v0, zero"); + + // Stripmine and accumulate a partial reduced vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load chunk a and b + asm volatile("vle16.v v8, (%0)" ::"r"(a)); + asm volatile("vle16.v v16, (%0)" ::"r"(b)); + + // Multiply and accumulate + if (avl == orig_avl) { + asm volatile("vfmul.vv v24, v8, v16"); + } else { + asm volatile("vfmacc.vv v24, v8, v16"); + } + + // Bump pointers + a += vl; + b += vl; + avl -= vl; + } while (avl > 0); + + // Reduce and return + asm volatile("vsetvli zero, %0, e16, m8, ta, ma" ::"r"(orig_avl)); + asm volatile("vfredusum.vs v0, v24, v0"); + asm volatile("vfmv.f.s %0, v0" : "=f"(red)); + return red; +} + +// ============================================================================= +// AXPY Kernels (from spatzBenchmarks/dp-faxpy): y = a * x + y +// ============================================================================= + +// 64-bit AXPY: y = a * x + y +static inline void faxpy_v64b(const double a, const double *x, const double *y, unsigned int avl) { + unsigned int vl; + + // Stripmine and accumulate a partial vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load vectors + asm volatile("vle64.v v0, (%0)" ::"r"(x)); + asm volatile("vle64.v v8, (%0)" ::"r"(y)); + + // Multiply-accumulate + asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); + + // Store results + asm volatile("vse64.v v8, (%0)" ::"r"(y)); + + // Bump pointers + x += vl; + y += vl; + avl -= vl; + } while (avl > 0); +} + +// 32-bit AXPY: y = a * x + y +static inline void faxpy_v32b(const float a, const float *x, const float *y, unsigned int avl) { + unsigned int vl; + + // Stripmine and accumulate a partial vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load vectors + asm volatile("vle32.v v0, (%0)" ::"r"(x)); + asm volatile("vle32.v v8, (%0)" ::"r"(y)); + + // Multiply-accumulate + asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); + + // Store results + asm volatile("vse32.v v8, (%0)" ::"r"(y)); + + // Bump pointers + x += vl; + y += vl; + avl -= vl; + } while (avl > 0); +} + +// 16-bit AXPY: y = a * x + y +static inline void faxpy_v16b(const float16_t a, const float16_t *x, const float16_t *y, unsigned int avl) { + unsigned int vl; + + // Stripmine and accumulate a partial vector + do { + // Set the vl + asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + // Load vectors + asm volatile("vle16.v v0, (%0)" ::"r"(x)); + asm volatile("vle16.v v8, (%0)" ::"r"(y)); + + // Multiply-accumulate + asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); + + // Store results + asm volatile("vse16.v v8, (%0)" ::"r"(y)); + + // Bump pointers + x += vl; + y += vl; + avl -= vl; + } while (avl > 0); +} + +// ============================================================================= +// Matrix Multiplication Kernels (from spatzBenchmarks/dp-fmatmul) +// ============================================================================= + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +// Forward declarations +static inline void fmatmul_v64b_2xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v64b_4xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v64b_8xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); + +// Matrix multiplication wrapper - automatically selects optimal variant +// Computes C = A × B where C is MxP, A is MxN, B is NxP +static inline void fmatmul_v64b(double *c, const double *a, const double *b, + const unsigned int M, const unsigned int N, + const unsigned int P) { + if (M <= 4) { + fmatmul_v64b_2xVL(c, a, b, 0, M, N, P, 0, P); + } else if (M <= 8) { + fmatmul_v64b_4xVL(c, a, b, 0, M, N, P, 0, P); + } else { + fmatmul_v64b_8xVL(c, a, b, 0, M, N, P, 0, P); + } +} + +// 2xVL variant - optimized for small matrices (M <= 4) +static inline void fmatmul_v64b_2xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e64, m8, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const double *b_ = b + p; + double *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 2) { + const double *a_ = a + m * N; + const double *a__ = a_; + + asm volatile("vle64.v v16, (%0);" ::"r"(b_)); + const double *b__ = b_ + P; + + double *c__ = c_ + m * P; + + double t0, t1; + + t0 = *a__; + a__ += N; + t1 = *a__; + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle64.v v24, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); + t1 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); + t1 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle64.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + t1 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + asm volatile("vse64.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + asm volatile("vse64.v v8, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 4xVL variant - optimized for medium matrices (M <= 8) +static inline void fmatmul_v64b_4xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e64, m4, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const double *b_ = b + p; + double *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 4) { + const double *a_ = a + m * N; + const double *a__ = a_; + + asm volatile("vle64.v v16, (%0);" ::"r"(b_)); + const double *b__ = b_ + P; + + double *c__ = c_ + m * P; + + double t0, t1, t2, t3; + + t0 = *a__; + a__ += N; + t1 = *a__; + a__ += N; + t2 = *a__; + a__ += N; + t3 = *a__; + + unsigned int n = 0; + + while (n < N) { + asm volatile("vle64.v v20, (%0);" ::"r"(b__)); + b__ += P; + + a__ = a_ + ++n; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); + t3 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); + t3 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle64.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + t3 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse64.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + asm volatile("vse64.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + asm volatile("vse64.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + asm volatile("vse64.v v12, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 8xVL variant - optimized for larger matrices (M > 8) +static inline void fmatmul_v64b_8xVL(double *c, const double *a, const double *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e64, m2, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const double *b_ = b + p; + double *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 8) { + const double *a_ = a + m * N; + const double *a__ = a_; + + asm volatile("vle64.v v18, (%0);" ::"r"(b_)); + const double *b__ = b_ + P; + + double *c__ = c_ + m * P; + + double t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = *a__; + a__ += N; + t1 = *a__; + a__ += N; + t2 = *a__; + a__ += N; + t3 = *a__; + a__ += N; + t4 = *a__; + a__ += N; + t5 = *a__; + a__ += N; + t6 = *a__; + a__ += N; + t7 = *a__; + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle64.v v20, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); + t7 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); + t7 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle64.v v18, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + t7 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse64.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + asm volatile("vse64.v v2, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + asm volatile("vse64.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + asm volatile("vse64.v v6, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + asm volatile("vse64.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + asm volatile("vse64.v v10, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + asm volatile("vse64.v v12, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + asm volatile("vse64.v v14, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// ============================================================================= +// FP32 Matrix Multiplication Kernels (from spatzBenchmarks/sp-fmatmul) +// ============================================================================= + +// Forward declarations for FP32 matmul +static inline void fmatmul_v32b_2xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v32b_4xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v32b_8xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); + +// FP32 matrix multiplication wrapper - automatically selects optimal variant +// Computes C = A × B where C is MxP, A is MxN, B is NxP +static inline void fmatmul_v32b(float *c, const float *a, const float *b, + const unsigned int M, const unsigned int N, + const unsigned int P) { + if (M <= 4) { + fmatmul_v32b_2xVL(c, a, b, 0, M, N, P, 0, P); + } else if (M <= 8) { + fmatmul_v32b_4xVL(c, a, b, 0, M, N, P, 0, P); + } else { + fmatmul_v32b_8xVL(c, a, b, 0, M, N, P, 0, P); + } +} + +// 2xVL variant - optimized for small matrices (M <= 4) +static inline void fmatmul_v32b_2xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e32, m8, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float *b_ = b + p; + float *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 2) { + const float *a_ = a + m * N; + const float *a__ = a_; + + asm volatile("vle32.v v16, (%0);" ::"r"(b_)); + const float *b__ = b_ + P; + + float *c__ = c_ + m * P; + + float t0, t1; + + t0 = *a__; + a__ += N; + t1 = *a__; + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle32.v v24, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); + t1 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); + t1 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle32.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + t1 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + asm volatile("vse32.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + asm volatile("vse32.v v8, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 4xVL variant - optimized for medium matrices (M <= 8) +static inline void fmatmul_v32b_4xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e32, m4, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float *b_ = b + p; + float *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 4) { + const float *a_ = a + m * N; + const float *a__ = a_; + + asm volatile("vle32.v v16, (%0);" ::"r"(b_)); + const float *b__ = b_ + P; + + float *c__ = c_ + m * P; + + float t0, t1, t2, t3; + + t0 = *a__; + a__ += N; + t1 = *a__; + a__ += N; + t2 = *a__; + a__ += N; + t3 = *a__; + + unsigned int n = 0; + + while (n < N) { + asm volatile("vle32.v v20, (%0);" ::"r"(b__)); + b__ += P; + + a__ = a_ + ++n; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); + t3 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); + t3 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle32.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + t3 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse32.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + asm volatile("vse32.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + asm volatile("vse32.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + asm volatile("vse32.v v12, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 8xVL variant - optimized for larger matrices (M > 8) +static inline void fmatmul_v32b_8xVL(float *c, const float *a, const float *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e32, m2, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float *b_ = b + p; + float *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 8) { + const float *a_ = a + m * N; + const float *a__ = a_; + + asm volatile("vle32.v v18, (%0);" ::"r"(b_)); + const float *b__ = b_ + P; + + float *c__ = c_ + m * P; + + float t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = *a__; + a__ += N; + t1 = *a__; + a__ += N; + t2 = *a__; + a__ += N; + t3 = *a__; + a__ += N; + t4 = *a__; + a__ += N; + t5 = *a__; + a__ += N; + t6 = *a__; + a__ += N; + t7 = *a__; + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle32.v v20, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); + t7 = *a__; + } else { + asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); + t7 = *a__; + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle32.v v18, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + t0 = *a__; + a__ += N; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + t1 = *a__; + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + t2 = *a__; + a__ += N; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + t3 = *a__; + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + t4 = *a__; + a__ += N; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + t5 = *a__; + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + t6 = *a__; + a__ += N; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + t7 = *a__; + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse32.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + asm volatile("vse32.v v2, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + asm volatile("vse32.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + asm volatile("vse32.v v6, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + asm volatile("vse32.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + asm volatile("vse32.v v10, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + asm volatile("vse32.v v12, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + asm volatile("vse32.v v14, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// ============================================================================= +// FP16 Matrix Multiplication Kernels (from spatzBenchmarks/hp-fmatmul) +// ============================================================================= + +// Forward declarations for FP16 matmul +static inline void fmatmul_v16b_2xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v16b_4xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); +static inline void fmatmul_v16b_8xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end); + +// FP16 matrix multiplication wrapper - automatically selects optimal variant +// Computes C = A × B where C is MxP, A is MxN, B is NxP +static inline void fmatmul_v16b(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int M, const unsigned int N, + const unsigned int P) { + if (M <= 4) { + fmatmul_v16b_2xVL(c, a, b, 0, M, N, P, 0, P); + } else if (M <= 8) { + fmatmul_v16b_4xVL(c, a, b, 0, M, N, P, 0, P); + } else { + fmatmul_v16b_8xVL(c, a, b, 0, M, N, P, 0, P); + } +} + +// 2xVL variant - optimized for small matrices (M <= 4) +// NOTE: Uses e32 (FP32 accumulation) for better precision +static inline void fmatmul_v16b_2xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl (using e32 for FP32 accumulation) + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e32, m8, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float16_t *b_ = b + p; + float16_t *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 2) { + const float16_t *a_ = a + m * N; + const float16_t *a__ = a_; + + asm volatile("vle32.v v16, (%0);" ::"r"(b_)); + const float16_t *b__ = b_ + P; + + float16_t *c__ = c_ + m * P; + + float t0, t1; + + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle32.v v24, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle32.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + } + + asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); + asm volatile("vse32.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); + asm volatile("vse32.v v8, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 4xVL variant - optimized for medium matrices (M <= 8) +static inline void fmatmul_v16b_4xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl (using e32 for FP32 accumulation) + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e32, m4, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float16_t *b_ = b + p; + float16_t *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 4) { + const float16_t *a_ = a + m * N; + const float16_t *a__ = a_; + + asm volatile("vle32.v v16, (%0);" ::"r"(b_)); + const float16_t *b__ = b_ + P; + + float16_t *c__ = c_ + m * P; + + float t0, t1, t2, t3; + + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + + unsigned int n = 0; + + while (n < N) { + asm volatile("vle32.v v20, (%0);" ::"r"(b__)); + b__ += P; + + a__ = a_ + ++n; + + if (n == 1) { + asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + } else { + asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle32.v v16, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse32.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); + asm volatile("vse32.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); + asm volatile("vse32.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); + asm volatile("vse32.v v12, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +// 8xVL variant - optimized for larger matrices (M > 8) +static inline void fmatmul_v16b_8xVL(float16_t *c, const float16_t *a, const float16_t *b, + const unsigned int m_start, const unsigned int m_end, + const unsigned int N, const unsigned int P, + const unsigned int p_start, const unsigned int p_end) { + unsigned int p = p_start; + while (p < p_end) { + // Calculate the vl (using e16 for this variant) + size_t gvl; + asm volatile("vsetvli %[gvl], %[vl], e16, m2, ta, ma" + : [gvl] "=r"(gvl) + : [vl] "r"(p_end - p)); + + const float16_t *b_ = b + p; + float16_t *c_ = c + p; + + for (unsigned int m = m_start; m < m_end; m += 8) { + const float16_t *a_ = a + m * N; + const float16_t *a__ = a_; + + asm volatile("vle16.v v18, (%0);" ::"r"(b_)); + const float16_t *b__ = b_ + P; + + float16_t *c__ = c_ + m * P; + + float t0, t1, t2, t3, t4, t5, t6, t7; + + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); + a__ += N; + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); + + unsigned int n = 0; + + while (n < N) { + a__ = a_ + ++n; + + asm volatile("vle16.v v20, (%0);" ::"r"(b__)); + b__ += P; + + if (n == 1) { + asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); + } else { + asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); + } + + a__ = a_ + ++n; + + if (n == N) + break; + + asm volatile("vle16.v v18, (%0);" ::"r"(b__)); + b__ += P; + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); + a__ += N; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); + } + + asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); + asm volatile("vse16.v v0, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); + asm volatile("vse16.v v2, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); + asm volatile("vse16.v v4, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); + asm volatile("vse16.v v6, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); + asm volatile("vse16.v v8, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); + asm volatile("vse16.v v10, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); + asm volatile("vse16.v v12, (%0);" ::"r"(c__)); + c__ += P; + asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); + asm volatile("vse16.v v14, (%0);" ::"r"(c__)); + } + + p += gvl; + } +} + +#endif // _SPATZ_UTILS_H_ diff --git a/tests/utils/tinyprintf.h b/tests/utils/tinyprintf.h new file mode 100644 index 00000000..aa7e96dc --- /dev/null +++ b/tests/utils/tinyprintf.h @@ -0,0 +1,702 @@ +/* + +Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL 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. + +This modified tinyprintf is distributed under the conditions of the BSD-new license +as explicitly allowed: + -> https://github.com/cjlano/tinyprintf commit 2ee3012 + +They provide a simple and small (+400 loc) printf functionality to +be used in embedded systems. + +I've found them so useful in debugging that I do not bother with a +debugger at all. + +They are distributed in source form, so to use them, just compile them +into your project. + +Two printf variants are provided: printf and the 'sprintf' family of +functions ('snprintf', 'sprintf', 'vsnprintf', 'vsprintf'). + +The formats supported by this implementation are: +'c' 'd' 'i' 'o' 'p' 'u' 's' 'x' 'X'. + +Zero padding and field width are also supported. + +If the library is compiled with 'PRINTF_SUPPORT_LONG' defined, then +the long specifier is also supported. Note that this will pull in some +long math routines (pun intended!) and thus make your executable +noticeably longer. Likewise with 'PRINTF_LONG_LONG_SUPPORT' for the +long long specifier, and with 'PRINTF_SIZE_T_SUPPORT' for the size_t +specifier. + +The memory footprint of course depends on the target CPU, compiler and +compiler options, but a rough guesstimate (based on a H8S target) is about +1.4 kB for code and some twenty 'int's and 'char's, say 60 bytes of stack space. +Not too bad. Your mileage may vary. By hacking the source code you can +get rid of some hundred bytes, I'm sure, but personally I feel the balance of +functionality and flexibility versus code size is close to optimal for +many embedded systems. + +To use the printf, you need to supply your own character output function, +something like : + +void putc ( void* p, char c) +{ + while (!SERIAL_PORT_EMPTY) ; + SERIAL_PORT_TX_REGISTER = c; +} + +Before you can call printf, you need to initialize it to use your +character output function with something like: + +init_printf(NULL,putc); + +Notice the 'NULL' in 'init_printf' and the parameter 'void* p' in 'putc', +the NULL (or any pointer) you pass into the 'init_printf' will eventually be +passed to your 'putc' routine. This allows you to pass some storage space (or +anything really) to the character output function, if necessary. +This is not often needed but it was implemented like that because it made +implementing the sprintf function so neat (look at the source code). + +The code is re-entrant, except for the 'init_printf' function, so it is safe +to call it from interrupts too, although this may result in mixed output. +If you rely on re-entrancy, take care that your 'putc' function is re-entrant! + +The printf and sprintf functions are actually macros that translate to +'tfp_printf' and 'tfp_sprintf' when 'TINYPRINTF_OVERRIDE_LIBC' is set +(default). Setting it to 0 makes it possible to use them along with +'stdio.h' printf's in a single source file. When +'TINYPRINTF_OVERRIDE_LIBC' is set, please note that printf/sprintf are +not function-like macros, so if you have variables or struct members +with these names, things will explode in your face. Without variadic +macros this is the best we can do to wrap these function. If it is a +problem, just give up the macros and use the functions directly, or +rename them. + +It is also possible to avoid defining tfp_printf and/or tfp_sprintf by +clearing 'TINYPRINTF_DEFINE_TFP_PRINTF' and/or +'TINYPRINTF_DEFINE_TFP_SPRINTF' to 0. This allows for example to +export only tfp_format, which is at the core of all the other +functions. + +For further details see source code. + +regs Kusti, 23.10.2004 +*/ + +void putf(char *null, char c) { + *(volatile int *) (0xFFFF0004) = (int)c; +} + +#ifndef __TFP_PRINTF__ +#define __TFP_PRINTF__ + +#include + +/* Global configuration */ + +/* Set this to 0 if you do not want to provide tfp_printf */ +#ifndef TINYPRINTF_DEFINE_TFP_PRINTF +# define TINYPRINTF_DEFINE_TFP_PRINTF 1 +#endif + +/* Set this to 0 if you do not want to provide + tfp_sprintf/snprintf/vsprintf/vsnprintf */ +#ifndef TINYPRINTF_DEFINE_TFP_SPRINTF +# define TINYPRINTF_DEFINE_TFP_SPRINTF 1 +#endif + +/* Set this to 0 if you do not want tfp_printf and + tfp_{vsn,sn,vs,s}printf to be also available as + printf/{vsn,sn,vs,s}printf */ +#ifndef TINYPRINTF_OVERRIDE_LIBC +# define TINYPRINTF_OVERRIDE_LIBC 1 +#endif + +/* Optional external types dependencies */ + +#if TINYPRINTF_DEFINE_TFP_SPRINTF +// Define size_t for embedded environment (no sys/types.h) +typedef unsigned int size_t; +#endif + +/* Declarations */ + +#ifdef __GNUC__ +# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) \ + __attribute__((format (printf, fmt_idx, arg1_idx))) +#else +# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*putcf) (void *, char); + +/* + 'tfp_format' really is the central function for all tinyprintf. For + each output character after formatting, the 'putf' callback is + called with 2 args: + - an arbitrary void* 'putp' param defined by the user and + passed unmodified from 'tfp_format', + - the character. + The 'tfp_printf' and 'tfp_sprintf' functions simply define their own + callback and pass to it the right 'putp' it is expecting. +*/ +void tfp_format(void *putp, putcf putf, const char *fmt, va_list va); + +#if TINYPRINTF_DEFINE_TFP_SPRINTF +int tfp_vsnprintf(char *str, size_t size, const char *fmt, va_list ap); +int tfp_snprintf(char *str, size_t size, const char *fmt, ...) \ + _TFP_SPECIFY_PRINTF_FMT(3, 4); +int tfp_vsprintf(char *str, const char *fmt, va_list ap); +int tfp_sprintf(char *str, const char *fmt, ...) \ + _TFP_SPECIFY_PRINTF_FMT(2, 3); +# if TINYPRINTF_OVERRIDE_LIBC +# define vsnprintf tfp_vsnprintf +# define snprintf tfp_snprintf +# define vsprintf tfp_vsprintf +# define sprintf tfp_sprintf +# endif +#endif + +#if TINYPRINTF_DEFINE_TFP_PRINTF +void init_printf(void *putp, putcf putf); +void tfp_printf(char *fmt, ...) _TFP_SPECIFY_PRINTF_FMT(1, 2); +# if TINYPRINTF_OVERRIDE_LIBC +# define printf tfp_printf +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif + + + +/* + * Configuration + */ + +/* Enable long int support */ +// #define PRINTF_LONG_SUPPORT + +/* Enable long long int support (implies long int support) */ +// #define PRINTF_LONG_LONG_SUPPORT + +/* Enable %z (size_t) support */ +// #define PRINTF_SIZE_T_SUPPORT + +/* + * Configuration adjustments + */ +#ifdef PRINTF_SIZE_T_SUPPORT +#include +#endif + +#ifdef PRINTF_LONG_LONG_SUPPORT +# define PRINTF_LONG_SUPPORT +#endif + +/* __SIZEOF___ defined at least by gcc */ +#ifdef __SIZEOF_POINTER__ +# define SIZEOF_POINTER __SIZEOF_POINTER__ +#endif +#ifdef __SIZEOF_LONG_LONG__ +# define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__ +#endif +#ifdef __SIZEOF_LONG__ +# define SIZEOF_LONG __SIZEOF_LONG__ +#endif +#ifdef __SIZEOF_INT__ +# define SIZEOF_INT __SIZEOF_INT__ +#endif + +#ifdef __GNUC__ +# define _TFP_GCC_NO_INLINE_ __attribute__ ((noinline)) +#else +# define _TFP_GCC_NO_INLINE_ +#endif + +/* + * Implementation + */ +struct param { + char lz:1; /**< Leading zeros */ + char alt:1; /**< alternate form */ + char uc:1; /**< Upper case (for base16 only) */ + char align_left:1; /**< 0 == align right (default), 1 == align left */ + unsigned int width; /**< field width */ + char sign; /**< The sign to display (if any) */ + unsigned int base; /**< number base (e.g.: 8, 10, 16) */ + char *bf; /**< Buffer to output */ +}; + + +#ifdef PRINTF_LONG_LONG_SUPPORT +static void _TFP_GCC_NO_INLINE_ ulli2a( + unsigned long long int num, struct param *p) +{ + int n = 0; + unsigned long long int d = 1; + char *bf = p->bf; + while (num / d >= p->base) + d *= p->base; + while (d != 0) { + int dgt = num / d; + num %= d; + d /= p->base; + if (n || dgt > 0 || d == 0) { + *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); + ++n; + } + } + *bf = 0; +} + +static void lli2a(long long int num, struct param *p) +{ + if (num < 0) { + num = -num; + p->sign = '-'; + } + ulli2a(num, p); +} +#endif + +#ifdef PRINTF_LONG_SUPPORT +static void uli2a(unsigned long int num, struct param *p) +{ + int n = 0; + unsigned long int d = 1; + char *bf = p->bf; + while (num / d >= p->base) + d *= p->base; + while (d != 0) { + int dgt = num / d; + num %= d; + d /= p->base; + if (n || dgt > 0 || d == 0) { + *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); + ++n; + } + } + *bf = 0; +} + +static void li2a(long num, struct param *p) +{ + if (num < 0) { + num = -num; + p->sign = '-'; + } + uli2a(num, p); +} +#endif + +static void ui2a(unsigned int num, struct param *p) +{ + int n = 0; + unsigned int d = 1; + char *bf = p->bf; + while (num / d >= p->base) + d *= p->base; + while (d != 0) { + int dgt = num / d; + num %= d; + d /= p->base; + if (n || dgt > 0 || d == 0) { + *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); + ++n; + } + } + *bf = 0; +} + +static void i2a(int num, struct param *p) +{ + if (num < 0) { + num = -num; + p->sign = '-'; + } + ui2a(num, p); +} + +static int a2d(char ch) +{ + if (ch >= '0' && ch <= '9') + return ch - '0'; + else if (ch >= 'a' && ch <= 'f') + return ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + else + return -1; +} + +static char a2u(char ch, const char **src, int base, unsigned int *nump) +{ + const char *p = *src; + unsigned int num = 0; + int digit; + while ((digit = a2d(ch)) >= 0) { + if (digit > base) + break; + num = num * base + digit; + ch = *p++; + } + *src = p; + *nump = num; + return ch; +} + +static void putchw(void *putp, putcf putf__, struct param *p) +{ + char ch; + int n = p->width; + char *bf = p->bf; + + /* Number of filling characters */ + while (*bf++ && n > 0) + n--; + if (p->sign) + n--; + if (p->alt && p->base == 16) + n -= 2; + else if (p->alt && p->base == 8) + n--; + + /* Fill with space to align to the right, before alternate or sign */ + if (!p->lz && !p->align_left) { + while (n-- > 0) + putf(putp, ' '); + } + + /* print sign */ + if (p->sign) + putf(putp, p->sign); + + /* Alternate */ + if (p->alt && p->base == 16) { + putf(putp, '0'); + putf(putp, (p->uc ? 'X' : 'x')); + } else if (p->alt && p->base == 8) { + putf(putp, '0'); + } + + /* Fill with zeros, after alternate or sign */ + if (p->lz) { + while (n-- > 0) + putf(putp, '0'); + } + + /* Put actual buffer */ + bf = p->bf; + while ((ch = *bf++)) + putf(putp, ch); + + /* Fill with space to align to the left, after string */ + if (!p->lz && p->align_left) { + while (n-- > 0) + putf(putp, ' '); + } +} + +void tfp_format(void *putp, putcf putf__, const char *fmt, va_list va) +{ + struct param p; +#ifdef PRINTF_LONG_SUPPORT + char bf[23]; /* long = 64b on some architectures */ +#else + char bf[12]; /* int = 32b on some architectures */ +#endif + char ch; + p.bf = bf; + + while ((ch = *(fmt++))) { + if (ch != '%') { + putf(putp, ch); + } else { +#ifdef PRINTF_LONG_SUPPORT + char lng = 0; /* 1 for long, 2 for long long */ +#endif + /* Init parameter struct */ + p.lz = 0; + p.alt = 0; + p.width = 0; + p.align_left = 0; + p.sign = 0; + + /* Flags */ + while ((ch = *(fmt++))) { + switch (ch) { + case '-': + p.align_left = 1; + continue; + case '0': + p.lz = 1; + continue; + case '#': + p.alt = 1; + continue; + default: + break; + } + break; + } + + /* Width */ + if (ch >= '0' && ch <= '9') { + ch = a2u(ch, &fmt, 10, &(p.width)); + } + + /* We accept 'x.y' format but don't support it completely: + * we ignore the 'y' digit => this ignores 0-fill + * size and makes it == width (ie. 'x') */ + if (ch == '.') { + p.lz = 1; /* zero-padding */ + /* ignore actual 0-fill size: */ + do { + ch = *(fmt++); + } while ((ch >= '0') && (ch <= '9')); + } + +#ifdef PRINTF_SIZE_T_SUPPORT +# ifdef PRINTF_LONG_SUPPORT + if (ch == 'z') { + ch = *(fmt++); + if (sizeof(size_t) == sizeof(unsigned long int)) + lng = 1; +# ifdef PRINTF_LONG_LONG_SUPPORT + else if (sizeof(size_t) == sizeof(unsigned long long int)) + lng = 2; +# endif + } else +# endif +#endif + +#ifdef PRINTF_LONG_SUPPORT + if (ch == 'l') { + ch = *(fmt++); + lng = 1; +#ifdef PRINTF_LONG_LONG_SUPPORT + if (ch == 'l') { + ch = *(fmt++); + lng = 2; + } +#endif + } +#endif + switch (ch) { + case 0: + goto abort; + case 'u': + p.base = 10; +#ifdef PRINTF_LONG_SUPPORT +#ifdef PRINTF_LONG_LONG_SUPPORT + if (2 == lng) + ulli2a(va_arg(va, unsigned long long int), &p); + else +#endif + if (1 == lng) + uli2a(va_arg(va, unsigned long int), &p); + else +#endif + ui2a(va_arg(va, unsigned int), &p); + putchw(putp, putf, &p); + break; + case 'd': + case 'i': + p.base = 10; +#ifdef PRINTF_LONG_SUPPORT +#ifdef PRINTF_LONG_LONG_SUPPORT + if (2 == lng) + lli2a(va_arg(va, long long int), &p); + else +#endif + if (1 == lng) + li2a(va_arg(va, long int), &p); + else +#endif + i2a(va_arg(va, int), &p); + putchw(putp, putf, &p); + break; +#ifdef SIZEOF_POINTER + case 'p': + p.alt = 1; +#ifdef PRINTF_LONG_SUPPORT +# if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT + lng = 0; +# elif defined(SIZEOF_LONG) && SIZEOF_POINTER <= SIZEOF_LONG + lng = 1; +# elif defined(SIZEOF_LONG_LONG) && SIZEOF_POINTER <= SIZEOF_LONG_LONG + lng = 2; +# endif +#endif +#endif + case 'x': + case 'X': + p.base = 16; + p.uc = (ch == 'X')?1:0; +#ifdef PRINTF_LONG_SUPPORT +#ifdef PRINTF_LONG_LONG_SUPPORT + if (2 == lng) + ulli2a(va_arg(va, unsigned long long int), &p); + else +#endif + if (1 == lng) + uli2a(va_arg(va, unsigned long int), &p); + else +#endif + ui2a(va_arg(va, unsigned int), &p); + putchw(putp, putf, &p); + break; + case 'o': + p.base = 8; + ui2a(va_arg(va, unsigned int), &p); + putchw(putp, putf, &p); + break; + case 'c': + putf(putp, (char)(va_arg(va, int))); + break; + case 's': + p.bf = va_arg(va, char *); + putchw(putp, putf, &p); + p.bf = bf; + break; + case '%': + putf(putp, ch); + default: + break; + } + } + } + abort:; +} + +#if TINYPRINTF_DEFINE_TFP_PRINTF +static putcf stdout_putf; +static void *stdout_putp; + +void init_printf(void *putp, putcf putf__) +{ + stdout_putf = putf; + stdout_putp = putp; +} + +void tfp_printf(char *fmt, ...) +{ + va_list va; + va_start(va, fmt); + tfp_format(stdout_putp, stdout_putf, fmt, va); + va_end(va); +} +#endif + +#if TINYPRINTF_DEFINE_TFP_SPRINTF +struct _vsnprintf_putcf_data +{ + size_t dest_capacity; + char *dest; + size_t num_chars; +}; + +static void _vsnprintf_putcf(void *p, char c) +{ + struct _vsnprintf_putcf_data *data = (struct _vsnprintf_putcf_data*)p; + if (data->num_chars < data->dest_capacity) + data->dest[data->num_chars] = c; + data->num_chars ++; +} + +int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + struct _vsnprintf_putcf_data data; + + if (size < 1) + return 0; + + data.dest = str; + data.dest_capacity = size-1; + data.num_chars = 0; + tfp_format(&data, _vsnprintf_putcf, format, ap); + + if (data.num_chars < data.dest_capacity) + data.dest[data.num_chars] = '\0'; + else + data.dest[data.dest_capacity] = '\0'; + + return data.num_chars; +} + +int tfp_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int retval; + + va_start(ap, format); + retval = tfp_vsnprintf(str, size, format, ap); + va_end(ap); + return retval; +} + +struct _vsprintf_putcf_data +{ + char *dest; + size_t num_chars; +}; + +static void _vsprintf_putcf(void *p, char c) +{ + struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p; + data->dest[data->num_chars++] = c; +} + +int tfp_vsprintf(char *str, const char *format, va_list ap) +{ + struct _vsprintf_putcf_data data; + data.dest = str; + data.num_chars = 0; + tfp_format(&data, _vsprintf_putcf, format, ap); + data.dest[data.num_chars] = '\0'; + return data.num_chars; +} + +int tfp_sprintf(char *str, const char *format, ...) +{ + va_list ap; + int retval; + + va_start(ap, format); + retval = tfp_vsprintf(str, format, ap); + va_end(ap); + return retval; +} +#endif diff --git a/tests/utils/w_input.h b/tests/utils/w_input.h new file mode 100644 index 00000000..bf214e6a --- /dev/null +++ b/tests/utils/w_input.h @@ -0,0 +1,74 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// Authors: Yvan Tortorella +// + +/* Header file generated by RedMulE Golden Model */ +uint16_t w_inp [4096] = { +0x3bbf, 0x3a4f, 0x38c4, 0x327f, 0x39bf, 0x3b69, 0x39a3, 0x2e11, 0x38e6, 0x3c00, 0x3ae7, 0x1823, 0x3bfe, 0x3a16, 0x3b13, 0x3208, 0x3355, 0x38fb, 0x39f1, 0x3644, 0x38ea, 0x3ba0, 0x32f9, 0x2c66, 0x2fa4, 0x162a, 0x30f9, 0x284c, 0x38ba, 0x3922, 0x36ba, 0x3299, 0x3729, 0x3a1d, 0x3593, 0x3526, 0x3974, 0x3ae1, 0x3901, 0x3bdf, 0x35eb, 0x3986, 0x39a7, 0x23a9, 0x38ac, 0x3013, 0x2e9f, 0x37e7, 0x3879, 0x3507, 0x3b76, 0x2fa5, 0x3b21, 0x3b63, 0x3af5, 0x39de, 0x31cb, 0x3757, 0x3409, 0x3b56, 0x396c, 0x30ea, 0x2837, 0x39a6, +0x30bd, 0x3bb3, 0x3ad3, 0x3b51, 0x36bf, 0x34f2, 0x32cf, 0x39a2, 0x3a21, 0x38d6, 0x246c, 0x3553, 0x2a8d, 0x39f9, 0x31a6, 0x3bff, 0x3570, 0x3630, 0x39a3, 0x266e, 0x3a7e, 0x300e, 0x2ee0, 0x333d, 0x3753, 0x3a04, 0x3a4e, 0x38ed, 0x397a, 0x3b7a, 0x3a68, 0x36b5, 0x2e7c, 0x3b1b, 0x393d, 0x3802, 0x3820, 0x2585, 0x328c, 0x3a63, 0x38e6, 0x3b34, 0x3396, 0x3714, 0x324b, 0x35e4, 0x367c, 0x39a7, 0x36ef, 0x3b36, 0x39e2, 0x3871, 0x3bb2, 0x3901, 0x37af, 0x3b38, 0x352a, 0x39c0, 0x3446, 0x313d, 0x34ad, 0x37a4, 0x386d, 0x3433, +0x3aa4, 0x396e, 0x3902, 0x380b, 0x3197, 0x3238, 0x3552, 0x3885, 0x3b50, 0x39a3, 0x3b07, 0x2d7f, 0x3631, 0x3a74, 0x389d, 0x31d4, 0x3b0e, 0x301e, 0x38a7, 0x3c00, 0x86e, 0x357e, 0x33e0, 0x3519, 0x39ad, 0x3b27, 0x3841, 0x3ba6, 0x39fc, 0x3903, 0x3850, 0x398a, 0x39dd, 0x3837, 0x35f1, 0x34b0, 0x33d4, 0x3bde, 0x3013, 0x2f51, 0x3b18, 0x37ed, 0x3517, 0x3b3e, 0x3a88, 0x3a1a, 0x3203, 0x370b, 0x3994, 0x3a22, 0x29e5, 0x38af, 0x354b, 0x2862, 0x3204, 0x3483, 0x3b73, 0x3732, 0x3a46, 0x3455, 0x36c9, 0x3450, 0x35c2, 0x3582, +0x3862, 0x3b2e, 0x3422, 0x38a7, 0x3275, 0x351c, 0x35f2, 0x39d6, 0x3453, 0x381c, 0x3a47, 0x3acd, 0x38bf, 0x3a66, 0x33b9, 0x31e4, 0x350d, 0x3be2, 0x38b9, 0x37ac, 0x24dc, 0x2ec2, 0x3239, 0x3546, 0x3b1f, 0x3404, 0x3a82, 0x377c, 0x34d0, 0x34a4, 0x3b4e, 0x398d, 0x3992, 0x32f9, 0x3957, 0x3810, 0x3bc4, 0x38bd, 0x3b31, 0x2d86, 0x3519, 0x3a4f, 0x398a, 0x39cf, 0x3b0d, 0x326a, 0x367f, 0x3a57, 0x39b7, 0x3b13, 0x37b7, 0x38e9, 0x3774, 0x2cf1, 0x36cf, 0x3a0d, 0x38ba, 0x2b93, 0x37d2, 0x2c24, 0x35cf, 0x377c, 0x32c3, 0x3a7c, +0x3b6f, 0x353a, 0x3046, 0x3601, 0x3597, 0x2b40, 0x3893, 0x3be2, 0x298d, 0x2e2c, 0x3907, 0x2a90, 0x3498, 0x3bed, 0x3469, 0x3080, 0x30ae, 0x35d8, 0x3814, 0x3529, 0x3912, 0x3a96, 0x33b6, 0x3405, 0x38d4, 0x3936, 0x31ba, 0x348e, 0x2c03, 0x34f7, 0x3995, 0x396f, 0x31d7, 0x396d, 0x2c71, 0x39aa, 0x32ef, 0x397e, 0x1592, 0x3830, 0x3ad8, 0x3872, 0x35d2, 0x3b2c, 0x309b, 0x35c0, 0x35d6, 0x35e1, 0x3bbe, 0x375d, 0x3974, 0x3a7e, 0x3ab8, 0x3534, 0x3966, 0x37d2, 0x3515, 0x25c9, 0x35c6, 0x3788, 0x3734, 0x3aa6, 0x33d7, 0x395e, +0x35bc, 0x3b47, 0x39f3, 0x3a5b, 0x38e0, 0x3161, 0x2913, 0x39eb, 0x398e, 0x32cf, 0x3800, 0x35b4, 0x3a4f, 0x3aa5, 0x3a05, 0x3404, 0x3a87, 0x3ba6, 0x3afa, 0x35ac, 0x3bad, 0x3906, 0x332e, 0x3a85, 0x3b6a, 0x30fc, 0x300c, 0x3861, 0x36f6, 0x3acd, 0x34ff, 0x3882, 0x362d, 0x39fc, 0x3b5d, 0x283f, 0x3af2, 0x3bfe, 0x381e, 0x3b54, 0x395b, 0x35fc, 0x3a7c, 0x3a03, 0x372f, 0x342d, 0x3846, 0x3922, 0x39b9, 0x3523, 0x3998, 0x3568, 0x3662, 0x2c52, 0x3982, 0x2e41, 0x37d6, 0x38cd, 0x3b9e, 0x37cc, 0x2e33, 0x2f92, 0x3a44, 0x3b79, +0x3b2e, 0x39c9, 0x3683, 0x300a, 0x3a4b, 0x25da, 0x3351, 0x3920, 0x34b3, 0x3314, 0x3905, 0x1ed4, 0x39bc, 0x3b3e, 0x3950, 0x359e, 0x36da, 0x35a7, 0x39da, 0x389d, 0x3976, 0x3860, 0x369f, 0x3a0f, 0x3620, 0x33c8, 0x3a2a, 0x3776, 0x344a, 0x3a2e, 0x325e, 0x3852, 0x2e84, 0x31eb, 0x3474, 0x393b, 0x3225, 0x2d3a, 0x3870, 0x2229, 0x3469, 0x33fa, 0x31bd, 0x3055, 0x3a42, 0x381a, 0x3ab9, 0x39d2, 0x384a, 0x35f4, 0x32fe, 0x305e, 0x317e, 0x3484, 0x308b, 0x3893, 0x39e1, 0x3a15, 0x38a6, 0x3321, 0x376a, 0x39c9, 0x317f, 0x37a6, +0x30e6, 0x3362, 0x37ac, 0x389b, 0x3818, 0x3883, 0x354b, 0x3b88, 0x39d8, 0x3a60, 0x375b, 0x3836, 0x38cc, 0x37fb, 0x3927, 0x3b78, 0x3961, 0x39b7, 0x302d, 0x3ad0, 0x396d, 0x3840, 0x39a5, 0x3965, 0x39a0, 0x38a2, 0x3405, 0x3b69, 0x3215, 0x3455, 0x3ba7, 0x38a9, 0x3b13, 0x37d6, 0x352c, 0x39bb, 0x2998, 0x299f, 0x33fe, 0x3954, 0x3b3c, 0x3bff, 0x3b50, 0x35e9, 0x2f7c, 0x2af3, 0x3bb8, 0x39ca, 0x3ad6, 0x38f6, 0x3a08, 0x34e1, 0x3966, 0x29cc, 0x3ac7, 0x33d2, 0x39b2, 0x3631, 0x3b4f, 0x2879, 0x347c, 0x28cf, 0x3258, 0x38e1, +0x3ae6, 0x3801, 0x31c4, 0x331f, 0x391f, 0x39b5, 0x2558, 0x368f, 0x3abe, 0x3a5d, 0x2180, 0x292d, 0x3612, 0x3b04, 0x35bd, 0x35a6, 0x388e, 0x3a23, 0x392d, 0x2660, 0x3b09, 0x33d0, 0x2ff0, 0x3220, 0x3619, 0x3671, 0x394a, 0x363f, 0x34a9, 0x2e8e, 0x3bfd, 0x3934, 0x3b61, 0x39c4, 0x38a2, 0x3a1b, 0x3a18, 0x3123, 0x2762, 0x3a95, 0x350b, 0x3a9b, 0x3058, 0x3ade, 0x34e7, 0x372e, 0x3aec, 0x32b0, 0x3baa, 0x3444, 0x3aee, 0x2d22, 0x33b7, 0x3223, 0x3980, 0x3a34, 0x365d, 0x3a11, 0x2d80, 0x39d0, 0x28d2, 0x3afb, 0x394b, 0x38e7, +0x3646, 0x3a7f, 0x364a, 0x355f, 0x3861, 0x3836, 0x38ab, 0x30d1, 0x34df, 0x3998, 0x383c, 0x39e0, 0x328f, 0x2d1e, 0x3757, 0x352a, 0x36d0, 0x3a49, 0x372a, 0x3953, 0x39d1, 0x3b88, 0x3695, 0x30e5, 0x3ac7, 0x399c, 0x35f4, 0x3324, 0x3822, 0x3941, 0x3405, 0x3354, 0x38d1, 0x3b13, 0x22a8, 0x38e6, 0x393b, 0x3bc4, 0x3b25, 0x2d11, 0x39a8, 0x3b80, 0x3894, 0x3541, 0x3a68, 0x338d, 0x3b57, 0x2794, 0x352b, 0x39b7, 0x3a96, 0x380e, 0x3b86, 0x3826, 0x2ab0, 0x3a1d, 0x3abc, 0x3494, 0x3a05, 0x2e39, 0x344e, 0x24a9, 0x3812, 0x354d, +0x3320, 0x3142, 0x35f7, 0x3aba, 0x2cd3, 0x3515, 0x3368, 0x1c0c, 0x316e, 0x382e, 0x3aca, 0x374a, 0x3715, 0x395e, 0x37fe, 0x2e7d, 0x3701, 0x3841, 0x3957, 0x394c, 0x3921, 0x2d98, 0x3265, 0x387d, 0x3b98, 0x3888, 0x396a, 0x3be0, 0x389f, 0x3932, 0x2eec, 0x2b3c, 0x36e4, 0x3831, 0x389f, 0x3834, 0x378d, 0x38d7, 0x3451, 0x3961, 0x3083, 0x34e2, 0x32b0, 0x39e8, 0x389a, 0x3770, 0x38ad, 0x3b42, 0x2f15, 0x37ac, 0x3ac8, 0x362f, 0x3be5, 0x3807, 0x343b, 0x3807, 0x3017, 0x39c6, 0x37cd, 0x1b72, 0x3761, 0x39dd, 0x2bb9, 0x28d7, +0x3353, 0x3aeb, 0x33d6, 0x3816, 0x34b6, 0x38dd, 0x3372, 0x37c4, 0x3953, 0x3b90, 0x38e6, 0x38d3, 0x374a, 0x2dd9, 0x390d, 0x3524, 0x380f, 0x31eb, 0x37ba, 0x3414, 0x3050, 0x3a8d, 0x31f2, 0x3797, 0x399a, 0x3bf8, 0x3827, 0x343a, 0x38b2, 0x32c4, 0x3693, 0x3ad0, 0x36c1, 0x331d, 0x37d9, 0x2870, 0x3666, 0x3941, 0x39bb, 0x2f03, 0x33b2, 0x3a54, 0x3a09, 0x392f, 0x3bcc, 0x3604, 0x3bab, 0x39d3, 0x3a67, 0x3ac0, 0x3a36, 0x3b5e, 0x3811, 0x3bb2, 0x3b32, 0x37f5, 0x3948, 0x3bae, 0x34e2, 0x35cc, 0x3b0d, 0x30b7, 0x30a0, 0x3ace, +0x38e6, 0x3a9d, 0x393c, 0x3412, 0x30ae, 0x3244, 0x3620, 0x39c7, 0x3a3f, 0x3624, 0x3749, 0x3691, 0x3921, 0x31a4, 0x2ee8, 0x3872, 0x3030, 0x3259, 0x34d0, 0x301b, 0x360c, 0x3979, 0x2845, 0x3a38, 0x3851, 0x3a05, 0x3467, 0x381b, 0x3b1f, 0x3a2d, 0x30f8, 0x399a, 0x3805, 0x3110, 0x3bd6, 0x35b5, 0x3091, 0x2fcd, 0x3049, 0x3bee, 0x385a, 0x3478, 0x31a9, 0x3be4, 0x3a1d, 0x2559, 0x39c5, 0x321e, 0x33b9, 0x3b75, 0x37af, 0x39aa, 0x3948, 0x3726, 0x3aef, 0x301d, 0x36c2, 0x3a01, 0x2dfa, 0x311e, 0x3b8d, 0x31f7, 0x30d5, 0x3a6b, +0x381c, 0x362b, 0x29c9, 0x34ac, 0x3993, 0x3828, 0x3b4d, 0x3aa3, 0x3847, 0x34c8, 0x2b11, 0x3a5c, 0x2ebd, 0x2c9a, 0x395a, 0x366d, 0x398b, 0x255e, 0x3b7e, 0x2d74, 0x356d, 0x33e3, 0x39ad, 0x2886, 0x39c7, 0x3996, 0x3bbd, 0x383c, 0x3b71, 0x3935, 0x3a02, 0x351a, 0x3686, 0x31b1, 0x3a6c, 0x3afb, 0x3716, 0x3469, 0x351e, 0x3858, 0x377e, 0x2edb, 0x3baf, 0x30d7, 0x3a60, 0x3906, 0x3baf, 0x3814, 0x32e6, 0x3bad, 0x34f9, 0x34ac, 0x37f6, 0x3ab7, 0x3035, 0x3701, 0x35a6, 0x3aad, 0x3772, 0x3893, 0x3805, 0x1186, 0x3716, 0x387c, +0x3b15, 0x38da, 0xca2, 0x3a5f, 0x2bcf, 0x2e9c, 0x3a15, 0x31d7, 0x331f, 0x3b99, 0x310a, 0x3538, 0x3b1b, 0x3616, 0x326f, 0x2f28, 0x3bfc, 0x28a6, 0x3a09, 0x3489, 0x3769, 0x39c5, 0x3aa8, 0x3bce, 0x386c, 0x39ac, 0x39a0, 0x390b, 0x3470, 0x388f, 0x3938, 0x3819, 0x354b, 0x3b99, 0x3978, 0x31fa, 0x357b, 0x3833, 0x38fa, 0x34ee, 0x3bdb, 0x392c, 0x354e, 0x3b84, 0x3abe, 0x394b, 0x39ec, 0x3855, 0x39df, 0x39ad, 0x3ac8, 0x3871, 0x2d02, 0x39a3, 0x3b0b, 0x3ab5, 0x34ca, 0x3afa, 0x3ade, 0x38df, 0x35f1, 0x3b1d, 0x28c5, 0x3b21, +0x38db, 0x3450, 0x3b0b, 0x3b29, 0x38c1, 0x36e7, 0x3692, 0x31ee, 0x3b85, 0x3828, 0x38a7, 0x3972, 0x2a44, 0x2ddd, 0x3ac7, 0x2de7, 0x3bba, 0x21c9, 0x3acb, 0x2e8c, 0x25f3, 0x3aa6, 0x3941, 0x32c5, 0x3022, 0x397f, 0x3339, 0x2052, 0x2ecc, 0x37a5, 0x3ada, 0x3ac7, 0x326e, 0x38b1, 0x30f2, 0x322a, 0x373e, 0x3a1b, 0x39a0, 0x3708, 0x38ab, 0x37f8, 0x30ac, 0x36e8, 0x3279, 0x354c, 0x38f9, 0x34ee, 0x33b2, 0x3be9, 0x385c, 0x3b21, 0x3ba7, 0x39b1, 0x37da, 0x3036, 0x3a3f, 0x37c8, 0x3aed, 0x3578, 0x3789, 0x31ac, 0x39d9, 0x3b22, +0x3b0d, 0x3a68, 0x35bb, 0x3a72, 0x386b, 0x3541, 0x309c, 0x3ab8, 0x392c, 0x3bec, 0x390d, 0x364b, 0x3780, 0x34fa, 0x3537, 0x2117, 0x39ba, 0x3ae4, 0x37ce, 0x3ab4, 0x3774, 0x29d7, 0x2e7d, 0x3853, 0x3bd0, 0x38a6, 0x39dc, 0x29ac, 0x37bd, 0x3986, 0x35f8, 0x3b9d, 0x39b3, 0x363a, 0x399a, 0x3190, 0x3a04, 0x3b4f, 0x2c5f, 0x3081, 0x376c, 0x2f04, 0x2228, 0x3a8e, 0x3900, 0x3936, 0x309f, 0x396b, 0x393e, 0x39b0, 0x35f6, 0x336b, 0x39b5, 0x3843, 0x3203, 0x2ffe, 0x3be9, 0x3560, 0x3b30, 0x3740, 0x3739, 0x2a85, 0x333a, 0x37d6, +0x385a, 0x38eb, 0x32f6, 0x36b6, 0x37b5, 0x37cf, 0x3a93, 0x35ac, 0x3bb9, 0x3bfb, 0x32b1, 0x3767, 0x3362, 0x3af0, 0x26b2, 0x38b5, 0x39e7, 0x37b9, 0x2ccf, 0x38dd, 0x3424, 0x38b2, 0x3aa1, 0x393a, 0x3bf1, 0x37ea, 0x1aea, 0x3a53, 0x3a73, 0x3a1f, 0x3934, 0x3be6, 0x366b, 0x369b, 0x267a, 0x35d2, 0x3aca, 0x38ad, 0x257d, 0x343e, 0x3118, 0x3727, 0x3a70, 0x3838, 0x3462, 0x3142, 0x3a12, 0x3567, 0x3921, 0x362b, 0x3a1c, 0x383c, 0x385f, 0x399c, 0x2d9f, 0x3b21, 0x2be6, 0x3905, 0x2bbe, 0x34fa, 0x3798, 0x3bd3, 0x3942, 0x3aef, +0x39f7, 0x392b, 0x2bab, 0x2df9, 0x2cdc, 0x38ec, 0x35e3, 0x3270, 0x30c7, 0x380b, 0x2f85, 0x2ce0, 0x3b0b, 0x38ee, 0x3a30, 0x3904, 0x3a66, 0x3ae5, 0x380e, 0x38fd, 0x3aed, 0x3b68, 0x3a1e, 0x39b2, 0x38b0, 0x268a, 0x3964, 0x32b1, 0x32fc, 0x2c3b, 0x3568, 0x2a08, 0x2e62, 0x354a, 0x338f, 0x3b83, 0x380b, 0x323d, 0x38d1, 0x34c3, 0x3484, 0x3bd6, 0x30f6, 0x36e0, 0x396a, 0x35fa, 0x39c0, 0x3624, 0x3a16, 0x3918, 0x2f14, 0x31ed, 0x3bb8, 0x38a6, 0x3af8, 0x35f0, 0x3985, 0x3454, 0x3b4d, 0x39c0, 0x3821, 0x36e2, 0x2549, 0x36aa, +0x3816, 0x3a0a, 0x3750, 0x3b7a, 0x3898, 0x3ac6, 0x363e, 0x330d, 0x34b4, 0x3a2d, 0x3502, 0x355b, 0x3ba5, 0x3a84, 0x38d4, 0x37c3, 0x31bc, 0x391e, 0x3512, 0x36a9, 0x3241, 0x3ada, 0x3108, 0x349b, 0x3027, 0x3750, 0x3839, 0x3abf, 0x396f, 0x35af, 0x3680, 0x38f6, 0x38d4, 0x3351, 0x3056, 0x3260, 0x2f02, 0x38f9, 0x35f0, 0x32ab, 0x3923, 0x3898, 0x3af0, 0x303f, 0x3934, 0x3a58, 0x3ab1, 0x3abd, 0x31c1, 0x34ac, 0x3921, 0x3075, 0x269b, 0x2961, 0x3569, 0x37d3, 0x35a2, 0x3b52, 0x39e5, 0x3817, 0x3866, 0x3744, 0x3665, 0x3be9, +0x33c6, 0x3010, 0x2d3f, 0x39f3, 0x2ed1, 0x35d9, 0x2d6f, 0x35be, 0x39ad, 0x2b83, 0x3adf, 0x3a32, 0x3bcd, 0x3456, 0x375f, 0x37a3, 0x3098, 0x3bbe, 0x36b7, 0x2df1, 0x3931, 0x3142, 0x30d3, 0x2a49, 0x2d72, 0x262d, 0x39bc, 0x3bfa, 0x3abc, 0x3ac0, 0x3531, 0x3800, 0x36d4, 0x379c, 0x3aba, 0x3053, 0x350e, 0x3989, 0x3003, 0x3a51, 0x37cc, 0x34fd, 0x333a, 0x33f1, 0x3a0a, 0x345d, 0x38e0, 0x28e4, 0x3a64, 0x317f, 0x2cad, 0x395a, 0x343c, 0x3ba7, 0x39ea, 0x3b5b, 0x34ff, 0x3955, 0x39d1, 0x360a, 0x2f25, 0x3a4d, 0x3889, 0x2eb6, +0x3021, 0x396d, 0x379f, 0x3495, 0x38d5, 0x3963, 0x33ae, 0x3bfd, 0x211f, 0x3aed, 0x2fd8, 0x3b2d, 0x33eb, 0x2c29, 0x3954, 0x3219, 0x3958, 0x3b2f, 0x3578, 0x315d, 0x387a, 0x2561, 0x3ba4, 0x39cb, 0x341e, 0x375f, 0x39ad, 0x3700, 0x3ab9, 0x34c1, 0x3051, 0x3b77, 0x3705, 0x3ae6, 0x3b58, 0x37d5, 0x3a6c, 0x3476, 0x3589, 0x2818, 0x35c5, 0x3876, 0x3871, 0x35a8, 0x30c9, 0x357e, 0x38c9, 0x38a1, 0x35cf, 0x36db, 0x3401, 0x34a6, 0x3826, 0x37fe, 0x3beb, 0x38ed, 0x322c, 0x352a, 0x38e1, 0x3bf1, 0x32fa, 0x3bd5, 0x3310, 0x361e, +0x3af0, 0x323b, 0x3565, 0x23c8, 0x3b28, 0x3853, 0x2aab, 0x39d9, 0x3bbf, 0x3b2d, 0x35ce, 0x3a4a, 0x3992, 0x35ac, 0x1723, 0x38fa, 0x38d7, 0x354c, 0x3b0b, 0x3888, 0x3a98, 0x38f6, 0x391d, 0x381b, 0x38cf, 0x3a60, 0x2a34, 0x3a09, 0x2257, 0x3a63, 0x3ab7, 0x3494, 0x2955, 0x3978, 0x3ba2, 0x2804, 0x384e, 0x383d, 0x3be4, 0x391e, 0x3851, 0x3908, 0x2084, 0x35a8, 0x2f69, 0x3adc, 0x3a16, 0x3990, 0x3479, 0x3551, 0x389b, 0x3bd6, 0x3128, 0x3835, 0x3541, 0x306f, 0x380e, 0x341d, 0x3a6e, 0x3a12, 0x3a77, 0x3464, 0x3aa9, 0x3693, +0x34ae, 0x35c2, 0x3346, 0x3ad0, 0x3857, 0x2ad5, 0x3ba7, 0x3327, 0x3ae6, 0x32df, 0x3be9, 0x3544, 0x3060, 0x39c0, 0x2daa, 0x376d, 0x3a90, 0x3b29, 0x380e, 0x33a6, 0x347f, 0x3b7c, 0x3b9d, 0x31e3, 0x393e, 0x3a56, 0x3bcb, 0x38f9, 0x3656, 0x3011, 0x3be5, 0x32c5, 0x3807, 0x39a7, 0x35e6, 0x3a3a, 0x33cf, 0x37c8, 0x3af2, 0x3a42, 0x3119, 0x3534, 0x3b1d, 0x29dd, 0x3ab6, 0x38c3, 0x35d0, 0x3189, 0x3635, 0x38d2, 0x2fb9, 0x3944, 0x3918, 0x333e, 0x3ab8, 0x31ba, 0x3a3f, 0x3b87, 0x3508, 0x2f76, 0x3670, 0x3043, 0x3aa9, 0x360d, +0x3807, 0x3a78, 0x3909, 0x39a1, 0x32f5, 0x3667, 0x3125, 0x386c, 0x3702, 0x3a83, 0x397e, 0x2d4a, 0x399a, 0x3b13, 0x351e, 0x39e5, 0x39bb, 0x374f, 0x2c0a, 0x3ade, 0x31d8, 0x3b82, 0x3a5d, 0x3598, 0x391f, 0x3a76, 0x3641, 0x2fe2, 0x38bd, 0x3abb, 0x3988, 0x36b2, 0x3b1e, 0x37d5, 0x3509, 0x38e0, 0x2e2c, 0x34fd, 0x3053, 0x32da, 0x3988, 0x3a32, 0x3a4c, 0x356d, 0x3716, 0x3449, 0x2bd1, 0x34d8, 0x3600, 0x385a, 0x39cf, 0x3850, 0x2d4c, 0x3ba5, 0x39ba, 0x393a, 0x3be8, 0x3823, 0x37b0, 0x3b15, 0x3bbe, 0x3869, 0x301a, 0x337b, +0x3be3, 0x2e58, 0x39fb, 0x31fb, 0x385e, 0x3863, 0x36ca, 0x31e9, 0x32da, 0x377b, 0x375b, 0x3ac7, 0x3b05, 0x36f6, 0x3aa6, 0x3182, 0x38f8, 0x396c, 0x34d8, 0x383c, 0x3602, 0x3744, 0x3b2b, 0x381e, 0x320b, 0x3674, 0x39b1, 0x32ea, 0x37a9, 0x3800, 0x3a3a, 0x3876, 0x32a5, 0x3b99, 0x305d, 0x26ce, 0x38ae, 0x3a69, 0x362a, 0x2cb4, 0x31da, 0x3bb7, 0x2e60, 0x3539, 0x397c, 0x398f, 0x3972, 0x33a9, 0x38d9, 0x3733, 0x3991, 0x367d, 0x3af9, 0x380f, 0x3b6d, 0x2c45, 0x35cb, 0x31ab, 0x3349, 0x2f9b, 0x3a48, 0x3a3b, 0x3b5e, 0x2ee0, +0x3061, 0x3010, 0x39a0, 0x3861, 0x38d2, 0x3b18, 0x328f, 0x39ac, 0x370f, 0x3485, 0x3acf, 0x39d7, 0x3703, 0x39dc, 0x2995, 0x2ff2, 0x29f2, 0x3914, 0x3796, 0x37a8, 0x36e7, 0x3964, 0x3797, 0x3801, 0x387a, 0x3942, 0x383e, 0x3603, 0x337f, 0x30f3, 0x34b5, 0x39e4, 0x39dd, 0x3432, 0x36db, 0x38ae, 0x3533, 0x39c0, 0x38f5, 0x3af3, 0x304f, 0x3ba0, 0x3a69, 0x39a1, 0x35bd, 0x3414, 0x3917, 0x36c4, 0x3a75, 0x3a43, 0x38c3, 0x383e, 0x2e3b, 0x2629, 0x2de1, 0x399b, 0x3153, 0x3525, 0x32a6, 0x3559, 0x3a09, 0x39cf, 0x368f, 0x316b, +0x399a, 0x3aff, 0x3141, 0x2682, 0x2f25, 0x3922, 0x34fc, 0x361a, 0x311e, 0x39ea, 0x2d24, 0x398e, 0x3968, 0x3bb0, 0x3b97, 0x2894, 0x32e8, 0x2fda, 0x32a1, 0x3a45, 0x39c5, 0x38ce, 0x3bb2, 0x3945, 0x3911, 0x2c10, 0x3bbd, 0x3bb2, 0x3675, 0x3395, 0x38ab, 0x2c1e, 0x35be, 0x35c7, 0x37b8, 0x25fc, 0x3b68, 0x307f, 0x3429, 0x3b54, 0x3395, 0x3bdf, 0x373d, 0x3780, 0x323b, 0x3a5c, 0x394d, 0x39c2, 0x3b10, 0x3811, 0x3785, 0x3ab3, 0x3bf2, 0x38fc, 0x37cd, 0x3603, 0x3633, 0x3ac0, 0x1816, 0x33b4, 0x3244, 0x31e0, 0x3ac1, 0x39c7, +0x393f, 0x38f7, 0x32a8, 0x39dd, 0x39f6, 0x3a08, 0x3683, 0x3946, 0x3b26, 0x2dbd, 0x3849, 0x3623, 0x3722, 0x396d, 0x3885, 0x38b4, 0x3965, 0x3352, 0x39b5, 0x3896, 0x2fde, 0x30f3, 0x392d, 0x3105, 0x3a16, 0x3967, 0x375f, 0x3866, 0x2c5a, 0x3987, 0x2f60, 0x39f0, 0x33ef, 0x38e9, 0x390d, 0x3a72, 0x373e, 0x3825, 0x3711, 0x2baa, 0x3a4f, 0x3856, 0x3404, 0x3656, 0x2eca, 0x2b84, 0x3607, 0x3a23, 0x3ab3, 0x3758, 0x2eba, 0x3bd7, 0x3a17, 0x3b20, 0x34d5, 0x39cd, 0x34e9, 0x2e07, 0x3866, 0x34f0, 0x2fde, 0x31c1, 0x376e, 0x3a9f, +0x35dd, 0x34cf, 0x366d, 0x3a74, 0x39a9, 0x3910, 0x323f, 0x2c98, 0x363f, 0x2805, 0x31b2, 0x39d2, 0x3ba0, 0x3494, 0x3bd7, 0x3a5c, 0x3465, 0x30de, 0x287c, 0x36cc, 0x378f, 0x2b94, 0x3bcd, 0x349d, 0x38fb, 0x37ba, 0x3bb3, 0x388e, 0x2834, 0x33b4, 0x3b67, 0x38d7, 0x3910, 0x3a92, 0x329b, 0x2e40, 0x36ba, 0x3813, 0x32c6, 0x3460, 0x3737, 0x3a3c, 0x2aa0, 0x3124, 0x3582, 0x3962, 0x39d7, 0x31bc, 0x38ac, 0x3281, 0x3103, 0x36ed, 0x3a20, 0x39a8, 0x38dd, 0x3917, 0x3b18, 0x3311, 0x2ca3, 0x39f3, 0x3bc4, 0x319b, 0x2b75, 0x3571, +0x34f0, 0x348d, 0x27a2, 0x38a8, 0x347e, 0x3b66, 0x2ffb, 0x35fe, 0x34d1, 0x3ad6, 0x2d9d, 0x3a66, 0x3226, 0x3a3f, 0x378c, 0x3be5, 0x3342, 0x3aa0, 0x3ad5, 0x3773, 0x2ec6, 0x3888, 0x35ad, 0x3b7f, 0x3b4f, 0x354e, 0x384d, 0x34b5, 0x37f4, 0x32a3, 0x3976, 0x2085, 0x3b1b, 0x291e, 0x3537, 0x2ccc, 0x2e4c, 0x3a5a, 0x3572, 0x3860, 0x2d4e, 0x37c4, 0x270c, 0x3ab4, 0x384d, 0x3740, 0x3a53, 0x3a5a, 0x39c2, 0x3abe, 0x393b, 0x3612, 0x3879, 0x3793, 0x3096, 0x388e, 0x3930, 0x3729, 0x353c, 0x39aa, 0x38e4, 0x383a, 0x3028, 0x3578, +0x2e4e, 0x2e63, 0x38a0, 0x3b2b, 0x3b90, 0x3a0f, 0x2d9c, 0x35bc, 0x3b96, 0x35d0, 0x3bf2, 0x3bde, 0x28f8, 0x3943, 0x39aa, 0x39c2, 0x38f4, 0x3571, 0x157d, 0x3b17, 0x304c, 0x363d, 0x2c68, 0x3ba0, 0x3b0e, 0x3513, 0x3669, 0x300c, 0x3852, 0x39f2, 0x3474, 0x3a66, 0x2c9f, 0x2dc2, 0x3b0a, 0x39d1, 0x3942, 0x2422, 0x3ad6, 0x34ec, 0x3b73, 0x3abd, 0x2e73, 0x3581, 0x34b0, 0x25a8, 0x37b9, 0x3924, 0x2f7b, 0x3a6d, 0x3b6b, 0x3378, 0x3bb2, 0x3ace, 0x38a2, 0x349a, 0x3b68, 0x3647, 0x3847, 0x3bd1, 0x3be4, 0x39be, 0x3ac5, 0x397f, +0x22c0, 0x3692, 0x3ba8, 0x384c, 0x3bcb, 0x36d9, 0x3783, 0x3bf4, 0x3852, 0x3b7b, 0x325d, 0x37db, 0x35ed, 0x36f2, 0x371b, 0x3605, 0x3645, 0x228f, 0x358a, 0x34f0, 0x38d9, 0x35ee, 0x3620, 0x3b4a, 0x3a86, 0x3927, 0x3799, 0x3297, 0x3474, 0x34c1, 0x3af8, 0x2dec, 0x2dc6, 0x36f3, 0x30bb, 0x31c4, 0x36d7, 0x37cc, 0x349d, 0x27d7, 0x3a7f, 0x3481, 0x3791, 0x3b71, 0x371b, 0x3838, 0x34c9, 0x2668, 0x310e, 0x3333, 0x39ee, 0x37b4, 0x2bc6, 0x1a59, 0x3afd, 0x39dc, 0x38b1, 0x394a, 0x3697, 0x3103, 0x366c, 0x397a, 0x31b0, 0x32db, +0x3050, 0x3899, 0x36d5, 0x3bfd, 0x3a67, 0x38b6, 0x39c1, 0x322b, 0x2d8a, 0x38f3, 0x397a, 0x3b71, 0x28af, 0x3a4e, 0x3b7d, 0x388d, 0x3aeb, 0x3bf1, 0x3bc9, 0x242f, 0x3681, 0x2f1f, 0x3bd6, 0x391e, 0x31d1, 0x3be6, 0x39fe, 0x3acb, 0x3871, 0x38ae, 0x30ca, 0x3916, 0x36ce, 0x3313, 0x3a4d, 0x3869, 0x35b6, 0x3a6d, 0x376d, 0x3922, 0x27d8, 0x39a6, 0x3a3c, 0x2e99, 0x2fdd, 0x3b05, 0x3b6a, 0x3520, 0x3714, 0x3922, 0x38c4, 0x3b47, 0x3546, 0x2ba3, 0x37c2, 0x381d, 0x3af2, 0x3b8c, 0x289e, 0x3a3a, 0x3ae3, 0x3829, 0x399f, 0x351f, +0x3bff, 0x37da, 0x3b94, 0x3874, 0x3bf8, 0x3943, 0x324d, 0x34bb, 0x3925, 0x38c0, 0x2e81, 0x32d8, 0x3bea, 0x3bcc, 0x387b, 0x3537, 0x3344, 0x3bef, 0x3345, 0x3a47, 0x330c, 0x367c, 0x3792, 0x36f5, 0x384b, 0x3b2e, 0x3998, 0x38dd, 0x25c0, 0x3a12, 0x390d, 0x2ffd, 0x372f, 0x30ea, 0x2ee4, 0x3a81, 0x3ba2, 0x377c, 0x3446, 0x3a57, 0x38cb, 0x3994, 0x360e, 0x3b8c, 0x2f0c, 0x139c, 0x2cce, 0x37af, 0x253d, 0x3287, 0x3b58, 0x3177, 0x3b3e, 0x3426, 0x32b0, 0x3349, 0x3b02, 0x38f3, 0x3a06, 0x3b05, 0x3490, 0x3bcb, 0x3ba6, 0x248a, +0x32e8, 0x3be2, 0x2d59, 0x3909, 0x365f, 0x395a, 0x3025, 0x3862, 0x28c9, 0x3bdf, 0x3360, 0x3bfe, 0x2a94, 0x394b, 0x337f, 0x2d8e, 0x3ad1, 0x38e1, 0x3bf1, 0x38b5, 0x3681, 0x3984, 0x347a, 0x2bbf, 0x38dc, 0x393d, 0x3552, 0x315e, 0x3309, 0x36b5, 0x39d3, 0x361f, 0x387f, 0x3828, 0x344e, 0x3a55, 0x36d3, 0x187a, 0x22ef, 0x3032, 0x373f, 0x360d, 0x396c, 0x37bf, 0x3472, 0x3220, 0x3bd3, 0x2c5b, 0x384b, 0x328e, 0x396e, 0x369c, 0x3798, 0x2e60, 0x3a58, 0x3a47, 0x3a0c, 0x3bb1, 0x32c2, 0x3a49, 0x3523, 0x37aa, 0x2e18, 0x376d, +0x37d8, 0x344e, 0x2328, 0x31d9, 0x3493, 0x32a2, 0x2f0a, 0x3b5a, 0x2fec, 0x30dc, 0x3ad0, 0x3b82, 0x37b9, 0x3695, 0x3892, 0x390a, 0x3a1f, 0x35c7, 0x39c5, 0x31f9, 0x3994, 0x3165, 0x357d, 0x3a36, 0x2fcd, 0x39c4, 0x398f, 0x3950, 0x36d1, 0x39d0, 0x37c1, 0x3bd4, 0x3ad8, 0x396c, 0x3899, 0x3ba0, 0x356d, 0x3232, 0x3001, 0x396a, 0x28e8, 0x3a21, 0x1670, 0x3bcd, 0x3814, 0x3bf2, 0x3b85, 0x38e7, 0x35ae, 0x2d51, 0x3751, 0x33ec, 0x37b2, 0x392e, 0x3a51, 0x3654, 0x3b55, 0x2ec9, 0x38dc, 0x3a39, 0x3425, 0x2c2a, 0x3bfa, 0x3bc1, +0x3489, 0x3027, 0x3a32, 0x2fdf, 0x3a72, 0x38c7, 0x3580, 0x3769, 0x3be7, 0x32fb, 0x32b0, 0x3b73, 0x3b3c, 0x38f6, 0x38f5, 0x25a2, 0x3856, 0x3a23, 0x2d10, 0x356f, 0x38d6, 0x3ae4, 0x328c, 0x3913, 0x3a39, 0x3745, 0x352a, 0x33d2, 0x3ac2, 0x3874, 0x3b1e, 0x2f5b, 0x3a62, 0x37f1, 0x38c3, 0x3bcc, 0x3334, 0x38b5, 0x3400, 0x3571, 0x38df, 0x3a54, 0x3380, 0x302c, 0x3448, 0x3bb5, 0x3bf5, 0x31b6, 0x3aca, 0x3b8d, 0x3b8e, 0x3a8e, 0x3390, 0x3b14, 0x2e8e, 0x3855, 0x3956, 0x34fd, 0x2cfa, 0x32cf, 0x3a1c, 0x3632, 0x373a, 0x38d4, +0x3869, 0x3b46, 0x3445, 0x381d, 0x339b, 0x3a0a, 0x347e, 0x3b30, 0x38ed, 0x3138, 0x2bbd, 0x3a6d, 0x3b82, 0x383a, 0x2592, 0x39b7, 0x23ea, 0x3962, 0x3a77, 0x3b68, 0x3877, 0x312b, 0x387a, 0x3167, 0x3149, 0x383e, 0x3806, 0x3b3b, 0x31db, 0x38ce, 0x34e8, 0x2856, 0x3666, 0x3a6e, 0x36ee, 0x32b9, 0x3569, 0x3b2e, 0x3b41, 0x390d, 0x356e, 0x39fb, 0x3b59, 0x2e2e, 0x36b2, 0x3a09, 0x2e8d, 0x3616, 0x3906, 0x360a, 0x3a22, 0x2ace, 0x3bd9, 0x309a, 0x33c5, 0x2c68, 0x315d, 0x3beb, 0x39a6, 0x36d2, 0x36d0, 0x300e, 0x3950, 0x35f2, +0x3ac7, 0x2ee6, 0x30ac, 0x38e3, 0x33a2, 0x30f1, 0x2cb9, 0x30c2, 0x350e, 0x3781, 0x39f2, 0x39f4, 0x3081, 0x357f, 0x354a, 0x3496, 0x39ad, 0x37d6, 0x38d9, 0x3477, 0x26fd, 0x341c, 0x34a6, 0x2e76, 0x3a8c, 0x37ff, 0x31b3, 0x3bce, 0x3855, 0x39e7, 0x32e1, 0x382f, 0x2e07, 0x37cc, 0x397a, 0x3985, 0x367a, 0x3b66, 0x3bc8, 0x2fea, 0x32c7, 0x3a73, 0x34b8, 0x3a30, 0x3830, 0x3904, 0x3855, 0x2bde, 0x3598, 0x29f7, 0x3a60, 0x39b9, 0x33c1, 0x3b82, 0x38fb, 0x37ce, 0x2cc0, 0x3117, 0x3928, 0x3243, 0x2c2a, 0x38bc, 0x35b4, 0x3946, +0x38b8, 0x3403, 0x3862, 0x3a80, 0x36c2, 0x3ad4, 0x38c5, 0x3631, 0x3a1a, 0x387a, 0x3308, 0x3099, 0x3834, 0x35af, 0x2eb7, 0x3473, 0x31a8, 0x3795, 0x3a31, 0x3be6, 0x3858, 0x27e9, 0x36ba, 0x3109, 0x3916, 0x372d, 0x357c, 0x32ac, 0x37d7, 0x3654, 0x37c1, 0x383f, 0x3368, 0x350d, 0x3b3e, 0x3af4, 0x35a9, 0x3514, 0x3a3c, 0x36a3, 0x3bb3, 0x3ba2, 0x33b3, 0x398e, 0x3593, 0x32b4, 0x3bef, 0x34d9, 0x3bad, 0x39a9, 0x15e1, 0x3b2c, 0x3b74, 0x3824, 0x3893, 0x35bd, 0x3b68, 0x32ca, 0x3ace, 0x3a27, 0x341f, 0x3a95, 0x3397, 0x3585, +0x2a43, 0x348f, 0x3b93, 0x3a55, 0x38d0, 0x39d9, 0x342a, 0x3252, 0x30e5, 0x24f6, 0x34ef, 0x38f4, 0x35af, 0x2fbf, 0x2f85, 0x2cf8, 0x29a9, 0x360d, 0x3a3d, 0x319a, 0x2cf9, 0x3acf, 0x38c5, 0x3761, 0x35d5, 0x2e99, 0x328d, 0x38fb, 0x3aef, 0x39cd, 0x2f04, 0x3516, 0x395d, 0x34bd, 0x326c, 0x399e, 0x2a6f, 0x3a69, 0x3343, 0x3a7f, 0x34c3, 0x39de, 0x3b7b, 0x3968, 0x3900, 0x35e6, 0x3a88, 0x3498, 0x370d, 0x2cb7, 0x3825, 0x3b08, 0x3b62, 0x383d, 0x34f7, 0x35e5, 0x2dac, 0x37c3, 0x3041, 0x2e34, 0x2d89, 0x315c, 0x3b17, 0x366b, +0x393f, 0x3a05, 0x2577, 0x3468, 0x3aee, 0x39d2, 0x3adb, 0x38e7, 0x2695, 0x39df, 0x30b8, 0x3667, 0x34fc, 0x3157, 0x371c, 0x34b0, 0x38a7, 0x374c, 0x3413, 0x37b4, 0x391b, 0x2ee9, 0x3899, 0x3adc, 0x308b, 0x2cff, 0x35b9, 0x37ff, 0x3967, 0x36bd, 0x3185, 0x3be4, 0x394b, 0x33eb, 0x3879, 0x3ad9, 0x31a5, 0x38c0, 0x343e, 0x362e, 0x3b6e, 0x2bad, 0x39fa, 0x3a43, 0x3933, 0x3b78, 0x35d5, 0x3625, 0x371a, 0x3a9f, 0x3b94, 0x3665, 0x3915, 0x3895, 0x3522, 0x3897, 0x38c0, 0x3738, 0x3115, 0x36b4, 0x3778, 0x38c1, 0x2e5c, 0x244f, +0x3808, 0x372c, 0x3107, 0x3448, 0x3ace, 0x380a, 0x3a17, 0x394a, 0x3afd, 0x3a06, 0x2ccb, 0x38d7, 0x320b, 0x327b, 0x308a, 0x3586, 0x2f07, 0x36c8, 0x3a49, 0x39fe, 0x261b, 0x2fd9, 0x2d24, 0x373f, 0x2edf, 0x385b, 0x3b8a, 0x31fa, 0x39c1, 0x3b43, 0x3b07, 0x374a, 0x3ba5, 0x2190, 0x343c, 0x2cac, 0x3634, 0x36a7, 0x3aff, 0x3767, 0x3b8d, 0x3919, 0x315c, 0x3acd, 0x33a4, 0x39af, 0x3b60, 0x3a54, 0x3967, 0x3bfe, 0x34ba, 0x3681, 0x3597, 0x30bf, 0x31db, 0x3709, 0x3550, 0x3a37, 0x34c2, 0x381b, 0x3b4e, 0x2dd2, 0x3bc4, 0x3b1d, +0x393b, 0x3b43, 0x1c81, 0x35e7, 0x3922, 0x38d8, 0x371e, 0x39ea, 0x3995, 0x2ce3, 0x26d7, 0x3547, 0x3803, 0x350a, 0x3142, 0x3a85, 0x3482, 0x3896, 0x38ac, 0x348f, 0x34be, 0x1a12, 0x36be, 0x3973, 0x3a40, 0x3543, 0x20e1, 0x34e7, 0x3567, 0x33db, 0x3108, 0x39a1, 0x3718, 0x36e0, 0x2df2, 0x3953, 0x3434, 0x22a8, 0x3957, 0x26f0, 0x324e, 0x31fc, 0x3673, 0x3355, 0x3979, 0x3a9a, 0x3914, 0x383a, 0x3726, 0x3bfd, 0x37ad, 0x38f1, 0x333a, 0x2dca, 0x35ff, 0x3af8, 0x3aef, 0x3b69, 0x371c, 0x373d, 0x2eb4, 0x36c4, 0x38fc, 0x3852, +0x31b3, 0x3b4b, 0x279c, 0x36d4, 0x397a, 0x3430, 0x347b, 0x3a11, 0x330f, 0x353d, 0x3a3e, 0x395e, 0x3b26, 0x3912, 0x301b, 0x314c, 0x3480, 0x3a2b, 0x2f76, 0x3b15, 0x3914, 0x2df3, 0x38f0, 0x3698, 0x3bcc, 0x3b94, 0x3be8, 0x3478, 0x311f, 0x366b, 0x2693, 0x3a55, 0x2855, 0x3982, 0x3a0c, 0x3b4e, 0x3626, 0x387e, 0x3bac, 0x3ba4, 0x3bcc, 0x3ae6, 0x3a77, 0x3435, 0x2f57, 0x34a8, 0x3410, 0x3531, 0x34a3, 0x3a71, 0x380a, 0x3bb2, 0x1f10, 0x3aa0, 0x3b1c, 0x3984, 0x3937, 0x3bd7, 0x36b1, 0x31c2, 0x338d, 0x26f9, 0x3923, 0x38e8, +0x1b4b, 0x397a, 0x35fd, 0x28e7, 0x36c0, 0x3a1a, 0x394d, 0x38ba, 0x39ef, 0x3795, 0x303a, 0x3110, 0x3a36, 0x30cd, 0x2d48, 0x3a2e, 0x32a9, 0x374a, 0x381d, 0x36dc, 0x39c1, 0x2d15, 0x3ae9, 0x1df9, 0x3bb6, 0x3aec, 0x2b5a, 0x39ed, 0x33ff, 0x3630, 0x3872, 0x35d8, 0x358a, 0x2ca9, 0x3773, 0x38bc, 0x3656, 0x2ffb, 0x3be8, 0x278d, 0x3b4e, 0x39a7, 0x3375, 0x29bc, 0x3946, 0x34ba, 0x2cf9, 0x3629, 0x3aff, 0x33f5, 0x26f2, 0x3a59, 0x2cfc, 0x3210, 0x38ee, 0x361d, 0x3060, 0x374e, 0x344b, 0x3975, 0x31eb, 0x3560, 0x37e6, 0x2a97, +0x36a6, 0x3b65, 0x34a3, 0x35bb, 0x35af, 0x36b6, 0x3757, 0x38fb, 0x396f, 0x3ad4, 0x3962, 0x2b38, 0x39e5, 0x3159, 0x39be, 0x3202, 0x2387, 0x387a, 0x3463, 0x37c4, 0x39ce, 0x34a3, 0x37bd, 0x3ac0, 0x359a, 0x31db, 0x327c, 0x391e, 0x3a9f, 0x36cc, 0x3961, 0x2264, 0x3583, 0x396f, 0x3a9f, 0x2ad9, 0x36ec, 0x32b3, 0x2fd5, 0x397a, 0x352d, 0x343d, 0x3841, 0x3964, 0x39c4, 0x3a81, 0x3acb, 0x34f0, 0x38b4, 0x375a, 0x3a25, 0x3932, 0x393f, 0x3025, 0x397c, 0x3a55, 0x37c6, 0x32f4, 0x3bae, 0x3a48, 0x31cf, 0x38b5, 0x366c, 0x3451, +0x23c6, 0x36a2, 0x38eb, 0x3bde, 0x3318, 0x3667, 0x3b5a, 0x3867, 0x30e6, 0x3256, 0x3499, 0x38b5, 0x2e31, 0x3408, 0x3a30, 0x345a, 0x3a32, 0x3b26, 0x34cd, 0x39c8, 0x34b0, 0x39f6, 0x2cc9, 0x3906, 0x3121, 0x39e8, 0x3b18, 0x3973, 0x31ac, 0x3803, 0x33a5, 0x3034, 0x3940, 0x310e, 0x3a82, 0x21dc, 0x3b7b, 0x388d, 0x3166, 0x3967, 0x35f3, 0x3942, 0x3a4c, 0x380f, 0x3852, 0x37d2, 0x37ad, 0x388c, 0x39b9, 0x34b2, 0x2ca4, 0x382d, 0x3ad5, 0x3662, 0x397d, 0x30b3, 0x2c1c, 0x3447, 0x33a7, 0x30ef, 0x39a6, 0x3bcf, 0x3ac9, 0x3083, +0x387a, 0x3ae9, 0x3acd, 0x38b8, 0x3a8d, 0x32cb, 0x32f3, 0x2f98, 0x3a4d, 0x2846, 0x3bba, 0x3ab7, 0x31c6, 0x2b8e, 0x3188, 0x3b27, 0x3b0a, 0x3abf, 0x3b9e, 0x2d16, 0x34fc, 0x34d9, 0x38f3, 0x389d, 0x3520, 0x323c, 0x3b1b, 0x38d6, 0x3a6c, 0x38d7, 0x352d, 0x3ab7, 0x388d, 0x3b66, 0x35c3, 0x3a06, 0x3ad3, 0x3bd2, 0x395c, 0x3aa0, 0x3903, 0x3bcc, 0x2ff8, 0x3bba, 0x3511, 0x3bf8, 0x352c, 0x3a37, 0x367a, 0x3710, 0x3a4d, 0x30d2, 0x347a, 0x384b, 0x39d2, 0x3455, 0x2eeb, 0x3a46, 0x3a88, 0x3a1c, 0x3a18, 0x3b52, 0x3136, 0x3853, +0x37ac, 0x39dd, 0x372d, 0x352b, 0x3598, 0x344c, 0x3886, 0x3910, 0x3350, 0x3a31, 0x351f, 0x397c, 0x3bb6, 0x3121, 0x397f, 0x36b4, 0x3bd3, 0x3a3f, 0x3b1d, 0x3a22, 0x39df, 0x3bc6, 0x31b6, 0x3a7c, 0x389a, 0x3927, 0x36a9, 0x3694, 0x385a, 0x3611, 0x31cd, 0x309b, 0x3af7, 0x352f, 0x3a81, 0x3894, 0x29ee, 0x3b55, 0x39c6, 0x388a, 0x307e, 0x39d9, 0x2753, 0x3451, 0x34a2, 0x3a16, 0x3672, 0x3466, 0x3078, 0x21c5, 0x307d, 0x3803, 0x35d5, 0x3bed, 0x2e8f, 0x3426, 0x3427, 0x3a78, 0x30e9, 0x39b3, 0x37da, 0x3818, 0x380b, 0x38c9, +0x3ba5, 0x320b, 0x3935, 0x36e4, 0x38ef, 0x3b81, 0x2f22, 0x39ba, 0x3755, 0x3b1c, 0x39cd, 0x386f, 0x2d6e, 0x335b, 0x3aba, 0x3b3f, 0x3b6c, 0x3293, 0x3177, 0x3bd5, 0x309f, 0x343a, 0x2dee, 0x3240, 0x353e, 0x356a, 0x30ed, 0x3b56, 0x3977, 0x343e, 0x32c7, 0x3a75, 0x315b, 0x3015, 0x32fd, 0x363d, 0x3a68, 0x386e, 0x2dc3, 0x34f3, 0x3bfb, 0x398f, 0x37db, 0x3bbc, 0x3015, 0x38a5, 0x21e7, 0x3863, 0x2fca, 0x3152, 0x3acb, 0x390b, 0x3bc2, 0x3a5e, 0x3823, 0x3b36, 0x2c67, 0x3b1c, 0x34cc, 0x1c43, 0x3431, 0x3088, 0x3707, 0x36a9, +0x3bdf, 0x2a64, 0x3891, 0x327a, 0x393c, 0x2971, 0x3304, 0x39b0, 0x3a92, 0x2df5, 0x398e, 0x2ea4, 0x34be, 0x3449, 0x3037, 0x382c, 0x380e, 0x3a44, 0x35d1, 0x3539, 0x39f4, 0x3b7f, 0x2974, 0x3a97, 0x3bdb, 0x3a60, 0x34cf, 0x3641, 0x2e66, 0x1e72, 0x398d, 0x3568, 0x39eb, 0x3b8d, 0x343d, 0x3af4, 0x39bc, 0x35ef, 0x23e5, 0x3826, 0x3841, 0x36fc, 0x342b, 0x30a4, 0x2f48, 0x1165, 0x2842, 0x3059, 0x3811, 0x32fb, 0x3aec, 0x3a8b, 0x2e51, 0x3aeb, 0x385e, 0x2a73, 0x28b8, 0x36df, 0x3453, 0x37f1, 0x2dfb, 0x2bed, 0x3b52, 0x39a6, +0x395a, 0x37b9, 0x3492, 0x3490, 0x34a9, 0x37de, 0x394e, 0x3934, 0x37f4, 0x3909, 0x1ef5, 0x344f, 0x3852, 0x3b64, 0x3a06, 0x2e82, 0x2cd9, 0x31a7, 0x382b, 0x34b7, 0x3a2b, 0x372d, 0x36ba, 0x2932, 0x3b1e, 0x34d7, 0x36ed, 0x38f0, 0x3198, 0x3730, 0x31fa, 0x3439, 0x36a6, 0x3328, 0x38f5, 0x35f6, 0x3997, 0x3246, 0x3958, 0x3542, 0x3890, 0x35b2, 0x387b, 0x364e, 0x391c, 0x3450, 0x199d, 0x382c, 0x2bc0, 0x31bf, 0x3af2, 0x344d, 0x337a, 0x3b3d, 0x3a13, 0x2cc4, 0x3b74, 0x20b2, 0x3821, 0x34db, 0x391f, 0x3867, 0x3867, 0x351a, +0x3920, 0x340d, 0x3918, 0x37dc, 0x395d, 0x344f, 0x398d, 0x3af1, 0x2688, 0x3884, 0x36d1, 0x37d5, 0x3a83, 0x34fc, 0x32ef, 0x32a7, 0x3b70, 0x254c, 0x3255, 0x3ae5, 0x3b20, 0x355d, 0x31a2, 0x35c7, 0x32e5, 0x367a, 0x3a16, 0x3b28, 0x2515, 0x3713, 0x2c86, 0x3461, 0x38e4, 0x39ca, 0x39ae, 0x337d, 0x3a52, 0x3b23, 0x31a8, 0x250b, 0x376c, 0x381e, 0x34c6, 0x39ef, 0x3236, 0x1de2, 0x38c3, 0x330c, 0x3a33, 0x38c8, 0x310c, 0x3716, 0x3762, 0x39b5, 0x3942, 0x37c6, 0x2a62, 0x37e8, 0x348a, 0x345e, 0x331a, 0x3435, 0x39af, 0x38c4, +0x3bb0, 0x39c8, 0x30a1, 0x39ce, 0x3bc5, 0x3654, 0x29c8, 0x31c9, 0x36c8, 0x3b42, 0x3a78, 0x3940, 0x3a71, 0x3516, 0x3bf8, 0x38c3, 0x3b8e, 0x31be, 0x3b8c, 0x2fba, 0x3775, 0x353b, 0x3b07, 0x3a38, 0x383b, 0x3bb5, 0x39aa, 0x35b9, 0x34fe, 0x38e0, 0x2ec4, 0x3599, 0x2f25, 0x3285, 0x319a, 0x29b8, 0x3997, 0x3945, 0x3bab, 0x3bd9, 0x382e, 0x3a0b, 0x3ab9, 0x3b34, 0x39e1, 0x3912, 0x368e, 0x3b3b, 0x3ba9, 0x3ad4, 0x3a09, 0x384d, 0x3be3, 0x2af7, 0x3a54, 0x3be8, 0x3082, 0x3165, 0x32c9, 0x3650, 0x3919, 0x3be0, 0x3728, 0x3b0c, +0x2be8, 0x36a5, 0x3b7d, 0x3898, 0x3884, 0x34a1, 0x3060, 0x379f, 0x3bca, 0x3844, 0x3858, 0x38fa, 0x3062, 0x2c79, 0x3592, 0x3678, 0x396a, 0x2b91, 0x3845, 0x350e, 0x3b4a, 0x341c, 0x34cd, 0x3928, 0x3b92, 0x39da, 0x313f, 0x3577, 0x3a10, 0x39db, 0x382c, 0x3826, 0x31c0, 0x376e, 0x3186, 0x28f4, 0x2e8f, 0x394a, 0x3947, 0x36d7, 0x2522, 0x3449, 0x3802, 0x3b78, 0x34c1, 0x29b0, 0x3705, 0x2e2e, 0x31ed, 0x3aba, 0x3849, 0x3acf, 0x3878, 0x1fe7, 0x2e77, 0x300d, 0x328e, 0x3001, 0x1e21, 0x3a86, 0x38ef, 0x387d, 0x3b80, 0x3995, +0x284d, 0x397e, 0x2fcb, 0x39ca, 0x331c, 0x2c0c, 0x36f1, 0x3a96, 0x3b50, 0x3a75, 0x3763, 0x3a84, 0x3960, 0x2708, 0x3b84, 0x3ade, 0x351d, 0x362e, 0x3bbe, 0x369d, 0x3987, 0x3bbe, 0x3561, 0x2da4, 0x37d4, 0x3abd, 0x38f2, 0x3a62, 0x3862, 0x29a1, 0x3a16, 0x3b7b, 0x36a6, 0x340d, 0x35f9, 0x3a2b, 0x304d, 0x3bf3, 0x3870, 0x3446, 0x3a16, 0x3a41, 0x3564, 0x3aa0, 0x3ab1, 0x394e, 0x35b4, 0x34d9, 0x3a36, 0x3b53, 0x382d, 0x3b15, 0x3651, 0x2f8f, 0x38a6, 0x2e0a, 0x34e5, 0x37f5, 0x2e90, 0x3500, 0x3b11, 0x35e8, 0x2e48, 0x3b35, +0x3884, 0x3807, 0x2f0d, 0x3b1c, 0x3bce, 0x3752, 0x2b0b, 0x33d2, 0x390e, 0x364d, 0x3373, 0x3a2c, 0x3839, 0x3286, 0x2825, 0x333a, 0x3b28, 0x3670, 0x3b28, 0x38fa, 0x3acb, 0x392c, 0x394a, 0x3bb4, 0x3697, 0x2e8a, 0x34a7, 0x38ac, 0x3721, 0x38e7, 0x3ae3, 0x387a, 0x372e, 0x394a, 0x2ff1, 0x3b45, 0x3b28, 0x3a78, 0x3bca, 0x39b5, 0x3882, 0x3225, 0x38aa, 0x3afc, 0x3bba, 0x3335, 0x3b00, 0x31a0, 0x3178, 0x3897, 0x33f6, 0x3b92, 0x3a1f, 0x38f1, 0x3465, 0x333d, 0x3873, 0x3645, 0x3963, 0x3b4d, 0x3458, 0x3a0b, 0x34b5, 0x3830, +0x34e3, 0x398d, 0x3b99, 0x3b94, 0x3402, 0x3a05, 0x3a63, 0x33eb, 0x3651, 0x2f1b, 0x3bb1, 0x3ab8, 0x38d5, 0x35cf, 0x38b4, 0x398e, 0x3bd9, 0x304c, 0x3a0e, 0x39c0, 0x3b38, 0x3170, 0x31f5, 0x3898, 0x3893, 0x329a, 0x364a, 0x3767, 0x3064, 0x3423, 0x3ae4, 0x3b26, 0x3b29, 0x344e, 0x3974, 0x3944, 0x3515, 0x3990, 0x3857, 0x3595, 0x3a48, 0x3862, 0x377e, 0x380e, 0x3526, 0x3b5e, 0x3350, 0x308c, 0x26d3, 0x3a18, 0x3af5, 0x3a8f, 0x38f5, 0x3854, 0x3aa2, 0x3479, 0x383a, 0x211d, 0x34fc, 0x39d9, 0x35a8, 0x3904, 0x3b93, 0x33bd, +0x32c1, 0x320d, 0x3abf, 0x23ff, 0x30f6, 0x360c, 0x35ef, 0x39ed, 0x3b66, 0x3a6f, 0x3021, 0x3a89, 0x354e, 0x3a96, 0x3889, 0x3b4d, 0x3af6, 0x2c6c, 0x3a7f, 0x3aac, 0x32be, 0x3830, 0x3884, 0x39be, 0x38c2, 0x2c1b, 0x39be, 0x3a92, 0x39b1, 0x373d, 0x3b89, 0x3933, 0x2c42, 0x3799, 0x3818, 0x394d, 0x380c, 0x38b9, 0x327d, 0x39cc, 0x36ff, 0x386f, 0x305d, 0x39c9, 0x3b74, 0x3817, 0x3a3d, 0x221a, 0x3ae8, 0x3804, 0x3977, 0x3959, 0x339a, 0x3822, 0x3967, 0x2e0f, 0x2ffe, 0x38b1, 0x3ae5, 0x3042, 0x37c6, 0x3bc8, 0x3913, 0x3b46, +0x3ab4, 0x251a, 0x38ca, 0x3312, 0x3adf, 0x3881, 0x3511, 0x2c81, 0x39ed, 0x2af6, 0x31ff, 0x3953, 0x3884, 0x3886, 0x2d46, 0x3860, 0x3b80, 0x351b, 0x3bd6, 0x34cf, 0x3b2e, 0x3ab5, 0x3889, 0x24ee, 0x292d, 0x3a3c, 0x3522, 0x3956, 0x3627, 0x3437, 0x2ffc, 0x3742, 0x38c9, 0x317e, 0x3866, 0x3a91, 0x38e6, 0x2eae, 0x39a9, 0x33dd, 0x389e, 0x397e, 0x3a4b, 0x3b82, 0x35c6, 0x3baf, 0x34f6, 0x3273, 0x262b, 0x3a22, 0x3bdd, 0x38ce, 0x3893, 0x3ad5, 0x288b, 0x3821, 0x35ae, 0x3857, 0x3754, 0x3a0f, 0x307b, 0x3938, 0x2cb8, 0x36d8, +0x39d8, 0x33ce, 0x3593, 0x3275, 0x38ca, 0x3a55, 0x39de, 0x3219, 0x393c, 0x3be7, 0x30dc, 0x2a0d, 0x302c, 0x352a, 0x3af5, 0x3817, 0x3ba0, 0x3a10, 0x35fa, 0x3552, 0x3820, 0x35c3, 0x381a, 0x3692, 0x3a0a, 0x3510, 0x35be, 0x360e, 0x33cb, 0x3961, 0x3748, 0x383b, 0x39ee, 0x3713, 0x389b, 0x3a0c, 0x38dc, 0x3bcb, 0x35c0, 0x3ac6, 0x3469, 0x3aea, 0x371f, 0x3040, 0x3653, 0x3811, 0x3b65, 0x3a43, 0x3bca, 0x329a, 0x3a68, 0x344a, 0x3b87, 0x24cd, 0x31e4, 0x37f2, 0x3995, 0x36b8, 0x34c5, 0x3844, 0x2b59, 0x36b7, 0x375b, 0x2e4d, +0x3397, 0x1c22, 0x3764, 0x343a, 0x3bb3, 0x365c, 0x343e, 0x381e, 0x3886, 0x370c, 0x386c, 0x35aa, 0x357a, 0x395b, 0x3bf4, 0x37fd, 0x3aae, 0x3b37, 0x35dd, 0x3944, 0x3a71, 0x3832, 0x3a3d, 0x34d8, 0x3a1c, 0x38db, 0x3ab2, 0x3ba3, 0x3255, 0x3886, 0x38b3, 0x316a, 0x3845, 0x33e0, 0x3bf6, 0x390c, 0x3aea, 0x3b84, 0x349c, 0x395d, 0x3bdb, 0x3b01, 0x384e, 0x350f, 0x389f, 0x33c4, 0x2fea, 0x3860, 0x32de, 0x31b9, 0x3ab2, 0x3825, 0x3afd, 0x3901, 0x3bf4, 0x2770, 0x336e, 0x3b99, 0x38d9, 0x3838, 0x3650, 0x398a, 0x3868, 0x2d09 +}; diff --git a/tests/utils/x_input.h b/tests/utils/x_input.h new file mode 100644 index 00000000..586a9ce9 --- /dev/null +++ b/tests/utils/x_input.h @@ -0,0 +1,106 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// Authors: Yvan Tortorella +// + +/* Header file generated by RedMulE Golden Model */ +uint16_t x_inp [6144] = { +0x3bc4, 0x38a8, 0x3af4, 0x3701, 0x3677, 0x310f, 0x3246, 0x3962, 0x390e, 0x3011, 0x395a, 0x3ba5, 0x37a9, 0x33b9, 0x345b, 0x39b9, 0x3a80, 0x389d, 0x3627, 0x397a, 0x3bb4, 0x2de4, 0x3b76, 0x3a79, 0x2cc5, 0x3b89, 0x3b94, 0x3af8, 0x3845, 0x3999, 0x3207, 0x38e2, 0x387f, 0x34e4, 0x3bdb, 0x3b9d, 0x2d95, 0x3822, 0x3b17, 0x38b0, 0x38d2, 0x300f, 0x3b47, 0x3122, 0x3989, 0x3a59, 0x3bf0, 0x3b60, 0x2be0, 0x39c4, 0x260c, 0x3998, 0x39e4, 0x327a, 0x3401, 0x3a19, 0x3922, 0x3759, 0xe48, 0x3500, 0x3560, 0x30a7, 0x3a20, 0x39a9, +0x360b, 0x23aa, 0x38ec, 0x399b, 0x3aea, 0x39f1, 0x3311, 0x398d, 0x386b, 0x35d3, 0x2e37, 0x31e0, 0x3216, 0x2f54, 0x36c8, 0x3a38, 0x33ff, 0x3970, 0x33a8, 0x355f, 0x3171, 0x35c2, 0x320c, 0x3bd0, 0x348a, 0x3bd1, 0x3b6d, 0x364c, 0x3848, 0x3819, 0x3869, 0x3a95, 0x3882, 0x29d3, 0x3272, 0x3146, 0x1ca2, 0x38cb, 0x38d8, 0x3b7b, 0x2e55, 0x3aea, 0x388e, 0x3b73, 0x1e9f, 0x3921, 0x3878, 0x3aba, 0x388f, 0x3724, 0x3b21, 0x3752, 0x2a4a, 0x3802, 0x321d, 0x3a56, 0x3430, 0x38f7, 0x24e9, 0x3a57, 0x39a3, 0x3985, 0x3bcb, 0x3bd9, +0x34ad, 0x3352, 0x3006, 0x39ec, 0x3afb, 0x34eb, 0x34ff, 0x3007, 0x37e5, 0x37ef, 0x3953, 0x3703, 0x3468, 0x39af, 0x3bc4, 0x34ee, 0x3ad4, 0x3b92, 0x362e, 0x3b24, 0x3650, 0x2d18, 0x2f09, 0x33f8, 0x2ee8, 0x3b80, 0x3a24, 0x3512, 0x3bfe, 0x382b, 0x3946, 0x37ad, 0x38df, 0x3a6f, 0x3068, 0x3c00, 0x3a1d, 0x3977, 0x3baa, 0x3776, 0x398a, 0x374a, 0x3180, 0x30a7, 0x3427, 0x307b, 0x301a, 0x3977, 0x3941, 0x35d1, 0x2e44, 0x37ed, 0x3205, 0x38d4, 0x34f9, 0x396c, 0x39f0, 0x39f7, 0x3ae1, 0x3788, 0x3186, 0x3956, 0x3852, 0x3515, +0x3963, 0x3706, 0x3836, 0x2fa5, 0x2e7c, 0x399e, 0x3695, 0x3152, 0x3a61, 0x36e1, 0x2cb5, 0x22ba, 0x3952, 0x249b, 0x39c2, 0x39ce, 0x3aa6, 0x374c, 0x3704, 0x397d, 0x395e, 0x3b34, 0x3ba0, 0x3bbd, 0x3b40, 0x39b3, 0x3917, 0x3a15, 0x35eb, 0x38c7, 0x3451, 0x35f6, 0x3a2f, 0x365d, 0x3a9d, 0x3952, 0x3ae6, 0x3a96, 0x29b1, 0x3a12, 0x3a63, 0x3931, 0x340e, 0x3579, 0x3500, 0x340d, 0x31c5, 0x3ab8, 0x3a99, 0x339a, 0x36df, 0x3494, 0x37af, 0x3938, 0x1a95, 0x3b76, 0x38f2, 0x2ac6, 0x39f4, 0x3b59, 0x36b9, 0x2555, 0x35c2, 0x3969, +0x3475, 0x3473, 0x3b1d, 0x3752, 0x2c50, 0x37e5, 0x35d2, 0x2406, 0x3639, 0x3adc, 0x32e5, 0x3a43, 0x2979, 0x2cd5, 0x37bc, 0x3a9a, 0x3976, 0x3832, 0x3260, 0x2cda, 0x364e, 0x387a, 0x2444, 0x3904, 0x363a, 0x2a47, 0x397e, 0x3629, 0x3b66, 0x34b7, 0x393c, 0x2281, 0x39ad, 0x36ac, 0x2e58, 0x34d0, 0x361d, 0x2acb, 0x3a81, 0x3acf, 0x394c, 0x2497, 0x2679, 0x3a66, 0x34dc, 0x3b93, 0x2cac, 0x3b08, 0x38e5, 0x3826, 0x3a0b, 0x3989, 0x3254, 0x319b, 0x2d3b, 0x39cf, 0x36c0, 0x38b5, 0x31e4, 0x38ad, 0x3b10, 0x3a46, 0x3004, 0x3afb, +0x341f, 0x3ae8, 0x3a72, 0x3ac7, 0x31c8, 0x3795, 0x3400, 0x355b, 0x3974, 0x3090, 0x3870, 0x2e3c, 0x38de, 0x2192, 0x3341, 0x3a27, 0x2be6, 0x1e7b, 0x38de, 0x3049, 0x3b3a, 0x3320, 0x30b3, 0x30dd, 0x3525, 0x357b, 0x3981, 0x3430, 0x3796, 0x3a14, 0x2dae, 0x3857, 0x385f, 0x3aa4, 0x350c, 0x32d4, 0x300a, 0x3a89, 0x3847, 0x38f7, 0x33d8, 0x3755, 0x2bf7, 0x3ab1, 0x3a3b, 0x39fd, 0x30ef, 0x3780, 0x3ba9, 0x31b6, 0x3467, 0x35a8, 0x3aa7, 0x35f9, 0x3a0e, 0x392b, 0x3241, 0x383b, 0x3a98, 0x3af2, 0x39d1, 0x2df0, 0x39af, 0x3715, +0x37c8, 0x345c, 0x3af4, 0x3859, 0x398e, 0x36c8, 0x3685, 0x3b9a, 0x3674, 0x3b11, 0x35a1, 0x39fa, 0x320f, 0x3ada, 0x3220, 0x3a00, 0x39a1, 0x3954, 0x3bfe, 0x36f3, 0x3533, 0x2a58, 0x360b, 0x379b, 0x39c8, 0x3a2a, 0x3070, 0x3bcd, 0x384d, 0x3386, 0x38b7, 0x2cd8, 0x37e5, 0x3b9a, 0x3900, 0x39c7, 0x3849, 0x3a0b, 0x3a58, 0x3bd2, 0x3a57, 0x32e6, 0x365d, 0x2d29, 0x38f3, 0x38ae, 0x3bbf, 0x3459, 0x3580, 0x3547, 0x3546, 0x39dd, 0x2cb5, 0x35fb, 0x37f9, 0x3b83, 0x32e6, 0x3875, 0x33ce, 0x3039, 0x31f5, 0x386e, 0x3aec, 0x3bea, +0x3beb, 0x3bee, 0x3972, 0x3853, 0x28f1, 0x35a0, 0x2d66, 0x343d, 0x39dd, 0x31a7, 0x36f6, 0x2df4, 0x3be1, 0x2bb2, 0x3a34, 0x31f3, 0x3286, 0x363c, 0x3318, 0x33f4, 0x394f, 0x303d, 0x36ae, 0x3579, 0x3830, 0x33fe, 0x39b3, 0x3ae0, 0x3b94, 0x3410, 0x1846, 0x2f50, 0x3ad9, 0x29b4, 0x3b2d, 0x358a, 0x3ba5, 0x3b45, 0x2822, 0x3b0e, 0x2f3c, 0x2f5d, 0x34d2, 0x3adc, 0x391c, 0x3a3d, 0x3143, 0x3af8, 0x38f1, 0x3b05, 0x35b0, 0x3be6, 0x3a75, 0x3afd, 0x3a17, 0x342a, 0x34df, 0x3bc3, 0x3958, 0x38c9, 0x3a07, 0x3386, 0x30b5, 0x37c7, +0x3191, 0x39e8, 0x2e86, 0x3b1b, 0x3bf4, 0x2aa1, 0x25c7, 0x34e8, 0x3afe, 0x3a1a, 0x3aa7, 0x3a34, 0x2e88, 0x2f09, 0x34f4, 0x3a41, 0x37b3, 0x3845, 0x39fc, 0x3845, 0x3a78, 0x3a8c, 0x3a25, 0x3ac7, 0x360c, 0x3992, 0x38ac, 0x3984, 0x390c, 0x383b, 0x3361, 0x3b1f, 0x322f, 0x3acf, 0x377c, 0x3aff, 0x392b, 0x384b, 0x303f, 0x3a2c, 0x3975, 0x386f, 0x366a, 0x38b3, 0x3504, 0x3bb3, 0x3403, 0x2acd, 0x3bac, 0x31f8, 0x390d, 0x35b6, 0x38f7, 0x293a, 0x368c, 0x384f, 0x3b65, 0x38c9, 0x3736, 0x38c1, 0x3af3, 0x3950, 0x2d07, 0x3486, +0x397b, 0x3bdd, 0x3beb, 0x3bcb, 0x33e6, 0x320f, 0x3a6c, 0x2edd, 0x3765, 0x3976, 0x387e, 0x3aa5, 0x2edd, 0x3b15, 0x2ca9, 0x3ae3, 0x33a2, 0x34fe, 0x3ae7, 0x3895, 0x38d4, 0x2927, 0x3b84, 0x3964, 0x3224, 0x298a, 0x3560, 0x2aef, 0x38fc, 0x3826, 0x3ad0, 0x3bf3, 0x3bc7, 0x3604, 0x3729, 0x37b9, 0x385e, 0x2962, 0x3598, 0x3118, 0x3a34, 0x3990, 0x2c5a, 0x3684, 0x31f8, 0x3a3a, 0x3900, 0x367a, 0x3afb, 0x364e, 0x3857, 0x3886, 0x3339, 0x3875, 0x3bed, 0x3569, 0x35b4, 0x3879, 0x34e4, 0x3a0e, 0x3836, 0x3a15, 0x36b3, 0x33c8, +0x29ce, 0x3774, 0x2c8b, 0x35d1, 0x39f0, 0x3b59, 0x2f54, 0x3b66, 0x2ba4, 0x38b9, 0x39a0, 0x383c, 0x39fb, 0x3458, 0x2c62, 0x3a07, 0x3b25, 0x344c, 0x387d, 0x383a, 0x38f9, 0x2e96, 0x38cf, 0x3539, 0x30b7, 0x3b0c, 0x3472, 0x34ec, 0x2c32, 0x3ae0, 0x39d9, 0x3875, 0x3b85, 0x3bc7, 0x3bfe, 0x3079, 0x3b26, 0x3521, 0x38cb, 0x3285, 0x3589, 0x39d2, 0x3aae, 0x3b7b, 0x3808, 0x3a3e, 0x238e, 0x3882, 0x3af6, 0x2c22, 0x3873, 0x3992, 0x3b01, 0x34a6, 0x3a2f, 0x3b23, 0x2e9c, 0x2656, 0x3614, 0x3590, 0x3572, 0x378d, 0x38f1, 0x3271, +0x36b3, 0x3896, 0x2f55, 0x2ab4, 0x37eb, 0x39ca, 0x381d, 0x3594, 0x3432, 0x3b6b, 0x37e0, 0x372f, 0x3b3f, 0x392a, 0x39ed, 0x35fc, 0x3938, 0x3b51, 0x3b37, 0x33dc, 0x38d6, 0x30d8, 0x330b, 0x3b61, 0x3a8f, 0x3aa3, 0x3adb, 0x3ae7, 0x3359, 0x39e1, 0x2c94, 0x3093, 0x38e9, 0x3b42, 0x390d, 0x3b01, 0x3a8c, 0x3886, 0x3b4d, 0x3a30, 0x30d4, 0x33a8, 0x3498, 0x35a2, 0x3b02, 0x3573, 0x345f, 0x35a2, 0x3181, 0x212d, 0x34bf, 0x396c, 0x19e4, 0x3992, 0x38fa, 0x3af9, 0x2e49, 0x3a1c, 0x27b3, 0x3777, 0x3868, 0x320c, 0x340e, 0x3028, +0x39e9, 0x3832, 0x391f, 0x372b, 0x363f, 0x3aa8, 0x39a0, 0x3637, 0x2ba4, 0x3810, 0x3bef, 0x3ae1, 0x397f, 0x3521, 0x3b71, 0x30ca, 0x2478, 0x2b91, 0x39ed, 0x38ea, 0x31ed, 0x3b37, 0x3a7a, 0x3a2f, 0x387e, 0x367c, 0x39d0, 0x3a52, 0x36ab, 0x39ad, 0x3976, 0x3b80, 0x3b6b, 0x35f6, 0x3bf9, 0x3171, 0x3977, 0x3b37, 0x28e7, 0x3403, 0x34fd, 0x3889, 0x35d4, 0x2686, 0x3b82, 0x3455, 0x3041, 0x389f, 0x3ac9, 0x34b1, 0x3576, 0x3a6e, 0x3495, 0x31f8, 0x3a90, 0x3a77, 0x3a00, 0x38ba, 0x34a0, 0x3a5a, 0x354a, 0x39da, 0x39a9, 0x302e, +0x3bcd, 0x328d, 0x2c1c, 0x3b9d, 0x3bad, 0x399a, 0x35be, 0x3b2a, 0x36f8, 0x332d, 0x39ef, 0x3b78, 0x36a5, 0x30d8, 0x3b69, 0x2fe0, 0x3a22, 0x3a87, 0x332f, 0x39d5, 0x34da, 0x3023, 0x26b2, 0x3712, 0x3976, 0x3bae, 0x39ee, 0x36aa, 0x3783, 0x34ca, 0x1dda, 0x3a22, 0x35b9, 0x3688, 0x3a33, 0x389f, 0x377b, 0x3908, 0x3262, 0x3844, 0x30c5, 0x352e, 0x2889, 0x3b4a, 0x36b4, 0x3b8c, 0x316f, 0x3892, 0x3281, 0x3bcb, 0x304f, 0x395b, 0x3bff, 0x3af7, 0x38a6, 0x313f, 0x3965, 0x3a2f, 0x372c, 0x390b, 0x2ccf, 0x3a3c, 0x3bfb, 0x3932, +0x3ab8, 0x33bf, 0x3b6a, 0x370f, 0x33a2, 0x2b19, 0x2f7e, 0x3558, 0x38b6, 0x3a17, 0x3306, 0x37dd, 0x3a84, 0x2c33, 0x3b3b, 0x2e32, 0x2d2b, 0x389b, 0x378a, 0x3667, 0x31f5, 0x3823, 0x395a, 0x3a40, 0x3004, 0x390c, 0x398c, 0x37c4, 0x3497, 0x394a, 0x3af6, 0x3729, 0x2a73, 0x3881, 0x3227, 0x39c6, 0x379f, 0x3b06, 0x287f, 0x3aff, 0x3bdb, 0x38cc, 0x36e7, 0x31c6, 0x3b4c, 0x2994, 0x3873, 0x36f2, 0x3b4f, 0x3266, 0x3acb, 0x3339, 0x36e8, 0x38a9, 0x38cd, 0x3144, 0x39d8, 0x39f0, 0x301f, 0x3a70, 0x34ac, 0x364e, 0x3489, 0x3af8, +0x3886, 0x2fa4, 0x3b96, 0x388b, 0x389c, 0x363c, 0x3905, 0x32d5, 0x39c9, 0x3be6, 0x2dbd, 0x34c0, 0x3b00, 0x3a39, 0x3044, 0x2561, 0x349c, 0x3b97, 0x3855, 0x387e, 0x3a7d, 0x22e5, 0x393f, 0x34a5, 0x3ae2, 0x2e0c, 0x3b44, 0x3a1b, 0x39b2, 0x3836, 0x2ea4, 0x3936, 0x36be, 0x308e, 0x3907, 0x3b3e, 0x2828, 0x377d, 0x3bfd, 0x2eb0, 0x327c, 0x2293, 0x2f1d, 0x37a7, 0x39e9, 0x347c, 0x3b6f, 0x3ac4, 0x3422, 0x349e, 0x3a60, 0x3884, 0x3ae3, 0x3a81, 0x3b1f, 0x285b, 0x3494, 0x35a2, 0x31f5, 0x3ad3, 0x3834, 0x3ae7, 0x3bfa, 0x3678, +0x373f, 0x3739, 0x3afd, 0x347f, 0x38d8, 0x3a1d, 0x39c9, 0x3644, 0x3909, 0x307a, 0x3827, 0x3ae1, 0x38a0, 0x3ac1, 0x3bac, 0x3b31, 0x3a58, 0x217b, 0x3a9d, 0x3519, 0x3893, 0x3a17, 0x38aa, 0x3334, 0x3515, 0x3784, 0x3bbe, 0x3b54, 0x38de, 0x36bc, 0x31ab, 0x3acb, 0x3a5c, 0x3934, 0x3457, 0x2724, 0x39d0, 0x332c, 0x38ce, 0x3b4d, 0x391a, 0x354c, 0x3741, 0x2be2, 0x39e1, 0x3ad4, 0x3bf9, 0x2c7d, 0x2cfb, 0x3186, 0x2e4a, 0x3647, 0x3729, 0x37fe, 0x34e9, 0x3753, 0x39e2, 0x2c12, 0x3216, 0x3825, 0x341b, 0x271c, 0x36b3, 0x3bd8, +0x38bf, 0x3856, 0x39c0, 0x3b60, 0x3755, 0x3bd8, 0x3a87, 0x2cde, 0x37fd, 0x36f4, 0x3859, 0x38ff, 0x34f2, 0x302b, 0x3a1a, 0x31c6, 0x3998, 0x3ac2, 0x3872, 0x3b87, 0x352a, 0x39d2, 0x38a9, 0x3bc1, 0x3b63, 0x38fc, 0x3132, 0x3bb9, 0x3bcf, 0x2c64, 0x34f7, 0x3967, 0x2d54, 0x3a1f, 0x3466, 0x2c70, 0x3913, 0x3b00, 0x38d5, 0x3b0c, 0x2d8c, 0x32cf, 0x3201, 0x3b98, 0x3bc7, 0x2e2b, 0x2b75, 0x3b70, 0x338a, 0x3897, 0x34ec, 0x3b71, 0x3b2e, 0x3832, 0x2ea1, 0x3a9d, 0x354d, 0x3266, 0x3445, 0x3487, 0x3bbb, 0x3bdb, 0x3727, 0x39a3, +0x331b, 0x3bd7, 0x3bd5, 0x378e, 0x3319, 0x2c10, 0x2bd6, 0x3b36, 0x2dbd, 0x2aaf, 0x3155, 0x2da3, 0x288a, 0x36e2, 0x3ab6, 0x3a38, 0x3653, 0x3916, 0x3880, 0x3aaa, 0x2e8c, 0x37cd, 0x38b1, 0x3588, 0x382a, 0x3a6e, 0x3551, 0x39d5, 0x2b49, 0x3bb0, 0x3ba3, 0x38a1, 0x38b0, 0x345c, 0x303c, 0x33e5, 0x31f6, 0x396b, 0x2ef3, 0x3bc1, 0x356f, 0x3467, 0x3b2e, 0x39db, 0x3635, 0x2980, 0x3b5f, 0x3443, 0x387d, 0x3948, 0x3a84, 0x3127, 0x399e, 0x35c8, 0x3b22, 0x3696, 0x336c, 0x3acc, 0x38c1, 0x34b5, 0x3039, 0x36ac, 0x3a92, 0x3a3b, +0x370c, 0x3297, 0x39af, 0x2f5f, 0x3854, 0x3b42, 0x3a92, 0x3002, 0x3a9a, 0x365c, 0x3110, 0x2c8d, 0x3b95, 0x3ba7, 0x3bb4, 0x339f, 0x3982, 0x3b30, 0x30e2, 0x34b3, 0x38c5, 0x34f0, 0x2c49, 0x2bed, 0x33e1, 0x3571, 0x3a9c, 0x38fa, 0x3b36, 0x39ca, 0x3890, 0x2f8a, 0x3a92, 0x33fb, 0x2e28, 0x38fb, 0x381d, 0x34c9, 0x2a9c, 0x3754, 0x395d, 0x3821, 0x2b53, 0x1f32, 0x39d6, 0x3a4a, 0x3967, 0x3962, 0x343d, 0x3718, 0x3448, 0x32b2, 0x32f5, 0x3a8e, 0x3adb, 0x3a95, 0x30de, 0x22a1, 0x331c, 0x341d, 0x272b, 0x302a, 0x30f3, 0x305c, +0x3b8d, 0x39fa, 0x2f48, 0x395a, 0x37bf, 0x3767, 0x36cb, 0x39f8, 0x395b, 0x399e, 0x39bd, 0x3a3f, 0x3bc8, 0x3bd8, 0x360c, 0x3b70, 0x3b7a, 0x3be9, 0x35ed, 0x361f, 0x303f, 0x3afd, 0x3452, 0x3ab3, 0x348a, 0x3760, 0x3628, 0x392a, 0x3039, 0x33c8, 0x2af5, 0x389f, 0x34b2, 0x2497, 0x3ae0, 0x35a9, 0x3759, 0x3a13, 0x383c, 0x38e7, 0x3232, 0x2d3c, 0x3aae, 0x3211, 0x397e, 0x374c, 0x3060, 0x2d74, 0x29b5, 0x3937, 0x2ed0, 0x3a76, 0x3acc, 0x3658, 0x372c, 0x34c8, 0x3aab, 0x36c6, 0x32ee, 0x3a0d, 0x2ddc, 0x3730, 0x38ee, 0x2841, +0x317f, 0x360d, 0x3a2a, 0x388a, 0x3b33, 0x30e3, 0x3b9e, 0x3a6b, 0x345c, 0x36ae, 0x3b1e, 0x3107, 0x347f, 0x3b7d, 0x38d7, 0x3815, 0x3a0b, 0x36e9, 0x3bbc, 0x3124, 0x3b17, 0x390d, 0x286a, 0x3625, 0x383a, 0x2813, 0x3aed, 0x365a, 0x1e11, 0x3be7, 0x34cf, 0x3a56, 0x3856, 0x3af5, 0x39ff, 0x383d, 0x33b8, 0x3a9a, 0x36f4, 0x2df6, 0x3b48, 0x2fd6, 0x2a61, 0x3675, 0x2e35, 0x3a43, 0x3a57, 0x352b, 0x30b7, 0x2d22, 0x3768, 0x347f, 0x3874, 0x3b90, 0x30c4, 0x3a13, 0x3293, 0x2c06, 0x2293, 0x3414, 0x35d9, 0x3b43, 0x3154, 0x27b4, +0x3a09, 0x39d8, 0x366d, 0x3a02, 0x37fa, 0x3306, 0x3837, 0x37ee, 0x30e8, 0x3a91, 0x388d, 0x3933, 0x39c7, 0x30ef, 0x3962, 0x36bb, 0x2961, 0x3868, 0x34c5, 0x3a6c, 0x30ab, 0x34b9, 0x3bab, 0x39e1, 0x3669, 0x338c, 0x32fc, 0x39b4, 0x37f3, 0x39ba, 0x3619, 0x2e01, 0x3901, 0x331d, 0x366f, 0x3c00, 0x3718, 0x389e, 0x38b9, 0x2c69, 0x3839, 0x3abc, 0x388a, 0x3a02, 0x36cf, 0x3ad6, 0x3bbd, 0x35a5, 0x3b33, 0x3827, 0x368d, 0x3abf, 0x3968, 0x359c, 0x307f, 0x31b2, 0x38e7, 0x3b34, 0x3a6b, 0x38aa, 0x386e, 0x3973, 0x3623, 0x3503, +0x3660, 0x345b, 0x3978, 0x3ba2, 0x338f, 0x3a8c, 0x32fa, 0x26ff, 0x3bca, 0x3baf, 0x388a, 0x3b02, 0x3818, 0x3856, 0x37a9, 0x28d4, 0x311b, 0x3a90, 0x27ba, 0x3b29, 0x3693, 0x3211, 0x2fe8, 0x341c, 0x2d6c, 0x30cf, 0x3a46, 0x3a6a, 0x36e5, 0x3a30, 0x3804, 0x32af, 0x3b29, 0x1168, 0x3a46, 0x382e, 0x3117, 0x3a01, 0x3b4a, 0x2dfd, 0x3b41, 0x3a63, 0x36d3, 0x3b8e, 0x3be4, 0x27c8, 0x35de, 0x3ae8, 0x304f, 0x3894, 0x3641, 0x33bb, 0x2edd, 0x32e6, 0x39f2, 0x3820, 0x3944, 0x2f14, 0x3864, 0x3ac4, 0x3ad8, 0x34d9, 0x38de, 0x3561, +0x3a28, 0x372c, 0x3950, 0x3837, 0x3472, 0x3aec, 0x3a2c, 0x38e1, 0x3a27, 0x359d, 0x2f52, 0x35f9, 0x361d, 0x35fb, 0x3bda, 0x3655, 0x359c, 0x2ef6, 0x3b96, 0x2c41, 0x3816, 0x35f9, 0x3857, 0x1c3b, 0x3aa6, 0x3a08, 0x365d, 0x3406, 0x3544, 0x3b6a, 0x386e, 0x3bf3, 0x3526, 0x36a1, 0x2f31, 0x380a, 0x372f, 0x357a, 0x3a3c, 0x2d45, 0x35fd, 0x1ac3, 0x385d, 0x31f4, 0x2a80, 0x3853, 0x3b32, 0x3991, 0x3b13, 0x36f7, 0x3aa6, 0x38c7, 0x3122, 0x3a49, 0x26c8, 0x39f2, 0x2cb5, 0x3872, 0x3b75, 0x37ff, 0x2e43, 0x2647, 0x3b15, 0x3a4e, +0x36dd, 0x3925, 0x24fb, 0x30ed, 0x31ed, 0x337a, 0x33ca, 0x3139, 0x3a8d, 0x3b21, 0x3aee, 0x3a2b, 0x3351, 0x3a13, 0x3693, 0x3a21, 0x3979, 0x31ab, 0x345d, 0x3994, 0x3b48, 0x380b, 0x3b13, 0x3993, 0x386c, 0x3751, 0x39bc, 0x3114, 0x2cd9, 0x2f90, 0x3bf5, 0x2fff, 0x37ef, 0x3562, 0x3acf, 0x3aeb, 0x3bc4, 0x3406, 0x297f, 0x3b75, 0x3ac7, 0x3a33, 0x395b, 0x15ab, 0x384f, 0x3877, 0x31b5, 0x3bd3, 0x3a7c, 0x3850, 0x3535, 0x3690, 0x3880, 0x38b9, 0x3555, 0x3ada, 0x3beb, 0x3bcb, 0x30cf, 0x32ec, 0x3181, 0x3a79, 0x3b65, 0x383c, +0x370d, 0x3b64, 0x3b26, 0x2ea8, 0x3a5e, 0x3474, 0x34b3, 0x3aa3, 0x2e62, 0x3b3c, 0x395d, 0x3a0c, 0x3788, 0x3254, 0x3160, 0x34d5, 0x39c3, 0x39a1, 0x38ef, 0x2e85, 0x3923, 0x39ec, 0x38da, 0x397b, 0x38d8, 0x3919, 0x3a6c, 0x2aa3, 0x3acc, 0x346a, 0x36d0, 0x3b5b, 0x3202, 0x3af3, 0x3713, 0x2262, 0x2c8f, 0x34cc, 0x30b5, 0x344b, 0x3a48, 0x3855, 0x33d1, 0x3972, 0x3ab2, 0x363d, 0x382f, 0x30ed, 0x3a54, 0x39be, 0x381f, 0x3443, 0x3952, 0x37d9, 0x3a56, 0x3bd8, 0x2cae, 0x3617, 0x27f2, 0x3a59, 0x3ab2, 0x30db, 0x358a, 0x394e, +0x3731, 0x34e7, 0x33c2, 0x340e, 0x3b5d, 0x3be3, 0x3800, 0x3818, 0x3394, 0x32e8, 0x37d6, 0x342e, 0x3a47, 0x33bc, 0x39fe, 0x3b3d, 0x3834, 0x3034, 0x33dc, 0x2dbd, 0x3524, 0x3b68, 0x319e, 0x3551, 0x3a33, 0x3927, 0x3889, 0x3a3d, 0x35fe, 0x384d, 0x3607, 0x3246, 0x39f4, 0x3230, 0x3baa, 0x3023, 0x3be2, 0x270e, 0x3904, 0x3875, 0x318b, 0x3485, 0x2af3, 0x39ac, 0x3a5d, 0x386a, 0x3861, 0x34a1, 0x3a3c, 0x3bd2, 0x37d6, 0x234f, 0x3535, 0x2d10, 0x30ec, 0x3391, 0x3490, 0x3665, 0x3b33, 0x2cae, 0x3b86, 0x3a77, 0x3a6d, 0x2606, +0x3b3e, 0x3678, 0x3994, 0x3670, 0x284d, 0x338a, 0x363c, 0x38b7, 0x1eb8, 0x392f, 0x3b20, 0x342f, 0x3b77, 0x385e, 0x3867, 0x3a83, 0x3a5e, 0x30f7, 0x3580, 0x3773, 0x3831, 0x3b4c, 0x397d, 0x3b67, 0x3756, 0x385d, 0x3019, 0x38f7, 0x3834, 0x3262, 0x3ae0, 0x3bc3, 0x25d9, 0x3421, 0x3b51, 0x3935, 0x2e27, 0x34fe, 0x3bb4, 0x2882, 0x39fd, 0x36d1, 0x29e4, 0x32fb, 0x3937, 0x36a9, 0x375c, 0x3a0d, 0x3826, 0x3b2b, 0x332f, 0x3a92, 0x328f, 0x365d, 0x376c, 0x38e2, 0x3b2c, 0x348c, 0x312a, 0x2c9b, 0x3a6c, 0x3b0c, 0x358e, 0x3a26, +0x3b0e, 0x2fcb, 0x3360, 0x325b, 0x35ee, 0x360b, 0x3b5f, 0x3598, 0x31c8, 0x3ad2, 0x398a, 0x2c7f, 0x2bdf, 0x37ef, 0x3933, 0x3840, 0x36fb, 0x37d2, 0x3631, 0x3932, 0x3423, 0x3b0a, 0x3736, 0x2fce, 0x3462, 0x3a7c, 0x3446, 0x324c, 0x36e7, 0x2c2b, 0x35d9, 0x372d, 0x329d, 0x3900, 0x313d, 0x3be1, 0x39fc, 0x3969, 0x3bcf, 0x3bcb, 0x3883, 0x31e7, 0x3009, 0x380b, 0x3a4a, 0x2641, 0x3868, 0x390d, 0x373e, 0x3954, 0x3664, 0x3226, 0x3a82, 0x3a1b, 0x34d8, 0x2a59, 0x3457, 0x31bd, 0x35b9, 0x32a3, 0x38d9, 0x39d8, 0x2484, 0x31f4, +0x3734, 0x3a15, 0x38e2, 0x35b1, 0x397a, 0x31f2, 0x3669, 0x3502, 0x2e64, 0x3bd7, 0x3bf4, 0x3b39, 0x3774, 0x3809, 0x34b3, 0x3a3d, 0x364c, 0x3658, 0x388d, 0x3a5f, 0x386e, 0x39ba, 0x3917, 0x385b, 0x3990, 0x3782, 0x399a, 0x3077, 0x3932, 0x3765, 0x3484, 0x3ba4, 0x3111, 0x3ae7, 0x384a, 0x38ed, 0x3921, 0x2e50, 0x3af8, 0x2c79, 0x3967, 0x35c2, 0x3257, 0x3355, 0x3512, 0x3b09, 0x3a2b, 0x38db, 0x3282, 0x39b2, 0x3a11, 0x3b5b, 0x3124, 0x3072, 0x2581, 0x37c1, 0x3868, 0x388a, 0x3b1f, 0x3867, 0x304a, 0x391c, 0x3a69, 0x3496, +0x3ad3, 0x3ad8, 0x3b55, 0x3540, 0x3a99, 0x2fcb, 0x3a50, 0x3a9b, 0x2c06, 0x3547, 0x3841, 0x338d, 0x27bd, 0x2fdc, 0x3a40, 0x39ab, 0x305e, 0x3816, 0x3b18, 0x2c0f, 0x3ac2, 0x3b9a, 0x36e3, 0x3912, 0x38f0, 0x3b5a, 0x3583, 0x3a2f, 0x3805, 0x381c, 0x389b, 0x39bc, 0x3939, 0x3062, 0x3981, 0x39c5, 0x2fe2, 0x3a83, 0x2fd7, 0x399e, 0x309d, 0x3bd9, 0x3847, 0x37cb, 0x3855, 0x2e0c, 0x385f, 0x3a90, 0x3837, 0x3569, 0x39a7, 0x35cf, 0x3aab, 0x3998, 0x3903, 0x3857, 0x3a05, 0x3b11, 0x35dc, 0x31ef, 0x36d3, 0x3a6b, 0x39cd, 0x316e, +0x2a9b, 0x3522, 0x3a61, 0x3948, 0x32aa, 0x3940, 0x35b2, 0x38b8, 0x25c7, 0x38e3, 0x38c3, 0x3592, 0x26ee, 0x37c4, 0x3064, 0x3a9f, 0x36f9, 0x3669, 0x36b9, 0x2d38, 0x38bc, 0x361b, 0x3b45, 0x3a97, 0x3964, 0x3157, 0x26c0, 0x3bd1, 0x27a7, 0x2bcd, 0x3455, 0x39c8, 0x37cb, 0x2b98, 0x3a97, 0x3773, 0x2efc, 0x307c, 0x3510, 0x3a33, 0x3806, 0x35a2, 0x3b28, 0x38f9, 0x3bc2, 0x36db, 0x3aa1, 0x3ac3, 0x31aa, 0x3a3d, 0x3ac3, 0x3b73, 0x31d5, 0x38f8, 0x303b, 0x3929, 0x38eb, 0x3a91, 0x3885, 0x3a64, 0x36bc, 0x381f, 0x36b3, 0x3846, +0x38d4, 0x3a0a, 0x389f, 0x2c1e, 0x31ca, 0x3934, 0x31b2, 0x378d, 0x2d09, 0x3bed, 0x39ca, 0x3ae0, 0x36a7, 0x2814, 0x391e, 0x3a62, 0x3bca, 0x381c, 0x34b6, 0x38ec, 0x3920, 0x3830, 0x39fc, 0x3911, 0x3a42, 0x3372, 0x375b, 0x312b, 0x3604, 0x2ea4, 0x3367, 0x36fd, 0x2dd9, 0x366c, 0x3054, 0x3749, 0x29ac, 0x37de, 0x39bb, 0x34d5, 0x2e7d, 0x39e9, 0x19c6, 0x3a9a, 0x3bbb, 0x33a5, 0x3556, 0x38a2, 0x3bfb, 0x3b91, 0x39fa, 0x3aaf, 0x38a7, 0x38b6, 0x285c, 0x3820, 0x2ef2, 0x25f9, 0x3ab0, 0x3bc7, 0x3457, 0x352f, 0x38e2, 0x31aa, +0x283d, 0x3728, 0x33fe, 0x2d40, 0x2e06, 0x389f, 0x3b2f, 0x3ad4, 0x39b4, 0x36be, 0x3837, 0x351a, 0x3bb6, 0x3971, 0x3a47, 0x3758, 0x3572, 0x31aa, 0x2825, 0x375c, 0x344f, 0x3b7e, 0x391b, 0x32b3, 0x3119, 0x23d5, 0x305d, 0x361b, 0x380b, 0x28d4, 0x39f8, 0x3bd2, 0x383b, 0x39e9, 0x3a81, 0x214f, 0x31a6, 0x3645, 0x38c1, 0x38e1, 0x32f6, 0x385d, 0x357a, 0x35a7, 0x388a, 0x3ba7, 0x23fb, 0x3853, 0x39db, 0x342d, 0x32fe, 0x3ac4, 0x3b82, 0x3709, 0x35f2, 0x3864, 0x3b71, 0x344f, 0x38be, 0x3b12, 0x34df, 0x34fe, 0x3715, 0x3864, +0x3968, 0x354c, 0x2af1, 0x39d4, 0x3b53, 0x39f3, 0x3776, 0x387f, 0x3711, 0x3b77, 0x3565, 0x3aa9, 0x3a99, 0x35f2, 0x369a, 0x3b29, 0x3811, 0x314b, 0x37f4, 0x3ad5, 0x3753, 0x3ab4, 0x399e, 0x3b00, 0x2dcc, 0x3a9f, 0x3307, 0x34b4, 0x3ad7, 0x38e8, 0x396a, 0x32af, 0x3886, 0x36e6, 0x3429, 0x377d, 0x3212, 0x3afb, 0x257b, 0x3b85, 0x3b80, 0x3b0e, 0x2b3e, 0x3ae1, 0x331a, 0x3890, 0x372d, 0x3425, 0x32eb, 0x35af, 0x3a18, 0x39a0, 0x3908, 0x317a, 0x388b, 0x2eb6, 0x3993, 0x341e, 0x353d, 0x37cc, 0x357d, 0x3ad0, 0x3bee, 0x362e, +0x343a, 0x372b, 0x3a97, 0x3aea, 0x3bfd, 0x3800, 0x34f0, 0x38ad, 0x2e3e, 0x38e7, 0x393e, 0x35a4, 0x382a, 0x37a0, 0x3bc7, 0x391f, 0x3212, 0x3aae, 0x23cf, 0x3683, 0x3983, 0x3361, 0x3995, 0x3a38, 0x36cf, 0x3833, 0x3667, 0x3ac7, 0x3acc, 0x3673, 0x33e3, 0x38de, 0x358d, 0x3ba9, 0x3741, 0x3127, 0x3a48, 0x3b39, 0x34c6, 0x38cb, 0x3474, 0x3be7, 0x214f, 0x2ddc, 0x392c, 0x3589, 0x3836, 0x3920, 0x3be0, 0x3651, 0x35a1, 0x3902, 0x2cf1, 0x3b6a, 0x38ff, 0x2c2a, 0x3b70, 0x372b, 0x3846, 0x3ab3, 0x38c4, 0x3298, 0x38ba, 0x35e2, +0x313f, 0x32a2, 0x3943, 0x34d2, 0x3a36, 0x38a4, 0x3870, 0x3980, 0x3aa3, 0x37e9, 0x37d8, 0x38d4, 0x3a5d, 0x3bfa, 0x39c1, 0x3a2d, 0x3514, 0x3961, 0x3a4e, 0x3b79, 0x1ddb, 0x3977, 0x38a0, 0x3989, 0x3752, 0x302f, 0x3b50, 0x345d, 0x32c4, 0x3ba1, 0x3919, 0x3b79, 0x319b, 0x38ec, 0x39c2, 0x390f, 0x371a, 0x2b0d, 0x2a69, 0x3b72, 0x3b9f, 0x341d, 0x30e6, 0x359a, 0x3867, 0x39bd, 0x36dc, 0x3b62, 0x3154, 0x380b, 0x3476, 0x2c40, 0x3b50, 0x39a0, 0x3190, 0x3a41, 0x2ed9, 0x2eae, 0xcf0, 0x2afe, 0x39a8, 0x36ee, 0x34a0, 0x3a0f, +0x3bf8, 0x3a91, 0x38cd, 0x3a3e, 0x3a26, 0x2528, 0x3ad3, 0x3662, 0x3226, 0x3b2e, 0x332f, 0x323e, 0x394c, 0x3097, 0x2902, 0x3823, 0x293c, 0x37f2, 0x38c9, 0x3400, 0x39e5, 0x333b, 0x39fc, 0x384a, 0x3955, 0x308e, 0x3796, 0x374a, 0x306c, 0x30fa, 0x30ee, 0x1f55, 0x34e7, 0x3875, 0x2bc5, 0x3bfa, 0x3635, 0x38e5, 0x3a70, 0x3b49, 0x3988, 0x3b8c, 0x3a98, 0x3a78, 0x3bfb, 0x3333, 0x3b58, 0x3bd6, 0x3b93, 0x2ef1, 0x3822, 0x34ab, 0x35c6, 0x384a, 0x34db, 0x3a80, 0x2e05, 0x3ac1, 0x3845, 0x2bd9, 0x3896, 0x288b, 0x38b7, 0x3556, +0x3095, 0x2c4e, 0x3502, 0x38d5, 0x2c00, 0x34bb, 0x2d06, 0x3b03, 0x28de, 0x3b8b, 0x362a, 0x3642, 0x3946, 0x3567, 0x3695, 0x39b6, 0x3ae9, 0x3bd9, 0x398d, 0x33e3, 0x381e, 0x3981, 0x3553, 0x35f9, 0x3499, 0x38b5, 0x3866, 0x298e, 0x38dd, 0x3a7b, 0x3559, 0x34e5, 0x3a6a, 0x336f, 0x30f1, 0x35bb, 0x3957, 0x3bf8, 0x3a56, 0x3bb5, 0x3b3a, 0x3767, 0x3828, 0x3700, 0x3bda, 0x388a, 0x391c, 0x3937, 0x3664, 0x382a, 0x37de, 0x2d27, 0x3b6d, 0x3303, 0x3828, 0x3b49, 0x3882, 0x380f, 0x3b93, 0x318a, 0x33bc, 0x3907, 0x2dbe, 0x3883, +0x3511, 0x2feb, 0x3a76, 0x359c, 0x39c5, 0x3967, 0x3177, 0x314e, 0x3ad7, 0x33a3, 0x3ae2, 0x3932, 0x27cb, 0x33da, 0x35ad, 0x2c80, 0x369b, 0x3636, 0xdca, 0x2d01, 0x302c, 0x3950, 0x35d9, 0x3549, 0x3aee, 0x397e, 0x2dfa, 0x3897, 0x30a8, 0x3a71, 0x3a43, 0x3274, 0x2ec3, 0x3bfc, 0x3ac6, 0x3b9d, 0x3b83, 0x3a01, 0x3b46, 0x32be, 0x3647, 0x35c0, 0x3a99, 0x3515, 0x3011, 0x3a99, 0x3832, 0x3737, 0xace, 0x303d, 0x3aec, 0x345e, 0x383f, 0x3a7d, 0x2ec5, 0x39ef, 0x3847, 0x3409, 0x3571, 0x32e0, 0x377d, 0x36d9, 0x3959, 0x2881, +0x32d2, 0x35e3, 0x3ab7, 0x343f, 0x36ee, 0x30d5, 0x3615, 0x31b5, 0x3a0d, 0x378f, 0x2bbd, 0x28e1, 0x37be, 0x3ad5, 0x261b, 0x3b86, 0x3470, 0x2f2e, 0x3b44, 0x39a7, 0x3606, 0x38db, 0x3579, 0x3bcd, 0x3291, 0x381c, 0x34f3, 0x39f2, 0x39c1, 0x39e7, 0x39b3, 0x3667, 0x3001, 0x1483, 0x3888, 0x3962, 0x3719, 0x393f, 0x3a52, 0x37a4, 0x39f1, 0x3b7d, 0x392d, 0x35d8, 0x3b07, 0x3bd5, 0x3946, 0x3a2a, 0x2f68, 0x2e11, 0x3771, 0x384f, 0x3612, 0x3bbf, 0x396a, 0x3585, 0x35df, 0x2dc9, 0x3a61, 0x3481, 0x399d, 0x37c4, 0x2fa8, 0x39eb, +0x2991, 0x2f7a, 0x3adf, 0x3b3d, 0x2f02, 0x39e6, 0x3961, 0x398f, 0x3585, 0x2d8f, 0x39c7, 0x2e85, 0x319e, 0x3872, 0x3aed, 0x3826, 0x342b, 0x3ad7, 0x25e2, 0x3bc6, 0x326e, 0x3299, 0x28ef, 0x38e9, 0x3a65, 0x28d7, 0x2098, 0x2481, 0x36f5, 0x3905, 0x3250, 0x389d, 0x24ad, 0x3462, 0x320f, 0x3a33, 0x3a28, 0x3998, 0x3a01, 0x38ed, 0x39e9, 0x3884, 0x38ea, 0x35b5, 0x316a, 0x35ac, 0x35c7, 0x34b7, 0x392e, 0x38b1, 0x29cd, 0x35f4, 0x393b, 0x3a3b, 0x3010, 0x3810, 0x3b82, 0x356c, 0x362c, 0x39bb, 0x39e9, 0x32c1, 0x2fb4, 0x37b3, +0x3ac0, 0x32d7, 0x38d4, 0x35f4, 0x3b9e, 0x2d3c, 0x3b23, 0x2c8d, 0x31f8, 0x3681, 0x35f4, 0x3693, 0x34aa, 0x386f, 0x3bb2, 0x39b5, 0x30a1, 0x3a9b, 0x38ca, 0x39c0, 0x3ab5, 0x37a4, 0x3b86, 0x3bac, 0x3478, 0x38b7, 0x3bd0, 0x3b9b, 0x32b8, 0x37cb, 0x3955, 0x3a94, 0x38c2, 0x3a90, 0x3a96, 0x3948, 0x2cd9, 0x381f, 0x3bf1, 0x3820, 0x2d95, 0x3a8f, 0x37b1, 0x2d54, 0x38f7, 0x3807, 0x30ca, 0x3b3b, 0x3764, 0x3465, 0x3693, 0x3747, 0x391c, 0x37fa, 0x3295, 0x2974, 0x29b4, 0x3342, 0x32ba, 0x39a3, 0x37f2, 0x2e0e, 0x2f6c, 0x3bc3, +0x3690, 0x2caa, 0x34f9, 0x2eaf, 0x2c64, 0x3194, 0x3b90, 0x3716, 0x3958, 0x3310, 0x24ff, 0x35f2, 0x3888, 0x3745, 0x363b, 0x39b9, 0x36cc, 0x395d, 0x2dc7, 0x37c0, 0x3b1c, 0x3750, 0x3680, 0x38ea, 0x38c8, 0x3a65, 0x355b, 0x3b33, 0x3965, 0x359d, 0x3a5c, 0x3686, 0x3ac2, 0x3b46, 0x3b71, 0x27fe, 0x397d, 0x36d5, 0x3810, 0x341e, 0x394f, 0x3a0c, 0x39cd, 0x3794, 0x3aed, 0x3596, 0x2ce8, 0x3172, 0x3023, 0x3ab0, 0x3b9b, 0x3439, 0x3111, 0x3771, 0x3807, 0x356e, 0x2c3b, 0x3bd9, 0x39a0, 0x366a, 0x388f, 0x2461, 0x3b4a, 0x3895, +0x39b4, 0x35fb, 0x33c2, 0x36bb, 0x3823, 0x2fac, 0x39ef, 0x35e1, 0x3872, 0x370d, 0x3ac4, 0x323d, 0x39ee, 0x3be5, 0x325a, 0x39ec, 0x3800, 0x397d, 0x373f, 0x373e, 0x38e4, 0x3ad5, 0x301c, 0x3201, 0x3a42, 0x3617, 0x3a05, 0x3999, 0x32bd, 0x2d5d, 0x3a09, 0x3423, 0x3ac0, 0x3bc9, 0x3b5d, 0x3ad7, 0x30c8, 0x3b71, 0x3471, 0x3bbc, 0x2deb, 0x2c18, 0x346f, 0x2a5e, 0x365b, 0x39ea, 0x3b52, 0x349a, 0x38a1, 0x39f3, 0x3384, 0x3b58, 0x3b6c, 0x34c4, 0x2dde, 0x3b00, 0x3844, 0x389b, 0x385d, 0x35cf, 0x364a, 0x37f0, 0x3216, 0x3b8f, +0x3539, 0x36c6, 0x30bc, 0x2e04, 0x3741, 0x2f7b, 0x3842, 0x38c0, 0x36c7, 0x3ada, 0x374d, 0x35c3, 0x327c, 0x379c, 0x3998, 0x349d, 0x2ef4, 0x35e8, 0x2ad0, 0x3912, 0x3aa7, 0x3ba9, 0x3963, 0x39b2, 0x38f7, 0x2633, 0x38cd, 0x3a42, 0x3213, 0x35fd, 0x31e7, 0x3919, 0x3b5e, 0x3bb9, 0x3a85, 0x3bfd, 0x1d27, 0x3601, 0x378c, 0x2e32, 0x3990, 0x35ea, 0x39bf, 0x3a33, 0x38a4, 0x392c, 0x39d2, 0x3aff, 0x3b29, 0x3a3d, 0x2cda, 0x2a0b, 0x3232, 0x3b76, 0x2845, 0x3a9c, 0x340e, 0x399f, 0x30d9, 0x38dc, 0x37f2, 0x36f6, 0x38de, 0x3a3e, +0x3814, 0x37a6, 0x30e6, 0x3206, 0x2c05, 0x3bf9, 0x3b8c, 0x3aa5, 0x39b6, 0x39a8, 0x3890, 0x346c, 0x38f7, 0x35e1, 0x38c0, 0x358c, 0x2602, 0x3067, 0x36bf, 0x2f50, 0x3a41, 0x38d3, 0x3b34, 0x3286, 0x315d, 0x3938, 0x3074, 0x3b53, 0x34d9, 0x31b3, 0x388c, 0x1842, 0x3a53, 0x371d, 0x3922, 0x3afd, 0x385d, 0x3b95, 0x3646, 0x3821, 0x2c51, 0x3834, 0x3bac, 0x3431, 0x3b59, 0x388c, 0x2a55, 0x3535, 0x2d62, 0x3557, 0x383e, 0x3079, 0x3333, 0x3a09, 0x32e4, 0x37c3, 0x358e, 0x39f8, 0x3b29, 0x38a4, 0x3bc9, 0x390a, 0x3868, 0x38e5, +0x3411, 0x2759, 0x364f, 0x38e1, 0x3b55, 0x3102, 0x3b07, 0x3bec, 0x39c2, 0x3060, 0x323f, 0x3a0c, 0x373c, 0x3a35, 0x35af, 0x39a1, 0x2431, 0x2ef7, 0x35b6, 0x38fa, 0x3a7a, 0x3412, 0x3717, 0x3713, 0x34b0, 0x319b, 0x3bbc, 0x3426, 0x3ab3, 0x3615, 0x3ad1, 0x3831, 0x38c4, 0x30a3, 0x3483, 0x38d7, 0x36c0, 0x33fc, 0x3b94, 0x3601, 0x375f, 0x38f0, 0x317d, 0x39e2, 0x3730, 0x3872, 0x37e5, 0x3a1d, 0x3a7a, 0x3a60, 0x39a9, 0x380f, 0x35c8, 0x359f, 0x3bcf, 0x38b0, 0x32f3, 0x2c41, 0x3ad3, 0x394a, 0x3bea, 0x2fab, 0x3892, 0x3aec, +0x3684, 0x38a4, 0x38ae, 0x2f79, 0x3362, 0x35ae, 0x334e, 0x2f11, 0x3b7e, 0x36c8, 0x3b34, 0x3802, 0x311b, 0x32a5, 0x3a77, 0x38f7, 0x3611, 0x3841, 0x3888, 0x36b5, 0x32cd, 0x3930, 0x3bf4, 0x3956, 0x3469, 0x3bb2, 0x3add, 0x3bd1, 0x3a15, 0x39d4, 0x3b47, 0x3a69, 0x382c, 0x3b44, 0x37d2, 0x1e90, 0x3b19, 0x39ca, 0x3176, 0x38a1, 0x3958, 0x38c1, 0x3361, 0x3268, 0x371f, 0x37e5, 0x39fb, 0x3501, 0x39b9, 0x39c9, 0x3885, 0x3a56, 0x3913, 0x3838, 0x3be9, 0x3150, 0x37b4, 0x2f1b, 0x350c, 0x2a90, 0x3886, 0x2823, 0x2d33, 0x3867, +0x341f, 0x3939, 0x3771, 0x3794, 0x3910, 0x3a31, 0x3953, 0x3b16, 0x3a73, 0x3aa2, 0x3a97, 0x3b3d, 0x3473, 0x3881, 0x3a44, 0x333e, 0x374b, 0x35cc, 0x3a3d, 0x3118, 0x2849, 0x3a11, 0x3855, 0x3a24, 0x3a77, 0x3a97, 0x3807, 0x355a, 0x3a46, 0x3947, 0x3869, 0x394a, 0x34c5, 0x384f, 0x34c3, 0x36e4, 0x3597, 0x2cc3, 0x222a, 0x3adc, 0x3738, 0x378f, 0x390e, 0x3b9b, 0x3395, 0x3618, 0x31cb, 0x388a, 0x37a2, 0x39d2, 0x3739, 0x31b6, 0x3abe, 0x2514, 0x38d8, 0x3860, 0x3b46, 0x2c61, 0x3b7a, 0x3bd3, 0x3bf0, 0x3222, 0x3094, 0x38cf, +0x3b4c, 0x34e3, 0x1ce4, 0x3079, 0x3799, 0x39cb, 0x37cc, 0x31d5, 0x3477, 0x39be, 0x3b37, 0x3338, 0x37fb, 0x3a19, 0x3a68, 0x39c5, 0x32df, 0x315c, 0x320d, 0x3636, 0x372b, 0x3504, 0x3742, 0x3a80, 0x3b24, 0x25de, 0x311d, 0x3b59, 0x3743, 0x3082, 0x3436, 0x3a84, 0x3462, 0x3a6c, 0x2415, 0x3705, 0x2c28, 0x3154, 0x3381, 0x34c3, 0x3adb, 0x3973, 0x3a99, 0x2f42, 0x3a9c, 0x3be1, 0x378b, 0x3428, 0x3800, 0x2882, 0x39d6, 0x3819, 0x2e08, 0x33c3, 0x38fe, 0x2db3, 0x3be8, 0x381c, 0x3825, 0x390f, 0x237d, 0x3b46, 0x27d1, 0x3889, +0x3a43, 0x3650, 0x35f1, 0x3a5a, 0x34e3, 0x387d, 0x2d00, 0x38f8, 0x37b4, 0x383d, 0x373b, 0x3794, 0x38ab, 0x35e6, 0x31fc, 0x3493, 0x3597, 0x38af, 0x3621, 0x3519, 0x3bb1, 0x33e4, 0x3782, 0x34a8, 0x2e0b, 0x2db5, 0x377f, 0x33e5, 0x399f, 0x2875, 0x3582, 0x3be0, 0x3452, 0x3193, 0x3942, 0x3ad2, 0x36d2, 0x3b5a, 0x34fe, 0x2a81, 0x39fd, 0x38ea, 0x3aac, 0x3b11, 0x3423, 0x3724, 0x3a27, 0x340a, 0x398b, 0x354f, 0x2e4d, 0x35c8, 0x2d73, 0x3a44, 0x2b31, 0x31ec, 0x3aa2, 0x3b27, 0x3918, 0x34a5, 0x3b9c, 0x2ecb, 0x38b8, 0x2e4e, +0x3b9a, 0x3a36, 0x394a, 0x307a, 0x2859, 0x344c, 0x3b56, 0x3233, 0x381a, 0x3b75, 0x38c4, 0x386f, 0x350e, 0x2a77, 0x3ad8, 0x3ae6, 0x3743, 0x3426, 0x3448, 0x3470, 0x3584, 0x38fe, 0x37b1, 0x24b5, 0x2f68, 0x3481, 0x3bac, 0x3b8e, 0x354e, 0x390e, 0x3824, 0x3045, 0x3aca, 0x36a1, 0x3844, 0x39b9, 0x3a65, 0x3083, 0x318f, 0x3ba1, 0x3893, 0x341e, 0x3515, 0x2279, 0x352a, 0x3acb, 0x2e04, 0x38fc, 0x389c, 0x2d3f, 0x3363, 0x3a1a, 0x3ae5, 0x39d8, 0x3a9e, 0x3286, 0x3bd7, 0x38fa, 0x38ff, 0x2cfd, 0x390c, 0x3a2b, 0x2eec, 0x38f8, +0x3806, 0x3a36, 0x399c, 0x3643, 0x3aa8, 0x373c, 0x37fa, 0x2892, 0x3709, 0x38ae, 0x3800, 0x39ab, 0x381a, 0x2daa, 0x3306, 0x2c1a, 0x381d, 0x3aad, 0x354e, 0x30c0, 0x3b52, 0x39dc, 0x32b0, 0x30ae, 0x3bf8, 0x391c, 0x2bb5, 0x3316, 0x2283, 0x33c8, 0x38af, 0x3ab4, 0x314c, 0x39c1, 0x36bd, 0x34b1, 0x3b52, 0x322e, 0x36dd, 0x37f8, 0x37f1, 0x2173, 0x38e0, 0x29a8, 0x3a7a, 0x32ce, 0x39ce, 0x3836, 0x3213, 0x32a0, 0x3825, 0x2581, 0x3ab7, 0x36dd, 0x3934, 0x3a29, 0x394b, 0x3a52, 0x3819, 0x3949, 0x3297, 0x2860, 0x34f2, 0x35b6, +0x3b11, 0x33de, 0x3b82, 0x3b33, 0x3244, 0x3815, 0x3942, 0x3515, 0x3576, 0x2976, 0x3bda, 0x3929, 0x3976, 0x3949, 0x3ab3, 0x3057, 0x3bf0, 0x384e, 0x3adb, 0x3a6b, 0x33f1, 0x3a3d, 0x391a, 0x3511, 0x3926, 0x33b9, 0x3363, 0x39b6, 0x393f, 0x3ac1, 0x39d7, 0x34f7, 0x2c7a, 0x38d9, 0x295f, 0x3658, 0x39d1, 0x31be, 0x337c, 0x39ef, 0x3b76, 0x2820, 0x3a25, 0x39ff, 0x38da, 0x359c, 0x3556, 0x3b08, 0x300e, 0x3496, 0x2f77, 0x397e, 0x3357, 0x386b, 0x3890, 0x3886, 0x2baf, 0x32d4, 0x39cb, 0x3312, 0x3bb3, 0x3a33, 0x35be, 0x3831, +0x34ee, 0x32d2, 0x2a8e, 0x3bbf, 0x260a, 0x3012, 0x38a2, 0x380b, 0x39c6, 0x3098, 0x3aa8, 0x3b87, 0x39de, 0x3403, 0x34a4, 0x36a6, 0x3a1f, 0x3720, 0x2c49, 0x344c, 0x3b5e, 0x39db, 0x3807, 0x3b45, 0x3925, 0x3b31, 0x3b74, 0x365d, 0x3970, 0x3ba7, 0x3307, 0x3668, 0x3663, 0x3bbc, 0x3a2b, 0x3154, 0x39a5, 0x3aba, 0x2f5d, 0x3be1, 0x37d9, 0x31ce, 0x36f0, 0x340b, 0x3882, 0x2ec1, 0x38e5, 0x3bc6, 0x36c2, 0x37a6, 0x3542, 0x34dd, 0x2c0e, 0x38b8, 0x39c6, 0x3926, 0x381f, 0x33e4, 0x387b, 0x3771, 0x324b, 0x39d2, 0x2c2b, 0x3ad4, +0x38c9, 0x3b08, 0x2e59, 0x39ae, 0x27e6, 0x3907, 0x35b7, 0x2bbf, 0x38b5, 0x3a6a, 0x39c6, 0x3b6f, 0x3a94, 0x38aa, 0x303b, 0x3bc8, 0x348e, 0x3ae6, 0x386f, 0x3993, 0x34ec, 0x3bf1, 0x3860, 0x38d9, 0x3328, 0x3ad6, 0x3220, 0x38ed, 0x37f8, 0x30ac, 0x38a7, 0x2618, 0x3856, 0x30e6, 0x2edf, 0x38c9, 0x39a5, 0x2ca5, 0x2e15, 0x3af8, 0x324e, 0x33d2, 0x38fe, 0x33de, 0x3be1, 0x308a, 0x3957, 0x39a0, 0x3a9a, 0x3098, 0x336f, 0x33e8, 0x35c8, 0x3a64, 0x3a6b, 0x39dd, 0x3874, 0x28e0, 0x39e3, 0x3bc5, 0x3bda, 0x3b31, 0x397d, 0x3121, +0x35a3, 0x385a, 0x26fa, 0x3a6f, 0x3984, 0x39f9, 0x3651, 0x33f9, 0x3821, 0x3922, 0x39f4, 0x38b7, 0x34ec, 0x3bd3, 0x2c84, 0x28f3, 0x3906, 0x35c3, 0x392f, 0x31d9, 0x3982, 0x2f17, 0x3511, 0x3b7f, 0x399a, 0x3ab9, 0x2dec, 0x32a5, 0x31c9, 0x335b, 0x3695, 0x3562, 0x3172, 0x2f91, 0x3985, 0x32a0, 0x3ad3, 0x332a, 0x2c75, 0x2c0f, 0x3544, 0x168e, 0x36fd, 0x3308, 0x2d59, 0x3b64, 0x3844, 0x3a0a, 0x392f, 0x3a96, 0x30ed, 0x38d1, 0x3147, 0x3ad1, 0x3962, 0x3432, 0x3033, 0x36bf, 0x3b25, 0x3bdd, 0x3bea, 0x39a0, 0x38c9, 0x3b33, +0x2c08, 0x394a, 0x3bf5, 0x3910, 0x317b, 0x3b34, 0x3aa4, 0x3af1, 0x3abf, 0x3b98, 0x3bb1, 0x3621, 0x3ac2, 0x38f3, 0x3b91, 0x3378, 0x3763, 0x3b95, 0x3bad, 0x36b2, 0x3357, 0x384b, 0x395a, 0x3bab, 0x3024, 0x3ae5, 0x35b0, 0x31b3, 0x3421, 0x3a39, 0x34db, 0x38a1, 0x301e, 0x3587, 0x32f6, 0x342c, 0x3a95, 0x3726, 0x3719, 0x2cd2, 0x3a28, 0x399d, 0x388d, 0x39a0, 0x3abb, 0x3b3a, 0x2828, 0x39fb, 0x2f0a, 0x3931, 0x384c, 0x36a8, 0x3411, 0x3545, 0x2f7d, 0x3854, 0x30d4, 0x3acb, 0x3a73, 0x308f, 0x2010, 0x34df, 0x391f, 0x31f9, +0x32bd, 0x3a75, 0x381d, 0x3912, 0x394d, 0x3404, 0x38e8, 0x3a5b, 0x3a62, 0x3af0, 0x3a17, 0x39a3, 0x341a, 0x3332, 0x37cc, 0x3b2b, 0x367c, 0x38b2, 0x3663, 0x3b73, 0x3b2d, 0x3bf0, 0x35a5, 0x363b, 0x33be, 0x379b, 0x361e, 0x3918, 0x3ad9, 0x2a92, 0x3462, 0x2144, 0x2081, 0x3845, 0x326d, 0x3717, 0x3831, 0x3958, 0x3893, 0x32b4, 0x3a1e, 0x3aa2, 0x3487, 0x38b2, 0x32a0, 0x3a03, 0x3a70, 0x34c2, 0x365c, 0x3842, 0x38ad, 0x366f, 0x3a07, 0x37da, 0x30f2, 0x374d, 0x3a41, 0x3a7e, 0x33a9, 0x3166, 0x37d5, 0x3808, 0x3b70, 0x39b9, +0x3969, 0x3681, 0x2f53, 0x35b5, 0x31dc, 0x3bc2, 0x38b6, 0x2f39, 0x3999, 0x3b31, 0x331e, 0x388c, 0x3b5a, 0x39db, 0x3aaa, 0x39dd, 0x34d9, 0x34a4, 0x2f6a, 0x3822, 0x3a3f, 0x3ac5, 0x3a1c, 0x3518, 0x3337, 0x295b, 0x3b0e, 0x3af2, 0x3987, 0x20c4, 0x394c, 0x34e6, 0x380a, 0x3502, 0x1b82, 0x2c8a, 0x3425, 0x378a, 0x3bc8, 0x30c5, 0x391d, 0x34f8, 0x3af9, 0x3908, 0x38e0, 0x3bee, 0x3b38, 0x3a0b, 0x36ea, 0x2de6, 0x360d, 0x35bc, 0x395a, 0x3b3e, 0x3808, 0x38ef, 0x3804, 0x393f, 0x39af, 0x32d9, 0x3bc0, 0x39de, 0x330d, 0x383e, +0x3a63, 0x2c2e, 0x2f9c, 0x3308, 0x397c, 0x3aed, 0x3ad6, 0x336d, 0x3309, 0x2a59, 0x3a35, 0x3ab3, 0x3998, 0x3aec, 0x3633, 0x3b63, 0x3a28, 0x3bbe, 0x34d1, 0x377e, 0x332a, 0x3ae8, 0x3a18, 0x3a44, 0x3932, 0x3576, 0x3bc8, 0x3aef, 0x3bcb, 0x3898, 0x3916, 0x397e, 0x3332, 0x3b99, 0x38df, 0x38f1, 0x2e04, 0x3a33, 0x35ea, 0x31de, 0x1f39, 0x3911, 0x33b6, 0x3bb1, 0x3a21, 0x33e4, 0x354a, 0x2f83, 0x389e, 0x3357, 0x343e, 0x3af9, 0x35fd, 0x3810, 0x39e3, 0x38f6, 0x3632, 0x2e8d, 0x3340, 0x2b4c, 0x3b23, 0x3955, 0x32b4, 0x3670, +0x3633, 0x3b07, 0x3341, 0x3449, 0x35f2, 0x3ab9, 0x3379, 0x34d9, 0x393a, 0x3b47, 0x3764, 0x3bed, 0x3755, 0x3581, 0x3a94, 0x3b72, 0x35bb, 0x3ac4, 0x25a2, 0x3a4e, 0x32df, 0x3bf7, 0x3aa7, 0x38ff, 0x3848, 0x39c2, 0x3b40, 0x3984, 0x3a57, 0x19ab, 0x3b95, 0x1d5e, 0x3811, 0x37dd, 0x38bd, 0x2e92, 0x3835, 0x3972, 0x372e, 0x2d3a, 0x34a4, 0x3823, 0x3274, 0x31d8, 0x3898, 0x3756, 0x3786, 0x2c2c, 0x3b95, 0x3aff, 0x3272, 0x3866, 0x3881, 0x319c, 0x38c8, 0x3bbf, 0x33df, 0x3a86, 0x3188, 0x38d3, 0x38ea, 0x120b, 0x3abd, 0x2e02, +0x387b, 0x3860, 0x2883, 0x3a44, 0x33db, 0x38c8, 0x3be0, 0x3418, 0x397e, 0x3a52, 0x393b, 0x39f4, 0x3ad3, 0x2a7d, 0x37bd, 0x3af0, 0x3919, 0x3947, 0x3814, 0x37ee, 0x28fb, 0x387c, 0x36d2, 0x39b5, 0x3319, 0x3498, 0x329c, 0x3831, 0x35d5, 0x2a9e, 0x3a3d, 0x2f8d, 0x386f, 0x2e3b, 0x329c, 0x38be, 0x3b5a, 0x3a90, 0x33ae, 0x3982, 0x3b62, 0x39ae, 0x39ec, 0x3679, 0x3734, 0x3a0d, 0x3a24, 0x34ca, 0x38c2, 0x3987, 0x304e, 0x3990, 0x38d8, 0x3b86, 0x3abf, 0x3670, 0x3a6c, 0x2f99, 0x33a9, 0x3aba, 0x385f, 0x3a37, 0x3a6e, 0x3624, +0x32ff, 0x3a02, 0x33f6, 0x3a0f, 0x3563, 0x38f4, 0x38ba, 0x267e, 0x296d, 0x35fd, 0x3b89, 0x32bc, 0x3acf, 0x3904, 0x3a51, 0x3431, 0x2260, 0x388e, 0x37b1, 0x35c3, 0x35f9, 0x2f87, 0x3b05, 0x2799, 0x33f5, 0x2196, 0x3027, 0x34cc, 0x35d3, 0x3893, 0x312d, 0x34e4, 0x3861, 0x346d, 0x397c, 0x3a08, 0x3637, 0x3086, 0x3481, 0x30ab, 0x3533, 0x33c6, 0x2d48, 0x3648, 0x359c, 0x390c, 0x3677, 0x354a, 0x3b4d, 0x3b9d, 0x3323, 0x3694, 0x3213, 0x329d, 0x3828, 0x382d, 0x31bf, 0x3746, 0x3635, 0x3198, 0x3032, 0x3092, 0x303d, 0x397c, +0x3b01, 0x3ab5, 0x3b7e, 0x29a3, 0x340f, 0x30fb, 0x35cb, 0x3424, 0x39b0, 0x3187, 0x3754, 0x3b8b, 0x3810, 0x3554, 0x3b1c, 0x3806, 0x3bde, 0x2a39, 0x3aa3, 0x3b27, 0x3b94, 0x3786, 0x3503, 0x388a, 0x383f, 0x3884, 0x3bf9, 0x3a20, 0x395a, 0x33af, 0x33d9, 0x3b30, 0x3be0, 0x2c91, 0x3b4a, 0x373a, 0x3beb, 0x3a54, 0x3b5e, 0x3599, 0x3466, 0x3538, 0x35e9, 0x387b, 0x3904, 0x288a, 0x3b05, 0x35a5, 0x3316, 0x395f, 0x3869, 0x39e4, 0x34ac, 0x350a, 0x2dd8, 0x32c7, 0x32e2, 0x3be7, 0x38f4, 0x3ada, 0x3959, 0x3a32, 0x3876, 0x3a54, +0x3636, 0x35f4, 0x381d, 0x3931, 0x39fc, 0x3a4d, 0x3591, 0x34c7, 0x33ad, 0x3ac2, 0x3ada, 0x2b1d, 0x3153, 0x3741, 0x3a10, 0x38fa, 0x32ed, 0x3bcc, 0x31be, 0x3a65, 0x335c, 0x3a5f, 0x3b18, 0x3711, 0x3ba3, 0x367b, 0x3820, 0x2b7e, 0x3111, 0x3b3f, 0x2591, 0x38cc, 0x3971, 0x34ac, 0x2d8a, 0x36bb, 0x39b1, 0x37b8, 0x3924, 0x2f50, 0x3597, 0x33b7, 0x2d00, 0x2a92, 0x3496, 0x385e, 0x3b0a, 0x3b25, 0x3045, 0x2d1a, 0x374d, 0x221c, 0x2b6e, 0x39bb, 0x37c7, 0x387f, 0x3793, 0x308b, 0x3556, 0x3952, 0x36c2, 0x362a, 0x3bcb, 0x39c9, +0x3a56, 0x2dd3, 0x352a, 0x382b, 0x2888, 0x3bb2, 0x395d, 0x21e7, 0x372a, 0x3b6f, 0x39ed, 0x3bf7, 0x33b2, 0x3ab1, 0x37de, 0x39b8, 0x28e5, 0x2ee3, 0x3a48, 0x369b, 0x396c, 0x1974, 0x3563, 0x3821, 0x3967, 0x2e88, 0x35a7, 0x392a, 0x385a, 0x3b40, 0x2eea, 0x3b24, 0x37aa, 0x31b3, 0x3400, 0x3835, 0x2b2e, 0x2e60, 0x3be0, 0x3367, 0x3b53, 0x3beb, 0x30a5, 0x3810, 0x3849, 0x37a1, 0x3a03, 0x3962, 0x33b8, 0x37e7, 0x2d24, 0x329c, 0x3874, 0x3ba1, 0x1e36, 0x3138, 0x3a89, 0x38fc, 0x3b3d, 0x3440, 0x3b76, 0x3b94, 0x373c, 0x2821, +0x39a5, 0x3800, 0x27ab, 0x3adc, 0x3219, 0x3a16, 0x36d0, 0x3ac8, 0x3b92, 0x3618, 0x38b7, 0x3a27, 0x3791, 0x3b35, 0x380a, 0x3acf, 0x345c, 0x3ace, 0x376f, 0x384b, 0x3aae, 0x37e4, 0x38c6, 0x2f10, 0x35b4, 0x3b6b, 0x3afe, 0x32a2, 0x35b4, 0x358d, 0x2859, 0x35a1, 0x33f2, 0x3971, 0x35ec, 0x38a6, 0x390a, 0x380d, 0x3bed, 0x33f2, 0x3529, 0x3ac4, 0x2e88, 0x30da, 0x3b57, 0x39ad, 0x3bbd, 0x2771, 0x2eac, 0x39d6, 0x384f, 0x39cc, 0x3868, 0x3b6e, 0x36ea, 0x3001, 0x3568, 0x3b8a, 0x333b, 0x3987, 0x2672, 0x349e, 0x33fc, 0x38f9, +0x3b7e, 0x3bfc, 0x37a9, 0x3664, 0x3a0e, 0x3bce, 0x37a7, 0x35ad, 0x3b0c, 0x3a22, 0x3318, 0x3b54, 0x3863, 0x3a66, 0x388c, 0x3b53, 0x396a, 0x3a55, 0x32c7, 0x3a96, 0x38b3, 0x36d9, 0x3676, 0x36bd, 0x2da9, 0x36c6, 0x3154, 0x372f, 0x396a, 0x3718, 0x31b0, 0x3bb4, 0x3aae, 0x37a3, 0x3892, 0x364b, 0x32c0, 0x3851, 0x286f, 0x3a6a, 0x3772, 0x3924, 0x2526, 0x3b09, 0x3025, 0x3951, 0x32e1, 0x3880, 0x38e2, 0x3b44, 0x259d, 0x35ba, 0x3581, 0x300b, 0x3945, 0x3ae1, 0x3bdf, 0x354f, 0x3825, 0x3b02, 0x3551, 0x39bd, 0x3bb8, 0x38f9, +0x31da, 0x37e9, 0x37e1, 0x3b6d, 0x39f8, 0x3885, 0x3993, 0x362d, 0x3b55, 0x33ef, 0x3895, 0x394d, 0x2d0b, 0x3702, 0x39bc, 0x3b39, 0x3036, 0x38aa, 0x3582, 0x3474, 0x3bf6, 0x344f, 0x389d, 0x3bbb, 0x32cd, 0x302b, 0x37f4, 0x38a6, 0x3854, 0x368c, 0x3ab0, 0x3aff, 0x385d, 0x354c, 0x38bb, 0x2e0f, 0x3b75, 0x36e9, 0x380d, 0x38f9, 0x386a, 0x36d5, 0x3746, 0x3b00, 0x368a, 0x3961, 0x3673, 0x352a, 0x351b, 0x2aac, 0x3988, 0x3754, 0x3886, 0x3aec, 0x381e, 0x3832, 0x3ac5, 0x2179, 0x3ba1, 0x3b00, 0x3a55, 0x392e, 0x326b, 0x296d, +0x25a4, 0x3a74, 0x320e, 0x30e0, 0x317f, 0x3bfd, 0x3bc5, 0x2af4, 0x3b85, 0x3603, 0x3ba8, 0x352a, 0x38e5, 0x37be, 0x32cc, 0x387e, 0x389f, 0x2ed9, 0x3a27, 0x3174, 0x3b45, 0x3a84, 0x3be2, 0x35f2, 0x3a49, 0x3aba, 0x34fe, 0x34e8, 0x3ba0, 0x3940, 0x3b98, 0x3b65, 0x3b95, 0x3735, 0x3b3c, 0x3801, 0x3a86, 0x39a0, 0x3ba1, 0x360f, 0x2b45, 0x3806, 0x35e7, 0x3b4a, 0x3a83, 0x39d3, 0x31c7, 0x3088, 0x38b6, 0x3aa2, 0x3b80, 0x366e, 0x3a81, 0x3836, 0x330e, 0x3ac2, 0x3a13, 0x3a60, 0x37c2, 0x369d, 0x3a8a, 0x3778, 0x3322, 0x2c22, +0x3ae9, 0x38fd, 0x3b37, 0x23c0, 0x30ba, 0x2e6a, 0x397a, 0x3166, 0x3a2e, 0x2fc5, 0x2b07, 0x36f2, 0x36b4, 0x3b63, 0x3ba7, 0x3641, 0x2c50, 0x38f4, 0x3857, 0x3a1d, 0x378f, 0x38da, 0x2a45, 0x3849, 0x2ae1, 0x3ad9, 0x2e87, 0x3adb, 0x8f4, 0x20ef, 0x3aba, 0x3a2d, 0x340b, 0x3bab, 0x352d, 0x3941, 0x3ac3, 0x3a8d, 0x362a, 0x3a02, 0x3a49, 0x2d45, 0x334a, 0x2bfc, 0x35a1, 0x304a, 0x3666, 0x35c0, 0x3838, 0x3a55, 0x3656, 0x34f6, 0x341a, 0x3879, 0x368a, 0x3744, 0x3886, 0x3320, 0x3459, 0x38d4, 0x30ae, 0x3815, 0x3568, 0x3101, +0x3455, 0x3727, 0x39a9, 0x37e6, 0x3259, 0x3bb1, 0x3781, 0x3a91, 0x3998, 0x2d2f, 0x32d8, 0x3955, 0x3844, 0x2753, 0x3bf4, 0x340e, 0x3a49, 0x397b, 0x39e1, 0x3992, 0x38b5, 0x34e6, 0x3741, 0x3113, 0x3a5d, 0x395d, 0x38eb, 0x3542, 0x3b17, 0x38c7, 0x3564, 0x350d, 0x3846, 0x384c, 0x338c, 0x39fe, 0x2dc8, 0x3ac8, 0x2fee, 0x3b1e, 0x378c, 0x3455, 0x35b3, 0x38cd, 0x3950, 0x3b98, 0x2b96, 0x3aca, 0x3809, 0x37c9, 0x393e, 0x39f8, 0x3822, 0x3187, 0x3905, 0x3bdb, 0x360c, 0x34d7, 0x3408, 0x38e3, 0x358e, 0x3a58, 0x33cf, 0x38d2, +0x3a8f, 0x389c, 0x3a45, 0x325b, 0x2a6c, 0x375f, 0x3382, 0x3a44, 0x3256, 0x2770, 0x3bd6, 0x2f05, 0x34cf, 0x29d7, 0x2d77, 0x38b9, 0x3971, 0x3518, 0x2e1b, 0x39dc, 0x31d4, 0x388a, 0x3b6d, 0x37a7, 0x28c3, 0x3720, 0x3050, 0x38fd, 0x3801, 0x3b4b, 0x3308, 0x38a1, 0x3241, 0x3184, 0x39b8, 0x3bef, 0x2930, 0x395b, 0x3a49, 0x39d2, 0x3b2d, 0x2e75, 0x2cc6, 0x3b5e, 0x3724, 0x3352, 0x31fc, 0x3607, 0x3ae9, 0x3867, 0x3a8c, 0x24ab, 0x3821, 0x328e, 0x2f81, 0x249f, 0x2d6f, 0x352d, 0x3723, 0x37b2, 0x3683, 0x36f4, 0x3a8c, 0x38fb, +0x3a36, 0x3ad9, 0x38b6, 0x3522, 0x38b7, 0x30f8, 0x36ee, 0x3a71, 0x36fd, 0x349b, 0x3343, 0x36ae, 0x3895, 0x365a, 0x3bf5, 0x3a04, 0x3931, 0x36fa, 0x3970, 0x39fb, 0x2c7a, 0x3a47, 0x3987, 0x3429, 0x338f, 0x3ba1, 0x393e, 0x3a05, 0x3a0d, 0x2e16, 0x34c9, 0x3943, 0x302a, 0x31e9, 0x3401, 0x330a, 0x3bc4, 0x3542, 0x38fc, 0x38bb, 0x3401, 0x37be, 0x371f, 0x3933, 0x3963, 0x385f, 0x3479, 0x3bff, 0x2c2b, 0x3782, 0x2cda, 0x396b, 0x3a8c, 0x3bf9, 0x34b0, 0x3696, 0x3a9f, 0x33a1, 0x322f, 0x396b, 0x3be3, 0x3ade, 0x381c, 0x3a76, +0x388c, 0x2896, 0x2724, 0x39d7, 0x35a4, 0x37b3, 0x3282, 0x272c, 0x3774, 0x247f, 0x3bed, 0x1989, 0x3b14, 0x3861, 0x3b1d, 0x3909, 0x23a3, 0x3ae8, 0x399c, 0x3b39, 0x3b6a, 0x3a49, 0x3454, 0x3b04, 0x3a85, 0x3b06, 0x2fe7, 0x32d7, 0x3879, 0x3b8e, 0x33ed, 0x38a8, 0x359e, 0x39f7, 0x3546, 0x31f7, 0x3bc7, 0x3387, 0x3279, 0x39af, 0x39e2, 0x3432, 0x37c3, 0x3b4a, 0x3b34, 0x3b66, 0x23fc, 0x3a1a, 0x3577, 0x35b1, 0x3a02, 0x2584, 0x36be, 0x3389, 0x3bcc, 0x369c, 0x38a5, 0x381f, 0x3553, 0x39ab, 0x3a9a, 0x395c, 0x381f, 0x3b60, +0x36d8, 0x342a, 0x344e, 0x30f8, 0x3a5e, 0x34e7, 0x35b1, 0x3739, 0x3838, 0x32d9, 0x38ac, 0x386a, 0x39ae, 0x1826, 0x2431, 0x38ea, 0x3b66, 0x3b9e, 0x3b3c, 0x3b1d, 0x38cb, 0x3537, 0x391b, 0x364c, 0x3aa0, 0x2f83, 0x289d, 0x35da, 0x3a40, 0x3527, 0x386e, 0x2d5e, 0x3a81, 0x36a6, 0x32af, 0x357e, 0x375c, 0x33ca, 0x3837, 0x2dae, 0x3595, 0x2912, 0x349a, 0x353a, 0x35db, 0x3b28, 0x3978, 0x3470, 0x30ae, 0x3a15, 0x38bb, 0x3b82, 0x388c, 0x3778, 0x34fb, 0x3b0e, 0x3b13, 0x3b9c, 0x303b, 0x14ea, 0x2feb, 0x3660, 0x33ea, 0x3b08, +0x3a7f, 0x292f, 0x3be3, 0x372b, 0x39e9, 0x3b26, 0x3725, 0x34f1, 0x3a2a, 0x38cc, 0x3a67, 0x3819, 0x3ba5, 0x339b, 0x3bf6, 0x3420, 0x3548, 0x38e5, 0x39e3, 0x3a62, 0x35e3, 0x3a03, 0x3893, 0x39c2, 0x3848, 0x38fa, 0x396c, 0x32a7, 0x3a8f, 0x329b, 0x32f1, 0x39d3, 0x1a9c, 0x3aea, 0x3782, 0x38f2, 0x3829, 0x2e91, 0x39fc, 0x3716, 0x3899, 0x31bb, 0x349b, 0x32eb, 0x367e, 0x3bad, 0x38f1, 0x34cc, 0x35dd, 0x31ba, 0x3ad9, 0x1dc5, 0x3884, 0x2c64, 0x2ec7, 0x35ed, 0x2e64, 0x3a4a, 0x38b5, 0x3b59, 0x2c80, 0x318b, 0x2d35, 0x38d9, +0x3a09, 0x31c2, 0x37be, 0x39f4, 0x3435, 0x3994, 0x39dc, 0x3933, 0x3035, 0x3984, 0x3228, 0x2d01, 0x3940, 0x3bd3, 0x385d, 0x2e62, 0x3643, 0x3b0c, 0x3454, 0x3686, 0x3b52, 0x3b5b, 0x3ac5, 0x3998, 0x307b, 0x38d5, 0x36e4, 0x341f, 0x39e7, 0x3a62, 0x34c5, 0x39b5, 0x37b6, 0x37b4, 0x3868, 0x3888, 0x38b9, 0x37e1, 0x36a5, 0x386c, 0x39d8, 0x3961, 0x3ba9, 0x38a1, 0x2ca0, 0x38b3, 0x3aea, 0x352d, 0x33f9, 0x3808, 0x37b6, 0x3a39, 0x3aba, 0x3799, 0x36fe, 0x34fd, 0x374f, 0x34eb, 0x3720, 0x3466, 0x39ff, 0x3922, 0x3113, 0x3a13, +0x3bb0, 0x3ac9, 0x3879, 0x2a5c, 0x26e4, 0x37cc, 0x39a0, 0x353a, 0x3688, 0x3ac1, 0x3bee, 0x3a3e, 0x3949, 0x38f5, 0x307a, 0x2e5b, 0x3531, 0x382f, 0x338a, 0x3ac2, 0x3966, 0x34e2, 0x2f1b, 0x3a1d, 0x3686, 0x38e3, 0x322d, 0x351c, 0x3b01, 0x360c, 0x33c8, 0x35e4, 0x2cea, 0x3642, 0x39b7, 0x37fa, 0x3102, 0x2f06, 0x33ce, 0x365a, 0x335a, 0x3550, 0x2b84, 0x38dc, 0x3aaf, 0x39fb, 0x39e0, 0x32e2, 0x33f5, 0x3a5e, 0x3bdb, 0x2963, 0x3229, 0x3b41, 0x3783, 0x3a11, 0x382c, 0x3952, 0x37a0, 0x38c5, 0x2894, 0x3325, 0x3468, 0x3029, +0x3719, 0x38ad, 0x357e, 0x2ee3, 0x2d33, 0x3445, 0x3ac4, 0x3108, 0x398f, 0x35e7, 0x384b, 0x3870, 0x387d, 0x3235, 0x397c, 0x3891, 0x38bc, 0x28df, 0x388c, 0x3974, 0x34cd, 0x3a34, 0x3861, 0x3bf8, 0x3934, 0x364a, 0x3644, 0x3af6, 0x3742, 0x398b, 0x3a7c, 0x3bb8, 0x33fe, 0x397b, 0x3bae, 0x3b83, 0x360e, 0x35b9, 0x39a4, 0x3a32, 0x38d9, 0x304f, 0x38c1, 0x297f, 0x3b47, 0x3a0f, 0x3b27, 0x3bdf, 0x35a6, 0x39a0, 0x31b1, 0x389d, 0x3745, 0x3b82, 0x37b2, 0x3945, 0x36b9, 0x398b, 0x35c2, 0x3335, 0x30f6, 0x30f3, 0x35c9, 0x38b4, +0x3833, 0x3601, 0x321c, 0x350c, 0x36e7, 0x3452, 0x2f4f, 0x2b8e, 0x3a7c, 0x311b, 0x3b93, 0x3bd3, 0x3b75, 0x3711, 0x34dc, 0x380f, 0x39f7, 0x2b7b, 0x31de, 0x9f0, 0x3783, 0x331c, 0x3b71, 0x21bc, 0x3a5e, 0x38ed, 0x39db, 0x309e, 0x3565, 0x382d, 0x3682, 0x3b3e, 0x3b3b, 0x3419, 0x35e2, 0x3a64, 0x3be9, 0x335e, 0x377e, 0x3a3a, 0x3b74, 0x3688, 0x3a52, 0x322c, 0x3a83, 0x3a51, 0x3afb, 0x38e5, 0x3bde, 0x3afe, 0x3917, 0x37f7, 0x283d, 0x3b60, 0x3408, 0x3543, 0x38ce, 0x38fe, 0x3b49, 0x2e7d, 0x3a16, 0x3920, 0x28c9, 0x34d5, +0x3be4, 0x2e71, 0x3ace, 0x3aa0, 0x3ac0, 0x3618, 0x3b1a, 0x29fa, 0x3962, 0x358d, 0x2f85, 0x3ad2, 0x3198, 0x373d, 0x3b9e, 0x362d, 0x381e, 0x3ad3, 0x3904, 0x18b4, 0x37c3, 0x386b, 0x3982, 0x3711, 0x3a56, 0x3ac7, 0x38c2, 0x2d57, 0x313b, 0x31fd, 0x3423, 0x35a4, 0x38be, 0x3857, 0x36b9, 0x3b9d, 0x39de, 0x33e8, 0x3896, 0x3919, 0x32ee, 0x3b94, 0x3528, 0x38fc, 0x38ca, 0x25e6, 0x38ca, 0x396f, 0x3a63, 0x2a52, 0x3a30, 0x393f, 0x38f1, 0x3a58, 0x3537, 0x3295, 0x38ec, 0x391b, 0x3839, 0x3448, 0x39db, 0x34fa, 0x37db, 0x3bf0, +0x396e, 0x353f, 0x3474, 0x1958, 0x3964, 0x3958, 0x36d3, 0x3966, 0x3a4d, 0x3132, 0x3a83, 0x31b7, 0x272b, 0x38e1, 0x300d, 0x3afe, 0x2a0c, 0x31f3, 0x377f, 0x384a, 0x2925, 0x38ce, 0x3a89, 0x3bdf, 0x36ef, 0x3219, 0x2e91, 0x3651, 0x3875, 0x30a4, 0x3a9e, 0x3b89, 0x3150, 0x34e5, 0x3a6c, 0x36d0, 0x32af, 0x34b9, 0x3b92, 0x3b54, 0x3b42, 0x3a63, 0x3a4e, 0x36ef, 0x3ba1, 0x389e, 0x307a, 0x34e9, 0x3a92, 0x353b, 0x3905, 0x39a6, 0x3838, 0x3135, 0x3501, 0x39b2, 0x3ae9, 0x325a, 0x3173, 0x329c, 0x385b, 0x3830, 0x31f8, 0x3819, +0x3b5b, 0x3a59, 0x3b28, 0x3a12, 0x3afd, 0x37b4, 0x383d, 0x39ba, 0x3b68, 0x3b3c, 0x3b38, 0x31d1, 0x3566, 0x36f0, 0x387e, 0x354d, 0x330b, 0x3aba, 0x3323, 0x3a7d, 0x369c, 0x29c1, 0x3b29, 0x38a8, 0x3a08, 0x323d, 0x3b93, 0x3833, 0x3284, 0x39b4, 0x386e, 0x3840, 0x39fc, 0x3365, 0x29a9, 0x379c, 0x3648, 0x31df, 0x3b00, 0x31d7, 0x3b0e, 0x33b0, 0x3bfe, 0x3bfb, 0x33b2, 0x2d56, 0x3361, 0x3ba6, 0x3bd0, 0x395b, 0x360c, 0x344e, 0x3bde, 0x3bdb, 0x3afb, 0x328d, 0x2f81, 0x3b0c, 0x3ba8, 0x362f, 0x3301, 0x3740, 0x36e4, 0x39d1, +0x34ee, 0x37ed, 0x36c7, 0x32b3, 0x36e3, 0x34dc, 0x35ee, 0x3b00, 0x2ec8, 0x3aa9, 0x3bac, 0x35ae, 0x38db, 0x345b, 0x2dfe, 0x2c7c, 0x3b56, 0x2cf5, 0x3130, 0x3b7e, 0x38bc, 0x39d6, 0x38d1, 0x3b91, 0x3749, 0x34bb, 0x3a3f, 0x34e5, 0x370a, 0x351d, 0x35d4, 0x300b, 0x3a3f, 0x3867, 0x35d8, 0x32b3, 0x38c9, 0x3962, 0x2c72, 0x3990, 0x1bc9, 0x35b2, 0x3077, 0x37bc, 0x3a42, 0x3b14, 0x2e52, 0x38ec, 0x3b5e, 0x35c8, 0x3bb4, 0x36a4, 0x3812, 0x344f, 0x378b, 0x348c, 0x3a47, 0x3afb, 0x3981, 0x3b82, 0x3b3c, 0x3296, 0x376f, 0x3196, +0x37d6, 0x353a, 0x3924, 0x38cc, 0x3220, 0x3b67, 0x2e21, 0x35fb, 0x3790, 0x2a9e, 0x32e4, 0x394b, 0x38ca, 0x34cc, 0x395b, 0x3411, 0x3a7f, 0x37a9, 0x3116, 0x3460, 0x346b, 0x380e, 0x394d, 0x3afd, 0x2d46, 0x3413, 0x3924, 0x3abf, 0x28d2, 0x3b03, 0x3493, 0x354b, 0x2a7a, 0x3aea, 0x3618, 0x3708, 0x3b07, 0x394c, 0x3a64, 0x3be7, 0x36be, 0x3bf5, 0x37a4, 0x3a9f, 0x399c, 0x30b7, 0x3976, 0x3b70, 0x3bad, 0x3b7e, 0x3b6d, 0x3662, 0x31fc, 0x3bae, 0x361f, 0x3878, 0x3b22, 0x3849, 0x3446, 0x3be2, 0x3bff, 0x37f3, 0x31b5, 0x30b9, +0x399f, 0x35a0, 0x3915, 0x3668, 0x2b35, 0x2b76, 0x3886, 0x3935, 0x38da, 0x3836, 0x2711, 0x32f8, 0x38eb, 0x3481, 0x3243, 0x2d33, 0x3b0f, 0x36ba, 0x393f, 0x35b7, 0x3685, 0x3a15, 0x333a, 0x3afe, 0x2863, 0x3b5b, 0x3a94, 0x39cd, 0x3ad6, 0x3ac1, 0x3b72, 0x3423, 0x32f1, 0x2c93, 0x3141, 0x3462, 0x3bd9, 0x3b8b, 0x2451, 0x3071, 0x3bd1, 0x3512, 0x372a, 0x38ce, 0x3892, 0x35cd, 0x388c, 0x3456, 0x2cb2, 0x26c2, 0x2df1, 0x38f2, 0x3427, 0x2cad, 0x34b5, 0x3285, 0x2e33, 0x31c7, 0x3948, 0x3634, 0x35b8, 0x3478, 0x375b, 0x38fb, +0x3769, 0x390b, 0x3880, 0x309e, 0x33bc, 0x3b8e, 0x3311, 0x3489, 0x29ff, 0x34ef, 0x3af6, 0x3ab2, 0x31b5, 0x398e, 0x3857, 0x2886, 0x3847, 0x3bd9, 0x37fc, 0x393c, 0x2c6d, 0x30df, 0x2e7b, 0x340e, 0x3bae, 0x3b5e, 0x38d1, 0x37b7, 0x3ab7, 0x356d, 0x3528, 0x2c58, 0x38db, 0x3951, 0x30c1, 0x394e, 0x3395, 0x3273, 0x329c, 0x3882, 0x2f1b, 0x3a6d, 0x3a2d, 0x3bdb, 0x3850, 0x3a43, 0x35ba, 0x3884, 0x3197, 0x2d5e, 0x3b30, 0x3393, 0x39c9, 0x3aa0, 0x2c7d, 0x2d28, 0x3776, 0x35ca, 0x34d1, 0x38f3, 0x327e, 0x3a71, 0x3a4f, 0x36bf, +0x30c3, 0x388e, 0x38d2, 0x2a3b, 0x2de6, 0x363d, 0x3adc, 0x3b64, 0x2889, 0x2e46, 0x3570, 0x3b46, 0x3549, 0x3b6c, 0x3afc, 0x3b07, 0x3bde, 0x35e3, 0x39d7, 0x3b0e, 0x303f, 0x2068, 0x37d4, 0x3bc9, 0x2d84, 0x367c, 0x3adb, 0x364f, 0x244b, 0x36fb, 0x3829, 0x34cc, 0x3aa4, 0x3507, 0x366e, 0x3333, 0x34b7, 0x3a84, 0x37db, 0x3a35, 0x26fe, 0x346a, 0x3b25, 0x37b7, 0x3a1f, 0x399d, 0x2c52, 0x3b8d, 0x3501, 0x3ac0, 0x3a06, 0x3af9, 0x36f8, 0x312c, 0x3990, 0x3af5, 0x3a91, 0x2db0, 0x39cc, 0x3221, 0x21d5, 0x36f2, 0x20c8, 0x3245, +0x399f, 0x2ed7, 0x39ea, 0x2c2f, 0x2e81, 0x3b28, 0x333b, 0x3a13, 0x357b, 0x387a, 0x34f2, 0x28d2, 0x33b8, 0x39e8, 0x38cc, 0x398d, 0x3258, 0x39fc, 0x31ab, 0x3883, 0x350a, 0x32f9, 0x3147, 0x395a, 0x3b60, 0x3a31, 0x2315, 0x2d1e, 0x37ab, 0x3b16, 0x3421, 0x35f0, 0x302d, 0x3ac8, 0x3955, 0x353b, 0x35ba, 0x3716, 0x3411, 0x2a1b, 0x35d2, 0x2d64, 0x3914, 0x3b78, 0x3438, 0x3791, 0x3b1f, 0x3813, 0x23f6, 0x3456, 0x36e6, 0x2716, 0x3afd, 0x31a8, 0x3495, 0x3389, 0x3a03, 0x3092, 0x3bf2, 0x3ae4, 0x2459, 0x3891, 0x395e, 0x2f91, +0x3b3a, 0x219a, 0x2846, 0x3ac4, 0x3921, 0x38cd, 0x35ca, 0x353f, 0x3939, 0x38ec, 0x36e4, 0x2df9, 0x387b, 0x398b, 0x2de2, 0x391a, 0x36d2, 0x38bd, 0x37c2, 0x361b, 0x3b55, 0x385e, 0x3606, 0x3ae3, 0x387e, 0x3349, 0x3639, 0x35e3, 0x3073, 0x39e8, 0x3563, 0x3ab8, 0x3880, 0x3648, 0x39ca, 0x3975, 0x3108, 0x2d94, 0x2f4d, 0x3be2, 0x2bb3, 0x3839, 0x3bdf, 0x3977, 0x3674, 0x3902, 0x3b1d, 0x3a40, 0x3524, 0x3be8, 0x3afa, 0x356b, 0x31e6, 0x3a0d, 0x3bb2, 0x3b82, 0x3b6b, 0x3672, 0x3626, 0x3b29, 0x32ed, 0x3961, 0x392e, 0x38a7, +0x2adc, 0x3114, 0x364a, 0x34cd, 0x302d, 0x35db, 0x336d, 0x31a2, 0x3a14, 0x3102, 0x21ad, 0x326c, 0x345d, 0x3885, 0x383d, 0x3bfd, 0x39a1, 0x37e3, 0x390c, 0x3903, 0x3b10, 0x34a2, 0x3312, 0x3b64, 0x3b64, 0x389d, 0x301e, 0x3b4c, 0x3971, 0x3a90, 0x3bd1, 0x38c5, 0x390b, 0x3819, 0x371a, 0x39ae, 0x3b1e, 0x393b, 0x378b, 0x3bd8, 0x3884, 0x370d, 0x3a16, 0x365f, 0x3102, 0x382e, 0x3415, 0x39bb, 0x39fb, 0x38c1, 0x37fe, 0x390e, 0x3a18, 0x1900, 0x3828, 0x3a0d, 0x301c, 0x3927, 0x3a15, 0x38d8, 0x36cb, 0x2b55, 0x336b, 0x3b0f, +0x3851, 0x37e9, 0x2dfa, 0x3aac, 0x3baa, 0x39af, 0x38c6, 0x392e, 0x364d, 0x3ab4, 0x247c, 0x3a0d, 0x3a7a, 0x39d1, 0x37fc, 0x370a, 0x351d, 0x392a, 0x351a, 0x3671, 0x3a9d, 0x2cd1, 0x3b16, 0x3b02, 0x1921, 0x39b2, 0x3afe, 0x35eb, 0x301d, 0x38cc, 0x3a67, 0x3986, 0x32fb, 0x3a9b, 0x3a10, 0x3a1a, 0x288d, 0x3afa, 0x3269, 0x3be1, 0x3822, 0x3923, 0x351a, 0x24a4, 0x3519, 0x3717, 0x383f, 0x3b3e, 0x39d0, 0x352e, 0x394a, 0x3532, 0x39fd, 0x39ae, 0x3818, 0x3aec, 0x3bfb, 0x267e, 0x2caf, 0x3b8b, 0x3432, 0x2dca, 0x3afa, 0x36b0 +}; diff --git a/tests/utils/y_input.h b/tests/utils/y_input.h new file mode 100644 index 00000000..c52a3fed --- /dev/null +++ b/tests/utils/y_input.h @@ -0,0 +1,106 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// Authors: Yvan Tortorella +// + +/* Header file generated by RedMulE Golden Model */ +uint16_t y_inp [6144] = { +0x334e, 0x3a40, 0x2629, 0x320a, 0x30f1, 0x3b24, 0x2515, 0x39b7, 0x3053, 0x3709, 0x38c6, 0x36d7, 0x32be, 0x393f, 0x335d, 0x3aed, 0x3881, 0x3a02, 0x3ac7, 0x35a7, 0x2fdc, 0x334a, 0x3870, 0x38f1, 0x2abf, 0x3b69, 0x3a4d, 0x3425, 0x3a5d, 0x3717, 0x387a, 0x3858, 0x39f8, 0x3619, 0x352f, 0x3b8d, 0x347b, 0x3637, 0x3188, 0x3382, 0x340f, 0x3181, 0x31d3, 0x390a, 0x32b7, 0x3bd3, 0x382b, 0x3ba7, 0x2cde, 0x3ab9, 0x3911, 0x3bef, 0x3677, 0x165b, 0x2d24, 0x3779, 0x3928, 0x213b, 0x3868, 0x3adc, 0x38de, 0x3a9c, 0x3a9e, 0x3858, +0x38c8, 0x3663, 0x2c0c, 0x3521, 0x3a22, 0x3bd0, 0x3908, 0x35af, 0x32e6, 0x3acf, 0x387a, 0x3865, 0x2c43, 0x3839, 0x33ab, 0x3a62, 0x3548, 0x383e, 0x3a12, 0x357b, 0x3b9e, 0x3823, 0x3825, 0x397b, 0x3bcf, 0x31e4, 0x3799, 0x32ad, 0x28d9, 0x3acc, 0x35cb, 0x35b7, 0x3a80, 0x3b70, 0x3475, 0x3b8a, 0x357d, 0x37d2, 0x2fb4, 0x301f, 0x3b15, 0x3a15, 0x34bd, 0x3abf, 0x38db, 0x2b71, 0x3a4a, 0x39d5, 0x3a16, 0x25d9, 0x3bb6, 0x3bf5, 0x38b4, 0x34cf, 0x383c, 0x306d, 0x37ec, 0x31a9, 0x3984, 0x37a3, 0x3440, 0x36a1, 0x3675, 0x2f08, +0x38b9, 0x2b09, 0x2c59, 0x3a99, 0x3068, 0x3501, 0x3b17, 0x3798, 0x38f2, 0x2c7f, 0x347f, 0x38a4, 0x321e, 0x39e9, 0x375c, 0x38db, 0x38d5, 0x3b65, 0x3863, 0x3712, 0x3976, 0x3090, 0x3944, 0x3b0c, 0x3b71, 0x23e1, 0x3985, 0x36cd, 0x3845, 0x39ea, 0x369e, 0x39a5, 0x388e, 0x36a0, 0x34fa, 0x2c23, 0x30d1, 0x3993, 0x38fb, 0x3b4c, 0x283d, 0x3423, 0x3009, 0x34b2, 0x38ee, 0x36ad, 0x3056, 0x22a0, 0x354e, 0x3aca, 0x324c, 0x38ac, 0x395d, 0x3058, 0x3b0e, 0x3b1b, 0x3a24, 0x36e2, 0x24b3, 0x39e9, 0x2ed6, 0x3834, 0x31d0, 0x3862, +0x348f, 0x340d, 0x368f, 0x3b2e, 0x3b48, 0x3579, 0x3029, 0x30ef, 0x3567, 0x2324, 0x2b48, 0x30b1, 0x33e9, 0x3730, 0x3bf5, 0x29c8, 0x3678, 0x317e, 0x3855, 0x3b26, 0x3499, 0x3529, 0x3108, 0x344a, 0x39d5, 0x3774, 0x3a36, 0x3b92, 0x34db, 0x3b7d, 0x3721, 0x37aa, 0x3726, 0x3b80, 0x35fa, 0x233e, 0x39f6, 0x3830, 0x35d3, 0x2232, 0x36c6, 0x3a20, 0x3670, 0x3bb9, 0x3bc0, 0x3951, 0x3a8c, 0x39f7, 0x391b, 0x39e8, 0x2b8b, 0x329a, 0x3afa, 0x33a6, 0x3397, 0x31a5, 0x3bf3, 0x3865, 0x37ed, 0x3483, 0x3bc7, 0x3842, 0x2698, 0x3b2a, +0x35ac, 0x3bbd, 0x382a, 0x3824, 0x2ace, 0x38f7, 0x3b95, 0x34c0, 0x2d14, 0x3415, 0x3830, 0x3aca, 0x351b, 0x3819, 0x3404, 0x3965, 0x3314, 0x3818, 0x2c73, 0x3558, 0x3bc3, 0x2ea2, 0x3b57, 0x372c, 0x3a3d, 0x3428, 0x388d, 0x3509, 0x3b5d, 0x399e, 0x3885, 0x36f2, 0x328e, 0x2c6c, 0x2a8c, 0x35b1, 0x3b18, 0x3700, 0x30ea, 0x36ae, 0x38f3, 0x3b2a, 0x30d9, 0x391b, 0x3812, 0x343e, 0x1434, 0x3a9d, 0x3bf5, 0x3b23, 0x3835, 0x397c, 0x3a04, 0x2c37, 0x2f18, 0x3a39, 0x371a, 0x3801, 0x246c, 0x33b6, 0x3803, 0x3a43, 0x38ee, 0x3a91, +0x39b1, 0x39d3, 0x2ef3, 0x36ed, 0x36ad, 0x38a6, 0x34ed, 0x2f88, 0x35f7, 0x3bda, 0x34de, 0x38c4, 0x36f1, 0x345d, 0x39ee, 0x3b02, 0x3b26, 0x3482, 0x2ec3, 0x3adf, 0x397d, 0x35da, 0x3828, 0x3a9a, 0x3364, 0x342c, 0x3acd, 0x2d11, 0x3907, 0x3645, 0x3a32, 0x39cf, 0x34a6, 0x38f6, 0x2b4f, 0x3a7a, 0x2e80, 0x3419, 0x340e, 0x28ce, 0x3b53, 0x353b, 0x39e8, 0x38b3, 0x35fd, 0x3b71, 0x3b10, 0x3ada, 0x3a06, 0x3bf0, 0x3a68, 0x374c, 0x3a28, 0x3847, 0x3992, 0x3375, 0x37e7, 0x2fc5, 0x3399, 0x3522, 0x3108, 0x36a3, 0x3955, 0x354d, +0x3a8f, 0x3ba8, 0x3a74, 0x386b, 0x39a7, 0x31a9, 0x34ca, 0x366f, 0x356d, 0x3a3b, 0x3676, 0x371c, 0x34f2, 0x36cf, 0x26bc, 0x199c, 0x35bd, 0x3ac9, 0x3919, 0x3392, 0x3bf6, 0x39d7, 0x395f, 0x22dd, 0x3a6f, 0x3095, 0x3a1a, 0x31c2, 0x31ae, 0x39cd, 0x3a7d, 0x3460, 0x3b65, 0x3b10, 0x3b04, 0x396a, 0x39b5, 0x31d6, 0x3add, 0x3758, 0x35e6, 0x386c, 0x3a99, 0x3bad, 0x24f0, 0x3153, 0x36b3, 0x39cf, 0x3788, 0x3962, 0x3acb, 0x301b, 0x354a, 0x32ec, 0x3894, 0x3bba, 0x382b, 0x358f, 0x3a59, 0x2ec1, 0x38ed, 0x37a8, 0x37e3, 0x3a02, +0x3aa7, 0x33ae, 0x3977, 0x3555, 0x36f4, 0x39f8, 0x381e, 0x2f6d, 0x3213, 0x30d1, 0x2d0a, 0x311d, 0x3812, 0x3037, 0x35c3, 0x3233, 0x336d, 0x2d4c, 0x3022, 0x3909, 0x354d, 0x3a58, 0x37c4, 0x3b92, 0x2e0d, 0x3a25, 0x3871, 0x3674, 0x3b5e, 0x3420, 0x312c, 0x34a5, 0x3a7f, 0x3324, 0x39c5, 0x3904, 0x1dee, 0x39de, 0x3029, 0x32da, 0x38f9, 0x353c, 0x35c4, 0x3b3c, 0x3a68, 0x3508, 0x35a6, 0x302f, 0x2806, 0x3b7f, 0x3895, 0x3b3f, 0x359c, 0x3b0c, 0x378c, 0x3424, 0x38b7, 0x2b8d, 0x3b35, 0x37c5, 0x32fa, 0x3aa5, 0x3a7b, 0x2e21, +0x3922, 0x36dc, 0x36d3, 0x3b8b, 0x3a90, 0x36c5, 0x3872, 0x3813, 0x396a, 0x3027, 0x3195, 0x3782, 0x3217, 0x3a01, 0x3bd9, 0x39cf, 0x3bea, 0x381e, 0x30e9, 0x392d, 0x3129, 0x3a83, 0x38b6, 0x38d8, 0x36fc, 0x39b8, 0x2cc5, 0x3b9a, 0x370c, 0x39aa, 0x2e32, 0x3a80, 0x38ea, 0x3649, 0x32bd, 0x3844, 0x3828, 0x2e94, 0x382b, 0x353a, 0x3bb9, 0x3a39, 0x3a61, 0x3b5a, 0x33b9, 0x35a9, 0x3a79, 0x377a, 0x3969, 0x35cb, 0x3483, 0x3b0c, 0x3b53, 0x3461, 0x3ae6, 0x381a, 0x3bc5, 0x35d0, 0x3b0d, 0x39de, 0x384c, 0x3b82, 0x3190, 0x36df, +0x2e64, 0x3588, 0x38f2, 0x35ec, 0x3085, 0x311b, 0x3b20, 0x3b46, 0x36b6, 0x381e, 0x3ba3, 0x3335, 0x3b5d, 0x3b7c, 0x3b06, 0x356d, 0x386c, 0x2d8c, 0x3bcd, 0x3024, 0x2906, 0x2dd1, 0x33b4, 0x3683, 0x1e9d, 0x39c9, 0x3b4e, 0x3976, 0x3b6c, 0x39bc, 0x343a, 0x3b07, 0x2af1, 0x383a, 0x2cb3, 0x3a94, 0x321d, 0x3bb6, 0x31ec, 0x3ba1, 0x3989, 0x336c, 0x3a85, 0x3a9d, 0x3be9, 0x3a81, 0x30b4, 0x3094, 0x395a, 0x30c6, 0x3aa1, 0x398d, 0x3b2c, 0x3845, 0x3633, 0x2c3b, 0x3808, 0x2a27, 0x3816, 0x387b, 0x39f4, 0x3507, 0x3b6c, 0x3ae5, +0x34ef, 0x3a3c, 0x3ad5, 0x39e5, 0x3a8c, 0x3850, 0x24dc, 0x3b5c, 0x3453, 0x3449, 0x3078, 0x30d5, 0x375e, 0x3901, 0x325e, 0x38e7, 0x376c, 0x32df, 0x39c2, 0x37b3, 0x33c5, 0x3669, 0x33f8, 0x34ad, 0x3b8c, 0x3742, 0x3831, 0x3a47, 0x2fc0, 0x3077, 0x26a3, 0x3410, 0x3be2, 0x306c, 0x3a3b, 0x3bb4, 0x3760, 0x38b6, 0x2e5d, 0x3a60, 0x3415, 0x3b20, 0x3935, 0x35e3, 0x33ae, 0x3b86, 0x1388, 0x3b7c, 0x3837, 0x2d4b, 0x3a1a, 0x346a, 0x311f, 0x3a92, 0x354e, 0x3786, 0x3328, 0x3a07, 0x338a, 0x39af, 0x39b5, 0x3b19, 0x388f, 0x30f7, +0x3648, 0x380a, 0x3984, 0x395c, 0x3702, 0x2ad3, 0x3b3e, 0x35ca, 0x2b7a, 0x39a8, 0x3966, 0x3acb, 0x3add, 0x3b54, 0x2285, 0x3bbf, 0x3a67, 0x393f, 0x3b14, 0x3a76, 0x30fb, 0x2492, 0x37d0, 0x3915, 0x2dbc, 0x36a7, 0x33f3, 0x3032, 0x2d42, 0x38e1, 0x336b, 0x3b4f, 0x2ebb, 0x35c8, 0x2c04, 0x3777, 0x2c2b, 0x3a08, 0x3615, 0x3424, 0x2c7e, 0x3b53, 0x361d, 0x364c, 0x3b63, 0x3b1f, 0x3653, 0x2a0a, 0x38c1, 0x3a35, 0x38fa, 0x39b0, 0x2ea5, 0x39f1, 0x340f, 0x3873, 0x3a39, 0x3826, 0x3853, 0x359b, 0x3b5f, 0x344a, 0x3a42, 0x30d3, +0x382a, 0x37e4, 0x2a05, 0x373b, 0x315c, 0x2aae, 0x3471, 0x3948, 0x346d, 0x3b4f, 0x2d18, 0x3518, 0x3554, 0x386a, 0x3272, 0x374b, 0x3321, 0x393c, 0x33f0, 0x38a5, 0x3957, 0x357e, 0x3a0c, 0x3ac7, 0x3b1d, 0x395d, 0x398a, 0x3a6e, 0x3baf, 0x38b2, 0x37ec, 0x3233, 0x3bd6, 0x3481, 0x39de, 0x26e3, 0x2f66, 0x3b84, 0x3a5a, 0x38f3, 0x387e, 0x322b, 0x2169, 0x3988, 0x3932, 0x22a9, 0x3162, 0x3b76, 0x2632, 0x3af3, 0x3827, 0x30e6, 0x32f7, 0x29a2, 0x3a2a, 0x3885, 0x39b6, 0x3540, 0x3abd, 0x3832, 0x34c8, 0x3a35, 0x3ae9, 0x31fd, +0x3839, 0x378c, 0x3862, 0x3095, 0x36ff, 0x36dc, 0x293b, 0x2c4e, 0x3618, 0x357c, 0x343e, 0x3a8d, 0x39f0, 0x3294, 0x3859, 0x27e7, 0x3676, 0x39c7, 0x38ef, 0x37e3, 0x3b34, 0x3b78, 0x3ae2, 0x35b7, 0x3b88, 0x3bd6, 0x3478, 0x3b95, 0x3894, 0x2fab, 0x3687, 0x3605, 0x38ed, 0x38b8, 0x3b9d, 0x27f6, 0x3ba9, 0x3a89, 0x3308, 0x2658, 0x3864, 0x3770, 0x3a8a, 0x38fd, 0x345e, 0x3541, 0x3b3a, 0x3833, 0x3a62, 0x3a26, 0x3a8a, 0x3b96, 0x37b9, 0x33fb, 0x322b, 0x3217, 0x34dc, 0x39a4, 0x3bd8, 0x33b6, 0x3696, 0x368f, 0x3bb6, 0x39a4, +0x3b6e, 0x38ef, 0x3044, 0x2ec4, 0x39fd, 0x3ae4, 0x366c, 0x33d7, 0x3b7e, 0x33c8, 0x3953, 0x376a, 0x3535, 0x3243, 0x388f, 0x3601, 0x3bf7, 0x3397, 0x3bfa, 0x36dc, 0x32e3, 0x1edc, 0x3770, 0x391c, 0x384d, 0x3a33, 0x37a4, 0x3997, 0x37f1, 0x3929, 0x35f3, 0x39a6, 0x2c0e, 0x3a0d, 0x2d8a, 0x3863, 0x2eb6, 0x34fe, 0x3a39, 0x3a75, 0x2ba6, 0x3394, 0x3326, 0x3329, 0x32d3, 0x3bb7, 0x351d, 0x38de, 0x3889, 0x38ea, 0x2ea1, 0x36aa, 0x2ec7, 0x3926, 0x3505, 0x37f5, 0x35b5, 0x3b94, 0x3679, 0x36b6, 0x3a14, 0x3add, 0x2f3b, 0x355f, +0x2fcf, 0x3939, 0x2941, 0x3a9a, 0x39d0, 0x3b59, 0x3904, 0x3b16, 0x2a30, 0x399a, 0x3b1a, 0x2e62, 0x392e, 0x35d4, 0x289a, 0x3456, 0x3315, 0x356d, 0x347a, 0x3882, 0x326e, 0x3a22, 0x2ee6, 0x26a0, 0x2119, 0x3468, 0x3a9d, 0x35aa, 0x3840, 0x36a1, 0x3a76, 0x253b, 0x3b69, 0x3a7b, 0x2444, 0x22a4, 0x322f, 0x38bc, 0x2e1f, 0x3821, 0x3ba6, 0x2c72, 0x3b09, 0x3a60, 0x34a8, 0x35f2, 0x35aa, 0x3441, 0x35f5, 0x3945, 0x39c2, 0x3160, 0x39ce, 0x3a06, 0x32a0, 0x3582, 0x36c9, 0x3967, 0x31c8, 0x3819, 0x3a6c, 0x3b57, 0x3206, 0x3a5a, +0x36d4, 0x39f6, 0x3617, 0x34dd, 0x3052, 0x3243, 0x33b5, 0x38ee, 0x3ada, 0x328e, 0x3535, 0x2d8b, 0x3a0f, 0x2dab, 0x36b3, 0x300c, 0x2f0e, 0x2dd7, 0x3849, 0x3927, 0x3a4b, 0x3a81, 0x31e2, 0x3497, 0x3211, 0x2fc8, 0x3658, 0x391b, 0x3a74, 0x32eb, 0x35ca, 0x382e, 0x3b76, 0x30a9, 0x302a, 0x3be2, 0x3a3d, 0x39a4, 0x3b82, 0x3279, 0x35ec, 0x3bc3, 0x3ac5, 0x3484, 0x3734, 0x32f9, 0x3aab, 0x38fd, 0x3b09, 0x2134, 0x3408, 0x2f12, 0x3668, 0x3abe, 0x34c1, 0x390f, 0x2eca, 0x39a4, 0x3bf0, 0x3015, 0x2ea4, 0x2d2b, 0x2de4, 0x3090, +0x37ac, 0x2f8b, 0x3815, 0x364f, 0x3a98, 0x3b25, 0x3256, 0x39bd, 0x3aa4, 0x38c5, 0x3621, 0x3271, 0x3ad0, 0x2d6c, 0x38ea, 0x3af6, 0x38bd, 0x3b9b, 0x30b7, 0x34c7, 0x395d, 0x358b, 0x3b7e, 0x3a3b, 0x349f, 0x26bd, 0x3450, 0x31a3, 0x3b5a, 0x2c24, 0x3abd, 0x398f, 0x3087, 0x345f, 0x3752, 0x3a6c, 0x3937, 0x3325, 0x392a, 0x3518, 0x3adb, 0x38e0, 0x37c0, 0x26fa, 0x2bf1, 0x3782, 0x3b84, 0x397b, 0x2774, 0x32e5, 0x23c4, 0x33e4, 0x378f, 0x2fe5, 0x2f21, 0x3001, 0x3bc9, 0x3a3c, 0x38bd, 0x38d0, 0x363b, 0x3a8a, 0x3687, 0x2e6a, +0x3bef, 0x3b90, 0x3712, 0x30f7, 0x3be2, 0x2621, 0x39dd, 0x3932, 0x373f, 0x398f, 0x3937, 0x34c3, 0x3a34, 0x2e3d, 0x3bb3, 0x361a, 0x36b9, 0x2c6a, 0x38de, 0x39a1, 0x395f, 0x280c, 0x371b, 0x33c3, 0x2d37, 0x389e, 0x2ddc, 0x2bd2, 0x3471, 0x34e3, 0x36de, 0x305f, 0x3ab5, 0x3514, 0x327b, 0x309e, 0x360c, 0x2d09, 0x3b2a, 0x3b49, 0x38b0, 0x37b3, 0x2f97, 0x3ad7, 0x38a2, 0x351c, 0x3bdf, 0x3877, 0x3ad6, 0x3b26, 0x3ba5, 0x3318, 0x3bd7, 0x3907, 0x3983, 0x33b6, 0x34b7, 0x3bf5, 0x38e7, 0x3b82, 0x2d0e, 0x3a8b, 0x382b, 0x3594, +0x2f6f, 0x3667, 0x3a56, 0x2f88, 0x3b3f, 0x3b82, 0x2dbf, 0x379b, 0x386a, 0x39e3, 0x3320, 0x39aa, 0x3821, 0x38db, 0x337b, 0x384b, 0x3a06, 0x3a5f, 0x182f, 0x35e2, 0x3b22, 0x1e2a, 0x3b64, 0x35b2, 0x3884, 0x360c, 0x36b1, 0x3928, 0x36fa, 0x358c, 0x396f, 0x366f, 0x3986, 0x3a4f, 0x381c, 0x301a, 0x38fe, 0x36e1, 0x34d1, 0x3b30, 0x36ac, 0x3803, 0x3888, 0x38d9, 0x3853, 0x35d6, 0x3469, 0x39da, 0x3829, 0x355c, 0x3803, 0x3834, 0x3a1d, 0x35e3, 0x397d, 0x2f1a, 0x3b10, 0x3486, 0x3b0b, 0x3b2f, 0x38b6, 0x3690, 0x3b7b, 0x39b1, +0x385b, 0x3bad, 0x3102, 0x32ef, 0x39e2, 0x37dd, 0x2d05, 0x3a1b, 0x3bd5, 0x30d5, 0x3131, 0x2c1d, 0x3a47, 0x386e, 0x3481, 0x2530, 0x351b, 0x34e2, 0x336d, 0x35c2, 0x331d, 0x38cf, 0x2d9a, 0x394b, 0x296b, 0x3401, 0x386d, 0x34d5, 0x37a2, 0x3bd2, 0x39c2, 0x2756, 0x2553, 0x3289, 0x38f0, 0x3af7, 0x3791, 0x3b28, 0x37e3, 0x39b7, 0x3ba9, 0x3404, 0x3755, 0x3a3b, 0x2f50, 0x38c1, 0x3761, 0x2ded, 0x3ba6, 0x318f, 0x3a6f, 0x39fd, 0x3b99, 0x31bd, 0x3821, 0x3bd8, 0x3b96, 0x3a18, 0x383c, 0x1baa, 0x3acb, 0x391d, 0x3149, 0x307f, +0x3836, 0x2d47, 0x3b56, 0x346f, 0x3a5e, 0x2bb4, 0x3819, 0x2f90, 0x3a5d, 0x38fe, 0x2fff, 0x39bb, 0x3b8d, 0x3901, 0x37cf, 0x38dc, 0x3690, 0x3b45, 0x3101, 0x3bbf, 0x3b00, 0x28a7, 0x3a4d, 0x3a90, 0x3b87, 0x3b1f, 0x35c6, 0x37af, 0x3796, 0x3beb, 0x3a72, 0x3887, 0x284e, 0x3b05, 0x32e5, 0x3837, 0x39b3, 0x36e8, 0x3b7d, 0x3726, 0x2899, 0x3b90, 0x33d7, 0x357f, 0x388e, 0x2ec2, 0x3b1e, 0x393b, 0x3ac7, 0x3844, 0x3612, 0x3a08, 0x319d, 0x38da, 0x3a50, 0x3abd, 0x3451, 0x3b78, 0x2dcf, 0x21b8, 0x3505, 0x3492, 0x3aa2, 0x304d, +0x3999, 0x3af3, 0x3966, 0x35d5, 0x3325, 0x3a6b, 0x34b8, 0x3123, 0x37d6, 0x3bb6, 0x3818, 0x39df, 0x3463, 0x34b6, 0x3739, 0x38a3, 0x38ea, 0x39fb, 0x3774, 0x38e1, 0x39dd, 0x3194, 0x3a69, 0x38cf, 0x3a3f, 0x3870, 0x3b80, 0x2e42, 0x3792, 0x3778, 0x34df, 0x3453, 0x3840, 0x3bf1, 0x37d9, 0x3798, 0x2ca7, 0x3a7e, 0x3240, 0x3250, 0x3a08, 0x2f88, 0x3bcf, 0x3ad6, 0x3919, 0x1a97, 0x37d2, 0x331a, 0x34d9, 0x38b5, 0x367d, 0x305f, 0x38f8, 0x347e, 0x31ed, 0x3b4c, 0x3950, 0x3976, 0x3297, 0x3bc8, 0x3950, 0x3759, 0x28b8, 0x3323, +0x38c4, 0x33cd, 0x2ef0, 0x2eba, 0x32dd, 0x3a41, 0x307d, 0x2a3c, 0x3b22, 0x33fa, 0x32f7, 0x3b54, 0x30e8, 0x3a5e, 0x3b0d, 0x349f, 0x3a5b, 0x3bc0, 0x38a0, 0x3247, 0x3444, 0x357e, 0x3611, 0x26f3, 0x3b63, 0x3a31, 0x3a65, 0x385b, 0x3b77, 0x34fc, 0x380c, 0x38fb, 0x36dd, 0x39e6, 0x3719, 0x2e8c, 0x3407, 0x3161, 0x39ac, 0x3842, 0x37cc, 0x3a17, 0x3452, 0x35c1, 0x3a5b, 0x39bd, 0x38a0, 0x39c2, 0x30ac, 0x345e, 0x3710, 0x3b30, 0x3038, 0x2b7a, 0x2494, 0x1db7, 0x3b83, 0x32a0, 0x3b2f, 0x3ac1, 0x3512, 0x3662, 0x3656, 0x3470, +0x3524, 0x3bbb, 0x3650, 0x3878, 0x3928, 0x36c2, 0x34aa, 0x3ae7, 0x36c1, 0x3a35, 0x36f7, 0x2fe3, 0x2d17, 0x302d, 0x310f, 0x3260, 0x3826, 0x3162, 0x36f0, 0x3bf7, 0x3918, 0x2bdb, 0x35fd, 0x3984, 0x314d, 0x2400, 0x3867, 0x3926, 0x2cf4, 0x3958, 0x38e1, 0x3876, 0x393d, 0x369f, 0x3709, 0x39b7, 0x2960, 0x3aaf, 0x35fc, 0x3bf7, 0x390b, 0x34f5, 0x3856, 0x3171, 0x3895, 0x1e18, 0x323e, 0x389c, 0x3970, 0x28af, 0x3bd3, 0x3489, 0x3955, 0x3544, 0x36c8, 0x34d7, 0x38cf, 0x2c56, 0x3409, 0x320d, 0x1f86, 0x3a18, 0x3385, 0x3082, +0x3574, 0x2cd1, 0x392c, 0x3681, 0x39f6, 0x397c, 0x29bb, 0x3615, 0x2e16, 0x3b61, 0x390d, 0x318e, 0x31f0, 0x3836, 0x3ad6, 0x27dd, 0x3924, 0x2e6b, 0x37f0, 0x3460, 0x396a, 0x35e9, 0x2241, 0x34d7, 0x3a17, 0x3482, 0x28f3, 0x2802, 0x3a32, 0x3aea, 0x38ad, 0x3932, 0x3acb, 0x36ca, 0x3bdf, 0x292d, 0x3abe, 0x39f0, 0x38a5, 0x33e8, 0x2dbb, 0x3b56, 0x381c, 0x3ae0, 0x38c6, 0x268f, 0x3791, 0x338e, 0x3585, 0x2e4b, 0x3b3b, 0x34d4, 0x3959, 0x3acc, 0x3532, 0x375c, 0x378e, 0x369f, 0x3755, 0x34cd, 0x38a4, 0x301d, 0x31be, 0x3baf, +0x2f01, 0x385e, 0x36cb, 0x3705, 0x3554, 0x3813, 0x3936, 0x384a, 0x397e, 0x3851, 0x3711, 0x3992, 0x38f1, 0x399b, 0x3650, 0x3951, 0x2f57, 0x3a85, 0x3be3, 0x3899, 0x38bd, 0x3952, 0x3826, 0x3897, 0x3ac0, 0x39ae, 0x3b07, 0x3297, 0x331e, 0x38d3, 0x396a, 0x3a4a, 0x3646, 0x3ae4, 0x3824, 0x3598, 0x33d8, 0x3945, 0x371a, 0x3509, 0x3b58, 0x3806, 0x39a1, 0x3aee, 0x389b, 0x39e3, 0x3b5a, 0x3754, 0x3ab7, 0x37ee, 0x2e4f, 0x38f7, 0x38f0, 0x3241, 0x3a33, 0x395a, 0x3659, 0x2d3c, 0x2d66, 0x3850, 0x3b82, 0x39f2, 0x3bca, 0x37a0, +0x3adc, 0x3975, 0x3168, 0x39eb, 0x3b70, 0x2ece, 0x31ff, 0x3623, 0x1cca, 0x380a, 0x3bc0, 0x370c, 0x38dc, 0x3b80, 0x375d, 0x372c, 0x3b52, 0x3b67, 0x37d7, 0x2c50, 0x39f6, 0x39a0, 0x392b, 0x343d, 0x3b2c, 0x3816, 0x2bd5, 0x389b, 0x37a1, 0x32c6, 0x37bc, 0x3b7c, 0x358c, 0x30b0, 0x3bd7, 0x3a6e, 0x37de, 0x3330, 0x2e8a, 0x353c, 0x3b3d, 0x3956, 0x3bcf, 0x301e, 0x36ad, 0x3a37, 0x3b42, 0x383e, 0x36d1, 0x3a53, 0x3bba, 0x2ac8, 0x394c, 0x3b04, 0x3460, 0x3642, 0x38d4, 0x26da, 0x3989, 0x3aad, 0x380d, 0x3a1b, 0x3638, 0x355e, +0x3b4b, 0x310e, 0x35b0, 0x2efd, 0x39bc, 0x3ba9, 0x3a07, 0x34c8, 0x2c21, 0x3aa7, 0x37aa, 0x35c8, 0x2db5, 0x352c, 0x38a7, 0x37ef, 0x3323, 0x3a2f, 0x32da, 0x33a6, 0x3226, 0x3053, 0x39cc, 0x349c, 0x2821, 0x3b7b, 0x2c88, 0x354f, 0x3a0b, 0x3b10, 0x3a6e, 0x3949, 0x360c, 0x3bb1, 0x3bc1, 0x3888, 0x3402, 0x3102, 0x3511, 0x3b3c, 0x38ba, 0x335a, 0x27b9, 0x3215, 0x389c, 0x37a2, 0x346f, 0x39cf, 0x3a60, 0x37f1, 0x3426, 0x3bd7, 0x3be2, 0x3910, 0x3b40, 0x3a0e, 0x3aad, 0x32da, 0x37af, 0x3bb5, 0x36ad, 0x3262, 0x2aae, 0x3085, +0x3a1e, 0x388c, 0x38ab, 0x3742, 0x2393, 0x3b6b, 0x3a53, 0x3b0d, 0x2d23, 0x3354, 0x38eb, 0x3a07, 0x377a, 0x3bb6, 0x3328, 0x3873, 0x3a9e, 0x36df, 0x32ad, 0x3345, 0x31d5, 0x359f, 0x221b, 0x3a16, 0x35d0, 0x361a, 0x3aac, 0x3b79, 0x38b5, 0x3a28, 0x3700, 0x3b8e, 0x3aca, 0x35e8, 0x396e, 0x39b7, 0x36ad, 0x2aa7, 0x3b8b, 0x372d, 0x2ae7, 0x3a7f, 0x3b58, 0x3861, 0x3b16, 0x329a, 0x3b6a, 0x334e, 0x3aa7, 0x30a9, 0x3385, 0x3bb4, 0x32fa, 0x2a3a, 0x3540, 0x2ef0, 0x303b, 0x387c, 0x38fc, 0x380f, 0x39fe, 0x2e69, 0x3849, 0x32a0, +0x38f2, 0x3851, 0x37e4, 0x2540, 0x3975, 0x2eff, 0x361f, 0x3392, 0x347c, 0x36fd, 0x3bcd, 0x3af0, 0x3944, 0x3867, 0x2ce0, 0x3757, 0x1ca3, 0x3acf, 0x3baf, 0x3bf8, 0x365b, 0x3920, 0x2aa7, 0x3b21, 0x3408, 0x3720, 0x3ae0, 0x3845, 0x3a03, 0x24b4, 0x390f, 0x1cdd, 0x34f8, 0x3437, 0x3b5b, 0x39d4, 0x3885, 0x3418, 0x3ace, 0x387c, 0x32b3, 0x30dc, 0x392a, 0x330a, 0x2aa0, 0x3432, 0x3b83, 0x32f1, 0x2d12, 0x3639, 0x3909, 0x3a99, 0x384a, 0x3509, 0x3472, 0x3896, 0x2c46, 0x37ee, 0x3a2c, 0x2cf3, 0x3bc9, 0x3b86, 0x3b7a, 0x364d, +0x38bb, 0x34d8, 0x3787, 0x3789, 0x3a42, 0x2703, 0x3849, 0x328f, 0x38ce, 0x2b0b, 0x3bdb, 0x2e3d, 0x34e2, 0x3bfa, 0x371c, 0x3a3c, 0x350c, 0x39b8, 0x3903, 0x3a6c, 0x3666, 0x2c34, 0x3566, 0x3b12, 0x31ef, 0x39ea, 0x2b79, 0x3924, 0x299f, 0x2c72, 0x302f, 0x2d50, 0x36f2, 0x3bbc, 0x3b41, 0x39be, 0x3b2f, 0x3061, 0x37a2, 0x3571, 0x3ae0, 0x32a5, 0x3740, 0x3a56, 0x3734, 0x2eee, 0x39b7, 0x36d9, 0x3494, 0x34c1, 0x3141, 0x2e0f, 0x36db, 0x3884, 0x2e5e, 0x3a3f, 0x31e4, 0x3118, 0x3789, 0x3722, 0x3a1f, 0x3989, 0x3afc, 0x32ca, +0x391a, 0x38ae, 0x2eaf, 0x38c0, 0x37b2, 0x3842, 0x3978, 0x39b0, 0x3b70, 0x3455, 0x3b54, 0x3ae3, 0x3b2b, 0x34af, 0x2db7, 0x3b6f, 0x3a31, 0x3a1e, 0x3ab3, 0x355b, 0x3a4d, 0x333e, 0x3069, 0x3b8a, 0x39b1, 0x3509, 0x387f, 0x3b22, 0x3a91, 0x38c3, 0x3b78, 0x3459, 0x38a9, 0x32ff, 0x3230, 0x3af4, 0x39da, 0x30c9, 0x3b51, 0x380d, 0x3726, 0x360e, 0x2816, 0x3308, 0x3a3c, 0x37f9, 0x37ee, 0x30ea, 0x3903, 0x3514, 0x398e, 0x35de, 0x39cf, 0x3a63, 0x3af0, 0x2732, 0x380a, 0x3548, 0x26b0, 0x38d7, 0x38e2, 0x3935, 0x3a8d, 0x315a, +0x3b20, 0x389a, 0x3ade, 0x3bc4, 0x3654, 0x36c7, 0x271b, 0x38bb, 0x315c, 0x3728, 0x340f, 0x380d, 0x2cbc, 0x3adb, 0x299c, 0x365f, 0x39f6, 0x338d, 0x31d9, 0x3aa7, 0x3494, 0x349d, 0x3ae8, 0x3020, 0x3abb, 0x3949, 0x3747, 0x366b, 0x2d3f, 0x35c9, 0x3b18, 0x3a34, 0x38e6, 0x284a, 0x37bd, 0x32f3, 0x35d7, 0x3782, 0x3ab9, 0x3832, 0x3002, 0x3bdb, 0x30e9, 0x39a5, 0x3a89, 0x3a6f, 0x3a07, 0x3bb9, 0x3687, 0x3865, 0x35d8, 0x3a83, 0x37d6, 0x3827, 0x3a45, 0x3962, 0x35df, 0x2ea9, 0x3955, 0x3582, 0x37ad, 0x3382, 0x3507, 0x3966, +0x2c40, 0x37ef, 0x31ad, 0x39ff, 0x2863, 0x3a05, 0x2932, 0x2e97, 0x3153, 0x3b3e, 0x3237, 0x3b24, 0x3262, 0x3ba3, 0x3b37, 0x3a33, 0x2499, 0x3661, 0x2a11, 0x3618, 0x2a3f, 0x39e2, 0x1c4a, 0x3a51, 0x2d39, 0x3268, 0x2f51, 0x341e, 0x39f9, 0x3833, 0x32a3, 0x3952, 0x37ce, 0x39d2, 0x2d87, 0x320f, 0x34e6, 0x3840, 0x3684, 0x318b, 0x3460, 0x39ca, 0x386f, 0x2979, 0x3ba1, 0x3a8c, 0x3341, 0x3845, 0x3acd, 0x2b68, 0x2827, 0x3547, 0x2e0a, 0x39db, 0x381b, 0x3969, 0x3501, 0x38d4, 0x3ba7, 0x35f7, 0x351b, 0x3285, 0x3861, 0x3957, +0x36e2, 0x32c4, 0x3581, 0x3bb7, 0x3b2f, 0x3a00, 0x3609, 0x3ab8, 0x3b09, 0x34c6, 0x391e, 0x3257, 0x3b08, 0x3bc0, 0x364f, 0x3910, 0x3a1f, 0x37c2, 0x3522, 0x34c6, 0x3bb9, 0x38ba, 0x2f63, 0x38c3, 0x38a6, 0x3436, 0x3af1, 0x346f, 0x3774, 0x3b0c, 0x3409, 0x3b6c, 0x3394, 0x3a2f, 0x3abc, 0x2ea9, 0x3501, 0x3a31, 0x2edc, 0x341e, 0x3be5, 0x3a01, 0x3372, 0x3814, 0x3b88, 0x3811, 0x3956, 0x3bc0, 0x338b, 0x3075, 0x3957, 0x3ba1, 0x2f43, 0x386d, 0x388f, 0x376c, 0x3a09, 0x38b2, 0x3a12, 0x3a4d, 0x2eb5, 0x3afc, 0x3477, 0x349d, +0x3403, 0x35e8, 0x3a01, 0x37c2, 0x3a3c, 0x3ab6, 0x3165, 0x3bd0, 0x3832, 0x36c7, 0x38be, 0x38fb, 0x3916, 0x3574, 0x31b1, 0x3b73, 0x3635, 0x38f4, 0x32ac, 0x25c6, 0x38f2, 0x248f, 0x3ae9, 0x384f, 0x374a, 0x3bf2, 0x3bf5, 0x3719, 0x3b78, 0x3688, 0x2ed4, 0x3443, 0x305c, 0x390d, 0x38d0, 0x34dd, 0x3662, 0x3902, 0x3752, 0x3b76, 0x347b, 0x356c, 0x3809, 0x3b59, 0x3a41, 0xbb1, 0x3872, 0x362e, 0x3669, 0x3741, 0x3a79, 0x3560, 0x1ca8, 0x38da, 0x3901, 0x34a3, 0x3b63, 0x391c, 0x3990, 0x39af, 0x3bd2, 0x3afb, 0x3b68, 0x354e, +0x39ba, 0x35ca, 0x3483, 0x3aaf, 0x3489, 0x2fbe, 0x38e7, 0x3678, 0x3928, 0x2358, 0x372e, 0x37d9, 0x3929, 0x3695, 0x3607, 0x2c73, 0x37d7, 0x39ee, 0x3acd, 0x3898, 0x3580, 0x3bd5, 0x3a67, 0x2f13, 0x388d, 0x3a39, 0x2d6e, 0x389d, 0x359d, 0x37a3, 0x37f4, 0x31bf, 0x36cb, 0x3bc2, 0x3b4d, 0x3077, 0x35d8, 0x3afb, 0x36bf, 0x31c7, 0x36b7, 0x3ac9, 0x2076, 0x2f55, 0x392e, 0x348d, 0x305e, 0x3a4b, 0x36e3, 0x3acf, 0x34e2, 0x396a, 0x3785, 0x3bf8, 0x354d, 0x36bd, 0x395c, 0x3313, 0x39ad, 0x2ede, 0x3561, 0x3a82, 0x30bb, 0x34fc, +0x2fae, 0x3b98, 0x36c8, 0x3ad8, 0x3813, 0x39f3, 0x3bc3, 0x3b85, 0x3aa0, 0x3a09, 0x368a, 0x2ddb, 0x39d7, 0x32f6, 0x3b8c, 0x3b51, 0x39bd, 0x3680, 0x3b92, 0x3825, 0x3798, 0x3a62, 0x3847, 0x3a30, 0x393e, 0x38de, 0x38e9, 0x3a64, 0x3a29, 0x3a25, 0x386e, 0x315f, 0x2de2, 0x3be7, 0x3bc1, 0x35ef, 0x35bb, 0x3968, 0x3a64, 0x34ff, 0x3766, 0x3b8e, 0x3657, 0x344a, 0x2cd0, 0x377c, 0x3881, 0x3456, 0x350b, 0x3a5f, 0x3b5f, 0x3960, 0x3767, 0x38b4, 0x3729, 0x3b19, 0x35c4, 0x3bc1, 0x32d9, 0x3185, 0x3b32, 0x3108, 0x3775, 0x3b82, +0x3803, 0x38e2, 0x3aa4, 0x3b1e, 0x30a1, 0x3bc1, 0x3b4d, 0x36ad, 0x2192, 0x2837, 0x3b53, 0x3ab8, 0x3883, 0x3b36, 0x3418, 0x3ac1, 0x3589, 0x38ae, 0x3614, 0x3172, 0x2e48, 0x3b6a, 0x39f1, 0x3828, 0x3550, 0x2cf0, 0x39ac, 0x2bcb, 0x38e9, 0x3498, 0x3a3a, 0x307f, 0x3887, 0x2675, 0x3705, 0x371e, 0x3982, 0x3ba9, 0x38d0, 0x39f8, 0x3413, 0x3483, 0x32b8, 0x3720, 0x357d, 0x39b4, 0x39bf, 0x38c8, 0x3550, 0x3071, 0x39f2, 0x29ae, 0x2348, 0x3ae3, 0x3792, 0x3b98, 0x3b40, 0x390a, 0x38e3, 0x3a78, 0x3875, 0x3a63, 0x39e2, 0x3b24, +0x3288, 0x35c4, 0x35b4, 0x3a60, 0x31d2, 0x39ca, 0x2527, 0x3445, 0x3b44, 0x315b, 0x2553, 0x3453, 0x2ddd, 0x3889, 0x2897, 0x37da, 0x3553, 0x3826, 0x39a0, 0x38b1, 0x2681, 0x38f4, 0x351c, 0x3bdf, 0x3ac9, 0x3a44, 0x37fd, 0x394c, 0x2f46, 0x28ca, 0x3097, 0x30f2, 0x3830, 0x3711, 0x36ba, 0x3ba8, 0x3570, 0x38b5, 0x3943, 0x398d, 0x3994, 0x3109, 0x30dc, 0x3a40, 0x3648, 0x2050, 0x329e, 0x3432, 0x35b8, 0x3667, 0x3b4a, 0x29fe, 0x35cc, 0x3675, 0x3b8e, 0x34cb, 0x3531, 0x2acc, 0x395d, 0x3411, 0x3a65, 0x3a30, 0x35f6, 0x3710, +0x364f, 0x2f34, 0x38d8, 0x39d5, 0x2e37, 0x350d, 0x39fe, 0x37ed, 0x3726, 0x3a6b, 0x3b6f, 0x35ce, 0x38bc, 0x3929, 0x33d7, 0x28ef, 0x38d7, 0x35df, 0x3ac8, 0x333d, 0x2356, 0x35d5, 0x377b, 0x3bca, 0x3ad7, 0x309f, 0x36d3, 0x2bf6, 0x373f, 0x2c5f, 0x374a, 0x35f0, 0x397a, 0x34fc, 0x2dd8, 0x3947, 0x3bcc, 0x3bfb, 0x3366, 0x3721, 0x310a, 0x3433, 0x391e, 0x375e, 0x367c, 0x3a07, 0x3873, 0x34d6, 0x2f47, 0x3771, 0x3a83, 0x3bee, 0x36d7, 0x3b2f, 0x39be, 0x305e, 0x21cc, 0x2e70, 0x388c, 0x34f2, 0x393b, 0x3610, 0x3a59, 0x3294, +0x2fa8, 0x3343, 0x3740, 0x38e3, 0x3a0c, 0x302d, 0x3ba9, 0x34f1, 0x3879, 0x29cc, 0x35e0, 0x31d0, 0x381b, 0x3bcd, 0x35a5, 0x3a87, 0x369d, 0x35b9, 0x2eba, 0x3992, 0x3ae3, 0x393c, 0x3a39, 0x31b2, 0x3b4d, 0x3868, 0x364a, 0x3164, 0x348c, 0x30c8, 0x3bd3, 0x3a96, 0x3570, 0x31ce, 0x357f, 0x1fb0, 0x3a40, 0x38bd, 0x2802, 0x376e, 0x35c3, 0x3264, 0x33ac, 0x3878, 0x3a0c, 0x3a25, 0x38cb, 0x247a, 0x384b, 0x3a58, 0x357c, 0x36af, 0x384a, 0x3b93, 0x3a46, 0x348b, 0x3526, 0x3be8, 0x316c, 0x385c, 0x3a41, 0x3b4d, 0x3045, 0x3a20, +0x3870, 0x3523, 0x38c0, 0x3636, 0x390a, 0x38f2, 0x2b41, 0x261a, 0x380e, 0x3a74, 0x331a, 0x30ae, 0x37dd, 0x328c, 0x3a1c, 0x2fc0, 0x3994, 0x3095, 0x3900, 0x2cc8, 0x38ec, 0x3bdc, 0x3820, 0x2b39, 0x3422, 0x38be, 0x3a1f, 0x3b2b, 0x38e6, 0x3839, 0x3afc, 0x3bb4, 0x3422, 0x3b0f, 0x38f1, 0x3b5d, 0x39be, 0x341a, 0x374f, 0x31fe, 0x38bc, 0x38ff, 0x32d3, 0x38a0, 0x3894, 0x396b, 0x395e, 0x3b0e, 0x39c2, 0x2f3e, 0x2d76, 0x38c5, 0x3365, 0x3685, 0x2d08, 0x3a5b, 0x3693, 0x2e6e, 0x3b1a, 0x39bf, 0x347b, 0x2e04, 0x3b7a, 0x3b02, +0x3b57, 0x36ac, 0x32d3, 0x2273, 0x33a6, 0x3542, 0x38d4, 0x3a1c, 0x3811, 0x33d8, 0x3b79, 0x390c, 0x2c29, 0x3858, 0x395d, 0x38d9, 0x343a, 0x3148, 0x3715, 0x3966, 0x2fc6, 0x318e, 0x3784, 0x383e, 0x354d, 0x35a8, 0x38c7, 0x3662, 0x32d3, 0x37be, 0x396a, 0x39a3, 0x39fd, 0x3b0f, 0x3bf3, 0x3a7b, 0x38d5, 0x3343, 0x3ae6, 0x3926, 0x3a7a, 0x3744, 0x3acb, 0x39b8, 0x3ab1, 0x3bad, 0x392a, 0x390c, 0x2f37, 0x2ab5, 0x2935, 0x384a, 0x3235, 0x38d2, 0x360d, 0x38de, 0x3948, 0x383f, 0x241a, 0x3bb0, 0x36cb, 0x3590, 0x369c, 0x3680, +0x39d3, 0x3a6e, 0x39db, 0x390e, 0x398f, 0x3baf, 0x38d0, 0x3911, 0x3b72, 0x3407, 0x39e4, 0x3500, 0x3844, 0x3283, 0x2f1a, 0x3bf1, 0x30bc, 0x3b2d, 0x3a43, 0x393f, 0x3405, 0x2671, 0x3b95, 0x361e, 0x34ea, 0x3791, 0x39b2, 0x3136, 0x36af, 0x3435, 0x3b36, 0x3602, 0x356a, 0x388c, 0x3099, 0x33a3, 0x37f2, 0x25e7, 0x393c, 0x398c, 0x2bc2, 0x36e0, 0x39d4, 0x3842, 0x3103, 0x39d1, 0x3653, 0x2c8a, 0x38ed, 0x2920, 0x39c0, 0x3b94, 0x2da9, 0x3018, 0x2c9d, 0x3660, 0x2f3b, 0x2615, 0x3af0, 0x26ab, 0x36ab, 0x2bdf, 0x38a0, 0x38f7, +0x33f2, 0x3bb2, 0x3a92, 0x3844, 0x2ab7, 0x3bee, 0x353d, 0x39ea, 0x3abb, 0x3afe, 0x3052, 0x2d56, 0x38f7, 0x3a1a, 0x390a, 0x38b9, 0x384d, 0x31c6, 0x2ab4, 0x2a49, 0x391a, 0x3871, 0x3474, 0x380f, 0x396b, 0x3b4b, 0x3486, 0x28c1, 0x2ecc, 0x3781, 0x35ad, 0x3208, 0x3a2c, 0x3b69, 0x3b86, 0x388d, 0x3818, 0x38cd, 0x38d8, 0x28bb, 0x3bfd, 0x3b6e, 0x36a7, 0x31ab, 0x342b, 0x315c, 0x3146, 0x1f51, 0x2708, 0x3b94, 0x3a14, 0x2f0e, 0x39d5, 0x398e, 0x3b9a, 0x356c, 0x3009, 0x3111, 0x35e9, 0x39f9, 0x3b1b, 0x3b9f, 0x3b8c, 0x3a89, +0x3839, 0x37e7, 0x3527, 0x32d6, 0x3826, 0x3132, 0x358e, 0x37b0, 0x3055, 0x3909, 0x33f4, 0x2bd3, 0x39ff, 0x2f9e, 0x348f, 0x382d, 0x3a10, 0x34b0, 0x3833, 0x3873, 0x3840, 0x30a9, 0x3bb0, 0x2f6b, 0x3a1c, 0x35eb, 0x3a6a, 0x38ec, 0x3050, 0x3981, 0x3645, 0x39fe, 0x2f66, 0x3aa0, 0x3a6b, 0x3b2f, 0x3941, 0x3521, 0x3095, 0x3b6f, 0x38c6, 0x37dd, 0x3146, 0x39ea, 0x395c, 0x3a59, 0x3ae1, 0x3798, 0x289f, 0x36fa, 0x3b0a, 0x3adc, 0x3392, 0x35f5, 0x3bbf, 0x3b31, 0x3087, 0x3a54, 0x3758, 0x3834, 0x3bcc, 0x3946, 0x3627, 0x3bae, +0x39ac, 0x369f, 0x3841, 0x34b0, 0x3679, 0x3580, 0x32a7, 0x387d, 0x3aa8, 0x382a, 0x35f1, 0x3b90, 0x36a2, 0x2d87, 0x30f4, 0x3b22, 0x359c, 0x3b7f, 0x344e, 0x3a94, 0x382d, 0x3a83, 0x39ae, 0x379e, 0x2f7b, 0x39b3, 0x325e, 0x3873, 0x35ac, 0x378b, 0x3804, 0x3a5c, 0x33f3, 0x2e4e, 0x3b32, 0x3629, 0x3bd6, 0x354b, 0x2952, 0x3828, 0x26d0, 0x39e2, 0x3bf7, 0x2d3c, 0x2754, 0x38f9, 0x3801, 0x39a0, 0x34bb, 0x378f, 0x2e1a, 0x3999, 0x3ad5, 0x25f0, 0x3a4f, 0x275f, 0x3550, 0x318f, 0x3862, 0x3a96, 0x38d5, 0x3927, 0x3010, 0x3a78, +0x2c99, 0x2bdd, 0x3b86, 0x34c2, 0x39a9, 0x35c5, 0x2e15, 0x383b, 0x2f68, 0x399d, 0x290b, 0x375b, 0x39e8, 0x37ec, 0x3a06, 0x3780, 0x38ad, 0x356c, 0x32c9, 0x3b65, 0x3819, 0x39e3, 0x3470, 0x2d14, 0x3ae8, 0x3952, 0x2e47, 0x37cc, 0x308c, 0x347a, 0x2d07, 0x3476, 0x39b1, 0x3b7b, 0x2f49, 0x3aa6, 0x3994, 0x270e, 0x39d7, 0x286a, 0x2daa, 0x37ae, 0x38da, 0x3a14, 0x3b0b, 0x3791, 0x35fe, 0x35a0, 0x38fb, 0x3b73, 0x24a6, 0x3b0d, 0x3891, 0x3441, 0x2542, 0x23ce, 0x3af6, 0x38c5, 0x3bac, 0x3be4, 0x39f5, 0x3740, 0x3133, 0x2e12, +0x3b52, 0x3571, 0x3ae5, 0x353c, 0x3a19, 0x343b, 0x3b41, 0x2f69, 0x36f0, 0x3ab5, 0x2a7a, 0x3568, 0x3ae6, 0x395b, 0x3bff, 0x332f, 0x2848, 0x3417, 0x38a2, 0x3986, 0x3b1a, 0x3a47, 0x3aeb, 0x39b0, 0x363f, 0x3ba3, 0x385a, 0x3af3, 0x373e, 0x3510, 0x2381, 0x37a8, 0x340d, 0x36b3, 0x3b10, 0x38ff, 0x32dd, 0x29a7, 0x3472, 0x3bc1, 0x39de, 0x32bb, 0x3682, 0x3a8f, 0x378d, 0x39ff, 0x3a9d, 0x332a, 0x3801, 0x3a5d, 0x2e8b, 0x3841, 0x3548, 0x3a75, 0x25a3, 0x3ab6, 0x37db, 0x37bf, 0x2c01, 0x3bf8, 0x3b7d, 0x1dfb, 0x26da, 0x3b6d, +0x3895, 0x384c, 0x3877, 0x3a0f, 0x3ac2, 0x3bac, 0x3b42, 0x39b0, 0x338b, 0x3017, 0x3b42, 0x31f6, 0x3bce, 0x3246, 0x2c63, 0x3bfd, 0x3924, 0x3a86, 0x3279, 0x3a88, 0x352d, 0x3bb0, 0x275d, 0x35b1, 0x37dc, 0x325d, 0x36ff, 0x37b6, 0x3873, 0x353d, 0x2f62, 0x37cd, 0x3be9, 0x37c2, 0x38e7, 0x22df, 0x3954, 0x3976, 0x3a05, 0x2e1f, 0x2def, 0x3bfc, 0x3aec, 0x385d, 0x3a08, 0x32e2, 0x3656, 0x38c4, 0x3aa9, 0x31f3, 0x3afa, 0x35b6, 0x3910, 0x381b, 0x30e5, 0x3050, 0x396b, 0x38f4, 0x3b00, 0x3b63, 0x3a2c, 0x39ec, 0x287e, 0x3873, +0x3890, 0x38b8, 0x3a4c, 0x3836, 0x31f0, 0x3732, 0x356b, 0x35de, 0x3a8e, 0x36a4, 0x34a1, 0x377a, 0x3005, 0x3749, 0x39d8, 0x3bee, 0x38e9, 0x34d2, 0x32d6, 0x3883, 0x3a5c, 0x2e19, 0x3aa8, 0x3881, 0x3306, 0x3790, 0x39ff, 0x35fb, 0x3b01, 0x2f92, 0x3302, 0x37c7, 0x3635, 0x3a56, 0x3106, 0x3997, 0x3af7, 0x36e7, 0x39b8, 0x3aa0, 0x3b1a, 0x326a, 0x1dca, 0x3af8, 0x383f, 0x3ba6, 0x21e0, 0x3540, 0x3ba7, 0x358d, 0x2ee4, 0x36e3, 0x3b47, 0x38a3, 0x3a38, 0x2bc4, 0x3ae2, 0x3a5c, 0x381c, 0x3912, 0x39ad, 0x3078, 0x35dc, 0x30f2, +0x374c, 0x351f, 0x30af, 0x3aaf, 0x1d79, 0x36b1, 0x2edc, 0x21fd, 0x3445, 0x374b, 0x388e, 0x39fb, 0x325e, 0x39a5, 0x3a63, 0x338d, 0x3abf, 0x1067, 0x38a2, 0x2389, 0x3a47, 0x3908, 0x33aa, 0x39ac, 0x3bc2, 0x370c, 0x3621, 0x3818, 0x2edf, 0x39c2, 0x3735, 0x3745, 0x3806, 0x389a, 0x3b05, 0x2755, 0x344a, 0x332a, 0x3a6b, 0x3854, 0x31b5, 0x374a, 0x354f, 0x3aa4, 0x36a1, 0x374a, 0x3b57, 0x2c4b, 0x36b2, 0x3066, 0x35de, 0x3820, 0x3ae5, 0x3a97, 0x3780, 0x24cc, 0x3831, 0x29b7, 0x3880, 0x30f9, 0x3775, 0x2a64, 0x396d, 0x3abd, +0x3456, 0x38c5, 0x3401, 0x39c9, 0x3a3e, 0x35f5, 0x3b74, 0x305d, 0x3902, 0x33c5, 0x37b3, 0x38df, 0x37ca, 0x2e80, 0x3200, 0x344c, 0x322b, 0x3914, 0x36a3, 0x3b76, 0x341f, 0x3a0b, 0x318c, 0x3a56, 0x3656, 0x3b09, 0x362b, 0x3a98, 0x3b25, 0x393d, 0x3b19, 0x37df, 0x373c, 0x3a59, 0x366b, 0x3321, 0x30d0, 0x399f, 0x3803, 0x3959, 0x2de4, 0x204c, 0x3881, 0x34bf, 0x3974, 0x3119, 0x3930, 0x3b63, 0x34c4, 0x36ce, 0x3bef, 0x387d, 0x2c5e, 0x3170, 0x2d69, 0x398d, 0x3790, 0x3adc, 0x390e, 0x38e9, 0x38f6, 0x3928, 0x35ea, 0x398c, +0x3a44, 0x3766, 0x34fc, 0x322d, 0x3812, 0x379d, 0x3ba0, 0x362e, 0x30b1, 0x311f, 0x20a4, 0x3b23, 0x35ab, 0x3a53, 0x3bda, 0x39d7, 0x31a5, 0x3be9, 0x2bac, 0x39aa, 0x3595, 0x3220, 0x3756, 0x3bdf, 0x331d, 0x3b09, 0x30b1, 0x3a28, 0x3a8b, 0x352f, 0x391e, 0x3a0d, 0x327c, 0x3a9d, 0x312b, 0x3b5a, 0x3875, 0x3b68, 0x22ba, 0x33c5, 0x3a38, 0x291a, 0x313a, 0x3892, 0x38f5, 0x3775, 0x34dc, 0x3b1b, 0x38ce, 0x31b8, 0x3aaa, 0x37dc, 0x2c05, 0x3a42, 0x3879, 0x3b0b, 0x319e, 0x3a30, 0x33ed, 0x365a, 0x389e, 0x316c, 0x24f6, 0x389e, +0x3aa8, 0x351e, 0x31fd, 0x3986, 0x39e3, 0x390f, 0x3b53, 0x39e2, 0x38bf, 0x393b, 0x3217, 0x39b1, 0x2c33, 0x3a61, 0x3897, 0x3af2, 0x2c93, 0x3b6c, 0x34ef, 0x3b00, 0x349c, 0x3a3d, 0x3797, 0x3bf6, 0x3a52, 0x31b6, 0x342c, 0x3bb4, 0x3aa1, 0x3537, 0x3aa1, 0x3776, 0x349e, 0x3860, 0x3670, 0x3b95, 0x3012, 0x38b5, 0x3991, 0x386a, 0x3a23, 0x37b0, 0x3b7a, 0x3993, 0x39b1, 0x3146, 0x37a0, 0x25f0, 0x3652, 0x33b4, 0x31ee, 0x3446, 0x3877, 0x3672, 0x35be, 0x3390, 0x330e, 0x3b03, 0x2f28, 0x2d4a, 0x3a78, 0x37ea, 0x3a0b, 0x3b47, +0x3062, 0x3400, 0x34de, 0x37e1, 0x37e6, 0x245a, 0x2ae1, 0x3716, 0x35b8, 0x3949, 0x30a8, 0x39a7, 0x3bc0, 0x29f2, 0x3641, 0x39b6, 0x31d1, 0x3ace, 0x3877, 0x32b8, 0x384b, 0x39ee, 0x38b7, 0x34ca, 0x3a20, 0x3318, 0x3be5, 0x2823, 0x38cb, 0x34b5, 0x396a, 0x32ad, 0x3ad7, 0x3a41, 0x35fc, 0x3a63, 0x30ad, 0x3825, 0x375b, 0x2c6e, 0x23c4, 0x3321, 0x2e54, 0x2c09, 0x329b, 0x330c, 0x2261, 0x3a04, 0x384c, 0x36e4, 0x2d15, 0x36e5, 0x2d13, 0x302c, 0x37cd, 0x3a17, 0x3497, 0x3bd5, 0x3afb, 0x3654, 0x3501, 0x3210, 0x377d, 0x38c8, +0x348e, 0x3412, 0x3648, 0x3bd7, 0x3a97, 0x2bd7, 0x36a6, 0x38c0, 0x3736, 0x3a0b, 0x2e19, 0x3b13, 0x38a9, 0x3b43, 0x2c76, 0x3b01, 0x3863, 0x3a81, 0x2d37, 0x39fb, 0x2ac8, 0x3590, 0x3bdc, 0x3bf7, 0x36d8, 0x33c7, 0x383e, 0x399c, 0x3482, 0x3325, 0x37d0, 0x3895, 0x2211, 0x33c6, 0x3afd, 0x3968, 0x393b, 0x3814, 0x35e3, 0x3347, 0x35ee, 0x397e, 0x3b3c, 0x399e, 0x35a7, 0x2929, 0x3ae2, 0x346a, 0x2ade, 0x3971, 0x3b81, 0x3af5, 0x343e, 0x39b0, 0x3aef, 0x38b7, 0x3166, 0x3b3c, 0x3b52, 0x3af6, 0x3a28, 0x363f, 0x28a2, 0x3a83, +0x3b69, 0x2fb4, 0x3934, 0x371e, 0x366f, 0x3754, 0x38c0, 0x3ba2, 0x3b87, 0x39a7, 0x32c6, 0x3027, 0x2969, 0x3415, 0x3a20, 0x3113, 0x3abe, 0x3906, 0x27cc, 0x337f, 0x35ab, 0x31b7, 0x390f, 0x3900, 0x35a9, 0x3a0e, 0x34fa, 0x37bb, 0x366e, 0x367e, 0x3948, 0x3afb, 0x36d9, 0x30a3, 0x3862, 0x2c6a, 0x39a8, 0x3a3c, 0x3574, 0x37bb, 0x2d5c, 0x364b, 0x392e, 0x2c0c, 0x3539, 0x38cf, 0x3b4e, 0x3a54, 0x2ebf, 0x38c3, 0x358e, 0x394c, 0x3a8d, 0x3ba8, 0x25cc, 0x3434, 0x2c2f, 0x39a3, 0x384f, 0x31a4, 0x3bbc, 0x2df2, 0x384d, 0x38cb, +0x3b26, 0x3413, 0x38c9, 0x2e86, 0x30a5, 0x364e, 0x3b26, 0x3814, 0x31ef, 0x3272, 0x3ac8, 0x35b0, 0x246f, 0x381c, 0x3755, 0x32bc, 0x358b, 0x35f4, 0x3767, 0x3a12, 0x3b09, 0x1270, 0x31d0, 0x389b, 0x3661, 0x3971, 0x376f, 0x3921, 0x367d, 0x2524, 0x3ae6, 0x39d1, 0x3517, 0x3890, 0x380d, 0x362b, 0x3944, 0x3792, 0x2df6, 0x30d7, 0x3bdb, 0x3918, 0x39e1, 0x3b27, 0x3bdb, 0x3bda, 0x3670, 0x3b9f, 0x3566, 0x3690, 0x2686, 0x3335, 0x3856, 0x35ac, 0x3957, 0x397a, 0x32da, 0x38f3, 0x3765, 0x34a7, 0x3a04, 0x361a, 0x3607, 0x38c0, +0x344a, 0x36b3, 0x3437, 0x3b66, 0x3a5a, 0x3909, 0x3455, 0x3530, 0x36e1, 0x2e4a, 0x39f1, 0x3aa7, 0x3480, 0x3af5, 0x3786, 0x39e6, 0x36ee, 0x24ce, 0x39cb, 0x3450, 0x3733, 0x3b77, 0x3be7, 0x3585, 0x3b30, 0x3994, 0x39df, 0x3a28, 0x3261, 0x35d5, 0x38a6, 0x391c, 0x3bd0, 0x39db, 0x3470, 0x3a77, 0x3722, 0x37e9, 0x3851, 0x2f5a, 0x31d8, 0x39f6, 0x3618, 0x3bcc, 0x2dc6, 0x39b1, 0x345c, 0x39a1, 0x3963, 0x3a6f, 0x39a6, 0x3541, 0x2d24, 0x39e8, 0x2e8e, 0x3439, 0x2520, 0x38cc, 0x3a3a, 0x2ce2, 0x38f7, 0x389c, 0x3469, 0x389b, +0x32e2, 0x3a11, 0x34ec, 0x33af, 0x3a1a, 0x3bcd, 0x27a3, 0x3b38, 0x2c62, 0x3b3d, 0x39cb, 0x1f85, 0x3576, 0x3a52, 0x3ad6, 0x3b42, 0x39ad, 0x38db, 0x2e9a, 0x21d9, 0x3b72, 0x329c, 0x2cd8, 0x3688, 0x373b, 0x3599, 0x354d, 0x3b76, 0x2260, 0x3903, 0x3be1, 0x36c1, 0x3b84, 0x3a9c, 0x342e, 0x3b05, 0x2d44, 0x3910, 0x3ab2, 0x3029, 0x3b1e, 0x3827, 0x33e1, 0x3674, 0x3a80, 0x2f78, 0x38c1, 0x3ad1, 0x306c, 0x3942, 0x3a8c, 0x3847, 0x3727, 0x37a0, 0x326f, 0x37a5, 0x2aa3, 0x2ec3, 0x3bef, 0x3a1c, 0x3914, 0x39c2, 0x3b4b, 0x2a9e, +0x3bce, 0x39a3, 0x397f, 0x39d7, 0x34bd, 0x3956, 0x3717, 0x2daf, 0x3b73, 0x33b4, 0x3bb3, 0x38d7, 0x372d, 0x344d, 0x2ceb, 0x2e98, 0x3509, 0x2d49, 0x3028, 0x34e0, 0x3681, 0x3734, 0x3be8, 0x31ed, 0x35d7, 0x38a4, 0x3a92, 0x350a, 0x3a6c, 0x397c, 0x3bb4, 0x33d4, 0x3872, 0x3873, 0x2fb0, 0x395b, 0x378a, 0x3a6b, 0x3a3f, 0x387a, 0x30ed, 0x39aa, 0x3854, 0x38b2, 0x3baa, 0x39ce, 0x3062, 0x3949, 0x319c, 0x3816, 0x3764, 0x2c84, 0x3682, 0x3a71, 0x3596, 0x3afc, 0x37b8, 0x386d, 0x3a37, 0x2a1e, 0x3845, 0x37ca, 0x3955, 0x380d, +0x355f, 0x3680, 0x3761, 0x358c, 0x3bbe, 0x2358, 0x381a, 0x31ec, 0x2d29, 0x2746, 0x2c34, 0x3abe, 0x2f82, 0x39f0, 0x2c9b, 0x33a6, 0x381c, 0x3bc1, 0x3b81, 0x2f9a, 0x3807, 0x2277, 0x38b2, 0x3210, 0x3b9f, 0x34ad, 0x3916, 0x30d3, 0x3a18, 0x39ac, 0x38a8, 0x3ba7, 0x2bb8, 0x3a70, 0x33d8, 0x37b9, 0x38ee, 0x3510, 0x3874, 0x3be7, 0x3952, 0x35f5, 0x38d3, 0x3ba6, 0x3452, 0x3401, 0x3819, 0x3beb, 0x3826, 0x3455, 0x3add, 0x2b23, 0x3590, 0x318e, 0x2d92, 0x3286, 0x2d2b, 0x3225, 0x38bd, 0x36c4, 0x3b29, 0x2e2c, 0x3088, 0x3974, +0x3859, 0x3795, 0x3bd4, 0x2f4e, 0x384a, 0x3ad9, 0x3aa7, 0x3448, 0x3736, 0x3b76, 0x3aac, 0x3959, 0x388b, 0x3a7f, 0x2b08, 0x29a3, 0x29c4, 0x2412, 0x30b4, 0x3b6d, 0x3a1b, 0x3b86, 0x337b, 0x34e4, 0x32e0, 0x34df, 0x3750, 0x3a39, 0x39f0, 0x39ed, 0x3a1a, 0x36d8, 0x3a40, 0x3b68, 0x388a, 0x2ce0, 0x3b16, 0x31ff, 0x3790, 0x35a3, 0x3a17, 0x3b01, 0x3686, 0x39d9, 0x25a1, 0x3ade, 0x3073, 0x3753, 0x33c3, 0x381a, 0x2f26, 0x2e04, 0x2dfb, 0x3779, 0x3813, 0x30a6, 0x3b85, 0x301a, 0x2f2c, 0x32b9, 0x38a5, 0x2fb3, 0x3bec, 0x39d9, +0x3097, 0x3524, 0x3a92, 0x3b9c, 0x3a0b, 0x3492, 0x348b, 0x35a3, 0x3534, 0x3ae8, 0x39dc, 0x3b77, 0x28c0, 0x3918, 0x3b4b, 0x3bc9, 0x3815, 0x373a, 0x3182, 0x35b7, 0x3906, 0x3b49, 0x32e0, 0x31c2, 0x345a, 0x376b, 0x27ba, 0x283f, 0x38f4, 0x3ab3, 0x380a, 0x3a1a, 0x3b3e, 0x3aef, 0x39aa, 0x2c6c, 0x2875, 0x3b82, 0x3bca, 0x36d6, 0x3833, 0x38f2, 0x30b8, 0x3b5d, 0x30e5, 0x201c, 0x3003, 0x373b, 0x395f, 0x3b0f, 0x3af4, 0x3b88, 0x39d5, 0x3a2d, 0x2f53, 0x2b79, 0x32e4, 0x3830, 0x384a, 0x37f7, 0x3a6a, 0x2eab, 0x3be0, 0x383d, +0x33ea, 0x33de, 0x38d0, 0x3112, 0x3ba3, 0x3034, 0x39fe, 0x37f5, 0x39be, 0x3069, 0x3a87, 0x3134, 0x3b62, 0x37ee, 0x3a4b, 0x3744, 0x28e5, 0x2b0c, 0x3048, 0x3abf, 0x3a79, 0x34d3, 0x3950, 0x3b57, 0x352c, 0x388b, 0x371c, 0x361f, 0x38f6, 0x3a5a, 0x34b4, 0x35e9, 0x3afc, 0x3653, 0x33ae, 0x34d1, 0x3a4f, 0x3a8d, 0x35e2, 0x2c87, 0x2972, 0x337e, 0x3a72, 0x3120, 0x368d, 0x33d8, 0x2694, 0x30f9, 0x3a90, 0x251a, 0x3074, 0x3ba7, 0x3a1c, 0x3a8e, 0x3953, 0x3900, 0x3935, 0x3b52, 0x2ebd, 0x3b51, 0x33f7, 0x3876, 0x2782, 0x370a, +0x3134, 0x33fd, 0x3885, 0x3919, 0x38a4, 0x3be0, 0x36a6, 0x34a3, 0x38c9, 0x3734, 0x3afb, 0x2ed7, 0x3691, 0x3212, 0x37e1, 0x36cf, 0x3683, 0x391e, 0x3856, 0x3812, 0x3b0f, 0x3bd7, 0x3936, 0x3a5c, 0x3393, 0x3340, 0x3b9d, 0x30d6, 0x37df, 0x3a62, 0x33c3, 0x3a3f, 0x3647, 0x3024, 0x3012, 0x378c, 0x3866, 0x35e9, 0x3bdf, 0x2521, 0x3adf, 0x3991, 0x39ec, 0x2638, 0x31da, 0x3531, 0x386c, 0x32ae, 0x393d, 0x39be, 0x3827, 0x3071, 0x3b2e, 0x36c1, 0x3748, 0x395d, 0x3812, 0x37b0, 0x349e, 0x3a46, 0x3a41, 0x37c9, 0x395f, 0x30cc, +0x3068, 0x2a29, 0x38c6, 0x345d, 0x279c, 0x36d3, 0x38a0, 0x3965, 0x3838, 0x378e, 0x364f, 0x39f9, 0x3a98, 0x32b1, 0x3444, 0x3be9, 0x39a7, 0x3520, 0x3823, 0x3afc, 0x3387, 0x3170, 0x38af, 0x2cc3, 0x358b, 0x2e30, 0x3ac8, 0x3803, 0x36f6, 0x3747, 0x38a8, 0x3a9e, 0x211e, 0x3b13, 0x2cf0, 0x3a79, 0x2c7e, 0x3786, 0x3521, 0x2e6a, 0x3714, 0x356a, 0x2ce9, 0x3879, 0x3855, 0x3662, 0x305b, 0x3915, 0x2e38, 0x3870, 0x3673, 0x33fd, 0x3bb6, 0x2d86, 0x2934, 0x372f, 0x2ac0, 0x368d, 0x3595, 0x32db, 0x39a1, 0x3161, 0x359a, 0x37dd, +0x344b, 0x36fa, 0x3af1, 0x2a7d, 0x310d, 0x3a46, 0x358b, 0x39fb, 0x3580, 0x3b84, 0x2a21, 0x3aba, 0x3ab3, 0x3947, 0x3130, 0x3056, 0x3ac0, 0x35c0, 0x3b0d, 0x3b5d, 0x3922, 0x3696, 0x3b40, 0x38de, 0x38eb, 0x36f1, 0x36fa, 0x334e, 0x347a, 0x3840, 0x2435, 0x3409, 0x3a1d, 0x3a86, 0x3990, 0x32a5, 0x3908, 0x362b, 0x2600, 0x39ad, 0x3b1a, 0x3add, 0x3b3d, 0x3ad3, 0x381d, 0x314a, 0x3a33, 0x3837, 0x3b5c, 0x3a79, 0x286c, 0x382d, 0x3209, 0x38c9, 0x3a4c, 0x3b36, 0x3012, 0x36cb, 0x3845, 0x385c, 0x3756, 0x3542, 0x3669, 0x3a4e, +0x3bc4, 0x2c70, 0x21bf, 0x36d5, 0x39dc, 0x2e49, 0x35e7, 0x3be7, 0x30dd, 0x3384, 0x2877, 0x3bce, 0x395a, 0x344d, 0x38d6, 0x34a5, 0x245c, 0x382e, 0x3065, 0x3b3c, 0x3504, 0x3809, 0x38b8, 0x37b4, 0x3467, 0x3a8e, 0x39bd, 0x390b, 0x3ac2, 0x3990, 0x3aeb, 0x38b0, 0x39b2, 0x3852, 0x39a8, 0x2c6d, 0x399b, 0x27d9, 0x3704, 0x39fd, 0x365e, 0x3610, 0x367a, 0x345e, 0x3acd, 0x38b2, 0x3a36, 0x3221, 0x36e1, 0x3800, 0x352e, 0x3bfe, 0x381b, 0x3a6b, 0x38b6, 0x3a36, 0x320b, 0x3971, 0x31a8, 0x3bfc, 0x199c, 0x3a89, 0x3b46, 0x38dd, +0x3560, 0x3408, 0x3af5, 0x3b03, 0x3a6e, 0x3778, 0x389c, 0x30f4, 0x3624, 0x2d25, 0x36f1, 0x393f, 0x26ce, 0x3993, 0x374b, 0x3bfc, 0x3b34, 0x3b9f, 0x259a, 0x355d, 0x389a, 0x3468, 0x3950, 0x385b, 0x3b0b, 0x3851, 0x37fa, 0x394e, 0x3564, 0x344e, 0x390c, 0x38a2, 0x2cd0, 0x340f, 0x312b, 0x396c, 0x351e, 0x3a7a, 0x3124, 0x332a, 0x3a4d, 0x33b8, 0x36f9, 0x2f22, 0x39b8, 0x3b4d, 0x3ae7, 0x39bd, 0x396d, 0x3b7f, 0x301a, 0x30e2, 0x2d27, 0x3b5d, 0x3b02, 0x3be2, 0x3289, 0x393e, 0x36cc, 0x37e9, 0x29ba, 0x3927, 0x35fb, 0x2e26, +0x38fd, 0x310c, 0x3bd7, 0x2cc9, 0x39ab, 0x3be4, 0x3515, 0x3949, 0x35e7, 0x3643, 0x38d5, 0x3981, 0x3937, 0x3be6, 0x2fb2, 0x392c, 0x348c, 0x38f2, 0x3872, 0x3b6b, 0x3ae0, 0x39a3, 0x3959, 0x3555, 0x3329, 0x35dd, 0x38ac, 0x3530, 0x39af, 0x2ef5, 0x28c1, 0x39d1, 0x3bc1, 0x34be, 0x3b5d, 0x328b, 0x32b2, 0x3872, 0x3bd4, 0x3b03, 0x2e0f, 0x39d4, 0x3925, 0x3770, 0x3a7d, 0x28c2, 0x38a1, 0x3874, 0x3b11, 0x3b64, 0x371e, 0x3600, 0x379a, 0x3bb9, 0x35ca, 0x32ad, 0x3b2d, 0x349b, 0x36f2, 0x374c, 0x38c9, 0x34d0, 0x34b4, 0x35bb, +0x3a16, 0x33b5, 0x3209, 0x3500, 0x3ae0, 0x3721, 0x34ee, 0x351b, 0x3bc5, 0x3878, 0x31f0, 0x34b7, 0x318a, 0x3b29, 0x2ddc, 0x36f4, 0x3b04, 0x3844, 0x3afe, 0x34b9, 0x31a0, 0x3aa8, 0x277e, 0x3b2d, 0x3545, 0x39f3, 0x2d07, 0x2f39, 0x3803, 0x1c7e, 0x364e, 0x3a54, 0x328b, 0x3772, 0x3907, 0x3951, 0x365f, 0x3b93, 0x3acd, 0x30e7, 0x298a, 0x2bcc, 0x3b9a, 0x3a54, 0x365d, 0x3b01, 0x3ab5, 0x2f7f, 0x304b, 0x3257, 0x39bf, 0x3b2e, 0x390c, 0x3802, 0x3a0d, 0x37d7, 0x338c, 0x3a35, 0x3bd1, 0x3905, 0x3be8, 0x3ab3, 0x388c, 0x2d83, +0x3b83, 0x32ef, 0x359a, 0x35bb, 0x38e2, 0x3813, 0x3419, 0x384f, 0x3606, 0x3825, 0x38ed, 0x3927, 0x3407, 0x3aad, 0x34f3, 0x3b8e, 0x36d6, 0x3599, 0x3502, 0x3b90, 0x38b2, 0x2f9d, 0x3bd0, 0x32ab, 0x3629, 0x3ad2, 0x342d, 0x25db, 0x3786, 0x3a93, 0x3823, 0x3320, 0x3a21, 0x387f, 0x38df, 0x3134, 0x3743, 0x3b35, 0x37fc, 0x3a9c, 0x2778, 0x3b7d, 0x2c40, 0x37f6, 0x39db, 0x3ab3, 0x3537, 0x34bd, 0x3865, 0x3a8f, 0x3a3d, 0x201e, 0x3a9c, 0x3956, 0x2ce1, 0x3bd8, 0x2856, 0x3876, 0x38b5, 0x296a, 0x3226, 0x3a4d, 0x39ee, 0x3bed, +0x39d8, 0x3527, 0x374d, 0x3acc, 0x3bef, 0x30a0, 0x3124, 0x325d, 0x32e4, 0x38d8, 0x3988, 0x3b3e, 0x340d, 0x3a1c, 0x383d, 0x2e36, 0x3874, 0x36f1, 0x3758, 0x2e80, 0x3422, 0x3408, 0x3727, 0x3234, 0x2e0e, 0x3b7a, 0x3a16, 0x3868, 0x33e8, 0x3918, 0x2fc1, 0x2d27, 0x36b4, 0x3b19, 0x3489, 0x391e, 0x3a54, 0x3bc8, 0x3bbb, 0x3861, 0x3985, 0x396c, 0x335a, 0x3a9a, 0x36ae, 0x3484, 0x3b9d, 0x3874, 0x3283, 0x357f, 0x37ae, 0x387b, 0x2a12, 0x3436, 0x2c10, 0x3bff, 0x3baf, 0x2d43, 0x35f8, 0x3a9e, 0x3ad3, 0x35f3, 0x3569, 0x2884, +0x384a, 0x39ea, 0x3afa, 0x3987, 0x3b65, 0x3b3b, 0x37a0, 0x25cb, 0x3be9, 0x3217, 0x34c0, 0x2822, 0x34dc, 0x3b46, 0x3498, 0x392d, 0x35d8, 0x39b7, 0x39c0, 0x334d, 0x354e, 0x3861, 0x3486, 0x3739, 0x3ab8, 0x2d46, 0x384d, 0x3b21, 0x3b3e, 0x3025, 0x38ec, 0x27a0, 0x3879, 0x39bd, 0x36e4, 0x3677, 0x3bb5, 0x3966, 0x3921, 0x3a5b, 0x30e8, 0x37ab, 0x3a1f, 0x33a7, 0x345a, 0x3457, 0x3223, 0x39e7, 0x3733, 0x37df, 0x39cc, 0x2612, 0x355c, 0x36e9, 0x3adf, 0x3aa6, 0x39d4, 0x32da, 0x3983, 0x3456, 0x2eff, 0x32be, 0x39f0, 0x39a7, +0x349d, 0x3a15, 0x38c8, 0x32dc, 0x3a4f, 0x3272, 0x22cf, 0x3a8a, 0x2ad2, 0x2ea8, 0x37ec, 0x31fa, 0x3645, 0x399b, 0x3835, 0x32e0, 0x359d, 0x38f3, 0x3b1d, 0x3a60, 0x33fd, 0x3910, 0x373f, 0x3bb0, 0x39c9, 0x3144, 0x3b20, 0x363b, 0x36d3, 0x2810, 0x341f, 0x385a, 0x38d9, 0x3924, 0x399a, 0x33b3, 0x3bca, 0x39ca, 0x349e, 0x35ed, 0x3244, 0x37e1, 0x3887, 0x3873, 0x3ab0, 0x3b9e, 0x3961, 0x3471, 0x3afb, 0x3ba7, 0x3778, 0x36c5, 0x3a15, 0x398d, 0x336b, 0x367a, 0x3bff, 0x382c, 0x34bd, 0x39e5, 0x37d2, 0x3a38, 0x361c, 0x32bc, +0x38bc, 0x2d3a, 0x3559, 0x3ad2, 0x38ba, 0x3bd0, 0x3ab3, 0x331e, 0x3891, 0x381b, 0x324f, 0x2d22, 0x38c7, 0x3577, 0x377b, 0x38ae, 0x38f8, 0x36f7, 0x3911, 0x28fc, 0x36a7, 0x3658, 0x37d8, 0x3ab1, 0x3b8d, 0x32e6, 0x34bf, 0x34cb, 0x3bd5, 0x2cba, 0x382e, 0x30d2, 0x355e, 0x391e, 0x385e, 0x3ab4, 0x397a, 0x304f, 0x3af3, 0x390e, 0x3646, 0x3624, 0x39cc, 0x3aef, 0x3817, 0x3524, 0x34b2, 0x39f7, 0x393b, 0x32ed, 0x3af8, 0x3229, 0x3975, 0x3786, 0x3346, 0x37db, 0x2bd4, 0x3481, 0x3a60, 0x393e, 0x3ad6, 0x3479, 0x3434, 0x321c, +0x3995, 0x3511, 0x2047, 0x34c2, 0x3946, 0x3900, 0x356f, 0x3485, 0x3b9a, 0x3b68, 0x3482, 0x3850, 0x3539, 0x37e7, 0x3bb5, 0x2c92, 0x1c36, 0x3617, 0x3abf, 0x36f8, 0x3ad6, 0x3451, 0x29fb, 0x3a36, 0x37d3, 0x2b19, 0x3a12, 0x3a0f, 0x3207, 0x3857, 0x3a80, 0x3ac0, 0x38eb, 0x30dc, 0x34c2, 0x3b55, 0x3a9b, 0x391f, 0x2bfa, 0x39b1, 0x381c, 0x3855, 0x3999, 0x384a, 0x3baf, 0x389c, 0x32e3, 0x3bd8, 0x2e14, 0x363c, 0x3a87, 0x3237, 0x33e4, 0x3bcf, 0x3a55, 0x3959, 0x3482, 0x3af7, 0x3b2a, 0x396d, 0x3adb, 0x347c, 0x3a36, 0x3800, +0x3b48, 0x3a7c, 0x3a55, 0x36f0, 0x3955, 0x3230, 0x3648, 0x3087, 0x3426, 0x314d, 0x3a35, 0x3874, 0x3861, 0x388d, 0x32c7, 0x3966, 0x341a, 0x302f, 0x2ef8, 0x3793, 0x37e9, 0x3a68, 0x3345, 0x3952, 0x2ef3, 0x35c0, 0x3a6b, 0x3b79, 0x3887, 0x383a, 0x3b55, 0x3834, 0x39d0, 0x3724, 0x3ad1, 0x33da, 0x3765, 0x3474, 0x39ce, 0x3529, 0x39c1, 0x3b00, 0x3902, 0x357d, 0x357e, 0x3709, 0x2dac, 0x3468, 0x37fa, 0x342a, 0x3af0, 0x378b, 0x39f9, 0x2996, 0x33af, 0x395b, 0x391d, 0x39e1, 0x2d27, 0x2c5c, 0x32d1, 0x3996, 0x3794, 0x314e, +0x3960, 0x3aea, 0x3b05, 0x3b28, 0x3860, 0x3950, 0x29d6, 0x24e0, 0x360c, 0x391a, 0x32f6, 0x3897, 0x39b6, 0x34cd, 0x3416, 0x30b2, 0x3467, 0x3699, 0x3a59, 0x28dd, 0x37f1, 0x34fa, 0x3b2e, 0x37e6, 0x3b52, 0x3bae, 0x25dd, 0x351f, 0x2f17, 0x36cd, 0x3bfd, 0x39f0, 0x38d8, 0x3945, 0x38a9, 0x35cb, 0x3a1b, 0x37fe, 0x3458, 0x3b2e, 0x3b34, 0x36a2, 0x1937, 0x3b9b, 0x3602, 0x36dd, 0x2f99, 0x3b91, 0x37b6, 0x3b68, 0x3375, 0x3998, 0x30cf, 0x385e, 0x356e, 0x3a0b, 0x3026, 0x3010, 0x388c, 0x3be2, 0x3a80, 0x3765, 0x3a88, 0x398d, +0x37fc, 0x3a63, 0x3a73, 0x38b3, 0x30cb, 0x3414, 0x3478, 0x37f8, 0x2ac0, 0x3711, 0x3851, 0x3abb, 0x3a7b, 0x38fe, 0x3810, 0x3af1, 0x3af5, 0x3a93, 0x394b, 0x331a, 0x3751, 0x362f, 0x36d0, 0x212b, 0x3b8d, 0x3969, 0x396b, 0x3570, 0x38a4, 0x316a, 0x3273, 0x2dfe, 0x3652, 0x3ab5, 0x3bae, 0x26c9, 0x3aa2, 0x33d1, 0x3453, 0x3664, 0x2bf6, 0x38a9, 0x3b51, 0x3593, 0x3a83, 0x3822, 0x2846, 0x3a65, 0x3814, 0x37e8, 0x39a3, 0x3925, 0x3acf, 0x252b, 0x3882, 0x3b04, 0x3240, 0x398b, 0x2b29, 0x35a2, 0x1eb4, 0x375f, 0x363e, 0x3461, +0x3469, 0x308e, 0x360d, 0x3ab2, 0x3aa4, 0x396f, 0x2ed3, 0x30ec, 0x38a8, 0x389f, 0x3211, 0x35c6, 0x390e, 0x3bf3, 0x389e, 0x3bc8, 0x3b0e, 0x3942, 0x3866, 0x379d, 0x3858, 0x2d3f, 0x2766, 0x34a0, 0x326c, 0x383c, 0x367b, 0x2759, 0x368f, 0x3451, 0x3b18, 0x39e6, 0x320c, 0x354d, 0x3ab1, 0x382e, 0x381f, 0x38af, 0x3a12, 0x3aaa, 0x396f, 0x3a24, 0x287c, 0x3bd7, 0x3483, 0x388b, 0x343d, 0x3b0e, 0x347f, 0x3964, 0x2a65, 0x36bc, 0x3780, 0x37ae, 0x38f6, 0x31f7, 0x373c, 0x3817, 0x3079, 0x3552, 0x2f93, 0x3753, 0x3972, 0x3882, +0x3b1a, 0x39fd, 0x3855, 0x3967, 0x2fc4, 0x3a87, 0x3a46, 0x385e, 0x3a6f, 0x3651, 0x3808, 0x363b, 0x2d10, 0x3b99, 0x3aec, 0x3a80, 0x3825, 0x3865, 0x3629, 0x37b8, 0x3b96, 0x3159, 0x3b17, 0x3506, 0x35c8, 0x363e, 0x3411, 0x30bf, 0x380c, 0x3673, 0x342a, 0x2bd6, 0x33c5, 0x28af, 0x39eb, 0x3ad1, 0x3b69, 0x3b4a, 0x38d6, 0x379f, 0x3b24, 0x352e, 0x3578, 0x3bbe, 0x3a1c, 0x28ac, 0x387a, 0x2924, 0x38fe, 0x3878, 0x3960, 0x396a, 0x34c3, 0x3738, 0x34e3, 0x3676, 0x3221, 0x303f, 0x31b2, 0x3256, 0x34b2, 0x3673, 0x39c4, 0x3a82, +0x3b83, 0x3967, 0x3890, 0x3892, 0x2c28, 0x3241, 0x39cd, 0x399e, 0x354c, 0x28cd, 0x2e5b, 0x38b5, 0x30bc, 0x390e, 0x38e8, 0x2ffe, 0x3bb3, 0x2481, 0x3b10, 0x3b1e, 0x2ff2, 0x38cf, 0x3a0b, 0x3b90, 0x391d, 0x35ba, 0x38d1, 0x3b7a, 0x35fc, 0x37b3, 0x3b7f, 0x3abf, 0x3647, 0x3058, 0x396f, 0x3249, 0x3880, 0x389b, 0x3aa2, 0x2aa2, 0x3ad4, 0x36e1, 0x380d, 0x383c, 0x363f, 0x32d3, 0x3873, 0x3912, 0x34a0, 0x388b, 0x36eb, 0x3816, 0x3adf, 0x3684, 0x36a7, 0x3094, 0x35ff, 0x3044, 0x3a50, 0x3b4e, 0x3894, 0x3b93, 0x33ce, 0x3ae0, +0x3ab4, 0x2d37, 0x34cf, 0x3946, 0x370c, 0x3ad4, 0x3a2c, 0x3bc8, 0x3b07, 0x3a73, 0x38d1, 0x39bf, 0x30bd, 0x3a04, 0x384e, 0x3b26, 0x356f, 0x32fe, 0x38e5, 0x3856, 0x3046, 0x3b4e, 0x2cd0, 0x345a, 0x2464, 0x3bad, 0x2d72, 0x32da, 0x3783, 0x3595, 0x306a, 0x3a93, 0x3851, 0x3807, 0x2e73, 0x386c, 0x2f53, 0x3b57, 0x2fb5, 0x238d, 0x358d, 0x3684, 0x3b79, 0x3538, 0x368b, 0x3914, 0x3aaf, 0x358b, 0x2c1c, 0x37b5, 0x3a1e, 0x3bc5, 0x346c, 0x3bf6, 0x330e, 0x3459, 0x374b, 0x3b9d, 0x2841, 0x3696, 0x33c3, 0x3845, 0x3860, 0x3a21, +0x3176, 0x3b70, 0x31f1, 0x3a89, 0x35d2, 0x2d6e, 0x3a3d, 0x3b9b, 0x3aac, 0x39c9, 0x36ec, 0x3a46, 0x3507, 0x3606, 0x347c, 0x3626, 0x3b6b, 0x38db, 0x2e3f, 0x3a61, 0x39c8, 0x3185, 0x284a, 0x3027, 0x35b8, 0x3978, 0x2fd0, 0x3989, 0x2e44, 0x2f35, 0x34ed, 0x392b, 0x3202, 0x39b3, 0x3a9c, 0x3b9b, 0x2c42, 0x301c, 0x33de, 0x270a, 0x33ab, 0x3bd8, 0x3bac, 0x3136, 0x3b9f, 0x38d2, 0x3977, 0x32ad, 0x2e75, 0x310e, 0x36e3, 0x3200, 0x376b, 0x38ca, 0x39f9, 0x39ca, 0x3b9b, 0x3236, 0x3969, 0x3b8e, 0x3345, 0x3b34, 0x3817, 0x387e, +0x38e6, 0x3b46, 0x3417, 0x3b14, 0x3b0c, 0x3bc2, 0x3a2b, 0x3781, 0x32a7, 0x3a3d, 0x35a6, 0x3b34, 0x388f, 0x348e, 0x3a2f, 0x397c, 0x39f7, 0x32f5, 0x2cda, 0x38ea, 0x3a85, 0x3883, 0x3996, 0x288d, 0x3a3e, 0x34cf, 0x3bbd, 0x3ae5, 0x232d, 0x2c50, 0x2e6f, 0x3bd4, 0x3a52, 0x2f61, 0x38f1, 0x3970, 0x375c, 0x39e0, 0x3821, 0x3ad0, 0x3994, 0x38e5, 0x3b02, 0x36bc, 0x388d, 0x3654, 0x364b, 0x3a55, 0x3739, 0x2cfc, 0x3879, 0x3299, 0x39ba, 0x3a0c, 0x3b90, 0x34cb, 0x389a, 0x39bd, 0x3531, 0x381d, 0x3897, 0x3bc3, 0x35da, 0x3709, +0x35b2, 0x36c4, 0x3614, 0x3906, 0x3939, 0x3a65, 0x3b03, 0x3a79, 0x348c, 0x3af4, 0x2ff0, 0x3ab5, 0x2402, 0x38d8, 0x3861, 0x2e1c, 0x242f, 0x3b2f, 0x3bd7, 0x3a99, 0x3969, 0x3897, 0x326f, 0x2cd4, 0x389b, 0x39dd, 0x384b, 0x35d9, 0x367f, 0x3821, 0x3ab8, 0x3a10, 0x3bc5, 0x3588, 0x3b33, 0x39cc, 0x3a90, 0x39a7, 0x360a, 0x2cb2, 0x3aa2, 0x3aae, 0x313c, 0x3b1e, 0x3b0d, 0x3b3f, 0x3031, 0x29f6, 0x3a0b, 0x36ae, 0x3116, 0x2954, 0x3836, 0x357b, 0x3a21, 0x391b, 0x3b74, 0x3456, 0x34b5, 0x3bdf, 0x365c, 0x35a4, 0x371c, 0x3926, +0x39d2, 0x2eed, 0x38a1, 0x2f2b, 0x3a03, 0x36f7, 0x3a86, 0x3794, 0x33d3, 0x2f4d, 0x39b0, 0x2eb4, 0x3962, 0x3972, 0x3685, 0x3ab4, 0x39e9, 0x38a1, 0x3ba8, 0x22a7, 0x307f, 0x3947, 0x35bd, 0x2c44, 0x3b47, 0x306d, 0x3807, 0x3937, 0x3925, 0x38f3, 0x2825, 0x387d, 0x3bec, 0x2ece, 0x3617, 0x390e, 0x34a8, 0x3892, 0x3b1f, 0x37b9, 0x15a5, 0x3195, 0x3814, 0x3972, 0x2d39, 0x39f1, 0x2d4b, 0x38cf, 0x34c4, 0x315c, 0x3a67, 0x349f, 0x3bf5, 0x3620, 0x346b, 0x3133, 0x2870, 0x3647, 0x265d, 0x3a20, 0x3878, 0x20b6, 0x252d, 0x3408, +0x20e5, 0x3a58, 0x372d, 0x38b8, 0x3983, 0x387b, 0x3296, 0x3b9f, 0x39b8, 0x39f1, 0x3445, 0x393c, 0x3886, 0x3bbc, 0x3944, 0x343e, 0x2dbd, 0x36d8, 0x392e, 0x386e, 0x3a3b, 0x3bde, 0x3be4, 0x35e6, 0x39aa, 0x30d6, 0x32fd, 0x2e3c, 0x3bab, 0x388f, 0x381c, 0x3b43, 0x2b51, 0x3b44, 0x3ab3, 0x2c11, 0x2c53, 0x3810, 0x3b94, 0x3aa5, 0x3a30, 0x2e27, 0x308f, 0x37a4, 0x36ff, 0x3b77, 0x2c32, 0x3b31, 0x3903, 0x2dcb, 0x3284, 0x3b60, 0x31c4, 0x2f13, 0x398c, 0x3b20, 0x34d1, 0x32da, 0x3917, 0x37a0, 0x398e, 0x32ac, 0x3b17, 0x39c8, +0x32af, 0x3225, 0x34f8, 0x325d, 0x2cbd, 0x3578, 0x3919, 0x2c55, 0x38a8, 0x3a4c, 0x35ed, 0x38f6, 0x39b5, 0x3261, 0x31b3, 0x3b23, 0x3956, 0x332d, 0x38d9, 0x30cb, 0x360a, 0x39f3, 0x39b6, 0x393b, 0x3977, 0x39f2, 0x332b, 0x3a15, 0x390b, 0x3a7f, 0x36ac, 0x3403, 0x34ee, 0x39eb, 0x3977, 0x304c, 0x3922, 0x31dd, 0x377c, 0x2dcd, 0x39d1, 0x3915, 0x3a55, 0x358b, 0x2c1e, 0x365f, 0x3597, 0x296f, 0x3514, 0x31e1, 0x2f8a, 0x3ba3, 0x3a51, 0x3965, 0x2a31, 0x38c7, 0x3930, 0x327b, 0x382d, 0x351c, 0x3164, 0x38a4, 0x33f7, 0x24d9, +0x3799, 0x32e4, 0x3a10, 0x3959, 0x3802, 0x385c, 0x307f, 0x2860, 0x3632, 0x36a5, 0x3a8e, 0x3941, 0x3b83, 0x3a6b, 0x3096, 0x3112, 0x35c0, 0x3a0c, 0x3909, 0x3a75, 0x386e, 0x38bd, 0x34b7, 0x37a4, 0x3116, 0x3b05, 0x302a, 0x392a, 0x3535, 0x3416, 0x38b4, 0x3910, 0x3385, 0x3bc4, 0x3403, 0x35d9, 0x3058, 0x3694, 0x3aa1, 0x2c56, 0x3458, 0x3475, 0x3bbc, 0x25ea, 0x349b, 0x3883, 0x3b41, 0x2832, 0x30dc, 0x39c6, 0x3be4, 0x2f05, 0x3a4d, 0x3748, 0x380b, 0x213e, 0x38fe, 0x3648, 0x38cc, 0x3727, 0x375f, 0x332f, 0x3989, 0x3849, +0x3b12, 0x333c, 0x3a5f, 0x295e, 0x326b, 0x38ac, 0x30b4, 0x396d, 0x3a8f, 0x254c, 0x39c2, 0x2823, 0x3740, 0x3556, 0x220b, 0x35dd, 0x3af9, 0x38b8, 0x3a94, 0x2f27, 0x340e, 0x3486, 0x319a, 0x3bbd, 0x39d7, 0x39e7, 0x379d, 0x3aa4, 0x3875, 0x3aec, 0x3b96, 0x3bcd, 0x3743, 0x39c7, 0x3a3b, 0x338a, 0x3979, 0x35b0, 0x3940, 0x3bd6, 0x33f0, 0x368a, 0x39af, 0x33f8, 0x3bef, 0x3b15, 0x3077, 0x344a, 0x3a58, 0x3a8c, 0x3486, 0x3b0d, 0x3b0f, 0x36b2, 0x3a93, 0x3b42, 0x3561, 0x3a29, 0x34de, 0x37c3, 0x39a1, 0x392f, 0x3b6c, 0x369f +}; diff --git a/tests/utils/z_output.h b/tests/utils/z_output.h new file mode 100644 index 00000000..4230a373 --- /dev/null +++ b/tests/utils/z_output.h @@ -0,0 +1,106 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// Authors: Yvan Tortorella +// + +/* Header file generated by RedMulE Golden Model */ +uint16_t z_oup [6144] = { +0x4cae, 0x4ccb, 0x4b76, 0x4c61, 0x4cca, 0x4cc8, 0x4a6b, 0x4c88, 0x4d1d, 0x4d15, 0x4c5b, 0x4c8e, 0x4ca5, 0x4c76, 0x4c44, 0x4bfb, 0x4cab, 0x4cc4, 0x4cb6, 0x4c70, 0x4c55, 0x4bcf, 0x4c40, 0x4c0a, 0x4d1d, 0x4cf2, 0x4c98, 0x4cc9, 0x4bef, 0x4c5f, 0x4cb2, 0x4c93, 0x4c0c, 0x4c4e, 0x4c42, 0x4c61, 0x4c5a, 0x4cea, 0x4c15, 0x4c67, 0x4ca2, 0x4d8c, 0x4bfd, 0x4cb4, 0x4c34, 0x4c68, 0x4cc2, 0x4c23, 0x4cd9, 0x4cdf, 0x4d72, 0x4d11, 0x4d1a, 0x4c03, 0x4cca, 0x4c40, 0x4c5a, 0x4ccc, 0x4c1f, 0x4c43, 0x4c1c, 0x4c4b, 0x4c60, 0x4c4c, +0x4c03, 0x4bbb, 0x4b15, 0x4c04, 0x4c6d, 0x4c20, 0x4ad4, 0x4bf4, 0x4c60, 0x4c72, 0x4bb7, 0x4c61, 0x4bc2, 0x4c01, 0x4c0e, 0x4b08, 0x4c84, 0x4c3a, 0x4c66, 0x4c0f, 0x4bdc, 0x4c0c, 0x4bd6, 0x4bbf, 0x4cc2, 0x4c0d, 0x4c1d, 0x4c32, 0x4ad3, 0x4c05, 0x4c37, 0x4c0c, 0x4c05, 0x4b84, 0x4bd2, 0x4c0a, 0x4b9e, 0x4ce4, 0x4bd9, 0x4bc7, 0x4c73, 0x4d5c, 0x4b9a, 0x4c85, 0x4bda, 0x4bda, 0x4c64, 0x4b24, 0x4c7d, 0x4c20, 0x4d02, 0x4c8d, 0x4ca7, 0x4b62, 0x4c51, 0x4afc, 0x4b37, 0x4bcd, 0x4b53, 0x4b13, 0x4b52, 0x4c02, 0x4c0c, 0x4bfd, +0x4c32, 0x4c11, 0x4a40, 0x4ca2, 0x4c22, 0x4c19, 0x4aa7, 0x4c01, 0x4c34, 0x4c47, 0x4b32, 0x4ca8, 0x4be5, 0x4c1d, 0x4bd4, 0x4ac4, 0x4c8d, 0x4c32, 0x4cc2, 0x4bba, 0x4c1a, 0x4b7c, 0x4ba5, 0x4be5, 0x4cbb, 0x4c33, 0x4c3d, 0x4c48, 0x4b43, 0x4c24, 0x4c1d, 0x4c40, 0x4baa, 0x4ba8, 0x4b98, 0x4bcd, 0x4bce, 0x4cba, 0x4b7d, 0x4b8d, 0x4bb5, 0x4ce4, 0x4b96, 0x4ca0, 0x4c24, 0x4c05, 0x4cc7, 0x4af7, 0x4c64, 0x4c80, 0x4cca, 0x4c7e, 0x4ccf, 0x4b75, 0x4c31, 0x4c0f, 0x4bd6, 0x4c06, 0x4b15, 0x4be4, 0x4b63, 0x4c2e, 0x4b47, 0x4c52, +0x4c61, 0x4c53, 0x4bdc, 0x4c9e, 0x4cb4, 0x4c28, 0x4a1a, 0x4c0c, 0x4c94, 0x4cac, 0x4bb2, 0x4c60, 0x4c60, 0x4c3a, 0x4c62, 0x4a97, 0x4cd8, 0x4c64, 0x4c99, 0x4c28, 0x4c53, 0x4c24, 0x4c07, 0x4c4d, 0x4cd1, 0x4c6c, 0x4c6f, 0x4c73, 0x4b8a, 0x4c95, 0x4c90, 0x4c2b, 0x4c0f, 0x4c51, 0x4c4a, 0x4bd4, 0x4c50, 0x4c9e, 0x4ba5, 0x4c36, 0x4c49, 0x4d47, 0x4b7a, 0x4cca, 0x4c3c, 0x4c35, 0x4ce2, 0x4b3c, 0x4c5a, 0x4c4f, 0x4cc7, 0x4ca3, 0x4ccf, 0x4c15, 0x4cc2, 0x4b99, 0x4c7b, 0x4c27, 0x4c10, 0x4c48, 0x4c00, 0x4c6a, 0x4c52, 0x4c54, +0x4b09, 0x4c19, 0x4a32, 0x4bc4, 0x4b3b, 0x4af8, 0x49d4, 0x4b72, 0x4bfc, 0x4c0c, 0x4b36, 0x4c1f, 0x4acf, 0x4ae5, 0x4b09, 0x4a81, 0x4c33, 0x4b6a, 0x4c3a, 0x4b95, 0x4b12, 0x4a77, 0x4afd, 0x4ab9, 0x4c3d, 0x4c0b, 0x4c00, 0x4bad, 0x4acd, 0x4b40, 0x4b1f, 0x4b86, 0x4a9f, 0x4aa4, 0x4b2b, 0x4ab9, 0x4b6a, 0x4c6a, 0x4b4c, 0x4abe, 0x4bba, 0x4cb2, 0x4a99, 0x4c50, 0x4b3f, 0x4b4b, 0x4b6f, 0x4a6d, 0x4bf7, 0x4c26, 0x4c1b, 0x4c46, 0x4c10, 0x4af4, 0x4b77, 0x4b2f, 0x4acb, 0x4be8, 0x4b0a, 0x4a7b, 0x4a5e, 0x4b2a, 0x4af3, 0x4bea, +0x4b46, 0x4b98, 0x4abb, 0x4c19, 0x4bc9, 0x4b2d, 0x499b, 0x4b6f, 0x4c1f, 0x4b9c, 0x4aeb, 0x4c1c, 0x4b8e, 0x4b2c, 0x4b8f, 0x4aca, 0x4c3f, 0x4bad, 0x4bf1, 0x4b87, 0x4b96, 0x4a84, 0x4a5a, 0x4b89, 0x4c13, 0x4b8e, 0x4c2b, 0x4bf6, 0x4a6a, 0x4b77, 0x4be1, 0x4b9a, 0x4b1f, 0x4b31, 0x4b70, 0x4bac, 0x4b4d, 0x4c2c, 0x4add, 0x4b65, 0x4c06, 0x4caf, 0x4aa0, 0x4c08, 0x4b12, 0x4b39, 0x4c44, 0x4a6b, 0x4c29, 0x4c52, 0x4c3e, 0x4c5a, 0x4c33, 0x4b10, 0x4c1f, 0x4ae2, 0x4b0e, 0x4b71, 0x4a89, 0x4a77, 0x4a9c, 0x4b4a, 0x4bdc, 0x4b63, +0x4cbe, 0x4cb1, 0x4b09, 0x4c40, 0x4c9a, 0x4c57, 0x4ad0, 0x4c53, 0x4c7c, 0x4d12, 0x4ba9, 0x4c7e, 0x4c5c, 0x4c66, 0x4c70, 0x4b6d, 0x4d01, 0x4cac, 0x4cd0, 0x4c5f, 0x4c6c, 0x4c34, 0x4c78, 0x4b44, 0x4d37, 0x4cc4, 0x4c82, 0x4ca9, 0x4b49, 0x4c60, 0x4c6f, 0x4c22, 0x4c1e, 0x4c02, 0x4c30, 0x4c8a, 0x4c4e, 0x4cda, 0x4c3a, 0x4bdd, 0x4c80, 0x4db8, 0x4c43, 0x4ca3, 0x4c22, 0x4c30, 0x4ce0, 0x4bf5, 0x4cdf, 0x4cba, 0x4d1c, 0x4cb2, 0x4d1c, 0x4c19, 0x4c9a, 0x4c31, 0x4c7d, 0x4c9b, 0x4c2d, 0x4ba7, 0x4bb1, 0x4bcf, 0x4bf2, 0x4c5b, +0x4c67, 0x4c41, 0x4b75, 0x4bea, 0x4c38, 0x4b9e, 0x4a3c, 0x4c4f, 0x4ca1, 0x4c5d, 0x4b7a, 0x4c28, 0x4c51, 0x4bf3, 0x4ba7, 0x4b09, 0x4c56, 0x4bbb, 0x4c3e, 0x4c0d, 0x4c27, 0x4bc6, 0x4ab4, 0x4c0c, 0x4c71, 0x4c48, 0x4c59, 0x4ca1, 0x4bb3, 0x4c22, 0x4c2e, 0x4c16, 0x4bff, 0x4bfb, 0x4c36, 0x4c3a, 0x4c1b, 0x4c70, 0x4ae9, 0x4c24, 0x4c81, 0x4d0a, 0x4abf, 0x4d06, 0x4be2, 0x4bc3, 0x4c26, 0x4ac5, 0x4c0c, 0x4c65, 0x4cf1, 0x4cbb, 0x4c23, 0x4c60, 0x4c98, 0x4bc7, 0x4b49, 0x4c2e, 0x4b94, 0x4b44, 0x4b1e, 0x4c02, 0x4c27, 0x4c46, +0x4c2a, 0x4c46, 0x4b5a, 0x4cd2, 0x4c98, 0x4c39, 0x4a99, 0x4c50, 0x4c86, 0x4c8a, 0x4c13, 0x4d25, 0x4c02, 0x4c5d, 0x4c36, 0x4b82, 0x4d1f, 0x4ca8, 0x4cc1, 0x4c4f, 0x4c46, 0x4c44, 0x4c02, 0x4c1c, 0x4ceb, 0x4ced, 0x4ca5, 0x4ca5, 0x4b99, 0x4c46, 0x4c6a, 0x4cb6, 0x4c02, 0x4c2c, 0x4c41, 0x4c93, 0x4c50, 0x4ca0, 0x4c36, 0x4c1d, 0x4c70, 0x4dc3, 0x4be2, 0x4ce9, 0x4bd5, 0x4c0b, 0x4d2d, 0x4b41, 0x4caa, 0x4ccc, 0x4ce3, 0x4d4f, 0x4d21, 0x4c6d, 0x4cd0, 0x4c1c, 0x4c3f, 0x4c62, 0x4bcb, 0x4c2e, 0x4c0b, 0x4c8f, 0x4c6d, 0x4c94, +0x4bcc, 0x4c47, 0x4b9d, 0x4c79, 0x4c5e, 0x4c21, 0x4afc, 0x4c5c, 0x4c94, 0x4c82, 0x4c11, 0x4c6c, 0x4c29, 0x4c38, 0x4c1b, 0x4b9f, 0x4cae, 0x4bd2, 0x4d04, 0x4c29, 0x4c02, 0x4bba, 0x4af8, 0x4b58, 0x4ca4, 0x4c94, 0x4ca5, 0x4c71, 0x4b62, 0x4c3f, 0x4c31, 0x4c2c, 0x4b5c, 0x4b67, 0x4c1e, 0x4c46, 0x4c03, 0x4caf, 0x4c20, 0x4bd6, 0x4c75, 0x4d25, 0x4b95, 0x4c9c, 0x4c4d, 0x4bef, 0x4c8f, 0x4b61, 0x4c3c, 0x4c8e, 0x4c92, 0x4cb0, 0x4cda, 0x4c3b, 0x4c48, 0x4bbb, 0x4c3b, 0x4c3d, 0x4c02, 0x4be5, 0x4be0, 0x4b9f, 0x4c2a, 0x4c45, +0x4c2d, 0x4c14, 0x4b82, 0x4c73, 0x4cb5, 0x4c0d, 0x4a21, 0x4c71, 0x4c07, 0x4c4e, 0x4b3f, 0x4c77, 0x4c32, 0x4bbf, 0x4c11, 0x4b4f, 0x4c74, 0x4c5e, 0x4c57, 0x4c1e, 0x4c11, 0x4b77, 0x4b28, 0x4c5e, 0x4c9a, 0x4c74, 0x4c5d, 0x4c5e, 0x4abe, 0x4c22, 0x4bcc, 0x4bf8, 0x4c1e, 0x4b60, 0x4c09, 0x4bce, 0x4c07, 0x4caa, 0x4b09, 0x4c52, 0x4c2d, 0x4d1a, 0x4b86, 0x4ca1, 0x4b5d, 0x4c21, 0x4c9c, 0x4bae, 0x4c33, 0x4c4b, 0x4cf1, 0x4c63, 0x4ce2, 0x4bf0, 0x4c4c, 0x4b4c, 0x4c1f, 0x4c53, 0x4b8a, 0x4b6d, 0x4bc2, 0x4b82, 0x4c58, 0x4bfb, +0x4c33, 0x4c80, 0x4aa0, 0x4c2d, 0x4bfc, 0x4b90, 0x4acc, 0x4c24, 0x4be9, 0x4c90, 0x4b53, 0x4c8c, 0x4c6f, 0x4c4b, 0x4be5, 0x4b6b, 0x4c86, 0x4c19, 0x4c81, 0x4bf9, 0x4c0a, 0x4bb7, 0x4c0f, 0x4ba5, 0x4c7f, 0x4c69, 0x4c40, 0x4c4e, 0x4b0b, 0x4c2e, 0x4be4, 0x4c24, 0x4b28, 0x4bbe, 0x4b54, 0x4be7, 0x4b75, 0x4c6d, 0x4b4c, 0x4b9e, 0x4b94, 0x4d21, 0x4bb2, 0x4c4b, 0x4c36, 0x4c29, 0x4ca8, 0x4a79, 0x4c60, 0x4c7b, 0x4cd5, 0x4c5e, 0x4c7e, 0x4bfa, 0x4c6d, 0x4c07, 0x4c32, 0x4c84, 0x4b33, 0x4b03, 0x4bfe, 0x4b59, 0x4bf8, 0x4c1c, +0x4c66, 0x4c84, 0x4c04, 0x4c94, 0x4ca2, 0x4c49, 0x4aa3, 0x4c6a, 0x4c79, 0x4ce0, 0x4c08, 0x4ca5, 0x4c9f, 0x4c5b, 0x4c82, 0x4bc4, 0x4cf1, 0x4c54, 0x4c92, 0x4c50, 0x4c8e, 0x4c5c, 0x4c16, 0x4ccd, 0x4d23, 0x4cb6, 0x4c97, 0x4cc1, 0x4c07, 0x4c5d, 0x4c3d, 0x4c29, 0x4c2f, 0x4c08, 0x4c6b, 0x4c1f, 0x4c27, 0x4ccf, 0x4c2d, 0x4c3a, 0x4c6c, 0x4d64, 0x4bd8, 0x4d0a, 0x4c5d, 0x4c37, 0x4ceb, 0x4c3b, 0x4c51, 0x4d00, 0x4d3f, 0x4cbc, 0x4cfd, 0x4c19, 0x4cca, 0x4c45, 0x4c69, 0x4c78, 0x4c0f, 0x4c39, 0x4c21, 0x4c72, 0x4c3a, 0x4c57, +0x4c9c, 0x4c67, 0x4b98, 0x4c57, 0x4ca5, 0x4c0d, 0x4a8d, 0x4c38, 0x4cac, 0x4ca5, 0x4c46, 0x4c7d, 0x4c86, 0x4c60, 0x4c1d, 0x4ade, 0x4cb4, 0x4cae, 0x4c75, 0x4c45, 0x4c73, 0x4c65, 0x4b9f, 0x4c0c, 0x4d38, 0x4cae, 0x4c5d, 0x4c8c, 0x4b7f, 0x4c32, 0x4c64, 0x4c99, 0x4c4c, 0x4c31, 0x4c30, 0x4c4f, 0x4c8d, 0x4cec, 0x4bcc, 0x4c03, 0x4c9d, 0x4d85, 0x4c34, 0x4cde, 0x4be9, 0x4ba6, 0x4cae, 0x4c02, 0x4c8d, 0x4ca9, 0x4dae, 0x4cb7, 0x4ca3, 0x4c39, 0x4cab, 0x4bc6, 0x4c06, 0x4c93, 0x4c02, 0x4bfa, 0x4c03, 0x4c16, 0x4c35, 0x4cb4, +0x4bff, 0x4bfc, 0x4aa3, 0x4bbf, 0x4bf6, 0x4c1b, 0x4abd, 0x4b76, 0x4c4b, 0x4c4f, 0x4b28, 0x4c45, 0x4bdc, 0x4b5f, 0x4bb4, 0x4ac7, 0x4c8f, 0x4c0e, 0x4c7d, 0x4bc1, 0x4be2, 0x4bde, 0x4b36, 0x4ba3, 0x4ca0, 0x4c4f, 0x4bc2, 0x4c57, 0x4b38, 0x4b88, 0x4bfe, 0x4bdb, 0x4be2, 0x4b7d, 0x4bfe, 0x4bfb, 0x4b0a, 0x4c64, 0x4baa, 0x4b50, 0x4b96, 0x4d07, 0x4ac0, 0x4c2f, 0x4bdd, 0x4bfe, 0x4c97, 0x4a7f, 0x4c46, 0x4c52, 0x4c62, 0x4c8d, 0x4c3e, 0x4bf1, 0x4c3b, 0x4b36, 0x4b97, 0x4c0f, 0x4a8e, 0x4bb1, 0x4ba8, 0x4c06, 0x4b64, 0x4bd5, +0x4c62, 0x4c96, 0x4af4, 0x4bae, 0x4c5a, 0x4c67, 0x4b00, 0x4c96, 0x4cb1, 0x4c88, 0x4b84, 0x4c01, 0x4c85, 0x4c4c, 0x4b5c, 0x4b6f, 0x4c59, 0x4c29, 0x4c4f, 0x4c7f, 0x4c58, 0x4c39, 0x4b0f, 0x4b00, 0x4cd9, 0x4c4e, 0x4c18, 0x4c84, 0x4b26, 0x4c21, 0x4c4b, 0x4bc2, 0x4c54, 0x4bc8, 0x4bfa, 0x4c29, 0x4c10, 0x4c64, 0x4b46, 0x4b96, 0x4c87, 0x4cfc, 0x4bed, 0x4c41, 0x4be1, 0x4b94, 0x4c66, 0x4ab8, 0x4c67, 0x4c5b, 0x4ce1, 0x4c5c, 0x4c6d, 0x4c24, 0x4bf2, 0x4be5, 0x4c08, 0x4c89, 0x4b5f, 0x4c19, 0x4b89, 0x4bd9, 0x4bfe, 0x4c2c, +0x4c3d, 0x4c57, 0x4afb, 0x4c1c, 0x4c44, 0x4c02, 0x49fb, 0x4c7b, 0x4c7f, 0x4c50, 0x4bcd, 0x4c28, 0x4c47, 0x4c02, 0x4c26, 0x4ab7, 0x4c82, 0x4bc0, 0x4c88, 0x4bfe, 0x4c5d, 0x4b3d, 0x4bf3, 0x4c02, 0x4cf6, 0x4c6e, 0x4c56, 0x4c72, 0x4b36, 0x4c23, 0x4be3, 0x4c74, 0x4b48, 0x4bae, 0x4c56, 0x4c3b, 0x4c11, 0x4c85, 0x4c36, 0x4ba5, 0x4c66, 0x4d49, 0x4b72, 0x4c66, 0x4c0b, 0x4ba4, 0x4c99, 0x4bb5, 0x4c83, 0x4c6f, 0x4c9b, 0x4c89, 0x4c7a, 0x4c38, 0x4ca5, 0x4b9e, 0x4c0f, 0x4c78, 0x4c32, 0x4bc9, 0x4b27, 0x4b7b, 0x4bdc, 0x4c26, +0x4d0b, 0x4cad, 0x4b71, 0x4c51, 0x4ccb, 0x4c4d, 0x4a85, 0x4c85, 0x4d21, 0x4cec, 0x4c3d, 0x4c82, 0x4c8e, 0x4cb7, 0x4c73, 0x4c14, 0x4d34, 0x4cd6, 0x4cd9, 0x4c50, 0x4c45, 0x4c49, 0x4c46, 0x4c8a, 0x4d06, 0x4c73, 0x4c8e, 0x4cd9, 0x4c62, 0x4c8a, 0x4c82, 0x4c99, 0x4c10, 0x4c3c, 0x4c6a, 0x4c64, 0x4ca5, 0x4cc1, 0x4c3c, 0x4c13, 0x4c87, 0x4d88, 0x4c14, 0x4cb6, 0x4c56, 0x4cad, 0x4cfa, 0x4c58, 0x4c9e, 0x4cbf, 0x4d5b, 0x4cc7, 0x4cd1, 0x4c61, 0x4c87, 0x4c2f, 0x4c51, 0x4ce2, 0x4c5e, 0x4c2e, 0x4bf5, 0x4c67, 0x4c6d, 0x4ce9, +0x4c1c, 0x4be6, 0x4abe, 0x4bf0, 0x4c57, 0x4b7a, 0x4ab4, 0x4be5, 0x4c36, 0x4ca2, 0x4a7b, 0x4c31, 0x4bf4, 0x4b0e, 0x4c0c, 0x4b4e, 0x4ca2, 0x4b99, 0x4c33, 0x4bf1, 0x4bdc, 0x4b64, 0x4bc3, 0x4bb7, 0x4c66, 0x4c35, 0x4c0c, 0x4c47, 0x4ae4, 0x4b8d, 0x4c5e, 0x4ba2, 0x4c13, 0x4b55, 0x4b72, 0x4b70, 0x4b6b, 0x4c64, 0x4b95, 0x4b0c, 0x4c52, 0x4d18, 0x4a67, 0x4c48, 0x4b8f, 0x4c06, 0x4c83, 0x4b3f, 0x4c59, 0x4c6e, 0x4c94, 0x4c39, 0x4c64, 0x4be2, 0x4c21, 0x4ae5, 0x4b4e, 0x4c20, 0x4b17, 0x4bc5, 0x4b4f, 0x4bd1, 0x4b3e, 0x4bbd, +0x4b81, 0x4bfa, 0x49d8, 0x4b10, 0x4bb9, 0x4b11, 0x4979, 0x4bb0, 0x4b60, 0x4bb1, 0x4a30, 0x4b26, 0x4bb8, 0x4b4f, 0x4a84, 0x49a9, 0x4ba8, 0x4ac8, 0x4b9f, 0x4a85, 0x4b99, 0x4a02, 0x4b05, 0x4ae0, 0x4c5f, 0x4b74, 0x4b52, 0x4b90, 0x4a50, 0x4b53, 0x4ab8, 0x4b59, 0x4ab1, 0x4b20, 0x4b4c, 0x4a95, 0x4b0d, 0x4b74, 0x4a0a, 0x4aef, 0x4b68, 0x4c1d, 0x4a7c, 0x4c19, 0x4b22, 0x4a7b, 0x4c1c, 0x4a5f, 0x4c12, 0x4b74, 0x4bab, 0x4bba, 0x4b58, 0x4af7, 0x4bde, 0x4b62, 0x4b1c, 0x4b57, 0x4aba, 0x4ad8, 0x4a12, 0x4ae2, 0x4ab5, 0x4bbc, +0x4c74, 0x4c7e, 0x4b1e, 0x4bde, 0x4c70, 0x4be5, 0x4a4c, 0x4c41, 0x4cae, 0x4c6b, 0x4b5f, 0x4c2b, 0x4bda, 0x4ba9, 0x4b7e, 0x4aae, 0x4c8c, 0x4c12, 0x4c1c, 0x4b70, 0x4c0d, 0x4bbc, 0x4ae6, 0x4bc4, 0x4cac, 0x4c36, 0x4c0c, 0x4c03, 0x4b94, 0x4c2a, 0x4c37, 0x4c5a, 0x4b76, 0x4bdb, 0x4bb5, 0x4c5b, 0x4c25, 0x4c62, 0x4b57, 0x4bda, 0x4c32, 0x4cc3, 0x4b9f, 0x4c7f, 0x4b61, 0x4b75, 0x4c60, 0x4b0d, 0x4c11, 0x4ca1, 0x4d3f, 0x4c48, 0x4ce7, 0x4c16, 0x4c36, 0x4bc6, 0x4c07, 0x4c63, 0x4b34, 0x4b28, 0x4b79, 0x4b4e, 0x4b95, 0x4c42, +0x4bb9, 0x4b63, 0x4aaa, 0x4bb6, 0x4c0d, 0x4b40, 0x4a03, 0x4bad, 0x4c0e, 0x4c09, 0x4ac3, 0x4c05, 0x4c30, 0x4c28, 0x4b7f, 0x4a71, 0x4bfc, 0x4c0c, 0x4bff, 0x4bf3, 0x4c0e, 0x4aad, 0x4b9b, 0x4b3e, 0x4cb9, 0x4c66, 0x4c37, 0x4be1, 0x4a95, 0x4bba, 0x4bca, 0x4b76, 0x4ada, 0x4aeb, 0x4b74, 0x4c18, 0x4b47, 0x4b58, 0x4b4f, 0x4b11, 0x4bfb, 0x4ce0, 0x4ad1, 0x4bd5, 0x4b3b, 0x4ae6, 0x4c5a, 0x4ac7, 0x4c2f, 0x4c50, 0x4c32, 0x4c19, 0x4c16, 0x4ba8, 0x4bfa, 0x4bb2, 0x4c17, 0x4c09, 0x4b2b, 0x4b2e, 0x4b24, 0x4b89, 0x4ac7, 0x4b20, +0x4c25, 0x4ccb, 0x4b85, 0x4c49, 0x4c69, 0x4c56, 0x4ae8, 0x4c46, 0x4c9e, 0x4ccb, 0x4b58, 0x4cae, 0x4c46, 0x4be5, 0x4b90, 0x4bc2, 0x4c8a, 0x4c47, 0x4cca, 0x4c5c, 0x4c68, 0x4c4e, 0x4c02, 0x4bfa, 0x4ce4, 0x4cb0, 0x4c65, 0x4c87, 0x4b89, 0x4c2d, 0x4c7e, 0x4c2d, 0x4c12, 0x4c27, 0x4be3, 0x4c52, 0x4bde, 0x4ca1, 0x4c18, 0x4c00, 0x4cbf, 0x4d3e, 0x4c30, 0x4cb3, 0x4c39, 0x4c02, 0x4cc4, 0x4b51, 0x4c4e, 0x4c9c, 0x4ce4, 0x4cf5, 0x4cc4, 0x4c0d, 0x4c65, 0x4c12, 0x4c03, 0x4cb9, 0x4b3e, 0x4c04, 0x4c02, 0x4baa, 0x4bcb, 0x4c59, +0x4c02, 0x4c76, 0x4b21, 0x4c02, 0x4c3e, 0x4c67, 0x4a53, 0x4be0, 0x4ca5, 0x4c62, 0x4a63, 0x4c65, 0x4c2c, 0x4c09, 0x4b71, 0x4aaa, 0x4c1d, 0x4c14, 0x4c83, 0x4c00, 0x4bd9, 0x4b1b, 0x4af1, 0x4ba6, 0x4cd1, 0x4bfa, 0x4c33, 0x4c55, 0x4be8, 0x4c02, 0x4c4c, 0x4be6, 0x4c1e, 0x4b9c, 0x4b85, 0x4b5b, 0x4be8, 0x4c83, 0x4ba6, 0x4bbe, 0x4c19, 0x4cf9, 0x4b99, 0x4caf, 0x4c3e, 0x4c02, 0x4cf0, 0x4b26, 0x4c63, 0x4c6f, 0x4cc5, 0x4c6e, 0x4c66, 0x4ab9, 0x4b7e, 0x4bde, 0x4bd2, 0x4c56, 0x4b82, 0x4bc2, 0x4aef, 0x4bf1, 0x4be9, 0x4c2c, +0x4c0a, 0x4c7c, 0x4a5c, 0x4c0e, 0x4c2e, 0x4c02, 0x49f6, 0x4c1e, 0x4c1f, 0x4c94, 0x4b1a, 0x4bf1, 0x4c44, 0x4b95, 0x4c43, 0x4b1a, 0x4c9d, 0x4c24, 0x4c57, 0x4c35, 0x4c55, 0x4b5e, 0x4ba7, 0x4c11, 0x4c6b, 0x4bcb, 0x4c2d, 0x4c1b, 0x4a69, 0x4c15, 0x4c1f, 0x4be1, 0x4ba3, 0x4b87, 0x4c2c, 0x4bce, 0x4bc7, 0x4c73, 0x4bbf, 0x4c08, 0x4c6d, 0x4d19, 0x4b01, 0x4c01, 0x4c17, 0x4b59, 0x4c3d, 0x4b6a, 0x4c6a, 0x4bec, 0x4ca6, 0x4bf8, 0x4c99, 0x4bca, 0x4c89, 0x4b39, 0x4c1e, 0x4bd0, 0x4b8a, 0x4c13, 0x4b84, 0x4c05, 0x4ae5, 0x4b6b, +0x4c40, 0x4c2b, 0x4b50, 0x4c8c, 0x4ca4, 0x4c50, 0x4a2b, 0x4c24, 0x4c6e, 0x4d0e, 0x4c05, 0x4c94, 0x4bf8, 0x4ba9, 0x4c47, 0x4b24, 0x4ccb, 0x4c89, 0x4d06, 0x4b72, 0x4c82, 0x4c2d, 0x4b80, 0x4bc6, 0x4ce7, 0x4cc9, 0x4c4e, 0x4c65, 0x4c12, 0x4c6e, 0x4c3e, 0x4c43, 0x4c36, 0x4c05, 0x4c74, 0x4c3d, 0x4c30, 0x4ce6, 0x4c04, 0x4c4f, 0x4bfb, 0x4d5e, 0x4c03, 0x4d11, 0x4c5d, 0x4c22, 0x4d07, 0x4b69, 0x4c48, 0x4c75, 0x4d61, 0x4cb2, 0x4ce8, 0x4c4a, 0x4c77, 0x4c22, 0x4c34, 0x4c6d, 0x4c02, 0x4c32, 0x4b96, 0x4c3f, 0x4c0f, 0x4c3b, +0x4bd4, 0x4c2c, 0x4b93, 0x4c67, 0x4c5b, 0x4c0a, 0x4ae5, 0x4c45, 0x4ca2, 0x4c6a, 0x4c13, 0x4c5e, 0x4be3, 0x4c14, 0x4be8, 0x4be9, 0x4c96, 0x4c71, 0x4c97, 0x4c42, 0x4c01, 0x4bbd, 0x4bad, 0x4c07, 0x4cf0, 0x4ca5, 0x4c72, 0x4c45, 0x4b3a, 0x4c46, 0x4be6, 0x4c63, 0x4bb4, 0x4be8, 0x4c29, 0x4c1e, 0x4be8, 0x4cb6, 0x4bba, 0x4bba, 0x4c8c, 0x4d52, 0x4b5e, 0x4c6d, 0x4bda, 0x4b90, 0x4c95, 0x4b9a, 0x4ca5, 0x4cb7, 0x4c7e, 0x4cb2, 0x4cd0, 0x4c0f, 0x4c8f, 0x4baa, 0x4bde, 0x4c09, 0x4b92, 0x4b78, 0x4c20, 0x4c37, 0x4c3e, 0x4c00, +0x4c11, 0x4c12, 0x4ab3, 0x4bbf, 0x4c16, 0x4ab8, 0x498a, 0x4c04, 0x4be1, 0x4bc1, 0x4ad4, 0x4c11, 0x4be8, 0x4b8d, 0x4b1a, 0x4aad, 0x4c62, 0x4c0b, 0x4c60, 0x4b08, 0x4bad, 0x4b6d, 0x4b93, 0x4bd8, 0x4c39, 0x4c0d, 0x4be3, 0x4bf6, 0x4a94, 0x4bd3, 0x4bc6, 0x4c18, 0x4b21, 0x4b93, 0x4b79, 0x4bbc, 0x4bb0, 0x4c1f, 0x4b07, 0x4bcf, 0x4bde, 0x4cc6, 0x4ac7, 0x4c6b, 0x4b51, 0x4b9d, 0x4c59, 0x4ae4, 0x4c04, 0x4c14, 0x4c71, 0x4be6, 0x4c40, 0x4b5f, 0x4c18, 0x4a87, 0x4b5b, 0x4bd5, 0x4bc7, 0x4bc0, 0x4ac9, 0x4bd7, 0x4b47, 0x4bfb, +0x4c5b, 0x4c3d, 0x4ba8, 0x4c2e, 0x4c75, 0x4c5c, 0x4a59, 0x4c0b, 0x4cad, 0x4cb8, 0x4bc2, 0x4c77, 0x4c09, 0x4be5, 0x4c10, 0x4b93, 0x4c8d, 0x4c66, 0x4c93, 0x4c47, 0x4bca, 0x4ba1, 0x4c08, 0x4baa, 0x4c92, 0x4c87, 0x4c41, 0x4c73, 0x4c01, 0x4c72, 0x4c10, 0x4bf0, 0x4b5c, 0x4c04, 0x4c5a, 0x4be6, 0x4c1f, 0x4c61, 0x4bf3, 0x4c3c, 0x4c58, 0x4d04, 0x4b48, 0x4c6d, 0x4c1c, 0x4b9d, 0x4c5d, 0x4be3, 0x4c28, 0x4cb2, 0x4cc8, 0x4c82, 0x4d45, 0x4c1c, 0x4c7a, 0x4b63, 0x4c1b, 0x4c88, 0x4c3a, 0x4c2e, 0x4bbe, 0x4bd9, 0x4ba4, 0x4c06, +0x4bed, 0x4b88, 0x4a1d, 0x4ae5, 0x4b55, 0x4b5d, 0x49e8, 0x4b86, 0x4b40, 0x4b88, 0x4a71, 0x4c14, 0x4b3e, 0x4b55, 0x4aa2, 0x4a13, 0x4c16, 0x4bba, 0x4c42, 0x4af3, 0x4b3d, 0x4aef, 0x4a78, 0x4af2, 0x4bcc, 0x4b4e, 0x4b2d, 0x4be0, 0x4ab1, 0x4baa, 0x4aeb, 0x4b3d, 0x4aeb, 0x4b5c, 0x4b1c, 0x4ba3, 0x4b10, 0x4b71, 0x4b56, 0x4a0a, 0x4ad1, 0x4c75, 0x4a9a, 0x4b4b, 0x4b42, 0x4b32, 0x4c54, 0x4a1a, 0x4b76, 0x4b27, 0x4c49, 0x4b9a, 0x4b81, 0x4b2e, 0x4b5f, 0x4a6b, 0x4aa2, 0x4b89, 0x4b7a, 0x4b4c, 0x4a8f, 0x4afa, 0x4add, 0x4b6c, +0x4c23, 0x4ca1, 0x4b53, 0x4c83, 0x4c92, 0x4c4a, 0x4a54, 0x4c12, 0x4c7e, 0x4c97, 0x4c55, 0x4cc6, 0x4c38, 0x4be8, 0x4be7, 0x4bd5, 0x4ca0, 0x4c83, 0x4cf2, 0x4c66, 0x4c33, 0x4c05, 0x4bd8, 0x4bf9, 0x4cac, 0x4cce, 0x4c62, 0x4c74, 0x4bec, 0x4c41, 0x4c0f, 0x4c64, 0x4b96, 0x4bf1, 0x4c39, 0x4c82, 0x4c02, 0x4cad, 0x4c69, 0x4c17, 0x4c61, 0x4d56, 0x4bfb, 0x4c61, 0x4bed, 0x4c02, 0x4cd9, 0x4ba6, 0x4c02, 0x4ca3, 0x4ce5, 0x4cdb, 0x4d13, 0x4c24, 0x4c43, 0x4c12, 0x4c2b, 0x4c98, 0x4c26, 0x4c32, 0x4c22, 0x4c1d, 0x4c09, 0x4c1e, +0x4c91, 0x4c4b, 0x4be4, 0x4c54, 0x4ca6, 0x4c16, 0x4af8, 0x4c4f, 0x4cb9, 0x4cc8, 0x4c01, 0x4c6a, 0x4c72, 0x4c6c, 0x4c6e, 0x4ba1, 0x4cd8, 0x4c76, 0x4cc0, 0x4c56, 0x4c77, 0x4c79, 0x4c2f, 0x4c64, 0x4cdd, 0x4c8c, 0x4c48, 0x4cb2, 0x4bc7, 0x4c46, 0x4c75, 0x4c0a, 0x4c09, 0x4c70, 0x4c1f, 0x4c78, 0x4c39, 0x4c97, 0x4be1, 0x4bdf, 0x4c97, 0x4d67, 0x4ba7, 0x4ccb, 0x4c35, 0x4c05, 0x4cde, 0x4b7f, 0x4cb4, 0x4c95, 0x4d04, 0x4cc9, 0x4d09, 0x4c77, 0x4c90, 0x4c41, 0x4c0d, 0x4c39, 0x4bed, 0x4c24, 0x4c02, 0x4c87, 0x4c32, 0x4c3a, +0x4c12, 0x4c5a, 0x4aa0, 0x4c0e, 0x4c3a, 0x4baa, 0x4a48, 0x4c1e, 0x4ca6, 0x4c74, 0x4ba9, 0x4c64, 0x4bf6, 0x4b18, 0x4b90, 0x4b7b, 0x4cac, 0x4c0e, 0x4c90, 0x4c2b, 0x4c11, 0x4b1d, 0x4b6d, 0x4bd8, 0x4ccf, 0x4c0a, 0x4bc5, 0x4c84, 0x4b7f, 0x4c0a, 0x4c30, 0x4bdd, 0x4b45, 0x4ad1, 0x4b9f, 0x4c19, 0x4bfb, 0x4c44, 0x4c46, 0x4b6f, 0x4c60, 0x4cbd, 0x4b08, 0x4c6d, 0x4c04, 0x4c11, 0x4c12, 0x4af7, 0x4bab, 0x4c56, 0x4cad, 0x4c86, 0x4c93, 0x4bc7, 0x4c2d, 0x4ad9, 0x4c06, 0x4c30, 0x4bae, 0x4ba4, 0x4afb, 0x4bb3, 0x4c09, 0x4b89, +0x4c06, 0x4c63, 0x4b5d, 0x4c84, 0x4c06, 0x4bc8, 0x49ef, 0x4b95, 0x4c54, 0x4c42, 0x4b71, 0x4c32, 0x4b52, 0x4b1e, 0x4af1, 0x4ae9, 0x4c9c, 0x4c25, 0x4c66, 0x4bfd, 0x4b67, 0x4bcd, 0x4af2, 0x4b7e, 0x4c74, 0x4c29, 0x4b7e, 0x4c0a, 0x4b2a, 0x4c26, 0x4bb8, 0x4c07, 0x4bec, 0x4b71, 0x4b8f, 0x4b14, 0x4bb2, 0x4c8e, 0x4beb, 0x4bac, 0x4bfb, 0x4ce0, 0x4b34, 0x4c21, 0x4be1, 0x4c03, 0x4c53, 0x4b86, 0x4baf, 0x4c40, 0x4c98, 0x4c6c, 0x4c78, 0x4bfc, 0x4c15, 0x4b54, 0x4b6a, 0x4c30, 0x4be2, 0x4b3e, 0x4b43, 0x4b15, 0x4bae, 0x4beb, +0x4b6a, 0x4bc9, 0x4ad8, 0x4c28, 0x4c3b, 0x4b99, 0x4968, 0x4c03, 0x4c24, 0x4c33, 0x4ad3, 0x4c45, 0x4b18, 0x4b63, 0x4bb1, 0x4b29, 0x4c3e, 0x4baf, 0x4c04, 0x4b78, 0x4bb4, 0x4af2, 0x4a83, 0x4c44, 0x4c67, 0x4c1e, 0x4bad, 0x4c2e, 0x4b07, 0x4bff, 0x4b1c, 0x4beb, 0x4b00, 0x4b1c, 0x4bfe, 0x4b86, 0x4b6d, 0x4c09, 0x4b2e, 0x4ba4, 0x4c16, 0x4c94, 0x4b32, 0x4c2e, 0x4b28, 0x4b2d, 0x4c35, 0x4b09, 0x4b4c, 0x4c25, 0x4c9c, 0x4c3a, 0x4c22, 0x4b95, 0x4c0a, 0x4af1, 0x4b20, 0x4c3d, 0x4b79, 0x4b40, 0x4a9e, 0x4b52, 0x4c09, 0x4c03, +0x4c74, 0x4c1c, 0x4bc9, 0x4c74, 0x4ccf, 0x4c62, 0x4ad2, 0x4c51, 0x4cbe, 0x4c92, 0x4bdf, 0x4c8e, 0x4c57, 0x4c0f, 0x4c13, 0x4b34, 0x4ce0, 0x4c8a, 0x4ccc, 0x4bf7, 0x4c61, 0x4c6a, 0x4b81, 0x4bda, 0x4cf7, 0x4c7f, 0x4c58, 0x4c3a, 0x4bc5, 0x4c5e, 0x4c5b, 0x4c7a, 0x4c09, 0x4c3a, 0x4c5c, 0x4c3d, 0x4c02, 0x4d0a, 0x4c29, 0x4bc8, 0x4c98, 0x4d8b, 0x4b6a, 0x4c9b, 0x4c20, 0x4bfb, 0x4d3d, 0x4ba0, 0x4c7c, 0x4c82, 0x4cf2, 0x4d27, 0x4cd0, 0x4c68, 0x4c8d, 0x4bdb, 0x4c29, 0x4c69, 0x4c08, 0x4c0a, 0x4b5d, 0x4bc8, 0x4c0d, 0x4c92, +0x4c0e, 0x4c3f, 0x4be7, 0x4ca5, 0x4c4f, 0x4c20, 0x4b1d, 0x4c78, 0x4ca0, 0x4c56, 0x4c24, 0x4cc9, 0x4c33, 0x4c49, 0x4c1d, 0x4b6b, 0x4ccd, 0x4c2e, 0x4c8d, 0x4c0b, 0x4c36, 0x4bf8, 0x4c20, 0x4c20, 0x4d0a, 0x4caa, 0x4c6a, 0x4cfc, 0x4c00, 0x4c83, 0x4c4e, 0x4c51, 0x4bd1, 0x4c20, 0x4c5a, 0x4c23, 0x4c15, 0x4ce6, 0x4bcf, 0x4c35, 0x4c46, 0x4d3d, 0x4bfd, 0x4ccb, 0x4c41, 0x4c07, 0x4cea, 0x4b69, 0x4c6f, 0x4c8e, 0x4cfa, 0x4d22, 0x4cb5, 0x4c45, 0x4c7d, 0x4bb2, 0x4c3f, 0x4c42, 0x4be8, 0x4b9b, 0x4c02, 0x4c41, 0x4ca7, 0x4c66, +0x4c6d, 0x4c2a, 0x4aa4, 0x4c4d, 0x4c66, 0x4bdd, 0x4a63, 0x4c28, 0x4c8c, 0x4c75, 0x4b96, 0x4c2a, 0x4c12, 0x4c4c, 0x4c02, 0x4b1a, 0x4c83, 0x4c58, 0x4c9d, 0x4be6, 0x4bdb, 0x4c28, 0x4c2f, 0x4be7, 0x4d14, 0x4cc4, 0x4c44, 0x4c63, 0x4b29, 0x4c02, 0x4c42, 0x4c30, 0x4b95, 0x4c00, 0x4c51, 0x4c44, 0x4bf3, 0x4c43, 0x4bc4, 0x4c03, 0x4c4f, 0x4d51, 0x4b58, 0x4c66, 0x4c14, 0x4b7b, 0x4ce0, 0x4baa, 0x4c5b, 0x4c9b, 0x4cd8, 0x4c76, 0x4c67, 0x4c22, 0x4c93, 0x4bb1, 0x4c55, 0x4c5d, 0x4c40, 0x4c1d, 0x4bb1, 0x4c38, 0x4b7b, 0x4c6a, +0x4be8, 0x4caa, 0x4a58, 0x4c00, 0x4c10, 0x4c03, 0x4b11, 0x4c63, 0x4c52, 0x4c94, 0x4b0d, 0x4c02, 0x4c1f, 0x4b84, 0x4bae, 0x4b3a, 0x4c11, 0x4c3f, 0x4cca, 0x4be1, 0x4c03, 0x4c1c, 0x4b65, 0x4b62, 0x4c64, 0x4c31, 0x4bc5, 0x4c6c, 0x4ba4, 0x4c48, 0x4c11, 0x4b6b, 0x4b61, 0x4baa, 0x4bec, 0x4c1f, 0x4b43, 0x4c65, 0x4c0a, 0x4bc5, 0x4c19, 0x4d1c, 0x4bb6, 0x4c12, 0x4c27, 0x4be2, 0x4cb6, 0x4ab5, 0x4c93, 0x4c64, 0x4c93, 0x4cb1, 0x4c8f, 0x4b64, 0x4c39, 0x4c1d, 0x4b9d, 0x4c48, 0x4b0b, 0x4b08, 0x4b8a, 0x4b85, 0x4b83, 0x4c19, +0x4c15, 0x4c34, 0x4afb, 0x4c55, 0x4c72, 0x4c14, 0x4a7a, 0x4c3d, 0x4c7e, 0x4c27, 0x4b98, 0x4cc6, 0x4c4f, 0x4b12, 0x4b2e, 0x4b60, 0x4c8d, 0x4c5b, 0x4c64, 0x4bee, 0x4c18, 0x4bcf, 0x4c1a, 0x4c2c, 0x4ce1, 0x4c61, 0x4c0e, 0x4c26, 0x4b81, 0x4c08, 0x4c29, 0x4c23, 0x4bf0, 0x4be5, 0x4bcc, 0x4c3f, 0x4c05, 0x4cbb, 0x4c30, 0x4b4e, 0x4c32, 0x4cff, 0x4b5a, 0x4c80, 0x4c15, 0x4bed, 0x4cd4, 0x4ab8, 0x4c55, 0x4c89, 0x4cac, 0x4c9f, 0x4c75, 0x4c38, 0x4c44, 0x4be0, 0x4c16, 0x4c0b, 0x4c06, 0x4bd4, 0x4b5b, 0x4bdc, 0x4bb6, 0x4c6c, +0x4b9d, 0x4bf7, 0x49d3, 0x4b5e, 0x4b8b, 0x4b8f, 0x4934, 0x4b77, 0x4b7e, 0x4c32, 0x4a26, 0x4bf3, 0x4ba1, 0x4bf1, 0x4b35, 0x4a1d, 0x4c14, 0x4bf7, 0x4c37, 0x4b70, 0x4b74, 0x4aac, 0x4b30, 0x4b86, 0x4c6d, 0x4c3e, 0x4bc0, 0x4bd7, 0x4a69, 0x4b39, 0x4b56, 0x4b2f, 0x4b9b, 0x4b3f, 0x4b34, 0x4bcc, 0x4aec, 0x4c28, 0x4aa4, 0x4b77, 0x4b3d, 0x4c83, 0x4aa8, 0x4c24, 0x4acc, 0x4b6e, 0x4c08, 0x4a66, 0x4be0, 0x4b77, 0x4ca6, 0x4bb5, 0x4c06, 0x4b1d, 0x4bdb, 0x4ad0, 0x4bc7, 0x4b95, 0x4a55, 0x4b9d, 0x4b03, 0x4b57, 0x4b1f, 0x4b38, +0x4c38, 0x4c14, 0x4aa8, 0x4be2, 0x4c4a, 0x4c2e, 0x4a73, 0x4c34, 0x4c56, 0x4c28, 0x4ac1, 0x4c35, 0x4c38, 0x4c0e, 0x4b84, 0x4a9e, 0x4c4a, 0x4bfa, 0x4c84, 0x4c0e, 0x4be7, 0x4b78, 0x4c06, 0x4b71, 0x4cac, 0x4bef, 0x4c3e, 0x4c3a, 0x4b20, 0x4b84, 0x4c1d, 0x4ba8, 0x4ba0, 0x4b94, 0x4ba3, 0x4c6c, 0x4bea, 0x4c4e, 0x4b9d, 0x4bac, 0x4c2f, 0x4cd4, 0x4b6c, 0x4c2e, 0x4bfe, 0x4bea, 0x4c92, 0x4a89, 0x4c08, 0x4c61, 0x4c68, 0x4ca6, 0x4ca9, 0x4c3e, 0x4c4e, 0x4b16, 0x4c05, 0x4c30, 0x4bc9, 0x4ba4, 0x4ad1, 0x4b2e, 0x4c2e, 0x4bf0, +0x4ae3, 0x4b77, 0x4a5e, 0x4c28, 0x4b71, 0x4a92, 0x49f9, 0x4b3c, 0x4c0f, 0x4b47, 0x4ae8, 0x4bb9, 0x4b1c, 0x4bb3, 0x4ac5, 0x4a9a, 0x4c46, 0x4b18, 0x4bed, 0x4b90, 0x4b06, 0x4ab9, 0x4ad8, 0x4ae3, 0x4c74, 0x4bb4, 0x4b72, 0x4c13, 0x4aaf, 0x4b81, 0x4bf9, 0x4c00, 0x4b2e, 0x4aa8, 0x4b11, 0x4b5d, 0x4ae6, 0x4bf3, 0x4a75, 0x4a9a, 0x4bd3, 0x4c38, 0x4b18, 0x4c09, 0x4b87, 0x4b2d, 0x4c14, 0x4a47, 0x4b74, 0x4be8, 0x4c42, 0x4bc4, 0x4ba1, 0x4b2a, 0x4bc0, 0x4a4d, 0x4b16, 0x4bb4, 0x4afa, 0x4ad9, 0x4ad7, 0x4b6c, 0x4aec, 0x4c15, +0x4c52, 0x4c38, 0x4b25, 0x4c30, 0x4c67, 0x4c3f, 0x4aa1, 0x4c05, 0x4c3f, 0x4c7f, 0x4bb3, 0x4c5f, 0x4c4e, 0x4c6c, 0x4c27, 0x4aae, 0x4c58, 0x4c51, 0x4c7d, 0x4c0b, 0x4c0e, 0x4c75, 0x4c24, 0x4bf9, 0x4c95, 0x4c3f, 0x4c6b, 0x4cb8, 0x4b50, 0x4c19, 0x4c6b, 0x4c06, 0x4b56, 0x4c14, 0x4c17, 0x4c26, 0x4c07, 0x4c98, 0x4b96, 0x4c05, 0x4c2d, 0x4d1d, 0x4bcf, 0x4c1c, 0x4c1a, 0x4c2c, 0x4ca5, 0x4b4c, 0x4c41, 0x4c2d, 0x4ced, 0x4ca1, 0x4c90, 0x4c29, 0x4c5d, 0x4bf9, 0x4bf2, 0x4c99, 0x4c00, 0x4c08, 0x4bbf, 0x4c1d, 0x4c47, 0x4c19, +0x4c3a, 0x4c1a, 0x4aad, 0x4bd5, 0x4c67, 0x4bf1, 0x4a82, 0x4c1b, 0x4c5a, 0x4c56, 0x4b0f, 0x4c65, 0x4c0b, 0x4bbc, 0x4c23, 0x4b60, 0x4c59, 0x4c14, 0x4c76, 0x4bc5, 0x4b7d, 0x4b5b, 0x4bfd, 0x4c14, 0x4c33, 0x4be3, 0x4c5a, 0x4c48, 0x4b37, 0x4c13, 0x4c17, 0x4c3d, 0x4bff, 0x4b70, 0x4bf4, 0x4c32, 0x4b75, 0x4c8f, 0x4b83, 0x4c01, 0x4c09, 0x4ce4, 0x4afe, 0x4c4d, 0x4c00, 0x4c30, 0x4cb4, 0x4b21, 0x4c17, 0x4c0d, 0x4c5e, 0x4c51, 0x4c43, 0x4bea, 0x4c15, 0x4b37, 0x4c23, 0x4c84, 0x4ae8, 0x4bf0, 0x4b64, 0x4bec, 0x4bf6, 0x4c00, +0x4c53, 0x4c69, 0x4b9d, 0x4c3d, 0x4cb7, 0x4c4b, 0x4a48, 0x4c53, 0x4c8a, 0x4ca6, 0x4c09, 0x4c99, 0x4c14, 0x4c2f, 0x4c2d, 0x4bb1, 0x4cb1, 0x4caf, 0x4cb0, 0x4bfb, 0x4c2b, 0x4beb, 0x4c2a, 0x4bfc, 0x4cf2, 0x4cbc, 0x4c78, 0x4c78, 0x4bd1, 0x4c26, 0x4c54, 0x4c1e, 0x4bab, 0x4b93, 0x4bf0, 0x4c6f, 0x4c4f, 0x4c78, 0x4b9f, 0x4c2c, 0x4c38, 0x4d2a, 0x4c12, 0x4c92, 0x4bcd, 0x4bf5, 0x4c6d, 0x4b11, 0x4c39, 0x4c69, 0x4d44, 0x4cc8, 0x4c72, 0x4c24, 0x4c6b, 0x4c1a, 0x4b6a, 0x4c98, 0x4b8c, 0x4bd7, 0x4bc6, 0x4c4c, 0x4bb4, 0x4c27, +0x4b2d, 0x4c8c, 0x4b01, 0x4c44, 0x4c6a, 0x4c4d, 0x4ae3, 0x4c2f, 0x4c61, 0x4cbf, 0x4ad0, 0x4c4c, 0x4bf6, 0x4c0a, 0x4c0f, 0x4b2b, 0x4c3c, 0x4c41, 0x4c5a, 0x4b8f, 0x4c3e, 0x4b85, 0x4c16, 0x4bac, 0x4c8d, 0x4c90, 0x4c64, 0x4c4d, 0x4b09, 0x4c16, 0x4c17, 0x4baa, 0x4bbe, 0x4b8e, 0x4c3d, 0x4c18, 0x4bf2, 0x4c2d, 0x4bec, 0x4be0, 0x4ca8, 0x4d28, 0x4c17, 0x4c19, 0x4bb1, 0x4beb, 0x4c87, 0x4b00, 0x4c1a, 0x4c7a, 0x4cf3, 0x4c58, 0x4c6b, 0x4b51, 0x4ca9, 0x4be0, 0x4bf5, 0x4c74, 0x4b7b, 0x4c21, 0x4be0, 0x4c7f, 0x4c02, 0x4ba2, +0x4c0b, 0x4c3d, 0x4a97, 0x4b31, 0x4c5c, 0x4b8d, 0x49bf, 0x4c1f, 0x4c1e, 0x4c74, 0x4a3a, 0x4c67, 0x4c5a, 0x4bc5, 0x4bfb, 0x4aee, 0x4c94, 0x4c14, 0x4cb5, 0x4b73, 0x4c8c, 0x4ba2, 0x4bed, 0x4c0d, 0x4c8a, 0x4b9d, 0x4c1e, 0x4c6b, 0x4aff, 0x4c22, 0x4c16, 0x4bd3, 0x4b3e, 0x4bf4, 0x4c13, 0x4c4a, 0x4bbf, 0x4c3b, 0x4b4f, 0x4c2c, 0x4c14, 0x4cbf, 0x4b04, 0x4c6f, 0x4c12, 0x4c23, 0x4ce7, 0x4ab9, 0x4be9, 0x4c35, 0x4d11, 0x4c73, 0x4c32, 0x4ba8, 0x4c66, 0x4b8d, 0x4bbf, 0x4c73, 0x4b79, 0x4b63, 0x4b0a, 0x4bfe, 0x4b86, 0x4c25, +0x4c24, 0x4c1f, 0x4b14, 0x4c36, 0x4c74, 0x4c2f, 0x4a63, 0x4c9a, 0x4c8c, 0x4c4a, 0x4ba6, 0x4ca6, 0x4c2f, 0x4bdc, 0x4bb5, 0x4bcc, 0x4c8b, 0x4c48, 0x4cb4, 0x4c5d, 0x4c0e, 0x4c0a, 0x4bab, 0x4c10, 0x4c76, 0x4c47, 0x4c66, 0x4c9d, 0x4ae9, 0x4c10, 0x4c5b, 0x4c31, 0x4c06, 0x4b5d, 0x4c45, 0x4c2e, 0x4c0c, 0x4c9b, 0x4bae, 0x4c33, 0x4c4b, 0x4d3a, 0x4bf9, 0x4c79, 0x4bff, 0x4bcb, 0x4ced, 0x4ba6, 0x4c9d, 0x4c60, 0x4c7d, 0x4c9c, 0x4ca4, 0x4bb4, 0x4c9c, 0x4b74, 0x4b76, 0x4c6a, 0x4c18, 0x4bfe, 0x4b8e, 0x4c2e, 0x4bec, 0x4c68, +0x4c22, 0x4baf, 0x4bca, 0x4c2f, 0x4c8d, 0x4c3d, 0x4a24, 0x4c27, 0x4c4c, 0x4c9a, 0x4b60, 0x4c98, 0x4c32, 0x4c3b, 0x4c2e, 0x4b46, 0x4cc5, 0x4c3f, 0x4c61, 0x4c3f, 0x4c31, 0x4be3, 0x4c0b, 0x4c28, 0x4cf1, 0x4c8d, 0x4c72, 0x4cad, 0x4b2d, 0x4c16, 0x4c16, 0x4c0f, 0x4bd4, 0x4c53, 0x4c31, 0x4c1f, 0x4c56, 0x4c8b, 0x4bd2, 0x4bd3, 0x4bf7, 0x4d7d, 0x4aaf, 0x4ca8, 0x4bca, 0x4c17, 0x4cc9, 0x4b8a, 0x4c7c, 0x4c69, 0x4c9b, 0x4ccd, 0x4ca3, 0x4c61, 0x4c62, 0x4b73, 0x4c02, 0x4c6e, 0x4bbf, 0x4c1b, 0x4bfe, 0x4c21, 0x4c51, 0x4c17, +0x4c78, 0x4c6f, 0x4bd7, 0x4c8e, 0x4cbb, 0x4c02, 0x4ae1, 0x4c40, 0x4c91, 0x4cd4, 0x4c10, 0x4ca2, 0x4c2a, 0x4c37, 0x4c3c, 0x4b9d, 0x4d29, 0x4c57, 0x4cef, 0x4c6d, 0x4c8b, 0x4c2e, 0x4c41, 0x4cac, 0x4d1e, 0x4caf, 0x4cb8, 0x4c9b, 0x4bcf, 0x4c60, 0x4c8f, 0x4c87, 0x4c1d, 0x4c63, 0x4c60, 0x4c7a, 0x4c33, 0x4cb3, 0x4c1b, 0x4c3a, 0x4c8e, 0x4d56, 0x4ba9, 0x4d16, 0x4c47, 0x4c14, 0x4d3d, 0x4b8a, 0x4c9c, 0x4cef, 0x4cf1, 0x4cdc, 0x4cdb, 0x4c66, 0x4caf, 0x4c06, 0x4c1c, 0x4c61, 0x4c11, 0x4c61, 0x4c27, 0x4c3d, 0x4c1e, 0x4ca7, +0x4b13, 0x4bfe, 0x4a52, 0x4c22, 0x4c0e, 0x4b8f, 0x4a8e, 0x4b4a, 0x4b60, 0x4b8b, 0x4b2e, 0x4bb1, 0x4ba5, 0x4aeb, 0x4ac8, 0x4a5c, 0x4c3e, 0x4b54, 0x4c24, 0x4b96, 0x4bfa, 0x4b9c, 0x4ada, 0x4adb, 0x4c39, 0x4bb2, 0x4b4a, 0x4bbe, 0x4ad7, 0x4b7e, 0x4a7c, 0x4b4b, 0x4ae7, 0x4ad1, 0x4bea, 0x4b75, 0x4ad3, 0x4c05, 0x4bb8, 0x4b0b, 0x4bc7, 0x4c7b, 0x4ba8, 0x4bae, 0x4b38, 0x4acb, 0x4c03, 0x4a42, 0x4b0d, 0x4c2d, 0x4c57, 0x4c65, 0x4c48, 0x4bf9, 0x4b99, 0x4acd, 0x4b56, 0x4c44, 0x4aac, 0x4b91, 0x4abe, 0x4ae5, 0x4ad9, 0x4b89, +0x4ab7, 0x4bd8, 0x4a93, 0x4b9e, 0x4bab, 0x4bd7, 0x49ed, 0x4bcd, 0x4c8d, 0x4c29, 0x4a60, 0x4c25, 0x4b16, 0x4b37, 0x4b1a, 0x4abc, 0x4bb3, 0x4bb6, 0x4c10, 0x4b9a, 0x4b80, 0x4ac0, 0x4a5c, 0x4af7, 0x4c4b, 0x4b5e, 0x4b71, 0x4bac, 0x4b6b, 0x4bbd, 0x4bb1, 0x4bd7, 0x4b15, 0x4a87, 0x4b5c, 0x4bff, 0x4b6f, 0x4bf4, 0x4b44, 0x4ba6, 0x4c37, 0x4c78, 0x4a99, 0x4c46, 0x4b85, 0x4aa2, 0x4c39, 0x4a7d, 0x4c41, 0x4c29, 0x4c36, 0x4c27, 0x4c54, 0x4b1e, 0x4bc0, 0x4a96, 0x4b83, 0x4b9a, 0x4ad4, 0x4b1b, 0x4b29, 0x4b15, 0x4b45, 0x4ba3, +0x4c24, 0x4c01, 0x4b09, 0x4c14, 0x4c19, 0x4b9f, 0x497e, 0x4bf8, 0x4c0f, 0x4c9d, 0x4b5c, 0x4c52, 0x4bc9, 0x4bf1, 0x4c0c, 0x4a46, 0x4c86, 0x4b41, 0x4c7a, 0x4bbe, 0x4c6c, 0x4be4, 0x4b11, 0x4bce, 0x4ca5, 0x4c54, 0x4c24, 0x4c61, 0x4aa6, 0x4c00, 0x4bb1, 0x4bf1, 0x4b07, 0x4c12, 0x4c01, 0x4b75, 0x4c0c, 0x4c54, 0x4b80, 0x4b88, 0x4be0, 0x4cf2, 0x4aef, 0x4cc1, 0x4ba2, 0x4b41, 0x4c8a, 0x4a60, 0x4beb, 0x4c14, 0x4cbe, 0x4c8f, 0x4c77, 0x4c41, 0x4c44, 0x4b83, 0x4b99, 0x4c17, 0x4b81, 0x4b46, 0x4ad7, 0x4b7a, 0x4b94, 0x4c35, +0x4b67, 0x4c1d, 0x49e1, 0x4bb8, 0x4b7d, 0x4ab3, 0x49c1, 0x4b9e, 0x4bcb, 0x4c06, 0x4b37, 0x4baa, 0x4b91, 0x4b00, 0x4afc, 0x4ac2, 0x4bf4, 0x4bd4, 0x4be3, 0x4b48, 0x4bcf, 0x4ac4, 0x4a57, 0x4ba5, 0x4c4e, 0x4c1b, 0x4b31, 0x4be4, 0x4b26, 0x4bcb, 0x4b64, 0x4bf6, 0x4aff, 0x4b51, 0x4b4b, 0x4b3b, 0x4ae3, 0x4c1d, 0x4a9b, 0x4abb, 0x4b15, 0x4c4f, 0x4a50, 0x4bf4, 0x4b93, 0x4a9f, 0x4bf1, 0x4a85, 0x4bcb, 0x4c02, 0x4c6c, 0x4c15, 0x4be6, 0x4b42, 0x4bf3, 0x4b23, 0x4b6a, 0x4b73, 0x4a96, 0x4bbf, 0x4af0, 0x4bc4, 0x4b1b, 0x4b7c, +0x4cc2, 0x4c87, 0x4a2c, 0x4c12, 0x4c3e, 0x4c34, 0x4abd, 0x4c38, 0x4c43, 0x4ce1, 0x4b49, 0x4c5e, 0x4c5b, 0x4c5a, 0x4c47, 0x4b67, 0x4cad, 0x4c39, 0x4ca6, 0x4c67, 0x4c0c, 0x4b1a, 0x4c03, 0x4c48, 0x4cb0, 0x4c42, 0x4c6b, 0x4cbf, 0x4c13, 0x4c36, 0x4c2a, 0x4c7e, 0x4bcc, 0x4bda, 0x4c59, 0x4c2f, 0x4c36, 0x4c8b, 0x4b89, 0x4b7a, 0x4c65, 0x4cdc, 0x4b33, 0x4cd8, 0x4c7b, 0x4c4a, 0x4cdd, 0x4c2d, 0x4c91, 0x4c9d, 0x4cc3, 0x4c79, 0x4c8a, 0x4c5b, 0x4c82, 0x4c32, 0x4c24, 0x4c78, 0x4c31, 0x4c25, 0x4bd2, 0x4bda, 0x4a9c, 0x4c86, +0x4c31, 0x4bff, 0x4b04, 0x4c67, 0x4c95, 0x4c19, 0x4a5e, 0x4c19, 0x4c78, 0x4c5f, 0x4c04, 0x4caf, 0x4c45, 0x4c14, 0x4c1a, 0x4b21, 0x4c73, 0x4c86, 0x4c46, 0x4bc8, 0x4c13, 0x4b38, 0x4c0e, 0x4c11, 0x4cac, 0x4c65, 0x4c6e, 0x4cba, 0x4baa, 0x4c21, 0x4c3d, 0x4c44, 0x4bf7, 0x4b9f, 0x4c61, 0x4c22, 0x4c0e, 0x4c75, 0x4bf2, 0x4ba3, 0x4be0, 0x4d13, 0x4b96, 0x4c9a, 0x4c37, 0x4bf3, 0x4cb8, 0x4af8, 0x4c3a, 0x4c5e, 0x4ca8, 0x4c96, 0x4c85, 0x4c2b, 0x4c84, 0x4bcc, 0x4c09, 0x4c3f, 0x4b37, 0x4bb7, 0x4c06, 0x4c4b, 0x4bf4, 0x4c10, +0x4c30, 0x4c7c, 0x4b24, 0x4c1b, 0x4c3f, 0x4c14, 0x4ab2, 0x4c21, 0x4c56, 0x4ccb, 0x4ae3, 0x4c9c, 0x4c17, 0x4b89, 0x4c03, 0x4b60, 0x4cd6, 0x4c1b, 0x4cd3, 0x4b53, 0x4c59, 0x4bf4, 0x4bd0, 0x4c02, 0x4cbe, 0x4c26, 0x4c43, 0x4c52, 0x4bbd, 0x4c20, 0x4c35, 0x4c3a, 0x4bdd, 0x4c10, 0x4c1d, 0x4c05, 0x4c4d, 0x4c65, 0x4c02, 0x4b60, 0x4b70, 0x4ccb, 0x4b99, 0x4c84, 0x4c55, 0x4bf0, 0x4cd1, 0x4b6e, 0x4c36, 0x4c98, 0x4cd1, 0x4ca2, 0x4caf, 0x4c1b, 0x4c93, 0x4c15, 0x4b90, 0x4c4d, 0x4bd3, 0x4ba0, 0x4af7, 0x4c1a, 0x4c25, 0x4c64, +0x4ba1, 0x4bbd, 0x4a6d, 0x4bca, 0x4c10, 0x4ae3, 0x4a3c, 0x4be1, 0x4c01, 0x4c01, 0x4b31, 0x4c22, 0x4bda, 0x4bf4, 0x4b55, 0x4b1c, 0x4c7d, 0x4c36, 0x4c14, 0x4bdf, 0x4c18, 0x4b00, 0x4b56, 0x4b4c, 0x4c64, 0x4b82, 0x4c5b, 0x4c37, 0x4ab0, 0x4b96, 0x4c0d, 0x4bbe, 0x4b09, 0x4b1a, 0x4c19, 0x4c33, 0x4c30, 0x4c3e, 0x4af8, 0x4bad, 0x4c04, 0x4cb4, 0x4b43, 0x4c56, 0x4c08, 0x4b1c, 0x4c2d, 0x4aa0, 0x4b64, 0x4c1f, 0x4ca0, 0x4c27, 0x4c58, 0x4c16, 0x4c76, 0x4abd, 0x4b6a, 0x4c02, 0x4bcc, 0x4b68, 0x4af4, 0x4b98, 0x4b47, 0x4b65, +0x4c89, 0x4c99, 0x4aa0, 0x4c5c, 0x4c74, 0x4bdc, 0x4ab4, 0x4c60, 0x4cc4, 0x4ca8, 0x4b8c, 0x4c58, 0x4c4e, 0x4bed, 0x4c08, 0x4b50, 0x4cd1, 0x4c9a, 0x4ca3, 0x4c1b, 0x4c59, 0x4bc4, 0x4c27, 0x4c6f, 0x4ceb, 0x4c8a, 0x4c82, 0x4c8a, 0x4c07, 0x4c54, 0x4c5f, 0x4ca5, 0x4c16, 0x4c37, 0x4c2e, 0x4c5e, 0x4c12, 0x4ca1, 0x4c19, 0x4c2d, 0x4c49, 0x4d42, 0x4bb4, 0x4ca3, 0x4c68, 0x4c55, 0x4d6a, 0x4c0f, 0x4c6f, 0x4cea, 0x4cb9, 0x4c84, 0x4cf1, 0x4c02, 0x4c48, 0x4bfb, 0x4c61, 0x4cad, 0x4c2c, 0x4b93, 0x4c03, 0x4b97, 0x4be0, 0x4c7d, +0x4c35, 0x4c5c, 0x4b42, 0x4c27, 0x4c3b, 0x4c21, 0x4ac7, 0x4c5b, 0x4c92, 0x4c95, 0x4bb2, 0x4c6b, 0x4c0c, 0x4c09, 0x4c16, 0x4b23, 0x4c8d, 0x4c8f, 0x4ccb, 0x4c0e, 0x4c79, 0x4be4, 0x4bc7, 0x4b8d, 0x4cc3, 0x4cb3, 0x4c6d, 0x4cb6, 0x4bce, 0x4c23, 0x4c50, 0x4c81, 0x4c0a, 0x4c20, 0x4c2c, 0x4c62, 0x4c0c, 0x4cbc, 0x4bb9, 0x4c01, 0x4c8c, 0x4d8b, 0x4be6, 0x4c82, 0x4c24, 0x4c13, 0x4ce8, 0x4c07, 0x4cb6, 0x4c83, 0x4cb1, 0x4cc9, 0x4cc7, 0x4c0c, 0x4c69, 0x4c00, 0x4b96, 0x4c90, 0x4bd7, 0x4b79, 0x4b48, 0x4c00, 0x4c1c, 0x4c77, +0x4c22, 0x4ca1, 0x4ac2, 0x4c1e, 0x4c9e, 0x4c4d, 0x4ab7, 0x4ca8, 0x4cc3, 0x4c94, 0x4b20, 0x4ca2, 0x4c70, 0x4c10, 0x4bc6, 0x4b5a, 0x4c51, 0x4c0d, 0x4cfa, 0x4bfc, 0x4ca2, 0x4c2c, 0x4c1b, 0x4c19, 0x4ce6, 0x4c79, 0x4c5e, 0x4ca2, 0x4ba6, 0x4c37, 0x4c14, 0x4c47, 0x4bef, 0x4c0f, 0x4c86, 0x4c24, 0x4c2a, 0x4c98, 0x4c67, 0x4c38, 0x4c86, 0x4d14, 0x4c0b, 0x4cb1, 0x4c43, 0x4c0d, 0x4cb7, 0x4b82, 0x4ca1, 0x4cf0, 0x4cf6, 0x4cda, 0x4c4e, 0x4c52, 0x4c59, 0x4bd4, 0x4b67, 0x4caf, 0x4c1a, 0x4bc6, 0x4b81, 0x4bf0, 0x4c13, 0x4c94, +0x4c57, 0x4c5e, 0x4b6e, 0x4c39, 0x4ce4, 0x4c7f, 0x4a88, 0x4c8b, 0x4c8a, 0x4cc3, 0x4bb6, 0x4c8c, 0x4c12, 0x4c8d, 0x4c50, 0x4b65, 0x4cdd, 0x4c37, 0x4c9e, 0x4c0b, 0x4c00, 0x4c2f, 0x4c09, 0x4c2a, 0x4cd4, 0x4c8a, 0x4c63, 0x4c8f, 0x4b83, 0x4c75, 0x4c3c, 0x4c59, 0x4c0b, 0x4ba5, 0x4c1a, 0x4c13, 0x4c2e, 0x4c9e, 0x4be3, 0x4c01, 0x4c40, 0x4d02, 0x4bff, 0x4c7d, 0x4c02, 0x4bc3, 0x4cee, 0x4c26, 0x4c6c, 0x4cd1, 0x4d01, 0x4cbb, 0x4cc7, 0x4c5a, 0x4c35, 0x4bfe, 0x4bb5, 0x4cb4, 0x4ba8, 0x4c0d, 0x4c4d, 0x4c0e, 0x4c50, 0x4c8b, +0x4c3d, 0x4c91, 0x4bc1, 0x4c78, 0x4c57, 0x4c3c, 0x4a9d, 0x4c2d, 0x4ca4, 0x4cb8, 0x4ba5, 0x4c9e, 0x4c09, 0x4bd9, 0x4be8, 0x4b62, 0x4cb9, 0x4c38, 0x4c9b, 0x4b79, 0x4c02, 0x4c30, 0x4c1b, 0x4c16, 0x4cb0, 0x4cb9, 0x4c73, 0x4c56, 0x4b99, 0x4c36, 0x4c59, 0x4c55, 0x4bfe, 0x4c31, 0x4bc5, 0x4bc8, 0x4c36, 0x4d03, 0x4bde, 0x4c31, 0x4c11, 0x4d70, 0x4bd1, 0x4c9c, 0x4c0e, 0x4c1a, 0x4cb9, 0x4c10, 0x4c9c, 0x4cac, 0x4cff, 0x4c93, 0x4c93, 0x4c02, 0x4c63, 0x4c13, 0x4b69, 0x4c79, 0x4b96, 0x4b28, 0x4bbe, 0x4c19, 0x4c4b, 0x4c72, +0x4c71, 0x4c8d, 0x4bca, 0x4c2c, 0x4cab, 0x4c27, 0x4b09, 0x4c4f, 0x4c7b, 0x4ca2, 0x4b8f, 0x4c99, 0x4c12, 0x4c36, 0x4ba7, 0x4b2c, 0x4ced, 0x4c77, 0x4cf4, 0x4c0a, 0x4c8f, 0x4bff, 0x4ba1, 0x4c1e, 0x4d34, 0x4c63, 0x4c5b, 0x4c5a, 0x4bda, 0x4c63, 0x4c3a, 0x4c9c, 0x4c0c, 0x4c1e, 0x4c45, 0x4c7e, 0x4c5b, 0x4c99, 0x4c33, 0x4c28, 0x4c73, 0x4d44, 0x4bca, 0x4d0f, 0x4c30, 0x4c0e, 0x4cf4, 0x4bfe, 0x4c7e, 0x4cab, 0x4d50, 0x4cb4, 0x4cc9, 0x4c4e, 0x4c8a, 0x4be7, 0x4c18, 0x4c58, 0x4bef, 0x4bc0, 0x4b91, 0x4bfc, 0x4c1a, 0x4c97, +0x4a4c, 0x4b1e, 0x49ac, 0x4a9d, 0x4ac0, 0x49de, 0x4912, 0x4a67, 0x4a86, 0x4ae6, 0x49e9, 0x4af4, 0x4a92, 0x4a4f, 0x49a9, 0x497f, 0x4ace, 0x4a2c, 0x4b19, 0x4a6a, 0x4a9b, 0x4a0f, 0x499f, 0x4a23, 0x4b36, 0x4aef, 0x4b08, 0x4b5d, 0x499b, 0x4b1d, 0x4a59, 0x4a08, 0x49a7, 0x4a3a, 0x4aa9, 0x49ea, 0x4af0, 0x4a9d, 0x49f4, 0x4a56, 0x4b12, 0x4bf6, 0x4998, 0x4b6f, 0x49fa, 0x4a0e, 0x4aee, 0x4a23, 0x4a24, 0x4abd, 0x4af4, 0x4ab1, 0x4ae5, 0x4a1b, 0x4af2, 0x49f5, 0x49f5, 0x4b01, 0x49e7, 0x49c2, 0x4a25, 0x4a3f, 0x4a0e, 0x4a9a, +0x4c7f, 0x4ca9, 0x4c21, 0x4caa, 0x4cc2, 0x4c9c, 0x4a94, 0x4c97, 0x4d2a, 0x4d0c, 0x4c28, 0x4ce0, 0x4cb5, 0x4c78, 0x4c8b, 0x4c3f, 0x4cf8, 0x4c7f, 0x4cf7, 0x4c70, 0x4c95, 0x4c7e, 0x4bd4, 0x4c28, 0x4cd0, 0x4cbb, 0x4cab, 0x4cbb, 0x4c2e, 0x4c90, 0x4cba, 0x4cbb, 0x4c78, 0x4c3d, 0x4c79, 0x4c88, 0x4c2f, 0x4d03, 0x4c46, 0x4c3b, 0x4ce5, 0x4dc2, 0x4b68, 0x4d26, 0x4c85, 0x4c88, 0x4ca8, 0x4c07, 0x4cb7, 0x4cea, 0x4d6e, 0x4cd8, 0x4d0e, 0x4c94, 0x4cc3, 0x4c01, 0x4c56, 0x4d04, 0x4c5c, 0x4c7d, 0x4c41, 0x4c4a, 0x4c55, 0x4c83, +0x4b1c, 0x4bca, 0x4aae, 0x4b89, 0x4c16, 0x4b2b, 0x4a4c, 0x4bba, 0x4c0a, 0x4c27, 0x4b19, 0x4ba9, 0x4c22, 0x4bab, 0x4b78, 0x4a67, 0x4c24, 0x4b43, 0x4bc8, 0x4ba0, 0x4c2d, 0x4afb, 0x4bc0, 0x4b63, 0x4c86, 0x4c1e, 0x4b4f, 0x4c00, 0x4a82, 0x4c10, 0x4bda, 0x4b72, 0x4b3d, 0x4baf, 0x4b7e, 0x4b26, 0x4b7d, 0x4c46, 0x4b30, 0x4ab2, 0x4bb6, 0x4c96, 0x4b59, 0x4b5e, 0x4b54, 0x4b1d, 0x4c21, 0x4a7f, 0x4bca, 0x4b7a, 0x4c68, 0x4c24, 0x4c25, 0x4b31, 0x4c15, 0x4b57, 0x4ba9, 0x4b99, 0x4b38, 0x4bc8, 0x4ac9, 0x4b8e, 0x4af8, 0x4b66, +0x4b80, 0x4c39, 0x4af7, 0x4c2b, 0x4c26, 0x4c32, 0x4a0e, 0x4b54, 0x4caf, 0x4c02, 0x4b23, 0x4c11, 0x4c24, 0x4b64, 0x4b85, 0x4ada, 0x4c0a, 0x4b96, 0x4cc1, 0x4bdc, 0x4c30, 0x4c21, 0x4ba8, 0x4b33, 0x4c9b, 0x4bb0, 0x4c18, 0x4c05, 0x4b4a, 0x4c1a, 0x4bdc, 0x4bb7, 0x4af3, 0x4b51, 0x4b62, 0x4c05, 0x4bc7, 0x4c34, 0x4c6c, 0x4b69, 0x4c3b, 0x4ce5, 0x4bdc, 0x4c09, 0x4c40, 0x4b24, 0x4c92, 0x4a7f, 0x4c22, 0x4c63, 0x4c92, 0x4c62, 0x4c9c, 0x4c0a, 0x4c14, 0x4b37, 0x4c04, 0x4c48, 0x4bd1, 0x4c0a, 0x4b6b, 0x4b2b, 0x4b84, 0x4c14, +0x4c01, 0x4c59, 0x4b5a, 0x4c30, 0x4c48, 0x4c4b, 0x4a83, 0x4c7c, 0x4c98, 0x4c55, 0x4b92, 0x4cc2, 0x4c94, 0x4bdb, 0x4be1, 0x4bd5, 0x4c82, 0x4c72, 0x4ccc, 0x4be1, 0x4c53, 0x4bb2, 0x4bef, 0x4b14, 0x4cba, 0x4c57, 0x4c44, 0x4c97, 0x4b61, 0x4c21, 0x4c3b, 0x4c9d, 0x4bda, 0x4c24, 0x4c13, 0x4c6f, 0x4c00, 0x4c99, 0x4c09, 0x4bcf, 0x4c41, 0x4d5c, 0x4bda, 0x4c3a, 0x4c0a, 0x4bc0, 0x4c91, 0x4b8b, 0x4c39, 0x4c6e, 0x4d04, 0x4c7a, 0x4c91, 0x4c1a, 0x4c82, 0x4bbf, 0x4b87, 0x4ca8, 0x4b7d, 0x4ba3, 0x4bb9, 0x4b72, 0x4c23, 0x4c59, +0x4c7f, 0x4cab, 0x4c53, 0x4cc4, 0x4d12, 0x4c6d, 0x4af5, 0x4c5a, 0x4d28, 0x4d07, 0x4c26, 0x4cd4, 0x4c47, 0x4c4c, 0x4c5f, 0x4b69, 0x4d4d, 0x4c5b, 0x4d1e, 0x4c29, 0x4c87, 0x4c3a, 0x4bfb, 0x4c39, 0x4d20, 0x4cc2, 0x4ca3, 0x4c7a, 0x4c1f, 0x4ce0, 0x4c85, 0x4cb0, 0x4c1e, 0x4c68, 0x4c7e, 0x4c30, 0x4cb4, 0x4d23, 0x4c26, 0x4c82, 0x4cf1, 0x4db4, 0x4c44, 0x4d2f, 0x4c39, 0x4c0a, 0x4d46, 0x4c0c, 0x4cc7, 0x4d12, 0x4d54, 0x4cf6, 0x4d24, 0x4c69, 0x4cdd, 0x4c64, 0x4c0f, 0x4cad, 0x4c27, 0x4c58, 0x4c07, 0x4c51, 0x4c7f, 0x4d01, +0x4c7d, 0x4c0d, 0x4ad0, 0x4c77, 0x4c8b, 0x4bfb, 0x4a84, 0x4c80, 0x4cad, 0x4c55, 0x4bad, 0x4cd2, 0x4c49, 0x4c57, 0x4bc6, 0x4b48, 0x4ca5, 0x4c1f, 0x4cd2, 0x4c44, 0x4c4b, 0x4bd1, 0x4ba0, 0x4c43, 0x4ce2, 0x4c7e, 0x4c89, 0x4ca1, 0x4b88, 0x4c5c, 0x4cac, 0x4c68, 0x4c14, 0x4be2, 0x4c47, 0x4c33, 0x4c2c, 0x4c6d, 0x4c52, 0x4c43, 0x4c4e, 0x4d12, 0x4b6d, 0x4cdb, 0x4c40, 0x4c14, 0x4cf1, 0x4b4b, 0x4c63, 0x4cb5, 0x4cd1, 0x4d05, 0x4c9e, 0x4c78, 0x4c66, 0x4c14, 0x4c29, 0x4c63, 0x4be1, 0x4c36, 0x4b2b, 0x4c52, 0x4ca2, 0x4ca6, +0x4c9a, 0x4cc7, 0x4c36, 0x4cd8, 0x4d35, 0x4c67, 0x4a38, 0x4cde, 0x4d26, 0x4ca5, 0x4c0c, 0x4d5d, 0x4caa, 0x4c8e, 0x4c7f, 0x4c8b, 0x4d45, 0x4d02, 0x4d52, 0x4c64, 0x4ccc, 0x4c2d, 0x4c2e, 0x4cdd, 0x4d60, 0x4cfc, 0x4d14, 0x4cc9, 0x4c21, 0x4cdf, 0x4ca2, 0x4ca0, 0x4c2a, 0x4c6f, 0x4c85, 0x4cad, 0x4c6a, 0x4d0f, 0x4c58, 0x4c7f, 0x4ca9, 0x4d8d, 0x4b51, 0x4d13, 0x4c67, 0x4cb8, 0x4d37, 0x4c38, 0x4cb0, 0x4d15, 0x4d42, 0x4cd3, 0x4ce7, 0x4cc1, 0x4ce5, 0x4c4c, 0x4c74, 0x4d05, 0x4c48, 0x4c8f, 0x4c59, 0x4ca6, 0x4cc0, 0x4cac, +0x4bd9, 0x4b7e, 0x4a67, 0x4b28, 0x4b8b, 0x4ba1, 0x49fc, 0x4ad3, 0x4b8d, 0x4c0c, 0x4a84, 0x4c0f, 0x4b3c, 0x4bac, 0x4b55, 0x4a6a, 0x4c42, 0x4b5f, 0x4c3b, 0x4ac3, 0x4b80, 0x4b0e, 0x4af9, 0x4b0f, 0x4b95, 0x4b7e, 0x4be9, 0x4bcc, 0x4b5d, 0x4b2b, 0x4b26, 0x4b6a, 0x4b16, 0x4acb, 0x4ba4, 0x4b34, 0x4ae2, 0x4b9f, 0x4af8, 0x4b1d, 0x4acb, 0x4caa, 0x4a81, 0x4bbe, 0x4b65, 0x4b81, 0x4c69, 0x4a79, 0x4bd7, 0x4c19, 0x4c41, 0x4b6e, 0x4bf7, 0x4bb1, 0x4bea, 0x4aca, 0x4b60, 0x4be6, 0x4a71, 0x4b95, 0x4adc, 0x4b8e, 0x4afd, 0x4b94, +0x4c8d, 0x4c76, 0x4b15, 0x4c6b, 0x4c99, 0x4c0f, 0x4a05, 0x4c3f, 0x4cab, 0x4cc3, 0x4bcf, 0x4c5c, 0x4c81, 0x4c52, 0x4c03, 0x4b4c, 0x4d20, 0x4c68, 0x4c9a, 0x4c3c, 0x4c24, 0x4c14, 0x4b75, 0x4c5f, 0x4cd2, 0x4c97, 0x4c36, 0x4c60, 0x4b85, 0x4c19, 0x4c1d, 0x4c7e, 0x4be7, 0x4c04, 0x4c58, 0x4c12, 0x4c0a, 0x4cbe, 0x4bd1, 0x4b95, 0x4c74, 0x4d34, 0x4c02, 0x4ce6, 0x4be0, 0x4c41, 0x4cdb, 0x4b4f, 0x4c8e, 0x4c8d, 0x4d0a, 0x4cd4, 0x4c64, 0x4c33, 0x4cba, 0x4c43, 0x4beb, 0x4c93, 0x4c1e, 0x4beb, 0x4be0, 0x4c40, 0x4baf, 0x4c6f, +0x4b7f, 0x4b14, 0x4a7c, 0x4b88, 0x4bc6, 0x4b54, 0x4964, 0x4aeb, 0x4c1a, 0x4be7, 0x4a33, 0x4bc5, 0x4b2b, 0x4b4a, 0x4af0, 0x4a55, 0x4be7, 0x4bd5, 0x4be6, 0x4c08, 0x4b08, 0x4a6b, 0x4a81, 0x4a71, 0x4bff, 0x4ba8, 0x4b4e, 0x4b93, 0x4a17, 0x4ba2, 0x4baf, 0x4a90, 0x4b43, 0x4b04, 0x4b7e, 0x4ac7, 0x4b2b, 0x4c15, 0x4ac3, 0x4b3d, 0x4b42, 0x4ca4, 0x49bc, 0x4b19, 0x4a5c, 0x4b46, 0x4c01, 0x4a9b, 0x4b62, 0x4b55, 0x4c1a, 0x4b3b, 0x4c54, 0x4ae7, 0x4b00, 0x4a14, 0x4ac8, 0x4bb3, 0x4b08, 0x4ada, 0x4a7b, 0x4ae5, 0x4b0c, 0x4b3f, +0x4cc5, 0x4c4c, 0x4b88, 0x4c0f, 0x4c9b, 0x4c2f, 0x4a72, 0x4c7a, 0x4cb5, 0x4ccb, 0x4bd6, 0x4c8f, 0x4c35, 0x4c55, 0x4c32, 0x4b73, 0x4cca, 0x4c07, 0x4cb4, 0x4c16, 0x4c5b, 0x4bef, 0x4c0f, 0x4c26, 0x4ca6, 0x4c82, 0x4c61, 0x4ca0, 0x4b9b, 0x4c59, 0x4c48, 0x4c75, 0x4bbb, 0x4c5c, 0x4c37, 0x4c4d, 0x4c44, 0x4c86, 0x4c19, 0x4c21, 0x4c92, 0x4d75, 0x4b6b, 0x4cdc, 0x4c13, 0x4c33, 0x4cd1, 0x4bfa, 0x4c50, 0x4cb2, 0x4d5d, 0x4ca9, 0x4cbb, 0x4c4d, 0x4c9c, 0x4bed, 0x4c1c, 0x4c31, 0x4c39, 0x4c30, 0x4bce, 0x4c04, 0x4c4a, 0x4c89, +0x4c59, 0x4c4b, 0x4b30, 0x4c87, 0x4c90, 0x4c16, 0x4b3e, 0x4c06, 0x4c88, 0x4c59, 0x4bf7, 0x4c8e, 0x4c8f, 0x4c41, 0x4c25, 0x4ba7, 0x4ce4, 0x4c7e, 0x4cb4, 0x4c07, 0x4c45, 0x4bbe, 0x4c24, 0x4c44, 0x4cb6, 0x4c49, 0x4cc1, 0x4cc7, 0x4c12, 0x4c49, 0x4c50, 0x4c5d, 0x4c1a, 0x4c3c, 0x4c8c, 0x4c56, 0x4c31, 0x4cc1, 0x4c0e, 0x4c3b, 0x4c2b, 0x4d2f, 0x4ba4, 0x4c89, 0x4c30, 0x4c2b, 0x4ceb, 0x4b50, 0x4c41, 0x4c9f, 0x4cd6, 0x4c9a, 0x4c94, 0x4c72, 0x4d01, 0x4c1f, 0x4c15, 0x4c86, 0x4c04, 0x4c42, 0x4bca, 0x4c58, 0x4c52, 0x4ca6, +0x4bad, 0x4c2f, 0x4a38, 0x4b63, 0x4c1b, 0x4b03, 0x4930, 0x4c25, 0x4c25, 0x4c46, 0x4b1f, 0x4b4c, 0x4bce, 0x4b74, 0x4b65, 0x4b26, 0x4c24, 0x4bdf, 0x4c24, 0x4b99, 0x4bc4, 0x4b67, 0x4aff, 0x4b41, 0x4c86, 0x4c37, 0x4bbb, 0x4bf2, 0x4aa3, 0x4b25, 0x4b24, 0x4be7, 0x4acd, 0x4af8, 0x4b17, 0x4b22, 0x4b5a, 0x4c47, 0x4ab0, 0x4b10, 0x4bf6, 0x4c9b, 0x4ab1, 0x4c39, 0x4b19, 0x4b3c, 0x4b98, 0x4ad9, 0x4c04, 0x4c11, 0x4c50, 0x4c2e, 0x4c2c, 0x4b7e, 0x4c11, 0x4af9, 0x4b45, 0x4c27, 0x4abe, 0x4b4a, 0x4b35, 0x4b24, 0x4aa3, 0x4bf2, +0x4c30, 0x4c79, 0x4a55, 0x4c6b, 0x4c11, 0x4bf3, 0x4a9f, 0x4bfe, 0x4c33, 0x4c58, 0x4bff, 0x4c10, 0x4c77, 0x4c28, 0x4ba0, 0x4ad7, 0x4c96, 0x4c78, 0x4cae, 0x4c03, 0x4c27, 0x4c04, 0x4b94, 0x4c08, 0x4ccd, 0x4c80, 0x4c16, 0x4c43, 0x4b3c, 0x4bd6, 0x4bd5, 0x4c3d, 0x4ba6, 0x4c09, 0x4c41, 0x4c57, 0x4ba5, 0x4c85, 0x4c1d, 0x4be7, 0x4c41, 0x4d0b, 0x4ba5, 0x4c52, 0x4c0b, 0x4b6c, 0x4c64, 0x4b3a, 0x4c45, 0x4c4a, 0x4ca0, 0x4c68, 0x4c67, 0x4bc0, 0x4c7a, 0x4b4c, 0x4bb4, 0x4c59, 0x4be0, 0x4c25, 0x4bb8, 0x4bbd, 0x4b7b, 0x4c35, +0x4c69, 0x4c2e, 0x4b2a, 0x4c14, 0x4ce5, 0x4c4d, 0x4adb, 0x4c80, 0x4ccd, 0x4c9e, 0x4bc4, 0x4cc6, 0x4c57, 0x4c12, 0x4c23, 0x4b74, 0x4ca7, 0x4c76, 0x4cc1, 0x4c47, 0x4c74, 0x4bbf, 0x4c15, 0x4c22, 0x4ced, 0x4c52, 0x4c7e, 0x4cde, 0x4bf0, 0x4c82, 0x4c62, 0x4c93, 0x4c05, 0x4bf8, 0x4c6c, 0x4ca0, 0x4c5d, 0x4cb4, 0x4bed, 0x4c15, 0x4cbc, 0x4d32, 0x4c0b, 0x4c85, 0x4c4e, 0x4bf7, 0x4cb3, 0x4b8c, 0x4c46, 0x4c5b, 0x4cea, 0x4ca2, 0x4c97, 0x4c97, 0x4c9c, 0x4c03, 0x4bda, 0x4c94, 0x4c28, 0x4c2a, 0x4be1, 0x4bfd, 0x4c3d, 0x4c5d, +0x4ba8, 0x4c7b, 0x4a76, 0x4bfa, 0x4c02, 0x4b0e, 0x4a09, 0x4ae7, 0x4c0e, 0x4bdc, 0x4b37, 0x4bb4, 0x4c0c, 0x4b48, 0x4b2b, 0x4ad0, 0x4bd1, 0x4b9c, 0x4c3c, 0x4b17, 0x4ba1, 0x4b30, 0x4a92, 0x4aab, 0x4c43, 0x4c15, 0x4c15, 0x4c1d, 0x4b18, 0x4c02, 0x4b05, 0x4b6f, 0x4b31, 0x4b0c, 0x4b52, 0x4b55, 0x4b08, 0x4c13, 0x4bc7, 0x4b21, 0x4b98, 0x4c9d, 0x4afd, 0x4b6e, 0x4b99, 0x4ad8, 0x4be2, 0x4adb, 0x4b58, 0x4bfa, 0x4c3c, 0x4be7, 0x4c2d, 0x4b53, 0x4bad, 0x4b3e, 0x4b3f, 0x4c44, 0x4a62, 0x4ad3, 0x4ae2, 0x4b0e, 0x4b30, 0x4b7b, +0x4c75, 0x4ce3, 0x4b19, 0x4c95, 0x4c9f, 0x4c64, 0x4a1f, 0x4c26, 0x4c83, 0x4cde, 0x4b9b, 0x4c76, 0x4c7b, 0x4c43, 0x4c3b, 0x4b8c, 0x4c85, 0x4c86, 0x4cb5, 0x4c17, 0x4c57, 0x4bb5, 0x4c55, 0x4c1c, 0x4d16, 0x4cc4, 0x4c79, 0x4c90, 0x4b36, 0x4c2e, 0x4c4a, 0x4c46, 0x4bb8, 0x4c1a, 0x4c5b, 0x4c4c, 0x4c49, 0x4c5b, 0x4c2a, 0x4c27, 0x4c82, 0x4d49, 0x4b56, 0x4c97, 0x4c2d, 0x4c26, 0x4c8e, 0x4c09, 0x4c60, 0x4cb1, 0x4cfa, 0x4ca3, 0x4cb0, 0x4c2e, 0x4ccb, 0x4c1a, 0x4c6d, 0x4cb0, 0x4c13, 0x4c83, 0x4c10, 0x4c39, 0x4c1b, 0x4c37, +0x4c0a, 0x4c6c, 0x4b56, 0x4c53, 0x4c51, 0x4c1e, 0x49e4, 0x4c78, 0x4c73, 0x4c8a, 0x4ba3, 0x4ccd, 0x4c3f, 0x4ba0, 0x4b87, 0x4b8a, 0x4c98, 0x4c23, 0x4cd9, 0x4c0b, 0x4c42, 0x4b68, 0x4b48, 0x4be4, 0x4ce7, 0x4c9a, 0x4c38, 0x4c42, 0x4baf, 0x4c3a, 0x4bf1, 0x4c51, 0x4b86, 0x4bda, 0x4c8f, 0x4c27, 0x4c27, 0x4c57, 0x4c13, 0x4c0a, 0x4c3d, 0x4d19, 0x4b44, 0x4d05, 0x4c5c, 0x4c18, 0x4c7e, 0x4b4c, 0x4c25, 0x4c75, 0x4cf6, 0x4cc5, 0x4c9a, 0x4c4a, 0x4cb0, 0x4bc1, 0x4c14, 0x4c5f, 0x4b8f, 0x4c2d, 0x4c04, 0x4c4e, 0x4b8c, 0x4c0f, +0x4c76, 0x4c53, 0x4b25, 0x4c28, 0x4c75, 0x4c1d, 0x4abd, 0x4c7a, 0x4c7e, 0x4cf3, 0x4b96, 0x4c53, 0x4c44, 0x4c5f, 0x4c2b, 0x4b34, 0x4cf8, 0x4c6f, 0x4cec, 0x4c3a, 0x4c39, 0x4c50, 0x4ba4, 0x4c05, 0x4cbf, 0x4c84, 0x4c34, 0x4c5d, 0x4ba4, 0x4c4e, 0x4c94, 0x4c5b, 0x4c04, 0x4bf0, 0x4c38, 0x4c36, 0x4c36, 0x4cde, 0x4be9, 0x4bca, 0x4c42, 0x4d44, 0x4bad, 0x4cd9, 0x4c74, 0x4c0f, 0x4ca4, 0x4b5e, 0x4c87, 0x4c42, 0x4cda, 0x4ca6, 0x4c91, 0x4c35, 0x4cb5, 0x4bbb, 0x4c04, 0x4c77, 0x4ba0, 0x4c27, 0x4bc0, 0x4c54, 0x4c31, 0x4c5b, +0x4c30, 0x4bce, 0x4ae2, 0x4c33, 0x4c53, 0x4c23, 0x4a1b, 0x4bf2, 0x4c5e, 0x4c1a, 0x4afc, 0x4c15, 0x4b22, 0x4c08, 0x4bbd, 0x4b54, 0x4c6f, 0x4c27, 0x4c7e, 0x4c03, 0x4bd9, 0x4b56, 0x4b7a, 0x4b74, 0x4c62, 0x4c1f, 0x4b91, 0x4c17, 0x4ae5, 0x4bda, 0x4b7d, 0x4b35, 0x4ae5, 0x4b12, 0x4bd5, 0x4c31, 0x4b9a, 0x4c54, 0x4be5, 0x4c09, 0x4c21, 0x4cc8, 0x4b6d, 0x4c57, 0x4b1f, 0x4b41, 0x4c4d, 0x4af8, 0x4be6, 0x4c35, 0x4cb9, 0x4c4b, 0x4cb3, 0x4ba5, 0x4bfb, 0x4ae1, 0x4b2a, 0x4c2f, 0x4b51, 0x4b95, 0x4ac3, 0x4ba8, 0x4c24, 0x4c1c, +0x4cd6, 0x4ccf, 0x4ba7, 0x4cc8, 0x4cbd, 0x4c5f, 0x4bda, 0x4cde, 0x4cf4, 0x4d04, 0x4c01, 0x4c8b, 0x4c75, 0x4cb2, 0x4c2d, 0x4bc0, 0x4cd8, 0x4c8f, 0x4d28, 0x4cd9, 0x4cd0, 0x4c97, 0x4c09, 0x4c6e, 0x4d1c, 0x4caa, 0x4cc1, 0x4d2f, 0x4be9, 0x4c8a, 0x4d14, 0x4c7f, 0x4caf, 0x4c6b, 0x4c83, 0x4c67, 0x4c95, 0x4d25, 0x4c41, 0x4c65, 0x4d1b, 0x4d9a, 0x4c50, 0x4d19, 0x4c81, 0x4c4d, 0x4d1d, 0x4c27, 0x4cde, 0x4ceb, 0x4d6b, 0x4cd0, 0x4d2b, 0x4c4a, 0x4cae, 0x4c28, 0x4c4f, 0x4ca2, 0x4c5a, 0x4c6f, 0x4c60, 0x4c98, 0x4c24, 0x4ca0, +0x4b49, 0x4c05, 0x4b1b, 0x4c51, 0x4c15, 0x4b75, 0x4a6a, 0x4c6d, 0x4c4c, 0x4c61, 0x4bee, 0x4c8a, 0x4bd0, 0x4b75, 0x4bae, 0x4b4a, 0x4c6a, 0x4c30, 0x4c54, 0x4c08, 0x4c0b, 0x4bef, 0x4a91, 0x4c04, 0x4c86, 0x4c79, 0x4c1d, 0x4c51, 0x4b68, 0x4bc7, 0x4bc7, 0x4c21, 0x4bf1, 0x4b9c, 0x4bb9, 0x4c0b, 0x4ae9, 0x4cb9, 0x4b27, 0x4b8f, 0x4bc0, 0x4cb3, 0x4b7b, 0x4c48, 0x4bcf, 0x4c0c, 0x4c95, 0x4ab0, 0x4b91, 0x4c4d, 0x4c87, 0x4caf, 0x4c0f, 0x4bac, 0x4c11, 0x4afd, 0x4b89, 0x4c3e, 0x4b20, 0x4ae6, 0x4b35, 0x4b71, 0x4be8, 0x4c18, +0x4c1a, 0x4cd2, 0x4ba4, 0x4c99, 0x4c4e, 0x4c15, 0x4b33, 0x4c8e, 0x4cd4, 0x4ca0, 0x4bda, 0x4d15, 0x4c59, 0x4bf2, 0x4c1b, 0x4b86, 0x4cf7, 0x4c6a, 0x4d03, 0x4c38, 0x4c65, 0x4bb6, 0x4bd0, 0x4c40, 0x4cca, 0x4c85, 0x4c6b, 0x4d01, 0x4c09, 0x4c4e, 0x4c59, 0x4c82, 0x4c49, 0x4c11, 0x4cad, 0x4c20, 0x4c14, 0x4cd7, 0x4c33, 0x4c50, 0x4c0e, 0x4d79, 0x4c1b, 0x4ce7, 0x4c76, 0x4ccc, 0x4cf0, 0x4b68, 0x4c80, 0x4c7f, 0x4cf1, 0x4cca, 0x4caa, 0x4c21, 0x4cb1, 0x4b7c, 0x4c28, 0x4c61, 0x4bd7, 0x4c56, 0x4c0f, 0x4c42, 0x4c94, 0x4ca6, +0x4b6d, 0x4b1a, 0x4990, 0x4ac2, 0x4bdb, 0x4bea, 0x499a, 0x4b3e, 0x4b88, 0x4bb9, 0x4a19, 0x4ba8, 0x4b5e, 0x4adf, 0x4afd, 0x4a4f, 0x4ba2, 0x4b64, 0x4b09, 0x4b50, 0x4b34, 0x4a4c, 0x4afd, 0x4a9d, 0x4c14, 0x4ad3, 0x4bda, 0x4b4a, 0x4a3a, 0x4a78, 0x4b63, 0x4bab, 0x4b62, 0x4a75, 0x4aec, 0x4b91, 0x4abd, 0x4b69, 0x4a47, 0x4aa6, 0x4b4b, 0x4c7f, 0x49eb, 0x4b5e, 0x4b0c, 0x4ac7, 0x4c42, 0x4a78, 0x4c0b, 0x4ba1, 0x4b57, 0x4b78, 0x4c2a, 0x4b1f, 0x4b98, 0x4ab2, 0x4b7a, 0x4b0d, 0x4a3f, 0x4a9f, 0x4a48, 0x4a75, 0x4a82, 0x4af8, +0x4b91, 0x4c2a, 0x4a64, 0x4bd8, 0x4c08, 0x4bbe, 0x4ab4, 0x4bd0, 0x4bbd, 0x4c6a, 0x4a67, 0x4be9, 0x4b65, 0x4bc2, 0x4b5b, 0x4a23, 0x4c24, 0x4bf2, 0x4c60, 0x4bc9, 0x4bc0, 0x4b86, 0x4b15, 0x4b30, 0x4ca2, 0x4c32, 0x4ba5, 0x4be0, 0x4b31, 0x4bf1, 0x4b86, 0x4bdd, 0x4be4, 0x4af9, 0x4b91, 0x4bc0, 0x4b24, 0x4c56, 0x4adf, 0x4abe, 0x4be9, 0x4ca8, 0x4b88, 0x4c23, 0x4b9d, 0x4bd0, 0x4c1e, 0x4aa9, 0x4bc0, 0x4c09, 0x4c90, 0x4c25, 0x4c08, 0x4bc6, 0x4bc9, 0x4b4f, 0x4b83, 0x4c23, 0x4a72, 0x4b55, 0x4aea, 0x4ac6, 0x4b43, 0x4bb7, +0x4c43, 0x4c26, 0x4ada, 0x4c21, 0x4c97, 0x4b64, 0x4a4e, 0x4c18, 0x4c3e, 0x4c53, 0x4b9c, 0x4c30, 0x4c1c, 0x4b24, 0x4b7f, 0x4afa, 0x4cc0, 0x4bba, 0x4c72, 0x4b76, 0x4bb3, 0x4bd0, 0x4b63, 0x4c32, 0x4c95, 0x4c3f, 0x4c31, 0x4c41, 0x4b83, 0x4be3, 0x4bba, 0x4bff, 0x4b8d, 0x4b41, 0x4b4c, 0x4b8c, 0x4b16, 0x4c74, 0x4c06, 0x4b8d, 0x4bcf, 0x4c81, 0x4b9d, 0x4c93, 0x4bc9, 0x4c56, 0x4c7c, 0x4b5e, 0x4bbd, 0x4c98, 0x4cb7, 0x4c3b, 0x4c5e, 0x4ba5, 0x4be0, 0x4b54, 0x4b8a, 0x4c85, 0x4b7c, 0x4b46, 0x4b94, 0x4ae4, 0x4b18, 0x4c27, +0x4b16, 0x4b8c, 0x4a3d, 0x4b88, 0x4c1b, 0x4b0f, 0x4a04, 0x4abe, 0x4c23, 0x4ba3, 0x4a4a, 0x4b38, 0x4b73, 0x4aef, 0x4adf, 0x4a2d, 0x4c1c, 0x4b44, 0x4bc8, 0x4b0b, 0x4b84, 0x4aef, 0x4b71, 0x4ad4, 0x4c11, 0x4b8b, 0x4ac7, 0x4afa, 0x4a97, 0x4b84, 0x4be4, 0x4b82, 0x4b31, 0x4b42, 0x4a9e, 0x4b09, 0x4a65, 0x4be0, 0x4b05, 0x4adb, 0x4bdd, 0x4c0e, 0x4a93, 0x4afd, 0x4a97, 0x4aec, 0x4bbb, 0x4a07, 0x4b17, 0x4ba0, 0x4bf7, 0x4bf1, 0x4b74, 0x4a9e, 0x4b2d, 0x4a79, 0x4b54, 0x4b2d, 0x4a8f, 0x4baa, 0x4a98, 0x4a1e, 0x4b65, 0x4b36, +0x4c55, 0x4c88, 0x4b65, 0x4c62, 0x4ccb, 0x4c38, 0x4b3e, 0x4c1a, 0x4c8f, 0x4cc3, 0x4c34, 0x4cbb, 0x4c76, 0x4be2, 0x4c2c, 0x4bb6, 0x4cf6, 0x4c80, 0x4ccc, 0x4c01, 0x4c86, 0x4c10, 0x4c22, 0x4c10, 0x4d00, 0x4c6e, 0x4c64, 0x4ca2, 0x4be9, 0x4c84, 0x4c3b, 0x4c53, 0x4c26, 0x4bfa, 0x4c62, 0x4c4b, 0x4c6a, 0x4cda, 0x4c5e, 0x4c2d, 0x4c8c, 0x4d3e, 0x4c32, 0x4cc0, 0x4c1e, 0x4c0c, 0x4c8b, 0x4b12, 0x4c35, 0x4c7a, 0x4d08, 0x4cb9, 0x4ced, 0x4c57, 0x4c9f, 0x4c2e, 0x4c18, 0x4c57, 0x4bb1, 0x4c67, 0x4bc1, 0x4c65, 0x4c26, 0x4c31, +0x4c48, 0x4c26, 0x4ae0, 0x4c9f, 0x4c72, 0x4c17, 0x4a1a, 0x4c03, 0x4c61, 0x4c7a, 0x4c00, 0x4cc2, 0x4c46, 0x4c0d, 0x4c38, 0x4b5b, 0x4cf5, 0x4c73, 0x4c8d, 0x4c3a, 0x4c01, 0x4c06, 0x4c0b, 0x4c2c, 0x4c86, 0x4c6d, 0x4c8f, 0x4c8d, 0x4b68, 0x4c0e, 0x4c90, 0x4c42, 0x4c0e, 0x4c17, 0x4c1b, 0x4c33, 0x4c06, 0x4cbb, 0x4b81, 0x4be9, 0x4c50, 0x4d1b, 0x4b81, 0x4c7e, 0x4c07, 0x4c4a, 0x4cd6, 0x4ac0, 0x4c60, 0x4c67, 0x4ccd, 0x4c9a, 0x4cc5, 0x4c63, 0x4cb2, 0x4b77, 0x4c30, 0x4c6f, 0x4bd4, 0x4c1e, 0x4b90, 0x4bf8, 0x4c3a, 0x4c54, +0x4c89, 0x4c5e, 0x4c01, 0x4c71, 0x4c9e, 0x4c5c, 0x4afc, 0x4c5b, 0x4cc7, 0x4c91, 0x4c4c, 0x4cab, 0x4c5c, 0x4c40, 0x4c33, 0x4b58, 0x4cdc, 0x4cc6, 0x4cd4, 0x4bd6, 0x4c71, 0x4c57, 0x4bc1, 0x4c63, 0x4d69, 0x4cc1, 0x4c4c, 0x4ca6, 0x4bb5, 0x4c8f, 0x4cac, 0x4c57, 0x4c18, 0x4c1d, 0x4c8f, 0x4c27, 0x4c43, 0x4cf2, 0x4c47, 0x4c98, 0x4c2e, 0x4d72, 0x4c39, 0x4c7b, 0x4c5e, 0x4c15, 0x4d19, 0x4b4a, 0x4ccf, 0x4cc7, 0x4d42, 0x4d20, 0x4d0d, 0x4c31, 0x4cbe, 0x4c35, 0x4c34, 0x4c5e, 0x4b89, 0x4c1f, 0x4c26, 0x4c5b, 0x4ca6, 0x4c59 +}; From 55985c522658a6cb039fc197bfd0f0307603f910 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:15:19 +0100 Subject: [PATCH 10/67] [cmake] Add utils to spatz task compilation --- cmake/spatz_helpers.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 39bcc8ec..ce83d456 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -148,7 +148,7 @@ function(add_cv32_executable_with_spatz) target_include_directories(${ARG_TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/inc - ${CMAKE_CURRENT_SOURCE_DIR}/utils + ${CMAKE_SOURCE_DIR}/tests/utils ${CMAKE_SOURCE_DIR}/hal/include ${CMAKE_SOURCE_DIR}/drivers/eventunit32/include ${ARG_INCLUDE_DIRS} From 6dc527afc6a46b4d98beba50516bb7806d1b8c73 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:15:43 +0100 Subject: [PATCH 11/67] [cmake] Add default linker and crt0 files for spatz --- cmake/spatz_config.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 580a5120..b0e082ec 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -95,6 +95,11 @@ set(SPATZ_LINK_FLAGS "-Wl,--allow-multiple-definition" ) +set(SPATZ_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_crt0.S" CACHE PATH "Spatz CRT0 assembly") +set(SPATZ_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_program.ld" CACHE PATH "Spatz linker script") +set(CV32_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/crt0.S" CACHE PATH "CV32 CRT0 assembly") +set(CV32_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/link.ld" CACHE PATH "CV32 linker script") + # TODO: check if needed # Mesh tile config from root Makefile set(TILES 2 CACHE INT "Mesh dimension (e.g. 2 implies 2x2 grid = 4 tiles)") From e1e2ba08db702004390adb43a91b4d752652735e Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:05:14 +0100 Subject: [PATCH 12/67] [test/spatz_on_magia] Add hello world test --- tests/CMakeLists.txt | 2 +- tests/spatz_on_magia/CMakeLists.txt | 1 + .../spatz_on_magia/hello_spatz/CMakeLists.txt | 22 ++++++++++ tests/spatz_on_magia/hello_spatz/main.c | 44 +++++++++++++++++++ .../hello_spatz/spatz_task/hello.c | 6 +++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tests/spatz_on_magia/CMakeLists.txt create mode 100644 tests/spatz_on_magia/hello_spatz/CMakeLists.txt create mode 100644 tests/spatz_on_magia/hello_spatz/main.c create mode 100644 tests/spatz_on_magia/hello_spatz/spatz_task/hello.c diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 86db9c4a..e517dc93 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -9,7 +9,7 @@ # Define mappings for tests set(TEST_MAPPINGS magia_v1:magia - magia_v2:magia + magia_v2:magia,spatz_on_magia ) # Call the macro diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt new file mode 100644 index 00000000..879f0386 --- /dev/null +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(hello_spatz) diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt new file mode 100644 index 00000000..1c93537c --- /dev/null +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -0,0 +1,22 @@ +# Compile Spatz task +add_spatz_task( + TEST_NAME hello_spatz + CRT0_SRC ${SPATZ_CRT0_SRC} + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello.c + LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} + OUTPUT_DIR ${CMAKE_BINARY_DIR} + OUTPUT_VAR HELLO_SPATZ_HEADER + FIRST_TASK_NAME hello_world_simple_task + INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils +) + +# Compile CV32 executable with embedded Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME hello_spatz + SPATZ_HEADER ${HELLO_SPATZ_HEADER} + CRT0_SRC ${CV32_CRT0_SRC} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c + LINK_SCRIPT ${CV32_LINK_SCRIPT} + INCLUDE_DIRS + ${CMAKE_SOURCE_DIR}/tests/utils +) diff --git a/tests/spatz_on_magia/hello_spatz/main.c b/tests/spatz_on_magia/hello_spatz/main.c new file mode 100644 index 00000000..23efac3f --- /dev/null +++ b/tests/spatz_on_magia/hello_spatz/main.c @@ -0,0 +1,44 @@ +#include "magia_tile_utils.h" +#include "magia_spatz_utils.h" +#include "event_unit_utils.h" +#include "hello_spatz_task_bin.h" + +int main(void) { + + int errors = 0; + + printf("[CV32] Spatz Test:\n"); + + // ========================================== + // Initialization of Event Unit and Spatz + // ========================================== + + // Initialize Event Unit + eu_init(); + eu_enable_events(EU_SPATZ_DONE_MASK); // Enable Spatz DONE event + + // Enable clk and initialize Spatz (bootrom jumps to _start, does full init) + printf("\n[CV32] Initializing Spatz...\n"); + spatz_init(SPATZ_BINARY_START); + + // ========================================== + // Test: Spatz Task + // ========================================== + printf("\n[CV32] Launching SPATZ Task\n"); + spatz_run_task(HELLO_WORLD_SIMPLE_TASK); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + if(spatz_get_exit_code() != 0) { + printf("[CV32] SPATZ TASK ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); + errors++; + } else { + printf("[CV32] SPATZ TASK ENDED successfully\n"); + } + + // Disable Spatz clock + spatz_clk_dis(); + + // Return error status for CV32 + return errors; +} diff --git a/tests/spatz_on_magia/hello_spatz/spatz_task/hello.c b/tests/spatz_on_magia/hello_spatz/spatz_task/hello.c new file mode 100644 index 00000000..2bfca849 --- /dev/null +++ b/tests/spatz_on_magia/hello_spatz/spatz_task/hello.c @@ -0,0 +1,6 @@ +#include "magia_tile_utils.h" + +int hello_world_simple_task(void) { + printf("[SNITCH] Hello World from Spatz!\n"); + return 0; +} From 375bcbc36e819531cc291d20ecc1ccf3a402889d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:05:39 +0100 Subject: [PATCH 13/67] [cmake] Fix spatz cmake configuration --- cmake/spatz_config.cmake | 3 ++- cmake/spatz_helpers.cmake | 33 +++++++++---------------- scripts/extract_task_symbols.sh | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 23 deletions(-) create mode 100755 scripts/extract_task_symbols.sh diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index b0e082ec..c27813d8 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -67,6 +67,7 @@ set(SPATZ_COMPILE_FLAGS "-g" "-Wall" "-Wextra" + "-Wno-incompatible-function-pointer-types" "-fno-common" "-ffunction-sections" "-fdata-sections" @@ -90,7 +91,7 @@ set(SPATZ_CFLAGS_DEFINES # Linker flags [MAGIA/spatz/sw/Makefile] set(SPATZ_LINK_FLAGS - "-fuse-ld=lld" + "-fuse-ld=${SPATZ_LLVM_PATH}/bin/ld.lld" "-Wl,-z,norelro" "-Wl,--allow-multiple-definition" ) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index ce83d456..13ce26f1 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -7,7 +7,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) function(add_spatz_task) set(options) set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR) - set(multiValueArgs TASK_SOURCES FIRST_TASK_NAME) + set(multiValueArgs TASK_SOURCES FIRST_TASK_NAME INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") @@ -23,6 +23,11 @@ function(add_spatz_task) set(TASK_HEADER "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task_bin.h") set(TASK_DUMP "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.dump") + set(INCLUDE_FLAGS "") + foreach(INCLUDE_DIR ${ARG_INCLUDE_DIRS}) + list(APPEND INCLUDE_FLAGS "-I${INCLUDE_DIR}") + endforeach() + # Compile crt0.S [MAGIA/spatz/sw/Makefile: $(CRT0_OBJ)] add_custom_command( OUTPUT ${TASK_CRT0_OBJ} @@ -41,6 +46,7 @@ function(add_spatz_task) COMMAND ${SPATZ_CLANG} ${SPATZ_COMPILE_FLAGS} ${SPATZ_CFLAGS_DEFINES} + ${INCLUDE_FLAGS} ${SPATZ_LINK_FLAGS} -T${ARG_LINKER_SCRIPT} -Wl,--defsym,__first_task=${ARG_FIRST_TASK_NAME} @@ -93,26 +99,9 @@ function(add_spatz_task) add_custom_command( OUTPUT ${TASK_HEADER} APPEND - COMMAND bash -c " - GUARD_NAME=\$(echo '${ARG_TEST_NAME}_TASK_BIN' | tr 'a-z' 'A-Z') - sed -i \"/#endif.*__\$${GUARD_NAME}_H__/d\" ${TASK_HEADER} - echo '' >> ${TASK_HEADER} - echo '/* Binary start address - defined by CV32 linker */' >> ${TASK_HEADER} - echo 'extern uint32_t _spatz_binary_start;' >> ${TASK_HEADER} - echo '#define SPATZ_BINARY_START ((uint32_t)&_spatz_binary_start)' >> ${TASK_HEADER} - echo '' >> ${TASK_HEADER} - echo '/* Dispatcher loop address - for spatz_run() */' >> ${TASK_HEADER} - DISP_ADDR=\$(${SPATZ_OBJDUMP} -t ${TASK_ELF} | grep 'dispatcher_loop\$\$' | awk '{print \$1}') - echo \"#define SPATZ_DISPATCHER_LOOP (SPATZ_BINARY_START + 0x\$${DISP_ADDR})\" >> ${TASK_HEADER} - echo '' >> ${TASK_HEADER} - echo '/* Task function entry points - OFFSETS from SPATZ_BINARY_START */' >> ${TASK_HEADER} - ${SPATZ_OBJDUMP} -t ${TASK_ELF} | grep '_task\$\$' | grep -v '__first_task\$\$' | awk '{print \$1, \$NF}' | while read addr name; do - TASK_NAME=\$(echo \$name | tr 'a-z' 'A-Z') - echo \"#define \$${TASK_NAME} (SPATZ_BINARY_START + 0x\$${addr})\" >> ${TASK_HEADER} - done - echo '' >> ${TASK_HEADER} - echo \"#endif /* __\$${GUARD_NAME}_H__ */\" >> ${TASK_HEADER} - " + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh + ${ARG_TEST_NAME} ${TASK_ELF} ${TASK_HEADER} ${SPATZ_OBJDUMP} + DEPENDS ${TASK_ELF} COMMENT "[SPATZ] Extracting task symbols..." VERBATIM ) @@ -198,7 +187,7 @@ function(add_cv32_executable_with_spatz) if(ARG_SPATZ_HEADER) get_filename_component(HEADER_FILENAME "${ARG_SPATZ_HEADER}" NAME) - string(REGEX MATCH "^([^_]+_[^_]+_[^_]+)" TEST_NAME "${HEADER_FILENAME}") + string(REGEX REPLACE "_task_bin.*$" "" TEST_NAME "${HEADER_FILENAME}") add_dependencies(${ARG_TARGET_NAME} ${TEST_NAME}_spatz_header) endif() diff --git a/scripts/extract_task_symbols.sh b/scripts/extract_task_symbols.sh new file mode 100755 index 00000000..83e15a88 --- /dev/null +++ b/scripts/extract_task_symbols.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Extract task symbols from ELF and append to task header +# Usage: extract_task_symbols.sh + +set -e + +TEST_NAME=$1 +TASK_ELF=$2 +TASK_HEADER=$3 +OBJDUMP=$4 + +GUARD_NAME=$(echo "${TEST_NAME}_TASK_BIN" | tr 'a-z' 'A-Z') + +# Remove existing #endif from header +sed -i "/#endif.*__${GUARD_NAME}_H__/d" "${TASK_HEADER}" + +# Add binary start address +echo "" >> "${TASK_HEADER}" +echo "/* Binary start address - defined by CV32 linker */" >> "${TASK_HEADER}" +echo "extern uint32_t _spatz_binary_start;" >> "${TASK_HEADER}" +echo "#define SPATZ_BINARY_START ((uint32_t)&_spatz_binary_start)" >> "${TASK_HEADER}" + +# Add dispatcher loop address +echo "" >> "${TASK_HEADER}" +echo "/* Dispatcher loop address - for spatz_run() */" >> "${TASK_HEADER}" +DISP_ADDR=$("${OBJDUMP}" -t "${TASK_ELF}" | grep 'dispatcher_loop' | awk '{print $1}' || echo "0") +echo "#define SPATZ_DISPATCHER_LOOP (SPATZ_BINARY_START + 0x${DISP_ADDR})" >> "${TASK_HEADER}" + +# Add task function entry points +echo "" >> "${TASK_HEADER}" +echo "/* Task function entry points - OFFSETS from SPATZ_BINARY_START */" >> "${TASK_HEADER}" +# Find all global functions with 'task' in their name +"${OBJDUMP}" -t "${TASK_ELF}" | grep -E "F .text.*task" | awk '{print $1, $NF}' | while read addr name; do + # Skip __first_task (that's an internal symbol) + if [[ "$name" != "__first_task" ]]; then + TASK_NAME=$(echo "$name" | tr 'a-z' 'A-Z') + echo "#define ${TASK_NAME} (SPATZ_BINARY_START + 0x${addr})" >> "${TASK_HEADER}" + fi +done + +# Close header guard +echo "" >> "${TASK_HEADER}" +echo "#endif /* __${GUARD_NAME}_H__ */" >> "${TASK_HEADER}" From 2fb3641f053d9cc4c58c5fac9ebd85ac72bd427a Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 10:41:22 +0100 Subject: [PATCH 14/67] [cmake] bootrom_helpers.cmake: Fix function name and create build if necessary --- cmake/bootrom_helpers.cmake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake/bootrom_helpers.cmake b/cmake/bootrom_helpers.cmake index 478b6937..bb2b265d 100644 --- a/cmake/bootrom_helpers.cmake +++ b/cmake/bootrom_helpers.cmake @@ -2,9 +2,9 @@ include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) -# Function: add_spatz_bootrom_binary +# Function: add_spatz_bootrom # Compiles Spatz bootrom -function(add_spatz_bootrom_binary) +function(add_spatz_bootrom) set(options) set(oneValueArgs BOOTROM_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR SV_OUTPUT) set(multiValueArgs) @@ -14,6 +14,9 @@ function(add_spatz_bootrom_binary) set(ARG_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) endif() + # Create output directory if it doesn't exist + file(MAKE_DIRECTORY "${ARG_OUTPUT_DIR}") + if(NOT IS_ABSOLUTE "${ARG_BOOTROM_SRC}") set(ARG_BOOTROM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_BOOTROM_SRC}") endif() From 87a92726eee997efc3020d394f56d569d47f7c74 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 10:42:23 +0100 Subject: [PATCH 15/67] [cmake] spatz_helpers: Fix build output directory --- cmake/spatz_helpers.cmake | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 13ce26f1..e46bd5a7 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -6,7 +6,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) # Compiles Spatz task binary, generates header with binary array + task symbols, and stimuli function(add_spatz_task) set(options) - set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR) + set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_SPATZ_DIR OUTPUT_VAR) set(multiValueArgs TASK_SOURCES FIRST_TASK_NAME INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -17,11 +17,21 @@ function(add_spatz_task) set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") endif() - set(TASK_CRT0_OBJ "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_crt0.o") - set(TASK_ELF "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.elf") - set(TASK_BIN "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.bin") - set(TASK_HEADER "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task_bin.h") - set(TASK_DUMP "${ARG_OUTPUT_DIR}/${ARG_TEST_NAME}_task.dump") + # Use OUTPUT_SPATZ_DIR if provided, otherwise use OUTPUT_DIR + if(ARG_OUTPUT_SPATZ_DIR) + set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_SPATZ_DIR}") + else() + set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_DIR}") + endif() + + # Create output directory if it doesn't exist + file(MAKE_DIRECTORY "${SPATZ_OUTPUT_DIR}") + + set(TASK_CRT0_OBJ "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_crt0.o") + set(TASK_ELF "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.elf") + set(TASK_BIN "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.bin") + set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task_bin.h") + set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.dump") set(INCLUDE_FLAGS "") foreach(INCLUDE_DIR ${ARG_INCLUDE_DIRS}) @@ -192,7 +202,7 @@ function(add_cv32_executable_with_spatz) endif() # Post-build: disassembly and stimuli [MAGIA/Makefile: $(STIM_INSTR) $(STIM_DATA)] - set(ELF_DUMP "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.dump") + set(ELF_DUMP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${ARG_TARGET_NAME}.s") set(ELF_OBJDUMP "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.objdump") set(ELF_ITB "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.itb") set(ELF_S19 "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.s19") From 693dfbd90293137caeee6b226846bd7d7e77adc5 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 10:54:47 +0100 Subject: [PATCH 16/67] [test/spatz_on_magia] hello_spatz: fix build output dir --- tests/spatz_on_magia/hello_spatz/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt index 1c93537c..ebebe638 100644 --- a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -5,6 +5,7 @@ add_spatz_task( TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello.c LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} OUTPUT_DIR ${CMAKE_BINARY_DIR} + OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/hello_spatz OUTPUT_VAR HELLO_SPATZ_HEADER FIRST_TASK_NAME hello_world_simple_task INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils From ae198b5342f80f2dfc04120dcf52276cfe9eadef Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:42:37 +0100 Subject: [PATCH 17/67] [targets/magia_v2] Build spatz bootrom only if sptaz tests are included --- targets/magia_v2/CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/targets/magia_v2/CMakeLists.txt b/targets/magia_v2/CMakeLists.txt index cffe91a9..86918596 100644 --- a/targets/magia_v2/CMakeLists.txt +++ b/targets/magia_v2/CMakeLists.txt @@ -77,10 +77,17 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/spatz") include(${CMAKE_SOURCE_DIR}/cmake/spatz_helpers.cmake) include(${CMAKE_SOURCE_DIR}/cmake/bootrom_helpers.cmake) - # Build bootrom once at target level (shared by all tests) - add_spatz_bootrom(${CMAKE_BINARY_DIR}/bin) - - message(STATUS "[MAGIA-SDK] Spatz integration enabled for magia_v2") + # Build bootrom only if Spatz tests are enabled + if(SPATZ_TESTS) + add_spatz_bootrom( + BOOTROM_SRC ${CMAKE_CURRENT_LIST_DIR}/spatz/bootrom/spatz_init.S + LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/spatz/bootrom/spatz_init.ld + OUTPUT_DIR ${CMAKE_BINARY_DIR}/bin/bootrom + ) + message(STATUS "[MAGIA-SDK] Spatz integration enabled for magia_v2 (bootrom will be built)") + else() + message(STATUS "[MAGIA-SDK] Spatz integration disabled (SPATZ_TESTS=0)") + endif() endif() # ========================================================= From ae1afe3dbd0a37a4948945e46caab3c6f0732a83 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:44:11 +0100 Subject: [PATCH 18/67] [test] CMakeLists: modify mapping to support Spatz tests --- tests/CMakeLists.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e517dc93..a60400d3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,10 +7,17 @@ # Alberto Dequino # Define mappings for tests -set(TEST_MAPPINGS - magia_v1:magia - magia_v2:magia,spatz_on_magia -) +if(SPATZ_TESTS) + set(TEST_MAPPINGS + magia_v1:magia + magia_v2:magia,spatz_on_magia + ) +else() + set(TEST_MAPPINGS + magia_v1:magia + magia_v2:magia + ) +endif() # Call the macro -add_magia_subdirectories(${TARGET_PLATFORM} "Test" "${TEST_MAPPINGS}") \ No newline at end of file +add_magia_subdirectories(${TARGET_PLATFORM} "Test" "${TEST_MAPPINGS}") From f371a57269c57c31ce3599bdaa6370b617ae780f Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:48:00 +0100 Subject: [PATCH 19/67] Makefile: Add support for spatz tests compilation --- Makefile | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4aacc409..ee085158 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Copyright (C) 2025 ETH Zurich and University of Bologna # -# Licensed under the Solderpad Hardware License, Version 0.51 -# (the "License"); you may not use this file except in compliance +# Licensed under the Solderpad Hardware License, Version 0.51 +# (the "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 @@ -15,7 +15,7 @@ # # Authors: Victor Isachi # Alberto Dequino -# +# # Magia-sdk Makefile SHELL := /bin/bash @@ -46,6 +46,7 @@ compiler ?= GCC_PULP ISA ?= rv32imcxgap9 gui ?= 0 tiles ?= 2 +spatz_tests ?= 1 tiles_2 := $(shell echo $$(( $(tiles) * $(tiles) ))) tiles_log := $(shell awk 'BEGIN { printf "%.0f", log($(tiles_2))/log(2) }') @@ -79,13 +80,13 @@ ifeq ($(compiler), GCC_MULTILIB) sed -i -E 's/^#add_subdirectory\(flatatt\)/add_subdirectory\(flatatt\)/' ./tests/magia/mesh/CMakeLists.txt sed -i -E 's/^\/\/#include "utils\/attention_utils.h"/#include "utils\/attention_utils.h"/' ./targets/$(target_platform)/include/tile.h endif - cmake -DTARGET_PLATFORM=$(target_platform) -DEVAL=$(eval) -DSTALLING=$(stalling) -DFSYNC_MM=$(fsync_mm) -DIDMA_MM=$(idma_mm) -DREDMULE_MM=$(redmule_mm) -DCOMPILER=$(compiler) -DPROFILE_CMP=$(profile_cmp) -DPROFILE_CMI=$(profile_cmi) -DPROFILE_CMO=$(profile_cmo) -DPROFILE_SNC=$(profile_snc) -B build --trace-expand + cmake -DTARGET_PLATFORM=$(target_platform) -DEVAL=$(eval) -DSTALLING=$(stalling) -DFSYNC_MM=$(fsync_mm) -DIDMA_MM=$(idma_mm) -DREDMULE_MM=$(redmule_mm) -DCOMPILER=$(compiler) -DPROFILE_CMP=$(profile_cmp) -DPROFILE_CMI=$(profile_cmi) -DPROFILE_CMO=$(profile_cmo) -DPROFILE_SNC=$(profile_snc) -DSPATZ_TESTS=$(spatz_tests) -B build --trace-expand cmake --build build --verbose set_mesh: ifeq ($(tiles), 1) $(eval mesh_dv=0) -endif +endif run: set_mesh @echo 'Magia is available at https://github.com/pulp-platform/MAGIA.git' @@ -107,10 +108,10 @@ else ifeq ($(platform), rtl) cp ./build/bin/$(test) $(BUILD_DIR)/build/verif objcopy --srec-len 1 --output-target=srec $(BIN) $(BIN).s19 scripts/parse_s19.pl $(BIN).s19 > $(BIN).txt - python3 scripts/s19tomem.py $(BIN).txt $(BUILD_DIR)/build/stim_instr.txt $(BUILD_DIR)/build/stim_data.txt + python3 scripts/s19tomem.py $(BIN).txt $(BUILD_DIR)/build/stim_instr.txt $(BUILD_DIR)/build/stim_data.txt cd $(BUILD_DIR) && \ cp -sf ../../../sim/modelsim.ini modelsim.ini && \ - ln -sfn ../../../sim/work work + ln -sfn ../../../sim/work work riscv32-unknown-elf-objdump -d -S -Mmarch=$(ISA) $(BIN) > $(BIN).dump riscv32-unknown-elf-objdump -d -l -s -Mmarch=$(ISA) $(BIN) > $(BIN).objdump python3 scripts/objdump2itb.py $(BIN).objdump > $(BIN).itb @@ -174,5 +175,3 @@ gvsoc_init: git checkout lz/magia-v2-core && \ cd ../pulp && \ git checkout lz/magia-v2-pulp - - From 3fa52fce2d76c4e9490b38790d548e7faa30bc7b Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:09:20 +0100 Subject: [PATCH 20/67] [cmake] spatz_config: cleanup --- cmake/spatz_config.cmake | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index c27813d8..2580911c 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -101,14 +101,8 @@ set(SPATZ_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_prog set(CV32_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/crt0.S" CACHE PATH "CV32 CRT0 assembly") set(CV32_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/link.ld" CACHE PATH "CV32 linker script") -# TODO: check if needed -# Mesh tile config from root Makefile -set(TILES 2 CACHE INT "Mesh dimension (e.g. 2 implies 2x2 grid = 4 tiles)") - - # Log info message(STATUS "Spatz Configuration:") message(STATUS " LLVM Path: ${SPATZ_LLVM_PATH}") message(STATUS " ISA: rv32${SPATZ_XTEN}") message(STATUS " VLEN: ${SPATZ_VLEN} bits") -message(STATUS " Mesh: ${TILES}x${TILES} (${TILES_2} tiles)") From 6b9b746fad9d8477a6d5383cd8c5e28994b2eea1 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 13:00:35 +0100 Subject: [PATCH 21/67] [scripts] update parse_s19 --- scripts/parse_s19.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 scripts/parse_s19.pl diff --git a/scripts/parse_s19.pl b/scripts/parse_s19.pl old mode 100755 new mode 100644 index 7f7aff62..7daa6be2 --- a/scripts/parse_s19.pl +++ b/scripts/parse_s19.pl @@ -137,7 +137,7 @@ sub hex2int { # sub int2hex { my $i=shift; # read in the integer - my $h; # define hex value + my $h=""; # define hex value for my $n (0..7){ # 8 digits my $e=16 ** (7-$n); # calculate exponent if ($e > $i){ # if 2^e is larger @@ -175,4 +175,4 @@ sub pad_data64 { } my $ret=$hi.$lo; # merge to one string return $ret; -} \ No newline at end of file +} From e57c924f11f700f136f074d66f93d7a87d1ba05d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:00:48 +0100 Subject: [PATCH 22/67] [test/spatz_on_magia] WIP refactor --- .../spatz_on_magia/hello_spatz/CMakeLists.txt | 6 +++--- tests/spatz_on_magia/hello_spatz/main.c | 18 ++++-------------- .../spatz_task/{hello.c => hello_task.c} | 2 +- 3 files changed, 8 insertions(+), 18 deletions(-) rename tests/spatz_on_magia/hello_spatz/spatz_task/{hello.c => hello_task.c} (72%) diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt index ebebe638..3ae6d622 100644 --- a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -1,13 +1,13 @@ # Compile Spatz task add_spatz_task( - TEST_NAME hello_spatz + TEST_NAME hello CRT0_SRC ${SPATZ_CRT0_SRC} - TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello.c + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} OUTPUT_DIR ${CMAKE_BINARY_DIR} OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/hello_spatz OUTPUT_VAR HELLO_SPATZ_HEADER - FIRST_TASK_NAME hello_world_simple_task + FIRST_TASK_NAME hello_task INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) diff --git a/tests/spatz_on_magia/hello_spatz/main.c b/tests/spatz_on_magia/hello_spatz/main.c index 23efac3f..bd9ff91f 100644 --- a/tests/spatz_on_magia/hello_spatz/main.c +++ b/tests/spatz_on_magia/hello_spatz/main.c @@ -1,7 +1,7 @@ #include "magia_tile_utils.h" #include "magia_spatz_utils.h" #include "event_unit_utils.h" -#include "hello_spatz_task_bin.h" +#include "hello_task_bin.h" int main(void) { @@ -9,24 +9,16 @@ int main(void) { printf("[CV32] Spatz Test:\n"); - // ========================================== - // Initialization of Event Unit and Spatz - // ========================================== - - // Initialize Event Unit eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); // Enable Spatz DONE event + eu_enable_events(EU_SPATZ_DONE_MASK); - // Enable clk and initialize Spatz (bootrom jumps to _start, does full init) printf("\n[CV32] Initializing Spatz...\n"); spatz_init(SPATZ_BINARY_START); - // ========================================== - // Test: Spatz Task - // ========================================== printf("\n[CV32] Launching SPATZ Task\n"); - spatz_run_task(HELLO_WORLD_SIMPLE_TASK); + spatz_run_task(HELLO_TASK); + printf("\n[CV32] Before eu wait\n"); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); if(spatz_get_exit_code() != 0) { @@ -36,9 +28,7 @@ int main(void) { printf("[CV32] SPATZ TASK ENDED successfully\n"); } - // Disable Spatz clock spatz_clk_dis(); - // Return error status for CV32 return errors; } diff --git a/tests/spatz_on_magia/hello_spatz/spatz_task/hello.c b/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c similarity index 72% rename from tests/spatz_on_magia/hello_spatz/spatz_task/hello.c rename to tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c index 2bfca849..4002a7dc 100644 --- a/tests/spatz_on_magia/hello_spatz/spatz_task/hello.c +++ b/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c @@ -1,6 +1,6 @@ #include "magia_tile_utils.h" -int hello_world_simple_task(void) { +int hello_task(void) { printf("[SNITCH] Hello World from Spatz!\n"); return 0; } From da2b240237e2b0a4bc3c7bd73a90cdf8177a489e Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 11 Feb 2026 12:30:37 +0100 Subject: [PATCH 23/67] [cmake] spatz_helpers: Better header with binary array generation --- cmake/spatz_helpers.cmake | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index e46bd5a7..9b18a73b 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -94,27 +94,20 @@ function(add_spatz_task) # Generate header with binary array [MAGIA/spatz/sw/Makefile: $(HEADER)] add_custom_command( - OUTPUT ${TASK_HEADER} - COMMAND python3 ${BIN2HEADER_SCRIPT} + OUTPUT ${TASK_HEADER} + # Python Script + COMMAND python3 ${BIN2HEADER_SCRIPT} ${TASK_BIN} ${TASK_HEADER} --name ${ARG_TEST_NAME}_task_bin --section .spatz_binary --address "dynamic (_spatz_binary_start)" - DEPENDS ${TASK_BIN} ${BIN2HEADER_SCRIPT} - COMMENT "[SPATZ] Generating header with binary array..." - VERBATIM - ) - - # Extract task symbols and append to header [MAGIA/spatz/sw/Makefile: $(HEADER)] - add_custom_command( - OUTPUT ${TASK_HEADER} - APPEND - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh + # Extrac symbols + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh ${ARG_TEST_NAME} ${TASK_ELF} ${TASK_HEADER} ${SPATZ_OBJDUMP} - DEPENDS ${TASK_ELF} - COMMENT "[SPATZ] Extracting task symbols..." - VERBATIM - ) + DEPENDS ${TASK_BIN} ${TASK_ELF} ${BIN2HEADER_SCRIPT} ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh + COMMENT "[SPATZ] Generating header and extracting task symbols..." + VERBATIM +) add_custom_target(${ARG_TEST_NAME}_spatz_header ALL DEPENDS From f6cc96b8ee382a951821080e383ccbf88342dc26 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 11 Feb 2026 14:14:47 +0100 Subject: [PATCH 24/67] [cmake] fix compilation of Spatz's crt0.S --- cmake/spatz_config.cmake | 10 +++++++++- cmake/spatz_helpers.cmake | 4 +--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 2580911c..a9558a37 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -54,7 +54,7 @@ set(CV32_XABI f CACHE STRING "CV32 XABI (32, 32f, 32d)") set(CV32_MARCH "-march=${CV32_ARCH}${CV32_XLEN}${CV32_XTEN}") set(CV32_MABI "-mabi=${CV32_ABI}${CV32_XLEN}${CV32_XABI}") -# Architecture and Compiler flags [MAGIA/spatz/sw/Makefile] +# Compiler flags [MAGIA/spatz/sw/Makefile] set(SPATZ_COMPILE_FLAGS "--target=riscv32" ${SPATZ_MARCH} @@ -77,6 +77,14 @@ set(SPATZ_COMPILE_FLAGS "-mcmodel=medany" ) +# Architecture flags [MAGIA/spatz/sw/Makefile] +set(SPATZ_ARCH_FLAGS + "--target=riscv32" + ${SPATZ_MARCH} + ${SPATZ_MABI} + "-menable-experimental-extensions" + ) + # Spatz defines [MAGIA/spatz/sw/Makefile] set(SPATZ_CFLAGS_DEFINES "-DSPATZ_RVD=${SPATZ_RVD}" diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 9b18a73b..6bfd2505 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -42,7 +42,7 @@ function(add_spatz_task) add_custom_command( OUTPUT ${TASK_CRT0_OBJ} COMMAND ${SPATZ_CLANG} - ${SPATZ_COMPILE_FLAGS} + ${SPATZ_ARCH_FLAGS} -c -o ${TASK_CRT0_OBJ} ${ARG_CRT0_SRC} DEPENDS ${ARG_CRT0_SRC} @@ -168,8 +168,6 @@ function(add_cv32_executable_with_spatz) -ffunction-sections -MMD -MP - -nostartfiles - -nostdlib ) # Linker flags [MAGIA/Makefile: LD_OPTS] From 29b2f605e4bf08bdd6061efaea2bef2874d0ab37 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 11 Feb 2026 14:21:44 +0100 Subject: [PATCH 25/67] [tests/spatz_on_magia] hello_stpatz: complete refactor --- tests/spatz_on_magia/hello_spatz/main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/spatz_on_magia/hello_spatz/main.c b/tests/spatz_on_magia/hello_spatz/main.c index bd9ff91f..3faa7da5 100644 --- a/tests/spatz_on_magia/hello_spatz/main.c +++ b/tests/spatz_on_magia/hello_spatz/main.c @@ -12,13 +12,12 @@ int main(void) { eu_init(); eu_enable_events(EU_SPATZ_DONE_MASK); - printf("\n[CV32] Initializing Spatz...\n"); + printf("[CV32] Initializing Spatz...\n"); spatz_init(SPATZ_BINARY_START); - printf("\n[CV32] Launching SPATZ Task\n"); + printf("[CV32] Launching SPATZ Task\n"); spatz_run_task(HELLO_TASK); - printf("\n[CV32] Before eu wait\n"); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); if(spatz_get_exit_code() != 0) { From ba93a2b8c435e7508ede478bfbfad4fa82e93f0f Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 11 Feb 2026 14:52:30 +0100 Subject: [PATCH 26/67] [tests/spatz_on_magia] Add double task test --- tests/spatz_on_magia/CMakeLists.txt | 1 + .../spatz_on_magia/double_task/CMakeLists.txt | 25 +++++ tests/spatz_on_magia/double_task/main.c | 99 +++++++++++++++++++ .../double_task/spatz_task/hello_task.c | 6 ++ .../double_task/spatz_task/idma_task.c | 95 ++++++++++++++++++ 5 files changed, 226 insertions(+) create mode 100644 tests/spatz_on_magia/double_task/CMakeLists.txt create mode 100644 tests/spatz_on_magia/double_task/main.c create mode 100644 tests/spatz_on_magia/double_task/spatz_task/hello_task.c create mode 100644 tests/spatz_on_magia/double_task/spatz_task/idma_task.c diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt index 879f0386..54ed0f9c 100644 --- a/tests/spatz_on_magia/CMakeLists.txt +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -1 +1,2 @@ +add_subdirectory(double_task) add_subdirectory(hello_spatz) diff --git a/tests/spatz_on_magia/double_task/CMakeLists.txt b/tests/spatz_on_magia/double_task/CMakeLists.txt new file mode 100644 index 00000000..b2ecaa1e --- /dev/null +++ b/tests/spatz_on_magia/double_task/CMakeLists.txt @@ -0,0 +1,25 @@ +# Compile Spatz task +add_spatz_task( + TEST_NAME double + CRT0_SRC ${SPATZ_CRT0_SRC} + TASK_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c + ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/idma_task.c + LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} + OUTPUT_DIR ${CMAKE_BINARY_DIR} + OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/double_task + OUTPUT_VAR HELLO_SPATZ_HEADER + FIRST_TASK_NAME hello_task + INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils +) + +# Compile CV32 executable with embedded Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME double_task + SPATZ_HEADER ${HELLO_SPATZ_HEADER} + CRT0_SRC ${CV32_CRT0_SRC} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c + LINK_SCRIPT ${CV32_LINK_SCRIPT} + INCLUDE_DIRS + ${CMAKE_SOURCE_DIR}/tests/utils +) diff --git a/tests/spatz_on_magia/double_task/main.c b/tests/spatz_on_magia/double_task/main.c new file mode 100644 index 00000000..ca4683b0 --- /dev/null +++ b/tests/spatz_on_magia/double_task/main.c @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * Double Spatz Test - CV32 launches Spatz task twice consecutively + * + */ +#include "magia_tile_utils.h" +#include "magia_spatz_utils.h" +#include "event_unit_utils.h" +#include "double_task_bin.h" + +int main(void) { + + int errors = 0; + + printf("[CV32] Double Spatz Test:\n"); + + // ========================================== + // Initialization of Event Unit and Spatz + // ========================================== + + // Initialize Event Unit + eu_init(); + eu_enable_events(EU_SPATZ_DONE_MASK); // Enable Spatz DONE event + + // Enable clk and initialize Spatz (bootrom jumps to _start, does full init) + printf("\n[CV32] Initializing Spatz...\n"); + spatz_init(SPATZ_BINARY_START); + + // ========================================== + // Test 1: First Spatz Task Run + // ========================================== + printf("\n[CV32] Launching SPATZ Task (Run 1)\n"); + spatz_run_task(HELLO_TASK); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + if(spatz_get_exit_code() != 0) { + printf("[CV32] SPATZ TASK RUN 1 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); + errors++; + } else { + printf("[CV32] SPATZ TASK RUN 1 ENDED successfully\n"); + } + + // Disable Spatz clock between tasks + printf("\n[CV32] Disabling Spatz clock...\n"); + spatz_clk_dis(); + + // Re-enable Spatz clock + printf("[CV32] Re-enabling Spatz clock...\n"); + spatz_clk_en(); + + // ========================================== + // Test 2: Second Spatz Task Run + // ========================================== + printf("\n[CV32] Launching SPATZ Task (Run 2)\n"); + spatz_run_task(IDMA_SIMPLE_TASK); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + if(spatz_get_exit_code() != 0) { + printf("[CV32] SPATZ TASK RUN 2 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); + errors++; + } else { + printf("[CV32] SPATZ TASK RUN 2 ENDED successfully\n"); + } + + // ========================================== + // Summary + // ========================================== + if(errors == 0) { + printf("\n[CV32] ========================================\n"); + printf("[CV32] ALL TESTS PASSED (2 runs completed)\n"); + printf("[CV32] ========================================\n"); + } else { + printf("\n[CV32] TESTS FAILED with %d errors\n", errors); + } + + // Disable Spatz clock + spatz_clk_dis(); + + // Return error status for CV32 + return errors; +} diff --git a/tests/spatz_on_magia/double_task/spatz_task/hello_task.c b/tests/spatz_on_magia/double_task/spatz_task/hello_task.c new file mode 100644 index 00000000..4002a7dc --- /dev/null +++ b/tests/spatz_on_magia/double_task/spatz_task/hello_task.c @@ -0,0 +1,6 @@ +#include "magia_tile_utils.h" + +int hello_task(void) { + printf("[SNITCH] Hello World from Spatz!\n"); + return 0; +} diff --git a/tests/spatz_on_magia/double_task/spatz_task/idma_task.c b/tests/spatz_on_magia/double_task/spatz_task/idma_task.c new file mode 100644 index 00000000..2f86a215 --- /dev/null +++ b/tests/spatz_on_magia/double_task/spatz_task/idma_task.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2023-2024 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 + * + * Authors: Luca Balboni + * + * iDMA Task for MAGIA Tile - Demonstrates iDMA Transfers with Event Unit controlled by Spatz_cc + */ +#include +#include "magia_tile_utils.h" +#include "event_unit_utils.h" +#include "idma_mm_utils.h" + +#define L1_DMA_SRC ((volatile uint32_t *)(L1_BASE + 0x1000)) +#define L1_DMA_DST ((volatile uint32_t *)(L1_BASE + 0x2000)) +#define L2_DMA_BUF ((volatile uint32_t *)(L2_BASE + 0x1000)) +#define DMA_SIZE 64 + +int idma_simple_task(void) { + printf("[SNITCH] \n========================================\n"); + printf("[SNITCH] IDMA TASK: DMA Transfers + Event Unit\n"); + printf("[SNITCH] ========================================\n"); + int errors = 0; + + // Enable iDMA events (keep EU_SPATZ_DONE enabled for CV32) + printf("[SNITCH] Enabling iDMA events...\n"); + eu_enable_events(EU_IDMA_ALL_DONE_MASK); + + // 1. Test iDMA transfer L1→L2 + printf("[SNITCH] Testing iDMA L1 to L2 transfer...\n"); + + // Initialize source data in L1 + for (int i = 0; i < (DMA_SIZE/4); i++) { + L1_DMA_SRC[i] = 0xA0000000 + i; + } + + // Launch DMA transfer (L1→L2) + int tid = idma_L1ToL2((uint32_t)L1_DMA_SRC, (uint32_t)L2_DMA_BUF, DMA_SIZE); + + // Wait for O2A completion with polling (10ms timeout) + uint32_t events = eu_idma_wait_o2a_completion(EU_WAIT_MODE_POLLING); + + if (events & EU_IDMA_O2A_DONE_MASK) { + printf("[SNITCH] DMA L1 to L2 complete (O2A event detected)\n"); + } else { + printf("[SNITCH] DMA L1 to L2 TIMEOUT\n"); + errors++; + } + + // 2. Test iDMA transfer L2→L1 + printf("[SNITCH] Testing iDMA L2 to L1 transfer...\n"); + + // Clear destination + for (int i = 0; i < (DMA_SIZE/4); i++) { + L1_DMA_DST[i] = 0; + } + + tid = idma_L2ToL1((uint32_t)L2_DMA_BUF, (uint32_t)L1_DMA_DST, DMA_SIZE); + + // Wait for A2O completion with polling (10ms timeout) + events = eu_idma_wait_a2o_completion(EU_WAIT_MODE_POLLING); + + if (events & EU_IDMA_A2O_DONE_MASK) { + printf("[SNITCH] DMA L2 to L1 complete (A2O event detected)\n"); + } else { + printf("[SNITCH] DMA L2 to L1 TIMEOUT\n"); + errors++; + } + + // Verify transferred data (using mmio32) + printf("[SNITCH] Verifying transferred data...\n"); + for (int i = 0; i < (DMA_SIZE/4); i++) { + uint32_t expected = 0xA0000000 + i; + uint32_t computed = mmio32((uint32_t)L1_DMA_DST + 4*i); + if (computed != expected) { + printf("[SNITCH] [%d] FAIL: computed=0x%08x, expected=0x%08x\n", + i, computed, expected); + errors++; + } + } + if (errors == 0) printf("[SNITCH] Data verification: OK\n"); + return 0; +} From 41780336ecca3b3109a812316965826f515d40f1 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 12 Feb 2026 09:39:22 +0100 Subject: [PATCH 27/67] [test/utils] removed unnecessary header files --- tests/utils/cache_fill.h | 8201 ---------------------------------- tests/utils/fsync_mm_api.h | 107 - tests/utils/fsync_mm_utils.h | 62 - tests/utils/spatz_workers.h | 1381 ------ tests/utils/w_input.h | 74 - tests/utils/x_input.h | 106 - tests/utils/y_input.h | 106 - tests/utils/z_output.h | 106 - 8 files changed, 10143 deletions(-) delete mode 100644 tests/utils/cache_fill.h delete mode 100644 tests/utils/fsync_mm_api.h delete mode 100644 tests/utils/fsync_mm_utils.h delete mode 100644 tests/utils/spatz_workers.h delete mode 100644 tests/utils/w_input.h delete mode 100644 tests/utils/x_input.h delete mode 100644 tests/utils/y_input.h delete mode 100644 tests/utils/z_output.h diff --git a/tests/utils/cache_fill.h b/tests/utils/cache_fill.h deleted file mode 100644 index 728f91c3..00000000 --- a/tests/utils/cache_fill.h +++ /dev/null @@ -1,8201 +0,0 @@ -// Copyright 2025 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// Authors: Victor Isachi -// - -void fill_icache(){ - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); - asm volatile("nop" ::); -} diff --git a/tests/utils/fsync_mm_api.h b/tests/utils/fsync_mm_api.h deleted file mode 100644 index 8f271290..00000000 --- a/tests/utils/fsync_mm_api.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * Based on fsync_api.h by Victor Isachi - * - * MAGIA FractalSync Memory-Mapped Synchronization Patterns API - */ - -#ifndef FSYNC_MM_API_H -#define FSYNC_MM_API_H - - #include "fsync_mm_utils.h" - #include "magia_tile_utils.h" - #include "magia_utils.h" - - #define _FS_MM_GLOBAL_AGGR (0xFFFFFFFF >> (1+__builtin_clz(NUM_HARTS))) - #define _FS_MM_GLOBAL_ID (-1) - #define _FS_MM_HNBR_AGGR (0x1) - #define _FS_MM_HNBR_ID (0) - #define _FS_MM_VNBR_AGGR (0x1) - #define _FS_MM_VNBR_ID (1) - #define _FS_MM_HRING_AGGR (0x1) - #define _FS_MM_HRING_ID (2) - #define _FS_MM_VRING_AGGR (0x1) - #define _FS_MM_VRING_ID (3) - #define _FS_MM_RC_LVL (0x1 << (29-__builtin_clz(NUM_HARTS))) - #define _FS_MM_RC_AGGR (0x155 >> (__builtin_clz(NUM_HARTS)-21)) - - // Lookup table indicating the id of row synchronization - uint32_t row_id_lookup_mm(volatile uint32_t hartid_y){ - if (hartid_y < MESH_Y_TILES/2) return 2*hartid_y; - else return 2*(hartid_y-MESH_Y_TILES/2); - } - - // Lookup table indicating the id of column synchronization - uint32_t col_id_lookup_mm(volatile uint32_t hartid_x){ - if (hartid_x < MESH_X_TILES/2) return 2*hartid_x+1; - else return 2*(hartid_x-MESH_X_TILES/2)+1; - } - - static inline void fsync_mm_hnbr(){ - fsync_mm(_FS_MM_HNBR_ID, _FS_MM_HNBR_AGGR); - } - - static inline void fsync_mm_vnbr(){ - fsync_mm(_FS_MM_VNBR_ID, _FS_MM_VNBR_AGGR); - } - - void fsync_mm_hring(){ - uint32_t hartid = get_hartid(); - uint32_t hartid_x = GET_X_ID(hartid); - uint32_t hartid_y = GET_Y_ID(hartid); - if ((hartid_x == 0) || (hartid_x == MESH_X_TILES-1)){ - uint32_t id = row_id_lookup_mm(hartid_y); - fsync_mm(id, _FS_MM_RC_LVL); - } else { - fsync_mm(_FS_MM_HRING_ID, _FS_MM_HRING_AGGR); - } - } - - void fsync_mm_vring(){ - uint32_t hartid = get_hartid(); - uint32_t hartid_x = GET_X_ID(hartid); - uint32_t hartid_y = GET_Y_ID(hartid); - if ((hartid_y == 0) || (hartid_y == MESH_Y_TILES-1)){ - uint32_t id = col_id_lookup_mm(hartid_x); - fsync_mm(id, _FS_MM_RC_LVL); - } else { - fsync_mm(_FS_MM_VRING_ID, _FS_MM_VRING_AGGR); - } - } - - void fsync_mm_rows(){ - uint32_t hartid = get_hartid(); - uint32_t hartid_y = GET_Y_ID(hartid); - uint32_t id = row_id_lookup_mm(hartid_y); - fsync_mm(id, _FS_MM_RC_AGGR); - } - - void fsync_mm_cols(){ - uint32_t hartid = get_hartid(); - uint32_t hartid_x = GET_X_ID(hartid); - uint32_t id = col_id_lookup_mm(hartid_x); - fsync_mm(id, _FS_MM_RC_AGGR); - } - - static inline void fsync_mm_global(){ - fsync_mm(_FS_MM_GLOBAL_ID, _FS_MM_GLOBAL_AGGR); - } - - - -#endif /*FSYNC_MM_API_H*/ diff --git a/tests/utils/fsync_mm_utils.h b/tests/utils/fsync_mm_utils.h deleted file mode 100644 index 036d6735..00000000 --- a/tests/utils/fsync_mm_utils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * Based on fsync_isa_utils.h by Victor Isachi - * - * MAGIA FractalSync Memory-Mapped Utils - * WARNING: Make sure to undefine EVENT_UNIT in this file if POLLING in registers mm is desired, otherwise polling mode will not work correctly - */ - -#ifndef FSYNC_MM_UTILS_H -#define FSYNC_MM_UTILS_H -#define EVENT_UNIT - -#include "magia_tile_utils.h" - -/* Memory-mapped FractalSync register offsets */ -#define FSYNC_MM_AGGR_REG_OFFSET (0x00) -#define FSYNC_MM_ID_REG_OFFSET (0x04) -#define FSYNC_MM_CONTROL_REG_OFFSET (0x08) -#define FSYNC_MM_STATUS_REG_OFFSET (0x0C) - -/* Status register bits */ -#define FSYNC_MM_STATUS_BUSY_MASK (1 << 2) - -/* Memory-mapped sync function */ -static inline void fsync_mm(volatile uint32_t id, volatile uint32_t aggregate){ - volatile char *fsync_base = (volatile char *)(FSYNC_BASE); - - *(volatile uint32_t *)(fsync_base + FSYNC_MM_AGGR_REG_OFFSET) = aggregate; - *(volatile uint32_t *)(fsync_base + FSYNC_MM_ID_REG_OFFSET) = id; - *(volatile uint32_t *)(fsync_base + FSYNC_MM_CONTROL_REG_OFFSET) = 1; - -#ifndef EVENT_UNIT - // Polling mode - wait for completion - volatile uint32_t status; - do { - status = *(volatile uint32_t *)(fsync_base + FSYNC_MM_STATUS_REG_OFFSET); - if (status & FSYNC_MM_STATUS_BUSY_MASK) { - printf("FSYNC_MM still busy...\n"); - // Still busy, optionally add a small delay here - } - } while (status & FSYNC_MM_STATUS_BUSY_MASK); -#endif - // In non-stalling mode, the function returns immediately - // and the caller should do wfi to wait for interrupt -} - -#endif /*FSYNC_MM_UTILS_H*/ diff --git a/tests/utils/spatz_workers.h b/tests/utils/spatz_workers.h deleted file mode 100644 index 2ef5ad38..00000000 --- a/tests/utils/spatz_workers.h +++ /dev/null @@ -1,1381 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Spatz Vector Utilities - Based on Spatz Benchmarks - * Provides optimized vector kernels for various operations - */ - - -#ifndef _SPATZ_UTILS_H_ -#define _SPATZ_UTILS_H_ - -#include - -// FP16 type alias -typedef uint16_t fp16_t; -typedef _Float16 float16_t; - -// ============================================================================= -// Dot Product Kernels (from spatzBenchmarks/dp-fdotp) -// ============================================================================= - -// 64-bit dot-product: a * b -static inline double fdotp_v64b(const double *a, const double *b, unsigned int avl) { - const unsigned int orig_avl = avl; - unsigned int vl; - double red; - - // Clean the accumulator - asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); - asm volatile("vmv.s.x v0, zero"); - - // Stripmine and accumulate a partial reduced vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load chunk a and b - asm volatile("vle64.v v8, (%0)" ::"r"(a)); - asm volatile("vle64.v v16, (%0)" ::"r"(b)); - - // Multiply and accumulate - if (avl == orig_avl) { - asm volatile("vfmul.vv v24, v8, v16"); - } else { - asm volatile("vfmacc.vv v24, v8, v16"); - } - - // Bump pointers - a += vl; - b += vl; - avl -= vl; - } while (avl > 0); - - // Reduce and return - asm volatile("vsetvli zero, %0, e64, m8, ta, ma" ::"r"(orig_avl)); - asm volatile("vfredusum.vs v0, v24, v0"); - asm volatile("vfmv.f.s %0, v0" : "=f"(red)); - - return red; -} - -// 32-bit dot-product: a * b -static inline float fdotp_v32b(const float *a, const float *b, unsigned int avl) { - const unsigned int orig_avl = avl; - unsigned int vl; - float red; - - asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); - asm volatile("vmv.s.x v0, zero"); - - // Stripmine and accumulate a partial reduced vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load chunk a and b - asm volatile("vle32.v v8, (%0)" ::"r"(a)); - asm volatile("vle32.v v16, (%0)" ::"r"(b)); - - // Multiply and accumulate - if (avl == orig_avl) { - asm volatile("vfmul.vv v24, v8, v16"); - } else { - asm volatile("vfmacc.vv v24, v8, v16"); - } - - // Bump pointers - a += vl; - b += vl; - avl -= vl; - } while (avl > 0); - - // Reduce and return - asm volatile("vsetvli zero, %0, e32, m8, ta, ma" ::"r"(orig_avl)); - asm volatile("vfredusum.vs v0, v24, v0"); - asm volatile("vfmv.f.s %0, v0" : "=f"(red)); - return red; -} - -// 16-bit dot-product: a * b -static inline float16_t fdotp_v16b(const float16_t *a, const float16_t *b, unsigned int avl) { - const unsigned int orig_avl = avl; - unsigned int vl; - float16_t red; - - asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); - asm volatile("vmv.s.x v0, zero"); - - // Stripmine and accumulate a partial reduced vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load chunk a and b - asm volatile("vle16.v v8, (%0)" ::"r"(a)); - asm volatile("vle16.v v16, (%0)" ::"r"(b)); - - // Multiply and accumulate - if (avl == orig_avl) { - asm volatile("vfmul.vv v24, v8, v16"); - } else { - asm volatile("vfmacc.vv v24, v8, v16"); - } - - // Bump pointers - a += vl; - b += vl; - avl -= vl; - } while (avl > 0); - - // Reduce and return - asm volatile("vsetvli zero, %0, e16, m8, ta, ma" ::"r"(orig_avl)); - asm volatile("vfredusum.vs v0, v24, v0"); - asm volatile("vfmv.f.s %0, v0" : "=f"(red)); - return red; -} - -// ============================================================================= -// AXPY Kernels (from spatzBenchmarks/dp-faxpy): y = a * x + y -// ============================================================================= - -// 64-bit AXPY: y = a * x + y -static inline void faxpy_v64b(const double a, const double *x, const double *y, unsigned int avl) { - unsigned int vl; - - // Stripmine and accumulate a partial vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e64, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load vectors - asm volatile("vle64.v v0, (%0)" ::"r"(x)); - asm volatile("vle64.v v8, (%0)" ::"r"(y)); - - // Multiply-accumulate - asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); - - // Store results - asm volatile("vse64.v v8, (%0)" ::"r"(y)); - - // Bump pointers - x += vl; - y += vl; - avl -= vl; - } while (avl > 0); -} - -// 32-bit AXPY: y = a * x + y -static inline void faxpy_v32b(const float a, const float *x, const float *y, unsigned int avl) { - unsigned int vl; - - // Stripmine and accumulate a partial vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e32, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load vectors - asm volatile("vle32.v v0, (%0)" ::"r"(x)); - asm volatile("vle32.v v8, (%0)" ::"r"(y)); - - // Multiply-accumulate - asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); - - // Store results - asm volatile("vse32.v v8, (%0)" ::"r"(y)); - - // Bump pointers - x += vl; - y += vl; - avl -= vl; - } while (avl > 0); -} - -// 16-bit AXPY: y = a * x + y -static inline void faxpy_v16b(const float16_t a, const float16_t *x, const float16_t *y, unsigned int avl) { - unsigned int vl; - - // Stripmine and accumulate a partial vector - do { - // Set the vl - asm volatile("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); - - // Load vectors - asm volatile("vle16.v v0, (%0)" ::"r"(x)); - asm volatile("vle16.v v8, (%0)" ::"r"(y)); - - // Multiply-accumulate - asm volatile("vfmacc.vf v8, %0, v0" ::"f"(a)); - - // Store results - asm volatile("vse16.v v8, (%0)" ::"r"(y)); - - // Bump pointers - x += vl; - y += vl; - avl -= vl; - } while (avl > 0); -} - -// ============================================================================= -// Matrix Multiplication Kernels (from spatzBenchmarks/dp-fmatmul) -// ============================================================================= - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -// Forward declarations -static inline void fmatmul_v64b_2xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v64b_4xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v64b_8xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); - -// Matrix multiplication wrapper - automatically selects optimal variant -// Computes C = A × B where C is MxP, A is MxN, B is NxP -static inline void fmatmul_v64b(double *c, const double *a, const double *b, - const unsigned int M, const unsigned int N, - const unsigned int P) { - if (M <= 4) { - fmatmul_v64b_2xVL(c, a, b, 0, M, N, P, 0, P); - } else if (M <= 8) { - fmatmul_v64b_4xVL(c, a, b, 0, M, N, P, 0, P); - } else { - fmatmul_v64b_8xVL(c, a, b, 0, M, N, P, 0, P); - } -} - -// 2xVL variant - optimized for small matrices (M <= 4) -static inline void fmatmul_v64b_2xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e64, m8, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const double *b_ = b + p; - double *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 2) { - const double *a_ = a + m * N; - const double *a__ = a_; - - asm volatile("vle64.v v16, (%0);" ::"r"(b_)); - const double *b__ = b_ + P; - - double *c__ = c_ + m * P; - - double t0, t1; - - t0 = *a__; - a__ += N; - t1 = *a__; - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle64.v v24, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); - t1 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); - t1 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle64.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - t1 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - asm volatile("vse64.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - asm volatile("vse64.v v8, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 4xVL variant - optimized for medium matrices (M <= 8) -static inline void fmatmul_v64b_4xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e64, m4, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const double *b_ = b + p; - double *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 4) { - const double *a_ = a + m * N; - const double *a__ = a_; - - asm volatile("vle64.v v16, (%0);" ::"r"(b_)); - const double *b__ = b_ + P; - - double *c__ = c_ + m * P; - - double t0, t1, t2, t3; - - t0 = *a__; - a__ += N; - t1 = *a__; - a__ += N; - t2 = *a__; - a__ += N; - t3 = *a__; - - unsigned int n = 0; - - while (n < N) { - asm volatile("vle64.v v20, (%0);" ::"r"(b__)); - b__ += P; - - a__ = a_ + ++n; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); - t3 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); - t3 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle64.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - t3 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse64.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - asm volatile("vse64.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - asm volatile("vse64.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - asm volatile("vse64.v v12, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 8xVL variant - optimized for larger matrices (M > 8) -static inline void fmatmul_v64b_8xVL(double *c, const double *a, const double *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e64, m2, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const double *b_ = b + p; - double *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 8) { - const double *a_ = a + m * N; - const double *a__ = a_; - - asm volatile("vle64.v v18, (%0);" ::"r"(b_)); - const double *b__ = b_ + P; - - double *c__ = c_ + m * P; - - double t0, t1, t2, t3, t4, t5, t6, t7; - - t0 = *a__; - a__ += N; - t1 = *a__; - a__ += N; - t2 = *a__; - a__ += N; - t3 = *a__; - a__ += N; - t4 = *a__; - a__ += N; - t5 = *a__; - a__ += N; - t6 = *a__; - a__ += N; - t7 = *a__; - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle64.v v20, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); - t7 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); - t7 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle64.v v18, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - t7 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse64.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - asm volatile("vse64.v v2, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - asm volatile("vse64.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - asm volatile("vse64.v v6, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - asm volatile("vse64.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - asm volatile("vse64.v v10, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - asm volatile("vse64.v v12, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - asm volatile("vse64.v v14, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// ============================================================================= -// FP32 Matrix Multiplication Kernels (from spatzBenchmarks/sp-fmatmul) -// ============================================================================= - -// Forward declarations for FP32 matmul -static inline void fmatmul_v32b_2xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v32b_4xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v32b_8xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); - -// FP32 matrix multiplication wrapper - automatically selects optimal variant -// Computes C = A × B where C is MxP, A is MxN, B is NxP -static inline void fmatmul_v32b(float *c, const float *a, const float *b, - const unsigned int M, const unsigned int N, - const unsigned int P) { - if (M <= 4) { - fmatmul_v32b_2xVL(c, a, b, 0, M, N, P, 0, P); - } else if (M <= 8) { - fmatmul_v32b_4xVL(c, a, b, 0, M, N, P, 0, P); - } else { - fmatmul_v32b_8xVL(c, a, b, 0, M, N, P, 0, P); - } -} - -// 2xVL variant - optimized for small matrices (M <= 4) -static inline void fmatmul_v32b_2xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e32, m8, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float *b_ = b + p; - float *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 2) { - const float *a_ = a + m * N; - const float *a__ = a_; - - asm volatile("vle32.v v16, (%0);" ::"r"(b_)); - const float *b__ = b_ + P; - - float *c__ = c_ + m * P; - - float t0, t1; - - t0 = *a__; - a__ += N; - t1 = *a__; - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle32.v v24, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); - t1 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); - t1 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle32.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - t1 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - asm volatile("vse32.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - asm volatile("vse32.v v8, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 4xVL variant - optimized for medium matrices (M <= 8) -static inline void fmatmul_v32b_4xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e32, m4, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float *b_ = b + p; - float *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 4) { - const float *a_ = a + m * N; - const float *a__ = a_; - - asm volatile("vle32.v v16, (%0);" ::"r"(b_)); - const float *b__ = b_ + P; - - float *c__ = c_ + m * P; - - float t0, t1, t2, t3; - - t0 = *a__; - a__ += N; - t1 = *a__; - a__ += N; - t2 = *a__; - a__ += N; - t3 = *a__; - - unsigned int n = 0; - - while (n < N) { - asm volatile("vle32.v v20, (%0);" ::"r"(b__)); - b__ += P; - - a__ = a_ + ++n; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); - t3 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); - t3 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle32.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - t3 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse32.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - asm volatile("vse32.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - asm volatile("vse32.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - asm volatile("vse32.v v12, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 8xVL variant - optimized for larger matrices (M > 8) -static inline void fmatmul_v32b_8xVL(float *c, const float *a, const float *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e32, m2, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float *b_ = b + p; - float *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 8) { - const float *a_ = a + m * N; - const float *a__ = a_; - - asm volatile("vle32.v v18, (%0);" ::"r"(b_)); - const float *b__ = b_ + P; - - float *c__ = c_ + m * P; - - float t0, t1, t2, t3, t4, t5, t6, t7; - - t0 = *a__; - a__ += N; - t1 = *a__; - a__ += N; - t2 = *a__; - a__ += N; - t3 = *a__; - a__ += N; - t4 = *a__; - a__ += N; - t5 = *a__; - a__ += N; - t6 = *a__; - a__ += N; - t7 = *a__; - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle32.v v20, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); - t7 = *a__; - } else { - asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); - t7 = *a__; - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle32.v v18, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - t0 = *a__; - a__ += N; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - t1 = *a__; - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - t2 = *a__; - a__ += N; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - t3 = *a__; - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - t4 = *a__; - a__ += N; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - t5 = *a__; - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - t6 = *a__; - a__ += N; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - t7 = *a__; - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse32.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - asm volatile("vse32.v v2, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - asm volatile("vse32.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - asm volatile("vse32.v v6, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - asm volatile("vse32.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - asm volatile("vse32.v v10, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - asm volatile("vse32.v v12, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - asm volatile("vse32.v v14, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// ============================================================================= -// FP16 Matrix Multiplication Kernels (from spatzBenchmarks/hp-fmatmul) -// ============================================================================= - -// Forward declarations for FP16 matmul -static inline void fmatmul_v16b_2xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v16b_4xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); -static inline void fmatmul_v16b_8xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end); - -// FP16 matrix multiplication wrapper - automatically selects optimal variant -// Computes C = A × B where C is MxP, A is MxN, B is NxP -static inline void fmatmul_v16b(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int M, const unsigned int N, - const unsigned int P) { - if (M <= 4) { - fmatmul_v16b_2xVL(c, a, b, 0, M, N, P, 0, P); - } else if (M <= 8) { - fmatmul_v16b_4xVL(c, a, b, 0, M, N, P, 0, P); - } else { - fmatmul_v16b_8xVL(c, a, b, 0, M, N, P, 0, P); - } -} - -// 2xVL variant - optimized for small matrices (M <= 4) -// NOTE: Uses e32 (FP32 accumulation) for better precision -static inline void fmatmul_v16b_2xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl (using e32 for FP32 accumulation) - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e32, m8, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float16_t *b_ = b + p; - float16_t *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 2) { - const float16_t *a_ = a + m * N; - const float16_t *a__ = a_; - - asm volatile("vle32.v v16, (%0);" ::"r"(b_)); - const float16_t *b__ = b_ + P; - - float16_t *c__ = c_ + m * P; - - float t0, t1; - - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle32.v v24, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle32.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - } - - asm volatile("vfmacc.vf v0, %0, v24" ::"f"(t0)); - asm volatile("vse32.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v24" ::"f"(t1)); - asm volatile("vse32.v v8, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 4xVL variant - optimized for medium matrices (M <= 8) -static inline void fmatmul_v16b_4xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl (using e32 for FP32 accumulation) - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e32, m4, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float16_t *b_ = b + p; - float16_t *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 4) { - const float16_t *a_ = a + m * N; - const float16_t *a__ = a_; - - asm volatile("vle32.v v16, (%0);" ::"r"(b_)); - const float16_t *b__ = b_ + P; - - float16_t *c__ = c_ + m * P; - - float t0, t1, t2, t3; - - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - - unsigned int n = 0; - - while (n < N) { - asm volatile("vle32.v v20, (%0);" ::"r"(b__)); - b__ += P; - - a__ = a_ + ++n; - - if (n == 1) { - asm volatile("vfmul.vf v0, v16, %0" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v4, v16, %0" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v8, v16, %0" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v12, v16, %0" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - } else { - asm volatile("vfmacc.vf v0, %0, v16" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v4, %0, v16" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v16" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v12, %0, v16" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle32.v v16, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse32.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t1)); - asm volatile("vse32.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t2)); - asm volatile("vse32.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t3)); - asm volatile("vse32.v v12, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -// 8xVL variant - optimized for larger matrices (M > 8) -static inline void fmatmul_v16b_8xVL(float16_t *c, const float16_t *a, const float16_t *b, - const unsigned int m_start, const unsigned int m_end, - const unsigned int N, const unsigned int P, - const unsigned int p_start, const unsigned int p_end) { - unsigned int p = p_start; - while (p < p_end) { - // Calculate the vl (using e16 for this variant) - size_t gvl; - asm volatile("vsetvli %[gvl], %[vl], e16, m2, ta, ma" - : [gvl] "=r"(gvl) - : [vl] "r"(p_end - p)); - - const float16_t *b_ = b + p; - float16_t *c_ = c + p; - - for (unsigned int m = m_start; m < m_end; m += 8) { - const float16_t *a_ = a + m * N; - const float16_t *a__ = a_; - - asm volatile("vle16.v v18, (%0);" ::"r"(b_)); - const float16_t *b__ = b_ + P; - - float16_t *c__ = c_ + m * P; - - float t0, t1, t2, t3, t4, t5, t6, t7; - - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); - a__ += N; - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); - - unsigned int n = 0; - - while (n < N) { - a__ = a_ + ++n; - - asm volatile("vle16.v v20, (%0);" ::"r"(b__)); - b__ += P; - - if (n == 1) { - asm volatile("vfmul.vf v0, v18, %0" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v2, v18, %0" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v4, v18, %0" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v6, v18, %0" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v8, v18, %0" ::"f"(t4)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v10, v18, %0" ::"f"(t5)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v12, v18, %0" ::"f"(t6)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmul.vf v14, v18, %0" ::"f"(t7)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); - } else { - asm volatile("vfmacc.vf v0, %0, v18" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v2, %0, v18" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v4, %0, v18" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v6, %0, v18" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v18" ::"f"(t4)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v10, %0, v18" ::"f"(t5)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v12, %0, v18" ::"f"(t6)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v14, %0, v18" ::"f"(t7)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); - } - - a__ = a_ + ++n; - - if (n == N) - break; - - asm volatile("vle16.v v18, (%0);" ::"r"(b__)); - b__ += P; - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t0) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t1) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t2) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t3) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t4) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t5) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t6) : [a] "r"(a__)); - a__ += N; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - asm volatile("flh %[t], 0(%[a])" : [t] "=f"(t7) : [a] "r"(a__)); - } - - asm volatile("vfmacc.vf v0, %0, v20" ::"f"(t0)); - asm volatile("vse16.v v0, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v2, %0, v20" ::"f"(t1)); - asm volatile("vse16.v v2, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v4, %0, v20" ::"f"(t2)); - asm volatile("vse16.v v4, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v6, %0, v20" ::"f"(t3)); - asm volatile("vse16.v v6, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v8, %0, v20" ::"f"(t4)); - asm volatile("vse16.v v8, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v10, %0, v20" ::"f"(t5)); - asm volatile("vse16.v v10, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v12, %0, v20" ::"f"(t6)); - asm volatile("vse16.v v12, (%0);" ::"r"(c__)); - c__ += P; - asm volatile("vfmacc.vf v14, %0, v20" ::"f"(t7)); - asm volatile("vse16.v v14, (%0);" ::"r"(c__)); - } - - p += gvl; - } -} - -#endif // _SPATZ_UTILS_H_ diff --git a/tests/utils/w_input.h b/tests/utils/w_input.h deleted file mode 100644 index bf214e6a..00000000 --- a/tests/utils/w_input.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2025 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// Authors: Yvan Tortorella -// - -/* Header file generated by RedMulE Golden Model */ -uint16_t w_inp [4096] = { -0x3bbf, 0x3a4f, 0x38c4, 0x327f, 0x39bf, 0x3b69, 0x39a3, 0x2e11, 0x38e6, 0x3c00, 0x3ae7, 0x1823, 0x3bfe, 0x3a16, 0x3b13, 0x3208, 0x3355, 0x38fb, 0x39f1, 0x3644, 0x38ea, 0x3ba0, 0x32f9, 0x2c66, 0x2fa4, 0x162a, 0x30f9, 0x284c, 0x38ba, 0x3922, 0x36ba, 0x3299, 0x3729, 0x3a1d, 0x3593, 0x3526, 0x3974, 0x3ae1, 0x3901, 0x3bdf, 0x35eb, 0x3986, 0x39a7, 0x23a9, 0x38ac, 0x3013, 0x2e9f, 0x37e7, 0x3879, 0x3507, 0x3b76, 0x2fa5, 0x3b21, 0x3b63, 0x3af5, 0x39de, 0x31cb, 0x3757, 0x3409, 0x3b56, 0x396c, 0x30ea, 0x2837, 0x39a6, -0x30bd, 0x3bb3, 0x3ad3, 0x3b51, 0x36bf, 0x34f2, 0x32cf, 0x39a2, 0x3a21, 0x38d6, 0x246c, 0x3553, 0x2a8d, 0x39f9, 0x31a6, 0x3bff, 0x3570, 0x3630, 0x39a3, 0x266e, 0x3a7e, 0x300e, 0x2ee0, 0x333d, 0x3753, 0x3a04, 0x3a4e, 0x38ed, 0x397a, 0x3b7a, 0x3a68, 0x36b5, 0x2e7c, 0x3b1b, 0x393d, 0x3802, 0x3820, 0x2585, 0x328c, 0x3a63, 0x38e6, 0x3b34, 0x3396, 0x3714, 0x324b, 0x35e4, 0x367c, 0x39a7, 0x36ef, 0x3b36, 0x39e2, 0x3871, 0x3bb2, 0x3901, 0x37af, 0x3b38, 0x352a, 0x39c0, 0x3446, 0x313d, 0x34ad, 0x37a4, 0x386d, 0x3433, -0x3aa4, 0x396e, 0x3902, 0x380b, 0x3197, 0x3238, 0x3552, 0x3885, 0x3b50, 0x39a3, 0x3b07, 0x2d7f, 0x3631, 0x3a74, 0x389d, 0x31d4, 0x3b0e, 0x301e, 0x38a7, 0x3c00, 0x86e, 0x357e, 0x33e0, 0x3519, 0x39ad, 0x3b27, 0x3841, 0x3ba6, 0x39fc, 0x3903, 0x3850, 0x398a, 0x39dd, 0x3837, 0x35f1, 0x34b0, 0x33d4, 0x3bde, 0x3013, 0x2f51, 0x3b18, 0x37ed, 0x3517, 0x3b3e, 0x3a88, 0x3a1a, 0x3203, 0x370b, 0x3994, 0x3a22, 0x29e5, 0x38af, 0x354b, 0x2862, 0x3204, 0x3483, 0x3b73, 0x3732, 0x3a46, 0x3455, 0x36c9, 0x3450, 0x35c2, 0x3582, -0x3862, 0x3b2e, 0x3422, 0x38a7, 0x3275, 0x351c, 0x35f2, 0x39d6, 0x3453, 0x381c, 0x3a47, 0x3acd, 0x38bf, 0x3a66, 0x33b9, 0x31e4, 0x350d, 0x3be2, 0x38b9, 0x37ac, 0x24dc, 0x2ec2, 0x3239, 0x3546, 0x3b1f, 0x3404, 0x3a82, 0x377c, 0x34d0, 0x34a4, 0x3b4e, 0x398d, 0x3992, 0x32f9, 0x3957, 0x3810, 0x3bc4, 0x38bd, 0x3b31, 0x2d86, 0x3519, 0x3a4f, 0x398a, 0x39cf, 0x3b0d, 0x326a, 0x367f, 0x3a57, 0x39b7, 0x3b13, 0x37b7, 0x38e9, 0x3774, 0x2cf1, 0x36cf, 0x3a0d, 0x38ba, 0x2b93, 0x37d2, 0x2c24, 0x35cf, 0x377c, 0x32c3, 0x3a7c, -0x3b6f, 0x353a, 0x3046, 0x3601, 0x3597, 0x2b40, 0x3893, 0x3be2, 0x298d, 0x2e2c, 0x3907, 0x2a90, 0x3498, 0x3bed, 0x3469, 0x3080, 0x30ae, 0x35d8, 0x3814, 0x3529, 0x3912, 0x3a96, 0x33b6, 0x3405, 0x38d4, 0x3936, 0x31ba, 0x348e, 0x2c03, 0x34f7, 0x3995, 0x396f, 0x31d7, 0x396d, 0x2c71, 0x39aa, 0x32ef, 0x397e, 0x1592, 0x3830, 0x3ad8, 0x3872, 0x35d2, 0x3b2c, 0x309b, 0x35c0, 0x35d6, 0x35e1, 0x3bbe, 0x375d, 0x3974, 0x3a7e, 0x3ab8, 0x3534, 0x3966, 0x37d2, 0x3515, 0x25c9, 0x35c6, 0x3788, 0x3734, 0x3aa6, 0x33d7, 0x395e, -0x35bc, 0x3b47, 0x39f3, 0x3a5b, 0x38e0, 0x3161, 0x2913, 0x39eb, 0x398e, 0x32cf, 0x3800, 0x35b4, 0x3a4f, 0x3aa5, 0x3a05, 0x3404, 0x3a87, 0x3ba6, 0x3afa, 0x35ac, 0x3bad, 0x3906, 0x332e, 0x3a85, 0x3b6a, 0x30fc, 0x300c, 0x3861, 0x36f6, 0x3acd, 0x34ff, 0x3882, 0x362d, 0x39fc, 0x3b5d, 0x283f, 0x3af2, 0x3bfe, 0x381e, 0x3b54, 0x395b, 0x35fc, 0x3a7c, 0x3a03, 0x372f, 0x342d, 0x3846, 0x3922, 0x39b9, 0x3523, 0x3998, 0x3568, 0x3662, 0x2c52, 0x3982, 0x2e41, 0x37d6, 0x38cd, 0x3b9e, 0x37cc, 0x2e33, 0x2f92, 0x3a44, 0x3b79, -0x3b2e, 0x39c9, 0x3683, 0x300a, 0x3a4b, 0x25da, 0x3351, 0x3920, 0x34b3, 0x3314, 0x3905, 0x1ed4, 0x39bc, 0x3b3e, 0x3950, 0x359e, 0x36da, 0x35a7, 0x39da, 0x389d, 0x3976, 0x3860, 0x369f, 0x3a0f, 0x3620, 0x33c8, 0x3a2a, 0x3776, 0x344a, 0x3a2e, 0x325e, 0x3852, 0x2e84, 0x31eb, 0x3474, 0x393b, 0x3225, 0x2d3a, 0x3870, 0x2229, 0x3469, 0x33fa, 0x31bd, 0x3055, 0x3a42, 0x381a, 0x3ab9, 0x39d2, 0x384a, 0x35f4, 0x32fe, 0x305e, 0x317e, 0x3484, 0x308b, 0x3893, 0x39e1, 0x3a15, 0x38a6, 0x3321, 0x376a, 0x39c9, 0x317f, 0x37a6, -0x30e6, 0x3362, 0x37ac, 0x389b, 0x3818, 0x3883, 0x354b, 0x3b88, 0x39d8, 0x3a60, 0x375b, 0x3836, 0x38cc, 0x37fb, 0x3927, 0x3b78, 0x3961, 0x39b7, 0x302d, 0x3ad0, 0x396d, 0x3840, 0x39a5, 0x3965, 0x39a0, 0x38a2, 0x3405, 0x3b69, 0x3215, 0x3455, 0x3ba7, 0x38a9, 0x3b13, 0x37d6, 0x352c, 0x39bb, 0x2998, 0x299f, 0x33fe, 0x3954, 0x3b3c, 0x3bff, 0x3b50, 0x35e9, 0x2f7c, 0x2af3, 0x3bb8, 0x39ca, 0x3ad6, 0x38f6, 0x3a08, 0x34e1, 0x3966, 0x29cc, 0x3ac7, 0x33d2, 0x39b2, 0x3631, 0x3b4f, 0x2879, 0x347c, 0x28cf, 0x3258, 0x38e1, -0x3ae6, 0x3801, 0x31c4, 0x331f, 0x391f, 0x39b5, 0x2558, 0x368f, 0x3abe, 0x3a5d, 0x2180, 0x292d, 0x3612, 0x3b04, 0x35bd, 0x35a6, 0x388e, 0x3a23, 0x392d, 0x2660, 0x3b09, 0x33d0, 0x2ff0, 0x3220, 0x3619, 0x3671, 0x394a, 0x363f, 0x34a9, 0x2e8e, 0x3bfd, 0x3934, 0x3b61, 0x39c4, 0x38a2, 0x3a1b, 0x3a18, 0x3123, 0x2762, 0x3a95, 0x350b, 0x3a9b, 0x3058, 0x3ade, 0x34e7, 0x372e, 0x3aec, 0x32b0, 0x3baa, 0x3444, 0x3aee, 0x2d22, 0x33b7, 0x3223, 0x3980, 0x3a34, 0x365d, 0x3a11, 0x2d80, 0x39d0, 0x28d2, 0x3afb, 0x394b, 0x38e7, -0x3646, 0x3a7f, 0x364a, 0x355f, 0x3861, 0x3836, 0x38ab, 0x30d1, 0x34df, 0x3998, 0x383c, 0x39e0, 0x328f, 0x2d1e, 0x3757, 0x352a, 0x36d0, 0x3a49, 0x372a, 0x3953, 0x39d1, 0x3b88, 0x3695, 0x30e5, 0x3ac7, 0x399c, 0x35f4, 0x3324, 0x3822, 0x3941, 0x3405, 0x3354, 0x38d1, 0x3b13, 0x22a8, 0x38e6, 0x393b, 0x3bc4, 0x3b25, 0x2d11, 0x39a8, 0x3b80, 0x3894, 0x3541, 0x3a68, 0x338d, 0x3b57, 0x2794, 0x352b, 0x39b7, 0x3a96, 0x380e, 0x3b86, 0x3826, 0x2ab0, 0x3a1d, 0x3abc, 0x3494, 0x3a05, 0x2e39, 0x344e, 0x24a9, 0x3812, 0x354d, -0x3320, 0x3142, 0x35f7, 0x3aba, 0x2cd3, 0x3515, 0x3368, 0x1c0c, 0x316e, 0x382e, 0x3aca, 0x374a, 0x3715, 0x395e, 0x37fe, 0x2e7d, 0x3701, 0x3841, 0x3957, 0x394c, 0x3921, 0x2d98, 0x3265, 0x387d, 0x3b98, 0x3888, 0x396a, 0x3be0, 0x389f, 0x3932, 0x2eec, 0x2b3c, 0x36e4, 0x3831, 0x389f, 0x3834, 0x378d, 0x38d7, 0x3451, 0x3961, 0x3083, 0x34e2, 0x32b0, 0x39e8, 0x389a, 0x3770, 0x38ad, 0x3b42, 0x2f15, 0x37ac, 0x3ac8, 0x362f, 0x3be5, 0x3807, 0x343b, 0x3807, 0x3017, 0x39c6, 0x37cd, 0x1b72, 0x3761, 0x39dd, 0x2bb9, 0x28d7, -0x3353, 0x3aeb, 0x33d6, 0x3816, 0x34b6, 0x38dd, 0x3372, 0x37c4, 0x3953, 0x3b90, 0x38e6, 0x38d3, 0x374a, 0x2dd9, 0x390d, 0x3524, 0x380f, 0x31eb, 0x37ba, 0x3414, 0x3050, 0x3a8d, 0x31f2, 0x3797, 0x399a, 0x3bf8, 0x3827, 0x343a, 0x38b2, 0x32c4, 0x3693, 0x3ad0, 0x36c1, 0x331d, 0x37d9, 0x2870, 0x3666, 0x3941, 0x39bb, 0x2f03, 0x33b2, 0x3a54, 0x3a09, 0x392f, 0x3bcc, 0x3604, 0x3bab, 0x39d3, 0x3a67, 0x3ac0, 0x3a36, 0x3b5e, 0x3811, 0x3bb2, 0x3b32, 0x37f5, 0x3948, 0x3bae, 0x34e2, 0x35cc, 0x3b0d, 0x30b7, 0x30a0, 0x3ace, -0x38e6, 0x3a9d, 0x393c, 0x3412, 0x30ae, 0x3244, 0x3620, 0x39c7, 0x3a3f, 0x3624, 0x3749, 0x3691, 0x3921, 0x31a4, 0x2ee8, 0x3872, 0x3030, 0x3259, 0x34d0, 0x301b, 0x360c, 0x3979, 0x2845, 0x3a38, 0x3851, 0x3a05, 0x3467, 0x381b, 0x3b1f, 0x3a2d, 0x30f8, 0x399a, 0x3805, 0x3110, 0x3bd6, 0x35b5, 0x3091, 0x2fcd, 0x3049, 0x3bee, 0x385a, 0x3478, 0x31a9, 0x3be4, 0x3a1d, 0x2559, 0x39c5, 0x321e, 0x33b9, 0x3b75, 0x37af, 0x39aa, 0x3948, 0x3726, 0x3aef, 0x301d, 0x36c2, 0x3a01, 0x2dfa, 0x311e, 0x3b8d, 0x31f7, 0x30d5, 0x3a6b, -0x381c, 0x362b, 0x29c9, 0x34ac, 0x3993, 0x3828, 0x3b4d, 0x3aa3, 0x3847, 0x34c8, 0x2b11, 0x3a5c, 0x2ebd, 0x2c9a, 0x395a, 0x366d, 0x398b, 0x255e, 0x3b7e, 0x2d74, 0x356d, 0x33e3, 0x39ad, 0x2886, 0x39c7, 0x3996, 0x3bbd, 0x383c, 0x3b71, 0x3935, 0x3a02, 0x351a, 0x3686, 0x31b1, 0x3a6c, 0x3afb, 0x3716, 0x3469, 0x351e, 0x3858, 0x377e, 0x2edb, 0x3baf, 0x30d7, 0x3a60, 0x3906, 0x3baf, 0x3814, 0x32e6, 0x3bad, 0x34f9, 0x34ac, 0x37f6, 0x3ab7, 0x3035, 0x3701, 0x35a6, 0x3aad, 0x3772, 0x3893, 0x3805, 0x1186, 0x3716, 0x387c, -0x3b15, 0x38da, 0xca2, 0x3a5f, 0x2bcf, 0x2e9c, 0x3a15, 0x31d7, 0x331f, 0x3b99, 0x310a, 0x3538, 0x3b1b, 0x3616, 0x326f, 0x2f28, 0x3bfc, 0x28a6, 0x3a09, 0x3489, 0x3769, 0x39c5, 0x3aa8, 0x3bce, 0x386c, 0x39ac, 0x39a0, 0x390b, 0x3470, 0x388f, 0x3938, 0x3819, 0x354b, 0x3b99, 0x3978, 0x31fa, 0x357b, 0x3833, 0x38fa, 0x34ee, 0x3bdb, 0x392c, 0x354e, 0x3b84, 0x3abe, 0x394b, 0x39ec, 0x3855, 0x39df, 0x39ad, 0x3ac8, 0x3871, 0x2d02, 0x39a3, 0x3b0b, 0x3ab5, 0x34ca, 0x3afa, 0x3ade, 0x38df, 0x35f1, 0x3b1d, 0x28c5, 0x3b21, -0x38db, 0x3450, 0x3b0b, 0x3b29, 0x38c1, 0x36e7, 0x3692, 0x31ee, 0x3b85, 0x3828, 0x38a7, 0x3972, 0x2a44, 0x2ddd, 0x3ac7, 0x2de7, 0x3bba, 0x21c9, 0x3acb, 0x2e8c, 0x25f3, 0x3aa6, 0x3941, 0x32c5, 0x3022, 0x397f, 0x3339, 0x2052, 0x2ecc, 0x37a5, 0x3ada, 0x3ac7, 0x326e, 0x38b1, 0x30f2, 0x322a, 0x373e, 0x3a1b, 0x39a0, 0x3708, 0x38ab, 0x37f8, 0x30ac, 0x36e8, 0x3279, 0x354c, 0x38f9, 0x34ee, 0x33b2, 0x3be9, 0x385c, 0x3b21, 0x3ba7, 0x39b1, 0x37da, 0x3036, 0x3a3f, 0x37c8, 0x3aed, 0x3578, 0x3789, 0x31ac, 0x39d9, 0x3b22, -0x3b0d, 0x3a68, 0x35bb, 0x3a72, 0x386b, 0x3541, 0x309c, 0x3ab8, 0x392c, 0x3bec, 0x390d, 0x364b, 0x3780, 0x34fa, 0x3537, 0x2117, 0x39ba, 0x3ae4, 0x37ce, 0x3ab4, 0x3774, 0x29d7, 0x2e7d, 0x3853, 0x3bd0, 0x38a6, 0x39dc, 0x29ac, 0x37bd, 0x3986, 0x35f8, 0x3b9d, 0x39b3, 0x363a, 0x399a, 0x3190, 0x3a04, 0x3b4f, 0x2c5f, 0x3081, 0x376c, 0x2f04, 0x2228, 0x3a8e, 0x3900, 0x3936, 0x309f, 0x396b, 0x393e, 0x39b0, 0x35f6, 0x336b, 0x39b5, 0x3843, 0x3203, 0x2ffe, 0x3be9, 0x3560, 0x3b30, 0x3740, 0x3739, 0x2a85, 0x333a, 0x37d6, -0x385a, 0x38eb, 0x32f6, 0x36b6, 0x37b5, 0x37cf, 0x3a93, 0x35ac, 0x3bb9, 0x3bfb, 0x32b1, 0x3767, 0x3362, 0x3af0, 0x26b2, 0x38b5, 0x39e7, 0x37b9, 0x2ccf, 0x38dd, 0x3424, 0x38b2, 0x3aa1, 0x393a, 0x3bf1, 0x37ea, 0x1aea, 0x3a53, 0x3a73, 0x3a1f, 0x3934, 0x3be6, 0x366b, 0x369b, 0x267a, 0x35d2, 0x3aca, 0x38ad, 0x257d, 0x343e, 0x3118, 0x3727, 0x3a70, 0x3838, 0x3462, 0x3142, 0x3a12, 0x3567, 0x3921, 0x362b, 0x3a1c, 0x383c, 0x385f, 0x399c, 0x2d9f, 0x3b21, 0x2be6, 0x3905, 0x2bbe, 0x34fa, 0x3798, 0x3bd3, 0x3942, 0x3aef, -0x39f7, 0x392b, 0x2bab, 0x2df9, 0x2cdc, 0x38ec, 0x35e3, 0x3270, 0x30c7, 0x380b, 0x2f85, 0x2ce0, 0x3b0b, 0x38ee, 0x3a30, 0x3904, 0x3a66, 0x3ae5, 0x380e, 0x38fd, 0x3aed, 0x3b68, 0x3a1e, 0x39b2, 0x38b0, 0x268a, 0x3964, 0x32b1, 0x32fc, 0x2c3b, 0x3568, 0x2a08, 0x2e62, 0x354a, 0x338f, 0x3b83, 0x380b, 0x323d, 0x38d1, 0x34c3, 0x3484, 0x3bd6, 0x30f6, 0x36e0, 0x396a, 0x35fa, 0x39c0, 0x3624, 0x3a16, 0x3918, 0x2f14, 0x31ed, 0x3bb8, 0x38a6, 0x3af8, 0x35f0, 0x3985, 0x3454, 0x3b4d, 0x39c0, 0x3821, 0x36e2, 0x2549, 0x36aa, -0x3816, 0x3a0a, 0x3750, 0x3b7a, 0x3898, 0x3ac6, 0x363e, 0x330d, 0x34b4, 0x3a2d, 0x3502, 0x355b, 0x3ba5, 0x3a84, 0x38d4, 0x37c3, 0x31bc, 0x391e, 0x3512, 0x36a9, 0x3241, 0x3ada, 0x3108, 0x349b, 0x3027, 0x3750, 0x3839, 0x3abf, 0x396f, 0x35af, 0x3680, 0x38f6, 0x38d4, 0x3351, 0x3056, 0x3260, 0x2f02, 0x38f9, 0x35f0, 0x32ab, 0x3923, 0x3898, 0x3af0, 0x303f, 0x3934, 0x3a58, 0x3ab1, 0x3abd, 0x31c1, 0x34ac, 0x3921, 0x3075, 0x269b, 0x2961, 0x3569, 0x37d3, 0x35a2, 0x3b52, 0x39e5, 0x3817, 0x3866, 0x3744, 0x3665, 0x3be9, -0x33c6, 0x3010, 0x2d3f, 0x39f3, 0x2ed1, 0x35d9, 0x2d6f, 0x35be, 0x39ad, 0x2b83, 0x3adf, 0x3a32, 0x3bcd, 0x3456, 0x375f, 0x37a3, 0x3098, 0x3bbe, 0x36b7, 0x2df1, 0x3931, 0x3142, 0x30d3, 0x2a49, 0x2d72, 0x262d, 0x39bc, 0x3bfa, 0x3abc, 0x3ac0, 0x3531, 0x3800, 0x36d4, 0x379c, 0x3aba, 0x3053, 0x350e, 0x3989, 0x3003, 0x3a51, 0x37cc, 0x34fd, 0x333a, 0x33f1, 0x3a0a, 0x345d, 0x38e0, 0x28e4, 0x3a64, 0x317f, 0x2cad, 0x395a, 0x343c, 0x3ba7, 0x39ea, 0x3b5b, 0x34ff, 0x3955, 0x39d1, 0x360a, 0x2f25, 0x3a4d, 0x3889, 0x2eb6, -0x3021, 0x396d, 0x379f, 0x3495, 0x38d5, 0x3963, 0x33ae, 0x3bfd, 0x211f, 0x3aed, 0x2fd8, 0x3b2d, 0x33eb, 0x2c29, 0x3954, 0x3219, 0x3958, 0x3b2f, 0x3578, 0x315d, 0x387a, 0x2561, 0x3ba4, 0x39cb, 0x341e, 0x375f, 0x39ad, 0x3700, 0x3ab9, 0x34c1, 0x3051, 0x3b77, 0x3705, 0x3ae6, 0x3b58, 0x37d5, 0x3a6c, 0x3476, 0x3589, 0x2818, 0x35c5, 0x3876, 0x3871, 0x35a8, 0x30c9, 0x357e, 0x38c9, 0x38a1, 0x35cf, 0x36db, 0x3401, 0x34a6, 0x3826, 0x37fe, 0x3beb, 0x38ed, 0x322c, 0x352a, 0x38e1, 0x3bf1, 0x32fa, 0x3bd5, 0x3310, 0x361e, -0x3af0, 0x323b, 0x3565, 0x23c8, 0x3b28, 0x3853, 0x2aab, 0x39d9, 0x3bbf, 0x3b2d, 0x35ce, 0x3a4a, 0x3992, 0x35ac, 0x1723, 0x38fa, 0x38d7, 0x354c, 0x3b0b, 0x3888, 0x3a98, 0x38f6, 0x391d, 0x381b, 0x38cf, 0x3a60, 0x2a34, 0x3a09, 0x2257, 0x3a63, 0x3ab7, 0x3494, 0x2955, 0x3978, 0x3ba2, 0x2804, 0x384e, 0x383d, 0x3be4, 0x391e, 0x3851, 0x3908, 0x2084, 0x35a8, 0x2f69, 0x3adc, 0x3a16, 0x3990, 0x3479, 0x3551, 0x389b, 0x3bd6, 0x3128, 0x3835, 0x3541, 0x306f, 0x380e, 0x341d, 0x3a6e, 0x3a12, 0x3a77, 0x3464, 0x3aa9, 0x3693, -0x34ae, 0x35c2, 0x3346, 0x3ad0, 0x3857, 0x2ad5, 0x3ba7, 0x3327, 0x3ae6, 0x32df, 0x3be9, 0x3544, 0x3060, 0x39c0, 0x2daa, 0x376d, 0x3a90, 0x3b29, 0x380e, 0x33a6, 0x347f, 0x3b7c, 0x3b9d, 0x31e3, 0x393e, 0x3a56, 0x3bcb, 0x38f9, 0x3656, 0x3011, 0x3be5, 0x32c5, 0x3807, 0x39a7, 0x35e6, 0x3a3a, 0x33cf, 0x37c8, 0x3af2, 0x3a42, 0x3119, 0x3534, 0x3b1d, 0x29dd, 0x3ab6, 0x38c3, 0x35d0, 0x3189, 0x3635, 0x38d2, 0x2fb9, 0x3944, 0x3918, 0x333e, 0x3ab8, 0x31ba, 0x3a3f, 0x3b87, 0x3508, 0x2f76, 0x3670, 0x3043, 0x3aa9, 0x360d, -0x3807, 0x3a78, 0x3909, 0x39a1, 0x32f5, 0x3667, 0x3125, 0x386c, 0x3702, 0x3a83, 0x397e, 0x2d4a, 0x399a, 0x3b13, 0x351e, 0x39e5, 0x39bb, 0x374f, 0x2c0a, 0x3ade, 0x31d8, 0x3b82, 0x3a5d, 0x3598, 0x391f, 0x3a76, 0x3641, 0x2fe2, 0x38bd, 0x3abb, 0x3988, 0x36b2, 0x3b1e, 0x37d5, 0x3509, 0x38e0, 0x2e2c, 0x34fd, 0x3053, 0x32da, 0x3988, 0x3a32, 0x3a4c, 0x356d, 0x3716, 0x3449, 0x2bd1, 0x34d8, 0x3600, 0x385a, 0x39cf, 0x3850, 0x2d4c, 0x3ba5, 0x39ba, 0x393a, 0x3be8, 0x3823, 0x37b0, 0x3b15, 0x3bbe, 0x3869, 0x301a, 0x337b, -0x3be3, 0x2e58, 0x39fb, 0x31fb, 0x385e, 0x3863, 0x36ca, 0x31e9, 0x32da, 0x377b, 0x375b, 0x3ac7, 0x3b05, 0x36f6, 0x3aa6, 0x3182, 0x38f8, 0x396c, 0x34d8, 0x383c, 0x3602, 0x3744, 0x3b2b, 0x381e, 0x320b, 0x3674, 0x39b1, 0x32ea, 0x37a9, 0x3800, 0x3a3a, 0x3876, 0x32a5, 0x3b99, 0x305d, 0x26ce, 0x38ae, 0x3a69, 0x362a, 0x2cb4, 0x31da, 0x3bb7, 0x2e60, 0x3539, 0x397c, 0x398f, 0x3972, 0x33a9, 0x38d9, 0x3733, 0x3991, 0x367d, 0x3af9, 0x380f, 0x3b6d, 0x2c45, 0x35cb, 0x31ab, 0x3349, 0x2f9b, 0x3a48, 0x3a3b, 0x3b5e, 0x2ee0, -0x3061, 0x3010, 0x39a0, 0x3861, 0x38d2, 0x3b18, 0x328f, 0x39ac, 0x370f, 0x3485, 0x3acf, 0x39d7, 0x3703, 0x39dc, 0x2995, 0x2ff2, 0x29f2, 0x3914, 0x3796, 0x37a8, 0x36e7, 0x3964, 0x3797, 0x3801, 0x387a, 0x3942, 0x383e, 0x3603, 0x337f, 0x30f3, 0x34b5, 0x39e4, 0x39dd, 0x3432, 0x36db, 0x38ae, 0x3533, 0x39c0, 0x38f5, 0x3af3, 0x304f, 0x3ba0, 0x3a69, 0x39a1, 0x35bd, 0x3414, 0x3917, 0x36c4, 0x3a75, 0x3a43, 0x38c3, 0x383e, 0x2e3b, 0x2629, 0x2de1, 0x399b, 0x3153, 0x3525, 0x32a6, 0x3559, 0x3a09, 0x39cf, 0x368f, 0x316b, -0x399a, 0x3aff, 0x3141, 0x2682, 0x2f25, 0x3922, 0x34fc, 0x361a, 0x311e, 0x39ea, 0x2d24, 0x398e, 0x3968, 0x3bb0, 0x3b97, 0x2894, 0x32e8, 0x2fda, 0x32a1, 0x3a45, 0x39c5, 0x38ce, 0x3bb2, 0x3945, 0x3911, 0x2c10, 0x3bbd, 0x3bb2, 0x3675, 0x3395, 0x38ab, 0x2c1e, 0x35be, 0x35c7, 0x37b8, 0x25fc, 0x3b68, 0x307f, 0x3429, 0x3b54, 0x3395, 0x3bdf, 0x373d, 0x3780, 0x323b, 0x3a5c, 0x394d, 0x39c2, 0x3b10, 0x3811, 0x3785, 0x3ab3, 0x3bf2, 0x38fc, 0x37cd, 0x3603, 0x3633, 0x3ac0, 0x1816, 0x33b4, 0x3244, 0x31e0, 0x3ac1, 0x39c7, -0x393f, 0x38f7, 0x32a8, 0x39dd, 0x39f6, 0x3a08, 0x3683, 0x3946, 0x3b26, 0x2dbd, 0x3849, 0x3623, 0x3722, 0x396d, 0x3885, 0x38b4, 0x3965, 0x3352, 0x39b5, 0x3896, 0x2fde, 0x30f3, 0x392d, 0x3105, 0x3a16, 0x3967, 0x375f, 0x3866, 0x2c5a, 0x3987, 0x2f60, 0x39f0, 0x33ef, 0x38e9, 0x390d, 0x3a72, 0x373e, 0x3825, 0x3711, 0x2baa, 0x3a4f, 0x3856, 0x3404, 0x3656, 0x2eca, 0x2b84, 0x3607, 0x3a23, 0x3ab3, 0x3758, 0x2eba, 0x3bd7, 0x3a17, 0x3b20, 0x34d5, 0x39cd, 0x34e9, 0x2e07, 0x3866, 0x34f0, 0x2fde, 0x31c1, 0x376e, 0x3a9f, -0x35dd, 0x34cf, 0x366d, 0x3a74, 0x39a9, 0x3910, 0x323f, 0x2c98, 0x363f, 0x2805, 0x31b2, 0x39d2, 0x3ba0, 0x3494, 0x3bd7, 0x3a5c, 0x3465, 0x30de, 0x287c, 0x36cc, 0x378f, 0x2b94, 0x3bcd, 0x349d, 0x38fb, 0x37ba, 0x3bb3, 0x388e, 0x2834, 0x33b4, 0x3b67, 0x38d7, 0x3910, 0x3a92, 0x329b, 0x2e40, 0x36ba, 0x3813, 0x32c6, 0x3460, 0x3737, 0x3a3c, 0x2aa0, 0x3124, 0x3582, 0x3962, 0x39d7, 0x31bc, 0x38ac, 0x3281, 0x3103, 0x36ed, 0x3a20, 0x39a8, 0x38dd, 0x3917, 0x3b18, 0x3311, 0x2ca3, 0x39f3, 0x3bc4, 0x319b, 0x2b75, 0x3571, -0x34f0, 0x348d, 0x27a2, 0x38a8, 0x347e, 0x3b66, 0x2ffb, 0x35fe, 0x34d1, 0x3ad6, 0x2d9d, 0x3a66, 0x3226, 0x3a3f, 0x378c, 0x3be5, 0x3342, 0x3aa0, 0x3ad5, 0x3773, 0x2ec6, 0x3888, 0x35ad, 0x3b7f, 0x3b4f, 0x354e, 0x384d, 0x34b5, 0x37f4, 0x32a3, 0x3976, 0x2085, 0x3b1b, 0x291e, 0x3537, 0x2ccc, 0x2e4c, 0x3a5a, 0x3572, 0x3860, 0x2d4e, 0x37c4, 0x270c, 0x3ab4, 0x384d, 0x3740, 0x3a53, 0x3a5a, 0x39c2, 0x3abe, 0x393b, 0x3612, 0x3879, 0x3793, 0x3096, 0x388e, 0x3930, 0x3729, 0x353c, 0x39aa, 0x38e4, 0x383a, 0x3028, 0x3578, -0x2e4e, 0x2e63, 0x38a0, 0x3b2b, 0x3b90, 0x3a0f, 0x2d9c, 0x35bc, 0x3b96, 0x35d0, 0x3bf2, 0x3bde, 0x28f8, 0x3943, 0x39aa, 0x39c2, 0x38f4, 0x3571, 0x157d, 0x3b17, 0x304c, 0x363d, 0x2c68, 0x3ba0, 0x3b0e, 0x3513, 0x3669, 0x300c, 0x3852, 0x39f2, 0x3474, 0x3a66, 0x2c9f, 0x2dc2, 0x3b0a, 0x39d1, 0x3942, 0x2422, 0x3ad6, 0x34ec, 0x3b73, 0x3abd, 0x2e73, 0x3581, 0x34b0, 0x25a8, 0x37b9, 0x3924, 0x2f7b, 0x3a6d, 0x3b6b, 0x3378, 0x3bb2, 0x3ace, 0x38a2, 0x349a, 0x3b68, 0x3647, 0x3847, 0x3bd1, 0x3be4, 0x39be, 0x3ac5, 0x397f, -0x22c0, 0x3692, 0x3ba8, 0x384c, 0x3bcb, 0x36d9, 0x3783, 0x3bf4, 0x3852, 0x3b7b, 0x325d, 0x37db, 0x35ed, 0x36f2, 0x371b, 0x3605, 0x3645, 0x228f, 0x358a, 0x34f0, 0x38d9, 0x35ee, 0x3620, 0x3b4a, 0x3a86, 0x3927, 0x3799, 0x3297, 0x3474, 0x34c1, 0x3af8, 0x2dec, 0x2dc6, 0x36f3, 0x30bb, 0x31c4, 0x36d7, 0x37cc, 0x349d, 0x27d7, 0x3a7f, 0x3481, 0x3791, 0x3b71, 0x371b, 0x3838, 0x34c9, 0x2668, 0x310e, 0x3333, 0x39ee, 0x37b4, 0x2bc6, 0x1a59, 0x3afd, 0x39dc, 0x38b1, 0x394a, 0x3697, 0x3103, 0x366c, 0x397a, 0x31b0, 0x32db, -0x3050, 0x3899, 0x36d5, 0x3bfd, 0x3a67, 0x38b6, 0x39c1, 0x322b, 0x2d8a, 0x38f3, 0x397a, 0x3b71, 0x28af, 0x3a4e, 0x3b7d, 0x388d, 0x3aeb, 0x3bf1, 0x3bc9, 0x242f, 0x3681, 0x2f1f, 0x3bd6, 0x391e, 0x31d1, 0x3be6, 0x39fe, 0x3acb, 0x3871, 0x38ae, 0x30ca, 0x3916, 0x36ce, 0x3313, 0x3a4d, 0x3869, 0x35b6, 0x3a6d, 0x376d, 0x3922, 0x27d8, 0x39a6, 0x3a3c, 0x2e99, 0x2fdd, 0x3b05, 0x3b6a, 0x3520, 0x3714, 0x3922, 0x38c4, 0x3b47, 0x3546, 0x2ba3, 0x37c2, 0x381d, 0x3af2, 0x3b8c, 0x289e, 0x3a3a, 0x3ae3, 0x3829, 0x399f, 0x351f, -0x3bff, 0x37da, 0x3b94, 0x3874, 0x3bf8, 0x3943, 0x324d, 0x34bb, 0x3925, 0x38c0, 0x2e81, 0x32d8, 0x3bea, 0x3bcc, 0x387b, 0x3537, 0x3344, 0x3bef, 0x3345, 0x3a47, 0x330c, 0x367c, 0x3792, 0x36f5, 0x384b, 0x3b2e, 0x3998, 0x38dd, 0x25c0, 0x3a12, 0x390d, 0x2ffd, 0x372f, 0x30ea, 0x2ee4, 0x3a81, 0x3ba2, 0x377c, 0x3446, 0x3a57, 0x38cb, 0x3994, 0x360e, 0x3b8c, 0x2f0c, 0x139c, 0x2cce, 0x37af, 0x253d, 0x3287, 0x3b58, 0x3177, 0x3b3e, 0x3426, 0x32b0, 0x3349, 0x3b02, 0x38f3, 0x3a06, 0x3b05, 0x3490, 0x3bcb, 0x3ba6, 0x248a, -0x32e8, 0x3be2, 0x2d59, 0x3909, 0x365f, 0x395a, 0x3025, 0x3862, 0x28c9, 0x3bdf, 0x3360, 0x3bfe, 0x2a94, 0x394b, 0x337f, 0x2d8e, 0x3ad1, 0x38e1, 0x3bf1, 0x38b5, 0x3681, 0x3984, 0x347a, 0x2bbf, 0x38dc, 0x393d, 0x3552, 0x315e, 0x3309, 0x36b5, 0x39d3, 0x361f, 0x387f, 0x3828, 0x344e, 0x3a55, 0x36d3, 0x187a, 0x22ef, 0x3032, 0x373f, 0x360d, 0x396c, 0x37bf, 0x3472, 0x3220, 0x3bd3, 0x2c5b, 0x384b, 0x328e, 0x396e, 0x369c, 0x3798, 0x2e60, 0x3a58, 0x3a47, 0x3a0c, 0x3bb1, 0x32c2, 0x3a49, 0x3523, 0x37aa, 0x2e18, 0x376d, -0x37d8, 0x344e, 0x2328, 0x31d9, 0x3493, 0x32a2, 0x2f0a, 0x3b5a, 0x2fec, 0x30dc, 0x3ad0, 0x3b82, 0x37b9, 0x3695, 0x3892, 0x390a, 0x3a1f, 0x35c7, 0x39c5, 0x31f9, 0x3994, 0x3165, 0x357d, 0x3a36, 0x2fcd, 0x39c4, 0x398f, 0x3950, 0x36d1, 0x39d0, 0x37c1, 0x3bd4, 0x3ad8, 0x396c, 0x3899, 0x3ba0, 0x356d, 0x3232, 0x3001, 0x396a, 0x28e8, 0x3a21, 0x1670, 0x3bcd, 0x3814, 0x3bf2, 0x3b85, 0x38e7, 0x35ae, 0x2d51, 0x3751, 0x33ec, 0x37b2, 0x392e, 0x3a51, 0x3654, 0x3b55, 0x2ec9, 0x38dc, 0x3a39, 0x3425, 0x2c2a, 0x3bfa, 0x3bc1, -0x3489, 0x3027, 0x3a32, 0x2fdf, 0x3a72, 0x38c7, 0x3580, 0x3769, 0x3be7, 0x32fb, 0x32b0, 0x3b73, 0x3b3c, 0x38f6, 0x38f5, 0x25a2, 0x3856, 0x3a23, 0x2d10, 0x356f, 0x38d6, 0x3ae4, 0x328c, 0x3913, 0x3a39, 0x3745, 0x352a, 0x33d2, 0x3ac2, 0x3874, 0x3b1e, 0x2f5b, 0x3a62, 0x37f1, 0x38c3, 0x3bcc, 0x3334, 0x38b5, 0x3400, 0x3571, 0x38df, 0x3a54, 0x3380, 0x302c, 0x3448, 0x3bb5, 0x3bf5, 0x31b6, 0x3aca, 0x3b8d, 0x3b8e, 0x3a8e, 0x3390, 0x3b14, 0x2e8e, 0x3855, 0x3956, 0x34fd, 0x2cfa, 0x32cf, 0x3a1c, 0x3632, 0x373a, 0x38d4, -0x3869, 0x3b46, 0x3445, 0x381d, 0x339b, 0x3a0a, 0x347e, 0x3b30, 0x38ed, 0x3138, 0x2bbd, 0x3a6d, 0x3b82, 0x383a, 0x2592, 0x39b7, 0x23ea, 0x3962, 0x3a77, 0x3b68, 0x3877, 0x312b, 0x387a, 0x3167, 0x3149, 0x383e, 0x3806, 0x3b3b, 0x31db, 0x38ce, 0x34e8, 0x2856, 0x3666, 0x3a6e, 0x36ee, 0x32b9, 0x3569, 0x3b2e, 0x3b41, 0x390d, 0x356e, 0x39fb, 0x3b59, 0x2e2e, 0x36b2, 0x3a09, 0x2e8d, 0x3616, 0x3906, 0x360a, 0x3a22, 0x2ace, 0x3bd9, 0x309a, 0x33c5, 0x2c68, 0x315d, 0x3beb, 0x39a6, 0x36d2, 0x36d0, 0x300e, 0x3950, 0x35f2, -0x3ac7, 0x2ee6, 0x30ac, 0x38e3, 0x33a2, 0x30f1, 0x2cb9, 0x30c2, 0x350e, 0x3781, 0x39f2, 0x39f4, 0x3081, 0x357f, 0x354a, 0x3496, 0x39ad, 0x37d6, 0x38d9, 0x3477, 0x26fd, 0x341c, 0x34a6, 0x2e76, 0x3a8c, 0x37ff, 0x31b3, 0x3bce, 0x3855, 0x39e7, 0x32e1, 0x382f, 0x2e07, 0x37cc, 0x397a, 0x3985, 0x367a, 0x3b66, 0x3bc8, 0x2fea, 0x32c7, 0x3a73, 0x34b8, 0x3a30, 0x3830, 0x3904, 0x3855, 0x2bde, 0x3598, 0x29f7, 0x3a60, 0x39b9, 0x33c1, 0x3b82, 0x38fb, 0x37ce, 0x2cc0, 0x3117, 0x3928, 0x3243, 0x2c2a, 0x38bc, 0x35b4, 0x3946, -0x38b8, 0x3403, 0x3862, 0x3a80, 0x36c2, 0x3ad4, 0x38c5, 0x3631, 0x3a1a, 0x387a, 0x3308, 0x3099, 0x3834, 0x35af, 0x2eb7, 0x3473, 0x31a8, 0x3795, 0x3a31, 0x3be6, 0x3858, 0x27e9, 0x36ba, 0x3109, 0x3916, 0x372d, 0x357c, 0x32ac, 0x37d7, 0x3654, 0x37c1, 0x383f, 0x3368, 0x350d, 0x3b3e, 0x3af4, 0x35a9, 0x3514, 0x3a3c, 0x36a3, 0x3bb3, 0x3ba2, 0x33b3, 0x398e, 0x3593, 0x32b4, 0x3bef, 0x34d9, 0x3bad, 0x39a9, 0x15e1, 0x3b2c, 0x3b74, 0x3824, 0x3893, 0x35bd, 0x3b68, 0x32ca, 0x3ace, 0x3a27, 0x341f, 0x3a95, 0x3397, 0x3585, -0x2a43, 0x348f, 0x3b93, 0x3a55, 0x38d0, 0x39d9, 0x342a, 0x3252, 0x30e5, 0x24f6, 0x34ef, 0x38f4, 0x35af, 0x2fbf, 0x2f85, 0x2cf8, 0x29a9, 0x360d, 0x3a3d, 0x319a, 0x2cf9, 0x3acf, 0x38c5, 0x3761, 0x35d5, 0x2e99, 0x328d, 0x38fb, 0x3aef, 0x39cd, 0x2f04, 0x3516, 0x395d, 0x34bd, 0x326c, 0x399e, 0x2a6f, 0x3a69, 0x3343, 0x3a7f, 0x34c3, 0x39de, 0x3b7b, 0x3968, 0x3900, 0x35e6, 0x3a88, 0x3498, 0x370d, 0x2cb7, 0x3825, 0x3b08, 0x3b62, 0x383d, 0x34f7, 0x35e5, 0x2dac, 0x37c3, 0x3041, 0x2e34, 0x2d89, 0x315c, 0x3b17, 0x366b, -0x393f, 0x3a05, 0x2577, 0x3468, 0x3aee, 0x39d2, 0x3adb, 0x38e7, 0x2695, 0x39df, 0x30b8, 0x3667, 0x34fc, 0x3157, 0x371c, 0x34b0, 0x38a7, 0x374c, 0x3413, 0x37b4, 0x391b, 0x2ee9, 0x3899, 0x3adc, 0x308b, 0x2cff, 0x35b9, 0x37ff, 0x3967, 0x36bd, 0x3185, 0x3be4, 0x394b, 0x33eb, 0x3879, 0x3ad9, 0x31a5, 0x38c0, 0x343e, 0x362e, 0x3b6e, 0x2bad, 0x39fa, 0x3a43, 0x3933, 0x3b78, 0x35d5, 0x3625, 0x371a, 0x3a9f, 0x3b94, 0x3665, 0x3915, 0x3895, 0x3522, 0x3897, 0x38c0, 0x3738, 0x3115, 0x36b4, 0x3778, 0x38c1, 0x2e5c, 0x244f, -0x3808, 0x372c, 0x3107, 0x3448, 0x3ace, 0x380a, 0x3a17, 0x394a, 0x3afd, 0x3a06, 0x2ccb, 0x38d7, 0x320b, 0x327b, 0x308a, 0x3586, 0x2f07, 0x36c8, 0x3a49, 0x39fe, 0x261b, 0x2fd9, 0x2d24, 0x373f, 0x2edf, 0x385b, 0x3b8a, 0x31fa, 0x39c1, 0x3b43, 0x3b07, 0x374a, 0x3ba5, 0x2190, 0x343c, 0x2cac, 0x3634, 0x36a7, 0x3aff, 0x3767, 0x3b8d, 0x3919, 0x315c, 0x3acd, 0x33a4, 0x39af, 0x3b60, 0x3a54, 0x3967, 0x3bfe, 0x34ba, 0x3681, 0x3597, 0x30bf, 0x31db, 0x3709, 0x3550, 0x3a37, 0x34c2, 0x381b, 0x3b4e, 0x2dd2, 0x3bc4, 0x3b1d, -0x393b, 0x3b43, 0x1c81, 0x35e7, 0x3922, 0x38d8, 0x371e, 0x39ea, 0x3995, 0x2ce3, 0x26d7, 0x3547, 0x3803, 0x350a, 0x3142, 0x3a85, 0x3482, 0x3896, 0x38ac, 0x348f, 0x34be, 0x1a12, 0x36be, 0x3973, 0x3a40, 0x3543, 0x20e1, 0x34e7, 0x3567, 0x33db, 0x3108, 0x39a1, 0x3718, 0x36e0, 0x2df2, 0x3953, 0x3434, 0x22a8, 0x3957, 0x26f0, 0x324e, 0x31fc, 0x3673, 0x3355, 0x3979, 0x3a9a, 0x3914, 0x383a, 0x3726, 0x3bfd, 0x37ad, 0x38f1, 0x333a, 0x2dca, 0x35ff, 0x3af8, 0x3aef, 0x3b69, 0x371c, 0x373d, 0x2eb4, 0x36c4, 0x38fc, 0x3852, -0x31b3, 0x3b4b, 0x279c, 0x36d4, 0x397a, 0x3430, 0x347b, 0x3a11, 0x330f, 0x353d, 0x3a3e, 0x395e, 0x3b26, 0x3912, 0x301b, 0x314c, 0x3480, 0x3a2b, 0x2f76, 0x3b15, 0x3914, 0x2df3, 0x38f0, 0x3698, 0x3bcc, 0x3b94, 0x3be8, 0x3478, 0x311f, 0x366b, 0x2693, 0x3a55, 0x2855, 0x3982, 0x3a0c, 0x3b4e, 0x3626, 0x387e, 0x3bac, 0x3ba4, 0x3bcc, 0x3ae6, 0x3a77, 0x3435, 0x2f57, 0x34a8, 0x3410, 0x3531, 0x34a3, 0x3a71, 0x380a, 0x3bb2, 0x1f10, 0x3aa0, 0x3b1c, 0x3984, 0x3937, 0x3bd7, 0x36b1, 0x31c2, 0x338d, 0x26f9, 0x3923, 0x38e8, -0x1b4b, 0x397a, 0x35fd, 0x28e7, 0x36c0, 0x3a1a, 0x394d, 0x38ba, 0x39ef, 0x3795, 0x303a, 0x3110, 0x3a36, 0x30cd, 0x2d48, 0x3a2e, 0x32a9, 0x374a, 0x381d, 0x36dc, 0x39c1, 0x2d15, 0x3ae9, 0x1df9, 0x3bb6, 0x3aec, 0x2b5a, 0x39ed, 0x33ff, 0x3630, 0x3872, 0x35d8, 0x358a, 0x2ca9, 0x3773, 0x38bc, 0x3656, 0x2ffb, 0x3be8, 0x278d, 0x3b4e, 0x39a7, 0x3375, 0x29bc, 0x3946, 0x34ba, 0x2cf9, 0x3629, 0x3aff, 0x33f5, 0x26f2, 0x3a59, 0x2cfc, 0x3210, 0x38ee, 0x361d, 0x3060, 0x374e, 0x344b, 0x3975, 0x31eb, 0x3560, 0x37e6, 0x2a97, -0x36a6, 0x3b65, 0x34a3, 0x35bb, 0x35af, 0x36b6, 0x3757, 0x38fb, 0x396f, 0x3ad4, 0x3962, 0x2b38, 0x39e5, 0x3159, 0x39be, 0x3202, 0x2387, 0x387a, 0x3463, 0x37c4, 0x39ce, 0x34a3, 0x37bd, 0x3ac0, 0x359a, 0x31db, 0x327c, 0x391e, 0x3a9f, 0x36cc, 0x3961, 0x2264, 0x3583, 0x396f, 0x3a9f, 0x2ad9, 0x36ec, 0x32b3, 0x2fd5, 0x397a, 0x352d, 0x343d, 0x3841, 0x3964, 0x39c4, 0x3a81, 0x3acb, 0x34f0, 0x38b4, 0x375a, 0x3a25, 0x3932, 0x393f, 0x3025, 0x397c, 0x3a55, 0x37c6, 0x32f4, 0x3bae, 0x3a48, 0x31cf, 0x38b5, 0x366c, 0x3451, -0x23c6, 0x36a2, 0x38eb, 0x3bde, 0x3318, 0x3667, 0x3b5a, 0x3867, 0x30e6, 0x3256, 0x3499, 0x38b5, 0x2e31, 0x3408, 0x3a30, 0x345a, 0x3a32, 0x3b26, 0x34cd, 0x39c8, 0x34b0, 0x39f6, 0x2cc9, 0x3906, 0x3121, 0x39e8, 0x3b18, 0x3973, 0x31ac, 0x3803, 0x33a5, 0x3034, 0x3940, 0x310e, 0x3a82, 0x21dc, 0x3b7b, 0x388d, 0x3166, 0x3967, 0x35f3, 0x3942, 0x3a4c, 0x380f, 0x3852, 0x37d2, 0x37ad, 0x388c, 0x39b9, 0x34b2, 0x2ca4, 0x382d, 0x3ad5, 0x3662, 0x397d, 0x30b3, 0x2c1c, 0x3447, 0x33a7, 0x30ef, 0x39a6, 0x3bcf, 0x3ac9, 0x3083, -0x387a, 0x3ae9, 0x3acd, 0x38b8, 0x3a8d, 0x32cb, 0x32f3, 0x2f98, 0x3a4d, 0x2846, 0x3bba, 0x3ab7, 0x31c6, 0x2b8e, 0x3188, 0x3b27, 0x3b0a, 0x3abf, 0x3b9e, 0x2d16, 0x34fc, 0x34d9, 0x38f3, 0x389d, 0x3520, 0x323c, 0x3b1b, 0x38d6, 0x3a6c, 0x38d7, 0x352d, 0x3ab7, 0x388d, 0x3b66, 0x35c3, 0x3a06, 0x3ad3, 0x3bd2, 0x395c, 0x3aa0, 0x3903, 0x3bcc, 0x2ff8, 0x3bba, 0x3511, 0x3bf8, 0x352c, 0x3a37, 0x367a, 0x3710, 0x3a4d, 0x30d2, 0x347a, 0x384b, 0x39d2, 0x3455, 0x2eeb, 0x3a46, 0x3a88, 0x3a1c, 0x3a18, 0x3b52, 0x3136, 0x3853, -0x37ac, 0x39dd, 0x372d, 0x352b, 0x3598, 0x344c, 0x3886, 0x3910, 0x3350, 0x3a31, 0x351f, 0x397c, 0x3bb6, 0x3121, 0x397f, 0x36b4, 0x3bd3, 0x3a3f, 0x3b1d, 0x3a22, 0x39df, 0x3bc6, 0x31b6, 0x3a7c, 0x389a, 0x3927, 0x36a9, 0x3694, 0x385a, 0x3611, 0x31cd, 0x309b, 0x3af7, 0x352f, 0x3a81, 0x3894, 0x29ee, 0x3b55, 0x39c6, 0x388a, 0x307e, 0x39d9, 0x2753, 0x3451, 0x34a2, 0x3a16, 0x3672, 0x3466, 0x3078, 0x21c5, 0x307d, 0x3803, 0x35d5, 0x3bed, 0x2e8f, 0x3426, 0x3427, 0x3a78, 0x30e9, 0x39b3, 0x37da, 0x3818, 0x380b, 0x38c9, -0x3ba5, 0x320b, 0x3935, 0x36e4, 0x38ef, 0x3b81, 0x2f22, 0x39ba, 0x3755, 0x3b1c, 0x39cd, 0x386f, 0x2d6e, 0x335b, 0x3aba, 0x3b3f, 0x3b6c, 0x3293, 0x3177, 0x3bd5, 0x309f, 0x343a, 0x2dee, 0x3240, 0x353e, 0x356a, 0x30ed, 0x3b56, 0x3977, 0x343e, 0x32c7, 0x3a75, 0x315b, 0x3015, 0x32fd, 0x363d, 0x3a68, 0x386e, 0x2dc3, 0x34f3, 0x3bfb, 0x398f, 0x37db, 0x3bbc, 0x3015, 0x38a5, 0x21e7, 0x3863, 0x2fca, 0x3152, 0x3acb, 0x390b, 0x3bc2, 0x3a5e, 0x3823, 0x3b36, 0x2c67, 0x3b1c, 0x34cc, 0x1c43, 0x3431, 0x3088, 0x3707, 0x36a9, -0x3bdf, 0x2a64, 0x3891, 0x327a, 0x393c, 0x2971, 0x3304, 0x39b0, 0x3a92, 0x2df5, 0x398e, 0x2ea4, 0x34be, 0x3449, 0x3037, 0x382c, 0x380e, 0x3a44, 0x35d1, 0x3539, 0x39f4, 0x3b7f, 0x2974, 0x3a97, 0x3bdb, 0x3a60, 0x34cf, 0x3641, 0x2e66, 0x1e72, 0x398d, 0x3568, 0x39eb, 0x3b8d, 0x343d, 0x3af4, 0x39bc, 0x35ef, 0x23e5, 0x3826, 0x3841, 0x36fc, 0x342b, 0x30a4, 0x2f48, 0x1165, 0x2842, 0x3059, 0x3811, 0x32fb, 0x3aec, 0x3a8b, 0x2e51, 0x3aeb, 0x385e, 0x2a73, 0x28b8, 0x36df, 0x3453, 0x37f1, 0x2dfb, 0x2bed, 0x3b52, 0x39a6, -0x395a, 0x37b9, 0x3492, 0x3490, 0x34a9, 0x37de, 0x394e, 0x3934, 0x37f4, 0x3909, 0x1ef5, 0x344f, 0x3852, 0x3b64, 0x3a06, 0x2e82, 0x2cd9, 0x31a7, 0x382b, 0x34b7, 0x3a2b, 0x372d, 0x36ba, 0x2932, 0x3b1e, 0x34d7, 0x36ed, 0x38f0, 0x3198, 0x3730, 0x31fa, 0x3439, 0x36a6, 0x3328, 0x38f5, 0x35f6, 0x3997, 0x3246, 0x3958, 0x3542, 0x3890, 0x35b2, 0x387b, 0x364e, 0x391c, 0x3450, 0x199d, 0x382c, 0x2bc0, 0x31bf, 0x3af2, 0x344d, 0x337a, 0x3b3d, 0x3a13, 0x2cc4, 0x3b74, 0x20b2, 0x3821, 0x34db, 0x391f, 0x3867, 0x3867, 0x351a, -0x3920, 0x340d, 0x3918, 0x37dc, 0x395d, 0x344f, 0x398d, 0x3af1, 0x2688, 0x3884, 0x36d1, 0x37d5, 0x3a83, 0x34fc, 0x32ef, 0x32a7, 0x3b70, 0x254c, 0x3255, 0x3ae5, 0x3b20, 0x355d, 0x31a2, 0x35c7, 0x32e5, 0x367a, 0x3a16, 0x3b28, 0x2515, 0x3713, 0x2c86, 0x3461, 0x38e4, 0x39ca, 0x39ae, 0x337d, 0x3a52, 0x3b23, 0x31a8, 0x250b, 0x376c, 0x381e, 0x34c6, 0x39ef, 0x3236, 0x1de2, 0x38c3, 0x330c, 0x3a33, 0x38c8, 0x310c, 0x3716, 0x3762, 0x39b5, 0x3942, 0x37c6, 0x2a62, 0x37e8, 0x348a, 0x345e, 0x331a, 0x3435, 0x39af, 0x38c4, -0x3bb0, 0x39c8, 0x30a1, 0x39ce, 0x3bc5, 0x3654, 0x29c8, 0x31c9, 0x36c8, 0x3b42, 0x3a78, 0x3940, 0x3a71, 0x3516, 0x3bf8, 0x38c3, 0x3b8e, 0x31be, 0x3b8c, 0x2fba, 0x3775, 0x353b, 0x3b07, 0x3a38, 0x383b, 0x3bb5, 0x39aa, 0x35b9, 0x34fe, 0x38e0, 0x2ec4, 0x3599, 0x2f25, 0x3285, 0x319a, 0x29b8, 0x3997, 0x3945, 0x3bab, 0x3bd9, 0x382e, 0x3a0b, 0x3ab9, 0x3b34, 0x39e1, 0x3912, 0x368e, 0x3b3b, 0x3ba9, 0x3ad4, 0x3a09, 0x384d, 0x3be3, 0x2af7, 0x3a54, 0x3be8, 0x3082, 0x3165, 0x32c9, 0x3650, 0x3919, 0x3be0, 0x3728, 0x3b0c, -0x2be8, 0x36a5, 0x3b7d, 0x3898, 0x3884, 0x34a1, 0x3060, 0x379f, 0x3bca, 0x3844, 0x3858, 0x38fa, 0x3062, 0x2c79, 0x3592, 0x3678, 0x396a, 0x2b91, 0x3845, 0x350e, 0x3b4a, 0x341c, 0x34cd, 0x3928, 0x3b92, 0x39da, 0x313f, 0x3577, 0x3a10, 0x39db, 0x382c, 0x3826, 0x31c0, 0x376e, 0x3186, 0x28f4, 0x2e8f, 0x394a, 0x3947, 0x36d7, 0x2522, 0x3449, 0x3802, 0x3b78, 0x34c1, 0x29b0, 0x3705, 0x2e2e, 0x31ed, 0x3aba, 0x3849, 0x3acf, 0x3878, 0x1fe7, 0x2e77, 0x300d, 0x328e, 0x3001, 0x1e21, 0x3a86, 0x38ef, 0x387d, 0x3b80, 0x3995, -0x284d, 0x397e, 0x2fcb, 0x39ca, 0x331c, 0x2c0c, 0x36f1, 0x3a96, 0x3b50, 0x3a75, 0x3763, 0x3a84, 0x3960, 0x2708, 0x3b84, 0x3ade, 0x351d, 0x362e, 0x3bbe, 0x369d, 0x3987, 0x3bbe, 0x3561, 0x2da4, 0x37d4, 0x3abd, 0x38f2, 0x3a62, 0x3862, 0x29a1, 0x3a16, 0x3b7b, 0x36a6, 0x340d, 0x35f9, 0x3a2b, 0x304d, 0x3bf3, 0x3870, 0x3446, 0x3a16, 0x3a41, 0x3564, 0x3aa0, 0x3ab1, 0x394e, 0x35b4, 0x34d9, 0x3a36, 0x3b53, 0x382d, 0x3b15, 0x3651, 0x2f8f, 0x38a6, 0x2e0a, 0x34e5, 0x37f5, 0x2e90, 0x3500, 0x3b11, 0x35e8, 0x2e48, 0x3b35, -0x3884, 0x3807, 0x2f0d, 0x3b1c, 0x3bce, 0x3752, 0x2b0b, 0x33d2, 0x390e, 0x364d, 0x3373, 0x3a2c, 0x3839, 0x3286, 0x2825, 0x333a, 0x3b28, 0x3670, 0x3b28, 0x38fa, 0x3acb, 0x392c, 0x394a, 0x3bb4, 0x3697, 0x2e8a, 0x34a7, 0x38ac, 0x3721, 0x38e7, 0x3ae3, 0x387a, 0x372e, 0x394a, 0x2ff1, 0x3b45, 0x3b28, 0x3a78, 0x3bca, 0x39b5, 0x3882, 0x3225, 0x38aa, 0x3afc, 0x3bba, 0x3335, 0x3b00, 0x31a0, 0x3178, 0x3897, 0x33f6, 0x3b92, 0x3a1f, 0x38f1, 0x3465, 0x333d, 0x3873, 0x3645, 0x3963, 0x3b4d, 0x3458, 0x3a0b, 0x34b5, 0x3830, -0x34e3, 0x398d, 0x3b99, 0x3b94, 0x3402, 0x3a05, 0x3a63, 0x33eb, 0x3651, 0x2f1b, 0x3bb1, 0x3ab8, 0x38d5, 0x35cf, 0x38b4, 0x398e, 0x3bd9, 0x304c, 0x3a0e, 0x39c0, 0x3b38, 0x3170, 0x31f5, 0x3898, 0x3893, 0x329a, 0x364a, 0x3767, 0x3064, 0x3423, 0x3ae4, 0x3b26, 0x3b29, 0x344e, 0x3974, 0x3944, 0x3515, 0x3990, 0x3857, 0x3595, 0x3a48, 0x3862, 0x377e, 0x380e, 0x3526, 0x3b5e, 0x3350, 0x308c, 0x26d3, 0x3a18, 0x3af5, 0x3a8f, 0x38f5, 0x3854, 0x3aa2, 0x3479, 0x383a, 0x211d, 0x34fc, 0x39d9, 0x35a8, 0x3904, 0x3b93, 0x33bd, -0x32c1, 0x320d, 0x3abf, 0x23ff, 0x30f6, 0x360c, 0x35ef, 0x39ed, 0x3b66, 0x3a6f, 0x3021, 0x3a89, 0x354e, 0x3a96, 0x3889, 0x3b4d, 0x3af6, 0x2c6c, 0x3a7f, 0x3aac, 0x32be, 0x3830, 0x3884, 0x39be, 0x38c2, 0x2c1b, 0x39be, 0x3a92, 0x39b1, 0x373d, 0x3b89, 0x3933, 0x2c42, 0x3799, 0x3818, 0x394d, 0x380c, 0x38b9, 0x327d, 0x39cc, 0x36ff, 0x386f, 0x305d, 0x39c9, 0x3b74, 0x3817, 0x3a3d, 0x221a, 0x3ae8, 0x3804, 0x3977, 0x3959, 0x339a, 0x3822, 0x3967, 0x2e0f, 0x2ffe, 0x38b1, 0x3ae5, 0x3042, 0x37c6, 0x3bc8, 0x3913, 0x3b46, -0x3ab4, 0x251a, 0x38ca, 0x3312, 0x3adf, 0x3881, 0x3511, 0x2c81, 0x39ed, 0x2af6, 0x31ff, 0x3953, 0x3884, 0x3886, 0x2d46, 0x3860, 0x3b80, 0x351b, 0x3bd6, 0x34cf, 0x3b2e, 0x3ab5, 0x3889, 0x24ee, 0x292d, 0x3a3c, 0x3522, 0x3956, 0x3627, 0x3437, 0x2ffc, 0x3742, 0x38c9, 0x317e, 0x3866, 0x3a91, 0x38e6, 0x2eae, 0x39a9, 0x33dd, 0x389e, 0x397e, 0x3a4b, 0x3b82, 0x35c6, 0x3baf, 0x34f6, 0x3273, 0x262b, 0x3a22, 0x3bdd, 0x38ce, 0x3893, 0x3ad5, 0x288b, 0x3821, 0x35ae, 0x3857, 0x3754, 0x3a0f, 0x307b, 0x3938, 0x2cb8, 0x36d8, -0x39d8, 0x33ce, 0x3593, 0x3275, 0x38ca, 0x3a55, 0x39de, 0x3219, 0x393c, 0x3be7, 0x30dc, 0x2a0d, 0x302c, 0x352a, 0x3af5, 0x3817, 0x3ba0, 0x3a10, 0x35fa, 0x3552, 0x3820, 0x35c3, 0x381a, 0x3692, 0x3a0a, 0x3510, 0x35be, 0x360e, 0x33cb, 0x3961, 0x3748, 0x383b, 0x39ee, 0x3713, 0x389b, 0x3a0c, 0x38dc, 0x3bcb, 0x35c0, 0x3ac6, 0x3469, 0x3aea, 0x371f, 0x3040, 0x3653, 0x3811, 0x3b65, 0x3a43, 0x3bca, 0x329a, 0x3a68, 0x344a, 0x3b87, 0x24cd, 0x31e4, 0x37f2, 0x3995, 0x36b8, 0x34c5, 0x3844, 0x2b59, 0x36b7, 0x375b, 0x2e4d, -0x3397, 0x1c22, 0x3764, 0x343a, 0x3bb3, 0x365c, 0x343e, 0x381e, 0x3886, 0x370c, 0x386c, 0x35aa, 0x357a, 0x395b, 0x3bf4, 0x37fd, 0x3aae, 0x3b37, 0x35dd, 0x3944, 0x3a71, 0x3832, 0x3a3d, 0x34d8, 0x3a1c, 0x38db, 0x3ab2, 0x3ba3, 0x3255, 0x3886, 0x38b3, 0x316a, 0x3845, 0x33e0, 0x3bf6, 0x390c, 0x3aea, 0x3b84, 0x349c, 0x395d, 0x3bdb, 0x3b01, 0x384e, 0x350f, 0x389f, 0x33c4, 0x2fea, 0x3860, 0x32de, 0x31b9, 0x3ab2, 0x3825, 0x3afd, 0x3901, 0x3bf4, 0x2770, 0x336e, 0x3b99, 0x38d9, 0x3838, 0x3650, 0x398a, 0x3868, 0x2d09 -}; diff --git a/tests/utils/x_input.h b/tests/utils/x_input.h deleted file mode 100644 index 586a9ce9..00000000 --- a/tests/utils/x_input.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2025 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// Authors: Yvan Tortorella -// - -/* Header file generated by RedMulE Golden Model */ -uint16_t x_inp [6144] = { -0x3bc4, 0x38a8, 0x3af4, 0x3701, 0x3677, 0x310f, 0x3246, 0x3962, 0x390e, 0x3011, 0x395a, 0x3ba5, 0x37a9, 0x33b9, 0x345b, 0x39b9, 0x3a80, 0x389d, 0x3627, 0x397a, 0x3bb4, 0x2de4, 0x3b76, 0x3a79, 0x2cc5, 0x3b89, 0x3b94, 0x3af8, 0x3845, 0x3999, 0x3207, 0x38e2, 0x387f, 0x34e4, 0x3bdb, 0x3b9d, 0x2d95, 0x3822, 0x3b17, 0x38b0, 0x38d2, 0x300f, 0x3b47, 0x3122, 0x3989, 0x3a59, 0x3bf0, 0x3b60, 0x2be0, 0x39c4, 0x260c, 0x3998, 0x39e4, 0x327a, 0x3401, 0x3a19, 0x3922, 0x3759, 0xe48, 0x3500, 0x3560, 0x30a7, 0x3a20, 0x39a9, -0x360b, 0x23aa, 0x38ec, 0x399b, 0x3aea, 0x39f1, 0x3311, 0x398d, 0x386b, 0x35d3, 0x2e37, 0x31e0, 0x3216, 0x2f54, 0x36c8, 0x3a38, 0x33ff, 0x3970, 0x33a8, 0x355f, 0x3171, 0x35c2, 0x320c, 0x3bd0, 0x348a, 0x3bd1, 0x3b6d, 0x364c, 0x3848, 0x3819, 0x3869, 0x3a95, 0x3882, 0x29d3, 0x3272, 0x3146, 0x1ca2, 0x38cb, 0x38d8, 0x3b7b, 0x2e55, 0x3aea, 0x388e, 0x3b73, 0x1e9f, 0x3921, 0x3878, 0x3aba, 0x388f, 0x3724, 0x3b21, 0x3752, 0x2a4a, 0x3802, 0x321d, 0x3a56, 0x3430, 0x38f7, 0x24e9, 0x3a57, 0x39a3, 0x3985, 0x3bcb, 0x3bd9, -0x34ad, 0x3352, 0x3006, 0x39ec, 0x3afb, 0x34eb, 0x34ff, 0x3007, 0x37e5, 0x37ef, 0x3953, 0x3703, 0x3468, 0x39af, 0x3bc4, 0x34ee, 0x3ad4, 0x3b92, 0x362e, 0x3b24, 0x3650, 0x2d18, 0x2f09, 0x33f8, 0x2ee8, 0x3b80, 0x3a24, 0x3512, 0x3bfe, 0x382b, 0x3946, 0x37ad, 0x38df, 0x3a6f, 0x3068, 0x3c00, 0x3a1d, 0x3977, 0x3baa, 0x3776, 0x398a, 0x374a, 0x3180, 0x30a7, 0x3427, 0x307b, 0x301a, 0x3977, 0x3941, 0x35d1, 0x2e44, 0x37ed, 0x3205, 0x38d4, 0x34f9, 0x396c, 0x39f0, 0x39f7, 0x3ae1, 0x3788, 0x3186, 0x3956, 0x3852, 0x3515, -0x3963, 0x3706, 0x3836, 0x2fa5, 0x2e7c, 0x399e, 0x3695, 0x3152, 0x3a61, 0x36e1, 0x2cb5, 0x22ba, 0x3952, 0x249b, 0x39c2, 0x39ce, 0x3aa6, 0x374c, 0x3704, 0x397d, 0x395e, 0x3b34, 0x3ba0, 0x3bbd, 0x3b40, 0x39b3, 0x3917, 0x3a15, 0x35eb, 0x38c7, 0x3451, 0x35f6, 0x3a2f, 0x365d, 0x3a9d, 0x3952, 0x3ae6, 0x3a96, 0x29b1, 0x3a12, 0x3a63, 0x3931, 0x340e, 0x3579, 0x3500, 0x340d, 0x31c5, 0x3ab8, 0x3a99, 0x339a, 0x36df, 0x3494, 0x37af, 0x3938, 0x1a95, 0x3b76, 0x38f2, 0x2ac6, 0x39f4, 0x3b59, 0x36b9, 0x2555, 0x35c2, 0x3969, -0x3475, 0x3473, 0x3b1d, 0x3752, 0x2c50, 0x37e5, 0x35d2, 0x2406, 0x3639, 0x3adc, 0x32e5, 0x3a43, 0x2979, 0x2cd5, 0x37bc, 0x3a9a, 0x3976, 0x3832, 0x3260, 0x2cda, 0x364e, 0x387a, 0x2444, 0x3904, 0x363a, 0x2a47, 0x397e, 0x3629, 0x3b66, 0x34b7, 0x393c, 0x2281, 0x39ad, 0x36ac, 0x2e58, 0x34d0, 0x361d, 0x2acb, 0x3a81, 0x3acf, 0x394c, 0x2497, 0x2679, 0x3a66, 0x34dc, 0x3b93, 0x2cac, 0x3b08, 0x38e5, 0x3826, 0x3a0b, 0x3989, 0x3254, 0x319b, 0x2d3b, 0x39cf, 0x36c0, 0x38b5, 0x31e4, 0x38ad, 0x3b10, 0x3a46, 0x3004, 0x3afb, -0x341f, 0x3ae8, 0x3a72, 0x3ac7, 0x31c8, 0x3795, 0x3400, 0x355b, 0x3974, 0x3090, 0x3870, 0x2e3c, 0x38de, 0x2192, 0x3341, 0x3a27, 0x2be6, 0x1e7b, 0x38de, 0x3049, 0x3b3a, 0x3320, 0x30b3, 0x30dd, 0x3525, 0x357b, 0x3981, 0x3430, 0x3796, 0x3a14, 0x2dae, 0x3857, 0x385f, 0x3aa4, 0x350c, 0x32d4, 0x300a, 0x3a89, 0x3847, 0x38f7, 0x33d8, 0x3755, 0x2bf7, 0x3ab1, 0x3a3b, 0x39fd, 0x30ef, 0x3780, 0x3ba9, 0x31b6, 0x3467, 0x35a8, 0x3aa7, 0x35f9, 0x3a0e, 0x392b, 0x3241, 0x383b, 0x3a98, 0x3af2, 0x39d1, 0x2df0, 0x39af, 0x3715, -0x37c8, 0x345c, 0x3af4, 0x3859, 0x398e, 0x36c8, 0x3685, 0x3b9a, 0x3674, 0x3b11, 0x35a1, 0x39fa, 0x320f, 0x3ada, 0x3220, 0x3a00, 0x39a1, 0x3954, 0x3bfe, 0x36f3, 0x3533, 0x2a58, 0x360b, 0x379b, 0x39c8, 0x3a2a, 0x3070, 0x3bcd, 0x384d, 0x3386, 0x38b7, 0x2cd8, 0x37e5, 0x3b9a, 0x3900, 0x39c7, 0x3849, 0x3a0b, 0x3a58, 0x3bd2, 0x3a57, 0x32e6, 0x365d, 0x2d29, 0x38f3, 0x38ae, 0x3bbf, 0x3459, 0x3580, 0x3547, 0x3546, 0x39dd, 0x2cb5, 0x35fb, 0x37f9, 0x3b83, 0x32e6, 0x3875, 0x33ce, 0x3039, 0x31f5, 0x386e, 0x3aec, 0x3bea, -0x3beb, 0x3bee, 0x3972, 0x3853, 0x28f1, 0x35a0, 0x2d66, 0x343d, 0x39dd, 0x31a7, 0x36f6, 0x2df4, 0x3be1, 0x2bb2, 0x3a34, 0x31f3, 0x3286, 0x363c, 0x3318, 0x33f4, 0x394f, 0x303d, 0x36ae, 0x3579, 0x3830, 0x33fe, 0x39b3, 0x3ae0, 0x3b94, 0x3410, 0x1846, 0x2f50, 0x3ad9, 0x29b4, 0x3b2d, 0x358a, 0x3ba5, 0x3b45, 0x2822, 0x3b0e, 0x2f3c, 0x2f5d, 0x34d2, 0x3adc, 0x391c, 0x3a3d, 0x3143, 0x3af8, 0x38f1, 0x3b05, 0x35b0, 0x3be6, 0x3a75, 0x3afd, 0x3a17, 0x342a, 0x34df, 0x3bc3, 0x3958, 0x38c9, 0x3a07, 0x3386, 0x30b5, 0x37c7, -0x3191, 0x39e8, 0x2e86, 0x3b1b, 0x3bf4, 0x2aa1, 0x25c7, 0x34e8, 0x3afe, 0x3a1a, 0x3aa7, 0x3a34, 0x2e88, 0x2f09, 0x34f4, 0x3a41, 0x37b3, 0x3845, 0x39fc, 0x3845, 0x3a78, 0x3a8c, 0x3a25, 0x3ac7, 0x360c, 0x3992, 0x38ac, 0x3984, 0x390c, 0x383b, 0x3361, 0x3b1f, 0x322f, 0x3acf, 0x377c, 0x3aff, 0x392b, 0x384b, 0x303f, 0x3a2c, 0x3975, 0x386f, 0x366a, 0x38b3, 0x3504, 0x3bb3, 0x3403, 0x2acd, 0x3bac, 0x31f8, 0x390d, 0x35b6, 0x38f7, 0x293a, 0x368c, 0x384f, 0x3b65, 0x38c9, 0x3736, 0x38c1, 0x3af3, 0x3950, 0x2d07, 0x3486, -0x397b, 0x3bdd, 0x3beb, 0x3bcb, 0x33e6, 0x320f, 0x3a6c, 0x2edd, 0x3765, 0x3976, 0x387e, 0x3aa5, 0x2edd, 0x3b15, 0x2ca9, 0x3ae3, 0x33a2, 0x34fe, 0x3ae7, 0x3895, 0x38d4, 0x2927, 0x3b84, 0x3964, 0x3224, 0x298a, 0x3560, 0x2aef, 0x38fc, 0x3826, 0x3ad0, 0x3bf3, 0x3bc7, 0x3604, 0x3729, 0x37b9, 0x385e, 0x2962, 0x3598, 0x3118, 0x3a34, 0x3990, 0x2c5a, 0x3684, 0x31f8, 0x3a3a, 0x3900, 0x367a, 0x3afb, 0x364e, 0x3857, 0x3886, 0x3339, 0x3875, 0x3bed, 0x3569, 0x35b4, 0x3879, 0x34e4, 0x3a0e, 0x3836, 0x3a15, 0x36b3, 0x33c8, -0x29ce, 0x3774, 0x2c8b, 0x35d1, 0x39f0, 0x3b59, 0x2f54, 0x3b66, 0x2ba4, 0x38b9, 0x39a0, 0x383c, 0x39fb, 0x3458, 0x2c62, 0x3a07, 0x3b25, 0x344c, 0x387d, 0x383a, 0x38f9, 0x2e96, 0x38cf, 0x3539, 0x30b7, 0x3b0c, 0x3472, 0x34ec, 0x2c32, 0x3ae0, 0x39d9, 0x3875, 0x3b85, 0x3bc7, 0x3bfe, 0x3079, 0x3b26, 0x3521, 0x38cb, 0x3285, 0x3589, 0x39d2, 0x3aae, 0x3b7b, 0x3808, 0x3a3e, 0x238e, 0x3882, 0x3af6, 0x2c22, 0x3873, 0x3992, 0x3b01, 0x34a6, 0x3a2f, 0x3b23, 0x2e9c, 0x2656, 0x3614, 0x3590, 0x3572, 0x378d, 0x38f1, 0x3271, -0x36b3, 0x3896, 0x2f55, 0x2ab4, 0x37eb, 0x39ca, 0x381d, 0x3594, 0x3432, 0x3b6b, 0x37e0, 0x372f, 0x3b3f, 0x392a, 0x39ed, 0x35fc, 0x3938, 0x3b51, 0x3b37, 0x33dc, 0x38d6, 0x30d8, 0x330b, 0x3b61, 0x3a8f, 0x3aa3, 0x3adb, 0x3ae7, 0x3359, 0x39e1, 0x2c94, 0x3093, 0x38e9, 0x3b42, 0x390d, 0x3b01, 0x3a8c, 0x3886, 0x3b4d, 0x3a30, 0x30d4, 0x33a8, 0x3498, 0x35a2, 0x3b02, 0x3573, 0x345f, 0x35a2, 0x3181, 0x212d, 0x34bf, 0x396c, 0x19e4, 0x3992, 0x38fa, 0x3af9, 0x2e49, 0x3a1c, 0x27b3, 0x3777, 0x3868, 0x320c, 0x340e, 0x3028, -0x39e9, 0x3832, 0x391f, 0x372b, 0x363f, 0x3aa8, 0x39a0, 0x3637, 0x2ba4, 0x3810, 0x3bef, 0x3ae1, 0x397f, 0x3521, 0x3b71, 0x30ca, 0x2478, 0x2b91, 0x39ed, 0x38ea, 0x31ed, 0x3b37, 0x3a7a, 0x3a2f, 0x387e, 0x367c, 0x39d0, 0x3a52, 0x36ab, 0x39ad, 0x3976, 0x3b80, 0x3b6b, 0x35f6, 0x3bf9, 0x3171, 0x3977, 0x3b37, 0x28e7, 0x3403, 0x34fd, 0x3889, 0x35d4, 0x2686, 0x3b82, 0x3455, 0x3041, 0x389f, 0x3ac9, 0x34b1, 0x3576, 0x3a6e, 0x3495, 0x31f8, 0x3a90, 0x3a77, 0x3a00, 0x38ba, 0x34a0, 0x3a5a, 0x354a, 0x39da, 0x39a9, 0x302e, -0x3bcd, 0x328d, 0x2c1c, 0x3b9d, 0x3bad, 0x399a, 0x35be, 0x3b2a, 0x36f8, 0x332d, 0x39ef, 0x3b78, 0x36a5, 0x30d8, 0x3b69, 0x2fe0, 0x3a22, 0x3a87, 0x332f, 0x39d5, 0x34da, 0x3023, 0x26b2, 0x3712, 0x3976, 0x3bae, 0x39ee, 0x36aa, 0x3783, 0x34ca, 0x1dda, 0x3a22, 0x35b9, 0x3688, 0x3a33, 0x389f, 0x377b, 0x3908, 0x3262, 0x3844, 0x30c5, 0x352e, 0x2889, 0x3b4a, 0x36b4, 0x3b8c, 0x316f, 0x3892, 0x3281, 0x3bcb, 0x304f, 0x395b, 0x3bff, 0x3af7, 0x38a6, 0x313f, 0x3965, 0x3a2f, 0x372c, 0x390b, 0x2ccf, 0x3a3c, 0x3bfb, 0x3932, -0x3ab8, 0x33bf, 0x3b6a, 0x370f, 0x33a2, 0x2b19, 0x2f7e, 0x3558, 0x38b6, 0x3a17, 0x3306, 0x37dd, 0x3a84, 0x2c33, 0x3b3b, 0x2e32, 0x2d2b, 0x389b, 0x378a, 0x3667, 0x31f5, 0x3823, 0x395a, 0x3a40, 0x3004, 0x390c, 0x398c, 0x37c4, 0x3497, 0x394a, 0x3af6, 0x3729, 0x2a73, 0x3881, 0x3227, 0x39c6, 0x379f, 0x3b06, 0x287f, 0x3aff, 0x3bdb, 0x38cc, 0x36e7, 0x31c6, 0x3b4c, 0x2994, 0x3873, 0x36f2, 0x3b4f, 0x3266, 0x3acb, 0x3339, 0x36e8, 0x38a9, 0x38cd, 0x3144, 0x39d8, 0x39f0, 0x301f, 0x3a70, 0x34ac, 0x364e, 0x3489, 0x3af8, -0x3886, 0x2fa4, 0x3b96, 0x388b, 0x389c, 0x363c, 0x3905, 0x32d5, 0x39c9, 0x3be6, 0x2dbd, 0x34c0, 0x3b00, 0x3a39, 0x3044, 0x2561, 0x349c, 0x3b97, 0x3855, 0x387e, 0x3a7d, 0x22e5, 0x393f, 0x34a5, 0x3ae2, 0x2e0c, 0x3b44, 0x3a1b, 0x39b2, 0x3836, 0x2ea4, 0x3936, 0x36be, 0x308e, 0x3907, 0x3b3e, 0x2828, 0x377d, 0x3bfd, 0x2eb0, 0x327c, 0x2293, 0x2f1d, 0x37a7, 0x39e9, 0x347c, 0x3b6f, 0x3ac4, 0x3422, 0x349e, 0x3a60, 0x3884, 0x3ae3, 0x3a81, 0x3b1f, 0x285b, 0x3494, 0x35a2, 0x31f5, 0x3ad3, 0x3834, 0x3ae7, 0x3bfa, 0x3678, -0x373f, 0x3739, 0x3afd, 0x347f, 0x38d8, 0x3a1d, 0x39c9, 0x3644, 0x3909, 0x307a, 0x3827, 0x3ae1, 0x38a0, 0x3ac1, 0x3bac, 0x3b31, 0x3a58, 0x217b, 0x3a9d, 0x3519, 0x3893, 0x3a17, 0x38aa, 0x3334, 0x3515, 0x3784, 0x3bbe, 0x3b54, 0x38de, 0x36bc, 0x31ab, 0x3acb, 0x3a5c, 0x3934, 0x3457, 0x2724, 0x39d0, 0x332c, 0x38ce, 0x3b4d, 0x391a, 0x354c, 0x3741, 0x2be2, 0x39e1, 0x3ad4, 0x3bf9, 0x2c7d, 0x2cfb, 0x3186, 0x2e4a, 0x3647, 0x3729, 0x37fe, 0x34e9, 0x3753, 0x39e2, 0x2c12, 0x3216, 0x3825, 0x341b, 0x271c, 0x36b3, 0x3bd8, -0x38bf, 0x3856, 0x39c0, 0x3b60, 0x3755, 0x3bd8, 0x3a87, 0x2cde, 0x37fd, 0x36f4, 0x3859, 0x38ff, 0x34f2, 0x302b, 0x3a1a, 0x31c6, 0x3998, 0x3ac2, 0x3872, 0x3b87, 0x352a, 0x39d2, 0x38a9, 0x3bc1, 0x3b63, 0x38fc, 0x3132, 0x3bb9, 0x3bcf, 0x2c64, 0x34f7, 0x3967, 0x2d54, 0x3a1f, 0x3466, 0x2c70, 0x3913, 0x3b00, 0x38d5, 0x3b0c, 0x2d8c, 0x32cf, 0x3201, 0x3b98, 0x3bc7, 0x2e2b, 0x2b75, 0x3b70, 0x338a, 0x3897, 0x34ec, 0x3b71, 0x3b2e, 0x3832, 0x2ea1, 0x3a9d, 0x354d, 0x3266, 0x3445, 0x3487, 0x3bbb, 0x3bdb, 0x3727, 0x39a3, -0x331b, 0x3bd7, 0x3bd5, 0x378e, 0x3319, 0x2c10, 0x2bd6, 0x3b36, 0x2dbd, 0x2aaf, 0x3155, 0x2da3, 0x288a, 0x36e2, 0x3ab6, 0x3a38, 0x3653, 0x3916, 0x3880, 0x3aaa, 0x2e8c, 0x37cd, 0x38b1, 0x3588, 0x382a, 0x3a6e, 0x3551, 0x39d5, 0x2b49, 0x3bb0, 0x3ba3, 0x38a1, 0x38b0, 0x345c, 0x303c, 0x33e5, 0x31f6, 0x396b, 0x2ef3, 0x3bc1, 0x356f, 0x3467, 0x3b2e, 0x39db, 0x3635, 0x2980, 0x3b5f, 0x3443, 0x387d, 0x3948, 0x3a84, 0x3127, 0x399e, 0x35c8, 0x3b22, 0x3696, 0x336c, 0x3acc, 0x38c1, 0x34b5, 0x3039, 0x36ac, 0x3a92, 0x3a3b, -0x370c, 0x3297, 0x39af, 0x2f5f, 0x3854, 0x3b42, 0x3a92, 0x3002, 0x3a9a, 0x365c, 0x3110, 0x2c8d, 0x3b95, 0x3ba7, 0x3bb4, 0x339f, 0x3982, 0x3b30, 0x30e2, 0x34b3, 0x38c5, 0x34f0, 0x2c49, 0x2bed, 0x33e1, 0x3571, 0x3a9c, 0x38fa, 0x3b36, 0x39ca, 0x3890, 0x2f8a, 0x3a92, 0x33fb, 0x2e28, 0x38fb, 0x381d, 0x34c9, 0x2a9c, 0x3754, 0x395d, 0x3821, 0x2b53, 0x1f32, 0x39d6, 0x3a4a, 0x3967, 0x3962, 0x343d, 0x3718, 0x3448, 0x32b2, 0x32f5, 0x3a8e, 0x3adb, 0x3a95, 0x30de, 0x22a1, 0x331c, 0x341d, 0x272b, 0x302a, 0x30f3, 0x305c, -0x3b8d, 0x39fa, 0x2f48, 0x395a, 0x37bf, 0x3767, 0x36cb, 0x39f8, 0x395b, 0x399e, 0x39bd, 0x3a3f, 0x3bc8, 0x3bd8, 0x360c, 0x3b70, 0x3b7a, 0x3be9, 0x35ed, 0x361f, 0x303f, 0x3afd, 0x3452, 0x3ab3, 0x348a, 0x3760, 0x3628, 0x392a, 0x3039, 0x33c8, 0x2af5, 0x389f, 0x34b2, 0x2497, 0x3ae0, 0x35a9, 0x3759, 0x3a13, 0x383c, 0x38e7, 0x3232, 0x2d3c, 0x3aae, 0x3211, 0x397e, 0x374c, 0x3060, 0x2d74, 0x29b5, 0x3937, 0x2ed0, 0x3a76, 0x3acc, 0x3658, 0x372c, 0x34c8, 0x3aab, 0x36c6, 0x32ee, 0x3a0d, 0x2ddc, 0x3730, 0x38ee, 0x2841, -0x317f, 0x360d, 0x3a2a, 0x388a, 0x3b33, 0x30e3, 0x3b9e, 0x3a6b, 0x345c, 0x36ae, 0x3b1e, 0x3107, 0x347f, 0x3b7d, 0x38d7, 0x3815, 0x3a0b, 0x36e9, 0x3bbc, 0x3124, 0x3b17, 0x390d, 0x286a, 0x3625, 0x383a, 0x2813, 0x3aed, 0x365a, 0x1e11, 0x3be7, 0x34cf, 0x3a56, 0x3856, 0x3af5, 0x39ff, 0x383d, 0x33b8, 0x3a9a, 0x36f4, 0x2df6, 0x3b48, 0x2fd6, 0x2a61, 0x3675, 0x2e35, 0x3a43, 0x3a57, 0x352b, 0x30b7, 0x2d22, 0x3768, 0x347f, 0x3874, 0x3b90, 0x30c4, 0x3a13, 0x3293, 0x2c06, 0x2293, 0x3414, 0x35d9, 0x3b43, 0x3154, 0x27b4, -0x3a09, 0x39d8, 0x366d, 0x3a02, 0x37fa, 0x3306, 0x3837, 0x37ee, 0x30e8, 0x3a91, 0x388d, 0x3933, 0x39c7, 0x30ef, 0x3962, 0x36bb, 0x2961, 0x3868, 0x34c5, 0x3a6c, 0x30ab, 0x34b9, 0x3bab, 0x39e1, 0x3669, 0x338c, 0x32fc, 0x39b4, 0x37f3, 0x39ba, 0x3619, 0x2e01, 0x3901, 0x331d, 0x366f, 0x3c00, 0x3718, 0x389e, 0x38b9, 0x2c69, 0x3839, 0x3abc, 0x388a, 0x3a02, 0x36cf, 0x3ad6, 0x3bbd, 0x35a5, 0x3b33, 0x3827, 0x368d, 0x3abf, 0x3968, 0x359c, 0x307f, 0x31b2, 0x38e7, 0x3b34, 0x3a6b, 0x38aa, 0x386e, 0x3973, 0x3623, 0x3503, -0x3660, 0x345b, 0x3978, 0x3ba2, 0x338f, 0x3a8c, 0x32fa, 0x26ff, 0x3bca, 0x3baf, 0x388a, 0x3b02, 0x3818, 0x3856, 0x37a9, 0x28d4, 0x311b, 0x3a90, 0x27ba, 0x3b29, 0x3693, 0x3211, 0x2fe8, 0x341c, 0x2d6c, 0x30cf, 0x3a46, 0x3a6a, 0x36e5, 0x3a30, 0x3804, 0x32af, 0x3b29, 0x1168, 0x3a46, 0x382e, 0x3117, 0x3a01, 0x3b4a, 0x2dfd, 0x3b41, 0x3a63, 0x36d3, 0x3b8e, 0x3be4, 0x27c8, 0x35de, 0x3ae8, 0x304f, 0x3894, 0x3641, 0x33bb, 0x2edd, 0x32e6, 0x39f2, 0x3820, 0x3944, 0x2f14, 0x3864, 0x3ac4, 0x3ad8, 0x34d9, 0x38de, 0x3561, -0x3a28, 0x372c, 0x3950, 0x3837, 0x3472, 0x3aec, 0x3a2c, 0x38e1, 0x3a27, 0x359d, 0x2f52, 0x35f9, 0x361d, 0x35fb, 0x3bda, 0x3655, 0x359c, 0x2ef6, 0x3b96, 0x2c41, 0x3816, 0x35f9, 0x3857, 0x1c3b, 0x3aa6, 0x3a08, 0x365d, 0x3406, 0x3544, 0x3b6a, 0x386e, 0x3bf3, 0x3526, 0x36a1, 0x2f31, 0x380a, 0x372f, 0x357a, 0x3a3c, 0x2d45, 0x35fd, 0x1ac3, 0x385d, 0x31f4, 0x2a80, 0x3853, 0x3b32, 0x3991, 0x3b13, 0x36f7, 0x3aa6, 0x38c7, 0x3122, 0x3a49, 0x26c8, 0x39f2, 0x2cb5, 0x3872, 0x3b75, 0x37ff, 0x2e43, 0x2647, 0x3b15, 0x3a4e, -0x36dd, 0x3925, 0x24fb, 0x30ed, 0x31ed, 0x337a, 0x33ca, 0x3139, 0x3a8d, 0x3b21, 0x3aee, 0x3a2b, 0x3351, 0x3a13, 0x3693, 0x3a21, 0x3979, 0x31ab, 0x345d, 0x3994, 0x3b48, 0x380b, 0x3b13, 0x3993, 0x386c, 0x3751, 0x39bc, 0x3114, 0x2cd9, 0x2f90, 0x3bf5, 0x2fff, 0x37ef, 0x3562, 0x3acf, 0x3aeb, 0x3bc4, 0x3406, 0x297f, 0x3b75, 0x3ac7, 0x3a33, 0x395b, 0x15ab, 0x384f, 0x3877, 0x31b5, 0x3bd3, 0x3a7c, 0x3850, 0x3535, 0x3690, 0x3880, 0x38b9, 0x3555, 0x3ada, 0x3beb, 0x3bcb, 0x30cf, 0x32ec, 0x3181, 0x3a79, 0x3b65, 0x383c, -0x370d, 0x3b64, 0x3b26, 0x2ea8, 0x3a5e, 0x3474, 0x34b3, 0x3aa3, 0x2e62, 0x3b3c, 0x395d, 0x3a0c, 0x3788, 0x3254, 0x3160, 0x34d5, 0x39c3, 0x39a1, 0x38ef, 0x2e85, 0x3923, 0x39ec, 0x38da, 0x397b, 0x38d8, 0x3919, 0x3a6c, 0x2aa3, 0x3acc, 0x346a, 0x36d0, 0x3b5b, 0x3202, 0x3af3, 0x3713, 0x2262, 0x2c8f, 0x34cc, 0x30b5, 0x344b, 0x3a48, 0x3855, 0x33d1, 0x3972, 0x3ab2, 0x363d, 0x382f, 0x30ed, 0x3a54, 0x39be, 0x381f, 0x3443, 0x3952, 0x37d9, 0x3a56, 0x3bd8, 0x2cae, 0x3617, 0x27f2, 0x3a59, 0x3ab2, 0x30db, 0x358a, 0x394e, -0x3731, 0x34e7, 0x33c2, 0x340e, 0x3b5d, 0x3be3, 0x3800, 0x3818, 0x3394, 0x32e8, 0x37d6, 0x342e, 0x3a47, 0x33bc, 0x39fe, 0x3b3d, 0x3834, 0x3034, 0x33dc, 0x2dbd, 0x3524, 0x3b68, 0x319e, 0x3551, 0x3a33, 0x3927, 0x3889, 0x3a3d, 0x35fe, 0x384d, 0x3607, 0x3246, 0x39f4, 0x3230, 0x3baa, 0x3023, 0x3be2, 0x270e, 0x3904, 0x3875, 0x318b, 0x3485, 0x2af3, 0x39ac, 0x3a5d, 0x386a, 0x3861, 0x34a1, 0x3a3c, 0x3bd2, 0x37d6, 0x234f, 0x3535, 0x2d10, 0x30ec, 0x3391, 0x3490, 0x3665, 0x3b33, 0x2cae, 0x3b86, 0x3a77, 0x3a6d, 0x2606, -0x3b3e, 0x3678, 0x3994, 0x3670, 0x284d, 0x338a, 0x363c, 0x38b7, 0x1eb8, 0x392f, 0x3b20, 0x342f, 0x3b77, 0x385e, 0x3867, 0x3a83, 0x3a5e, 0x30f7, 0x3580, 0x3773, 0x3831, 0x3b4c, 0x397d, 0x3b67, 0x3756, 0x385d, 0x3019, 0x38f7, 0x3834, 0x3262, 0x3ae0, 0x3bc3, 0x25d9, 0x3421, 0x3b51, 0x3935, 0x2e27, 0x34fe, 0x3bb4, 0x2882, 0x39fd, 0x36d1, 0x29e4, 0x32fb, 0x3937, 0x36a9, 0x375c, 0x3a0d, 0x3826, 0x3b2b, 0x332f, 0x3a92, 0x328f, 0x365d, 0x376c, 0x38e2, 0x3b2c, 0x348c, 0x312a, 0x2c9b, 0x3a6c, 0x3b0c, 0x358e, 0x3a26, -0x3b0e, 0x2fcb, 0x3360, 0x325b, 0x35ee, 0x360b, 0x3b5f, 0x3598, 0x31c8, 0x3ad2, 0x398a, 0x2c7f, 0x2bdf, 0x37ef, 0x3933, 0x3840, 0x36fb, 0x37d2, 0x3631, 0x3932, 0x3423, 0x3b0a, 0x3736, 0x2fce, 0x3462, 0x3a7c, 0x3446, 0x324c, 0x36e7, 0x2c2b, 0x35d9, 0x372d, 0x329d, 0x3900, 0x313d, 0x3be1, 0x39fc, 0x3969, 0x3bcf, 0x3bcb, 0x3883, 0x31e7, 0x3009, 0x380b, 0x3a4a, 0x2641, 0x3868, 0x390d, 0x373e, 0x3954, 0x3664, 0x3226, 0x3a82, 0x3a1b, 0x34d8, 0x2a59, 0x3457, 0x31bd, 0x35b9, 0x32a3, 0x38d9, 0x39d8, 0x2484, 0x31f4, -0x3734, 0x3a15, 0x38e2, 0x35b1, 0x397a, 0x31f2, 0x3669, 0x3502, 0x2e64, 0x3bd7, 0x3bf4, 0x3b39, 0x3774, 0x3809, 0x34b3, 0x3a3d, 0x364c, 0x3658, 0x388d, 0x3a5f, 0x386e, 0x39ba, 0x3917, 0x385b, 0x3990, 0x3782, 0x399a, 0x3077, 0x3932, 0x3765, 0x3484, 0x3ba4, 0x3111, 0x3ae7, 0x384a, 0x38ed, 0x3921, 0x2e50, 0x3af8, 0x2c79, 0x3967, 0x35c2, 0x3257, 0x3355, 0x3512, 0x3b09, 0x3a2b, 0x38db, 0x3282, 0x39b2, 0x3a11, 0x3b5b, 0x3124, 0x3072, 0x2581, 0x37c1, 0x3868, 0x388a, 0x3b1f, 0x3867, 0x304a, 0x391c, 0x3a69, 0x3496, -0x3ad3, 0x3ad8, 0x3b55, 0x3540, 0x3a99, 0x2fcb, 0x3a50, 0x3a9b, 0x2c06, 0x3547, 0x3841, 0x338d, 0x27bd, 0x2fdc, 0x3a40, 0x39ab, 0x305e, 0x3816, 0x3b18, 0x2c0f, 0x3ac2, 0x3b9a, 0x36e3, 0x3912, 0x38f0, 0x3b5a, 0x3583, 0x3a2f, 0x3805, 0x381c, 0x389b, 0x39bc, 0x3939, 0x3062, 0x3981, 0x39c5, 0x2fe2, 0x3a83, 0x2fd7, 0x399e, 0x309d, 0x3bd9, 0x3847, 0x37cb, 0x3855, 0x2e0c, 0x385f, 0x3a90, 0x3837, 0x3569, 0x39a7, 0x35cf, 0x3aab, 0x3998, 0x3903, 0x3857, 0x3a05, 0x3b11, 0x35dc, 0x31ef, 0x36d3, 0x3a6b, 0x39cd, 0x316e, -0x2a9b, 0x3522, 0x3a61, 0x3948, 0x32aa, 0x3940, 0x35b2, 0x38b8, 0x25c7, 0x38e3, 0x38c3, 0x3592, 0x26ee, 0x37c4, 0x3064, 0x3a9f, 0x36f9, 0x3669, 0x36b9, 0x2d38, 0x38bc, 0x361b, 0x3b45, 0x3a97, 0x3964, 0x3157, 0x26c0, 0x3bd1, 0x27a7, 0x2bcd, 0x3455, 0x39c8, 0x37cb, 0x2b98, 0x3a97, 0x3773, 0x2efc, 0x307c, 0x3510, 0x3a33, 0x3806, 0x35a2, 0x3b28, 0x38f9, 0x3bc2, 0x36db, 0x3aa1, 0x3ac3, 0x31aa, 0x3a3d, 0x3ac3, 0x3b73, 0x31d5, 0x38f8, 0x303b, 0x3929, 0x38eb, 0x3a91, 0x3885, 0x3a64, 0x36bc, 0x381f, 0x36b3, 0x3846, -0x38d4, 0x3a0a, 0x389f, 0x2c1e, 0x31ca, 0x3934, 0x31b2, 0x378d, 0x2d09, 0x3bed, 0x39ca, 0x3ae0, 0x36a7, 0x2814, 0x391e, 0x3a62, 0x3bca, 0x381c, 0x34b6, 0x38ec, 0x3920, 0x3830, 0x39fc, 0x3911, 0x3a42, 0x3372, 0x375b, 0x312b, 0x3604, 0x2ea4, 0x3367, 0x36fd, 0x2dd9, 0x366c, 0x3054, 0x3749, 0x29ac, 0x37de, 0x39bb, 0x34d5, 0x2e7d, 0x39e9, 0x19c6, 0x3a9a, 0x3bbb, 0x33a5, 0x3556, 0x38a2, 0x3bfb, 0x3b91, 0x39fa, 0x3aaf, 0x38a7, 0x38b6, 0x285c, 0x3820, 0x2ef2, 0x25f9, 0x3ab0, 0x3bc7, 0x3457, 0x352f, 0x38e2, 0x31aa, -0x283d, 0x3728, 0x33fe, 0x2d40, 0x2e06, 0x389f, 0x3b2f, 0x3ad4, 0x39b4, 0x36be, 0x3837, 0x351a, 0x3bb6, 0x3971, 0x3a47, 0x3758, 0x3572, 0x31aa, 0x2825, 0x375c, 0x344f, 0x3b7e, 0x391b, 0x32b3, 0x3119, 0x23d5, 0x305d, 0x361b, 0x380b, 0x28d4, 0x39f8, 0x3bd2, 0x383b, 0x39e9, 0x3a81, 0x214f, 0x31a6, 0x3645, 0x38c1, 0x38e1, 0x32f6, 0x385d, 0x357a, 0x35a7, 0x388a, 0x3ba7, 0x23fb, 0x3853, 0x39db, 0x342d, 0x32fe, 0x3ac4, 0x3b82, 0x3709, 0x35f2, 0x3864, 0x3b71, 0x344f, 0x38be, 0x3b12, 0x34df, 0x34fe, 0x3715, 0x3864, -0x3968, 0x354c, 0x2af1, 0x39d4, 0x3b53, 0x39f3, 0x3776, 0x387f, 0x3711, 0x3b77, 0x3565, 0x3aa9, 0x3a99, 0x35f2, 0x369a, 0x3b29, 0x3811, 0x314b, 0x37f4, 0x3ad5, 0x3753, 0x3ab4, 0x399e, 0x3b00, 0x2dcc, 0x3a9f, 0x3307, 0x34b4, 0x3ad7, 0x38e8, 0x396a, 0x32af, 0x3886, 0x36e6, 0x3429, 0x377d, 0x3212, 0x3afb, 0x257b, 0x3b85, 0x3b80, 0x3b0e, 0x2b3e, 0x3ae1, 0x331a, 0x3890, 0x372d, 0x3425, 0x32eb, 0x35af, 0x3a18, 0x39a0, 0x3908, 0x317a, 0x388b, 0x2eb6, 0x3993, 0x341e, 0x353d, 0x37cc, 0x357d, 0x3ad0, 0x3bee, 0x362e, -0x343a, 0x372b, 0x3a97, 0x3aea, 0x3bfd, 0x3800, 0x34f0, 0x38ad, 0x2e3e, 0x38e7, 0x393e, 0x35a4, 0x382a, 0x37a0, 0x3bc7, 0x391f, 0x3212, 0x3aae, 0x23cf, 0x3683, 0x3983, 0x3361, 0x3995, 0x3a38, 0x36cf, 0x3833, 0x3667, 0x3ac7, 0x3acc, 0x3673, 0x33e3, 0x38de, 0x358d, 0x3ba9, 0x3741, 0x3127, 0x3a48, 0x3b39, 0x34c6, 0x38cb, 0x3474, 0x3be7, 0x214f, 0x2ddc, 0x392c, 0x3589, 0x3836, 0x3920, 0x3be0, 0x3651, 0x35a1, 0x3902, 0x2cf1, 0x3b6a, 0x38ff, 0x2c2a, 0x3b70, 0x372b, 0x3846, 0x3ab3, 0x38c4, 0x3298, 0x38ba, 0x35e2, -0x313f, 0x32a2, 0x3943, 0x34d2, 0x3a36, 0x38a4, 0x3870, 0x3980, 0x3aa3, 0x37e9, 0x37d8, 0x38d4, 0x3a5d, 0x3bfa, 0x39c1, 0x3a2d, 0x3514, 0x3961, 0x3a4e, 0x3b79, 0x1ddb, 0x3977, 0x38a0, 0x3989, 0x3752, 0x302f, 0x3b50, 0x345d, 0x32c4, 0x3ba1, 0x3919, 0x3b79, 0x319b, 0x38ec, 0x39c2, 0x390f, 0x371a, 0x2b0d, 0x2a69, 0x3b72, 0x3b9f, 0x341d, 0x30e6, 0x359a, 0x3867, 0x39bd, 0x36dc, 0x3b62, 0x3154, 0x380b, 0x3476, 0x2c40, 0x3b50, 0x39a0, 0x3190, 0x3a41, 0x2ed9, 0x2eae, 0xcf0, 0x2afe, 0x39a8, 0x36ee, 0x34a0, 0x3a0f, -0x3bf8, 0x3a91, 0x38cd, 0x3a3e, 0x3a26, 0x2528, 0x3ad3, 0x3662, 0x3226, 0x3b2e, 0x332f, 0x323e, 0x394c, 0x3097, 0x2902, 0x3823, 0x293c, 0x37f2, 0x38c9, 0x3400, 0x39e5, 0x333b, 0x39fc, 0x384a, 0x3955, 0x308e, 0x3796, 0x374a, 0x306c, 0x30fa, 0x30ee, 0x1f55, 0x34e7, 0x3875, 0x2bc5, 0x3bfa, 0x3635, 0x38e5, 0x3a70, 0x3b49, 0x3988, 0x3b8c, 0x3a98, 0x3a78, 0x3bfb, 0x3333, 0x3b58, 0x3bd6, 0x3b93, 0x2ef1, 0x3822, 0x34ab, 0x35c6, 0x384a, 0x34db, 0x3a80, 0x2e05, 0x3ac1, 0x3845, 0x2bd9, 0x3896, 0x288b, 0x38b7, 0x3556, -0x3095, 0x2c4e, 0x3502, 0x38d5, 0x2c00, 0x34bb, 0x2d06, 0x3b03, 0x28de, 0x3b8b, 0x362a, 0x3642, 0x3946, 0x3567, 0x3695, 0x39b6, 0x3ae9, 0x3bd9, 0x398d, 0x33e3, 0x381e, 0x3981, 0x3553, 0x35f9, 0x3499, 0x38b5, 0x3866, 0x298e, 0x38dd, 0x3a7b, 0x3559, 0x34e5, 0x3a6a, 0x336f, 0x30f1, 0x35bb, 0x3957, 0x3bf8, 0x3a56, 0x3bb5, 0x3b3a, 0x3767, 0x3828, 0x3700, 0x3bda, 0x388a, 0x391c, 0x3937, 0x3664, 0x382a, 0x37de, 0x2d27, 0x3b6d, 0x3303, 0x3828, 0x3b49, 0x3882, 0x380f, 0x3b93, 0x318a, 0x33bc, 0x3907, 0x2dbe, 0x3883, -0x3511, 0x2feb, 0x3a76, 0x359c, 0x39c5, 0x3967, 0x3177, 0x314e, 0x3ad7, 0x33a3, 0x3ae2, 0x3932, 0x27cb, 0x33da, 0x35ad, 0x2c80, 0x369b, 0x3636, 0xdca, 0x2d01, 0x302c, 0x3950, 0x35d9, 0x3549, 0x3aee, 0x397e, 0x2dfa, 0x3897, 0x30a8, 0x3a71, 0x3a43, 0x3274, 0x2ec3, 0x3bfc, 0x3ac6, 0x3b9d, 0x3b83, 0x3a01, 0x3b46, 0x32be, 0x3647, 0x35c0, 0x3a99, 0x3515, 0x3011, 0x3a99, 0x3832, 0x3737, 0xace, 0x303d, 0x3aec, 0x345e, 0x383f, 0x3a7d, 0x2ec5, 0x39ef, 0x3847, 0x3409, 0x3571, 0x32e0, 0x377d, 0x36d9, 0x3959, 0x2881, -0x32d2, 0x35e3, 0x3ab7, 0x343f, 0x36ee, 0x30d5, 0x3615, 0x31b5, 0x3a0d, 0x378f, 0x2bbd, 0x28e1, 0x37be, 0x3ad5, 0x261b, 0x3b86, 0x3470, 0x2f2e, 0x3b44, 0x39a7, 0x3606, 0x38db, 0x3579, 0x3bcd, 0x3291, 0x381c, 0x34f3, 0x39f2, 0x39c1, 0x39e7, 0x39b3, 0x3667, 0x3001, 0x1483, 0x3888, 0x3962, 0x3719, 0x393f, 0x3a52, 0x37a4, 0x39f1, 0x3b7d, 0x392d, 0x35d8, 0x3b07, 0x3bd5, 0x3946, 0x3a2a, 0x2f68, 0x2e11, 0x3771, 0x384f, 0x3612, 0x3bbf, 0x396a, 0x3585, 0x35df, 0x2dc9, 0x3a61, 0x3481, 0x399d, 0x37c4, 0x2fa8, 0x39eb, -0x2991, 0x2f7a, 0x3adf, 0x3b3d, 0x2f02, 0x39e6, 0x3961, 0x398f, 0x3585, 0x2d8f, 0x39c7, 0x2e85, 0x319e, 0x3872, 0x3aed, 0x3826, 0x342b, 0x3ad7, 0x25e2, 0x3bc6, 0x326e, 0x3299, 0x28ef, 0x38e9, 0x3a65, 0x28d7, 0x2098, 0x2481, 0x36f5, 0x3905, 0x3250, 0x389d, 0x24ad, 0x3462, 0x320f, 0x3a33, 0x3a28, 0x3998, 0x3a01, 0x38ed, 0x39e9, 0x3884, 0x38ea, 0x35b5, 0x316a, 0x35ac, 0x35c7, 0x34b7, 0x392e, 0x38b1, 0x29cd, 0x35f4, 0x393b, 0x3a3b, 0x3010, 0x3810, 0x3b82, 0x356c, 0x362c, 0x39bb, 0x39e9, 0x32c1, 0x2fb4, 0x37b3, -0x3ac0, 0x32d7, 0x38d4, 0x35f4, 0x3b9e, 0x2d3c, 0x3b23, 0x2c8d, 0x31f8, 0x3681, 0x35f4, 0x3693, 0x34aa, 0x386f, 0x3bb2, 0x39b5, 0x30a1, 0x3a9b, 0x38ca, 0x39c0, 0x3ab5, 0x37a4, 0x3b86, 0x3bac, 0x3478, 0x38b7, 0x3bd0, 0x3b9b, 0x32b8, 0x37cb, 0x3955, 0x3a94, 0x38c2, 0x3a90, 0x3a96, 0x3948, 0x2cd9, 0x381f, 0x3bf1, 0x3820, 0x2d95, 0x3a8f, 0x37b1, 0x2d54, 0x38f7, 0x3807, 0x30ca, 0x3b3b, 0x3764, 0x3465, 0x3693, 0x3747, 0x391c, 0x37fa, 0x3295, 0x2974, 0x29b4, 0x3342, 0x32ba, 0x39a3, 0x37f2, 0x2e0e, 0x2f6c, 0x3bc3, -0x3690, 0x2caa, 0x34f9, 0x2eaf, 0x2c64, 0x3194, 0x3b90, 0x3716, 0x3958, 0x3310, 0x24ff, 0x35f2, 0x3888, 0x3745, 0x363b, 0x39b9, 0x36cc, 0x395d, 0x2dc7, 0x37c0, 0x3b1c, 0x3750, 0x3680, 0x38ea, 0x38c8, 0x3a65, 0x355b, 0x3b33, 0x3965, 0x359d, 0x3a5c, 0x3686, 0x3ac2, 0x3b46, 0x3b71, 0x27fe, 0x397d, 0x36d5, 0x3810, 0x341e, 0x394f, 0x3a0c, 0x39cd, 0x3794, 0x3aed, 0x3596, 0x2ce8, 0x3172, 0x3023, 0x3ab0, 0x3b9b, 0x3439, 0x3111, 0x3771, 0x3807, 0x356e, 0x2c3b, 0x3bd9, 0x39a0, 0x366a, 0x388f, 0x2461, 0x3b4a, 0x3895, -0x39b4, 0x35fb, 0x33c2, 0x36bb, 0x3823, 0x2fac, 0x39ef, 0x35e1, 0x3872, 0x370d, 0x3ac4, 0x323d, 0x39ee, 0x3be5, 0x325a, 0x39ec, 0x3800, 0x397d, 0x373f, 0x373e, 0x38e4, 0x3ad5, 0x301c, 0x3201, 0x3a42, 0x3617, 0x3a05, 0x3999, 0x32bd, 0x2d5d, 0x3a09, 0x3423, 0x3ac0, 0x3bc9, 0x3b5d, 0x3ad7, 0x30c8, 0x3b71, 0x3471, 0x3bbc, 0x2deb, 0x2c18, 0x346f, 0x2a5e, 0x365b, 0x39ea, 0x3b52, 0x349a, 0x38a1, 0x39f3, 0x3384, 0x3b58, 0x3b6c, 0x34c4, 0x2dde, 0x3b00, 0x3844, 0x389b, 0x385d, 0x35cf, 0x364a, 0x37f0, 0x3216, 0x3b8f, -0x3539, 0x36c6, 0x30bc, 0x2e04, 0x3741, 0x2f7b, 0x3842, 0x38c0, 0x36c7, 0x3ada, 0x374d, 0x35c3, 0x327c, 0x379c, 0x3998, 0x349d, 0x2ef4, 0x35e8, 0x2ad0, 0x3912, 0x3aa7, 0x3ba9, 0x3963, 0x39b2, 0x38f7, 0x2633, 0x38cd, 0x3a42, 0x3213, 0x35fd, 0x31e7, 0x3919, 0x3b5e, 0x3bb9, 0x3a85, 0x3bfd, 0x1d27, 0x3601, 0x378c, 0x2e32, 0x3990, 0x35ea, 0x39bf, 0x3a33, 0x38a4, 0x392c, 0x39d2, 0x3aff, 0x3b29, 0x3a3d, 0x2cda, 0x2a0b, 0x3232, 0x3b76, 0x2845, 0x3a9c, 0x340e, 0x399f, 0x30d9, 0x38dc, 0x37f2, 0x36f6, 0x38de, 0x3a3e, -0x3814, 0x37a6, 0x30e6, 0x3206, 0x2c05, 0x3bf9, 0x3b8c, 0x3aa5, 0x39b6, 0x39a8, 0x3890, 0x346c, 0x38f7, 0x35e1, 0x38c0, 0x358c, 0x2602, 0x3067, 0x36bf, 0x2f50, 0x3a41, 0x38d3, 0x3b34, 0x3286, 0x315d, 0x3938, 0x3074, 0x3b53, 0x34d9, 0x31b3, 0x388c, 0x1842, 0x3a53, 0x371d, 0x3922, 0x3afd, 0x385d, 0x3b95, 0x3646, 0x3821, 0x2c51, 0x3834, 0x3bac, 0x3431, 0x3b59, 0x388c, 0x2a55, 0x3535, 0x2d62, 0x3557, 0x383e, 0x3079, 0x3333, 0x3a09, 0x32e4, 0x37c3, 0x358e, 0x39f8, 0x3b29, 0x38a4, 0x3bc9, 0x390a, 0x3868, 0x38e5, -0x3411, 0x2759, 0x364f, 0x38e1, 0x3b55, 0x3102, 0x3b07, 0x3bec, 0x39c2, 0x3060, 0x323f, 0x3a0c, 0x373c, 0x3a35, 0x35af, 0x39a1, 0x2431, 0x2ef7, 0x35b6, 0x38fa, 0x3a7a, 0x3412, 0x3717, 0x3713, 0x34b0, 0x319b, 0x3bbc, 0x3426, 0x3ab3, 0x3615, 0x3ad1, 0x3831, 0x38c4, 0x30a3, 0x3483, 0x38d7, 0x36c0, 0x33fc, 0x3b94, 0x3601, 0x375f, 0x38f0, 0x317d, 0x39e2, 0x3730, 0x3872, 0x37e5, 0x3a1d, 0x3a7a, 0x3a60, 0x39a9, 0x380f, 0x35c8, 0x359f, 0x3bcf, 0x38b0, 0x32f3, 0x2c41, 0x3ad3, 0x394a, 0x3bea, 0x2fab, 0x3892, 0x3aec, -0x3684, 0x38a4, 0x38ae, 0x2f79, 0x3362, 0x35ae, 0x334e, 0x2f11, 0x3b7e, 0x36c8, 0x3b34, 0x3802, 0x311b, 0x32a5, 0x3a77, 0x38f7, 0x3611, 0x3841, 0x3888, 0x36b5, 0x32cd, 0x3930, 0x3bf4, 0x3956, 0x3469, 0x3bb2, 0x3add, 0x3bd1, 0x3a15, 0x39d4, 0x3b47, 0x3a69, 0x382c, 0x3b44, 0x37d2, 0x1e90, 0x3b19, 0x39ca, 0x3176, 0x38a1, 0x3958, 0x38c1, 0x3361, 0x3268, 0x371f, 0x37e5, 0x39fb, 0x3501, 0x39b9, 0x39c9, 0x3885, 0x3a56, 0x3913, 0x3838, 0x3be9, 0x3150, 0x37b4, 0x2f1b, 0x350c, 0x2a90, 0x3886, 0x2823, 0x2d33, 0x3867, -0x341f, 0x3939, 0x3771, 0x3794, 0x3910, 0x3a31, 0x3953, 0x3b16, 0x3a73, 0x3aa2, 0x3a97, 0x3b3d, 0x3473, 0x3881, 0x3a44, 0x333e, 0x374b, 0x35cc, 0x3a3d, 0x3118, 0x2849, 0x3a11, 0x3855, 0x3a24, 0x3a77, 0x3a97, 0x3807, 0x355a, 0x3a46, 0x3947, 0x3869, 0x394a, 0x34c5, 0x384f, 0x34c3, 0x36e4, 0x3597, 0x2cc3, 0x222a, 0x3adc, 0x3738, 0x378f, 0x390e, 0x3b9b, 0x3395, 0x3618, 0x31cb, 0x388a, 0x37a2, 0x39d2, 0x3739, 0x31b6, 0x3abe, 0x2514, 0x38d8, 0x3860, 0x3b46, 0x2c61, 0x3b7a, 0x3bd3, 0x3bf0, 0x3222, 0x3094, 0x38cf, -0x3b4c, 0x34e3, 0x1ce4, 0x3079, 0x3799, 0x39cb, 0x37cc, 0x31d5, 0x3477, 0x39be, 0x3b37, 0x3338, 0x37fb, 0x3a19, 0x3a68, 0x39c5, 0x32df, 0x315c, 0x320d, 0x3636, 0x372b, 0x3504, 0x3742, 0x3a80, 0x3b24, 0x25de, 0x311d, 0x3b59, 0x3743, 0x3082, 0x3436, 0x3a84, 0x3462, 0x3a6c, 0x2415, 0x3705, 0x2c28, 0x3154, 0x3381, 0x34c3, 0x3adb, 0x3973, 0x3a99, 0x2f42, 0x3a9c, 0x3be1, 0x378b, 0x3428, 0x3800, 0x2882, 0x39d6, 0x3819, 0x2e08, 0x33c3, 0x38fe, 0x2db3, 0x3be8, 0x381c, 0x3825, 0x390f, 0x237d, 0x3b46, 0x27d1, 0x3889, -0x3a43, 0x3650, 0x35f1, 0x3a5a, 0x34e3, 0x387d, 0x2d00, 0x38f8, 0x37b4, 0x383d, 0x373b, 0x3794, 0x38ab, 0x35e6, 0x31fc, 0x3493, 0x3597, 0x38af, 0x3621, 0x3519, 0x3bb1, 0x33e4, 0x3782, 0x34a8, 0x2e0b, 0x2db5, 0x377f, 0x33e5, 0x399f, 0x2875, 0x3582, 0x3be0, 0x3452, 0x3193, 0x3942, 0x3ad2, 0x36d2, 0x3b5a, 0x34fe, 0x2a81, 0x39fd, 0x38ea, 0x3aac, 0x3b11, 0x3423, 0x3724, 0x3a27, 0x340a, 0x398b, 0x354f, 0x2e4d, 0x35c8, 0x2d73, 0x3a44, 0x2b31, 0x31ec, 0x3aa2, 0x3b27, 0x3918, 0x34a5, 0x3b9c, 0x2ecb, 0x38b8, 0x2e4e, -0x3b9a, 0x3a36, 0x394a, 0x307a, 0x2859, 0x344c, 0x3b56, 0x3233, 0x381a, 0x3b75, 0x38c4, 0x386f, 0x350e, 0x2a77, 0x3ad8, 0x3ae6, 0x3743, 0x3426, 0x3448, 0x3470, 0x3584, 0x38fe, 0x37b1, 0x24b5, 0x2f68, 0x3481, 0x3bac, 0x3b8e, 0x354e, 0x390e, 0x3824, 0x3045, 0x3aca, 0x36a1, 0x3844, 0x39b9, 0x3a65, 0x3083, 0x318f, 0x3ba1, 0x3893, 0x341e, 0x3515, 0x2279, 0x352a, 0x3acb, 0x2e04, 0x38fc, 0x389c, 0x2d3f, 0x3363, 0x3a1a, 0x3ae5, 0x39d8, 0x3a9e, 0x3286, 0x3bd7, 0x38fa, 0x38ff, 0x2cfd, 0x390c, 0x3a2b, 0x2eec, 0x38f8, -0x3806, 0x3a36, 0x399c, 0x3643, 0x3aa8, 0x373c, 0x37fa, 0x2892, 0x3709, 0x38ae, 0x3800, 0x39ab, 0x381a, 0x2daa, 0x3306, 0x2c1a, 0x381d, 0x3aad, 0x354e, 0x30c0, 0x3b52, 0x39dc, 0x32b0, 0x30ae, 0x3bf8, 0x391c, 0x2bb5, 0x3316, 0x2283, 0x33c8, 0x38af, 0x3ab4, 0x314c, 0x39c1, 0x36bd, 0x34b1, 0x3b52, 0x322e, 0x36dd, 0x37f8, 0x37f1, 0x2173, 0x38e0, 0x29a8, 0x3a7a, 0x32ce, 0x39ce, 0x3836, 0x3213, 0x32a0, 0x3825, 0x2581, 0x3ab7, 0x36dd, 0x3934, 0x3a29, 0x394b, 0x3a52, 0x3819, 0x3949, 0x3297, 0x2860, 0x34f2, 0x35b6, -0x3b11, 0x33de, 0x3b82, 0x3b33, 0x3244, 0x3815, 0x3942, 0x3515, 0x3576, 0x2976, 0x3bda, 0x3929, 0x3976, 0x3949, 0x3ab3, 0x3057, 0x3bf0, 0x384e, 0x3adb, 0x3a6b, 0x33f1, 0x3a3d, 0x391a, 0x3511, 0x3926, 0x33b9, 0x3363, 0x39b6, 0x393f, 0x3ac1, 0x39d7, 0x34f7, 0x2c7a, 0x38d9, 0x295f, 0x3658, 0x39d1, 0x31be, 0x337c, 0x39ef, 0x3b76, 0x2820, 0x3a25, 0x39ff, 0x38da, 0x359c, 0x3556, 0x3b08, 0x300e, 0x3496, 0x2f77, 0x397e, 0x3357, 0x386b, 0x3890, 0x3886, 0x2baf, 0x32d4, 0x39cb, 0x3312, 0x3bb3, 0x3a33, 0x35be, 0x3831, -0x34ee, 0x32d2, 0x2a8e, 0x3bbf, 0x260a, 0x3012, 0x38a2, 0x380b, 0x39c6, 0x3098, 0x3aa8, 0x3b87, 0x39de, 0x3403, 0x34a4, 0x36a6, 0x3a1f, 0x3720, 0x2c49, 0x344c, 0x3b5e, 0x39db, 0x3807, 0x3b45, 0x3925, 0x3b31, 0x3b74, 0x365d, 0x3970, 0x3ba7, 0x3307, 0x3668, 0x3663, 0x3bbc, 0x3a2b, 0x3154, 0x39a5, 0x3aba, 0x2f5d, 0x3be1, 0x37d9, 0x31ce, 0x36f0, 0x340b, 0x3882, 0x2ec1, 0x38e5, 0x3bc6, 0x36c2, 0x37a6, 0x3542, 0x34dd, 0x2c0e, 0x38b8, 0x39c6, 0x3926, 0x381f, 0x33e4, 0x387b, 0x3771, 0x324b, 0x39d2, 0x2c2b, 0x3ad4, -0x38c9, 0x3b08, 0x2e59, 0x39ae, 0x27e6, 0x3907, 0x35b7, 0x2bbf, 0x38b5, 0x3a6a, 0x39c6, 0x3b6f, 0x3a94, 0x38aa, 0x303b, 0x3bc8, 0x348e, 0x3ae6, 0x386f, 0x3993, 0x34ec, 0x3bf1, 0x3860, 0x38d9, 0x3328, 0x3ad6, 0x3220, 0x38ed, 0x37f8, 0x30ac, 0x38a7, 0x2618, 0x3856, 0x30e6, 0x2edf, 0x38c9, 0x39a5, 0x2ca5, 0x2e15, 0x3af8, 0x324e, 0x33d2, 0x38fe, 0x33de, 0x3be1, 0x308a, 0x3957, 0x39a0, 0x3a9a, 0x3098, 0x336f, 0x33e8, 0x35c8, 0x3a64, 0x3a6b, 0x39dd, 0x3874, 0x28e0, 0x39e3, 0x3bc5, 0x3bda, 0x3b31, 0x397d, 0x3121, -0x35a3, 0x385a, 0x26fa, 0x3a6f, 0x3984, 0x39f9, 0x3651, 0x33f9, 0x3821, 0x3922, 0x39f4, 0x38b7, 0x34ec, 0x3bd3, 0x2c84, 0x28f3, 0x3906, 0x35c3, 0x392f, 0x31d9, 0x3982, 0x2f17, 0x3511, 0x3b7f, 0x399a, 0x3ab9, 0x2dec, 0x32a5, 0x31c9, 0x335b, 0x3695, 0x3562, 0x3172, 0x2f91, 0x3985, 0x32a0, 0x3ad3, 0x332a, 0x2c75, 0x2c0f, 0x3544, 0x168e, 0x36fd, 0x3308, 0x2d59, 0x3b64, 0x3844, 0x3a0a, 0x392f, 0x3a96, 0x30ed, 0x38d1, 0x3147, 0x3ad1, 0x3962, 0x3432, 0x3033, 0x36bf, 0x3b25, 0x3bdd, 0x3bea, 0x39a0, 0x38c9, 0x3b33, -0x2c08, 0x394a, 0x3bf5, 0x3910, 0x317b, 0x3b34, 0x3aa4, 0x3af1, 0x3abf, 0x3b98, 0x3bb1, 0x3621, 0x3ac2, 0x38f3, 0x3b91, 0x3378, 0x3763, 0x3b95, 0x3bad, 0x36b2, 0x3357, 0x384b, 0x395a, 0x3bab, 0x3024, 0x3ae5, 0x35b0, 0x31b3, 0x3421, 0x3a39, 0x34db, 0x38a1, 0x301e, 0x3587, 0x32f6, 0x342c, 0x3a95, 0x3726, 0x3719, 0x2cd2, 0x3a28, 0x399d, 0x388d, 0x39a0, 0x3abb, 0x3b3a, 0x2828, 0x39fb, 0x2f0a, 0x3931, 0x384c, 0x36a8, 0x3411, 0x3545, 0x2f7d, 0x3854, 0x30d4, 0x3acb, 0x3a73, 0x308f, 0x2010, 0x34df, 0x391f, 0x31f9, -0x32bd, 0x3a75, 0x381d, 0x3912, 0x394d, 0x3404, 0x38e8, 0x3a5b, 0x3a62, 0x3af0, 0x3a17, 0x39a3, 0x341a, 0x3332, 0x37cc, 0x3b2b, 0x367c, 0x38b2, 0x3663, 0x3b73, 0x3b2d, 0x3bf0, 0x35a5, 0x363b, 0x33be, 0x379b, 0x361e, 0x3918, 0x3ad9, 0x2a92, 0x3462, 0x2144, 0x2081, 0x3845, 0x326d, 0x3717, 0x3831, 0x3958, 0x3893, 0x32b4, 0x3a1e, 0x3aa2, 0x3487, 0x38b2, 0x32a0, 0x3a03, 0x3a70, 0x34c2, 0x365c, 0x3842, 0x38ad, 0x366f, 0x3a07, 0x37da, 0x30f2, 0x374d, 0x3a41, 0x3a7e, 0x33a9, 0x3166, 0x37d5, 0x3808, 0x3b70, 0x39b9, -0x3969, 0x3681, 0x2f53, 0x35b5, 0x31dc, 0x3bc2, 0x38b6, 0x2f39, 0x3999, 0x3b31, 0x331e, 0x388c, 0x3b5a, 0x39db, 0x3aaa, 0x39dd, 0x34d9, 0x34a4, 0x2f6a, 0x3822, 0x3a3f, 0x3ac5, 0x3a1c, 0x3518, 0x3337, 0x295b, 0x3b0e, 0x3af2, 0x3987, 0x20c4, 0x394c, 0x34e6, 0x380a, 0x3502, 0x1b82, 0x2c8a, 0x3425, 0x378a, 0x3bc8, 0x30c5, 0x391d, 0x34f8, 0x3af9, 0x3908, 0x38e0, 0x3bee, 0x3b38, 0x3a0b, 0x36ea, 0x2de6, 0x360d, 0x35bc, 0x395a, 0x3b3e, 0x3808, 0x38ef, 0x3804, 0x393f, 0x39af, 0x32d9, 0x3bc0, 0x39de, 0x330d, 0x383e, -0x3a63, 0x2c2e, 0x2f9c, 0x3308, 0x397c, 0x3aed, 0x3ad6, 0x336d, 0x3309, 0x2a59, 0x3a35, 0x3ab3, 0x3998, 0x3aec, 0x3633, 0x3b63, 0x3a28, 0x3bbe, 0x34d1, 0x377e, 0x332a, 0x3ae8, 0x3a18, 0x3a44, 0x3932, 0x3576, 0x3bc8, 0x3aef, 0x3bcb, 0x3898, 0x3916, 0x397e, 0x3332, 0x3b99, 0x38df, 0x38f1, 0x2e04, 0x3a33, 0x35ea, 0x31de, 0x1f39, 0x3911, 0x33b6, 0x3bb1, 0x3a21, 0x33e4, 0x354a, 0x2f83, 0x389e, 0x3357, 0x343e, 0x3af9, 0x35fd, 0x3810, 0x39e3, 0x38f6, 0x3632, 0x2e8d, 0x3340, 0x2b4c, 0x3b23, 0x3955, 0x32b4, 0x3670, -0x3633, 0x3b07, 0x3341, 0x3449, 0x35f2, 0x3ab9, 0x3379, 0x34d9, 0x393a, 0x3b47, 0x3764, 0x3bed, 0x3755, 0x3581, 0x3a94, 0x3b72, 0x35bb, 0x3ac4, 0x25a2, 0x3a4e, 0x32df, 0x3bf7, 0x3aa7, 0x38ff, 0x3848, 0x39c2, 0x3b40, 0x3984, 0x3a57, 0x19ab, 0x3b95, 0x1d5e, 0x3811, 0x37dd, 0x38bd, 0x2e92, 0x3835, 0x3972, 0x372e, 0x2d3a, 0x34a4, 0x3823, 0x3274, 0x31d8, 0x3898, 0x3756, 0x3786, 0x2c2c, 0x3b95, 0x3aff, 0x3272, 0x3866, 0x3881, 0x319c, 0x38c8, 0x3bbf, 0x33df, 0x3a86, 0x3188, 0x38d3, 0x38ea, 0x120b, 0x3abd, 0x2e02, -0x387b, 0x3860, 0x2883, 0x3a44, 0x33db, 0x38c8, 0x3be0, 0x3418, 0x397e, 0x3a52, 0x393b, 0x39f4, 0x3ad3, 0x2a7d, 0x37bd, 0x3af0, 0x3919, 0x3947, 0x3814, 0x37ee, 0x28fb, 0x387c, 0x36d2, 0x39b5, 0x3319, 0x3498, 0x329c, 0x3831, 0x35d5, 0x2a9e, 0x3a3d, 0x2f8d, 0x386f, 0x2e3b, 0x329c, 0x38be, 0x3b5a, 0x3a90, 0x33ae, 0x3982, 0x3b62, 0x39ae, 0x39ec, 0x3679, 0x3734, 0x3a0d, 0x3a24, 0x34ca, 0x38c2, 0x3987, 0x304e, 0x3990, 0x38d8, 0x3b86, 0x3abf, 0x3670, 0x3a6c, 0x2f99, 0x33a9, 0x3aba, 0x385f, 0x3a37, 0x3a6e, 0x3624, -0x32ff, 0x3a02, 0x33f6, 0x3a0f, 0x3563, 0x38f4, 0x38ba, 0x267e, 0x296d, 0x35fd, 0x3b89, 0x32bc, 0x3acf, 0x3904, 0x3a51, 0x3431, 0x2260, 0x388e, 0x37b1, 0x35c3, 0x35f9, 0x2f87, 0x3b05, 0x2799, 0x33f5, 0x2196, 0x3027, 0x34cc, 0x35d3, 0x3893, 0x312d, 0x34e4, 0x3861, 0x346d, 0x397c, 0x3a08, 0x3637, 0x3086, 0x3481, 0x30ab, 0x3533, 0x33c6, 0x2d48, 0x3648, 0x359c, 0x390c, 0x3677, 0x354a, 0x3b4d, 0x3b9d, 0x3323, 0x3694, 0x3213, 0x329d, 0x3828, 0x382d, 0x31bf, 0x3746, 0x3635, 0x3198, 0x3032, 0x3092, 0x303d, 0x397c, -0x3b01, 0x3ab5, 0x3b7e, 0x29a3, 0x340f, 0x30fb, 0x35cb, 0x3424, 0x39b0, 0x3187, 0x3754, 0x3b8b, 0x3810, 0x3554, 0x3b1c, 0x3806, 0x3bde, 0x2a39, 0x3aa3, 0x3b27, 0x3b94, 0x3786, 0x3503, 0x388a, 0x383f, 0x3884, 0x3bf9, 0x3a20, 0x395a, 0x33af, 0x33d9, 0x3b30, 0x3be0, 0x2c91, 0x3b4a, 0x373a, 0x3beb, 0x3a54, 0x3b5e, 0x3599, 0x3466, 0x3538, 0x35e9, 0x387b, 0x3904, 0x288a, 0x3b05, 0x35a5, 0x3316, 0x395f, 0x3869, 0x39e4, 0x34ac, 0x350a, 0x2dd8, 0x32c7, 0x32e2, 0x3be7, 0x38f4, 0x3ada, 0x3959, 0x3a32, 0x3876, 0x3a54, -0x3636, 0x35f4, 0x381d, 0x3931, 0x39fc, 0x3a4d, 0x3591, 0x34c7, 0x33ad, 0x3ac2, 0x3ada, 0x2b1d, 0x3153, 0x3741, 0x3a10, 0x38fa, 0x32ed, 0x3bcc, 0x31be, 0x3a65, 0x335c, 0x3a5f, 0x3b18, 0x3711, 0x3ba3, 0x367b, 0x3820, 0x2b7e, 0x3111, 0x3b3f, 0x2591, 0x38cc, 0x3971, 0x34ac, 0x2d8a, 0x36bb, 0x39b1, 0x37b8, 0x3924, 0x2f50, 0x3597, 0x33b7, 0x2d00, 0x2a92, 0x3496, 0x385e, 0x3b0a, 0x3b25, 0x3045, 0x2d1a, 0x374d, 0x221c, 0x2b6e, 0x39bb, 0x37c7, 0x387f, 0x3793, 0x308b, 0x3556, 0x3952, 0x36c2, 0x362a, 0x3bcb, 0x39c9, -0x3a56, 0x2dd3, 0x352a, 0x382b, 0x2888, 0x3bb2, 0x395d, 0x21e7, 0x372a, 0x3b6f, 0x39ed, 0x3bf7, 0x33b2, 0x3ab1, 0x37de, 0x39b8, 0x28e5, 0x2ee3, 0x3a48, 0x369b, 0x396c, 0x1974, 0x3563, 0x3821, 0x3967, 0x2e88, 0x35a7, 0x392a, 0x385a, 0x3b40, 0x2eea, 0x3b24, 0x37aa, 0x31b3, 0x3400, 0x3835, 0x2b2e, 0x2e60, 0x3be0, 0x3367, 0x3b53, 0x3beb, 0x30a5, 0x3810, 0x3849, 0x37a1, 0x3a03, 0x3962, 0x33b8, 0x37e7, 0x2d24, 0x329c, 0x3874, 0x3ba1, 0x1e36, 0x3138, 0x3a89, 0x38fc, 0x3b3d, 0x3440, 0x3b76, 0x3b94, 0x373c, 0x2821, -0x39a5, 0x3800, 0x27ab, 0x3adc, 0x3219, 0x3a16, 0x36d0, 0x3ac8, 0x3b92, 0x3618, 0x38b7, 0x3a27, 0x3791, 0x3b35, 0x380a, 0x3acf, 0x345c, 0x3ace, 0x376f, 0x384b, 0x3aae, 0x37e4, 0x38c6, 0x2f10, 0x35b4, 0x3b6b, 0x3afe, 0x32a2, 0x35b4, 0x358d, 0x2859, 0x35a1, 0x33f2, 0x3971, 0x35ec, 0x38a6, 0x390a, 0x380d, 0x3bed, 0x33f2, 0x3529, 0x3ac4, 0x2e88, 0x30da, 0x3b57, 0x39ad, 0x3bbd, 0x2771, 0x2eac, 0x39d6, 0x384f, 0x39cc, 0x3868, 0x3b6e, 0x36ea, 0x3001, 0x3568, 0x3b8a, 0x333b, 0x3987, 0x2672, 0x349e, 0x33fc, 0x38f9, -0x3b7e, 0x3bfc, 0x37a9, 0x3664, 0x3a0e, 0x3bce, 0x37a7, 0x35ad, 0x3b0c, 0x3a22, 0x3318, 0x3b54, 0x3863, 0x3a66, 0x388c, 0x3b53, 0x396a, 0x3a55, 0x32c7, 0x3a96, 0x38b3, 0x36d9, 0x3676, 0x36bd, 0x2da9, 0x36c6, 0x3154, 0x372f, 0x396a, 0x3718, 0x31b0, 0x3bb4, 0x3aae, 0x37a3, 0x3892, 0x364b, 0x32c0, 0x3851, 0x286f, 0x3a6a, 0x3772, 0x3924, 0x2526, 0x3b09, 0x3025, 0x3951, 0x32e1, 0x3880, 0x38e2, 0x3b44, 0x259d, 0x35ba, 0x3581, 0x300b, 0x3945, 0x3ae1, 0x3bdf, 0x354f, 0x3825, 0x3b02, 0x3551, 0x39bd, 0x3bb8, 0x38f9, -0x31da, 0x37e9, 0x37e1, 0x3b6d, 0x39f8, 0x3885, 0x3993, 0x362d, 0x3b55, 0x33ef, 0x3895, 0x394d, 0x2d0b, 0x3702, 0x39bc, 0x3b39, 0x3036, 0x38aa, 0x3582, 0x3474, 0x3bf6, 0x344f, 0x389d, 0x3bbb, 0x32cd, 0x302b, 0x37f4, 0x38a6, 0x3854, 0x368c, 0x3ab0, 0x3aff, 0x385d, 0x354c, 0x38bb, 0x2e0f, 0x3b75, 0x36e9, 0x380d, 0x38f9, 0x386a, 0x36d5, 0x3746, 0x3b00, 0x368a, 0x3961, 0x3673, 0x352a, 0x351b, 0x2aac, 0x3988, 0x3754, 0x3886, 0x3aec, 0x381e, 0x3832, 0x3ac5, 0x2179, 0x3ba1, 0x3b00, 0x3a55, 0x392e, 0x326b, 0x296d, -0x25a4, 0x3a74, 0x320e, 0x30e0, 0x317f, 0x3bfd, 0x3bc5, 0x2af4, 0x3b85, 0x3603, 0x3ba8, 0x352a, 0x38e5, 0x37be, 0x32cc, 0x387e, 0x389f, 0x2ed9, 0x3a27, 0x3174, 0x3b45, 0x3a84, 0x3be2, 0x35f2, 0x3a49, 0x3aba, 0x34fe, 0x34e8, 0x3ba0, 0x3940, 0x3b98, 0x3b65, 0x3b95, 0x3735, 0x3b3c, 0x3801, 0x3a86, 0x39a0, 0x3ba1, 0x360f, 0x2b45, 0x3806, 0x35e7, 0x3b4a, 0x3a83, 0x39d3, 0x31c7, 0x3088, 0x38b6, 0x3aa2, 0x3b80, 0x366e, 0x3a81, 0x3836, 0x330e, 0x3ac2, 0x3a13, 0x3a60, 0x37c2, 0x369d, 0x3a8a, 0x3778, 0x3322, 0x2c22, -0x3ae9, 0x38fd, 0x3b37, 0x23c0, 0x30ba, 0x2e6a, 0x397a, 0x3166, 0x3a2e, 0x2fc5, 0x2b07, 0x36f2, 0x36b4, 0x3b63, 0x3ba7, 0x3641, 0x2c50, 0x38f4, 0x3857, 0x3a1d, 0x378f, 0x38da, 0x2a45, 0x3849, 0x2ae1, 0x3ad9, 0x2e87, 0x3adb, 0x8f4, 0x20ef, 0x3aba, 0x3a2d, 0x340b, 0x3bab, 0x352d, 0x3941, 0x3ac3, 0x3a8d, 0x362a, 0x3a02, 0x3a49, 0x2d45, 0x334a, 0x2bfc, 0x35a1, 0x304a, 0x3666, 0x35c0, 0x3838, 0x3a55, 0x3656, 0x34f6, 0x341a, 0x3879, 0x368a, 0x3744, 0x3886, 0x3320, 0x3459, 0x38d4, 0x30ae, 0x3815, 0x3568, 0x3101, -0x3455, 0x3727, 0x39a9, 0x37e6, 0x3259, 0x3bb1, 0x3781, 0x3a91, 0x3998, 0x2d2f, 0x32d8, 0x3955, 0x3844, 0x2753, 0x3bf4, 0x340e, 0x3a49, 0x397b, 0x39e1, 0x3992, 0x38b5, 0x34e6, 0x3741, 0x3113, 0x3a5d, 0x395d, 0x38eb, 0x3542, 0x3b17, 0x38c7, 0x3564, 0x350d, 0x3846, 0x384c, 0x338c, 0x39fe, 0x2dc8, 0x3ac8, 0x2fee, 0x3b1e, 0x378c, 0x3455, 0x35b3, 0x38cd, 0x3950, 0x3b98, 0x2b96, 0x3aca, 0x3809, 0x37c9, 0x393e, 0x39f8, 0x3822, 0x3187, 0x3905, 0x3bdb, 0x360c, 0x34d7, 0x3408, 0x38e3, 0x358e, 0x3a58, 0x33cf, 0x38d2, -0x3a8f, 0x389c, 0x3a45, 0x325b, 0x2a6c, 0x375f, 0x3382, 0x3a44, 0x3256, 0x2770, 0x3bd6, 0x2f05, 0x34cf, 0x29d7, 0x2d77, 0x38b9, 0x3971, 0x3518, 0x2e1b, 0x39dc, 0x31d4, 0x388a, 0x3b6d, 0x37a7, 0x28c3, 0x3720, 0x3050, 0x38fd, 0x3801, 0x3b4b, 0x3308, 0x38a1, 0x3241, 0x3184, 0x39b8, 0x3bef, 0x2930, 0x395b, 0x3a49, 0x39d2, 0x3b2d, 0x2e75, 0x2cc6, 0x3b5e, 0x3724, 0x3352, 0x31fc, 0x3607, 0x3ae9, 0x3867, 0x3a8c, 0x24ab, 0x3821, 0x328e, 0x2f81, 0x249f, 0x2d6f, 0x352d, 0x3723, 0x37b2, 0x3683, 0x36f4, 0x3a8c, 0x38fb, -0x3a36, 0x3ad9, 0x38b6, 0x3522, 0x38b7, 0x30f8, 0x36ee, 0x3a71, 0x36fd, 0x349b, 0x3343, 0x36ae, 0x3895, 0x365a, 0x3bf5, 0x3a04, 0x3931, 0x36fa, 0x3970, 0x39fb, 0x2c7a, 0x3a47, 0x3987, 0x3429, 0x338f, 0x3ba1, 0x393e, 0x3a05, 0x3a0d, 0x2e16, 0x34c9, 0x3943, 0x302a, 0x31e9, 0x3401, 0x330a, 0x3bc4, 0x3542, 0x38fc, 0x38bb, 0x3401, 0x37be, 0x371f, 0x3933, 0x3963, 0x385f, 0x3479, 0x3bff, 0x2c2b, 0x3782, 0x2cda, 0x396b, 0x3a8c, 0x3bf9, 0x34b0, 0x3696, 0x3a9f, 0x33a1, 0x322f, 0x396b, 0x3be3, 0x3ade, 0x381c, 0x3a76, -0x388c, 0x2896, 0x2724, 0x39d7, 0x35a4, 0x37b3, 0x3282, 0x272c, 0x3774, 0x247f, 0x3bed, 0x1989, 0x3b14, 0x3861, 0x3b1d, 0x3909, 0x23a3, 0x3ae8, 0x399c, 0x3b39, 0x3b6a, 0x3a49, 0x3454, 0x3b04, 0x3a85, 0x3b06, 0x2fe7, 0x32d7, 0x3879, 0x3b8e, 0x33ed, 0x38a8, 0x359e, 0x39f7, 0x3546, 0x31f7, 0x3bc7, 0x3387, 0x3279, 0x39af, 0x39e2, 0x3432, 0x37c3, 0x3b4a, 0x3b34, 0x3b66, 0x23fc, 0x3a1a, 0x3577, 0x35b1, 0x3a02, 0x2584, 0x36be, 0x3389, 0x3bcc, 0x369c, 0x38a5, 0x381f, 0x3553, 0x39ab, 0x3a9a, 0x395c, 0x381f, 0x3b60, -0x36d8, 0x342a, 0x344e, 0x30f8, 0x3a5e, 0x34e7, 0x35b1, 0x3739, 0x3838, 0x32d9, 0x38ac, 0x386a, 0x39ae, 0x1826, 0x2431, 0x38ea, 0x3b66, 0x3b9e, 0x3b3c, 0x3b1d, 0x38cb, 0x3537, 0x391b, 0x364c, 0x3aa0, 0x2f83, 0x289d, 0x35da, 0x3a40, 0x3527, 0x386e, 0x2d5e, 0x3a81, 0x36a6, 0x32af, 0x357e, 0x375c, 0x33ca, 0x3837, 0x2dae, 0x3595, 0x2912, 0x349a, 0x353a, 0x35db, 0x3b28, 0x3978, 0x3470, 0x30ae, 0x3a15, 0x38bb, 0x3b82, 0x388c, 0x3778, 0x34fb, 0x3b0e, 0x3b13, 0x3b9c, 0x303b, 0x14ea, 0x2feb, 0x3660, 0x33ea, 0x3b08, -0x3a7f, 0x292f, 0x3be3, 0x372b, 0x39e9, 0x3b26, 0x3725, 0x34f1, 0x3a2a, 0x38cc, 0x3a67, 0x3819, 0x3ba5, 0x339b, 0x3bf6, 0x3420, 0x3548, 0x38e5, 0x39e3, 0x3a62, 0x35e3, 0x3a03, 0x3893, 0x39c2, 0x3848, 0x38fa, 0x396c, 0x32a7, 0x3a8f, 0x329b, 0x32f1, 0x39d3, 0x1a9c, 0x3aea, 0x3782, 0x38f2, 0x3829, 0x2e91, 0x39fc, 0x3716, 0x3899, 0x31bb, 0x349b, 0x32eb, 0x367e, 0x3bad, 0x38f1, 0x34cc, 0x35dd, 0x31ba, 0x3ad9, 0x1dc5, 0x3884, 0x2c64, 0x2ec7, 0x35ed, 0x2e64, 0x3a4a, 0x38b5, 0x3b59, 0x2c80, 0x318b, 0x2d35, 0x38d9, -0x3a09, 0x31c2, 0x37be, 0x39f4, 0x3435, 0x3994, 0x39dc, 0x3933, 0x3035, 0x3984, 0x3228, 0x2d01, 0x3940, 0x3bd3, 0x385d, 0x2e62, 0x3643, 0x3b0c, 0x3454, 0x3686, 0x3b52, 0x3b5b, 0x3ac5, 0x3998, 0x307b, 0x38d5, 0x36e4, 0x341f, 0x39e7, 0x3a62, 0x34c5, 0x39b5, 0x37b6, 0x37b4, 0x3868, 0x3888, 0x38b9, 0x37e1, 0x36a5, 0x386c, 0x39d8, 0x3961, 0x3ba9, 0x38a1, 0x2ca0, 0x38b3, 0x3aea, 0x352d, 0x33f9, 0x3808, 0x37b6, 0x3a39, 0x3aba, 0x3799, 0x36fe, 0x34fd, 0x374f, 0x34eb, 0x3720, 0x3466, 0x39ff, 0x3922, 0x3113, 0x3a13, -0x3bb0, 0x3ac9, 0x3879, 0x2a5c, 0x26e4, 0x37cc, 0x39a0, 0x353a, 0x3688, 0x3ac1, 0x3bee, 0x3a3e, 0x3949, 0x38f5, 0x307a, 0x2e5b, 0x3531, 0x382f, 0x338a, 0x3ac2, 0x3966, 0x34e2, 0x2f1b, 0x3a1d, 0x3686, 0x38e3, 0x322d, 0x351c, 0x3b01, 0x360c, 0x33c8, 0x35e4, 0x2cea, 0x3642, 0x39b7, 0x37fa, 0x3102, 0x2f06, 0x33ce, 0x365a, 0x335a, 0x3550, 0x2b84, 0x38dc, 0x3aaf, 0x39fb, 0x39e0, 0x32e2, 0x33f5, 0x3a5e, 0x3bdb, 0x2963, 0x3229, 0x3b41, 0x3783, 0x3a11, 0x382c, 0x3952, 0x37a0, 0x38c5, 0x2894, 0x3325, 0x3468, 0x3029, -0x3719, 0x38ad, 0x357e, 0x2ee3, 0x2d33, 0x3445, 0x3ac4, 0x3108, 0x398f, 0x35e7, 0x384b, 0x3870, 0x387d, 0x3235, 0x397c, 0x3891, 0x38bc, 0x28df, 0x388c, 0x3974, 0x34cd, 0x3a34, 0x3861, 0x3bf8, 0x3934, 0x364a, 0x3644, 0x3af6, 0x3742, 0x398b, 0x3a7c, 0x3bb8, 0x33fe, 0x397b, 0x3bae, 0x3b83, 0x360e, 0x35b9, 0x39a4, 0x3a32, 0x38d9, 0x304f, 0x38c1, 0x297f, 0x3b47, 0x3a0f, 0x3b27, 0x3bdf, 0x35a6, 0x39a0, 0x31b1, 0x389d, 0x3745, 0x3b82, 0x37b2, 0x3945, 0x36b9, 0x398b, 0x35c2, 0x3335, 0x30f6, 0x30f3, 0x35c9, 0x38b4, -0x3833, 0x3601, 0x321c, 0x350c, 0x36e7, 0x3452, 0x2f4f, 0x2b8e, 0x3a7c, 0x311b, 0x3b93, 0x3bd3, 0x3b75, 0x3711, 0x34dc, 0x380f, 0x39f7, 0x2b7b, 0x31de, 0x9f0, 0x3783, 0x331c, 0x3b71, 0x21bc, 0x3a5e, 0x38ed, 0x39db, 0x309e, 0x3565, 0x382d, 0x3682, 0x3b3e, 0x3b3b, 0x3419, 0x35e2, 0x3a64, 0x3be9, 0x335e, 0x377e, 0x3a3a, 0x3b74, 0x3688, 0x3a52, 0x322c, 0x3a83, 0x3a51, 0x3afb, 0x38e5, 0x3bde, 0x3afe, 0x3917, 0x37f7, 0x283d, 0x3b60, 0x3408, 0x3543, 0x38ce, 0x38fe, 0x3b49, 0x2e7d, 0x3a16, 0x3920, 0x28c9, 0x34d5, -0x3be4, 0x2e71, 0x3ace, 0x3aa0, 0x3ac0, 0x3618, 0x3b1a, 0x29fa, 0x3962, 0x358d, 0x2f85, 0x3ad2, 0x3198, 0x373d, 0x3b9e, 0x362d, 0x381e, 0x3ad3, 0x3904, 0x18b4, 0x37c3, 0x386b, 0x3982, 0x3711, 0x3a56, 0x3ac7, 0x38c2, 0x2d57, 0x313b, 0x31fd, 0x3423, 0x35a4, 0x38be, 0x3857, 0x36b9, 0x3b9d, 0x39de, 0x33e8, 0x3896, 0x3919, 0x32ee, 0x3b94, 0x3528, 0x38fc, 0x38ca, 0x25e6, 0x38ca, 0x396f, 0x3a63, 0x2a52, 0x3a30, 0x393f, 0x38f1, 0x3a58, 0x3537, 0x3295, 0x38ec, 0x391b, 0x3839, 0x3448, 0x39db, 0x34fa, 0x37db, 0x3bf0, -0x396e, 0x353f, 0x3474, 0x1958, 0x3964, 0x3958, 0x36d3, 0x3966, 0x3a4d, 0x3132, 0x3a83, 0x31b7, 0x272b, 0x38e1, 0x300d, 0x3afe, 0x2a0c, 0x31f3, 0x377f, 0x384a, 0x2925, 0x38ce, 0x3a89, 0x3bdf, 0x36ef, 0x3219, 0x2e91, 0x3651, 0x3875, 0x30a4, 0x3a9e, 0x3b89, 0x3150, 0x34e5, 0x3a6c, 0x36d0, 0x32af, 0x34b9, 0x3b92, 0x3b54, 0x3b42, 0x3a63, 0x3a4e, 0x36ef, 0x3ba1, 0x389e, 0x307a, 0x34e9, 0x3a92, 0x353b, 0x3905, 0x39a6, 0x3838, 0x3135, 0x3501, 0x39b2, 0x3ae9, 0x325a, 0x3173, 0x329c, 0x385b, 0x3830, 0x31f8, 0x3819, -0x3b5b, 0x3a59, 0x3b28, 0x3a12, 0x3afd, 0x37b4, 0x383d, 0x39ba, 0x3b68, 0x3b3c, 0x3b38, 0x31d1, 0x3566, 0x36f0, 0x387e, 0x354d, 0x330b, 0x3aba, 0x3323, 0x3a7d, 0x369c, 0x29c1, 0x3b29, 0x38a8, 0x3a08, 0x323d, 0x3b93, 0x3833, 0x3284, 0x39b4, 0x386e, 0x3840, 0x39fc, 0x3365, 0x29a9, 0x379c, 0x3648, 0x31df, 0x3b00, 0x31d7, 0x3b0e, 0x33b0, 0x3bfe, 0x3bfb, 0x33b2, 0x2d56, 0x3361, 0x3ba6, 0x3bd0, 0x395b, 0x360c, 0x344e, 0x3bde, 0x3bdb, 0x3afb, 0x328d, 0x2f81, 0x3b0c, 0x3ba8, 0x362f, 0x3301, 0x3740, 0x36e4, 0x39d1, -0x34ee, 0x37ed, 0x36c7, 0x32b3, 0x36e3, 0x34dc, 0x35ee, 0x3b00, 0x2ec8, 0x3aa9, 0x3bac, 0x35ae, 0x38db, 0x345b, 0x2dfe, 0x2c7c, 0x3b56, 0x2cf5, 0x3130, 0x3b7e, 0x38bc, 0x39d6, 0x38d1, 0x3b91, 0x3749, 0x34bb, 0x3a3f, 0x34e5, 0x370a, 0x351d, 0x35d4, 0x300b, 0x3a3f, 0x3867, 0x35d8, 0x32b3, 0x38c9, 0x3962, 0x2c72, 0x3990, 0x1bc9, 0x35b2, 0x3077, 0x37bc, 0x3a42, 0x3b14, 0x2e52, 0x38ec, 0x3b5e, 0x35c8, 0x3bb4, 0x36a4, 0x3812, 0x344f, 0x378b, 0x348c, 0x3a47, 0x3afb, 0x3981, 0x3b82, 0x3b3c, 0x3296, 0x376f, 0x3196, -0x37d6, 0x353a, 0x3924, 0x38cc, 0x3220, 0x3b67, 0x2e21, 0x35fb, 0x3790, 0x2a9e, 0x32e4, 0x394b, 0x38ca, 0x34cc, 0x395b, 0x3411, 0x3a7f, 0x37a9, 0x3116, 0x3460, 0x346b, 0x380e, 0x394d, 0x3afd, 0x2d46, 0x3413, 0x3924, 0x3abf, 0x28d2, 0x3b03, 0x3493, 0x354b, 0x2a7a, 0x3aea, 0x3618, 0x3708, 0x3b07, 0x394c, 0x3a64, 0x3be7, 0x36be, 0x3bf5, 0x37a4, 0x3a9f, 0x399c, 0x30b7, 0x3976, 0x3b70, 0x3bad, 0x3b7e, 0x3b6d, 0x3662, 0x31fc, 0x3bae, 0x361f, 0x3878, 0x3b22, 0x3849, 0x3446, 0x3be2, 0x3bff, 0x37f3, 0x31b5, 0x30b9, -0x399f, 0x35a0, 0x3915, 0x3668, 0x2b35, 0x2b76, 0x3886, 0x3935, 0x38da, 0x3836, 0x2711, 0x32f8, 0x38eb, 0x3481, 0x3243, 0x2d33, 0x3b0f, 0x36ba, 0x393f, 0x35b7, 0x3685, 0x3a15, 0x333a, 0x3afe, 0x2863, 0x3b5b, 0x3a94, 0x39cd, 0x3ad6, 0x3ac1, 0x3b72, 0x3423, 0x32f1, 0x2c93, 0x3141, 0x3462, 0x3bd9, 0x3b8b, 0x2451, 0x3071, 0x3bd1, 0x3512, 0x372a, 0x38ce, 0x3892, 0x35cd, 0x388c, 0x3456, 0x2cb2, 0x26c2, 0x2df1, 0x38f2, 0x3427, 0x2cad, 0x34b5, 0x3285, 0x2e33, 0x31c7, 0x3948, 0x3634, 0x35b8, 0x3478, 0x375b, 0x38fb, -0x3769, 0x390b, 0x3880, 0x309e, 0x33bc, 0x3b8e, 0x3311, 0x3489, 0x29ff, 0x34ef, 0x3af6, 0x3ab2, 0x31b5, 0x398e, 0x3857, 0x2886, 0x3847, 0x3bd9, 0x37fc, 0x393c, 0x2c6d, 0x30df, 0x2e7b, 0x340e, 0x3bae, 0x3b5e, 0x38d1, 0x37b7, 0x3ab7, 0x356d, 0x3528, 0x2c58, 0x38db, 0x3951, 0x30c1, 0x394e, 0x3395, 0x3273, 0x329c, 0x3882, 0x2f1b, 0x3a6d, 0x3a2d, 0x3bdb, 0x3850, 0x3a43, 0x35ba, 0x3884, 0x3197, 0x2d5e, 0x3b30, 0x3393, 0x39c9, 0x3aa0, 0x2c7d, 0x2d28, 0x3776, 0x35ca, 0x34d1, 0x38f3, 0x327e, 0x3a71, 0x3a4f, 0x36bf, -0x30c3, 0x388e, 0x38d2, 0x2a3b, 0x2de6, 0x363d, 0x3adc, 0x3b64, 0x2889, 0x2e46, 0x3570, 0x3b46, 0x3549, 0x3b6c, 0x3afc, 0x3b07, 0x3bde, 0x35e3, 0x39d7, 0x3b0e, 0x303f, 0x2068, 0x37d4, 0x3bc9, 0x2d84, 0x367c, 0x3adb, 0x364f, 0x244b, 0x36fb, 0x3829, 0x34cc, 0x3aa4, 0x3507, 0x366e, 0x3333, 0x34b7, 0x3a84, 0x37db, 0x3a35, 0x26fe, 0x346a, 0x3b25, 0x37b7, 0x3a1f, 0x399d, 0x2c52, 0x3b8d, 0x3501, 0x3ac0, 0x3a06, 0x3af9, 0x36f8, 0x312c, 0x3990, 0x3af5, 0x3a91, 0x2db0, 0x39cc, 0x3221, 0x21d5, 0x36f2, 0x20c8, 0x3245, -0x399f, 0x2ed7, 0x39ea, 0x2c2f, 0x2e81, 0x3b28, 0x333b, 0x3a13, 0x357b, 0x387a, 0x34f2, 0x28d2, 0x33b8, 0x39e8, 0x38cc, 0x398d, 0x3258, 0x39fc, 0x31ab, 0x3883, 0x350a, 0x32f9, 0x3147, 0x395a, 0x3b60, 0x3a31, 0x2315, 0x2d1e, 0x37ab, 0x3b16, 0x3421, 0x35f0, 0x302d, 0x3ac8, 0x3955, 0x353b, 0x35ba, 0x3716, 0x3411, 0x2a1b, 0x35d2, 0x2d64, 0x3914, 0x3b78, 0x3438, 0x3791, 0x3b1f, 0x3813, 0x23f6, 0x3456, 0x36e6, 0x2716, 0x3afd, 0x31a8, 0x3495, 0x3389, 0x3a03, 0x3092, 0x3bf2, 0x3ae4, 0x2459, 0x3891, 0x395e, 0x2f91, -0x3b3a, 0x219a, 0x2846, 0x3ac4, 0x3921, 0x38cd, 0x35ca, 0x353f, 0x3939, 0x38ec, 0x36e4, 0x2df9, 0x387b, 0x398b, 0x2de2, 0x391a, 0x36d2, 0x38bd, 0x37c2, 0x361b, 0x3b55, 0x385e, 0x3606, 0x3ae3, 0x387e, 0x3349, 0x3639, 0x35e3, 0x3073, 0x39e8, 0x3563, 0x3ab8, 0x3880, 0x3648, 0x39ca, 0x3975, 0x3108, 0x2d94, 0x2f4d, 0x3be2, 0x2bb3, 0x3839, 0x3bdf, 0x3977, 0x3674, 0x3902, 0x3b1d, 0x3a40, 0x3524, 0x3be8, 0x3afa, 0x356b, 0x31e6, 0x3a0d, 0x3bb2, 0x3b82, 0x3b6b, 0x3672, 0x3626, 0x3b29, 0x32ed, 0x3961, 0x392e, 0x38a7, -0x2adc, 0x3114, 0x364a, 0x34cd, 0x302d, 0x35db, 0x336d, 0x31a2, 0x3a14, 0x3102, 0x21ad, 0x326c, 0x345d, 0x3885, 0x383d, 0x3bfd, 0x39a1, 0x37e3, 0x390c, 0x3903, 0x3b10, 0x34a2, 0x3312, 0x3b64, 0x3b64, 0x389d, 0x301e, 0x3b4c, 0x3971, 0x3a90, 0x3bd1, 0x38c5, 0x390b, 0x3819, 0x371a, 0x39ae, 0x3b1e, 0x393b, 0x378b, 0x3bd8, 0x3884, 0x370d, 0x3a16, 0x365f, 0x3102, 0x382e, 0x3415, 0x39bb, 0x39fb, 0x38c1, 0x37fe, 0x390e, 0x3a18, 0x1900, 0x3828, 0x3a0d, 0x301c, 0x3927, 0x3a15, 0x38d8, 0x36cb, 0x2b55, 0x336b, 0x3b0f, -0x3851, 0x37e9, 0x2dfa, 0x3aac, 0x3baa, 0x39af, 0x38c6, 0x392e, 0x364d, 0x3ab4, 0x247c, 0x3a0d, 0x3a7a, 0x39d1, 0x37fc, 0x370a, 0x351d, 0x392a, 0x351a, 0x3671, 0x3a9d, 0x2cd1, 0x3b16, 0x3b02, 0x1921, 0x39b2, 0x3afe, 0x35eb, 0x301d, 0x38cc, 0x3a67, 0x3986, 0x32fb, 0x3a9b, 0x3a10, 0x3a1a, 0x288d, 0x3afa, 0x3269, 0x3be1, 0x3822, 0x3923, 0x351a, 0x24a4, 0x3519, 0x3717, 0x383f, 0x3b3e, 0x39d0, 0x352e, 0x394a, 0x3532, 0x39fd, 0x39ae, 0x3818, 0x3aec, 0x3bfb, 0x267e, 0x2caf, 0x3b8b, 0x3432, 0x2dca, 0x3afa, 0x36b0 -}; diff --git a/tests/utils/y_input.h b/tests/utils/y_input.h deleted file mode 100644 index c52a3fed..00000000 --- a/tests/utils/y_input.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2025 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// Authors: Yvan Tortorella -// - -/* Header file generated by RedMulE Golden Model */ -uint16_t y_inp [6144] = { -0x334e, 0x3a40, 0x2629, 0x320a, 0x30f1, 0x3b24, 0x2515, 0x39b7, 0x3053, 0x3709, 0x38c6, 0x36d7, 0x32be, 0x393f, 0x335d, 0x3aed, 0x3881, 0x3a02, 0x3ac7, 0x35a7, 0x2fdc, 0x334a, 0x3870, 0x38f1, 0x2abf, 0x3b69, 0x3a4d, 0x3425, 0x3a5d, 0x3717, 0x387a, 0x3858, 0x39f8, 0x3619, 0x352f, 0x3b8d, 0x347b, 0x3637, 0x3188, 0x3382, 0x340f, 0x3181, 0x31d3, 0x390a, 0x32b7, 0x3bd3, 0x382b, 0x3ba7, 0x2cde, 0x3ab9, 0x3911, 0x3bef, 0x3677, 0x165b, 0x2d24, 0x3779, 0x3928, 0x213b, 0x3868, 0x3adc, 0x38de, 0x3a9c, 0x3a9e, 0x3858, -0x38c8, 0x3663, 0x2c0c, 0x3521, 0x3a22, 0x3bd0, 0x3908, 0x35af, 0x32e6, 0x3acf, 0x387a, 0x3865, 0x2c43, 0x3839, 0x33ab, 0x3a62, 0x3548, 0x383e, 0x3a12, 0x357b, 0x3b9e, 0x3823, 0x3825, 0x397b, 0x3bcf, 0x31e4, 0x3799, 0x32ad, 0x28d9, 0x3acc, 0x35cb, 0x35b7, 0x3a80, 0x3b70, 0x3475, 0x3b8a, 0x357d, 0x37d2, 0x2fb4, 0x301f, 0x3b15, 0x3a15, 0x34bd, 0x3abf, 0x38db, 0x2b71, 0x3a4a, 0x39d5, 0x3a16, 0x25d9, 0x3bb6, 0x3bf5, 0x38b4, 0x34cf, 0x383c, 0x306d, 0x37ec, 0x31a9, 0x3984, 0x37a3, 0x3440, 0x36a1, 0x3675, 0x2f08, -0x38b9, 0x2b09, 0x2c59, 0x3a99, 0x3068, 0x3501, 0x3b17, 0x3798, 0x38f2, 0x2c7f, 0x347f, 0x38a4, 0x321e, 0x39e9, 0x375c, 0x38db, 0x38d5, 0x3b65, 0x3863, 0x3712, 0x3976, 0x3090, 0x3944, 0x3b0c, 0x3b71, 0x23e1, 0x3985, 0x36cd, 0x3845, 0x39ea, 0x369e, 0x39a5, 0x388e, 0x36a0, 0x34fa, 0x2c23, 0x30d1, 0x3993, 0x38fb, 0x3b4c, 0x283d, 0x3423, 0x3009, 0x34b2, 0x38ee, 0x36ad, 0x3056, 0x22a0, 0x354e, 0x3aca, 0x324c, 0x38ac, 0x395d, 0x3058, 0x3b0e, 0x3b1b, 0x3a24, 0x36e2, 0x24b3, 0x39e9, 0x2ed6, 0x3834, 0x31d0, 0x3862, -0x348f, 0x340d, 0x368f, 0x3b2e, 0x3b48, 0x3579, 0x3029, 0x30ef, 0x3567, 0x2324, 0x2b48, 0x30b1, 0x33e9, 0x3730, 0x3bf5, 0x29c8, 0x3678, 0x317e, 0x3855, 0x3b26, 0x3499, 0x3529, 0x3108, 0x344a, 0x39d5, 0x3774, 0x3a36, 0x3b92, 0x34db, 0x3b7d, 0x3721, 0x37aa, 0x3726, 0x3b80, 0x35fa, 0x233e, 0x39f6, 0x3830, 0x35d3, 0x2232, 0x36c6, 0x3a20, 0x3670, 0x3bb9, 0x3bc0, 0x3951, 0x3a8c, 0x39f7, 0x391b, 0x39e8, 0x2b8b, 0x329a, 0x3afa, 0x33a6, 0x3397, 0x31a5, 0x3bf3, 0x3865, 0x37ed, 0x3483, 0x3bc7, 0x3842, 0x2698, 0x3b2a, -0x35ac, 0x3bbd, 0x382a, 0x3824, 0x2ace, 0x38f7, 0x3b95, 0x34c0, 0x2d14, 0x3415, 0x3830, 0x3aca, 0x351b, 0x3819, 0x3404, 0x3965, 0x3314, 0x3818, 0x2c73, 0x3558, 0x3bc3, 0x2ea2, 0x3b57, 0x372c, 0x3a3d, 0x3428, 0x388d, 0x3509, 0x3b5d, 0x399e, 0x3885, 0x36f2, 0x328e, 0x2c6c, 0x2a8c, 0x35b1, 0x3b18, 0x3700, 0x30ea, 0x36ae, 0x38f3, 0x3b2a, 0x30d9, 0x391b, 0x3812, 0x343e, 0x1434, 0x3a9d, 0x3bf5, 0x3b23, 0x3835, 0x397c, 0x3a04, 0x2c37, 0x2f18, 0x3a39, 0x371a, 0x3801, 0x246c, 0x33b6, 0x3803, 0x3a43, 0x38ee, 0x3a91, -0x39b1, 0x39d3, 0x2ef3, 0x36ed, 0x36ad, 0x38a6, 0x34ed, 0x2f88, 0x35f7, 0x3bda, 0x34de, 0x38c4, 0x36f1, 0x345d, 0x39ee, 0x3b02, 0x3b26, 0x3482, 0x2ec3, 0x3adf, 0x397d, 0x35da, 0x3828, 0x3a9a, 0x3364, 0x342c, 0x3acd, 0x2d11, 0x3907, 0x3645, 0x3a32, 0x39cf, 0x34a6, 0x38f6, 0x2b4f, 0x3a7a, 0x2e80, 0x3419, 0x340e, 0x28ce, 0x3b53, 0x353b, 0x39e8, 0x38b3, 0x35fd, 0x3b71, 0x3b10, 0x3ada, 0x3a06, 0x3bf0, 0x3a68, 0x374c, 0x3a28, 0x3847, 0x3992, 0x3375, 0x37e7, 0x2fc5, 0x3399, 0x3522, 0x3108, 0x36a3, 0x3955, 0x354d, -0x3a8f, 0x3ba8, 0x3a74, 0x386b, 0x39a7, 0x31a9, 0x34ca, 0x366f, 0x356d, 0x3a3b, 0x3676, 0x371c, 0x34f2, 0x36cf, 0x26bc, 0x199c, 0x35bd, 0x3ac9, 0x3919, 0x3392, 0x3bf6, 0x39d7, 0x395f, 0x22dd, 0x3a6f, 0x3095, 0x3a1a, 0x31c2, 0x31ae, 0x39cd, 0x3a7d, 0x3460, 0x3b65, 0x3b10, 0x3b04, 0x396a, 0x39b5, 0x31d6, 0x3add, 0x3758, 0x35e6, 0x386c, 0x3a99, 0x3bad, 0x24f0, 0x3153, 0x36b3, 0x39cf, 0x3788, 0x3962, 0x3acb, 0x301b, 0x354a, 0x32ec, 0x3894, 0x3bba, 0x382b, 0x358f, 0x3a59, 0x2ec1, 0x38ed, 0x37a8, 0x37e3, 0x3a02, -0x3aa7, 0x33ae, 0x3977, 0x3555, 0x36f4, 0x39f8, 0x381e, 0x2f6d, 0x3213, 0x30d1, 0x2d0a, 0x311d, 0x3812, 0x3037, 0x35c3, 0x3233, 0x336d, 0x2d4c, 0x3022, 0x3909, 0x354d, 0x3a58, 0x37c4, 0x3b92, 0x2e0d, 0x3a25, 0x3871, 0x3674, 0x3b5e, 0x3420, 0x312c, 0x34a5, 0x3a7f, 0x3324, 0x39c5, 0x3904, 0x1dee, 0x39de, 0x3029, 0x32da, 0x38f9, 0x353c, 0x35c4, 0x3b3c, 0x3a68, 0x3508, 0x35a6, 0x302f, 0x2806, 0x3b7f, 0x3895, 0x3b3f, 0x359c, 0x3b0c, 0x378c, 0x3424, 0x38b7, 0x2b8d, 0x3b35, 0x37c5, 0x32fa, 0x3aa5, 0x3a7b, 0x2e21, -0x3922, 0x36dc, 0x36d3, 0x3b8b, 0x3a90, 0x36c5, 0x3872, 0x3813, 0x396a, 0x3027, 0x3195, 0x3782, 0x3217, 0x3a01, 0x3bd9, 0x39cf, 0x3bea, 0x381e, 0x30e9, 0x392d, 0x3129, 0x3a83, 0x38b6, 0x38d8, 0x36fc, 0x39b8, 0x2cc5, 0x3b9a, 0x370c, 0x39aa, 0x2e32, 0x3a80, 0x38ea, 0x3649, 0x32bd, 0x3844, 0x3828, 0x2e94, 0x382b, 0x353a, 0x3bb9, 0x3a39, 0x3a61, 0x3b5a, 0x33b9, 0x35a9, 0x3a79, 0x377a, 0x3969, 0x35cb, 0x3483, 0x3b0c, 0x3b53, 0x3461, 0x3ae6, 0x381a, 0x3bc5, 0x35d0, 0x3b0d, 0x39de, 0x384c, 0x3b82, 0x3190, 0x36df, -0x2e64, 0x3588, 0x38f2, 0x35ec, 0x3085, 0x311b, 0x3b20, 0x3b46, 0x36b6, 0x381e, 0x3ba3, 0x3335, 0x3b5d, 0x3b7c, 0x3b06, 0x356d, 0x386c, 0x2d8c, 0x3bcd, 0x3024, 0x2906, 0x2dd1, 0x33b4, 0x3683, 0x1e9d, 0x39c9, 0x3b4e, 0x3976, 0x3b6c, 0x39bc, 0x343a, 0x3b07, 0x2af1, 0x383a, 0x2cb3, 0x3a94, 0x321d, 0x3bb6, 0x31ec, 0x3ba1, 0x3989, 0x336c, 0x3a85, 0x3a9d, 0x3be9, 0x3a81, 0x30b4, 0x3094, 0x395a, 0x30c6, 0x3aa1, 0x398d, 0x3b2c, 0x3845, 0x3633, 0x2c3b, 0x3808, 0x2a27, 0x3816, 0x387b, 0x39f4, 0x3507, 0x3b6c, 0x3ae5, -0x34ef, 0x3a3c, 0x3ad5, 0x39e5, 0x3a8c, 0x3850, 0x24dc, 0x3b5c, 0x3453, 0x3449, 0x3078, 0x30d5, 0x375e, 0x3901, 0x325e, 0x38e7, 0x376c, 0x32df, 0x39c2, 0x37b3, 0x33c5, 0x3669, 0x33f8, 0x34ad, 0x3b8c, 0x3742, 0x3831, 0x3a47, 0x2fc0, 0x3077, 0x26a3, 0x3410, 0x3be2, 0x306c, 0x3a3b, 0x3bb4, 0x3760, 0x38b6, 0x2e5d, 0x3a60, 0x3415, 0x3b20, 0x3935, 0x35e3, 0x33ae, 0x3b86, 0x1388, 0x3b7c, 0x3837, 0x2d4b, 0x3a1a, 0x346a, 0x311f, 0x3a92, 0x354e, 0x3786, 0x3328, 0x3a07, 0x338a, 0x39af, 0x39b5, 0x3b19, 0x388f, 0x30f7, -0x3648, 0x380a, 0x3984, 0x395c, 0x3702, 0x2ad3, 0x3b3e, 0x35ca, 0x2b7a, 0x39a8, 0x3966, 0x3acb, 0x3add, 0x3b54, 0x2285, 0x3bbf, 0x3a67, 0x393f, 0x3b14, 0x3a76, 0x30fb, 0x2492, 0x37d0, 0x3915, 0x2dbc, 0x36a7, 0x33f3, 0x3032, 0x2d42, 0x38e1, 0x336b, 0x3b4f, 0x2ebb, 0x35c8, 0x2c04, 0x3777, 0x2c2b, 0x3a08, 0x3615, 0x3424, 0x2c7e, 0x3b53, 0x361d, 0x364c, 0x3b63, 0x3b1f, 0x3653, 0x2a0a, 0x38c1, 0x3a35, 0x38fa, 0x39b0, 0x2ea5, 0x39f1, 0x340f, 0x3873, 0x3a39, 0x3826, 0x3853, 0x359b, 0x3b5f, 0x344a, 0x3a42, 0x30d3, -0x382a, 0x37e4, 0x2a05, 0x373b, 0x315c, 0x2aae, 0x3471, 0x3948, 0x346d, 0x3b4f, 0x2d18, 0x3518, 0x3554, 0x386a, 0x3272, 0x374b, 0x3321, 0x393c, 0x33f0, 0x38a5, 0x3957, 0x357e, 0x3a0c, 0x3ac7, 0x3b1d, 0x395d, 0x398a, 0x3a6e, 0x3baf, 0x38b2, 0x37ec, 0x3233, 0x3bd6, 0x3481, 0x39de, 0x26e3, 0x2f66, 0x3b84, 0x3a5a, 0x38f3, 0x387e, 0x322b, 0x2169, 0x3988, 0x3932, 0x22a9, 0x3162, 0x3b76, 0x2632, 0x3af3, 0x3827, 0x30e6, 0x32f7, 0x29a2, 0x3a2a, 0x3885, 0x39b6, 0x3540, 0x3abd, 0x3832, 0x34c8, 0x3a35, 0x3ae9, 0x31fd, -0x3839, 0x378c, 0x3862, 0x3095, 0x36ff, 0x36dc, 0x293b, 0x2c4e, 0x3618, 0x357c, 0x343e, 0x3a8d, 0x39f0, 0x3294, 0x3859, 0x27e7, 0x3676, 0x39c7, 0x38ef, 0x37e3, 0x3b34, 0x3b78, 0x3ae2, 0x35b7, 0x3b88, 0x3bd6, 0x3478, 0x3b95, 0x3894, 0x2fab, 0x3687, 0x3605, 0x38ed, 0x38b8, 0x3b9d, 0x27f6, 0x3ba9, 0x3a89, 0x3308, 0x2658, 0x3864, 0x3770, 0x3a8a, 0x38fd, 0x345e, 0x3541, 0x3b3a, 0x3833, 0x3a62, 0x3a26, 0x3a8a, 0x3b96, 0x37b9, 0x33fb, 0x322b, 0x3217, 0x34dc, 0x39a4, 0x3bd8, 0x33b6, 0x3696, 0x368f, 0x3bb6, 0x39a4, -0x3b6e, 0x38ef, 0x3044, 0x2ec4, 0x39fd, 0x3ae4, 0x366c, 0x33d7, 0x3b7e, 0x33c8, 0x3953, 0x376a, 0x3535, 0x3243, 0x388f, 0x3601, 0x3bf7, 0x3397, 0x3bfa, 0x36dc, 0x32e3, 0x1edc, 0x3770, 0x391c, 0x384d, 0x3a33, 0x37a4, 0x3997, 0x37f1, 0x3929, 0x35f3, 0x39a6, 0x2c0e, 0x3a0d, 0x2d8a, 0x3863, 0x2eb6, 0x34fe, 0x3a39, 0x3a75, 0x2ba6, 0x3394, 0x3326, 0x3329, 0x32d3, 0x3bb7, 0x351d, 0x38de, 0x3889, 0x38ea, 0x2ea1, 0x36aa, 0x2ec7, 0x3926, 0x3505, 0x37f5, 0x35b5, 0x3b94, 0x3679, 0x36b6, 0x3a14, 0x3add, 0x2f3b, 0x355f, -0x2fcf, 0x3939, 0x2941, 0x3a9a, 0x39d0, 0x3b59, 0x3904, 0x3b16, 0x2a30, 0x399a, 0x3b1a, 0x2e62, 0x392e, 0x35d4, 0x289a, 0x3456, 0x3315, 0x356d, 0x347a, 0x3882, 0x326e, 0x3a22, 0x2ee6, 0x26a0, 0x2119, 0x3468, 0x3a9d, 0x35aa, 0x3840, 0x36a1, 0x3a76, 0x253b, 0x3b69, 0x3a7b, 0x2444, 0x22a4, 0x322f, 0x38bc, 0x2e1f, 0x3821, 0x3ba6, 0x2c72, 0x3b09, 0x3a60, 0x34a8, 0x35f2, 0x35aa, 0x3441, 0x35f5, 0x3945, 0x39c2, 0x3160, 0x39ce, 0x3a06, 0x32a0, 0x3582, 0x36c9, 0x3967, 0x31c8, 0x3819, 0x3a6c, 0x3b57, 0x3206, 0x3a5a, -0x36d4, 0x39f6, 0x3617, 0x34dd, 0x3052, 0x3243, 0x33b5, 0x38ee, 0x3ada, 0x328e, 0x3535, 0x2d8b, 0x3a0f, 0x2dab, 0x36b3, 0x300c, 0x2f0e, 0x2dd7, 0x3849, 0x3927, 0x3a4b, 0x3a81, 0x31e2, 0x3497, 0x3211, 0x2fc8, 0x3658, 0x391b, 0x3a74, 0x32eb, 0x35ca, 0x382e, 0x3b76, 0x30a9, 0x302a, 0x3be2, 0x3a3d, 0x39a4, 0x3b82, 0x3279, 0x35ec, 0x3bc3, 0x3ac5, 0x3484, 0x3734, 0x32f9, 0x3aab, 0x38fd, 0x3b09, 0x2134, 0x3408, 0x2f12, 0x3668, 0x3abe, 0x34c1, 0x390f, 0x2eca, 0x39a4, 0x3bf0, 0x3015, 0x2ea4, 0x2d2b, 0x2de4, 0x3090, -0x37ac, 0x2f8b, 0x3815, 0x364f, 0x3a98, 0x3b25, 0x3256, 0x39bd, 0x3aa4, 0x38c5, 0x3621, 0x3271, 0x3ad0, 0x2d6c, 0x38ea, 0x3af6, 0x38bd, 0x3b9b, 0x30b7, 0x34c7, 0x395d, 0x358b, 0x3b7e, 0x3a3b, 0x349f, 0x26bd, 0x3450, 0x31a3, 0x3b5a, 0x2c24, 0x3abd, 0x398f, 0x3087, 0x345f, 0x3752, 0x3a6c, 0x3937, 0x3325, 0x392a, 0x3518, 0x3adb, 0x38e0, 0x37c0, 0x26fa, 0x2bf1, 0x3782, 0x3b84, 0x397b, 0x2774, 0x32e5, 0x23c4, 0x33e4, 0x378f, 0x2fe5, 0x2f21, 0x3001, 0x3bc9, 0x3a3c, 0x38bd, 0x38d0, 0x363b, 0x3a8a, 0x3687, 0x2e6a, -0x3bef, 0x3b90, 0x3712, 0x30f7, 0x3be2, 0x2621, 0x39dd, 0x3932, 0x373f, 0x398f, 0x3937, 0x34c3, 0x3a34, 0x2e3d, 0x3bb3, 0x361a, 0x36b9, 0x2c6a, 0x38de, 0x39a1, 0x395f, 0x280c, 0x371b, 0x33c3, 0x2d37, 0x389e, 0x2ddc, 0x2bd2, 0x3471, 0x34e3, 0x36de, 0x305f, 0x3ab5, 0x3514, 0x327b, 0x309e, 0x360c, 0x2d09, 0x3b2a, 0x3b49, 0x38b0, 0x37b3, 0x2f97, 0x3ad7, 0x38a2, 0x351c, 0x3bdf, 0x3877, 0x3ad6, 0x3b26, 0x3ba5, 0x3318, 0x3bd7, 0x3907, 0x3983, 0x33b6, 0x34b7, 0x3bf5, 0x38e7, 0x3b82, 0x2d0e, 0x3a8b, 0x382b, 0x3594, -0x2f6f, 0x3667, 0x3a56, 0x2f88, 0x3b3f, 0x3b82, 0x2dbf, 0x379b, 0x386a, 0x39e3, 0x3320, 0x39aa, 0x3821, 0x38db, 0x337b, 0x384b, 0x3a06, 0x3a5f, 0x182f, 0x35e2, 0x3b22, 0x1e2a, 0x3b64, 0x35b2, 0x3884, 0x360c, 0x36b1, 0x3928, 0x36fa, 0x358c, 0x396f, 0x366f, 0x3986, 0x3a4f, 0x381c, 0x301a, 0x38fe, 0x36e1, 0x34d1, 0x3b30, 0x36ac, 0x3803, 0x3888, 0x38d9, 0x3853, 0x35d6, 0x3469, 0x39da, 0x3829, 0x355c, 0x3803, 0x3834, 0x3a1d, 0x35e3, 0x397d, 0x2f1a, 0x3b10, 0x3486, 0x3b0b, 0x3b2f, 0x38b6, 0x3690, 0x3b7b, 0x39b1, -0x385b, 0x3bad, 0x3102, 0x32ef, 0x39e2, 0x37dd, 0x2d05, 0x3a1b, 0x3bd5, 0x30d5, 0x3131, 0x2c1d, 0x3a47, 0x386e, 0x3481, 0x2530, 0x351b, 0x34e2, 0x336d, 0x35c2, 0x331d, 0x38cf, 0x2d9a, 0x394b, 0x296b, 0x3401, 0x386d, 0x34d5, 0x37a2, 0x3bd2, 0x39c2, 0x2756, 0x2553, 0x3289, 0x38f0, 0x3af7, 0x3791, 0x3b28, 0x37e3, 0x39b7, 0x3ba9, 0x3404, 0x3755, 0x3a3b, 0x2f50, 0x38c1, 0x3761, 0x2ded, 0x3ba6, 0x318f, 0x3a6f, 0x39fd, 0x3b99, 0x31bd, 0x3821, 0x3bd8, 0x3b96, 0x3a18, 0x383c, 0x1baa, 0x3acb, 0x391d, 0x3149, 0x307f, -0x3836, 0x2d47, 0x3b56, 0x346f, 0x3a5e, 0x2bb4, 0x3819, 0x2f90, 0x3a5d, 0x38fe, 0x2fff, 0x39bb, 0x3b8d, 0x3901, 0x37cf, 0x38dc, 0x3690, 0x3b45, 0x3101, 0x3bbf, 0x3b00, 0x28a7, 0x3a4d, 0x3a90, 0x3b87, 0x3b1f, 0x35c6, 0x37af, 0x3796, 0x3beb, 0x3a72, 0x3887, 0x284e, 0x3b05, 0x32e5, 0x3837, 0x39b3, 0x36e8, 0x3b7d, 0x3726, 0x2899, 0x3b90, 0x33d7, 0x357f, 0x388e, 0x2ec2, 0x3b1e, 0x393b, 0x3ac7, 0x3844, 0x3612, 0x3a08, 0x319d, 0x38da, 0x3a50, 0x3abd, 0x3451, 0x3b78, 0x2dcf, 0x21b8, 0x3505, 0x3492, 0x3aa2, 0x304d, -0x3999, 0x3af3, 0x3966, 0x35d5, 0x3325, 0x3a6b, 0x34b8, 0x3123, 0x37d6, 0x3bb6, 0x3818, 0x39df, 0x3463, 0x34b6, 0x3739, 0x38a3, 0x38ea, 0x39fb, 0x3774, 0x38e1, 0x39dd, 0x3194, 0x3a69, 0x38cf, 0x3a3f, 0x3870, 0x3b80, 0x2e42, 0x3792, 0x3778, 0x34df, 0x3453, 0x3840, 0x3bf1, 0x37d9, 0x3798, 0x2ca7, 0x3a7e, 0x3240, 0x3250, 0x3a08, 0x2f88, 0x3bcf, 0x3ad6, 0x3919, 0x1a97, 0x37d2, 0x331a, 0x34d9, 0x38b5, 0x367d, 0x305f, 0x38f8, 0x347e, 0x31ed, 0x3b4c, 0x3950, 0x3976, 0x3297, 0x3bc8, 0x3950, 0x3759, 0x28b8, 0x3323, -0x38c4, 0x33cd, 0x2ef0, 0x2eba, 0x32dd, 0x3a41, 0x307d, 0x2a3c, 0x3b22, 0x33fa, 0x32f7, 0x3b54, 0x30e8, 0x3a5e, 0x3b0d, 0x349f, 0x3a5b, 0x3bc0, 0x38a0, 0x3247, 0x3444, 0x357e, 0x3611, 0x26f3, 0x3b63, 0x3a31, 0x3a65, 0x385b, 0x3b77, 0x34fc, 0x380c, 0x38fb, 0x36dd, 0x39e6, 0x3719, 0x2e8c, 0x3407, 0x3161, 0x39ac, 0x3842, 0x37cc, 0x3a17, 0x3452, 0x35c1, 0x3a5b, 0x39bd, 0x38a0, 0x39c2, 0x30ac, 0x345e, 0x3710, 0x3b30, 0x3038, 0x2b7a, 0x2494, 0x1db7, 0x3b83, 0x32a0, 0x3b2f, 0x3ac1, 0x3512, 0x3662, 0x3656, 0x3470, -0x3524, 0x3bbb, 0x3650, 0x3878, 0x3928, 0x36c2, 0x34aa, 0x3ae7, 0x36c1, 0x3a35, 0x36f7, 0x2fe3, 0x2d17, 0x302d, 0x310f, 0x3260, 0x3826, 0x3162, 0x36f0, 0x3bf7, 0x3918, 0x2bdb, 0x35fd, 0x3984, 0x314d, 0x2400, 0x3867, 0x3926, 0x2cf4, 0x3958, 0x38e1, 0x3876, 0x393d, 0x369f, 0x3709, 0x39b7, 0x2960, 0x3aaf, 0x35fc, 0x3bf7, 0x390b, 0x34f5, 0x3856, 0x3171, 0x3895, 0x1e18, 0x323e, 0x389c, 0x3970, 0x28af, 0x3bd3, 0x3489, 0x3955, 0x3544, 0x36c8, 0x34d7, 0x38cf, 0x2c56, 0x3409, 0x320d, 0x1f86, 0x3a18, 0x3385, 0x3082, -0x3574, 0x2cd1, 0x392c, 0x3681, 0x39f6, 0x397c, 0x29bb, 0x3615, 0x2e16, 0x3b61, 0x390d, 0x318e, 0x31f0, 0x3836, 0x3ad6, 0x27dd, 0x3924, 0x2e6b, 0x37f0, 0x3460, 0x396a, 0x35e9, 0x2241, 0x34d7, 0x3a17, 0x3482, 0x28f3, 0x2802, 0x3a32, 0x3aea, 0x38ad, 0x3932, 0x3acb, 0x36ca, 0x3bdf, 0x292d, 0x3abe, 0x39f0, 0x38a5, 0x33e8, 0x2dbb, 0x3b56, 0x381c, 0x3ae0, 0x38c6, 0x268f, 0x3791, 0x338e, 0x3585, 0x2e4b, 0x3b3b, 0x34d4, 0x3959, 0x3acc, 0x3532, 0x375c, 0x378e, 0x369f, 0x3755, 0x34cd, 0x38a4, 0x301d, 0x31be, 0x3baf, -0x2f01, 0x385e, 0x36cb, 0x3705, 0x3554, 0x3813, 0x3936, 0x384a, 0x397e, 0x3851, 0x3711, 0x3992, 0x38f1, 0x399b, 0x3650, 0x3951, 0x2f57, 0x3a85, 0x3be3, 0x3899, 0x38bd, 0x3952, 0x3826, 0x3897, 0x3ac0, 0x39ae, 0x3b07, 0x3297, 0x331e, 0x38d3, 0x396a, 0x3a4a, 0x3646, 0x3ae4, 0x3824, 0x3598, 0x33d8, 0x3945, 0x371a, 0x3509, 0x3b58, 0x3806, 0x39a1, 0x3aee, 0x389b, 0x39e3, 0x3b5a, 0x3754, 0x3ab7, 0x37ee, 0x2e4f, 0x38f7, 0x38f0, 0x3241, 0x3a33, 0x395a, 0x3659, 0x2d3c, 0x2d66, 0x3850, 0x3b82, 0x39f2, 0x3bca, 0x37a0, -0x3adc, 0x3975, 0x3168, 0x39eb, 0x3b70, 0x2ece, 0x31ff, 0x3623, 0x1cca, 0x380a, 0x3bc0, 0x370c, 0x38dc, 0x3b80, 0x375d, 0x372c, 0x3b52, 0x3b67, 0x37d7, 0x2c50, 0x39f6, 0x39a0, 0x392b, 0x343d, 0x3b2c, 0x3816, 0x2bd5, 0x389b, 0x37a1, 0x32c6, 0x37bc, 0x3b7c, 0x358c, 0x30b0, 0x3bd7, 0x3a6e, 0x37de, 0x3330, 0x2e8a, 0x353c, 0x3b3d, 0x3956, 0x3bcf, 0x301e, 0x36ad, 0x3a37, 0x3b42, 0x383e, 0x36d1, 0x3a53, 0x3bba, 0x2ac8, 0x394c, 0x3b04, 0x3460, 0x3642, 0x38d4, 0x26da, 0x3989, 0x3aad, 0x380d, 0x3a1b, 0x3638, 0x355e, -0x3b4b, 0x310e, 0x35b0, 0x2efd, 0x39bc, 0x3ba9, 0x3a07, 0x34c8, 0x2c21, 0x3aa7, 0x37aa, 0x35c8, 0x2db5, 0x352c, 0x38a7, 0x37ef, 0x3323, 0x3a2f, 0x32da, 0x33a6, 0x3226, 0x3053, 0x39cc, 0x349c, 0x2821, 0x3b7b, 0x2c88, 0x354f, 0x3a0b, 0x3b10, 0x3a6e, 0x3949, 0x360c, 0x3bb1, 0x3bc1, 0x3888, 0x3402, 0x3102, 0x3511, 0x3b3c, 0x38ba, 0x335a, 0x27b9, 0x3215, 0x389c, 0x37a2, 0x346f, 0x39cf, 0x3a60, 0x37f1, 0x3426, 0x3bd7, 0x3be2, 0x3910, 0x3b40, 0x3a0e, 0x3aad, 0x32da, 0x37af, 0x3bb5, 0x36ad, 0x3262, 0x2aae, 0x3085, -0x3a1e, 0x388c, 0x38ab, 0x3742, 0x2393, 0x3b6b, 0x3a53, 0x3b0d, 0x2d23, 0x3354, 0x38eb, 0x3a07, 0x377a, 0x3bb6, 0x3328, 0x3873, 0x3a9e, 0x36df, 0x32ad, 0x3345, 0x31d5, 0x359f, 0x221b, 0x3a16, 0x35d0, 0x361a, 0x3aac, 0x3b79, 0x38b5, 0x3a28, 0x3700, 0x3b8e, 0x3aca, 0x35e8, 0x396e, 0x39b7, 0x36ad, 0x2aa7, 0x3b8b, 0x372d, 0x2ae7, 0x3a7f, 0x3b58, 0x3861, 0x3b16, 0x329a, 0x3b6a, 0x334e, 0x3aa7, 0x30a9, 0x3385, 0x3bb4, 0x32fa, 0x2a3a, 0x3540, 0x2ef0, 0x303b, 0x387c, 0x38fc, 0x380f, 0x39fe, 0x2e69, 0x3849, 0x32a0, -0x38f2, 0x3851, 0x37e4, 0x2540, 0x3975, 0x2eff, 0x361f, 0x3392, 0x347c, 0x36fd, 0x3bcd, 0x3af0, 0x3944, 0x3867, 0x2ce0, 0x3757, 0x1ca3, 0x3acf, 0x3baf, 0x3bf8, 0x365b, 0x3920, 0x2aa7, 0x3b21, 0x3408, 0x3720, 0x3ae0, 0x3845, 0x3a03, 0x24b4, 0x390f, 0x1cdd, 0x34f8, 0x3437, 0x3b5b, 0x39d4, 0x3885, 0x3418, 0x3ace, 0x387c, 0x32b3, 0x30dc, 0x392a, 0x330a, 0x2aa0, 0x3432, 0x3b83, 0x32f1, 0x2d12, 0x3639, 0x3909, 0x3a99, 0x384a, 0x3509, 0x3472, 0x3896, 0x2c46, 0x37ee, 0x3a2c, 0x2cf3, 0x3bc9, 0x3b86, 0x3b7a, 0x364d, -0x38bb, 0x34d8, 0x3787, 0x3789, 0x3a42, 0x2703, 0x3849, 0x328f, 0x38ce, 0x2b0b, 0x3bdb, 0x2e3d, 0x34e2, 0x3bfa, 0x371c, 0x3a3c, 0x350c, 0x39b8, 0x3903, 0x3a6c, 0x3666, 0x2c34, 0x3566, 0x3b12, 0x31ef, 0x39ea, 0x2b79, 0x3924, 0x299f, 0x2c72, 0x302f, 0x2d50, 0x36f2, 0x3bbc, 0x3b41, 0x39be, 0x3b2f, 0x3061, 0x37a2, 0x3571, 0x3ae0, 0x32a5, 0x3740, 0x3a56, 0x3734, 0x2eee, 0x39b7, 0x36d9, 0x3494, 0x34c1, 0x3141, 0x2e0f, 0x36db, 0x3884, 0x2e5e, 0x3a3f, 0x31e4, 0x3118, 0x3789, 0x3722, 0x3a1f, 0x3989, 0x3afc, 0x32ca, -0x391a, 0x38ae, 0x2eaf, 0x38c0, 0x37b2, 0x3842, 0x3978, 0x39b0, 0x3b70, 0x3455, 0x3b54, 0x3ae3, 0x3b2b, 0x34af, 0x2db7, 0x3b6f, 0x3a31, 0x3a1e, 0x3ab3, 0x355b, 0x3a4d, 0x333e, 0x3069, 0x3b8a, 0x39b1, 0x3509, 0x387f, 0x3b22, 0x3a91, 0x38c3, 0x3b78, 0x3459, 0x38a9, 0x32ff, 0x3230, 0x3af4, 0x39da, 0x30c9, 0x3b51, 0x380d, 0x3726, 0x360e, 0x2816, 0x3308, 0x3a3c, 0x37f9, 0x37ee, 0x30ea, 0x3903, 0x3514, 0x398e, 0x35de, 0x39cf, 0x3a63, 0x3af0, 0x2732, 0x380a, 0x3548, 0x26b0, 0x38d7, 0x38e2, 0x3935, 0x3a8d, 0x315a, -0x3b20, 0x389a, 0x3ade, 0x3bc4, 0x3654, 0x36c7, 0x271b, 0x38bb, 0x315c, 0x3728, 0x340f, 0x380d, 0x2cbc, 0x3adb, 0x299c, 0x365f, 0x39f6, 0x338d, 0x31d9, 0x3aa7, 0x3494, 0x349d, 0x3ae8, 0x3020, 0x3abb, 0x3949, 0x3747, 0x366b, 0x2d3f, 0x35c9, 0x3b18, 0x3a34, 0x38e6, 0x284a, 0x37bd, 0x32f3, 0x35d7, 0x3782, 0x3ab9, 0x3832, 0x3002, 0x3bdb, 0x30e9, 0x39a5, 0x3a89, 0x3a6f, 0x3a07, 0x3bb9, 0x3687, 0x3865, 0x35d8, 0x3a83, 0x37d6, 0x3827, 0x3a45, 0x3962, 0x35df, 0x2ea9, 0x3955, 0x3582, 0x37ad, 0x3382, 0x3507, 0x3966, -0x2c40, 0x37ef, 0x31ad, 0x39ff, 0x2863, 0x3a05, 0x2932, 0x2e97, 0x3153, 0x3b3e, 0x3237, 0x3b24, 0x3262, 0x3ba3, 0x3b37, 0x3a33, 0x2499, 0x3661, 0x2a11, 0x3618, 0x2a3f, 0x39e2, 0x1c4a, 0x3a51, 0x2d39, 0x3268, 0x2f51, 0x341e, 0x39f9, 0x3833, 0x32a3, 0x3952, 0x37ce, 0x39d2, 0x2d87, 0x320f, 0x34e6, 0x3840, 0x3684, 0x318b, 0x3460, 0x39ca, 0x386f, 0x2979, 0x3ba1, 0x3a8c, 0x3341, 0x3845, 0x3acd, 0x2b68, 0x2827, 0x3547, 0x2e0a, 0x39db, 0x381b, 0x3969, 0x3501, 0x38d4, 0x3ba7, 0x35f7, 0x351b, 0x3285, 0x3861, 0x3957, -0x36e2, 0x32c4, 0x3581, 0x3bb7, 0x3b2f, 0x3a00, 0x3609, 0x3ab8, 0x3b09, 0x34c6, 0x391e, 0x3257, 0x3b08, 0x3bc0, 0x364f, 0x3910, 0x3a1f, 0x37c2, 0x3522, 0x34c6, 0x3bb9, 0x38ba, 0x2f63, 0x38c3, 0x38a6, 0x3436, 0x3af1, 0x346f, 0x3774, 0x3b0c, 0x3409, 0x3b6c, 0x3394, 0x3a2f, 0x3abc, 0x2ea9, 0x3501, 0x3a31, 0x2edc, 0x341e, 0x3be5, 0x3a01, 0x3372, 0x3814, 0x3b88, 0x3811, 0x3956, 0x3bc0, 0x338b, 0x3075, 0x3957, 0x3ba1, 0x2f43, 0x386d, 0x388f, 0x376c, 0x3a09, 0x38b2, 0x3a12, 0x3a4d, 0x2eb5, 0x3afc, 0x3477, 0x349d, -0x3403, 0x35e8, 0x3a01, 0x37c2, 0x3a3c, 0x3ab6, 0x3165, 0x3bd0, 0x3832, 0x36c7, 0x38be, 0x38fb, 0x3916, 0x3574, 0x31b1, 0x3b73, 0x3635, 0x38f4, 0x32ac, 0x25c6, 0x38f2, 0x248f, 0x3ae9, 0x384f, 0x374a, 0x3bf2, 0x3bf5, 0x3719, 0x3b78, 0x3688, 0x2ed4, 0x3443, 0x305c, 0x390d, 0x38d0, 0x34dd, 0x3662, 0x3902, 0x3752, 0x3b76, 0x347b, 0x356c, 0x3809, 0x3b59, 0x3a41, 0xbb1, 0x3872, 0x362e, 0x3669, 0x3741, 0x3a79, 0x3560, 0x1ca8, 0x38da, 0x3901, 0x34a3, 0x3b63, 0x391c, 0x3990, 0x39af, 0x3bd2, 0x3afb, 0x3b68, 0x354e, -0x39ba, 0x35ca, 0x3483, 0x3aaf, 0x3489, 0x2fbe, 0x38e7, 0x3678, 0x3928, 0x2358, 0x372e, 0x37d9, 0x3929, 0x3695, 0x3607, 0x2c73, 0x37d7, 0x39ee, 0x3acd, 0x3898, 0x3580, 0x3bd5, 0x3a67, 0x2f13, 0x388d, 0x3a39, 0x2d6e, 0x389d, 0x359d, 0x37a3, 0x37f4, 0x31bf, 0x36cb, 0x3bc2, 0x3b4d, 0x3077, 0x35d8, 0x3afb, 0x36bf, 0x31c7, 0x36b7, 0x3ac9, 0x2076, 0x2f55, 0x392e, 0x348d, 0x305e, 0x3a4b, 0x36e3, 0x3acf, 0x34e2, 0x396a, 0x3785, 0x3bf8, 0x354d, 0x36bd, 0x395c, 0x3313, 0x39ad, 0x2ede, 0x3561, 0x3a82, 0x30bb, 0x34fc, -0x2fae, 0x3b98, 0x36c8, 0x3ad8, 0x3813, 0x39f3, 0x3bc3, 0x3b85, 0x3aa0, 0x3a09, 0x368a, 0x2ddb, 0x39d7, 0x32f6, 0x3b8c, 0x3b51, 0x39bd, 0x3680, 0x3b92, 0x3825, 0x3798, 0x3a62, 0x3847, 0x3a30, 0x393e, 0x38de, 0x38e9, 0x3a64, 0x3a29, 0x3a25, 0x386e, 0x315f, 0x2de2, 0x3be7, 0x3bc1, 0x35ef, 0x35bb, 0x3968, 0x3a64, 0x34ff, 0x3766, 0x3b8e, 0x3657, 0x344a, 0x2cd0, 0x377c, 0x3881, 0x3456, 0x350b, 0x3a5f, 0x3b5f, 0x3960, 0x3767, 0x38b4, 0x3729, 0x3b19, 0x35c4, 0x3bc1, 0x32d9, 0x3185, 0x3b32, 0x3108, 0x3775, 0x3b82, -0x3803, 0x38e2, 0x3aa4, 0x3b1e, 0x30a1, 0x3bc1, 0x3b4d, 0x36ad, 0x2192, 0x2837, 0x3b53, 0x3ab8, 0x3883, 0x3b36, 0x3418, 0x3ac1, 0x3589, 0x38ae, 0x3614, 0x3172, 0x2e48, 0x3b6a, 0x39f1, 0x3828, 0x3550, 0x2cf0, 0x39ac, 0x2bcb, 0x38e9, 0x3498, 0x3a3a, 0x307f, 0x3887, 0x2675, 0x3705, 0x371e, 0x3982, 0x3ba9, 0x38d0, 0x39f8, 0x3413, 0x3483, 0x32b8, 0x3720, 0x357d, 0x39b4, 0x39bf, 0x38c8, 0x3550, 0x3071, 0x39f2, 0x29ae, 0x2348, 0x3ae3, 0x3792, 0x3b98, 0x3b40, 0x390a, 0x38e3, 0x3a78, 0x3875, 0x3a63, 0x39e2, 0x3b24, -0x3288, 0x35c4, 0x35b4, 0x3a60, 0x31d2, 0x39ca, 0x2527, 0x3445, 0x3b44, 0x315b, 0x2553, 0x3453, 0x2ddd, 0x3889, 0x2897, 0x37da, 0x3553, 0x3826, 0x39a0, 0x38b1, 0x2681, 0x38f4, 0x351c, 0x3bdf, 0x3ac9, 0x3a44, 0x37fd, 0x394c, 0x2f46, 0x28ca, 0x3097, 0x30f2, 0x3830, 0x3711, 0x36ba, 0x3ba8, 0x3570, 0x38b5, 0x3943, 0x398d, 0x3994, 0x3109, 0x30dc, 0x3a40, 0x3648, 0x2050, 0x329e, 0x3432, 0x35b8, 0x3667, 0x3b4a, 0x29fe, 0x35cc, 0x3675, 0x3b8e, 0x34cb, 0x3531, 0x2acc, 0x395d, 0x3411, 0x3a65, 0x3a30, 0x35f6, 0x3710, -0x364f, 0x2f34, 0x38d8, 0x39d5, 0x2e37, 0x350d, 0x39fe, 0x37ed, 0x3726, 0x3a6b, 0x3b6f, 0x35ce, 0x38bc, 0x3929, 0x33d7, 0x28ef, 0x38d7, 0x35df, 0x3ac8, 0x333d, 0x2356, 0x35d5, 0x377b, 0x3bca, 0x3ad7, 0x309f, 0x36d3, 0x2bf6, 0x373f, 0x2c5f, 0x374a, 0x35f0, 0x397a, 0x34fc, 0x2dd8, 0x3947, 0x3bcc, 0x3bfb, 0x3366, 0x3721, 0x310a, 0x3433, 0x391e, 0x375e, 0x367c, 0x3a07, 0x3873, 0x34d6, 0x2f47, 0x3771, 0x3a83, 0x3bee, 0x36d7, 0x3b2f, 0x39be, 0x305e, 0x21cc, 0x2e70, 0x388c, 0x34f2, 0x393b, 0x3610, 0x3a59, 0x3294, -0x2fa8, 0x3343, 0x3740, 0x38e3, 0x3a0c, 0x302d, 0x3ba9, 0x34f1, 0x3879, 0x29cc, 0x35e0, 0x31d0, 0x381b, 0x3bcd, 0x35a5, 0x3a87, 0x369d, 0x35b9, 0x2eba, 0x3992, 0x3ae3, 0x393c, 0x3a39, 0x31b2, 0x3b4d, 0x3868, 0x364a, 0x3164, 0x348c, 0x30c8, 0x3bd3, 0x3a96, 0x3570, 0x31ce, 0x357f, 0x1fb0, 0x3a40, 0x38bd, 0x2802, 0x376e, 0x35c3, 0x3264, 0x33ac, 0x3878, 0x3a0c, 0x3a25, 0x38cb, 0x247a, 0x384b, 0x3a58, 0x357c, 0x36af, 0x384a, 0x3b93, 0x3a46, 0x348b, 0x3526, 0x3be8, 0x316c, 0x385c, 0x3a41, 0x3b4d, 0x3045, 0x3a20, -0x3870, 0x3523, 0x38c0, 0x3636, 0x390a, 0x38f2, 0x2b41, 0x261a, 0x380e, 0x3a74, 0x331a, 0x30ae, 0x37dd, 0x328c, 0x3a1c, 0x2fc0, 0x3994, 0x3095, 0x3900, 0x2cc8, 0x38ec, 0x3bdc, 0x3820, 0x2b39, 0x3422, 0x38be, 0x3a1f, 0x3b2b, 0x38e6, 0x3839, 0x3afc, 0x3bb4, 0x3422, 0x3b0f, 0x38f1, 0x3b5d, 0x39be, 0x341a, 0x374f, 0x31fe, 0x38bc, 0x38ff, 0x32d3, 0x38a0, 0x3894, 0x396b, 0x395e, 0x3b0e, 0x39c2, 0x2f3e, 0x2d76, 0x38c5, 0x3365, 0x3685, 0x2d08, 0x3a5b, 0x3693, 0x2e6e, 0x3b1a, 0x39bf, 0x347b, 0x2e04, 0x3b7a, 0x3b02, -0x3b57, 0x36ac, 0x32d3, 0x2273, 0x33a6, 0x3542, 0x38d4, 0x3a1c, 0x3811, 0x33d8, 0x3b79, 0x390c, 0x2c29, 0x3858, 0x395d, 0x38d9, 0x343a, 0x3148, 0x3715, 0x3966, 0x2fc6, 0x318e, 0x3784, 0x383e, 0x354d, 0x35a8, 0x38c7, 0x3662, 0x32d3, 0x37be, 0x396a, 0x39a3, 0x39fd, 0x3b0f, 0x3bf3, 0x3a7b, 0x38d5, 0x3343, 0x3ae6, 0x3926, 0x3a7a, 0x3744, 0x3acb, 0x39b8, 0x3ab1, 0x3bad, 0x392a, 0x390c, 0x2f37, 0x2ab5, 0x2935, 0x384a, 0x3235, 0x38d2, 0x360d, 0x38de, 0x3948, 0x383f, 0x241a, 0x3bb0, 0x36cb, 0x3590, 0x369c, 0x3680, -0x39d3, 0x3a6e, 0x39db, 0x390e, 0x398f, 0x3baf, 0x38d0, 0x3911, 0x3b72, 0x3407, 0x39e4, 0x3500, 0x3844, 0x3283, 0x2f1a, 0x3bf1, 0x30bc, 0x3b2d, 0x3a43, 0x393f, 0x3405, 0x2671, 0x3b95, 0x361e, 0x34ea, 0x3791, 0x39b2, 0x3136, 0x36af, 0x3435, 0x3b36, 0x3602, 0x356a, 0x388c, 0x3099, 0x33a3, 0x37f2, 0x25e7, 0x393c, 0x398c, 0x2bc2, 0x36e0, 0x39d4, 0x3842, 0x3103, 0x39d1, 0x3653, 0x2c8a, 0x38ed, 0x2920, 0x39c0, 0x3b94, 0x2da9, 0x3018, 0x2c9d, 0x3660, 0x2f3b, 0x2615, 0x3af0, 0x26ab, 0x36ab, 0x2bdf, 0x38a0, 0x38f7, -0x33f2, 0x3bb2, 0x3a92, 0x3844, 0x2ab7, 0x3bee, 0x353d, 0x39ea, 0x3abb, 0x3afe, 0x3052, 0x2d56, 0x38f7, 0x3a1a, 0x390a, 0x38b9, 0x384d, 0x31c6, 0x2ab4, 0x2a49, 0x391a, 0x3871, 0x3474, 0x380f, 0x396b, 0x3b4b, 0x3486, 0x28c1, 0x2ecc, 0x3781, 0x35ad, 0x3208, 0x3a2c, 0x3b69, 0x3b86, 0x388d, 0x3818, 0x38cd, 0x38d8, 0x28bb, 0x3bfd, 0x3b6e, 0x36a7, 0x31ab, 0x342b, 0x315c, 0x3146, 0x1f51, 0x2708, 0x3b94, 0x3a14, 0x2f0e, 0x39d5, 0x398e, 0x3b9a, 0x356c, 0x3009, 0x3111, 0x35e9, 0x39f9, 0x3b1b, 0x3b9f, 0x3b8c, 0x3a89, -0x3839, 0x37e7, 0x3527, 0x32d6, 0x3826, 0x3132, 0x358e, 0x37b0, 0x3055, 0x3909, 0x33f4, 0x2bd3, 0x39ff, 0x2f9e, 0x348f, 0x382d, 0x3a10, 0x34b0, 0x3833, 0x3873, 0x3840, 0x30a9, 0x3bb0, 0x2f6b, 0x3a1c, 0x35eb, 0x3a6a, 0x38ec, 0x3050, 0x3981, 0x3645, 0x39fe, 0x2f66, 0x3aa0, 0x3a6b, 0x3b2f, 0x3941, 0x3521, 0x3095, 0x3b6f, 0x38c6, 0x37dd, 0x3146, 0x39ea, 0x395c, 0x3a59, 0x3ae1, 0x3798, 0x289f, 0x36fa, 0x3b0a, 0x3adc, 0x3392, 0x35f5, 0x3bbf, 0x3b31, 0x3087, 0x3a54, 0x3758, 0x3834, 0x3bcc, 0x3946, 0x3627, 0x3bae, -0x39ac, 0x369f, 0x3841, 0x34b0, 0x3679, 0x3580, 0x32a7, 0x387d, 0x3aa8, 0x382a, 0x35f1, 0x3b90, 0x36a2, 0x2d87, 0x30f4, 0x3b22, 0x359c, 0x3b7f, 0x344e, 0x3a94, 0x382d, 0x3a83, 0x39ae, 0x379e, 0x2f7b, 0x39b3, 0x325e, 0x3873, 0x35ac, 0x378b, 0x3804, 0x3a5c, 0x33f3, 0x2e4e, 0x3b32, 0x3629, 0x3bd6, 0x354b, 0x2952, 0x3828, 0x26d0, 0x39e2, 0x3bf7, 0x2d3c, 0x2754, 0x38f9, 0x3801, 0x39a0, 0x34bb, 0x378f, 0x2e1a, 0x3999, 0x3ad5, 0x25f0, 0x3a4f, 0x275f, 0x3550, 0x318f, 0x3862, 0x3a96, 0x38d5, 0x3927, 0x3010, 0x3a78, -0x2c99, 0x2bdd, 0x3b86, 0x34c2, 0x39a9, 0x35c5, 0x2e15, 0x383b, 0x2f68, 0x399d, 0x290b, 0x375b, 0x39e8, 0x37ec, 0x3a06, 0x3780, 0x38ad, 0x356c, 0x32c9, 0x3b65, 0x3819, 0x39e3, 0x3470, 0x2d14, 0x3ae8, 0x3952, 0x2e47, 0x37cc, 0x308c, 0x347a, 0x2d07, 0x3476, 0x39b1, 0x3b7b, 0x2f49, 0x3aa6, 0x3994, 0x270e, 0x39d7, 0x286a, 0x2daa, 0x37ae, 0x38da, 0x3a14, 0x3b0b, 0x3791, 0x35fe, 0x35a0, 0x38fb, 0x3b73, 0x24a6, 0x3b0d, 0x3891, 0x3441, 0x2542, 0x23ce, 0x3af6, 0x38c5, 0x3bac, 0x3be4, 0x39f5, 0x3740, 0x3133, 0x2e12, -0x3b52, 0x3571, 0x3ae5, 0x353c, 0x3a19, 0x343b, 0x3b41, 0x2f69, 0x36f0, 0x3ab5, 0x2a7a, 0x3568, 0x3ae6, 0x395b, 0x3bff, 0x332f, 0x2848, 0x3417, 0x38a2, 0x3986, 0x3b1a, 0x3a47, 0x3aeb, 0x39b0, 0x363f, 0x3ba3, 0x385a, 0x3af3, 0x373e, 0x3510, 0x2381, 0x37a8, 0x340d, 0x36b3, 0x3b10, 0x38ff, 0x32dd, 0x29a7, 0x3472, 0x3bc1, 0x39de, 0x32bb, 0x3682, 0x3a8f, 0x378d, 0x39ff, 0x3a9d, 0x332a, 0x3801, 0x3a5d, 0x2e8b, 0x3841, 0x3548, 0x3a75, 0x25a3, 0x3ab6, 0x37db, 0x37bf, 0x2c01, 0x3bf8, 0x3b7d, 0x1dfb, 0x26da, 0x3b6d, -0x3895, 0x384c, 0x3877, 0x3a0f, 0x3ac2, 0x3bac, 0x3b42, 0x39b0, 0x338b, 0x3017, 0x3b42, 0x31f6, 0x3bce, 0x3246, 0x2c63, 0x3bfd, 0x3924, 0x3a86, 0x3279, 0x3a88, 0x352d, 0x3bb0, 0x275d, 0x35b1, 0x37dc, 0x325d, 0x36ff, 0x37b6, 0x3873, 0x353d, 0x2f62, 0x37cd, 0x3be9, 0x37c2, 0x38e7, 0x22df, 0x3954, 0x3976, 0x3a05, 0x2e1f, 0x2def, 0x3bfc, 0x3aec, 0x385d, 0x3a08, 0x32e2, 0x3656, 0x38c4, 0x3aa9, 0x31f3, 0x3afa, 0x35b6, 0x3910, 0x381b, 0x30e5, 0x3050, 0x396b, 0x38f4, 0x3b00, 0x3b63, 0x3a2c, 0x39ec, 0x287e, 0x3873, -0x3890, 0x38b8, 0x3a4c, 0x3836, 0x31f0, 0x3732, 0x356b, 0x35de, 0x3a8e, 0x36a4, 0x34a1, 0x377a, 0x3005, 0x3749, 0x39d8, 0x3bee, 0x38e9, 0x34d2, 0x32d6, 0x3883, 0x3a5c, 0x2e19, 0x3aa8, 0x3881, 0x3306, 0x3790, 0x39ff, 0x35fb, 0x3b01, 0x2f92, 0x3302, 0x37c7, 0x3635, 0x3a56, 0x3106, 0x3997, 0x3af7, 0x36e7, 0x39b8, 0x3aa0, 0x3b1a, 0x326a, 0x1dca, 0x3af8, 0x383f, 0x3ba6, 0x21e0, 0x3540, 0x3ba7, 0x358d, 0x2ee4, 0x36e3, 0x3b47, 0x38a3, 0x3a38, 0x2bc4, 0x3ae2, 0x3a5c, 0x381c, 0x3912, 0x39ad, 0x3078, 0x35dc, 0x30f2, -0x374c, 0x351f, 0x30af, 0x3aaf, 0x1d79, 0x36b1, 0x2edc, 0x21fd, 0x3445, 0x374b, 0x388e, 0x39fb, 0x325e, 0x39a5, 0x3a63, 0x338d, 0x3abf, 0x1067, 0x38a2, 0x2389, 0x3a47, 0x3908, 0x33aa, 0x39ac, 0x3bc2, 0x370c, 0x3621, 0x3818, 0x2edf, 0x39c2, 0x3735, 0x3745, 0x3806, 0x389a, 0x3b05, 0x2755, 0x344a, 0x332a, 0x3a6b, 0x3854, 0x31b5, 0x374a, 0x354f, 0x3aa4, 0x36a1, 0x374a, 0x3b57, 0x2c4b, 0x36b2, 0x3066, 0x35de, 0x3820, 0x3ae5, 0x3a97, 0x3780, 0x24cc, 0x3831, 0x29b7, 0x3880, 0x30f9, 0x3775, 0x2a64, 0x396d, 0x3abd, -0x3456, 0x38c5, 0x3401, 0x39c9, 0x3a3e, 0x35f5, 0x3b74, 0x305d, 0x3902, 0x33c5, 0x37b3, 0x38df, 0x37ca, 0x2e80, 0x3200, 0x344c, 0x322b, 0x3914, 0x36a3, 0x3b76, 0x341f, 0x3a0b, 0x318c, 0x3a56, 0x3656, 0x3b09, 0x362b, 0x3a98, 0x3b25, 0x393d, 0x3b19, 0x37df, 0x373c, 0x3a59, 0x366b, 0x3321, 0x30d0, 0x399f, 0x3803, 0x3959, 0x2de4, 0x204c, 0x3881, 0x34bf, 0x3974, 0x3119, 0x3930, 0x3b63, 0x34c4, 0x36ce, 0x3bef, 0x387d, 0x2c5e, 0x3170, 0x2d69, 0x398d, 0x3790, 0x3adc, 0x390e, 0x38e9, 0x38f6, 0x3928, 0x35ea, 0x398c, -0x3a44, 0x3766, 0x34fc, 0x322d, 0x3812, 0x379d, 0x3ba0, 0x362e, 0x30b1, 0x311f, 0x20a4, 0x3b23, 0x35ab, 0x3a53, 0x3bda, 0x39d7, 0x31a5, 0x3be9, 0x2bac, 0x39aa, 0x3595, 0x3220, 0x3756, 0x3bdf, 0x331d, 0x3b09, 0x30b1, 0x3a28, 0x3a8b, 0x352f, 0x391e, 0x3a0d, 0x327c, 0x3a9d, 0x312b, 0x3b5a, 0x3875, 0x3b68, 0x22ba, 0x33c5, 0x3a38, 0x291a, 0x313a, 0x3892, 0x38f5, 0x3775, 0x34dc, 0x3b1b, 0x38ce, 0x31b8, 0x3aaa, 0x37dc, 0x2c05, 0x3a42, 0x3879, 0x3b0b, 0x319e, 0x3a30, 0x33ed, 0x365a, 0x389e, 0x316c, 0x24f6, 0x389e, -0x3aa8, 0x351e, 0x31fd, 0x3986, 0x39e3, 0x390f, 0x3b53, 0x39e2, 0x38bf, 0x393b, 0x3217, 0x39b1, 0x2c33, 0x3a61, 0x3897, 0x3af2, 0x2c93, 0x3b6c, 0x34ef, 0x3b00, 0x349c, 0x3a3d, 0x3797, 0x3bf6, 0x3a52, 0x31b6, 0x342c, 0x3bb4, 0x3aa1, 0x3537, 0x3aa1, 0x3776, 0x349e, 0x3860, 0x3670, 0x3b95, 0x3012, 0x38b5, 0x3991, 0x386a, 0x3a23, 0x37b0, 0x3b7a, 0x3993, 0x39b1, 0x3146, 0x37a0, 0x25f0, 0x3652, 0x33b4, 0x31ee, 0x3446, 0x3877, 0x3672, 0x35be, 0x3390, 0x330e, 0x3b03, 0x2f28, 0x2d4a, 0x3a78, 0x37ea, 0x3a0b, 0x3b47, -0x3062, 0x3400, 0x34de, 0x37e1, 0x37e6, 0x245a, 0x2ae1, 0x3716, 0x35b8, 0x3949, 0x30a8, 0x39a7, 0x3bc0, 0x29f2, 0x3641, 0x39b6, 0x31d1, 0x3ace, 0x3877, 0x32b8, 0x384b, 0x39ee, 0x38b7, 0x34ca, 0x3a20, 0x3318, 0x3be5, 0x2823, 0x38cb, 0x34b5, 0x396a, 0x32ad, 0x3ad7, 0x3a41, 0x35fc, 0x3a63, 0x30ad, 0x3825, 0x375b, 0x2c6e, 0x23c4, 0x3321, 0x2e54, 0x2c09, 0x329b, 0x330c, 0x2261, 0x3a04, 0x384c, 0x36e4, 0x2d15, 0x36e5, 0x2d13, 0x302c, 0x37cd, 0x3a17, 0x3497, 0x3bd5, 0x3afb, 0x3654, 0x3501, 0x3210, 0x377d, 0x38c8, -0x348e, 0x3412, 0x3648, 0x3bd7, 0x3a97, 0x2bd7, 0x36a6, 0x38c0, 0x3736, 0x3a0b, 0x2e19, 0x3b13, 0x38a9, 0x3b43, 0x2c76, 0x3b01, 0x3863, 0x3a81, 0x2d37, 0x39fb, 0x2ac8, 0x3590, 0x3bdc, 0x3bf7, 0x36d8, 0x33c7, 0x383e, 0x399c, 0x3482, 0x3325, 0x37d0, 0x3895, 0x2211, 0x33c6, 0x3afd, 0x3968, 0x393b, 0x3814, 0x35e3, 0x3347, 0x35ee, 0x397e, 0x3b3c, 0x399e, 0x35a7, 0x2929, 0x3ae2, 0x346a, 0x2ade, 0x3971, 0x3b81, 0x3af5, 0x343e, 0x39b0, 0x3aef, 0x38b7, 0x3166, 0x3b3c, 0x3b52, 0x3af6, 0x3a28, 0x363f, 0x28a2, 0x3a83, -0x3b69, 0x2fb4, 0x3934, 0x371e, 0x366f, 0x3754, 0x38c0, 0x3ba2, 0x3b87, 0x39a7, 0x32c6, 0x3027, 0x2969, 0x3415, 0x3a20, 0x3113, 0x3abe, 0x3906, 0x27cc, 0x337f, 0x35ab, 0x31b7, 0x390f, 0x3900, 0x35a9, 0x3a0e, 0x34fa, 0x37bb, 0x366e, 0x367e, 0x3948, 0x3afb, 0x36d9, 0x30a3, 0x3862, 0x2c6a, 0x39a8, 0x3a3c, 0x3574, 0x37bb, 0x2d5c, 0x364b, 0x392e, 0x2c0c, 0x3539, 0x38cf, 0x3b4e, 0x3a54, 0x2ebf, 0x38c3, 0x358e, 0x394c, 0x3a8d, 0x3ba8, 0x25cc, 0x3434, 0x2c2f, 0x39a3, 0x384f, 0x31a4, 0x3bbc, 0x2df2, 0x384d, 0x38cb, -0x3b26, 0x3413, 0x38c9, 0x2e86, 0x30a5, 0x364e, 0x3b26, 0x3814, 0x31ef, 0x3272, 0x3ac8, 0x35b0, 0x246f, 0x381c, 0x3755, 0x32bc, 0x358b, 0x35f4, 0x3767, 0x3a12, 0x3b09, 0x1270, 0x31d0, 0x389b, 0x3661, 0x3971, 0x376f, 0x3921, 0x367d, 0x2524, 0x3ae6, 0x39d1, 0x3517, 0x3890, 0x380d, 0x362b, 0x3944, 0x3792, 0x2df6, 0x30d7, 0x3bdb, 0x3918, 0x39e1, 0x3b27, 0x3bdb, 0x3bda, 0x3670, 0x3b9f, 0x3566, 0x3690, 0x2686, 0x3335, 0x3856, 0x35ac, 0x3957, 0x397a, 0x32da, 0x38f3, 0x3765, 0x34a7, 0x3a04, 0x361a, 0x3607, 0x38c0, -0x344a, 0x36b3, 0x3437, 0x3b66, 0x3a5a, 0x3909, 0x3455, 0x3530, 0x36e1, 0x2e4a, 0x39f1, 0x3aa7, 0x3480, 0x3af5, 0x3786, 0x39e6, 0x36ee, 0x24ce, 0x39cb, 0x3450, 0x3733, 0x3b77, 0x3be7, 0x3585, 0x3b30, 0x3994, 0x39df, 0x3a28, 0x3261, 0x35d5, 0x38a6, 0x391c, 0x3bd0, 0x39db, 0x3470, 0x3a77, 0x3722, 0x37e9, 0x3851, 0x2f5a, 0x31d8, 0x39f6, 0x3618, 0x3bcc, 0x2dc6, 0x39b1, 0x345c, 0x39a1, 0x3963, 0x3a6f, 0x39a6, 0x3541, 0x2d24, 0x39e8, 0x2e8e, 0x3439, 0x2520, 0x38cc, 0x3a3a, 0x2ce2, 0x38f7, 0x389c, 0x3469, 0x389b, -0x32e2, 0x3a11, 0x34ec, 0x33af, 0x3a1a, 0x3bcd, 0x27a3, 0x3b38, 0x2c62, 0x3b3d, 0x39cb, 0x1f85, 0x3576, 0x3a52, 0x3ad6, 0x3b42, 0x39ad, 0x38db, 0x2e9a, 0x21d9, 0x3b72, 0x329c, 0x2cd8, 0x3688, 0x373b, 0x3599, 0x354d, 0x3b76, 0x2260, 0x3903, 0x3be1, 0x36c1, 0x3b84, 0x3a9c, 0x342e, 0x3b05, 0x2d44, 0x3910, 0x3ab2, 0x3029, 0x3b1e, 0x3827, 0x33e1, 0x3674, 0x3a80, 0x2f78, 0x38c1, 0x3ad1, 0x306c, 0x3942, 0x3a8c, 0x3847, 0x3727, 0x37a0, 0x326f, 0x37a5, 0x2aa3, 0x2ec3, 0x3bef, 0x3a1c, 0x3914, 0x39c2, 0x3b4b, 0x2a9e, -0x3bce, 0x39a3, 0x397f, 0x39d7, 0x34bd, 0x3956, 0x3717, 0x2daf, 0x3b73, 0x33b4, 0x3bb3, 0x38d7, 0x372d, 0x344d, 0x2ceb, 0x2e98, 0x3509, 0x2d49, 0x3028, 0x34e0, 0x3681, 0x3734, 0x3be8, 0x31ed, 0x35d7, 0x38a4, 0x3a92, 0x350a, 0x3a6c, 0x397c, 0x3bb4, 0x33d4, 0x3872, 0x3873, 0x2fb0, 0x395b, 0x378a, 0x3a6b, 0x3a3f, 0x387a, 0x30ed, 0x39aa, 0x3854, 0x38b2, 0x3baa, 0x39ce, 0x3062, 0x3949, 0x319c, 0x3816, 0x3764, 0x2c84, 0x3682, 0x3a71, 0x3596, 0x3afc, 0x37b8, 0x386d, 0x3a37, 0x2a1e, 0x3845, 0x37ca, 0x3955, 0x380d, -0x355f, 0x3680, 0x3761, 0x358c, 0x3bbe, 0x2358, 0x381a, 0x31ec, 0x2d29, 0x2746, 0x2c34, 0x3abe, 0x2f82, 0x39f0, 0x2c9b, 0x33a6, 0x381c, 0x3bc1, 0x3b81, 0x2f9a, 0x3807, 0x2277, 0x38b2, 0x3210, 0x3b9f, 0x34ad, 0x3916, 0x30d3, 0x3a18, 0x39ac, 0x38a8, 0x3ba7, 0x2bb8, 0x3a70, 0x33d8, 0x37b9, 0x38ee, 0x3510, 0x3874, 0x3be7, 0x3952, 0x35f5, 0x38d3, 0x3ba6, 0x3452, 0x3401, 0x3819, 0x3beb, 0x3826, 0x3455, 0x3add, 0x2b23, 0x3590, 0x318e, 0x2d92, 0x3286, 0x2d2b, 0x3225, 0x38bd, 0x36c4, 0x3b29, 0x2e2c, 0x3088, 0x3974, -0x3859, 0x3795, 0x3bd4, 0x2f4e, 0x384a, 0x3ad9, 0x3aa7, 0x3448, 0x3736, 0x3b76, 0x3aac, 0x3959, 0x388b, 0x3a7f, 0x2b08, 0x29a3, 0x29c4, 0x2412, 0x30b4, 0x3b6d, 0x3a1b, 0x3b86, 0x337b, 0x34e4, 0x32e0, 0x34df, 0x3750, 0x3a39, 0x39f0, 0x39ed, 0x3a1a, 0x36d8, 0x3a40, 0x3b68, 0x388a, 0x2ce0, 0x3b16, 0x31ff, 0x3790, 0x35a3, 0x3a17, 0x3b01, 0x3686, 0x39d9, 0x25a1, 0x3ade, 0x3073, 0x3753, 0x33c3, 0x381a, 0x2f26, 0x2e04, 0x2dfb, 0x3779, 0x3813, 0x30a6, 0x3b85, 0x301a, 0x2f2c, 0x32b9, 0x38a5, 0x2fb3, 0x3bec, 0x39d9, -0x3097, 0x3524, 0x3a92, 0x3b9c, 0x3a0b, 0x3492, 0x348b, 0x35a3, 0x3534, 0x3ae8, 0x39dc, 0x3b77, 0x28c0, 0x3918, 0x3b4b, 0x3bc9, 0x3815, 0x373a, 0x3182, 0x35b7, 0x3906, 0x3b49, 0x32e0, 0x31c2, 0x345a, 0x376b, 0x27ba, 0x283f, 0x38f4, 0x3ab3, 0x380a, 0x3a1a, 0x3b3e, 0x3aef, 0x39aa, 0x2c6c, 0x2875, 0x3b82, 0x3bca, 0x36d6, 0x3833, 0x38f2, 0x30b8, 0x3b5d, 0x30e5, 0x201c, 0x3003, 0x373b, 0x395f, 0x3b0f, 0x3af4, 0x3b88, 0x39d5, 0x3a2d, 0x2f53, 0x2b79, 0x32e4, 0x3830, 0x384a, 0x37f7, 0x3a6a, 0x2eab, 0x3be0, 0x383d, -0x33ea, 0x33de, 0x38d0, 0x3112, 0x3ba3, 0x3034, 0x39fe, 0x37f5, 0x39be, 0x3069, 0x3a87, 0x3134, 0x3b62, 0x37ee, 0x3a4b, 0x3744, 0x28e5, 0x2b0c, 0x3048, 0x3abf, 0x3a79, 0x34d3, 0x3950, 0x3b57, 0x352c, 0x388b, 0x371c, 0x361f, 0x38f6, 0x3a5a, 0x34b4, 0x35e9, 0x3afc, 0x3653, 0x33ae, 0x34d1, 0x3a4f, 0x3a8d, 0x35e2, 0x2c87, 0x2972, 0x337e, 0x3a72, 0x3120, 0x368d, 0x33d8, 0x2694, 0x30f9, 0x3a90, 0x251a, 0x3074, 0x3ba7, 0x3a1c, 0x3a8e, 0x3953, 0x3900, 0x3935, 0x3b52, 0x2ebd, 0x3b51, 0x33f7, 0x3876, 0x2782, 0x370a, -0x3134, 0x33fd, 0x3885, 0x3919, 0x38a4, 0x3be0, 0x36a6, 0x34a3, 0x38c9, 0x3734, 0x3afb, 0x2ed7, 0x3691, 0x3212, 0x37e1, 0x36cf, 0x3683, 0x391e, 0x3856, 0x3812, 0x3b0f, 0x3bd7, 0x3936, 0x3a5c, 0x3393, 0x3340, 0x3b9d, 0x30d6, 0x37df, 0x3a62, 0x33c3, 0x3a3f, 0x3647, 0x3024, 0x3012, 0x378c, 0x3866, 0x35e9, 0x3bdf, 0x2521, 0x3adf, 0x3991, 0x39ec, 0x2638, 0x31da, 0x3531, 0x386c, 0x32ae, 0x393d, 0x39be, 0x3827, 0x3071, 0x3b2e, 0x36c1, 0x3748, 0x395d, 0x3812, 0x37b0, 0x349e, 0x3a46, 0x3a41, 0x37c9, 0x395f, 0x30cc, -0x3068, 0x2a29, 0x38c6, 0x345d, 0x279c, 0x36d3, 0x38a0, 0x3965, 0x3838, 0x378e, 0x364f, 0x39f9, 0x3a98, 0x32b1, 0x3444, 0x3be9, 0x39a7, 0x3520, 0x3823, 0x3afc, 0x3387, 0x3170, 0x38af, 0x2cc3, 0x358b, 0x2e30, 0x3ac8, 0x3803, 0x36f6, 0x3747, 0x38a8, 0x3a9e, 0x211e, 0x3b13, 0x2cf0, 0x3a79, 0x2c7e, 0x3786, 0x3521, 0x2e6a, 0x3714, 0x356a, 0x2ce9, 0x3879, 0x3855, 0x3662, 0x305b, 0x3915, 0x2e38, 0x3870, 0x3673, 0x33fd, 0x3bb6, 0x2d86, 0x2934, 0x372f, 0x2ac0, 0x368d, 0x3595, 0x32db, 0x39a1, 0x3161, 0x359a, 0x37dd, -0x344b, 0x36fa, 0x3af1, 0x2a7d, 0x310d, 0x3a46, 0x358b, 0x39fb, 0x3580, 0x3b84, 0x2a21, 0x3aba, 0x3ab3, 0x3947, 0x3130, 0x3056, 0x3ac0, 0x35c0, 0x3b0d, 0x3b5d, 0x3922, 0x3696, 0x3b40, 0x38de, 0x38eb, 0x36f1, 0x36fa, 0x334e, 0x347a, 0x3840, 0x2435, 0x3409, 0x3a1d, 0x3a86, 0x3990, 0x32a5, 0x3908, 0x362b, 0x2600, 0x39ad, 0x3b1a, 0x3add, 0x3b3d, 0x3ad3, 0x381d, 0x314a, 0x3a33, 0x3837, 0x3b5c, 0x3a79, 0x286c, 0x382d, 0x3209, 0x38c9, 0x3a4c, 0x3b36, 0x3012, 0x36cb, 0x3845, 0x385c, 0x3756, 0x3542, 0x3669, 0x3a4e, -0x3bc4, 0x2c70, 0x21bf, 0x36d5, 0x39dc, 0x2e49, 0x35e7, 0x3be7, 0x30dd, 0x3384, 0x2877, 0x3bce, 0x395a, 0x344d, 0x38d6, 0x34a5, 0x245c, 0x382e, 0x3065, 0x3b3c, 0x3504, 0x3809, 0x38b8, 0x37b4, 0x3467, 0x3a8e, 0x39bd, 0x390b, 0x3ac2, 0x3990, 0x3aeb, 0x38b0, 0x39b2, 0x3852, 0x39a8, 0x2c6d, 0x399b, 0x27d9, 0x3704, 0x39fd, 0x365e, 0x3610, 0x367a, 0x345e, 0x3acd, 0x38b2, 0x3a36, 0x3221, 0x36e1, 0x3800, 0x352e, 0x3bfe, 0x381b, 0x3a6b, 0x38b6, 0x3a36, 0x320b, 0x3971, 0x31a8, 0x3bfc, 0x199c, 0x3a89, 0x3b46, 0x38dd, -0x3560, 0x3408, 0x3af5, 0x3b03, 0x3a6e, 0x3778, 0x389c, 0x30f4, 0x3624, 0x2d25, 0x36f1, 0x393f, 0x26ce, 0x3993, 0x374b, 0x3bfc, 0x3b34, 0x3b9f, 0x259a, 0x355d, 0x389a, 0x3468, 0x3950, 0x385b, 0x3b0b, 0x3851, 0x37fa, 0x394e, 0x3564, 0x344e, 0x390c, 0x38a2, 0x2cd0, 0x340f, 0x312b, 0x396c, 0x351e, 0x3a7a, 0x3124, 0x332a, 0x3a4d, 0x33b8, 0x36f9, 0x2f22, 0x39b8, 0x3b4d, 0x3ae7, 0x39bd, 0x396d, 0x3b7f, 0x301a, 0x30e2, 0x2d27, 0x3b5d, 0x3b02, 0x3be2, 0x3289, 0x393e, 0x36cc, 0x37e9, 0x29ba, 0x3927, 0x35fb, 0x2e26, -0x38fd, 0x310c, 0x3bd7, 0x2cc9, 0x39ab, 0x3be4, 0x3515, 0x3949, 0x35e7, 0x3643, 0x38d5, 0x3981, 0x3937, 0x3be6, 0x2fb2, 0x392c, 0x348c, 0x38f2, 0x3872, 0x3b6b, 0x3ae0, 0x39a3, 0x3959, 0x3555, 0x3329, 0x35dd, 0x38ac, 0x3530, 0x39af, 0x2ef5, 0x28c1, 0x39d1, 0x3bc1, 0x34be, 0x3b5d, 0x328b, 0x32b2, 0x3872, 0x3bd4, 0x3b03, 0x2e0f, 0x39d4, 0x3925, 0x3770, 0x3a7d, 0x28c2, 0x38a1, 0x3874, 0x3b11, 0x3b64, 0x371e, 0x3600, 0x379a, 0x3bb9, 0x35ca, 0x32ad, 0x3b2d, 0x349b, 0x36f2, 0x374c, 0x38c9, 0x34d0, 0x34b4, 0x35bb, -0x3a16, 0x33b5, 0x3209, 0x3500, 0x3ae0, 0x3721, 0x34ee, 0x351b, 0x3bc5, 0x3878, 0x31f0, 0x34b7, 0x318a, 0x3b29, 0x2ddc, 0x36f4, 0x3b04, 0x3844, 0x3afe, 0x34b9, 0x31a0, 0x3aa8, 0x277e, 0x3b2d, 0x3545, 0x39f3, 0x2d07, 0x2f39, 0x3803, 0x1c7e, 0x364e, 0x3a54, 0x328b, 0x3772, 0x3907, 0x3951, 0x365f, 0x3b93, 0x3acd, 0x30e7, 0x298a, 0x2bcc, 0x3b9a, 0x3a54, 0x365d, 0x3b01, 0x3ab5, 0x2f7f, 0x304b, 0x3257, 0x39bf, 0x3b2e, 0x390c, 0x3802, 0x3a0d, 0x37d7, 0x338c, 0x3a35, 0x3bd1, 0x3905, 0x3be8, 0x3ab3, 0x388c, 0x2d83, -0x3b83, 0x32ef, 0x359a, 0x35bb, 0x38e2, 0x3813, 0x3419, 0x384f, 0x3606, 0x3825, 0x38ed, 0x3927, 0x3407, 0x3aad, 0x34f3, 0x3b8e, 0x36d6, 0x3599, 0x3502, 0x3b90, 0x38b2, 0x2f9d, 0x3bd0, 0x32ab, 0x3629, 0x3ad2, 0x342d, 0x25db, 0x3786, 0x3a93, 0x3823, 0x3320, 0x3a21, 0x387f, 0x38df, 0x3134, 0x3743, 0x3b35, 0x37fc, 0x3a9c, 0x2778, 0x3b7d, 0x2c40, 0x37f6, 0x39db, 0x3ab3, 0x3537, 0x34bd, 0x3865, 0x3a8f, 0x3a3d, 0x201e, 0x3a9c, 0x3956, 0x2ce1, 0x3bd8, 0x2856, 0x3876, 0x38b5, 0x296a, 0x3226, 0x3a4d, 0x39ee, 0x3bed, -0x39d8, 0x3527, 0x374d, 0x3acc, 0x3bef, 0x30a0, 0x3124, 0x325d, 0x32e4, 0x38d8, 0x3988, 0x3b3e, 0x340d, 0x3a1c, 0x383d, 0x2e36, 0x3874, 0x36f1, 0x3758, 0x2e80, 0x3422, 0x3408, 0x3727, 0x3234, 0x2e0e, 0x3b7a, 0x3a16, 0x3868, 0x33e8, 0x3918, 0x2fc1, 0x2d27, 0x36b4, 0x3b19, 0x3489, 0x391e, 0x3a54, 0x3bc8, 0x3bbb, 0x3861, 0x3985, 0x396c, 0x335a, 0x3a9a, 0x36ae, 0x3484, 0x3b9d, 0x3874, 0x3283, 0x357f, 0x37ae, 0x387b, 0x2a12, 0x3436, 0x2c10, 0x3bff, 0x3baf, 0x2d43, 0x35f8, 0x3a9e, 0x3ad3, 0x35f3, 0x3569, 0x2884, -0x384a, 0x39ea, 0x3afa, 0x3987, 0x3b65, 0x3b3b, 0x37a0, 0x25cb, 0x3be9, 0x3217, 0x34c0, 0x2822, 0x34dc, 0x3b46, 0x3498, 0x392d, 0x35d8, 0x39b7, 0x39c0, 0x334d, 0x354e, 0x3861, 0x3486, 0x3739, 0x3ab8, 0x2d46, 0x384d, 0x3b21, 0x3b3e, 0x3025, 0x38ec, 0x27a0, 0x3879, 0x39bd, 0x36e4, 0x3677, 0x3bb5, 0x3966, 0x3921, 0x3a5b, 0x30e8, 0x37ab, 0x3a1f, 0x33a7, 0x345a, 0x3457, 0x3223, 0x39e7, 0x3733, 0x37df, 0x39cc, 0x2612, 0x355c, 0x36e9, 0x3adf, 0x3aa6, 0x39d4, 0x32da, 0x3983, 0x3456, 0x2eff, 0x32be, 0x39f0, 0x39a7, -0x349d, 0x3a15, 0x38c8, 0x32dc, 0x3a4f, 0x3272, 0x22cf, 0x3a8a, 0x2ad2, 0x2ea8, 0x37ec, 0x31fa, 0x3645, 0x399b, 0x3835, 0x32e0, 0x359d, 0x38f3, 0x3b1d, 0x3a60, 0x33fd, 0x3910, 0x373f, 0x3bb0, 0x39c9, 0x3144, 0x3b20, 0x363b, 0x36d3, 0x2810, 0x341f, 0x385a, 0x38d9, 0x3924, 0x399a, 0x33b3, 0x3bca, 0x39ca, 0x349e, 0x35ed, 0x3244, 0x37e1, 0x3887, 0x3873, 0x3ab0, 0x3b9e, 0x3961, 0x3471, 0x3afb, 0x3ba7, 0x3778, 0x36c5, 0x3a15, 0x398d, 0x336b, 0x367a, 0x3bff, 0x382c, 0x34bd, 0x39e5, 0x37d2, 0x3a38, 0x361c, 0x32bc, -0x38bc, 0x2d3a, 0x3559, 0x3ad2, 0x38ba, 0x3bd0, 0x3ab3, 0x331e, 0x3891, 0x381b, 0x324f, 0x2d22, 0x38c7, 0x3577, 0x377b, 0x38ae, 0x38f8, 0x36f7, 0x3911, 0x28fc, 0x36a7, 0x3658, 0x37d8, 0x3ab1, 0x3b8d, 0x32e6, 0x34bf, 0x34cb, 0x3bd5, 0x2cba, 0x382e, 0x30d2, 0x355e, 0x391e, 0x385e, 0x3ab4, 0x397a, 0x304f, 0x3af3, 0x390e, 0x3646, 0x3624, 0x39cc, 0x3aef, 0x3817, 0x3524, 0x34b2, 0x39f7, 0x393b, 0x32ed, 0x3af8, 0x3229, 0x3975, 0x3786, 0x3346, 0x37db, 0x2bd4, 0x3481, 0x3a60, 0x393e, 0x3ad6, 0x3479, 0x3434, 0x321c, -0x3995, 0x3511, 0x2047, 0x34c2, 0x3946, 0x3900, 0x356f, 0x3485, 0x3b9a, 0x3b68, 0x3482, 0x3850, 0x3539, 0x37e7, 0x3bb5, 0x2c92, 0x1c36, 0x3617, 0x3abf, 0x36f8, 0x3ad6, 0x3451, 0x29fb, 0x3a36, 0x37d3, 0x2b19, 0x3a12, 0x3a0f, 0x3207, 0x3857, 0x3a80, 0x3ac0, 0x38eb, 0x30dc, 0x34c2, 0x3b55, 0x3a9b, 0x391f, 0x2bfa, 0x39b1, 0x381c, 0x3855, 0x3999, 0x384a, 0x3baf, 0x389c, 0x32e3, 0x3bd8, 0x2e14, 0x363c, 0x3a87, 0x3237, 0x33e4, 0x3bcf, 0x3a55, 0x3959, 0x3482, 0x3af7, 0x3b2a, 0x396d, 0x3adb, 0x347c, 0x3a36, 0x3800, -0x3b48, 0x3a7c, 0x3a55, 0x36f0, 0x3955, 0x3230, 0x3648, 0x3087, 0x3426, 0x314d, 0x3a35, 0x3874, 0x3861, 0x388d, 0x32c7, 0x3966, 0x341a, 0x302f, 0x2ef8, 0x3793, 0x37e9, 0x3a68, 0x3345, 0x3952, 0x2ef3, 0x35c0, 0x3a6b, 0x3b79, 0x3887, 0x383a, 0x3b55, 0x3834, 0x39d0, 0x3724, 0x3ad1, 0x33da, 0x3765, 0x3474, 0x39ce, 0x3529, 0x39c1, 0x3b00, 0x3902, 0x357d, 0x357e, 0x3709, 0x2dac, 0x3468, 0x37fa, 0x342a, 0x3af0, 0x378b, 0x39f9, 0x2996, 0x33af, 0x395b, 0x391d, 0x39e1, 0x2d27, 0x2c5c, 0x32d1, 0x3996, 0x3794, 0x314e, -0x3960, 0x3aea, 0x3b05, 0x3b28, 0x3860, 0x3950, 0x29d6, 0x24e0, 0x360c, 0x391a, 0x32f6, 0x3897, 0x39b6, 0x34cd, 0x3416, 0x30b2, 0x3467, 0x3699, 0x3a59, 0x28dd, 0x37f1, 0x34fa, 0x3b2e, 0x37e6, 0x3b52, 0x3bae, 0x25dd, 0x351f, 0x2f17, 0x36cd, 0x3bfd, 0x39f0, 0x38d8, 0x3945, 0x38a9, 0x35cb, 0x3a1b, 0x37fe, 0x3458, 0x3b2e, 0x3b34, 0x36a2, 0x1937, 0x3b9b, 0x3602, 0x36dd, 0x2f99, 0x3b91, 0x37b6, 0x3b68, 0x3375, 0x3998, 0x30cf, 0x385e, 0x356e, 0x3a0b, 0x3026, 0x3010, 0x388c, 0x3be2, 0x3a80, 0x3765, 0x3a88, 0x398d, -0x37fc, 0x3a63, 0x3a73, 0x38b3, 0x30cb, 0x3414, 0x3478, 0x37f8, 0x2ac0, 0x3711, 0x3851, 0x3abb, 0x3a7b, 0x38fe, 0x3810, 0x3af1, 0x3af5, 0x3a93, 0x394b, 0x331a, 0x3751, 0x362f, 0x36d0, 0x212b, 0x3b8d, 0x3969, 0x396b, 0x3570, 0x38a4, 0x316a, 0x3273, 0x2dfe, 0x3652, 0x3ab5, 0x3bae, 0x26c9, 0x3aa2, 0x33d1, 0x3453, 0x3664, 0x2bf6, 0x38a9, 0x3b51, 0x3593, 0x3a83, 0x3822, 0x2846, 0x3a65, 0x3814, 0x37e8, 0x39a3, 0x3925, 0x3acf, 0x252b, 0x3882, 0x3b04, 0x3240, 0x398b, 0x2b29, 0x35a2, 0x1eb4, 0x375f, 0x363e, 0x3461, -0x3469, 0x308e, 0x360d, 0x3ab2, 0x3aa4, 0x396f, 0x2ed3, 0x30ec, 0x38a8, 0x389f, 0x3211, 0x35c6, 0x390e, 0x3bf3, 0x389e, 0x3bc8, 0x3b0e, 0x3942, 0x3866, 0x379d, 0x3858, 0x2d3f, 0x2766, 0x34a0, 0x326c, 0x383c, 0x367b, 0x2759, 0x368f, 0x3451, 0x3b18, 0x39e6, 0x320c, 0x354d, 0x3ab1, 0x382e, 0x381f, 0x38af, 0x3a12, 0x3aaa, 0x396f, 0x3a24, 0x287c, 0x3bd7, 0x3483, 0x388b, 0x343d, 0x3b0e, 0x347f, 0x3964, 0x2a65, 0x36bc, 0x3780, 0x37ae, 0x38f6, 0x31f7, 0x373c, 0x3817, 0x3079, 0x3552, 0x2f93, 0x3753, 0x3972, 0x3882, -0x3b1a, 0x39fd, 0x3855, 0x3967, 0x2fc4, 0x3a87, 0x3a46, 0x385e, 0x3a6f, 0x3651, 0x3808, 0x363b, 0x2d10, 0x3b99, 0x3aec, 0x3a80, 0x3825, 0x3865, 0x3629, 0x37b8, 0x3b96, 0x3159, 0x3b17, 0x3506, 0x35c8, 0x363e, 0x3411, 0x30bf, 0x380c, 0x3673, 0x342a, 0x2bd6, 0x33c5, 0x28af, 0x39eb, 0x3ad1, 0x3b69, 0x3b4a, 0x38d6, 0x379f, 0x3b24, 0x352e, 0x3578, 0x3bbe, 0x3a1c, 0x28ac, 0x387a, 0x2924, 0x38fe, 0x3878, 0x3960, 0x396a, 0x34c3, 0x3738, 0x34e3, 0x3676, 0x3221, 0x303f, 0x31b2, 0x3256, 0x34b2, 0x3673, 0x39c4, 0x3a82, -0x3b83, 0x3967, 0x3890, 0x3892, 0x2c28, 0x3241, 0x39cd, 0x399e, 0x354c, 0x28cd, 0x2e5b, 0x38b5, 0x30bc, 0x390e, 0x38e8, 0x2ffe, 0x3bb3, 0x2481, 0x3b10, 0x3b1e, 0x2ff2, 0x38cf, 0x3a0b, 0x3b90, 0x391d, 0x35ba, 0x38d1, 0x3b7a, 0x35fc, 0x37b3, 0x3b7f, 0x3abf, 0x3647, 0x3058, 0x396f, 0x3249, 0x3880, 0x389b, 0x3aa2, 0x2aa2, 0x3ad4, 0x36e1, 0x380d, 0x383c, 0x363f, 0x32d3, 0x3873, 0x3912, 0x34a0, 0x388b, 0x36eb, 0x3816, 0x3adf, 0x3684, 0x36a7, 0x3094, 0x35ff, 0x3044, 0x3a50, 0x3b4e, 0x3894, 0x3b93, 0x33ce, 0x3ae0, -0x3ab4, 0x2d37, 0x34cf, 0x3946, 0x370c, 0x3ad4, 0x3a2c, 0x3bc8, 0x3b07, 0x3a73, 0x38d1, 0x39bf, 0x30bd, 0x3a04, 0x384e, 0x3b26, 0x356f, 0x32fe, 0x38e5, 0x3856, 0x3046, 0x3b4e, 0x2cd0, 0x345a, 0x2464, 0x3bad, 0x2d72, 0x32da, 0x3783, 0x3595, 0x306a, 0x3a93, 0x3851, 0x3807, 0x2e73, 0x386c, 0x2f53, 0x3b57, 0x2fb5, 0x238d, 0x358d, 0x3684, 0x3b79, 0x3538, 0x368b, 0x3914, 0x3aaf, 0x358b, 0x2c1c, 0x37b5, 0x3a1e, 0x3bc5, 0x346c, 0x3bf6, 0x330e, 0x3459, 0x374b, 0x3b9d, 0x2841, 0x3696, 0x33c3, 0x3845, 0x3860, 0x3a21, -0x3176, 0x3b70, 0x31f1, 0x3a89, 0x35d2, 0x2d6e, 0x3a3d, 0x3b9b, 0x3aac, 0x39c9, 0x36ec, 0x3a46, 0x3507, 0x3606, 0x347c, 0x3626, 0x3b6b, 0x38db, 0x2e3f, 0x3a61, 0x39c8, 0x3185, 0x284a, 0x3027, 0x35b8, 0x3978, 0x2fd0, 0x3989, 0x2e44, 0x2f35, 0x34ed, 0x392b, 0x3202, 0x39b3, 0x3a9c, 0x3b9b, 0x2c42, 0x301c, 0x33de, 0x270a, 0x33ab, 0x3bd8, 0x3bac, 0x3136, 0x3b9f, 0x38d2, 0x3977, 0x32ad, 0x2e75, 0x310e, 0x36e3, 0x3200, 0x376b, 0x38ca, 0x39f9, 0x39ca, 0x3b9b, 0x3236, 0x3969, 0x3b8e, 0x3345, 0x3b34, 0x3817, 0x387e, -0x38e6, 0x3b46, 0x3417, 0x3b14, 0x3b0c, 0x3bc2, 0x3a2b, 0x3781, 0x32a7, 0x3a3d, 0x35a6, 0x3b34, 0x388f, 0x348e, 0x3a2f, 0x397c, 0x39f7, 0x32f5, 0x2cda, 0x38ea, 0x3a85, 0x3883, 0x3996, 0x288d, 0x3a3e, 0x34cf, 0x3bbd, 0x3ae5, 0x232d, 0x2c50, 0x2e6f, 0x3bd4, 0x3a52, 0x2f61, 0x38f1, 0x3970, 0x375c, 0x39e0, 0x3821, 0x3ad0, 0x3994, 0x38e5, 0x3b02, 0x36bc, 0x388d, 0x3654, 0x364b, 0x3a55, 0x3739, 0x2cfc, 0x3879, 0x3299, 0x39ba, 0x3a0c, 0x3b90, 0x34cb, 0x389a, 0x39bd, 0x3531, 0x381d, 0x3897, 0x3bc3, 0x35da, 0x3709, -0x35b2, 0x36c4, 0x3614, 0x3906, 0x3939, 0x3a65, 0x3b03, 0x3a79, 0x348c, 0x3af4, 0x2ff0, 0x3ab5, 0x2402, 0x38d8, 0x3861, 0x2e1c, 0x242f, 0x3b2f, 0x3bd7, 0x3a99, 0x3969, 0x3897, 0x326f, 0x2cd4, 0x389b, 0x39dd, 0x384b, 0x35d9, 0x367f, 0x3821, 0x3ab8, 0x3a10, 0x3bc5, 0x3588, 0x3b33, 0x39cc, 0x3a90, 0x39a7, 0x360a, 0x2cb2, 0x3aa2, 0x3aae, 0x313c, 0x3b1e, 0x3b0d, 0x3b3f, 0x3031, 0x29f6, 0x3a0b, 0x36ae, 0x3116, 0x2954, 0x3836, 0x357b, 0x3a21, 0x391b, 0x3b74, 0x3456, 0x34b5, 0x3bdf, 0x365c, 0x35a4, 0x371c, 0x3926, -0x39d2, 0x2eed, 0x38a1, 0x2f2b, 0x3a03, 0x36f7, 0x3a86, 0x3794, 0x33d3, 0x2f4d, 0x39b0, 0x2eb4, 0x3962, 0x3972, 0x3685, 0x3ab4, 0x39e9, 0x38a1, 0x3ba8, 0x22a7, 0x307f, 0x3947, 0x35bd, 0x2c44, 0x3b47, 0x306d, 0x3807, 0x3937, 0x3925, 0x38f3, 0x2825, 0x387d, 0x3bec, 0x2ece, 0x3617, 0x390e, 0x34a8, 0x3892, 0x3b1f, 0x37b9, 0x15a5, 0x3195, 0x3814, 0x3972, 0x2d39, 0x39f1, 0x2d4b, 0x38cf, 0x34c4, 0x315c, 0x3a67, 0x349f, 0x3bf5, 0x3620, 0x346b, 0x3133, 0x2870, 0x3647, 0x265d, 0x3a20, 0x3878, 0x20b6, 0x252d, 0x3408, -0x20e5, 0x3a58, 0x372d, 0x38b8, 0x3983, 0x387b, 0x3296, 0x3b9f, 0x39b8, 0x39f1, 0x3445, 0x393c, 0x3886, 0x3bbc, 0x3944, 0x343e, 0x2dbd, 0x36d8, 0x392e, 0x386e, 0x3a3b, 0x3bde, 0x3be4, 0x35e6, 0x39aa, 0x30d6, 0x32fd, 0x2e3c, 0x3bab, 0x388f, 0x381c, 0x3b43, 0x2b51, 0x3b44, 0x3ab3, 0x2c11, 0x2c53, 0x3810, 0x3b94, 0x3aa5, 0x3a30, 0x2e27, 0x308f, 0x37a4, 0x36ff, 0x3b77, 0x2c32, 0x3b31, 0x3903, 0x2dcb, 0x3284, 0x3b60, 0x31c4, 0x2f13, 0x398c, 0x3b20, 0x34d1, 0x32da, 0x3917, 0x37a0, 0x398e, 0x32ac, 0x3b17, 0x39c8, -0x32af, 0x3225, 0x34f8, 0x325d, 0x2cbd, 0x3578, 0x3919, 0x2c55, 0x38a8, 0x3a4c, 0x35ed, 0x38f6, 0x39b5, 0x3261, 0x31b3, 0x3b23, 0x3956, 0x332d, 0x38d9, 0x30cb, 0x360a, 0x39f3, 0x39b6, 0x393b, 0x3977, 0x39f2, 0x332b, 0x3a15, 0x390b, 0x3a7f, 0x36ac, 0x3403, 0x34ee, 0x39eb, 0x3977, 0x304c, 0x3922, 0x31dd, 0x377c, 0x2dcd, 0x39d1, 0x3915, 0x3a55, 0x358b, 0x2c1e, 0x365f, 0x3597, 0x296f, 0x3514, 0x31e1, 0x2f8a, 0x3ba3, 0x3a51, 0x3965, 0x2a31, 0x38c7, 0x3930, 0x327b, 0x382d, 0x351c, 0x3164, 0x38a4, 0x33f7, 0x24d9, -0x3799, 0x32e4, 0x3a10, 0x3959, 0x3802, 0x385c, 0x307f, 0x2860, 0x3632, 0x36a5, 0x3a8e, 0x3941, 0x3b83, 0x3a6b, 0x3096, 0x3112, 0x35c0, 0x3a0c, 0x3909, 0x3a75, 0x386e, 0x38bd, 0x34b7, 0x37a4, 0x3116, 0x3b05, 0x302a, 0x392a, 0x3535, 0x3416, 0x38b4, 0x3910, 0x3385, 0x3bc4, 0x3403, 0x35d9, 0x3058, 0x3694, 0x3aa1, 0x2c56, 0x3458, 0x3475, 0x3bbc, 0x25ea, 0x349b, 0x3883, 0x3b41, 0x2832, 0x30dc, 0x39c6, 0x3be4, 0x2f05, 0x3a4d, 0x3748, 0x380b, 0x213e, 0x38fe, 0x3648, 0x38cc, 0x3727, 0x375f, 0x332f, 0x3989, 0x3849, -0x3b12, 0x333c, 0x3a5f, 0x295e, 0x326b, 0x38ac, 0x30b4, 0x396d, 0x3a8f, 0x254c, 0x39c2, 0x2823, 0x3740, 0x3556, 0x220b, 0x35dd, 0x3af9, 0x38b8, 0x3a94, 0x2f27, 0x340e, 0x3486, 0x319a, 0x3bbd, 0x39d7, 0x39e7, 0x379d, 0x3aa4, 0x3875, 0x3aec, 0x3b96, 0x3bcd, 0x3743, 0x39c7, 0x3a3b, 0x338a, 0x3979, 0x35b0, 0x3940, 0x3bd6, 0x33f0, 0x368a, 0x39af, 0x33f8, 0x3bef, 0x3b15, 0x3077, 0x344a, 0x3a58, 0x3a8c, 0x3486, 0x3b0d, 0x3b0f, 0x36b2, 0x3a93, 0x3b42, 0x3561, 0x3a29, 0x34de, 0x37c3, 0x39a1, 0x392f, 0x3b6c, 0x369f -}; diff --git a/tests/utils/z_output.h b/tests/utils/z_output.h deleted file mode 100644 index 4230a373..00000000 --- a/tests/utils/z_output.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2025 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// Authors: Yvan Tortorella -// - -/* Header file generated by RedMulE Golden Model */ -uint16_t z_oup [6144] = { -0x4cae, 0x4ccb, 0x4b76, 0x4c61, 0x4cca, 0x4cc8, 0x4a6b, 0x4c88, 0x4d1d, 0x4d15, 0x4c5b, 0x4c8e, 0x4ca5, 0x4c76, 0x4c44, 0x4bfb, 0x4cab, 0x4cc4, 0x4cb6, 0x4c70, 0x4c55, 0x4bcf, 0x4c40, 0x4c0a, 0x4d1d, 0x4cf2, 0x4c98, 0x4cc9, 0x4bef, 0x4c5f, 0x4cb2, 0x4c93, 0x4c0c, 0x4c4e, 0x4c42, 0x4c61, 0x4c5a, 0x4cea, 0x4c15, 0x4c67, 0x4ca2, 0x4d8c, 0x4bfd, 0x4cb4, 0x4c34, 0x4c68, 0x4cc2, 0x4c23, 0x4cd9, 0x4cdf, 0x4d72, 0x4d11, 0x4d1a, 0x4c03, 0x4cca, 0x4c40, 0x4c5a, 0x4ccc, 0x4c1f, 0x4c43, 0x4c1c, 0x4c4b, 0x4c60, 0x4c4c, -0x4c03, 0x4bbb, 0x4b15, 0x4c04, 0x4c6d, 0x4c20, 0x4ad4, 0x4bf4, 0x4c60, 0x4c72, 0x4bb7, 0x4c61, 0x4bc2, 0x4c01, 0x4c0e, 0x4b08, 0x4c84, 0x4c3a, 0x4c66, 0x4c0f, 0x4bdc, 0x4c0c, 0x4bd6, 0x4bbf, 0x4cc2, 0x4c0d, 0x4c1d, 0x4c32, 0x4ad3, 0x4c05, 0x4c37, 0x4c0c, 0x4c05, 0x4b84, 0x4bd2, 0x4c0a, 0x4b9e, 0x4ce4, 0x4bd9, 0x4bc7, 0x4c73, 0x4d5c, 0x4b9a, 0x4c85, 0x4bda, 0x4bda, 0x4c64, 0x4b24, 0x4c7d, 0x4c20, 0x4d02, 0x4c8d, 0x4ca7, 0x4b62, 0x4c51, 0x4afc, 0x4b37, 0x4bcd, 0x4b53, 0x4b13, 0x4b52, 0x4c02, 0x4c0c, 0x4bfd, -0x4c32, 0x4c11, 0x4a40, 0x4ca2, 0x4c22, 0x4c19, 0x4aa7, 0x4c01, 0x4c34, 0x4c47, 0x4b32, 0x4ca8, 0x4be5, 0x4c1d, 0x4bd4, 0x4ac4, 0x4c8d, 0x4c32, 0x4cc2, 0x4bba, 0x4c1a, 0x4b7c, 0x4ba5, 0x4be5, 0x4cbb, 0x4c33, 0x4c3d, 0x4c48, 0x4b43, 0x4c24, 0x4c1d, 0x4c40, 0x4baa, 0x4ba8, 0x4b98, 0x4bcd, 0x4bce, 0x4cba, 0x4b7d, 0x4b8d, 0x4bb5, 0x4ce4, 0x4b96, 0x4ca0, 0x4c24, 0x4c05, 0x4cc7, 0x4af7, 0x4c64, 0x4c80, 0x4cca, 0x4c7e, 0x4ccf, 0x4b75, 0x4c31, 0x4c0f, 0x4bd6, 0x4c06, 0x4b15, 0x4be4, 0x4b63, 0x4c2e, 0x4b47, 0x4c52, -0x4c61, 0x4c53, 0x4bdc, 0x4c9e, 0x4cb4, 0x4c28, 0x4a1a, 0x4c0c, 0x4c94, 0x4cac, 0x4bb2, 0x4c60, 0x4c60, 0x4c3a, 0x4c62, 0x4a97, 0x4cd8, 0x4c64, 0x4c99, 0x4c28, 0x4c53, 0x4c24, 0x4c07, 0x4c4d, 0x4cd1, 0x4c6c, 0x4c6f, 0x4c73, 0x4b8a, 0x4c95, 0x4c90, 0x4c2b, 0x4c0f, 0x4c51, 0x4c4a, 0x4bd4, 0x4c50, 0x4c9e, 0x4ba5, 0x4c36, 0x4c49, 0x4d47, 0x4b7a, 0x4cca, 0x4c3c, 0x4c35, 0x4ce2, 0x4b3c, 0x4c5a, 0x4c4f, 0x4cc7, 0x4ca3, 0x4ccf, 0x4c15, 0x4cc2, 0x4b99, 0x4c7b, 0x4c27, 0x4c10, 0x4c48, 0x4c00, 0x4c6a, 0x4c52, 0x4c54, -0x4b09, 0x4c19, 0x4a32, 0x4bc4, 0x4b3b, 0x4af8, 0x49d4, 0x4b72, 0x4bfc, 0x4c0c, 0x4b36, 0x4c1f, 0x4acf, 0x4ae5, 0x4b09, 0x4a81, 0x4c33, 0x4b6a, 0x4c3a, 0x4b95, 0x4b12, 0x4a77, 0x4afd, 0x4ab9, 0x4c3d, 0x4c0b, 0x4c00, 0x4bad, 0x4acd, 0x4b40, 0x4b1f, 0x4b86, 0x4a9f, 0x4aa4, 0x4b2b, 0x4ab9, 0x4b6a, 0x4c6a, 0x4b4c, 0x4abe, 0x4bba, 0x4cb2, 0x4a99, 0x4c50, 0x4b3f, 0x4b4b, 0x4b6f, 0x4a6d, 0x4bf7, 0x4c26, 0x4c1b, 0x4c46, 0x4c10, 0x4af4, 0x4b77, 0x4b2f, 0x4acb, 0x4be8, 0x4b0a, 0x4a7b, 0x4a5e, 0x4b2a, 0x4af3, 0x4bea, -0x4b46, 0x4b98, 0x4abb, 0x4c19, 0x4bc9, 0x4b2d, 0x499b, 0x4b6f, 0x4c1f, 0x4b9c, 0x4aeb, 0x4c1c, 0x4b8e, 0x4b2c, 0x4b8f, 0x4aca, 0x4c3f, 0x4bad, 0x4bf1, 0x4b87, 0x4b96, 0x4a84, 0x4a5a, 0x4b89, 0x4c13, 0x4b8e, 0x4c2b, 0x4bf6, 0x4a6a, 0x4b77, 0x4be1, 0x4b9a, 0x4b1f, 0x4b31, 0x4b70, 0x4bac, 0x4b4d, 0x4c2c, 0x4add, 0x4b65, 0x4c06, 0x4caf, 0x4aa0, 0x4c08, 0x4b12, 0x4b39, 0x4c44, 0x4a6b, 0x4c29, 0x4c52, 0x4c3e, 0x4c5a, 0x4c33, 0x4b10, 0x4c1f, 0x4ae2, 0x4b0e, 0x4b71, 0x4a89, 0x4a77, 0x4a9c, 0x4b4a, 0x4bdc, 0x4b63, -0x4cbe, 0x4cb1, 0x4b09, 0x4c40, 0x4c9a, 0x4c57, 0x4ad0, 0x4c53, 0x4c7c, 0x4d12, 0x4ba9, 0x4c7e, 0x4c5c, 0x4c66, 0x4c70, 0x4b6d, 0x4d01, 0x4cac, 0x4cd0, 0x4c5f, 0x4c6c, 0x4c34, 0x4c78, 0x4b44, 0x4d37, 0x4cc4, 0x4c82, 0x4ca9, 0x4b49, 0x4c60, 0x4c6f, 0x4c22, 0x4c1e, 0x4c02, 0x4c30, 0x4c8a, 0x4c4e, 0x4cda, 0x4c3a, 0x4bdd, 0x4c80, 0x4db8, 0x4c43, 0x4ca3, 0x4c22, 0x4c30, 0x4ce0, 0x4bf5, 0x4cdf, 0x4cba, 0x4d1c, 0x4cb2, 0x4d1c, 0x4c19, 0x4c9a, 0x4c31, 0x4c7d, 0x4c9b, 0x4c2d, 0x4ba7, 0x4bb1, 0x4bcf, 0x4bf2, 0x4c5b, -0x4c67, 0x4c41, 0x4b75, 0x4bea, 0x4c38, 0x4b9e, 0x4a3c, 0x4c4f, 0x4ca1, 0x4c5d, 0x4b7a, 0x4c28, 0x4c51, 0x4bf3, 0x4ba7, 0x4b09, 0x4c56, 0x4bbb, 0x4c3e, 0x4c0d, 0x4c27, 0x4bc6, 0x4ab4, 0x4c0c, 0x4c71, 0x4c48, 0x4c59, 0x4ca1, 0x4bb3, 0x4c22, 0x4c2e, 0x4c16, 0x4bff, 0x4bfb, 0x4c36, 0x4c3a, 0x4c1b, 0x4c70, 0x4ae9, 0x4c24, 0x4c81, 0x4d0a, 0x4abf, 0x4d06, 0x4be2, 0x4bc3, 0x4c26, 0x4ac5, 0x4c0c, 0x4c65, 0x4cf1, 0x4cbb, 0x4c23, 0x4c60, 0x4c98, 0x4bc7, 0x4b49, 0x4c2e, 0x4b94, 0x4b44, 0x4b1e, 0x4c02, 0x4c27, 0x4c46, -0x4c2a, 0x4c46, 0x4b5a, 0x4cd2, 0x4c98, 0x4c39, 0x4a99, 0x4c50, 0x4c86, 0x4c8a, 0x4c13, 0x4d25, 0x4c02, 0x4c5d, 0x4c36, 0x4b82, 0x4d1f, 0x4ca8, 0x4cc1, 0x4c4f, 0x4c46, 0x4c44, 0x4c02, 0x4c1c, 0x4ceb, 0x4ced, 0x4ca5, 0x4ca5, 0x4b99, 0x4c46, 0x4c6a, 0x4cb6, 0x4c02, 0x4c2c, 0x4c41, 0x4c93, 0x4c50, 0x4ca0, 0x4c36, 0x4c1d, 0x4c70, 0x4dc3, 0x4be2, 0x4ce9, 0x4bd5, 0x4c0b, 0x4d2d, 0x4b41, 0x4caa, 0x4ccc, 0x4ce3, 0x4d4f, 0x4d21, 0x4c6d, 0x4cd0, 0x4c1c, 0x4c3f, 0x4c62, 0x4bcb, 0x4c2e, 0x4c0b, 0x4c8f, 0x4c6d, 0x4c94, -0x4bcc, 0x4c47, 0x4b9d, 0x4c79, 0x4c5e, 0x4c21, 0x4afc, 0x4c5c, 0x4c94, 0x4c82, 0x4c11, 0x4c6c, 0x4c29, 0x4c38, 0x4c1b, 0x4b9f, 0x4cae, 0x4bd2, 0x4d04, 0x4c29, 0x4c02, 0x4bba, 0x4af8, 0x4b58, 0x4ca4, 0x4c94, 0x4ca5, 0x4c71, 0x4b62, 0x4c3f, 0x4c31, 0x4c2c, 0x4b5c, 0x4b67, 0x4c1e, 0x4c46, 0x4c03, 0x4caf, 0x4c20, 0x4bd6, 0x4c75, 0x4d25, 0x4b95, 0x4c9c, 0x4c4d, 0x4bef, 0x4c8f, 0x4b61, 0x4c3c, 0x4c8e, 0x4c92, 0x4cb0, 0x4cda, 0x4c3b, 0x4c48, 0x4bbb, 0x4c3b, 0x4c3d, 0x4c02, 0x4be5, 0x4be0, 0x4b9f, 0x4c2a, 0x4c45, -0x4c2d, 0x4c14, 0x4b82, 0x4c73, 0x4cb5, 0x4c0d, 0x4a21, 0x4c71, 0x4c07, 0x4c4e, 0x4b3f, 0x4c77, 0x4c32, 0x4bbf, 0x4c11, 0x4b4f, 0x4c74, 0x4c5e, 0x4c57, 0x4c1e, 0x4c11, 0x4b77, 0x4b28, 0x4c5e, 0x4c9a, 0x4c74, 0x4c5d, 0x4c5e, 0x4abe, 0x4c22, 0x4bcc, 0x4bf8, 0x4c1e, 0x4b60, 0x4c09, 0x4bce, 0x4c07, 0x4caa, 0x4b09, 0x4c52, 0x4c2d, 0x4d1a, 0x4b86, 0x4ca1, 0x4b5d, 0x4c21, 0x4c9c, 0x4bae, 0x4c33, 0x4c4b, 0x4cf1, 0x4c63, 0x4ce2, 0x4bf0, 0x4c4c, 0x4b4c, 0x4c1f, 0x4c53, 0x4b8a, 0x4b6d, 0x4bc2, 0x4b82, 0x4c58, 0x4bfb, -0x4c33, 0x4c80, 0x4aa0, 0x4c2d, 0x4bfc, 0x4b90, 0x4acc, 0x4c24, 0x4be9, 0x4c90, 0x4b53, 0x4c8c, 0x4c6f, 0x4c4b, 0x4be5, 0x4b6b, 0x4c86, 0x4c19, 0x4c81, 0x4bf9, 0x4c0a, 0x4bb7, 0x4c0f, 0x4ba5, 0x4c7f, 0x4c69, 0x4c40, 0x4c4e, 0x4b0b, 0x4c2e, 0x4be4, 0x4c24, 0x4b28, 0x4bbe, 0x4b54, 0x4be7, 0x4b75, 0x4c6d, 0x4b4c, 0x4b9e, 0x4b94, 0x4d21, 0x4bb2, 0x4c4b, 0x4c36, 0x4c29, 0x4ca8, 0x4a79, 0x4c60, 0x4c7b, 0x4cd5, 0x4c5e, 0x4c7e, 0x4bfa, 0x4c6d, 0x4c07, 0x4c32, 0x4c84, 0x4b33, 0x4b03, 0x4bfe, 0x4b59, 0x4bf8, 0x4c1c, -0x4c66, 0x4c84, 0x4c04, 0x4c94, 0x4ca2, 0x4c49, 0x4aa3, 0x4c6a, 0x4c79, 0x4ce0, 0x4c08, 0x4ca5, 0x4c9f, 0x4c5b, 0x4c82, 0x4bc4, 0x4cf1, 0x4c54, 0x4c92, 0x4c50, 0x4c8e, 0x4c5c, 0x4c16, 0x4ccd, 0x4d23, 0x4cb6, 0x4c97, 0x4cc1, 0x4c07, 0x4c5d, 0x4c3d, 0x4c29, 0x4c2f, 0x4c08, 0x4c6b, 0x4c1f, 0x4c27, 0x4ccf, 0x4c2d, 0x4c3a, 0x4c6c, 0x4d64, 0x4bd8, 0x4d0a, 0x4c5d, 0x4c37, 0x4ceb, 0x4c3b, 0x4c51, 0x4d00, 0x4d3f, 0x4cbc, 0x4cfd, 0x4c19, 0x4cca, 0x4c45, 0x4c69, 0x4c78, 0x4c0f, 0x4c39, 0x4c21, 0x4c72, 0x4c3a, 0x4c57, -0x4c9c, 0x4c67, 0x4b98, 0x4c57, 0x4ca5, 0x4c0d, 0x4a8d, 0x4c38, 0x4cac, 0x4ca5, 0x4c46, 0x4c7d, 0x4c86, 0x4c60, 0x4c1d, 0x4ade, 0x4cb4, 0x4cae, 0x4c75, 0x4c45, 0x4c73, 0x4c65, 0x4b9f, 0x4c0c, 0x4d38, 0x4cae, 0x4c5d, 0x4c8c, 0x4b7f, 0x4c32, 0x4c64, 0x4c99, 0x4c4c, 0x4c31, 0x4c30, 0x4c4f, 0x4c8d, 0x4cec, 0x4bcc, 0x4c03, 0x4c9d, 0x4d85, 0x4c34, 0x4cde, 0x4be9, 0x4ba6, 0x4cae, 0x4c02, 0x4c8d, 0x4ca9, 0x4dae, 0x4cb7, 0x4ca3, 0x4c39, 0x4cab, 0x4bc6, 0x4c06, 0x4c93, 0x4c02, 0x4bfa, 0x4c03, 0x4c16, 0x4c35, 0x4cb4, -0x4bff, 0x4bfc, 0x4aa3, 0x4bbf, 0x4bf6, 0x4c1b, 0x4abd, 0x4b76, 0x4c4b, 0x4c4f, 0x4b28, 0x4c45, 0x4bdc, 0x4b5f, 0x4bb4, 0x4ac7, 0x4c8f, 0x4c0e, 0x4c7d, 0x4bc1, 0x4be2, 0x4bde, 0x4b36, 0x4ba3, 0x4ca0, 0x4c4f, 0x4bc2, 0x4c57, 0x4b38, 0x4b88, 0x4bfe, 0x4bdb, 0x4be2, 0x4b7d, 0x4bfe, 0x4bfb, 0x4b0a, 0x4c64, 0x4baa, 0x4b50, 0x4b96, 0x4d07, 0x4ac0, 0x4c2f, 0x4bdd, 0x4bfe, 0x4c97, 0x4a7f, 0x4c46, 0x4c52, 0x4c62, 0x4c8d, 0x4c3e, 0x4bf1, 0x4c3b, 0x4b36, 0x4b97, 0x4c0f, 0x4a8e, 0x4bb1, 0x4ba8, 0x4c06, 0x4b64, 0x4bd5, -0x4c62, 0x4c96, 0x4af4, 0x4bae, 0x4c5a, 0x4c67, 0x4b00, 0x4c96, 0x4cb1, 0x4c88, 0x4b84, 0x4c01, 0x4c85, 0x4c4c, 0x4b5c, 0x4b6f, 0x4c59, 0x4c29, 0x4c4f, 0x4c7f, 0x4c58, 0x4c39, 0x4b0f, 0x4b00, 0x4cd9, 0x4c4e, 0x4c18, 0x4c84, 0x4b26, 0x4c21, 0x4c4b, 0x4bc2, 0x4c54, 0x4bc8, 0x4bfa, 0x4c29, 0x4c10, 0x4c64, 0x4b46, 0x4b96, 0x4c87, 0x4cfc, 0x4bed, 0x4c41, 0x4be1, 0x4b94, 0x4c66, 0x4ab8, 0x4c67, 0x4c5b, 0x4ce1, 0x4c5c, 0x4c6d, 0x4c24, 0x4bf2, 0x4be5, 0x4c08, 0x4c89, 0x4b5f, 0x4c19, 0x4b89, 0x4bd9, 0x4bfe, 0x4c2c, -0x4c3d, 0x4c57, 0x4afb, 0x4c1c, 0x4c44, 0x4c02, 0x49fb, 0x4c7b, 0x4c7f, 0x4c50, 0x4bcd, 0x4c28, 0x4c47, 0x4c02, 0x4c26, 0x4ab7, 0x4c82, 0x4bc0, 0x4c88, 0x4bfe, 0x4c5d, 0x4b3d, 0x4bf3, 0x4c02, 0x4cf6, 0x4c6e, 0x4c56, 0x4c72, 0x4b36, 0x4c23, 0x4be3, 0x4c74, 0x4b48, 0x4bae, 0x4c56, 0x4c3b, 0x4c11, 0x4c85, 0x4c36, 0x4ba5, 0x4c66, 0x4d49, 0x4b72, 0x4c66, 0x4c0b, 0x4ba4, 0x4c99, 0x4bb5, 0x4c83, 0x4c6f, 0x4c9b, 0x4c89, 0x4c7a, 0x4c38, 0x4ca5, 0x4b9e, 0x4c0f, 0x4c78, 0x4c32, 0x4bc9, 0x4b27, 0x4b7b, 0x4bdc, 0x4c26, -0x4d0b, 0x4cad, 0x4b71, 0x4c51, 0x4ccb, 0x4c4d, 0x4a85, 0x4c85, 0x4d21, 0x4cec, 0x4c3d, 0x4c82, 0x4c8e, 0x4cb7, 0x4c73, 0x4c14, 0x4d34, 0x4cd6, 0x4cd9, 0x4c50, 0x4c45, 0x4c49, 0x4c46, 0x4c8a, 0x4d06, 0x4c73, 0x4c8e, 0x4cd9, 0x4c62, 0x4c8a, 0x4c82, 0x4c99, 0x4c10, 0x4c3c, 0x4c6a, 0x4c64, 0x4ca5, 0x4cc1, 0x4c3c, 0x4c13, 0x4c87, 0x4d88, 0x4c14, 0x4cb6, 0x4c56, 0x4cad, 0x4cfa, 0x4c58, 0x4c9e, 0x4cbf, 0x4d5b, 0x4cc7, 0x4cd1, 0x4c61, 0x4c87, 0x4c2f, 0x4c51, 0x4ce2, 0x4c5e, 0x4c2e, 0x4bf5, 0x4c67, 0x4c6d, 0x4ce9, -0x4c1c, 0x4be6, 0x4abe, 0x4bf0, 0x4c57, 0x4b7a, 0x4ab4, 0x4be5, 0x4c36, 0x4ca2, 0x4a7b, 0x4c31, 0x4bf4, 0x4b0e, 0x4c0c, 0x4b4e, 0x4ca2, 0x4b99, 0x4c33, 0x4bf1, 0x4bdc, 0x4b64, 0x4bc3, 0x4bb7, 0x4c66, 0x4c35, 0x4c0c, 0x4c47, 0x4ae4, 0x4b8d, 0x4c5e, 0x4ba2, 0x4c13, 0x4b55, 0x4b72, 0x4b70, 0x4b6b, 0x4c64, 0x4b95, 0x4b0c, 0x4c52, 0x4d18, 0x4a67, 0x4c48, 0x4b8f, 0x4c06, 0x4c83, 0x4b3f, 0x4c59, 0x4c6e, 0x4c94, 0x4c39, 0x4c64, 0x4be2, 0x4c21, 0x4ae5, 0x4b4e, 0x4c20, 0x4b17, 0x4bc5, 0x4b4f, 0x4bd1, 0x4b3e, 0x4bbd, -0x4b81, 0x4bfa, 0x49d8, 0x4b10, 0x4bb9, 0x4b11, 0x4979, 0x4bb0, 0x4b60, 0x4bb1, 0x4a30, 0x4b26, 0x4bb8, 0x4b4f, 0x4a84, 0x49a9, 0x4ba8, 0x4ac8, 0x4b9f, 0x4a85, 0x4b99, 0x4a02, 0x4b05, 0x4ae0, 0x4c5f, 0x4b74, 0x4b52, 0x4b90, 0x4a50, 0x4b53, 0x4ab8, 0x4b59, 0x4ab1, 0x4b20, 0x4b4c, 0x4a95, 0x4b0d, 0x4b74, 0x4a0a, 0x4aef, 0x4b68, 0x4c1d, 0x4a7c, 0x4c19, 0x4b22, 0x4a7b, 0x4c1c, 0x4a5f, 0x4c12, 0x4b74, 0x4bab, 0x4bba, 0x4b58, 0x4af7, 0x4bde, 0x4b62, 0x4b1c, 0x4b57, 0x4aba, 0x4ad8, 0x4a12, 0x4ae2, 0x4ab5, 0x4bbc, -0x4c74, 0x4c7e, 0x4b1e, 0x4bde, 0x4c70, 0x4be5, 0x4a4c, 0x4c41, 0x4cae, 0x4c6b, 0x4b5f, 0x4c2b, 0x4bda, 0x4ba9, 0x4b7e, 0x4aae, 0x4c8c, 0x4c12, 0x4c1c, 0x4b70, 0x4c0d, 0x4bbc, 0x4ae6, 0x4bc4, 0x4cac, 0x4c36, 0x4c0c, 0x4c03, 0x4b94, 0x4c2a, 0x4c37, 0x4c5a, 0x4b76, 0x4bdb, 0x4bb5, 0x4c5b, 0x4c25, 0x4c62, 0x4b57, 0x4bda, 0x4c32, 0x4cc3, 0x4b9f, 0x4c7f, 0x4b61, 0x4b75, 0x4c60, 0x4b0d, 0x4c11, 0x4ca1, 0x4d3f, 0x4c48, 0x4ce7, 0x4c16, 0x4c36, 0x4bc6, 0x4c07, 0x4c63, 0x4b34, 0x4b28, 0x4b79, 0x4b4e, 0x4b95, 0x4c42, -0x4bb9, 0x4b63, 0x4aaa, 0x4bb6, 0x4c0d, 0x4b40, 0x4a03, 0x4bad, 0x4c0e, 0x4c09, 0x4ac3, 0x4c05, 0x4c30, 0x4c28, 0x4b7f, 0x4a71, 0x4bfc, 0x4c0c, 0x4bff, 0x4bf3, 0x4c0e, 0x4aad, 0x4b9b, 0x4b3e, 0x4cb9, 0x4c66, 0x4c37, 0x4be1, 0x4a95, 0x4bba, 0x4bca, 0x4b76, 0x4ada, 0x4aeb, 0x4b74, 0x4c18, 0x4b47, 0x4b58, 0x4b4f, 0x4b11, 0x4bfb, 0x4ce0, 0x4ad1, 0x4bd5, 0x4b3b, 0x4ae6, 0x4c5a, 0x4ac7, 0x4c2f, 0x4c50, 0x4c32, 0x4c19, 0x4c16, 0x4ba8, 0x4bfa, 0x4bb2, 0x4c17, 0x4c09, 0x4b2b, 0x4b2e, 0x4b24, 0x4b89, 0x4ac7, 0x4b20, -0x4c25, 0x4ccb, 0x4b85, 0x4c49, 0x4c69, 0x4c56, 0x4ae8, 0x4c46, 0x4c9e, 0x4ccb, 0x4b58, 0x4cae, 0x4c46, 0x4be5, 0x4b90, 0x4bc2, 0x4c8a, 0x4c47, 0x4cca, 0x4c5c, 0x4c68, 0x4c4e, 0x4c02, 0x4bfa, 0x4ce4, 0x4cb0, 0x4c65, 0x4c87, 0x4b89, 0x4c2d, 0x4c7e, 0x4c2d, 0x4c12, 0x4c27, 0x4be3, 0x4c52, 0x4bde, 0x4ca1, 0x4c18, 0x4c00, 0x4cbf, 0x4d3e, 0x4c30, 0x4cb3, 0x4c39, 0x4c02, 0x4cc4, 0x4b51, 0x4c4e, 0x4c9c, 0x4ce4, 0x4cf5, 0x4cc4, 0x4c0d, 0x4c65, 0x4c12, 0x4c03, 0x4cb9, 0x4b3e, 0x4c04, 0x4c02, 0x4baa, 0x4bcb, 0x4c59, -0x4c02, 0x4c76, 0x4b21, 0x4c02, 0x4c3e, 0x4c67, 0x4a53, 0x4be0, 0x4ca5, 0x4c62, 0x4a63, 0x4c65, 0x4c2c, 0x4c09, 0x4b71, 0x4aaa, 0x4c1d, 0x4c14, 0x4c83, 0x4c00, 0x4bd9, 0x4b1b, 0x4af1, 0x4ba6, 0x4cd1, 0x4bfa, 0x4c33, 0x4c55, 0x4be8, 0x4c02, 0x4c4c, 0x4be6, 0x4c1e, 0x4b9c, 0x4b85, 0x4b5b, 0x4be8, 0x4c83, 0x4ba6, 0x4bbe, 0x4c19, 0x4cf9, 0x4b99, 0x4caf, 0x4c3e, 0x4c02, 0x4cf0, 0x4b26, 0x4c63, 0x4c6f, 0x4cc5, 0x4c6e, 0x4c66, 0x4ab9, 0x4b7e, 0x4bde, 0x4bd2, 0x4c56, 0x4b82, 0x4bc2, 0x4aef, 0x4bf1, 0x4be9, 0x4c2c, -0x4c0a, 0x4c7c, 0x4a5c, 0x4c0e, 0x4c2e, 0x4c02, 0x49f6, 0x4c1e, 0x4c1f, 0x4c94, 0x4b1a, 0x4bf1, 0x4c44, 0x4b95, 0x4c43, 0x4b1a, 0x4c9d, 0x4c24, 0x4c57, 0x4c35, 0x4c55, 0x4b5e, 0x4ba7, 0x4c11, 0x4c6b, 0x4bcb, 0x4c2d, 0x4c1b, 0x4a69, 0x4c15, 0x4c1f, 0x4be1, 0x4ba3, 0x4b87, 0x4c2c, 0x4bce, 0x4bc7, 0x4c73, 0x4bbf, 0x4c08, 0x4c6d, 0x4d19, 0x4b01, 0x4c01, 0x4c17, 0x4b59, 0x4c3d, 0x4b6a, 0x4c6a, 0x4bec, 0x4ca6, 0x4bf8, 0x4c99, 0x4bca, 0x4c89, 0x4b39, 0x4c1e, 0x4bd0, 0x4b8a, 0x4c13, 0x4b84, 0x4c05, 0x4ae5, 0x4b6b, -0x4c40, 0x4c2b, 0x4b50, 0x4c8c, 0x4ca4, 0x4c50, 0x4a2b, 0x4c24, 0x4c6e, 0x4d0e, 0x4c05, 0x4c94, 0x4bf8, 0x4ba9, 0x4c47, 0x4b24, 0x4ccb, 0x4c89, 0x4d06, 0x4b72, 0x4c82, 0x4c2d, 0x4b80, 0x4bc6, 0x4ce7, 0x4cc9, 0x4c4e, 0x4c65, 0x4c12, 0x4c6e, 0x4c3e, 0x4c43, 0x4c36, 0x4c05, 0x4c74, 0x4c3d, 0x4c30, 0x4ce6, 0x4c04, 0x4c4f, 0x4bfb, 0x4d5e, 0x4c03, 0x4d11, 0x4c5d, 0x4c22, 0x4d07, 0x4b69, 0x4c48, 0x4c75, 0x4d61, 0x4cb2, 0x4ce8, 0x4c4a, 0x4c77, 0x4c22, 0x4c34, 0x4c6d, 0x4c02, 0x4c32, 0x4b96, 0x4c3f, 0x4c0f, 0x4c3b, -0x4bd4, 0x4c2c, 0x4b93, 0x4c67, 0x4c5b, 0x4c0a, 0x4ae5, 0x4c45, 0x4ca2, 0x4c6a, 0x4c13, 0x4c5e, 0x4be3, 0x4c14, 0x4be8, 0x4be9, 0x4c96, 0x4c71, 0x4c97, 0x4c42, 0x4c01, 0x4bbd, 0x4bad, 0x4c07, 0x4cf0, 0x4ca5, 0x4c72, 0x4c45, 0x4b3a, 0x4c46, 0x4be6, 0x4c63, 0x4bb4, 0x4be8, 0x4c29, 0x4c1e, 0x4be8, 0x4cb6, 0x4bba, 0x4bba, 0x4c8c, 0x4d52, 0x4b5e, 0x4c6d, 0x4bda, 0x4b90, 0x4c95, 0x4b9a, 0x4ca5, 0x4cb7, 0x4c7e, 0x4cb2, 0x4cd0, 0x4c0f, 0x4c8f, 0x4baa, 0x4bde, 0x4c09, 0x4b92, 0x4b78, 0x4c20, 0x4c37, 0x4c3e, 0x4c00, -0x4c11, 0x4c12, 0x4ab3, 0x4bbf, 0x4c16, 0x4ab8, 0x498a, 0x4c04, 0x4be1, 0x4bc1, 0x4ad4, 0x4c11, 0x4be8, 0x4b8d, 0x4b1a, 0x4aad, 0x4c62, 0x4c0b, 0x4c60, 0x4b08, 0x4bad, 0x4b6d, 0x4b93, 0x4bd8, 0x4c39, 0x4c0d, 0x4be3, 0x4bf6, 0x4a94, 0x4bd3, 0x4bc6, 0x4c18, 0x4b21, 0x4b93, 0x4b79, 0x4bbc, 0x4bb0, 0x4c1f, 0x4b07, 0x4bcf, 0x4bde, 0x4cc6, 0x4ac7, 0x4c6b, 0x4b51, 0x4b9d, 0x4c59, 0x4ae4, 0x4c04, 0x4c14, 0x4c71, 0x4be6, 0x4c40, 0x4b5f, 0x4c18, 0x4a87, 0x4b5b, 0x4bd5, 0x4bc7, 0x4bc0, 0x4ac9, 0x4bd7, 0x4b47, 0x4bfb, -0x4c5b, 0x4c3d, 0x4ba8, 0x4c2e, 0x4c75, 0x4c5c, 0x4a59, 0x4c0b, 0x4cad, 0x4cb8, 0x4bc2, 0x4c77, 0x4c09, 0x4be5, 0x4c10, 0x4b93, 0x4c8d, 0x4c66, 0x4c93, 0x4c47, 0x4bca, 0x4ba1, 0x4c08, 0x4baa, 0x4c92, 0x4c87, 0x4c41, 0x4c73, 0x4c01, 0x4c72, 0x4c10, 0x4bf0, 0x4b5c, 0x4c04, 0x4c5a, 0x4be6, 0x4c1f, 0x4c61, 0x4bf3, 0x4c3c, 0x4c58, 0x4d04, 0x4b48, 0x4c6d, 0x4c1c, 0x4b9d, 0x4c5d, 0x4be3, 0x4c28, 0x4cb2, 0x4cc8, 0x4c82, 0x4d45, 0x4c1c, 0x4c7a, 0x4b63, 0x4c1b, 0x4c88, 0x4c3a, 0x4c2e, 0x4bbe, 0x4bd9, 0x4ba4, 0x4c06, -0x4bed, 0x4b88, 0x4a1d, 0x4ae5, 0x4b55, 0x4b5d, 0x49e8, 0x4b86, 0x4b40, 0x4b88, 0x4a71, 0x4c14, 0x4b3e, 0x4b55, 0x4aa2, 0x4a13, 0x4c16, 0x4bba, 0x4c42, 0x4af3, 0x4b3d, 0x4aef, 0x4a78, 0x4af2, 0x4bcc, 0x4b4e, 0x4b2d, 0x4be0, 0x4ab1, 0x4baa, 0x4aeb, 0x4b3d, 0x4aeb, 0x4b5c, 0x4b1c, 0x4ba3, 0x4b10, 0x4b71, 0x4b56, 0x4a0a, 0x4ad1, 0x4c75, 0x4a9a, 0x4b4b, 0x4b42, 0x4b32, 0x4c54, 0x4a1a, 0x4b76, 0x4b27, 0x4c49, 0x4b9a, 0x4b81, 0x4b2e, 0x4b5f, 0x4a6b, 0x4aa2, 0x4b89, 0x4b7a, 0x4b4c, 0x4a8f, 0x4afa, 0x4add, 0x4b6c, -0x4c23, 0x4ca1, 0x4b53, 0x4c83, 0x4c92, 0x4c4a, 0x4a54, 0x4c12, 0x4c7e, 0x4c97, 0x4c55, 0x4cc6, 0x4c38, 0x4be8, 0x4be7, 0x4bd5, 0x4ca0, 0x4c83, 0x4cf2, 0x4c66, 0x4c33, 0x4c05, 0x4bd8, 0x4bf9, 0x4cac, 0x4cce, 0x4c62, 0x4c74, 0x4bec, 0x4c41, 0x4c0f, 0x4c64, 0x4b96, 0x4bf1, 0x4c39, 0x4c82, 0x4c02, 0x4cad, 0x4c69, 0x4c17, 0x4c61, 0x4d56, 0x4bfb, 0x4c61, 0x4bed, 0x4c02, 0x4cd9, 0x4ba6, 0x4c02, 0x4ca3, 0x4ce5, 0x4cdb, 0x4d13, 0x4c24, 0x4c43, 0x4c12, 0x4c2b, 0x4c98, 0x4c26, 0x4c32, 0x4c22, 0x4c1d, 0x4c09, 0x4c1e, -0x4c91, 0x4c4b, 0x4be4, 0x4c54, 0x4ca6, 0x4c16, 0x4af8, 0x4c4f, 0x4cb9, 0x4cc8, 0x4c01, 0x4c6a, 0x4c72, 0x4c6c, 0x4c6e, 0x4ba1, 0x4cd8, 0x4c76, 0x4cc0, 0x4c56, 0x4c77, 0x4c79, 0x4c2f, 0x4c64, 0x4cdd, 0x4c8c, 0x4c48, 0x4cb2, 0x4bc7, 0x4c46, 0x4c75, 0x4c0a, 0x4c09, 0x4c70, 0x4c1f, 0x4c78, 0x4c39, 0x4c97, 0x4be1, 0x4bdf, 0x4c97, 0x4d67, 0x4ba7, 0x4ccb, 0x4c35, 0x4c05, 0x4cde, 0x4b7f, 0x4cb4, 0x4c95, 0x4d04, 0x4cc9, 0x4d09, 0x4c77, 0x4c90, 0x4c41, 0x4c0d, 0x4c39, 0x4bed, 0x4c24, 0x4c02, 0x4c87, 0x4c32, 0x4c3a, -0x4c12, 0x4c5a, 0x4aa0, 0x4c0e, 0x4c3a, 0x4baa, 0x4a48, 0x4c1e, 0x4ca6, 0x4c74, 0x4ba9, 0x4c64, 0x4bf6, 0x4b18, 0x4b90, 0x4b7b, 0x4cac, 0x4c0e, 0x4c90, 0x4c2b, 0x4c11, 0x4b1d, 0x4b6d, 0x4bd8, 0x4ccf, 0x4c0a, 0x4bc5, 0x4c84, 0x4b7f, 0x4c0a, 0x4c30, 0x4bdd, 0x4b45, 0x4ad1, 0x4b9f, 0x4c19, 0x4bfb, 0x4c44, 0x4c46, 0x4b6f, 0x4c60, 0x4cbd, 0x4b08, 0x4c6d, 0x4c04, 0x4c11, 0x4c12, 0x4af7, 0x4bab, 0x4c56, 0x4cad, 0x4c86, 0x4c93, 0x4bc7, 0x4c2d, 0x4ad9, 0x4c06, 0x4c30, 0x4bae, 0x4ba4, 0x4afb, 0x4bb3, 0x4c09, 0x4b89, -0x4c06, 0x4c63, 0x4b5d, 0x4c84, 0x4c06, 0x4bc8, 0x49ef, 0x4b95, 0x4c54, 0x4c42, 0x4b71, 0x4c32, 0x4b52, 0x4b1e, 0x4af1, 0x4ae9, 0x4c9c, 0x4c25, 0x4c66, 0x4bfd, 0x4b67, 0x4bcd, 0x4af2, 0x4b7e, 0x4c74, 0x4c29, 0x4b7e, 0x4c0a, 0x4b2a, 0x4c26, 0x4bb8, 0x4c07, 0x4bec, 0x4b71, 0x4b8f, 0x4b14, 0x4bb2, 0x4c8e, 0x4beb, 0x4bac, 0x4bfb, 0x4ce0, 0x4b34, 0x4c21, 0x4be1, 0x4c03, 0x4c53, 0x4b86, 0x4baf, 0x4c40, 0x4c98, 0x4c6c, 0x4c78, 0x4bfc, 0x4c15, 0x4b54, 0x4b6a, 0x4c30, 0x4be2, 0x4b3e, 0x4b43, 0x4b15, 0x4bae, 0x4beb, -0x4b6a, 0x4bc9, 0x4ad8, 0x4c28, 0x4c3b, 0x4b99, 0x4968, 0x4c03, 0x4c24, 0x4c33, 0x4ad3, 0x4c45, 0x4b18, 0x4b63, 0x4bb1, 0x4b29, 0x4c3e, 0x4baf, 0x4c04, 0x4b78, 0x4bb4, 0x4af2, 0x4a83, 0x4c44, 0x4c67, 0x4c1e, 0x4bad, 0x4c2e, 0x4b07, 0x4bff, 0x4b1c, 0x4beb, 0x4b00, 0x4b1c, 0x4bfe, 0x4b86, 0x4b6d, 0x4c09, 0x4b2e, 0x4ba4, 0x4c16, 0x4c94, 0x4b32, 0x4c2e, 0x4b28, 0x4b2d, 0x4c35, 0x4b09, 0x4b4c, 0x4c25, 0x4c9c, 0x4c3a, 0x4c22, 0x4b95, 0x4c0a, 0x4af1, 0x4b20, 0x4c3d, 0x4b79, 0x4b40, 0x4a9e, 0x4b52, 0x4c09, 0x4c03, -0x4c74, 0x4c1c, 0x4bc9, 0x4c74, 0x4ccf, 0x4c62, 0x4ad2, 0x4c51, 0x4cbe, 0x4c92, 0x4bdf, 0x4c8e, 0x4c57, 0x4c0f, 0x4c13, 0x4b34, 0x4ce0, 0x4c8a, 0x4ccc, 0x4bf7, 0x4c61, 0x4c6a, 0x4b81, 0x4bda, 0x4cf7, 0x4c7f, 0x4c58, 0x4c3a, 0x4bc5, 0x4c5e, 0x4c5b, 0x4c7a, 0x4c09, 0x4c3a, 0x4c5c, 0x4c3d, 0x4c02, 0x4d0a, 0x4c29, 0x4bc8, 0x4c98, 0x4d8b, 0x4b6a, 0x4c9b, 0x4c20, 0x4bfb, 0x4d3d, 0x4ba0, 0x4c7c, 0x4c82, 0x4cf2, 0x4d27, 0x4cd0, 0x4c68, 0x4c8d, 0x4bdb, 0x4c29, 0x4c69, 0x4c08, 0x4c0a, 0x4b5d, 0x4bc8, 0x4c0d, 0x4c92, -0x4c0e, 0x4c3f, 0x4be7, 0x4ca5, 0x4c4f, 0x4c20, 0x4b1d, 0x4c78, 0x4ca0, 0x4c56, 0x4c24, 0x4cc9, 0x4c33, 0x4c49, 0x4c1d, 0x4b6b, 0x4ccd, 0x4c2e, 0x4c8d, 0x4c0b, 0x4c36, 0x4bf8, 0x4c20, 0x4c20, 0x4d0a, 0x4caa, 0x4c6a, 0x4cfc, 0x4c00, 0x4c83, 0x4c4e, 0x4c51, 0x4bd1, 0x4c20, 0x4c5a, 0x4c23, 0x4c15, 0x4ce6, 0x4bcf, 0x4c35, 0x4c46, 0x4d3d, 0x4bfd, 0x4ccb, 0x4c41, 0x4c07, 0x4cea, 0x4b69, 0x4c6f, 0x4c8e, 0x4cfa, 0x4d22, 0x4cb5, 0x4c45, 0x4c7d, 0x4bb2, 0x4c3f, 0x4c42, 0x4be8, 0x4b9b, 0x4c02, 0x4c41, 0x4ca7, 0x4c66, -0x4c6d, 0x4c2a, 0x4aa4, 0x4c4d, 0x4c66, 0x4bdd, 0x4a63, 0x4c28, 0x4c8c, 0x4c75, 0x4b96, 0x4c2a, 0x4c12, 0x4c4c, 0x4c02, 0x4b1a, 0x4c83, 0x4c58, 0x4c9d, 0x4be6, 0x4bdb, 0x4c28, 0x4c2f, 0x4be7, 0x4d14, 0x4cc4, 0x4c44, 0x4c63, 0x4b29, 0x4c02, 0x4c42, 0x4c30, 0x4b95, 0x4c00, 0x4c51, 0x4c44, 0x4bf3, 0x4c43, 0x4bc4, 0x4c03, 0x4c4f, 0x4d51, 0x4b58, 0x4c66, 0x4c14, 0x4b7b, 0x4ce0, 0x4baa, 0x4c5b, 0x4c9b, 0x4cd8, 0x4c76, 0x4c67, 0x4c22, 0x4c93, 0x4bb1, 0x4c55, 0x4c5d, 0x4c40, 0x4c1d, 0x4bb1, 0x4c38, 0x4b7b, 0x4c6a, -0x4be8, 0x4caa, 0x4a58, 0x4c00, 0x4c10, 0x4c03, 0x4b11, 0x4c63, 0x4c52, 0x4c94, 0x4b0d, 0x4c02, 0x4c1f, 0x4b84, 0x4bae, 0x4b3a, 0x4c11, 0x4c3f, 0x4cca, 0x4be1, 0x4c03, 0x4c1c, 0x4b65, 0x4b62, 0x4c64, 0x4c31, 0x4bc5, 0x4c6c, 0x4ba4, 0x4c48, 0x4c11, 0x4b6b, 0x4b61, 0x4baa, 0x4bec, 0x4c1f, 0x4b43, 0x4c65, 0x4c0a, 0x4bc5, 0x4c19, 0x4d1c, 0x4bb6, 0x4c12, 0x4c27, 0x4be2, 0x4cb6, 0x4ab5, 0x4c93, 0x4c64, 0x4c93, 0x4cb1, 0x4c8f, 0x4b64, 0x4c39, 0x4c1d, 0x4b9d, 0x4c48, 0x4b0b, 0x4b08, 0x4b8a, 0x4b85, 0x4b83, 0x4c19, -0x4c15, 0x4c34, 0x4afb, 0x4c55, 0x4c72, 0x4c14, 0x4a7a, 0x4c3d, 0x4c7e, 0x4c27, 0x4b98, 0x4cc6, 0x4c4f, 0x4b12, 0x4b2e, 0x4b60, 0x4c8d, 0x4c5b, 0x4c64, 0x4bee, 0x4c18, 0x4bcf, 0x4c1a, 0x4c2c, 0x4ce1, 0x4c61, 0x4c0e, 0x4c26, 0x4b81, 0x4c08, 0x4c29, 0x4c23, 0x4bf0, 0x4be5, 0x4bcc, 0x4c3f, 0x4c05, 0x4cbb, 0x4c30, 0x4b4e, 0x4c32, 0x4cff, 0x4b5a, 0x4c80, 0x4c15, 0x4bed, 0x4cd4, 0x4ab8, 0x4c55, 0x4c89, 0x4cac, 0x4c9f, 0x4c75, 0x4c38, 0x4c44, 0x4be0, 0x4c16, 0x4c0b, 0x4c06, 0x4bd4, 0x4b5b, 0x4bdc, 0x4bb6, 0x4c6c, -0x4b9d, 0x4bf7, 0x49d3, 0x4b5e, 0x4b8b, 0x4b8f, 0x4934, 0x4b77, 0x4b7e, 0x4c32, 0x4a26, 0x4bf3, 0x4ba1, 0x4bf1, 0x4b35, 0x4a1d, 0x4c14, 0x4bf7, 0x4c37, 0x4b70, 0x4b74, 0x4aac, 0x4b30, 0x4b86, 0x4c6d, 0x4c3e, 0x4bc0, 0x4bd7, 0x4a69, 0x4b39, 0x4b56, 0x4b2f, 0x4b9b, 0x4b3f, 0x4b34, 0x4bcc, 0x4aec, 0x4c28, 0x4aa4, 0x4b77, 0x4b3d, 0x4c83, 0x4aa8, 0x4c24, 0x4acc, 0x4b6e, 0x4c08, 0x4a66, 0x4be0, 0x4b77, 0x4ca6, 0x4bb5, 0x4c06, 0x4b1d, 0x4bdb, 0x4ad0, 0x4bc7, 0x4b95, 0x4a55, 0x4b9d, 0x4b03, 0x4b57, 0x4b1f, 0x4b38, -0x4c38, 0x4c14, 0x4aa8, 0x4be2, 0x4c4a, 0x4c2e, 0x4a73, 0x4c34, 0x4c56, 0x4c28, 0x4ac1, 0x4c35, 0x4c38, 0x4c0e, 0x4b84, 0x4a9e, 0x4c4a, 0x4bfa, 0x4c84, 0x4c0e, 0x4be7, 0x4b78, 0x4c06, 0x4b71, 0x4cac, 0x4bef, 0x4c3e, 0x4c3a, 0x4b20, 0x4b84, 0x4c1d, 0x4ba8, 0x4ba0, 0x4b94, 0x4ba3, 0x4c6c, 0x4bea, 0x4c4e, 0x4b9d, 0x4bac, 0x4c2f, 0x4cd4, 0x4b6c, 0x4c2e, 0x4bfe, 0x4bea, 0x4c92, 0x4a89, 0x4c08, 0x4c61, 0x4c68, 0x4ca6, 0x4ca9, 0x4c3e, 0x4c4e, 0x4b16, 0x4c05, 0x4c30, 0x4bc9, 0x4ba4, 0x4ad1, 0x4b2e, 0x4c2e, 0x4bf0, -0x4ae3, 0x4b77, 0x4a5e, 0x4c28, 0x4b71, 0x4a92, 0x49f9, 0x4b3c, 0x4c0f, 0x4b47, 0x4ae8, 0x4bb9, 0x4b1c, 0x4bb3, 0x4ac5, 0x4a9a, 0x4c46, 0x4b18, 0x4bed, 0x4b90, 0x4b06, 0x4ab9, 0x4ad8, 0x4ae3, 0x4c74, 0x4bb4, 0x4b72, 0x4c13, 0x4aaf, 0x4b81, 0x4bf9, 0x4c00, 0x4b2e, 0x4aa8, 0x4b11, 0x4b5d, 0x4ae6, 0x4bf3, 0x4a75, 0x4a9a, 0x4bd3, 0x4c38, 0x4b18, 0x4c09, 0x4b87, 0x4b2d, 0x4c14, 0x4a47, 0x4b74, 0x4be8, 0x4c42, 0x4bc4, 0x4ba1, 0x4b2a, 0x4bc0, 0x4a4d, 0x4b16, 0x4bb4, 0x4afa, 0x4ad9, 0x4ad7, 0x4b6c, 0x4aec, 0x4c15, -0x4c52, 0x4c38, 0x4b25, 0x4c30, 0x4c67, 0x4c3f, 0x4aa1, 0x4c05, 0x4c3f, 0x4c7f, 0x4bb3, 0x4c5f, 0x4c4e, 0x4c6c, 0x4c27, 0x4aae, 0x4c58, 0x4c51, 0x4c7d, 0x4c0b, 0x4c0e, 0x4c75, 0x4c24, 0x4bf9, 0x4c95, 0x4c3f, 0x4c6b, 0x4cb8, 0x4b50, 0x4c19, 0x4c6b, 0x4c06, 0x4b56, 0x4c14, 0x4c17, 0x4c26, 0x4c07, 0x4c98, 0x4b96, 0x4c05, 0x4c2d, 0x4d1d, 0x4bcf, 0x4c1c, 0x4c1a, 0x4c2c, 0x4ca5, 0x4b4c, 0x4c41, 0x4c2d, 0x4ced, 0x4ca1, 0x4c90, 0x4c29, 0x4c5d, 0x4bf9, 0x4bf2, 0x4c99, 0x4c00, 0x4c08, 0x4bbf, 0x4c1d, 0x4c47, 0x4c19, -0x4c3a, 0x4c1a, 0x4aad, 0x4bd5, 0x4c67, 0x4bf1, 0x4a82, 0x4c1b, 0x4c5a, 0x4c56, 0x4b0f, 0x4c65, 0x4c0b, 0x4bbc, 0x4c23, 0x4b60, 0x4c59, 0x4c14, 0x4c76, 0x4bc5, 0x4b7d, 0x4b5b, 0x4bfd, 0x4c14, 0x4c33, 0x4be3, 0x4c5a, 0x4c48, 0x4b37, 0x4c13, 0x4c17, 0x4c3d, 0x4bff, 0x4b70, 0x4bf4, 0x4c32, 0x4b75, 0x4c8f, 0x4b83, 0x4c01, 0x4c09, 0x4ce4, 0x4afe, 0x4c4d, 0x4c00, 0x4c30, 0x4cb4, 0x4b21, 0x4c17, 0x4c0d, 0x4c5e, 0x4c51, 0x4c43, 0x4bea, 0x4c15, 0x4b37, 0x4c23, 0x4c84, 0x4ae8, 0x4bf0, 0x4b64, 0x4bec, 0x4bf6, 0x4c00, -0x4c53, 0x4c69, 0x4b9d, 0x4c3d, 0x4cb7, 0x4c4b, 0x4a48, 0x4c53, 0x4c8a, 0x4ca6, 0x4c09, 0x4c99, 0x4c14, 0x4c2f, 0x4c2d, 0x4bb1, 0x4cb1, 0x4caf, 0x4cb0, 0x4bfb, 0x4c2b, 0x4beb, 0x4c2a, 0x4bfc, 0x4cf2, 0x4cbc, 0x4c78, 0x4c78, 0x4bd1, 0x4c26, 0x4c54, 0x4c1e, 0x4bab, 0x4b93, 0x4bf0, 0x4c6f, 0x4c4f, 0x4c78, 0x4b9f, 0x4c2c, 0x4c38, 0x4d2a, 0x4c12, 0x4c92, 0x4bcd, 0x4bf5, 0x4c6d, 0x4b11, 0x4c39, 0x4c69, 0x4d44, 0x4cc8, 0x4c72, 0x4c24, 0x4c6b, 0x4c1a, 0x4b6a, 0x4c98, 0x4b8c, 0x4bd7, 0x4bc6, 0x4c4c, 0x4bb4, 0x4c27, -0x4b2d, 0x4c8c, 0x4b01, 0x4c44, 0x4c6a, 0x4c4d, 0x4ae3, 0x4c2f, 0x4c61, 0x4cbf, 0x4ad0, 0x4c4c, 0x4bf6, 0x4c0a, 0x4c0f, 0x4b2b, 0x4c3c, 0x4c41, 0x4c5a, 0x4b8f, 0x4c3e, 0x4b85, 0x4c16, 0x4bac, 0x4c8d, 0x4c90, 0x4c64, 0x4c4d, 0x4b09, 0x4c16, 0x4c17, 0x4baa, 0x4bbe, 0x4b8e, 0x4c3d, 0x4c18, 0x4bf2, 0x4c2d, 0x4bec, 0x4be0, 0x4ca8, 0x4d28, 0x4c17, 0x4c19, 0x4bb1, 0x4beb, 0x4c87, 0x4b00, 0x4c1a, 0x4c7a, 0x4cf3, 0x4c58, 0x4c6b, 0x4b51, 0x4ca9, 0x4be0, 0x4bf5, 0x4c74, 0x4b7b, 0x4c21, 0x4be0, 0x4c7f, 0x4c02, 0x4ba2, -0x4c0b, 0x4c3d, 0x4a97, 0x4b31, 0x4c5c, 0x4b8d, 0x49bf, 0x4c1f, 0x4c1e, 0x4c74, 0x4a3a, 0x4c67, 0x4c5a, 0x4bc5, 0x4bfb, 0x4aee, 0x4c94, 0x4c14, 0x4cb5, 0x4b73, 0x4c8c, 0x4ba2, 0x4bed, 0x4c0d, 0x4c8a, 0x4b9d, 0x4c1e, 0x4c6b, 0x4aff, 0x4c22, 0x4c16, 0x4bd3, 0x4b3e, 0x4bf4, 0x4c13, 0x4c4a, 0x4bbf, 0x4c3b, 0x4b4f, 0x4c2c, 0x4c14, 0x4cbf, 0x4b04, 0x4c6f, 0x4c12, 0x4c23, 0x4ce7, 0x4ab9, 0x4be9, 0x4c35, 0x4d11, 0x4c73, 0x4c32, 0x4ba8, 0x4c66, 0x4b8d, 0x4bbf, 0x4c73, 0x4b79, 0x4b63, 0x4b0a, 0x4bfe, 0x4b86, 0x4c25, -0x4c24, 0x4c1f, 0x4b14, 0x4c36, 0x4c74, 0x4c2f, 0x4a63, 0x4c9a, 0x4c8c, 0x4c4a, 0x4ba6, 0x4ca6, 0x4c2f, 0x4bdc, 0x4bb5, 0x4bcc, 0x4c8b, 0x4c48, 0x4cb4, 0x4c5d, 0x4c0e, 0x4c0a, 0x4bab, 0x4c10, 0x4c76, 0x4c47, 0x4c66, 0x4c9d, 0x4ae9, 0x4c10, 0x4c5b, 0x4c31, 0x4c06, 0x4b5d, 0x4c45, 0x4c2e, 0x4c0c, 0x4c9b, 0x4bae, 0x4c33, 0x4c4b, 0x4d3a, 0x4bf9, 0x4c79, 0x4bff, 0x4bcb, 0x4ced, 0x4ba6, 0x4c9d, 0x4c60, 0x4c7d, 0x4c9c, 0x4ca4, 0x4bb4, 0x4c9c, 0x4b74, 0x4b76, 0x4c6a, 0x4c18, 0x4bfe, 0x4b8e, 0x4c2e, 0x4bec, 0x4c68, -0x4c22, 0x4baf, 0x4bca, 0x4c2f, 0x4c8d, 0x4c3d, 0x4a24, 0x4c27, 0x4c4c, 0x4c9a, 0x4b60, 0x4c98, 0x4c32, 0x4c3b, 0x4c2e, 0x4b46, 0x4cc5, 0x4c3f, 0x4c61, 0x4c3f, 0x4c31, 0x4be3, 0x4c0b, 0x4c28, 0x4cf1, 0x4c8d, 0x4c72, 0x4cad, 0x4b2d, 0x4c16, 0x4c16, 0x4c0f, 0x4bd4, 0x4c53, 0x4c31, 0x4c1f, 0x4c56, 0x4c8b, 0x4bd2, 0x4bd3, 0x4bf7, 0x4d7d, 0x4aaf, 0x4ca8, 0x4bca, 0x4c17, 0x4cc9, 0x4b8a, 0x4c7c, 0x4c69, 0x4c9b, 0x4ccd, 0x4ca3, 0x4c61, 0x4c62, 0x4b73, 0x4c02, 0x4c6e, 0x4bbf, 0x4c1b, 0x4bfe, 0x4c21, 0x4c51, 0x4c17, -0x4c78, 0x4c6f, 0x4bd7, 0x4c8e, 0x4cbb, 0x4c02, 0x4ae1, 0x4c40, 0x4c91, 0x4cd4, 0x4c10, 0x4ca2, 0x4c2a, 0x4c37, 0x4c3c, 0x4b9d, 0x4d29, 0x4c57, 0x4cef, 0x4c6d, 0x4c8b, 0x4c2e, 0x4c41, 0x4cac, 0x4d1e, 0x4caf, 0x4cb8, 0x4c9b, 0x4bcf, 0x4c60, 0x4c8f, 0x4c87, 0x4c1d, 0x4c63, 0x4c60, 0x4c7a, 0x4c33, 0x4cb3, 0x4c1b, 0x4c3a, 0x4c8e, 0x4d56, 0x4ba9, 0x4d16, 0x4c47, 0x4c14, 0x4d3d, 0x4b8a, 0x4c9c, 0x4cef, 0x4cf1, 0x4cdc, 0x4cdb, 0x4c66, 0x4caf, 0x4c06, 0x4c1c, 0x4c61, 0x4c11, 0x4c61, 0x4c27, 0x4c3d, 0x4c1e, 0x4ca7, -0x4b13, 0x4bfe, 0x4a52, 0x4c22, 0x4c0e, 0x4b8f, 0x4a8e, 0x4b4a, 0x4b60, 0x4b8b, 0x4b2e, 0x4bb1, 0x4ba5, 0x4aeb, 0x4ac8, 0x4a5c, 0x4c3e, 0x4b54, 0x4c24, 0x4b96, 0x4bfa, 0x4b9c, 0x4ada, 0x4adb, 0x4c39, 0x4bb2, 0x4b4a, 0x4bbe, 0x4ad7, 0x4b7e, 0x4a7c, 0x4b4b, 0x4ae7, 0x4ad1, 0x4bea, 0x4b75, 0x4ad3, 0x4c05, 0x4bb8, 0x4b0b, 0x4bc7, 0x4c7b, 0x4ba8, 0x4bae, 0x4b38, 0x4acb, 0x4c03, 0x4a42, 0x4b0d, 0x4c2d, 0x4c57, 0x4c65, 0x4c48, 0x4bf9, 0x4b99, 0x4acd, 0x4b56, 0x4c44, 0x4aac, 0x4b91, 0x4abe, 0x4ae5, 0x4ad9, 0x4b89, -0x4ab7, 0x4bd8, 0x4a93, 0x4b9e, 0x4bab, 0x4bd7, 0x49ed, 0x4bcd, 0x4c8d, 0x4c29, 0x4a60, 0x4c25, 0x4b16, 0x4b37, 0x4b1a, 0x4abc, 0x4bb3, 0x4bb6, 0x4c10, 0x4b9a, 0x4b80, 0x4ac0, 0x4a5c, 0x4af7, 0x4c4b, 0x4b5e, 0x4b71, 0x4bac, 0x4b6b, 0x4bbd, 0x4bb1, 0x4bd7, 0x4b15, 0x4a87, 0x4b5c, 0x4bff, 0x4b6f, 0x4bf4, 0x4b44, 0x4ba6, 0x4c37, 0x4c78, 0x4a99, 0x4c46, 0x4b85, 0x4aa2, 0x4c39, 0x4a7d, 0x4c41, 0x4c29, 0x4c36, 0x4c27, 0x4c54, 0x4b1e, 0x4bc0, 0x4a96, 0x4b83, 0x4b9a, 0x4ad4, 0x4b1b, 0x4b29, 0x4b15, 0x4b45, 0x4ba3, -0x4c24, 0x4c01, 0x4b09, 0x4c14, 0x4c19, 0x4b9f, 0x497e, 0x4bf8, 0x4c0f, 0x4c9d, 0x4b5c, 0x4c52, 0x4bc9, 0x4bf1, 0x4c0c, 0x4a46, 0x4c86, 0x4b41, 0x4c7a, 0x4bbe, 0x4c6c, 0x4be4, 0x4b11, 0x4bce, 0x4ca5, 0x4c54, 0x4c24, 0x4c61, 0x4aa6, 0x4c00, 0x4bb1, 0x4bf1, 0x4b07, 0x4c12, 0x4c01, 0x4b75, 0x4c0c, 0x4c54, 0x4b80, 0x4b88, 0x4be0, 0x4cf2, 0x4aef, 0x4cc1, 0x4ba2, 0x4b41, 0x4c8a, 0x4a60, 0x4beb, 0x4c14, 0x4cbe, 0x4c8f, 0x4c77, 0x4c41, 0x4c44, 0x4b83, 0x4b99, 0x4c17, 0x4b81, 0x4b46, 0x4ad7, 0x4b7a, 0x4b94, 0x4c35, -0x4b67, 0x4c1d, 0x49e1, 0x4bb8, 0x4b7d, 0x4ab3, 0x49c1, 0x4b9e, 0x4bcb, 0x4c06, 0x4b37, 0x4baa, 0x4b91, 0x4b00, 0x4afc, 0x4ac2, 0x4bf4, 0x4bd4, 0x4be3, 0x4b48, 0x4bcf, 0x4ac4, 0x4a57, 0x4ba5, 0x4c4e, 0x4c1b, 0x4b31, 0x4be4, 0x4b26, 0x4bcb, 0x4b64, 0x4bf6, 0x4aff, 0x4b51, 0x4b4b, 0x4b3b, 0x4ae3, 0x4c1d, 0x4a9b, 0x4abb, 0x4b15, 0x4c4f, 0x4a50, 0x4bf4, 0x4b93, 0x4a9f, 0x4bf1, 0x4a85, 0x4bcb, 0x4c02, 0x4c6c, 0x4c15, 0x4be6, 0x4b42, 0x4bf3, 0x4b23, 0x4b6a, 0x4b73, 0x4a96, 0x4bbf, 0x4af0, 0x4bc4, 0x4b1b, 0x4b7c, -0x4cc2, 0x4c87, 0x4a2c, 0x4c12, 0x4c3e, 0x4c34, 0x4abd, 0x4c38, 0x4c43, 0x4ce1, 0x4b49, 0x4c5e, 0x4c5b, 0x4c5a, 0x4c47, 0x4b67, 0x4cad, 0x4c39, 0x4ca6, 0x4c67, 0x4c0c, 0x4b1a, 0x4c03, 0x4c48, 0x4cb0, 0x4c42, 0x4c6b, 0x4cbf, 0x4c13, 0x4c36, 0x4c2a, 0x4c7e, 0x4bcc, 0x4bda, 0x4c59, 0x4c2f, 0x4c36, 0x4c8b, 0x4b89, 0x4b7a, 0x4c65, 0x4cdc, 0x4b33, 0x4cd8, 0x4c7b, 0x4c4a, 0x4cdd, 0x4c2d, 0x4c91, 0x4c9d, 0x4cc3, 0x4c79, 0x4c8a, 0x4c5b, 0x4c82, 0x4c32, 0x4c24, 0x4c78, 0x4c31, 0x4c25, 0x4bd2, 0x4bda, 0x4a9c, 0x4c86, -0x4c31, 0x4bff, 0x4b04, 0x4c67, 0x4c95, 0x4c19, 0x4a5e, 0x4c19, 0x4c78, 0x4c5f, 0x4c04, 0x4caf, 0x4c45, 0x4c14, 0x4c1a, 0x4b21, 0x4c73, 0x4c86, 0x4c46, 0x4bc8, 0x4c13, 0x4b38, 0x4c0e, 0x4c11, 0x4cac, 0x4c65, 0x4c6e, 0x4cba, 0x4baa, 0x4c21, 0x4c3d, 0x4c44, 0x4bf7, 0x4b9f, 0x4c61, 0x4c22, 0x4c0e, 0x4c75, 0x4bf2, 0x4ba3, 0x4be0, 0x4d13, 0x4b96, 0x4c9a, 0x4c37, 0x4bf3, 0x4cb8, 0x4af8, 0x4c3a, 0x4c5e, 0x4ca8, 0x4c96, 0x4c85, 0x4c2b, 0x4c84, 0x4bcc, 0x4c09, 0x4c3f, 0x4b37, 0x4bb7, 0x4c06, 0x4c4b, 0x4bf4, 0x4c10, -0x4c30, 0x4c7c, 0x4b24, 0x4c1b, 0x4c3f, 0x4c14, 0x4ab2, 0x4c21, 0x4c56, 0x4ccb, 0x4ae3, 0x4c9c, 0x4c17, 0x4b89, 0x4c03, 0x4b60, 0x4cd6, 0x4c1b, 0x4cd3, 0x4b53, 0x4c59, 0x4bf4, 0x4bd0, 0x4c02, 0x4cbe, 0x4c26, 0x4c43, 0x4c52, 0x4bbd, 0x4c20, 0x4c35, 0x4c3a, 0x4bdd, 0x4c10, 0x4c1d, 0x4c05, 0x4c4d, 0x4c65, 0x4c02, 0x4b60, 0x4b70, 0x4ccb, 0x4b99, 0x4c84, 0x4c55, 0x4bf0, 0x4cd1, 0x4b6e, 0x4c36, 0x4c98, 0x4cd1, 0x4ca2, 0x4caf, 0x4c1b, 0x4c93, 0x4c15, 0x4b90, 0x4c4d, 0x4bd3, 0x4ba0, 0x4af7, 0x4c1a, 0x4c25, 0x4c64, -0x4ba1, 0x4bbd, 0x4a6d, 0x4bca, 0x4c10, 0x4ae3, 0x4a3c, 0x4be1, 0x4c01, 0x4c01, 0x4b31, 0x4c22, 0x4bda, 0x4bf4, 0x4b55, 0x4b1c, 0x4c7d, 0x4c36, 0x4c14, 0x4bdf, 0x4c18, 0x4b00, 0x4b56, 0x4b4c, 0x4c64, 0x4b82, 0x4c5b, 0x4c37, 0x4ab0, 0x4b96, 0x4c0d, 0x4bbe, 0x4b09, 0x4b1a, 0x4c19, 0x4c33, 0x4c30, 0x4c3e, 0x4af8, 0x4bad, 0x4c04, 0x4cb4, 0x4b43, 0x4c56, 0x4c08, 0x4b1c, 0x4c2d, 0x4aa0, 0x4b64, 0x4c1f, 0x4ca0, 0x4c27, 0x4c58, 0x4c16, 0x4c76, 0x4abd, 0x4b6a, 0x4c02, 0x4bcc, 0x4b68, 0x4af4, 0x4b98, 0x4b47, 0x4b65, -0x4c89, 0x4c99, 0x4aa0, 0x4c5c, 0x4c74, 0x4bdc, 0x4ab4, 0x4c60, 0x4cc4, 0x4ca8, 0x4b8c, 0x4c58, 0x4c4e, 0x4bed, 0x4c08, 0x4b50, 0x4cd1, 0x4c9a, 0x4ca3, 0x4c1b, 0x4c59, 0x4bc4, 0x4c27, 0x4c6f, 0x4ceb, 0x4c8a, 0x4c82, 0x4c8a, 0x4c07, 0x4c54, 0x4c5f, 0x4ca5, 0x4c16, 0x4c37, 0x4c2e, 0x4c5e, 0x4c12, 0x4ca1, 0x4c19, 0x4c2d, 0x4c49, 0x4d42, 0x4bb4, 0x4ca3, 0x4c68, 0x4c55, 0x4d6a, 0x4c0f, 0x4c6f, 0x4cea, 0x4cb9, 0x4c84, 0x4cf1, 0x4c02, 0x4c48, 0x4bfb, 0x4c61, 0x4cad, 0x4c2c, 0x4b93, 0x4c03, 0x4b97, 0x4be0, 0x4c7d, -0x4c35, 0x4c5c, 0x4b42, 0x4c27, 0x4c3b, 0x4c21, 0x4ac7, 0x4c5b, 0x4c92, 0x4c95, 0x4bb2, 0x4c6b, 0x4c0c, 0x4c09, 0x4c16, 0x4b23, 0x4c8d, 0x4c8f, 0x4ccb, 0x4c0e, 0x4c79, 0x4be4, 0x4bc7, 0x4b8d, 0x4cc3, 0x4cb3, 0x4c6d, 0x4cb6, 0x4bce, 0x4c23, 0x4c50, 0x4c81, 0x4c0a, 0x4c20, 0x4c2c, 0x4c62, 0x4c0c, 0x4cbc, 0x4bb9, 0x4c01, 0x4c8c, 0x4d8b, 0x4be6, 0x4c82, 0x4c24, 0x4c13, 0x4ce8, 0x4c07, 0x4cb6, 0x4c83, 0x4cb1, 0x4cc9, 0x4cc7, 0x4c0c, 0x4c69, 0x4c00, 0x4b96, 0x4c90, 0x4bd7, 0x4b79, 0x4b48, 0x4c00, 0x4c1c, 0x4c77, -0x4c22, 0x4ca1, 0x4ac2, 0x4c1e, 0x4c9e, 0x4c4d, 0x4ab7, 0x4ca8, 0x4cc3, 0x4c94, 0x4b20, 0x4ca2, 0x4c70, 0x4c10, 0x4bc6, 0x4b5a, 0x4c51, 0x4c0d, 0x4cfa, 0x4bfc, 0x4ca2, 0x4c2c, 0x4c1b, 0x4c19, 0x4ce6, 0x4c79, 0x4c5e, 0x4ca2, 0x4ba6, 0x4c37, 0x4c14, 0x4c47, 0x4bef, 0x4c0f, 0x4c86, 0x4c24, 0x4c2a, 0x4c98, 0x4c67, 0x4c38, 0x4c86, 0x4d14, 0x4c0b, 0x4cb1, 0x4c43, 0x4c0d, 0x4cb7, 0x4b82, 0x4ca1, 0x4cf0, 0x4cf6, 0x4cda, 0x4c4e, 0x4c52, 0x4c59, 0x4bd4, 0x4b67, 0x4caf, 0x4c1a, 0x4bc6, 0x4b81, 0x4bf0, 0x4c13, 0x4c94, -0x4c57, 0x4c5e, 0x4b6e, 0x4c39, 0x4ce4, 0x4c7f, 0x4a88, 0x4c8b, 0x4c8a, 0x4cc3, 0x4bb6, 0x4c8c, 0x4c12, 0x4c8d, 0x4c50, 0x4b65, 0x4cdd, 0x4c37, 0x4c9e, 0x4c0b, 0x4c00, 0x4c2f, 0x4c09, 0x4c2a, 0x4cd4, 0x4c8a, 0x4c63, 0x4c8f, 0x4b83, 0x4c75, 0x4c3c, 0x4c59, 0x4c0b, 0x4ba5, 0x4c1a, 0x4c13, 0x4c2e, 0x4c9e, 0x4be3, 0x4c01, 0x4c40, 0x4d02, 0x4bff, 0x4c7d, 0x4c02, 0x4bc3, 0x4cee, 0x4c26, 0x4c6c, 0x4cd1, 0x4d01, 0x4cbb, 0x4cc7, 0x4c5a, 0x4c35, 0x4bfe, 0x4bb5, 0x4cb4, 0x4ba8, 0x4c0d, 0x4c4d, 0x4c0e, 0x4c50, 0x4c8b, -0x4c3d, 0x4c91, 0x4bc1, 0x4c78, 0x4c57, 0x4c3c, 0x4a9d, 0x4c2d, 0x4ca4, 0x4cb8, 0x4ba5, 0x4c9e, 0x4c09, 0x4bd9, 0x4be8, 0x4b62, 0x4cb9, 0x4c38, 0x4c9b, 0x4b79, 0x4c02, 0x4c30, 0x4c1b, 0x4c16, 0x4cb0, 0x4cb9, 0x4c73, 0x4c56, 0x4b99, 0x4c36, 0x4c59, 0x4c55, 0x4bfe, 0x4c31, 0x4bc5, 0x4bc8, 0x4c36, 0x4d03, 0x4bde, 0x4c31, 0x4c11, 0x4d70, 0x4bd1, 0x4c9c, 0x4c0e, 0x4c1a, 0x4cb9, 0x4c10, 0x4c9c, 0x4cac, 0x4cff, 0x4c93, 0x4c93, 0x4c02, 0x4c63, 0x4c13, 0x4b69, 0x4c79, 0x4b96, 0x4b28, 0x4bbe, 0x4c19, 0x4c4b, 0x4c72, -0x4c71, 0x4c8d, 0x4bca, 0x4c2c, 0x4cab, 0x4c27, 0x4b09, 0x4c4f, 0x4c7b, 0x4ca2, 0x4b8f, 0x4c99, 0x4c12, 0x4c36, 0x4ba7, 0x4b2c, 0x4ced, 0x4c77, 0x4cf4, 0x4c0a, 0x4c8f, 0x4bff, 0x4ba1, 0x4c1e, 0x4d34, 0x4c63, 0x4c5b, 0x4c5a, 0x4bda, 0x4c63, 0x4c3a, 0x4c9c, 0x4c0c, 0x4c1e, 0x4c45, 0x4c7e, 0x4c5b, 0x4c99, 0x4c33, 0x4c28, 0x4c73, 0x4d44, 0x4bca, 0x4d0f, 0x4c30, 0x4c0e, 0x4cf4, 0x4bfe, 0x4c7e, 0x4cab, 0x4d50, 0x4cb4, 0x4cc9, 0x4c4e, 0x4c8a, 0x4be7, 0x4c18, 0x4c58, 0x4bef, 0x4bc0, 0x4b91, 0x4bfc, 0x4c1a, 0x4c97, -0x4a4c, 0x4b1e, 0x49ac, 0x4a9d, 0x4ac0, 0x49de, 0x4912, 0x4a67, 0x4a86, 0x4ae6, 0x49e9, 0x4af4, 0x4a92, 0x4a4f, 0x49a9, 0x497f, 0x4ace, 0x4a2c, 0x4b19, 0x4a6a, 0x4a9b, 0x4a0f, 0x499f, 0x4a23, 0x4b36, 0x4aef, 0x4b08, 0x4b5d, 0x499b, 0x4b1d, 0x4a59, 0x4a08, 0x49a7, 0x4a3a, 0x4aa9, 0x49ea, 0x4af0, 0x4a9d, 0x49f4, 0x4a56, 0x4b12, 0x4bf6, 0x4998, 0x4b6f, 0x49fa, 0x4a0e, 0x4aee, 0x4a23, 0x4a24, 0x4abd, 0x4af4, 0x4ab1, 0x4ae5, 0x4a1b, 0x4af2, 0x49f5, 0x49f5, 0x4b01, 0x49e7, 0x49c2, 0x4a25, 0x4a3f, 0x4a0e, 0x4a9a, -0x4c7f, 0x4ca9, 0x4c21, 0x4caa, 0x4cc2, 0x4c9c, 0x4a94, 0x4c97, 0x4d2a, 0x4d0c, 0x4c28, 0x4ce0, 0x4cb5, 0x4c78, 0x4c8b, 0x4c3f, 0x4cf8, 0x4c7f, 0x4cf7, 0x4c70, 0x4c95, 0x4c7e, 0x4bd4, 0x4c28, 0x4cd0, 0x4cbb, 0x4cab, 0x4cbb, 0x4c2e, 0x4c90, 0x4cba, 0x4cbb, 0x4c78, 0x4c3d, 0x4c79, 0x4c88, 0x4c2f, 0x4d03, 0x4c46, 0x4c3b, 0x4ce5, 0x4dc2, 0x4b68, 0x4d26, 0x4c85, 0x4c88, 0x4ca8, 0x4c07, 0x4cb7, 0x4cea, 0x4d6e, 0x4cd8, 0x4d0e, 0x4c94, 0x4cc3, 0x4c01, 0x4c56, 0x4d04, 0x4c5c, 0x4c7d, 0x4c41, 0x4c4a, 0x4c55, 0x4c83, -0x4b1c, 0x4bca, 0x4aae, 0x4b89, 0x4c16, 0x4b2b, 0x4a4c, 0x4bba, 0x4c0a, 0x4c27, 0x4b19, 0x4ba9, 0x4c22, 0x4bab, 0x4b78, 0x4a67, 0x4c24, 0x4b43, 0x4bc8, 0x4ba0, 0x4c2d, 0x4afb, 0x4bc0, 0x4b63, 0x4c86, 0x4c1e, 0x4b4f, 0x4c00, 0x4a82, 0x4c10, 0x4bda, 0x4b72, 0x4b3d, 0x4baf, 0x4b7e, 0x4b26, 0x4b7d, 0x4c46, 0x4b30, 0x4ab2, 0x4bb6, 0x4c96, 0x4b59, 0x4b5e, 0x4b54, 0x4b1d, 0x4c21, 0x4a7f, 0x4bca, 0x4b7a, 0x4c68, 0x4c24, 0x4c25, 0x4b31, 0x4c15, 0x4b57, 0x4ba9, 0x4b99, 0x4b38, 0x4bc8, 0x4ac9, 0x4b8e, 0x4af8, 0x4b66, -0x4b80, 0x4c39, 0x4af7, 0x4c2b, 0x4c26, 0x4c32, 0x4a0e, 0x4b54, 0x4caf, 0x4c02, 0x4b23, 0x4c11, 0x4c24, 0x4b64, 0x4b85, 0x4ada, 0x4c0a, 0x4b96, 0x4cc1, 0x4bdc, 0x4c30, 0x4c21, 0x4ba8, 0x4b33, 0x4c9b, 0x4bb0, 0x4c18, 0x4c05, 0x4b4a, 0x4c1a, 0x4bdc, 0x4bb7, 0x4af3, 0x4b51, 0x4b62, 0x4c05, 0x4bc7, 0x4c34, 0x4c6c, 0x4b69, 0x4c3b, 0x4ce5, 0x4bdc, 0x4c09, 0x4c40, 0x4b24, 0x4c92, 0x4a7f, 0x4c22, 0x4c63, 0x4c92, 0x4c62, 0x4c9c, 0x4c0a, 0x4c14, 0x4b37, 0x4c04, 0x4c48, 0x4bd1, 0x4c0a, 0x4b6b, 0x4b2b, 0x4b84, 0x4c14, -0x4c01, 0x4c59, 0x4b5a, 0x4c30, 0x4c48, 0x4c4b, 0x4a83, 0x4c7c, 0x4c98, 0x4c55, 0x4b92, 0x4cc2, 0x4c94, 0x4bdb, 0x4be1, 0x4bd5, 0x4c82, 0x4c72, 0x4ccc, 0x4be1, 0x4c53, 0x4bb2, 0x4bef, 0x4b14, 0x4cba, 0x4c57, 0x4c44, 0x4c97, 0x4b61, 0x4c21, 0x4c3b, 0x4c9d, 0x4bda, 0x4c24, 0x4c13, 0x4c6f, 0x4c00, 0x4c99, 0x4c09, 0x4bcf, 0x4c41, 0x4d5c, 0x4bda, 0x4c3a, 0x4c0a, 0x4bc0, 0x4c91, 0x4b8b, 0x4c39, 0x4c6e, 0x4d04, 0x4c7a, 0x4c91, 0x4c1a, 0x4c82, 0x4bbf, 0x4b87, 0x4ca8, 0x4b7d, 0x4ba3, 0x4bb9, 0x4b72, 0x4c23, 0x4c59, -0x4c7f, 0x4cab, 0x4c53, 0x4cc4, 0x4d12, 0x4c6d, 0x4af5, 0x4c5a, 0x4d28, 0x4d07, 0x4c26, 0x4cd4, 0x4c47, 0x4c4c, 0x4c5f, 0x4b69, 0x4d4d, 0x4c5b, 0x4d1e, 0x4c29, 0x4c87, 0x4c3a, 0x4bfb, 0x4c39, 0x4d20, 0x4cc2, 0x4ca3, 0x4c7a, 0x4c1f, 0x4ce0, 0x4c85, 0x4cb0, 0x4c1e, 0x4c68, 0x4c7e, 0x4c30, 0x4cb4, 0x4d23, 0x4c26, 0x4c82, 0x4cf1, 0x4db4, 0x4c44, 0x4d2f, 0x4c39, 0x4c0a, 0x4d46, 0x4c0c, 0x4cc7, 0x4d12, 0x4d54, 0x4cf6, 0x4d24, 0x4c69, 0x4cdd, 0x4c64, 0x4c0f, 0x4cad, 0x4c27, 0x4c58, 0x4c07, 0x4c51, 0x4c7f, 0x4d01, -0x4c7d, 0x4c0d, 0x4ad0, 0x4c77, 0x4c8b, 0x4bfb, 0x4a84, 0x4c80, 0x4cad, 0x4c55, 0x4bad, 0x4cd2, 0x4c49, 0x4c57, 0x4bc6, 0x4b48, 0x4ca5, 0x4c1f, 0x4cd2, 0x4c44, 0x4c4b, 0x4bd1, 0x4ba0, 0x4c43, 0x4ce2, 0x4c7e, 0x4c89, 0x4ca1, 0x4b88, 0x4c5c, 0x4cac, 0x4c68, 0x4c14, 0x4be2, 0x4c47, 0x4c33, 0x4c2c, 0x4c6d, 0x4c52, 0x4c43, 0x4c4e, 0x4d12, 0x4b6d, 0x4cdb, 0x4c40, 0x4c14, 0x4cf1, 0x4b4b, 0x4c63, 0x4cb5, 0x4cd1, 0x4d05, 0x4c9e, 0x4c78, 0x4c66, 0x4c14, 0x4c29, 0x4c63, 0x4be1, 0x4c36, 0x4b2b, 0x4c52, 0x4ca2, 0x4ca6, -0x4c9a, 0x4cc7, 0x4c36, 0x4cd8, 0x4d35, 0x4c67, 0x4a38, 0x4cde, 0x4d26, 0x4ca5, 0x4c0c, 0x4d5d, 0x4caa, 0x4c8e, 0x4c7f, 0x4c8b, 0x4d45, 0x4d02, 0x4d52, 0x4c64, 0x4ccc, 0x4c2d, 0x4c2e, 0x4cdd, 0x4d60, 0x4cfc, 0x4d14, 0x4cc9, 0x4c21, 0x4cdf, 0x4ca2, 0x4ca0, 0x4c2a, 0x4c6f, 0x4c85, 0x4cad, 0x4c6a, 0x4d0f, 0x4c58, 0x4c7f, 0x4ca9, 0x4d8d, 0x4b51, 0x4d13, 0x4c67, 0x4cb8, 0x4d37, 0x4c38, 0x4cb0, 0x4d15, 0x4d42, 0x4cd3, 0x4ce7, 0x4cc1, 0x4ce5, 0x4c4c, 0x4c74, 0x4d05, 0x4c48, 0x4c8f, 0x4c59, 0x4ca6, 0x4cc0, 0x4cac, -0x4bd9, 0x4b7e, 0x4a67, 0x4b28, 0x4b8b, 0x4ba1, 0x49fc, 0x4ad3, 0x4b8d, 0x4c0c, 0x4a84, 0x4c0f, 0x4b3c, 0x4bac, 0x4b55, 0x4a6a, 0x4c42, 0x4b5f, 0x4c3b, 0x4ac3, 0x4b80, 0x4b0e, 0x4af9, 0x4b0f, 0x4b95, 0x4b7e, 0x4be9, 0x4bcc, 0x4b5d, 0x4b2b, 0x4b26, 0x4b6a, 0x4b16, 0x4acb, 0x4ba4, 0x4b34, 0x4ae2, 0x4b9f, 0x4af8, 0x4b1d, 0x4acb, 0x4caa, 0x4a81, 0x4bbe, 0x4b65, 0x4b81, 0x4c69, 0x4a79, 0x4bd7, 0x4c19, 0x4c41, 0x4b6e, 0x4bf7, 0x4bb1, 0x4bea, 0x4aca, 0x4b60, 0x4be6, 0x4a71, 0x4b95, 0x4adc, 0x4b8e, 0x4afd, 0x4b94, -0x4c8d, 0x4c76, 0x4b15, 0x4c6b, 0x4c99, 0x4c0f, 0x4a05, 0x4c3f, 0x4cab, 0x4cc3, 0x4bcf, 0x4c5c, 0x4c81, 0x4c52, 0x4c03, 0x4b4c, 0x4d20, 0x4c68, 0x4c9a, 0x4c3c, 0x4c24, 0x4c14, 0x4b75, 0x4c5f, 0x4cd2, 0x4c97, 0x4c36, 0x4c60, 0x4b85, 0x4c19, 0x4c1d, 0x4c7e, 0x4be7, 0x4c04, 0x4c58, 0x4c12, 0x4c0a, 0x4cbe, 0x4bd1, 0x4b95, 0x4c74, 0x4d34, 0x4c02, 0x4ce6, 0x4be0, 0x4c41, 0x4cdb, 0x4b4f, 0x4c8e, 0x4c8d, 0x4d0a, 0x4cd4, 0x4c64, 0x4c33, 0x4cba, 0x4c43, 0x4beb, 0x4c93, 0x4c1e, 0x4beb, 0x4be0, 0x4c40, 0x4baf, 0x4c6f, -0x4b7f, 0x4b14, 0x4a7c, 0x4b88, 0x4bc6, 0x4b54, 0x4964, 0x4aeb, 0x4c1a, 0x4be7, 0x4a33, 0x4bc5, 0x4b2b, 0x4b4a, 0x4af0, 0x4a55, 0x4be7, 0x4bd5, 0x4be6, 0x4c08, 0x4b08, 0x4a6b, 0x4a81, 0x4a71, 0x4bff, 0x4ba8, 0x4b4e, 0x4b93, 0x4a17, 0x4ba2, 0x4baf, 0x4a90, 0x4b43, 0x4b04, 0x4b7e, 0x4ac7, 0x4b2b, 0x4c15, 0x4ac3, 0x4b3d, 0x4b42, 0x4ca4, 0x49bc, 0x4b19, 0x4a5c, 0x4b46, 0x4c01, 0x4a9b, 0x4b62, 0x4b55, 0x4c1a, 0x4b3b, 0x4c54, 0x4ae7, 0x4b00, 0x4a14, 0x4ac8, 0x4bb3, 0x4b08, 0x4ada, 0x4a7b, 0x4ae5, 0x4b0c, 0x4b3f, -0x4cc5, 0x4c4c, 0x4b88, 0x4c0f, 0x4c9b, 0x4c2f, 0x4a72, 0x4c7a, 0x4cb5, 0x4ccb, 0x4bd6, 0x4c8f, 0x4c35, 0x4c55, 0x4c32, 0x4b73, 0x4cca, 0x4c07, 0x4cb4, 0x4c16, 0x4c5b, 0x4bef, 0x4c0f, 0x4c26, 0x4ca6, 0x4c82, 0x4c61, 0x4ca0, 0x4b9b, 0x4c59, 0x4c48, 0x4c75, 0x4bbb, 0x4c5c, 0x4c37, 0x4c4d, 0x4c44, 0x4c86, 0x4c19, 0x4c21, 0x4c92, 0x4d75, 0x4b6b, 0x4cdc, 0x4c13, 0x4c33, 0x4cd1, 0x4bfa, 0x4c50, 0x4cb2, 0x4d5d, 0x4ca9, 0x4cbb, 0x4c4d, 0x4c9c, 0x4bed, 0x4c1c, 0x4c31, 0x4c39, 0x4c30, 0x4bce, 0x4c04, 0x4c4a, 0x4c89, -0x4c59, 0x4c4b, 0x4b30, 0x4c87, 0x4c90, 0x4c16, 0x4b3e, 0x4c06, 0x4c88, 0x4c59, 0x4bf7, 0x4c8e, 0x4c8f, 0x4c41, 0x4c25, 0x4ba7, 0x4ce4, 0x4c7e, 0x4cb4, 0x4c07, 0x4c45, 0x4bbe, 0x4c24, 0x4c44, 0x4cb6, 0x4c49, 0x4cc1, 0x4cc7, 0x4c12, 0x4c49, 0x4c50, 0x4c5d, 0x4c1a, 0x4c3c, 0x4c8c, 0x4c56, 0x4c31, 0x4cc1, 0x4c0e, 0x4c3b, 0x4c2b, 0x4d2f, 0x4ba4, 0x4c89, 0x4c30, 0x4c2b, 0x4ceb, 0x4b50, 0x4c41, 0x4c9f, 0x4cd6, 0x4c9a, 0x4c94, 0x4c72, 0x4d01, 0x4c1f, 0x4c15, 0x4c86, 0x4c04, 0x4c42, 0x4bca, 0x4c58, 0x4c52, 0x4ca6, -0x4bad, 0x4c2f, 0x4a38, 0x4b63, 0x4c1b, 0x4b03, 0x4930, 0x4c25, 0x4c25, 0x4c46, 0x4b1f, 0x4b4c, 0x4bce, 0x4b74, 0x4b65, 0x4b26, 0x4c24, 0x4bdf, 0x4c24, 0x4b99, 0x4bc4, 0x4b67, 0x4aff, 0x4b41, 0x4c86, 0x4c37, 0x4bbb, 0x4bf2, 0x4aa3, 0x4b25, 0x4b24, 0x4be7, 0x4acd, 0x4af8, 0x4b17, 0x4b22, 0x4b5a, 0x4c47, 0x4ab0, 0x4b10, 0x4bf6, 0x4c9b, 0x4ab1, 0x4c39, 0x4b19, 0x4b3c, 0x4b98, 0x4ad9, 0x4c04, 0x4c11, 0x4c50, 0x4c2e, 0x4c2c, 0x4b7e, 0x4c11, 0x4af9, 0x4b45, 0x4c27, 0x4abe, 0x4b4a, 0x4b35, 0x4b24, 0x4aa3, 0x4bf2, -0x4c30, 0x4c79, 0x4a55, 0x4c6b, 0x4c11, 0x4bf3, 0x4a9f, 0x4bfe, 0x4c33, 0x4c58, 0x4bff, 0x4c10, 0x4c77, 0x4c28, 0x4ba0, 0x4ad7, 0x4c96, 0x4c78, 0x4cae, 0x4c03, 0x4c27, 0x4c04, 0x4b94, 0x4c08, 0x4ccd, 0x4c80, 0x4c16, 0x4c43, 0x4b3c, 0x4bd6, 0x4bd5, 0x4c3d, 0x4ba6, 0x4c09, 0x4c41, 0x4c57, 0x4ba5, 0x4c85, 0x4c1d, 0x4be7, 0x4c41, 0x4d0b, 0x4ba5, 0x4c52, 0x4c0b, 0x4b6c, 0x4c64, 0x4b3a, 0x4c45, 0x4c4a, 0x4ca0, 0x4c68, 0x4c67, 0x4bc0, 0x4c7a, 0x4b4c, 0x4bb4, 0x4c59, 0x4be0, 0x4c25, 0x4bb8, 0x4bbd, 0x4b7b, 0x4c35, -0x4c69, 0x4c2e, 0x4b2a, 0x4c14, 0x4ce5, 0x4c4d, 0x4adb, 0x4c80, 0x4ccd, 0x4c9e, 0x4bc4, 0x4cc6, 0x4c57, 0x4c12, 0x4c23, 0x4b74, 0x4ca7, 0x4c76, 0x4cc1, 0x4c47, 0x4c74, 0x4bbf, 0x4c15, 0x4c22, 0x4ced, 0x4c52, 0x4c7e, 0x4cde, 0x4bf0, 0x4c82, 0x4c62, 0x4c93, 0x4c05, 0x4bf8, 0x4c6c, 0x4ca0, 0x4c5d, 0x4cb4, 0x4bed, 0x4c15, 0x4cbc, 0x4d32, 0x4c0b, 0x4c85, 0x4c4e, 0x4bf7, 0x4cb3, 0x4b8c, 0x4c46, 0x4c5b, 0x4cea, 0x4ca2, 0x4c97, 0x4c97, 0x4c9c, 0x4c03, 0x4bda, 0x4c94, 0x4c28, 0x4c2a, 0x4be1, 0x4bfd, 0x4c3d, 0x4c5d, -0x4ba8, 0x4c7b, 0x4a76, 0x4bfa, 0x4c02, 0x4b0e, 0x4a09, 0x4ae7, 0x4c0e, 0x4bdc, 0x4b37, 0x4bb4, 0x4c0c, 0x4b48, 0x4b2b, 0x4ad0, 0x4bd1, 0x4b9c, 0x4c3c, 0x4b17, 0x4ba1, 0x4b30, 0x4a92, 0x4aab, 0x4c43, 0x4c15, 0x4c15, 0x4c1d, 0x4b18, 0x4c02, 0x4b05, 0x4b6f, 0x4b31, 0x4b0c, 0x4b52, 0x4b55, 0x4b08, 0x4c13, 0x4bc7, 0x4b21, 0x4b98, 0x4c9d, 0x4afd, 0x4b6e, 0x4b99, 0x4ad8, 0x4be2, 0x4adb, 0x4b58, 0x4bfa, 0x4c3c, 0x4be7, 0x4c2d, 0x4b53, 0x4bad, 0x4b3e, 0x4b3f, 0x4c44, 0x4a62, 0x4ad3, 0x4ae2, 0x4b0e, 0x4b30, 0x4b7b, -0x4c75, 0x4ce3, 0x4b19, 0x4c95, 0x4c9f, 0x4c64, 0x4a1f, 0x4c26, 0x4c83, 0x4cde, 0x4b9b, 0x4c76, 0x4c7b, 0x4c43, 0x4c3b, 0x4b8c, 0x4c85, 0x4c86, 0x4cb5, 0x4c17, 0x4c57, 0x4bb5, 0x4c55, 0x4c1c, 0x4d16, 0x4cc4, 0x4c79, 0x4c90, 0x4b36, 0x4c2e, 0x4c4a, 0x4c46, 0x4bb8, 0x4c1a, 0x4c5b, 0x4c4c, 0x4c49, 0x4c5b, 0x4c2a, 0x4c27, 0x4c82, 0x4d49, 0x4b56, 0x4c97, 0x4c2d, 0x4c26, 0x4c8e, 0x4c09, 0x4c60, 0x4cb1, 0x4cfa, 0x4ca3, 0x4cb0, 0x4c2e, 0x4ccb, 0x4c1a, 0x4c6d, 0x4cb0, 0x4c13, 0x4c83, 0x4c10, 0x4c39, 0x4c1b, 0x4c37, -0x4c0a, 0x4c6c, 0x4b56, 0x4c53, 0x4c51, 0x4c1e, 0x49e4, 0x4c78, 0x4c73, 0x4c8a, 0x4ba3, 0x4ccd, 0x4c3f, 0x4ba0, 0x4b87, 0x4b8a, 0x4c98, 0x4c23, 0x4cd9, 0x4c0b, 0x4c42, 0x4b68, 0x4b48, 0x4be4, 0x4ce7, 0x4c9a, 0x4c38, 0x4c42, 0x4baf, 0x4c3a, 0x4bf1, 0x4c51, 0x4b86, 0x4bda, 0x4c8f, 0x4c27, 0x4c27, 0x4c57, 0x4c13, 0x4c0a, 0x4c3d, 0x4d19, 0x4b44, 0x4d05, 0x4c5c, 0x4c18, 0x4c7e, 0x4b4c, 0x4c25, 0x4c75, 0x4cf6, 0x4cc5, 0x4c9a, 0x4c4a, 0x4cb0, 0x4bc1, 0x4c14, 0x4c5f, 0x4b8f, 0x4c2d, 0x4c04, 0x4c4e, 0x4b8c, 0x4c0f, -0x4c76, 0x4c53, 0x4b25, 0x4c28, 0x4c75, 0x4c1d, 0x4abd, 0x4c7a, 0x4c7e, 0x4cf3, 0x4b96, 0x4c53, 0x4c44, 0x4c5f, 0x4c2b, 0x4b34, 0x4cf8, 0x4c6f, 0x4cec, 0x4c3a, 0x4c39, 0x4c50, 0x4ba4, 0x4c05, 0x4cbf, 0x4c84, 0x4c34, 0x4c5d, 0x4ba4, 0x4c4e, 0x4c94, 0x4c5b, 0x4c04, 0x4bf0, 0x4c38, 0x4c36, 0x4c36, 0x4cde, 0x4be9, 0x4bca, 0x4c42, 0x4d44, 0x4bad, 0x4cd9, 0x4c74, 0x4c0f, 0x4ca4, 0x4b5e, 0x4c87, 0x4c42, 0x4cda, 0x4ca6, 0x4c91, 0x4c35, 0x4cb5, 0x4bbb, 0x4c04, 0x4c77, 0x4ba0, 0x4c27, 0x4bc0, 0x4c54, 0x4c31, 0x4c5b, -0x4c30, 0x4bce, 0x4ae2, 0x4c33, 0x4c53, 0x4c23, 0x4a1b, 0x4bf2, 0x4c5e, 0x4c1a, 0x4afc, 0x4c15, 0x4b22, 0x4c08, 0x4bbd, 0x4b54, 0x4c6f, 0x4c27, 0x4c7e, 0x4c03, 0x4bd9, 0x4b56, 0x4b7a, 0x4b74, 0x4c62, 0x4c1f, 0x4b91, 0x4c17, 0x4ae5, 0x4bda, 0x4b7d, 0x4b35, 0x4ae5, 0x4b12, 0x4bd5, 0x4c31, 0x4b9a, 0x4c54, 0x4be5, 0x4c09, 0x4c21, 0x4cc8, 0x4b6d, 0x4c57, 0x4b1f, 0x4b41, 0x4c4d, 0x4af8, 0x4be6, 0x4c35, 0x4cb9, 0x4c4b, 0x4cb3, 0x4ba5, 0x4bfb, 0x4ae1, 0x4b2a, 0x4c2f, 0x4b51, 0x4b95, 0x4ac3, 0x4ba8, 0x4c24, 0x4c1c, -0x4cd6, 0x4ccf, 0x4ba7, 0x4cc8, 0x4cbd, 0x4c5f, 0x4bda, 0x4cde, 0x4cf4, 0x4d04, 0x4c01, 0x4c8b, 0x4c75, 0x4cb2, 0x4c2d, 0x4bc0, 0x4cd8, 0x4c8f, 0x4d28, 0x4cd9, 0x4cd0, 0x4c97, 0x4c09, 0x4c6e, 0x4d1c, 0x4caa, 0x4cc1, 0x4d2f, 0x4be9, 0x4c8a, 0x4d14, 0x4c7f, 0x4caf, 0x4c6b, 0x4c83, 0x4c67, 0x4c95, 0x4d25, 0x4c41, 0x4c65, 0x4d1b, 0x4d9a, 0x4c50, 0x4d19, 0x4c81, 0x4c4d, 0x4d1d, 0x4c27, 0x4cde, 0x4ceb, 0x4d6b, 0x4cd0, 0x4d2b, 0x4c4a, 0x4cae, 0x4c28, 0x4c4f, 0x4ca2, 0x4c5a, 0x4c6f, 0x4c60, 0x4c98, 0x4c24, 0x4ca0, -0x4b49, 0x4c05, 0x4b1b, 0x4c51, 0x4c15, 0x4b75, 0x4a6a, 0x4c6d, 0x4c4c, 0x4c61, 0x4bee, 0x4c8a, 0x4bd0, 0x4b75, 0x4bae, 0x4b4a, 0x4c6a, 0x4c30, 0x4c54, 0x4c08, 0x4c0b, 0x4bef, 0x4a91, 0x4c04, 0x4c86, 0x4c79, 0x4c1d, 0x4c51, 0x4b68, 0x4bc7, 0x4bc7, 0x4c21, 0x4bf1, 0x4b9c, 0x4bb9, 0x4c0b, 0x4ae9, 0x4cb9, 0x4b27, 0x4b8f, 0x4bc0, 0x4cb3, 0x4b7b, 0x4c48, 0x4bcf, 0x4c0c, 0x4c95, 0x4ab0, 0x4b91, 0x4c4d, 0x4c87, 0x4caf, 0x4c0f, 0x4bac, 0x4c11, 0x4afd, 0x4b89, 0x4c3e, 0x4b20, 0x4ae6, 0x4b35, 0x4b71, 0x4be8, 0x4c18, -0x4c1a, 0x4cd2, 0x4ba4, 0x4c99, 0x4c4e, 0x4c15, 0x4b33, 0x4c8e, 0x4cd4, 0x4ca0, 0x4bda, 0x4d15, 0x4c59, 0x4bf2, 0x4c1b, 0x4b86, 0x4cf7, 0x4c6a, 0x4d03, 0x4c38, 0x4c65, 0x4bb6, 0x4bd0, 0x4c40, 0x4cca, 0x4c85, 0x4c6b, 0x4d01, 0x4c09, 0x4c4e, 0x4c59, 0x4c82, 0x4c49, 0x4c11, 0x4cad, 0x4c20, 0x4c14, 0x4cd7, 0x4c33, 0x4c50, 0x4c0e, 0x4d79, 0x4c1b, 0x4ce7, 0x4c76, 0x4ccc, 0x4cf0, 0x4b68, 0x4c80, 0x4c7f, 0x4cf1, 0x4cca, 0x4caa, 0x4c21, 0x4cb1, 0x4b7c, 0x4c28, 0x4c61, 0x4bd7, 0x4c56, 0x4c0f, 0x4c42, 0x4c94, 0x4ca6, -0x4b6d, 0x4b1a, 0x4990, 0x4ac2, 0x4bdb, 0x4bea, 0x499a, 0x4b3e, 0x4b88, 0x4bb9, 0x4a19, 0x4ba8, 0x4b5e, 0x4adf, 0x4afd, 0x4a4f, 0x4ba2, 0x4b64, 0x4b09, 0x4b50, 0x4b34, 0x4a4c, 0x4afd, 0x4a9d, 0x4c14, 0x4ad3, 0x4bda, 0x4b4a, 0x4a3a, 0x4a78, 0x4b63, 0x4bab, 0x4b62, 0x4a75, 0x4aec, 0x4b91, 0x4abd, 0x4b69, 0x4a47, 0x4aa6, 0x4b4b, 0x4c7f, 0x49eb, 0x4b5e, 0x4b0c, 0x4ac7, 0x4c42, 0x4a78, 0x4c0b, 0x4ba1, 0x4b57, 0x4b78, 0x4c2a, 0x4b1f, 0x4b98, 0x4ab2, 0x4b7a, 0x4b0d, 0x4a3f, 0x4a9f, 0x4a48, 0x4a75, 0x4a82, 0x4af8, -0x4b91, 0x4c2a, 0x4a64, 0x4bd8, 0x4c08, 0x4bbe, 0x4ab4, 0x4bd0, 0x4bbd, 0x4c6a, 0x4a67, 0x4be9, 0x4b65, 0x4bc2, 0x4b5b, 0x4a23, 0x4c24, 0x4bf2, 0x4c60, 0x4bc9, 0x4bc0, 0x4b86, 0x4b15, 0x4b30, 0x4ca2, 0x4c32, 0x4ba5, 0x4be0, 0x4b31, 0x4bf1, 0x4b86, 0x4bdd, 0x4be4, 0x4af9, 0x4b91, 0x4bc0, 0x4b24, 0x4c56, 0x4adf, 0x4abe, 0x4be9, 0x4ca8, 0x4b88, 0x4c23, 0x4b9d, 0x4bd0, 0x4c1e, 0x4aa9, 0x4bc0, 0x4c09, 0x4c90, 0x4c25, 0x4c08, 0x4bc6, 0x4bc9, 0x4b4f, 0x4b83, 0x4c23, 0x4a72, 0x4b55, 0x4aea, 0x4ac6, 0x4b43, 0x4bb7, -0x4c43, 0x4c26, 0x4ada, 0x4c21, 0x4c97, 0x4b64, 0x4a4e, 0x4c18, 0x4c3e, 0x4c53, 0x4b9c, 0x4c30, 0x4c1c, 0x4b24, 0x4b7f, 0x4afa, 0x4cc0, 0x4bba, 0x4c72, 0x4b76, 0x4bb3, 0x4bd0, 0x4b63, 0x4c32, 0x4c95, 0x4c3f, 0x4c31, 0x4c41, 0x4b83, 0x4be3, 0x4bba, 0x4bff, 0x4b8d, 0x4b41, 0x4b4c, 0x4b8c, 0x4b16, 0x4c74, 0x4c06, 0x4b8d, 0x4bcf, 0x4c81, 0x4b9d, 0x4c93, 0x4bc9, 0x4c56, 0x4c7c, 0x4b5e, 0x4bbd, 0x4c98, 0x4cb7, 0x4c3b, 0x4c5e, 0x4ba5, 0x4be0, 0x4b54, 0x4b8a, 0x4c85, 0x4b7c, 0x4b46, 0x4b94, 0x4ae4, 0x4b18, 0x4c27, -0x4b16, 0x4b8c, 0x4a3d, 0x4b88, 0x4c1b, 0x4b0f, 0x4a04, 0x4abe, 0x4c23, 0x4ba3, 0x4a4a, 0x4b38, 0x4b73, 0x4aef, 0x4adf, 0x4a2d, 0x4c1c, 0x4b44, 0x4bc8, 0x4b0b, 0x4b84, 0x4aef, 0x4b71, 0x4ad4, 0x4c11, 0x4b8b, 0x4ac7, 0x4afa, 0x4a97, 0x4b84, 0x4be4, 0x4b82, 0x4b31, 0x4b42, 0x4a9e, 0x4b09, 0x4a65, 0x4be0, 0x4b05, 0x4adb, 0x4bdd, 0x4c0e, 0x4a93, 0x4afd, 0x4a97, 0x4aec, 0x4bbb, 0x4a07, 0x4b17, 0x4ba0, 0x4bf7, 0x4bf1, 0x4b74, 0x4a9e, 0x4b2d, 0x4a79, 0x4b54, 0x4b2d, 0x4a8f, 0x4baa, 0x4a98, 0x4a1e, 0x4b65, 0x4b36, -0x4c55, 0x4c88, 0x4b65, 0x4c62, 0x4ccb, 0x4c38, 0x4b3e, 0x4c1a, 0x4c8f, 0x4cc3, 0x4c34, 0x4cbb, 0x4c76, 0x4be2, 0x4c2c, 0x4bb6, 0x4cf6, 0x4c80, 0x4ccc, 0x4c01, 0x4c86, 0x4c10, 0x4c22, 0x4c10, 0x4d00, 0x4c6e, 0x4c64, 0x4ca2, 0x4be9, 0x4c84, 0x4c3b, 0x4c53, 0x4c26, 0x4bfa, 0x4c62, 0x4c4b, 0x4c6a, 0x4cda, 0x4c5e, 0x4c2d, 0x4c8c, 0x4d3e, 0x4c32, 0x4cc0, 0x4c1e, 0x4c0c, 0x4c8b, 0x4b12, 0x4c35, 0x4c7a, 0x4d08, 0x4cb9, 0x4ced, 0x4c57, 0x4c9f, 0x4c2e, 0x4c18, 0x4c57, 0x4bb1, 0x4c67, 0x4bc1, 0x4c65, 0x4c26, 0x4c31, -0x4c48, 0x4c26, 0x4ae0, 0x4c9f, 0x4c72, 0x4c17, 0x4a1a, 0x4c03, 0x4c61, 0x4c7a, 0x4c00, 0x4cc2, 0x4c46, 0x4c0d, 0x4c38, 0x4b5b, 0x4cf5, 0x4c73, 0x4c8d, 0x4c3a, 0x4c01, 0x4c06, 0x4c0b, 0x4c2c, 0x4c86, 0x4c6d, 0x4c8f, 0x4c8d, 0x4b68, 0x4c0e, 0x4c90, 0x4c42, 0x4c0e, 0x4c17, 0x4c1b, 0x4c33, 0x4c06, 0x4cbb, 0x4b81, 0x4be9, 0x4c50, 0x4d1b, 0x4b81, 0x4c7e, 0x4c07, 0x4c4a, 0x4cd6, 0x4ac0, 0x4c60, 0x4c67, 0x4ccd, 0x4c9a, 0x4cc5, 0x4c63, 0x4cb2, 0x4b77, 0x4c30, 0x4c6f, 0x4bd4, 0x4c1e, 0x4b90, 0x4bf8, 0x4c3a, 0x4c54, -0x4c89, 0x4c5e, 0x4c01, 0x4c71, 0x4c9e, 0x4c5c, 0x4afc, 0x4c5b, 0x4cc7, 0x4c91, 0x4c4c, 0x4cab, 0x4c5c, 0x4c40, 0x4c33, 0x4b58, 0x4cdc, 0x4cc6, 0x4cd4, 0x4bd6, 0x4c71, 0x4c57, 0x4bc1, 0x4c63, 0x4d69, 0x4cc1, 0x4c4c, 0x4ca6, 0x4bb5, 0x4c8f, 0x4cac, 0x4c57, 0x4c18, 0x4c1d, 0x4c8f, 0x4c27, 0x4c43, 0x4cf2, 0x4c47, 0x4c98, 0x4c2e, 0x4d72, 0x4c39, 0x4c7b, 0x4c5e, 0x4c15, 0x4d19, 0x4b4a, 0x4ccf, 0x4cc7, 0x4d42, 0x4d20, 0x4d0d, 0x4c31, 0x4cbe, 0x4c35, 0x4c34, 0x4c5e, 0x4b89, 0x4c1f, 0x4c26, 0x4c5b, 0x4ca6, 0x4c59 -}; From 2d602efe583446554f755ccb99e520976daca278 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 12 Feb 2026 15:01:50 +0100 Subject: [PATCH 28/67] [cmake] spatz_config: change ISA extension for CV32 to imcxgap9 --- cmake/spatz_config.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index a9558a37..f82a4702 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -48,7 +48,7 @@ set(SPATZ_MABI "-mabi=${SPATZ_ABI}${SPATZ_XABI}") # CV32 configuration options [MAGIA/Makefile] set(CV32_ARCH rv CACHE STRING "CV32 ARCH prefix (e.g. rv)") set(CV32_XLEN 32 CACHE STRING "CV32 XLEN (32 or 64)") -set(CV32_XTEN imfcxpulpv2 CACHE STRING "CV32 XTEN (ISA extensions)") +set(CV32_XTEN imcxgap9 CACHE STRING "CV32 XTEN (ISA extensions)") set(CV32_ABI ilp CACHE STRING "CV32 ABI prefix (e.g. ilp)") set(CV32_XABI f CACHE STRING "CV32 XABI (32, 32f, 32d)") set(CV32_MARCH "-march=${CV32_ARCH}${CV32_XLEN}${CV32_XTEN}") From aa0786ace912aca7f0a60e7b45fb826dcac22870 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:38:46 +0100 Subject: [PATCH 29/67] [tests/magia/mesh] CMakeLists: compile "amo" test only if target is magia_v1 --- tests/magia/mesh/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/magia/mesh/CMakeLists.txt b/tests/magia/mesh/CMakeLists.txt index a79569cd..33961bc1 100644 --- a/tests/magia/mesh/CMakeLists.txt +++ b/tests/magia/mesh/CMakeLists.txt @@ -27,4 +27,4 @@ if (TARGET_PLATFORM STREQUAL "magia_v1") add_subdirectory(amo_lock_global) add_subdirectory(amo_lock_row) add_subdirectory(amo_lock_column) -endif() \ No newline at end of file +endif() From 365e60446cfcd23622f59a1d935e2145a19deccf Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:08:55 +0100 Subject: [PATCH 30/67] [tests/spatz_on_magia] Add onnx add test --- tests/spatz_on_magia/CMakeLists.txt | 1 + tests/spatz_on_magia/onnx_add/CMakeLists.txt | 28 ++++++ .../onnx_add/include/onnx_add_mem_layout.h | 29 ++++++ .../onnx_add/include/onnx_add_params.h | 14 +++ tests/spatz_on_magia/onnx_add/main.c | 95 +++++++++++++++++++ .../onnx_add/spatz_task/onnx_add_task.c | 39 ++++++++ .../spatz_on_magia/onnx_add/test_data/data.h | 11 +++ .../onnx_add/test_data/generator.py | 76 +++++++++++++++ tests/utils/compare_utils.h | 35 +++++++ tests/utils/magia_tile_utils.h | 4 + 10 files changed, 332 insertions(+) create mode 100644 tests/spatz_on_magia/onnx_add/CMakeLists.txt create mode 100644 tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h create mode 100644 tests/spatz_on_magia/onnx_add/include/onnx_add_params.h create mode 100644 tests/spatz_on_magia/onnx_add/main.c create mode 100644 tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c create mode 100644 tests/spatz_on_magia/onnx_add/test_data/data.h create mode 100644 tests/spatz_on_magia/onnx_add/test_data/generator.py create mode 100644 tests/utils/compare_utils.h diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt index 54ed0f9c..79901f2d 100644 --- a/tests/spatz_on_magia/CMakeLists.txt +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(double_task) add_subdirectory(hello_spatz) +add_subdirectory(onnx_add) diff --git a/tests/spatz_on_magia/onnx_add/CMakeLists.txt b/tests/spatz_on_magia/onnx_add/CMakeLists.txt new file mode 100644 index 00000000..e72cbdd4 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/CMakeLists.txt @@ -0,0 +1,28 @@ +# Compile Spatz task +add_spatz_task( + TEST_NAME onnx_add + CRT0_SRC ${SPATZ_CRT0_SRC} + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/onnx_add_task.c + LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} + OUTPUT_DIR ${CMAKE_BINARY_DIR} + OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/onnx_add + OUTPUT_VAR ONNX_ADD_HEADER + FIRST_TASK_NAME onnx_add_task + INCLUDE_DIRS + ${CMAKE_SOURCE_DIR}/tests/utils + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +# Compile CV32 executable with embedded Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME onnx_add + SPATZ_HEADER ${ONNX_ADD_HEADER} + CRT0_SRC ${CV32_CRT0_SRC} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c + LINK_SCRIPT ${CV32_LINK_SCRIPT} + INCLUDE_DIRS + ${CMAKE_SOURCE_DIR}/tests/utils + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) diff --git a/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h b/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h new file mode 100644 index 00000000..ed92d0eb --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h @@ -0,0 +1,29 @@ +#ifndef ONNX_ADD_H_ +#define ONNX_ADD_H_ + +#include "data.h" +#include "magia_tile_utils.h" +#include "onnx_add_params.h" + +#define ALIGNMENT 4 +/* Aligns the given address to 4-byte */ +#define ALIGN_4B(addr) (((addr) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)) + +#define VEC_SIZE (LEN * sizeof(float16)) + +#define ONNX_ADD_PARAMS_BASE L1_BASE +#define ONNX_ADD_PARAMS_SIZE ALIGN_4B(sizeof(onnx_add_params_t)) + +#define SRC_A_BASE ALIGN_4B(ONNX_ADD_PARAMS_BASE + ONNX_ADD_PARAMS_SIZE) +#define SRC_A_SIZE ALIGN_4B(VEC_SIZE) + +#define SRC_B_BASE ALIGN_4B(SRC_A_BASE + SRC_A_SIZE) +#define SRC_B_SIZE ALIGN_4B(VEC_SIZE) + +#define RES_BASE ALIGN_4B(SRC_B_BASE + SRC_B_SIZE) +#define RES_SIZE ALIGN_4B(VEC_SIZE) + +#define EXP_BASE ALIGN_4B(RES_BASE + RES_SIZE) +#define EXP_SIZE ALIGN_4B(VEC_SIZE) + +#endif /* ONNX_ADD_H_ */ diff --git a/tests/spatz_on_magia/onnx_add/include/onnx_add_params.h b/tests/spatz_on_magia/onnx_add/include/onnx_add_params.h new file mode 100644 index 00000000..092011d9 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/include/onnx_add_params.h @@ -0,0 +1,14 @@ +#ifndef ONNX_ADD_PARAMS_H_ +#define ONNX_ADD_PARAMS_H_ + +#include + +typedef struct { + uintptr_t addr_res; + uintptr_t addr_exp; + uintptr_t addr_a; + uintptr_t addr_b; + uint32_t len; +} onnx_add_params_t; + +#endif /* ONNX_ADD_PARAMS_H_ */ diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c new file mode 100644 index 00000000..7a8770c5 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -0,0 +1,95 @@ +#include + +#include "compare_utils.h" +#include "data.h" +#include "event_unit_utils.h" +#include "onnx_add_mem_layout.h" +#include "onnx_add_params.h" +#include "onnx_add_task_bin.h" + +#include "magia_tile_utils.h" +#include "magia_spatz_utils.h" + +volatile onnx_add_params_t *params; + +static void init_data() +{ + uint32_t offset; + + for (int i = 0; i < LEN; i++) { + offset = i * sizeof(float16); + + mmio_fp16(EXP_BASE + offset) = expected[i]; + mmio_fp16(SRC_A_BASE + offset) = vec_a[i]; + mmio_fp16(SRC_B_BASE + offset) = vec_b[i]; + mmio_fp16(RES_BASE + offset) = 0; + } + + params = (volatile onnx_add_params_t *) ONNX_ADD_PARAMS_BASE; + params->addr_a = SRC_A_BASE; + params->addr_b = SRC_B_BASE; + params->addr_res = RES_BASE; + params->addr_exp = EXP_BASE; + params->len = LEN; +} + +static int run_spatz_task() +{ + int ret; + + eu_init(); + eu_enable_events(EU_SPATZ_DONE_MASK); + + spatz_init(SPATZ_BINARY_START); + spatz_run_task_with_params(ONNX_ADD_TASK, ONNX_ADD_PARAMS_BASE); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + ret = spatz_get_exit_code(); + + spatz_clk_dis(); + + return ret; +} + +static bool check_result() +{ + return vector_compare_fp16(params->addr_res, params->addr_exp, params->addr_exp); +} + +static bool run_test() +{ + int ret; + bool check; + + init_data(); + + ret = run_spatz_task(); + if (ret != 0) { + printf("[CV32] Spatz task FAILED with error: %d", ret); + return ret; + } + + check = check_result(); + if (check) { + printf("[CV32] Test SUCCESS\n"); + } else { + printf("[CV32 Test FAILED\n]"); + ret = -1; + } + + return ret; +} + +int main(void) +{ + int ret; + + printf("\n##################################### ONNX_ADD TEST #####################################\n\n"); + + ret = run_test(); + + printf("\n##########################################################################################\n\n"); + + return ret; +} diff --git a/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c b/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c new file mode 100644 index 00000000..1cc12f69 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c @@ -0,0 +1,39 @@ +#include "magia_spatz_utils.h" +#include "magia_tile_utils.h" +#include "onnx_add_params.h" + +int onnx_add_task(void) +{ + volatile onnx_add_params_t *params; + uintptr_t params_addr; + _Float16 *a; + _Float16 *b; + _Float16 *r; + size_t avl; + size_t vl; + + params_addr = mmio32(SPATZ_DATA); + params = (volatile onnx_add_params_t *) params_addr; + + r = (_Float16 *)params->addr_res; + a = (_Float16 *)params->addr_a; + b = (_Float16 *)params->addr_b; + avl = params->len; + + for (; avl > 0; avl -= vl) { + asm volatile ("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + asm volatile ("vle16.v v0, (%0)" :: "r"(a)); + asm volatile ("vle16.v v8, (%0)" :: "r"(b)); + + asm volatile ("vfadd.vv v16, v0, v8"); + + asm volatile ("vse16.v v16, (%0)" :: "r"(r)); + + a += vl; + b += vl; + r += vl; + } + + return 0; +} diff --git a/tests/spatz_on_magia/onnx_add/test_data/data.h b/tests/spatz_on_magia/onnx_add/test_data/data.h new file mode 100644 index 00000000..4a594b54 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/test_data/data.h @@ -0,0 +1,11 @@ +/* Automatically generated header file for Spatz ONNX testing */ +#ifndef DATA_H_ +#define DATA_H_ + +#define LEN 2048 + +static const float16 vec_a[] = { 6.394531f, -1.380859f, 0.033051f, 6.406250f, -13.734375f, 9.859375f, 6.269531f, 7.445312f, -11.257812f, 18.562500f, 7.257812f, -4.527344f, 0.936523f, -1.662109f, -1.446289f, 4.531250f, -2.275391f, 3.376953f, -13.914062f, -0.663086f, -3.861328f, -0.914551f, 1.480469f, -9.226562f, 16.859375f, -18.625000f, 7.875000f, -6.867188f, 11.375000f, -5.449219f, 13.148438f, 1.892578f, -5.996094f, 6.878906f, 4.578125f, 5.500000f, 5.921875f, -24.296875f, -17.000000f, -6.375000f, -5.367188f, -16.406250f, 0.163818f, 5.195312f, 2.908203f, -15.929688f, 11.640625f, 12.617188f, -0.734863f, 12.078125f, -1.381836f, 14.695312f, -8.765625f, -7.078125f, 14.437500f, 0.951172f, -24.359375f, 2.542969f, 7.730469f, -7.125000f, 1.527344f, 4.257812f, -7.984375f, 11.843750f, -11.531250f, -2.050781f, -3.617188f, 9.820312f, -5.773438f, -3.136719f, 9.703125f, 0.753906f, -0.846191f, 9.257812f, 10.921875f, 3.275391f, 14.460938f, -4.425781f, 8.648438f, 1.785156f, 8.945312f, 11.296875f, -0.432129f, 3.031250f, -4.062500f, 14.265625f, -8.648438f, 6.136719f, -0.057861f, -2.785156f, -8.843750f, -22.625000f, -18.546875f, 7.558594f, 24.515625f, 8.046875f, -15.273438f, -4.609375f, -11.929688f, -4.585938f, -17.718750f, 6.757812f, 8.109375f, 7.593750f, 4.945312f, -13.171875f, 23.484375f, -4.628906f, -3.496094f, -23.265625f, -8.242188f, -2.242188f, -14.757812f, 8.468750f, 4.976562f, -2.187500f, 5.890625f, -24.750000f, -3.460938f, 8.382812f, 16.031250f, -3.583984f, 1.125977f, 2.902344f, -1.394531f, 0.295410f, -5.324219f, 7.328125f, -8.937500f, 1.570312f, -14.445312f, -2.130859f, 5.960938f, -8.726562f, 15.031250f, -7.308594f, 4.679688f, 0.029556f, -16.000000f, -29.734375f, -1.335938f, -1.697266f, -4.148438f, 1.502930f, 1.097656f, -9.929688f, -4.750000f, -2.652344f, -1.518555f, 13.765625f, 0.490234f, -5.878906f, -10.507812f, -11.398438f, -8.140625f, 1.309570f, 0.595703f, 25.515625f, 9.187500f, -11.015625f, -15.210938f, -25.515625f, -15.742188f, 12.257812f, 13.367188f, -4.281250f, 18.375000f, 17.375000f, 2.736328f, 8.085938f, 6.707031f, 15.562500f, 10.609375f, -14.460938f, 0.987793f, -9.984375f, -11.000000f, -8.140625f, -7.804688f, -11.921875f, -12.585938f, 9.250000f, -9.875000f, -0.028061f, 23.531250f, -3.578125f, 9.875000f, 13.953125f, 15.585938f, 6.433594f, -8.195312f, 5.917969f, -0.217163f, -7.500000f, -11.718750f, 7.773438f, 11.515625f, -4.343750f, 13.570312f, -8.843750f, -6.562500f, -3.488281f, -20.640625f, 1.390625f, -2.710938f, -4.328125f, -10.000000f, 1.071289f, -12.007812f, -8.890625f, 9.500000f, -7.375000f, 1.040039f, -9.742188f, 0.516602f, 0.096619f, -6.171875f, 15.703125f, 0.775391f, 10.117188f, 0.175293f, 5.542969f, -4.992188f, -13.257812f, 23.062500f, 8.054688f, 3.244141f, -25.750000f, 6.468750f, 8.054688f, -9.054688f, 2.337891f, 8.648438f, 10.710938f, -3.425781f, -16.859375f, -1.219727f, 16.328125f, 7.042969f, 1.797852f, 2.546875f, -0.456299f, 7.406250f, -3.384766f, 4.929688f, -11.273438f, 30.578125f, 26.562500f, -8.460938f, -0.989746f, 9.937500f, -2.742188f, 8.109375f, -6.148438f, 5.015625f, 15.398438f, 21.984375f, -4.066406f, 10.515625f, 3.638672f, -5.902344f, 0.983887f, 5.746094f, -16.875000f, 1.205078f, -15.890625f, 6.644531f, -9.671875f, -13.382812f, 1.511719f, 9.593750f, 5.195312f, 4.960938f, 3.986328f, 3.005859f, -5.707031f, 11.023438f, 0.510742f, 6.960938f, 2.017578f, 3.750000f, -0.679688f, 4.570312f, 9.187500f, 16.906250f, 7.699219f, -12.718750f, 8.437500f, -11.031250f, 19.250000f, -10.312500f, -4.656250f, 0.197021f, -15.445312f, 6.847656f, 12.648438f, -11.234375f, -1.064453f, 2.669922f, -6.277344f, 0.580078f, -8.585938f, -3.894531f, -9.335938f, 7.480469f, 0.569824f, 14.210938f, 3.156250f, -3.578125f, 5.988281f, -6.125000f, 2.593750f, -0.386719f, -1.825195f, -4.937500f, -4.031250f, 10.468750f, -5.699219f, 0.343262f, 5.765625f, -5.796875f, 5.785156f, -7.265625f, -6.453125f, -1.804688f, 1.746094f, -3.457031f, 0.959961f, -9.398438f, -6.136719f, 19.437500f, -4.488281f, -6.074219f, 21.328125f, -4.777344f, -5.089844f, -6.906250f, 12.242188f, 5.339844f, 12.046875f, -4.417969f, -1.990234f, 17.312500f, -6.375000f, -0.398926f, -12.085938f, 20.093750f, -2.597656f, 23.296875f, 27.203125f, 1.286133f, -11.507812f, -6.402344f, -16.625000f, -1.542969f, -12.835938f, -3.986328f, 12.812500f, -11.375000f, 15.031250f, -6.750000f, -1.908203f, -4.953125f, 16.515625f, 0.504883f, 15.632812f, -0.101929f, -9.789062f, 7.046875f, 4.046875f, -11.203125f, -14.554688f, -4.582031f, -12.718750f, 15.351562f, 9.523438f, -17.812500f, 10.156250f, 12.437500f, 5.433594f, 13.156250f, -8.398438f, -10.070312f, 7.160156f, -6.675781f, 12.476562f, 6.906250f, -3.087891f, 8.750000f, -5.414062f, -23.031250f, -3.140625f, 6.410156f, -7.789062f, -4.207031f, 5.691406f, 7.156250f, 5.964844f, 0.657715f, 6.207031f, -1.045898f, -12.687500f, 10.289062f, -10.171875f, 0.721191f, -6.636719f, 10.992188f, 12.585938f, -6.968750f, -18.796875f, 3.451172f, -8.140625f, -6.917969f, 0.749512f, 8.460938f, -2.632812f, 9.140625f, 4.210938f, -4.246094f, 7.042969f, -6.207031f, -16.046875f, -8.742188f, -1.677734f, -15.000000f, 5.046875f, 9.523438f, 14.796875f, -7.613281f, 1.403320f, 3.244141f, -7.414062f, 4.527344f, -0.285400f, -0.999512f, -6.183594f, 15.242188f, -2.093750f, -2.384766f, 0.874512f, -17.312500f, -3.283203f, 19.546875f, 5.988281f, 7.097656f, -15.070312f, 17.046875f, -14.703125f, -3.468750f, 1.635742f, -7.789062f, 13.078125f, 0.293701f, 14.421875f, 8.187500f, 3.972656f, -3.830078f, -1.524414f, -4.664062f, 5.734375f, 17.718750f, -2.691406f, -8.476562f, -3.884766f, -1.282227f, -9.734375f, -4.941406f, 9.617188f, -2.148438f, -19.828125f, 0.918457f, -18.156250f, -0.033997f, -1.857422f, 25.171875f, -9.484375f, 9.015625f, -5.707031f, -2.789062f, -8.906250f, -2.771484f, 23.937500f, 6.398438f, 4.222656f, -1.660156f, 13.382812f, -5.199219f, -11.773438f, -10.742188f, -3.554688f, 13.117188f, 10.242188f, -5.996094f, -5.187500f, -0.305908f, 1.107422f, 8.265625f, -13.484375f, -1.452148f, -13.820312f, -4.765625f, -1.573242f, 3.314453f, -24.203125f, 10.656250f, -9.929688f, 11.351562f, 4.578125f, 1.315430f, -9.765625f, 7.117188f, -8.195312f, 20.187500f, -7.761719f, 6.093750f, 7.058594f, -3.119141f, -1.390625f, -0.371094f, 3.863281f, -6.035156f, -19.921875f, 14.421875f, 4.871094f, -4.195312f, 1.668945f, 7.191406f, -4.312500f, -3.480469f, 22.765625f, 16.687500f, 7.542969f, -11.476562f, -19.062500f, -17.031250f, -5.273438f, 1.240234f, -3.546875f, -2.425781f, 9.867188f, -4.039062f, 0.063171f, 15.093750f, 0.619629f, -8.593750f, 11.406250f, -12.476562f, -11.367188f, 2.779297f, -5.531250f, 19.609375f, 19.000000f, 1.332031f, -12.546875f, 4.421875f, 2.677734f, 12.132812f, -1.544922f, 4.367188f, 11.820312f, 10.468750f, 6.238281f, -5.113281f, 10.195312f, -7.035156f, -13.664062f, 7.386719f, -8.390625f, 0.609863f, 8.546875f, 0.967285f, -14.882812f, 1.910156f, 0.100525f, 1.100586f, -6.449219f, -15.796875f, -2.628906f, -0.846191f, 1.720703f, -6.527344f, 1.662109f, 6.855469f, -19.875000f, -6.484375f, -5.097656f, -4.128906f, 4.324219f, -2.316406f, -2.554688f, -3.957031f, 2.439453f, -5.859375f, 8.320312f, -2.845703f, -4.781250f, -7.746094f, -7.296875f, -5.777344f, -12.609375f, 8.992188f, -1.545898f, -2.296875f, -3.179688f, 4.769531f, -5.230469f, -0.399170f, -4.726562f, 7.679688f, -3.730469f, -11.210938f, -14.203125f, -10.257812f, -7.578125f, 13.476562f, -11.109375f, 11.781250f, 4.351562f, 5.164062f, 12.687500f, 3.572266f, 1.878906f, 10.570312f, 7.363281f, -15.328125f, -9.523438f, -6.988281f, -8.484375f, -4.351562f, -0.197998f, -6.171875f, 8.179688f, -8.617188f, -3.642578f, 9.992188f, -0.632812f, -5.046875f, -19.531250f, -8.343750f, -14.132812f, 9.210938f, 9.375000f, 6.195312f, 0.276855f, 16.578125f, -4.191406f, -14.843750f, -13.804688f, -6.992188f, -12.515625f, 9.968750f, 12.000000f, 3.099609f, -9.250000f, 3.080078f, 10.023438f, -1.319336f, -12.359375f, 9.812500f, -12.929688f, 1.218750f, -7.222656f, -7.714844f, -0.850098f, 6.917969f, -8.789062f, 3.292969f, 13.546875f, -6.308594f, 8.406250f, -0.420898f, 1.227539f, 3.572266f, 4.039062f, 8.414062f, -8.367188f, -1.160156f, -4.039062f, -2.769531f, 6.394531f, -11.437500f, -2.240234f, -1.453125f, 3.148438f, -7.800781f, 7.410156f, 13.960938f, -9.851562f, 9.687500f, -18.390625f, 9.398438f, 6.144531f, 14.515625f, 20.312500f, 18.062500f, 6.261719f, 13.515625f, 3.011719f, -21.968750f, -3.298828f, 11.890625f, 14.132812f, 4.738281f, 1.699219f, 12.523438f, -9.648438f, 16.843750f, 8.187500f, -6.953125f, 0.309326f, -2.486328f, 2.798828f, 1.089844f, 0.613281f, 13.750000f, -6.132812f, -12.351562f, 0.635742f, 7.140625f, -8.015625f, -1.620117f, 7.507812f, 1.698242f, -6.347656f, -13.578125f, 18.062500f, -11.984375f, 14.789062f, -7.695312f, -4.320312f, -15.671875f, -4.328125f, 8.062500f, -3.714844f, 1.667969f, -13.359375f, -3.050781f, -3.265625f, 27.843750f, -2.925781f, -3.367188f, 12.492188f, 2.423828f, 3.847656f, 4.234375f, -3.417969f, -1.850586f, -10.820312f, 9.875000f, -20.453125f, -17.500000f, 8.687500f, -0.216675f, 21.859375f, -7.808594f, 8.437500f, 10.937500f, -2.593750f, -0.985840f, -0.680176f, 11.187500f, 4.660156f, -5.632812f, -18.453125f, -0.446777f, -6.144531f, -10.609375f, -8.281250f, -21.281250f, -12.703125f, -15.304688f, 2.449219f, 8.625000f, 1.659180f, 11.296875f, -5.347656f, 2.361328f, -22.437500f, 9.585938f, -17.609375f, 4.914062f, -2.292969f, 13.101562f, 8.406250f, -13.312500f, -5.105469f, -2.445312f, 0.284424f, -9.343750f, -8.414062f, 6.304688f, 8.281250f, 10.414062f, 2.824219f, -12.140625f, -7.566406f, -10.562500f, -12.945312f, -11.632812f, 6.675781f, -15.257812f, 8.039062f, -9.445312f, 8.226562f, -1.281250f, -2.300781f, -11.890625f, 19.093750f, -1.015625f, -1.008789f, -2.259766f, 17.062500f, -0.434570f, -27.515625f, -6.269531f, 14.484375f, -13.578125f, 6.109375f, -4.472656f, 13.335938f, -12.492188f, -4.386719f, -3.449219f, 15.250000f, 3.761719f, 18.843750f, 5.667969f, -1.220703f, 12.757812f, 7.886719f, 6.800781f, -7.050781f, 3.582031f, 7.371094f, 10.015625f, 8.554688f, 12.835938f, 2.160156f, 5.785156f, -13.460938f, -10.414062f, -7.261719f, 0.899902f, -15.046875f, -4.273438f, 18.515625f, -5.570312f, 16.531250f, 1.872070f, -8.984375f, -7.687500f, 11.820312f, 10.164062f, 5.710938f, -3.259766f, -6.253906f, 3.880859f, -13.070312f, 5.796875f, -2.888672f, -18.343750f, -13.187500f, -5.203125f, -0.620605f, 1.786133f, 5.988281f, 21.250000f, -6.226562f, -1.081055f, 4.449219f, -9.351562f, 0.300293f, -1.865234f, -8.953125f, -5.445312f, 4.281250f, -0.047546f, 0.623535f, -18.843750f, 11.125000f, -2.191406f, -9.421875f, 1.700195f, -8.976562f, -6.167969f, 15.546875f, 0.184326f, 4.765625f, 10.695312f, 3.955078f, 6.996094f, -16.562500f, -11.476562f, 8.804688f, 6.472656f, 15.000000f, -5.246094f, 20.546875f, -0.576172f, -19.156250f, 13.968750f, -1.083008f, -16.984375f, 9.890625f, -0.235962f, -2.804688f, -11.062500f, -0.864258f, 9.421875f, -11.226562f, -5.421875f, 1.799805f, 13.953125f, 10.179688f, -12.664062f, 9.375000f, -2.578125f, 5.800781f, -4.238281f, -11.148438f, -2.564453f, 4.898438f, 12.976562f, 1.316406f, 15.789062f, -1.392578f, -3.789062f, 0.688477f, -13.648438f, -2.962891f, -8.078125f, -13.695312f, -6.488281f, 10.703125f, -18.406250f, 3.730469f, -5.132812f, -15.484375f, -14.429688f, 8.968750f, 1.581055f, 6.773438f, -2.707031f, 2.482422f, 0.613281f, -5.765625f, 2.482422f, 6.945312f, -0.509277f, 0.589355f, 2.595703f, -3.361328f, -1.528320f, -3.953125f, 7.531250f, -3.734375f, 24.265625f, 8.656250f, 10.304688f, -1.407227f, -7.351562f, -10.398438f, 9.437500f, -8.281250f, 7.308594f, -1.555664f, -10.375000f, 0.543457f, -15.703125f, -0.091003f, 0.926758f, -23.281250f, 19.609375f, 3.455078f, 5.632812f, 14.828125f, -11.046875f, 9.312500f, -0.034637f, -1.751953f, 0.197510f, 3.292969f, -6.964844f, 0.330322f, -19.171875f, -10.148438f, -13.234375f, 14.515625f, -4.058594f, -2.421875f, 13.484375f, 6.992188f, -13.390625f, 26.437500f, -9.687500f, 2.343750f, -0.951660f, -5.152344f, 9.890625f, -3.839844f, 4.628906f, 11.335938f, -7.390625f, -15.812500f, -8.835938f, 18.000000f, -21.687500f, -1.466797f, 4.906250f, 0.686523f, -15.125000f, 3.900391f, 1.581055f, -10.671875f, 0.851562f, 12.242188f, -5.906250f, 15.023438f, 6.269531f, 15.718750f, 0.282227f, -5.289062f, 3.042969f, -9.039062f, -3.910156f, 13.992188f, -17.906250f, -1.916992f, -5.441406f, -2.507812f, 8.570312f, -5.539062f, 3.417969f, -3.851562f, -2.064453f, 2.529297f, 20.109375f, -16.375000f, 15.921875f, 9.734375f, -1.242188f, -8.937500f, -4.558594f, 0.159790f, -2.265625f, 12.289062f, 5.925781f, -11.421875f, -2.748047f, 10.578125f, 3.292969f, -14.289062f, 5.871094f, -5.718750f, 4.609375f, -5.292969f, -2.865234f, 0.580566f, -16.078125f, 5.511719f, -2.351562f, 8.664062f, 19.500000f, -0.268799f, 5.832031f, -8.554688f, 4.199219f, -5.988281f, -11.460938f, 14.820312f, 7.089844f, -2.498047f, -14.953125f, 4.207031f, 8.562500f, 17.375000f, 16.765625f, -4.011719f, 10.367188f, -12.351562f, 13.765625f, -4.406250f, -1.874023f, -4.234375f, 2.298828f, -16.906250f, 14.437500f, -2.107422f, -13.421875f, -8.757812f, -1.018555f, 5.640625f, -10.648438f, 7.640625f, -14.234375f, 7.652344f, -5.312500f, -22.250000f, 14.789062f, 12.132812f, -13.218750f, -3.847656f, -8.968750f, -9.562500f, -1.368164f, 1.995117f, 9.765625f, -3.121094f, 6.929688f, 6.675781f, -7.324219f, -12.335938f, -12.859375f, -3.357422f, -21.125000f, -23.109375f, -9.656250f, 1.834961f, -6.539062f, 6.437500f, -11.390625f, 1.541016f, 18.109375f, 4.062500f, 14.742188f, -5.171875f, -0.352051f, 6.636719f, -5.554688f, -12.351562f, -7.140625f, -2.769531f, 8.593750f, 13.265625f, 9.695312f, -0.312744f, 3.761719f, -2.039062f, 17.421875f, 3.175781f, -1.450195f, 17.078125f, 0.227539f, 16.890625f, 31.953125f, 1.358398f, 13.500000f, -2.925781f, -1.355469f, 4.578125f, 8.492188f, -15.203125f, -6.671875f, -1.102539f, 6.113281f, 14.960938f, -11.531250f, 13.726562f, 3.769531f, -4.730469f, -13.812500f, 9.007812f, -5.203125f, -11.164062f, 9.789062f, -5.511719f, -3.802734f, -13.414062f, -2.794922f, 6.789062f, -2.884766f, 11.148438f, 12.906250f, 1.466797f, -8.335938f, 3.380859f, -6.511719f, -11.718750f, 8.156250f, -10.718750f, -23.156250f, 7.664062f, 1.902344f, 6.753906f, -5.953125f, -6.062500f, 10.085938f, 2.080078f, -0.894043f, -0.364746f, -0.056091f, 22.781250f, 12.101562f, 6.167969f, -1.478516f, 3.796875f, 4.066406f, -8.171875f, 24.890625f, 5.820312f, 9.984375f, -9.367188f, -3.775391f, 15.804688f, 5.171875f, -7.031250f, -9.039062f, 14.398438f, -24.750000f, 3.363281f, 11.234375f, -6.429688f, 12.929688f, -0.087036f, -0.532227f, -1.577148f, -5.156250f, 7.039062f, 9.414062f, -4.183594f, 0.413818f, -3.738281f, -2.341797f, -5.035156f, 8.546875f, -4.832031f, 2.542969f, -12.945312f, 12.718750f, 6.968750f, -6.546875f, 19.125000f, -5.597656f, 12.500000f, -3.904297f, 0.145386f, 4.343750f, -3.132812f, -7.007812f, -10.703125f, -8.945312f, -0.194214f, 8.156250f, 8.820312f, -6.511719f, 18.796875f, 9.242188f, 1.225586f, -5.214844f, 6.207031f, 15.562500f, 2.300781f, -7.152344f, -0.384033f, 2.673828f, -8.906250f, 5.457031f, 13.375000f, -12.515625f, -2.345703f, 8.296875f, 7.988281f, -3.806641f, 9.210938f, -12.812500f, -5.960938f, -9.828125f, -4.992188f, -1.688477f, -3.253906f, 2.742188f, 10.757812f, -6.015625f, -7.687500f, -15.492188f, -9.164062f, -0.221069f, -5.507812f, -8.117188f, -12.023438f, 30.984375f, -13.789062f, 0.152710f, -4.011719f, -2.265625f, -1.034180f, -1.359375f, 0.858398f, 5.000000f, 20.281250f, -11.593750f, 10.515625f, 0.565918f, -7.339844f, -12.640625f, -1.955078f, 0.746582f, 0.140503f, -8.148438f, 9.500000f, -17.781250f, -5.980469f, -7.097656f, 9.148438f, -9.281250f, 3.199219f, -4.667969f, 7.765625f, -0.014717f, 0.671875f, 6.875000f, -10.296875f, -9.562500f, -7.941406f, 0.910156f, -2.591797f, 1.506836f, 6.398438f, 5.277344f, -2.828125f, 11.890625f, 2.087891f, -13.609375f, 19.359375f, 4.406250f, 13.820312f, -6.171875f, -5.757812f, 11.343750f, -0.698730f, 1.055664f, 8.992188f, 2.195312f, 6.812500f, 9.046875f, 9.414062f, 10.609375f, 3.507812f, -7.882812f, 1.717773f, 9.687500f, 3.798828f, 6.355469f, -21.140625f, 0.019165f, 1.480469f, 6.230469f, 6.761719f, 5.527344f, 3.316406f, 9.265625f, 19.546875f, -0.415283f, -5.027344f, 21.890625f, -9.601562f, -7.027344f, 3.500000f, 12.585938f, 1.292969f, -7.382812f, -2.568359f, -19.187500f, 2.605469f, 1.473633f, 25.718750f, 6.257812f, 14.578125f, -13.906250f, 5.046875f, 8.640625f, -6.062500f, -5.355469f, 4.984375f, 2.701172f, -13.648438f, 3.833984f, 3.339844f, 8.796875f, 5.730469f, -2.386719f, 14.453125f, -0.343506f, 19.109375f, -8.093750f, -3.166016f, 7.156250f, 7.070312f, 1.387695f, 12.812500f, 6.789062f, 2.355469f, 1.478516f, -5.496094f, -16.328125f, -8.812500f, 13.562500f, 5.660156f, -16.671875f, 3.882812f, -2.058594f, 12.750000f, -12.812500f, 22.562500f, 28.437500f, 6.023438f, -10.867188f, -1.601562f, 11.937500f, 13.968750f, 4.335938f, -0.108276f, -6.730469f, -13.820312f, 1.097656f, -9.953125f, 8.609375f, -13.617188f, -3.929688f, -9.773438f, 17.875000f, 4.851562f, 18.468750f, 13.382812f, -11.023438f, 10.710938f, 6.828125f, -7.199219f, 22.500000f, 0.128296f, 5.726562f, -9.257812f, -29.328125f, -21.593750f, 9.460938f, -5.714844f, -8.328125f, 4.707031f, 11.031250f, 19.140625f, -5.921875f, -4.164062f, 14.343750f, -9.539062f, -7.101562f, -5.382812f, -7.031250f, 9.757812f, -13.226562f, -3.529297f, 10.015625f, -12.476562f, 1.734375f, 1.601562f, 5.332031f, -3.941406f, 3.576172f, -0.900879f, 12.835938f, 22.859375f, -10.781250f, 10.289062f, -13.992188f, 2.431641f, 0.093750f, 8.000000f, -36.375000f, 2.498047f, -6.730469f, -3.281250f, -2.820312f, 19.562500f, -6.015625f, 1.492188f, 1.810547f, 20.250000f, 13.343750f, -2.326172f, 15.648438f, -3.730469f, -13.484375f, 2.466797f, -9.468750f, 0.989258f, -7.683594f, -0.133423f, 0.840820f, 4.636719f, -10.031250f, 17.156250f, -1.267578f, -3.835938f, 6.417969f, 5.539062f, 11.710938f, -14.117188f, -3.625000f, 2.582031f, 2.255859f, -0.622559f, 6.234375f, 2.570312f, 6.242188f, -6.929688f, 5.945312f, -18.984375f, -0.716309f, -11.804688f, 11.429688f, 1.454102f, -16.187500f, -8.429688f, -1.072266f, -8.820312f, 9.945312f, 0.406494f, -9.007812f, -17.265625f, -19.984375f, 9.031250f, 25.000000f, 8.148438f, 6.148438f, -17.062500f, -10.367188f, 2.166016f, -11.804688f, -1.177734f, -8.632812f, -0.296387f, -6.039062f, -1.783203f, 9.710938f, 6.683594f, 5.867188f, 2.521484f, 24.187500f, -8.687500f, -15.328125f, -8.562500f, -0.498779f, -0.788574f, -5.953125f, 3.527344f, -8.343750f, -4.285156f, 7.933594f, 10.734375f, 9.382812f, -24.390625f, 4.367188f, -13.812500f, -7.070312f, -8.531250f, -7.125000f, -5.195312f, 20.656250f, -5.281250f, -8.500000f, -17.843750f, -7.289062f, 9.945312f, -7.601562f, 19.765625f, -15.703125f, -10.500000f, 10.593750f, 3.435547f, -12.765625f, -4.773438f, -0.403564f, 22.984375f, 0.539551f, 5.085938f, -5.718750f, -12.843750f, -26.500000f, -0.130615f, -24.656250f, 13.351562f, -21.484375f, 10.484375f, 13.109375f, 4.910156f, -9.562500f, -2.431641f, -12.140625f, -2.650391f, 12.898438f, 6.011719f, -6.726562f, 13.796875f, -26.046875f, -16.625000f, 11.109375f, 0.889160f, -0.392334f, 9.671875f, 18.046875f, -0.840820f, -21.203125f, 3.263672f, -8.718750f, 10.265625f, -5.097656f, -7.964844f, -24.281250f, -21.984375f, -8.937500f, 8.718750f, -12.750000f, 4.718750f, -0.570801f, -9.656250f, 4.132812f, 0.498535f, -1.223633f, -25.062500f, 4.863281f, 12.914062f, 9.406250f, 0.372803f, -1.215820f, 19.546875f, 0.355957f, 4.507812f, -11.218750f, -23.203125f, 25.343750f, -5.304688f, 8.968750f, -14.968750f, -10.640625f, 1.415039f, 4.015625f, -1.480469f, 8.070312f, -20.250000f, 3.171875f, -6.535156f, 3.763672f, 7.585938f, -2.466797f, -15.296875f, 7.453125f, -15.945312f, 6.652344f, 2.740234f, -14.359375f, -11.289062f, -6.082031f, 5.613281f, 0.346436f, -8.062500f, 3.158203f, -10.023438f, 2.832031f, -0.825195f, -11.492188f, -1.419922f, -6.867188f, -10.679688f, 1.885742f, 7.304688f, -7.570312f, -4.250000f, -9.210938f, -6.433594f, -3.183594f, -4.808594f, 2.896484f, 9.304688f, 2.253906f, -8.421875f, 16.406250f, 1.214844f, 8.828125f, -6.593750f, 8.164062f, 8.781250f, -27.875000f, -7.871094f, 24.062500f, 0.880859f, -8.015625f, -21.187500f, 0.226318f, 0.752930f, 4.398438f, 0.457275f, 3.308594f, -14.718750f, 10.281250f, 7.878906f, 7.652344f, -4.257812f, -5.242188f, 8.476562f, -7.078125f, -4.445312f, 8.992188f, 21.375000f, 5.609375f, 3.671875f, 0.896484f, -8.937500f, 8.937500f, 2.187500f, 0.033173f, 13.375000f, 11.281250f, 21.187500f, -18.781250f, -7.058594f, -0.567871f, 0.385254f, 1.898438f, 1.793945f, -0.646484f, -15.132812f, -17.312500f, -0.500977f, 5.144531f, 14.851562f, 0.562012f, 4.535156f, 10.023438f, -20.500000f, 3.279297f, 13.632812f, 14.046875f, 6.335938f, 15.710938f, 5.238281f, 8.031250f, 2.060547f, -0.875977f, -0.899902f, 2.986328f, -2.234375f, 15.585938f, 19.578125f, 0.311768f, -15.656250f, 12.898438f, 22.734375f, 10.523438f, -17.156250f, 14.882812f, 12.718750f, -10.367188f, 15.125000f, 6.281250f, 0.270264f, 0.123047f, 0.799316f, 4.789062f, 13.500000f, -12.156250f, -14.554688f, 6.437500f, 23.593750f, 4.984375f, 5.175781f, -6.843750f, -6.242188f, 12.101562f, -18.609375f, 4.054688f, 6.761719f, -8.281250f, -8.164062f, 5.886719f, 8.859375f, 9.718750f, -3.767578f, 0.114197f, -18.218750f, 5.820312f, 14.132812f, -2.074219f, 3.027344f, 8.945312f, -13.953125f, 5.488281f, -2.904297f, 1.985352f, 8.531250f, 2.458984f, 7.308594f, 0.735352f, 17.781250f, 9.125000f, -14.351562f, 1.124023f, -2.464844f, 4.851562f, -13.460938f, 2.951172f, -8.500000f, 5.035156f, 2.232422f, -2.369141f, -2.789062f, -5.039062f, -0.898438f, 13.187500f, -7.097656f, -22.390625f, 3.138672f, 16.812500f, -6.503906f, -20.625000f, -6.691406f, 20.250000f, -0.689453f, -2.650391f, -0.799316f, -1.297852f, 8.593750f, -1.822266f, -8.570312f, -14.507812f, -12.601562f, 6.597656f, -1.354492f, 5.351562f, -5.203125f, 6.398438f, 5.335938f, 10.507812f, -1.365234f, -1.467773f, -28.515625f, -5.593750f, 11.156250f, 6.097656f, -2.158203f, 1.383789f, -6.433594f, 9.804688f, -10.132812f, 1.630859f, -9.312500f, -19.593750f, 0.281982f, 0.067749f, 14.671875f, -10.578125f, -6.722656f, 5.445312f, -5.917969f, 1.805664f, -1.485352f, -9.117188f, -11.078125f, 11.398438f, 9.750000f, 13.828125f, 4.566406f, 14.601562f, 11.312500f, 3.306641f, -10.781250f, -26.718750f, -0.736816f, 0.450195f, -4.312500f, 6.558594f, -6.472656f, -21.500000f, -2.626953f, 4.773438f, -5.406250f, 15.054688f, 8.210938f, -3.347656f, 3.181641f, -20.171875f, 5.007812f, 9.429688f, -3.148438f, -1.671875f, 26.984375f, 12.046875f, -7.179688f, 12.296875f, 8.351562f, -9.726562f, -4.265625f, 18.375000f, 6.675781f, -6.808594f, 1.518555f, 0.787109f, -4.261719f, -17.203125f, 3.748047f, -10.945312f, -11.054688f, -22.921875f, -0.262207f, -10.437500f, -19.593750f, 13.179688f, -6.007812f, 5.429688f, -9.304688f, -7.753906f, -12.984375f, -12.750000f, 2.910156f, -7.226562f, -5.453125f, -10.117188f, -13.500000f, 19.312500f, 34.718750f, -0.804199f, -5.785156f, 4.410156f, -8.523438f, -1.242188f, -5.855469f, 9.078125f, 20.312500f, -1.139648f, 0.381348f, -6.441406f, -9.539062f, -14.281250f, 10.562500f, -4.246094f, 4.570312f, 5.347656f, -8.148438f, -13.000000f, 10.070312f, 0.846680f, -6.667969f, -0.285889f, -2.193359f, 3.453125f, -4.746094f, -3.087891f, 0.378906f, -1.691406f, 5.492188f, 15.132812f, 13.679688f, -5.253906f, -13.554688f, 5.515625f, 10.781250f, 5.519531f, 3.058594f, 2.404297f, 3.597656f, 2.574219f, 1.456055f, 9.109375f, -9.476562f, -1.840820f, -3.576172f, 11.570312f, -5.082031f, 31.515625f, -7.289062f, 3.558594f, 0.423828f, 11.093750f, -9.328125f, -5.058594f, -6.984375f, -10.468750f, 4.621094f, -0.903809f, 6.441406f, 7.000000f, -7.101562f, 2.244141f, -4.539062f, 6.230469f, -10.203125f, -2.234375f, 2.890625f, -6.058594f, -28.250000f, 17.515625f, 1.563477f, -4.269531f, -1.026367f, 10.640625f, -8.046875f, -7.097656f, -0.536133f, -7.257812f, -2.958984f, 14.343750f, 20.203125f, 2.578125f, -0.061340f, -7.898438f, -17.328125f, -10.250000f, -14.304688f, -21.031250f, 12.218750f, -1.432617f, 5.437500f, 0.639160f, 1.412109f, 2.324219f, -16.718750f, 10.367188f, -7.996094f, 1.524414f, -3.326172f, -18.687500f, -3.923828f, -0.157227f, -8.867188f, 5.890625f, -14.234375f, -6.281250f, 2.720703f, -13.203125f, -7.660156f, 15.578125f, 4.988281f, 10.664062f, -19.656250f, -8.031250f, -1.439453f, -7.027344f, 5.679688f, -0.709961f, -3.298828f, 3.939453f, 8.132812f, -4.328125f, -13.726562f, -4.769531f, -4.406250f, -6.964844f, -27.281250f, 2.279297f, 19.578125f }; +static const float16 vec_b[] = { 1.131836f, 6.109375f, 2.093750f, -3.322266f, 7.148438f, 6.871094f, 6.125000f, 2.326172f, 1.839844f, -16.234375f, 4.703125f, 23.531250f, -0.490234f, -18.140625f, -0.875977f, -22.937500f, 8.554688f, -12.148438f, 0.088135f, -1.610352f, -3.708984f, -3.730469f, -7.257812f, 16.375000f, -16.968750f, -3.378906f, -9.757812f, 19.062500f, 6.171875f, 11.460938f, -6.437500f, -18.718750f, 11.726562f, 16.906250f, -21.109375f, 23.640625f, 3.892578f, -1.548828f, -4.906250f, -14.296875f, 13.804688f, -8.140625f, -9.570312f, 1.446289f, -15.703125f, 3.154297f, -4.312500f, 4.996094f, -0.661133f, -2.488281f, -4.804688f, -1.555664f, 7.792969f, -7.734375f, -0.093262f, -0.832520f, -9.421875f, 8.726562f, 9.781250f, 2.849609f, 5.042969f, -16.359375f, 18.843750f, 8.617188f, 18.375000f, 11.750000f, -8.375000f, 7.011719f, 11.757812f, 3.486328f, -10.921875f, 1.370117f, -6.898438f, -6.988281f, -2.824219f, 4.945312f, -1.469727f, 6.972656f, -14.757812f, 3.603516f, 4.769531f, -17.343750f, 7.148438f, -15.781250f, 14.054688f, -8.570312f, 6.554688f, 19.109375f, 8.234375f, 3.593750f, 11.625000f, -1.319336f, 1.082031f, 5.972656f, -8.445312f, -21.171875f, -9.109375f, -0.744141f, 3.388672f, 1.438477f, 9.789062f, 16.718750f, -1.168945f, 1.392578f, -11.593750f, -1.593750f, 2.216797f, -6.539062f, 12.617188f, -30.531250f, -2.285156f, 16.734375f, -12.101562f, 5.632812f, 4.054688f, -1.842773f, -9.382812f, -18.062500f, 14.554688f, -8.859375f, -5.019531f, 22.734375f, 7.250000f, 15.101562f, -15.562500f, 5.707031f, 3.109375f, 15.757812f, -22.625000f, -18.468750f, -3.916016f, -8.203125f, -11.203125f, -17.484375f, 0.120972f, 8.609375f, 4.941406f, 0.627930f, -0.717773f, 10.601562f, -1.115234f, -2.185547f, 25.921875f, -4.902344f, 3.296875f, 4.070312f, 13.578125f, 9.765625f, 8.500000f, -13.273438f, -19.390625f, 6.300781f, -12.828125f, -2.320312f, 1.954102f, -8.398438f, -7.878906f, 5.675781f, -15.906250f, 3.884766f, 3.384766f, -15.718750f, -7.078125f, -5.984375f, -11.507812f, 4.203125f, 5.539062f, 4.769531f, -2.386719f, -9.093750f, 14.054688f, -3.400391f, -8.828125f, 17.703125f, 30.562500f, 1.332031f, -2.207031f, -1.166016f, 13.445312f, -11.609375f, 0.790039f, 16.625000f, 4.210938f, 4.382812f, 11.984375f, -0.997559f, 16.343750f, 1.234375f, 6.320312f, -10.671875f, -14.437500f, -9.898438f, -13.109375f, 5.000000f, -7.777344f, 0.764648f, 6.906250f, 2.392578f, -6.359375f, 6.191406f, -10.195312f, 2.646484f, -13.476562f, 0.841797f, -3.269531f, 0.552734f, 2.771484f, 6.914062f, 17.812500f, -2.183594f, -8.992188f, 14.367188f, -6.093750f, 4.503906f, -13.289062f, 24.484375f, -0.339600f, 6.761719f, 4.714844f, 11.742188f, 10.250000f, -9.273438f, -13.671875f, 16.312500f, -0.493164f, 5.015625f, -3.855469f, 7.453125f, -7.378906f, -5.476562f, -8.507812f, 11.429688f, -24.328125f, 5.632812f, -4.742188f, 2.910156f, 10.867188f, 11.703125f, 8.593750f, 0.354492f, -1.727539f, -12.757812f, 2.066406f, 4.828125f, -6.308594f, 4.089844f, -8.437500f, 4.796875f, -21.562500f, -10.460938f, 19.593750f, -4.160156f, -6.250000f, -5.894531f, 10.484375f, 9.640625f, -4.226562f, 14.843750f, 5.539062f, -12.593750f, 0.202148f, 5.039062f, 5.773438f, 10.601562f, 5.269531f, 8.609375f, 3.349609f, -2.708984f, -13.820312f, 1.959961f, 1.439453f, -9.695312f, 2.634766f, -4.949219f, -4.000000f, -5.125000f, -5.132812f, 6.820312f, -17.984375f, -1.672852f, -2.019531f, -22.187500f, 3.441406f, -0.466797f, 12.242188f, -9.093750f, 6.152344f, 14.148438f, 9.914062f, -5.121094f, -7.265625f, -10.289062f, -8.445312f, 4.523438f, -4.082031f, -5.753906f, 4.332031f, 2.708984f, -8.906250f, -4.121094f, 21.171875f, -3.464844f, -7.046875f, -10.218750f, 6.382812f, 2.931641f, 20.671875f, -11.304688f, -0.181641f, 0.625000f, -11.265625f, 2.890625f, -9.515625f, -10.460938f, 20.687500f, -5.714844f, -14.281250f, -3.855469f, -5.015625f, 16.796875f, -2.220703f, 0.985840f, 10.578125f, -9.773438f, 14.726562f, 0.469482f, -8.531250f, -13.390625f, -10.835938f, -7.109375f, 7.457031f, -7.710938f, -11.359375f, -1.564453f, -7.117188f, -12.804688f, -12.203125f, 1.235352f, -3.953125f, -9.414062f, 18.875000f, -3.859375f, -5.976562f, -0.689941f, 2.933594f, 1.472656f, 0.053802f, 6.828125f, -8.039062f, -4.933594f, -9.835938f, -2.228516f, -10.093750f, 16.093750f, -3.720703f, -0.451660f, -3.013672f, 2.142578f, 4.972656f, -14.328125f, 11.710938f, -2.263672f, 3.203125f, -6.304688f, -5.449219f, 13.132812f, 4.406250f, 7.777344f, 10.093750f, 16.593750f, -12.039062f, -2.130859f, -1.020508f, -6.785156f, 16.812500f, -11.351562f, 3.779297f, 7.347656f, -4.757812f, -2.710938f, 7.968750f, 0.707031f, 16.187500f, -0.509766f, 2.697266f, 7.519531f, 0.690430f, -4.011719f, -4.992188f, -9.554688f, 7.714844f, -2.357422f, 10.960938f, 14.578125f, -0.623047f, -10.140625f, 12.796875f, 0.353271f, -11.539062f, 4.253906f, 17.500000f, -10.945312f, -12.000000f, -0.251221f, 3.056641f, -7.933594f, -5.882812f, -2.277344f, -10.375000f, -5.246094f, -7.320312f, -1.326172f, 19.890625f, 5.117188f, -0.162354f, -2.498047f, 10.367188f, -7.531250f, 2.511719f, -1.507812f, -7.687500f, 8.781250f, 6.894531f, 2.582031f, -11.968750f, 4.136719f, -18.546875f, 6.230469f, -3.781250f, 16.046875f, 5.039062f, -15.617188f, -6.117188f, 17.343750f, 1.271484f, 5.578125f, 10.539062f, -2.537109f, 6.625000f, -5.507812f, -3.677734f, -5.164062f, -17.312500f, -0.700195f, 9.546875f, -0.127441f, -5.121094f, 14.453125f, -17.562500f, -13.625000f, 4.730469f, -7.730469f, -21.968750f, -0.182007f, 9.335938f, 14.484375f, -8.414062f, -14.187500f, 2.152344f, 1.048828f, 3.630859f, -1.461914f, 6.355469f, 1.981445f, -5.402344f, 6.507812f, 3.568359f, 8.460938f, -15.421875f, 12.062500f, -3.369141f, -10.304688f, 2.695312f, 6.269531f, 13.750000f, 13.492188f, 2.826172f, 12.671875f, -11.125000f, 2.414062f, -19.796875f, -2.943359f, 28.000000f, -6.027344f, 4.683594f, -17.671875f, 13.687500f, -21.812500f, 3.431641f, -10.320312f, 8.820312f, -5.527344f, 26.828125f, 3.720703f, 7.742188f, -4.113281f, -1.512695f, -7.410156f, -3.998047f, 13.054688f, 6.070312f, -9.203125f, 7.808594f, 1.910156f, 8.218750f, -7.500000f, -16.531250f, -4.777344f, 0.998535f, 0.976562f, -0.378174f, 11.578125f, 14.750000f, 18.515625f, -4.148438f, 9.820312f, 0.732910f, -16.500000f, 3.689453f, -11.000000f, 19.921875f, -8.296875f, 0.124573f, -3.060547f, -3.009766f, 3.208984f, 10.148438f, -4.867188f, -9.789062f, -0.625000f, 2.744141f, -8.062500f, 17.015625f, 9.585938f, 5.457031f, 2.294922f, 4.027344f, -2.173828f, -8.562500f, 4.656250f, -11.953125f, -4.625000f, -2.626953f, 9.187500f, 7.261719f, 0.801270f, 3.972656f, -10.500000f, -4.710938f, 12.539062f, -19.281250f, -17.906250f, -9.742188f, -3.242188f, -7.835938f, -15.328125f, 6.722656f, 11.250000f, -2.402344f, -5.792969f, -5.871094f, 11.750000f, 6.578125f, 5.363281f, 15.828125f, -9.109375f, 10.171875f, 2.238281f, 1.850586f, 1.082031f, -5.609375f, 10.359375f, 9.226562f, -5.847656f, 7.523438f, -8.687500f, -3.888672f, 12.320312f, 3.912109f, -15.093750f, -1.823242f, 9.257812f, 7.250000f, -0.217285f, -4.468750f, 0.417480f, 0.349365f, 0.915527f, 0.726074f, 0.724121f, -16.203125f, 24.781250f, 5.949219f, -3.496094f, -7.550781f, -12.554688f, 3.894531f, 9.640625f, 11.265625f, 5.128906f, 16.296875f, 3.937500f, 14.468750f, -3.259766f, -3.367188f, -5.929688f, -1.206055f, 0.617188f, 1.592773f, -21.359375f, -6.031250f, 2.974609f, 2.039062f, 12.179688f, 2.804688f, -4.113281f, -5.847656f, 1.258789f, -11.476562f, -11.078125f, -11.117188f, 0.634277f, -8.851562f, 4.671875f, -5.023438f, -2.705078f, 6.597656f, 1.671875f, 13.007812f, -11.289062f, -3.042969f, 0.034149f, 10.851562f, -4.886719f, -4.730469f, 13.398438f, 0.687500f, 1.302734f, -8.984375f, -11.625000f, -4.218750f, 4.902344f, 10.429688f, -12.781250f, 14.242188f, 11.703125f, -0.440674f, 3.697266f, 11.101562f, -12.046875f, -1.641602f, 18.656250f, 12.710938f, 13.437500f, -1.175781f, 8.359375f, -10.593750f, 20.468750f, 5.472656f, 3.103516f, -2.441406f, -6.726562f, 3.220703f, -11.765625f, -13.250000f, -9.015625f, 13.421875f, 11.226562f, -15.648438f, -6.824219f, 10.570312f, 1.852539f, 2.830078f, -17.562500f, 0.304199f, -2.447266f, -1.648438f, 8.140625f, 3.835938f, -14.007812f, -1.449219f, -16.078125f, -3.417969f, 4.566406f, 3.875000f, 15.453125f, -1.203125f, -4.628906f, -14.835938f, -1.909180f, 3.814453f, 6.746094f, 10.632812f, 1.440430f, 13.984375f, 9.187500f, 5.449219f, 4.925781f, 21.359375f, -6.468750f, 19.515625f, -4.097656f, 1.427734f, -5.335938f, 0.586426f, -17.796875f, -3.279297f, 3.355469f, -13.570312f, 1.068359f, -1.681641f, 16.453125f, -0.960938f, 6.371094f, -1.668945f, 1.835938f, 2.132812f, 5.523438f, -8.750000f, 1.216797f, 7.023438f, -8.218750f, 17.390625f, -2.367188f, -3.412109f, -17.312500f, -22.109375f, -7.859375f, -22.921875f, 13.773438f, -13.468750f, -1.077148f, 1.228516f, -7.335938f, 4.148438f, -0.246704f, -0.892090f, -5.804688f, 10.093750f, 4.871094f, -6.023438f, 0.938965f, -17.875000f, -6.121094f, -3.585938f, -5.382812f, -4.488281f, -6.277344f, 1.338867f, 4.007812f, 4.121094f, -10.890625f, -4.671875f, -6.808594f, 5.859375f, -13.875000f, -9.281250f, 7.250000f, -6.292969f, -3.867188f, -6.000000f, -14.250000f, -0.481201f, -5.222656f, 0.299805f, -6.996094f, -6.539062f, -9.140625f, -2.568359f, 3.021484f, -2.162109f, -0.162720f, -11.796875f, -11.304688f, 9.476562f, 1.953125f, 2.812500f, -21.562500f, -6.464844f, 13.015625f, 0.646484f, -4.492188f, -1.800781f, 3.062500f, 11.414062f, -12.101562f, -4.562500f, -22.312500f, -11.257812f, 11.578125f, 7.648438f, -3.365234f, -5.894531f, 12.320312f, 4.253906f, -1.457031f, -3.060547f, 3.193359f, -8.054688f, -2.945312f, -8.992188f, -7.863281f, -0.013435f, 4.144531f, 4.843750f, -2.718750f, -3.537109f, -3.287109f, 6.457031f, 3.205078f, -2.576172f, -18.312500f, 2.162109f, -20.046875f, -5.164062f, 1.650391f, -10.507812f, -16.562500f, -5.390625f, 15.164062f, -7.085938f, 0.053192f, -2.871094f, -6.218750f, 2.546875f, -13.859375f, -11.554688f, -13.960938f, 13.960938f, 10.734375f, 10.390625f, -4.304688f, 10.867188f, 7.960938f, -7.496094f, -0.936035f, -1.507812f, -8.992188f, -4.656250f, 10.421875f, -2.361328f, 10.039062f, -12.773438f, -12.289062f, 11.375000f, 1.850586f, -4.132812f, 4.183594f, 2.445312f, -5.234375f, 9.078125f, 13.664062f, 9.609375f, 8.625000f, -3.480469f, -1.222656f, 4.894531f, 5.246094f, 1.776367f, -7.921875f, 2.214844f, -8.742188f, -2.619141f, -1.509766f, 6.828125f, -1.524414f, -13.570312f, -9.007812f, 6.105469f, -4.390625f, -0.143311f, 3.089844f, 6.734375f, -6.648438f, -4.707031f, -0.087646f, 13.507812f, 8.984375f, -14.257812f, -14.914062f, 14.226562f, -0.010422f, -17.125000f, -6.175781f, 3.917969f, 0.427979f, 0.601074f, 6.632812f, -3.433594f, -6.550781f, 8.328125f, -16.062500f, -2.904297f, 12.031250f, -6.824219f, -0.365967f, 5.007812f, -2.167969f, -3.546875f, -9.320312f, -11.000000f, -12.070312f, -14.992188f, 16.328125f, 28.578125f, -3.861328f, -9.226562f, -2.126953f, -8.093750f, -11.851562f, 15.304688f, 9.992188f, 8.414062f, -2.486328f, 0.381348f, -4.500000f, 11.523438f, 20.078125f, -3.392578f, -1.460938f, -8.390625f, 7.328125f, -7.261719f, 3.201172f, 6.582031f, -17.171875f, 19.437500f, -3.568359f, -5.769531f, -1.015625f, -2.945312f, 6.332031f, -8.484375f, -4.062500f, -8.054688f, -1.069336f, -12.570312f, 12.101562f, 1.878906f, 3.492188f, 6.988281f, -0.285400f, 8.187500f, -16.890625f, -18.703125f, -9.335938f, -3.359375f, -9.578125f, 2.275391f, -4.777344f, -3.337891f, 12.703125f, 9.710938f, 0.392578f, 13.414062f, 10.437500f, -2.175781f, 6.835938f, 11.726562f, 4.621094f, -6.167969f, -9.273438f, -1.047852f, 15.687500f, 13.273438f, -2.068359f, -1.963867f, 2.480469f, -9.632812f, -21.625000f, -3.687500f, 13.453125f, 0.978027f, -13.710938f, -7.921875f, -8.664062f, -2.042969f, -4.425781f, -8.117188f, 8.929688f, -6.898438f, -12.734375f, -19.937500f, -4.847656f, 4.835938f, -12.398438f, -7.671875f, -7.722656f, 3.158203f, 11.437500f, 3.664062f, -27.578125f, 8.476562f, 15.101562f, 13.437500f, 20.578125f, 5.382812f, 13.000000f, -0.578613f, -0.751953f, -7.277344f, -14.125000f, -2.734375f, 4.054688f, -12.796875f, 0.659668f, -9.734375f, 6.300781f, 2.894531f, 7.093750f, 3.041016f, 7.910156f, -24.140625f, 2.808594f, 14.500000f, -3.802734f, -13.460938f, 1.401367f, -0.143555f, 5.964844f, 6.675781f, 1.637695f, 0.307861f, -8.554688f, -15.984375f, 6.878906f, -6.015625f, -5.238281f, -7.066406f, 17.921875f, 15.054688f, 0.297363f, -16.125000f, 10.007812f, 7.523438f, -1.403320f, -12.984375f, 0.214600f, -8.992188f, 0.746582f, -3.248047f, 3.648438f, -1.318359f, 7.054688f, 9.828125f, -4.964844f, 3.527344f, -5.738281f, 9.015625f, 2.011719f, 7.195312f, 4.113281f, -2.564453f, 16.046875f, 2.462891f, -6.566406f, 5.425781f, -5.402344f, -2.167969f, 2.167969f, 17.937500f, 3.107422f, 3.935547f, -8.257812f, -3.050781f, -14.820312f, 14.187500f, 17.671875f, 18.062500f, -12.062500f, 3.681641f, -8.890625f, 1.799805f, -18.484375f, -7.007812f, -23.359375f, 10.398438f, -4.867188f, 2.029297f, 0.243652f, 9.882812f, 9.234375f, 9.593750f, -13.953125f, 12.906250f, -5.886719f, -3.189453f, -22.234375f, 4.199219f, 5.562500f, 8.507812f, 18.859375f, 1.312500f, 11.132812f, 15.367188f, 12.445312f, -8.531250f, 6.652344f, 7.910156f, 12.968750f, -13.398438f, -20.531250f, -2.748047f, 5.371094f, 3.044922f, -6.105469f, -13.164062f, -9.867188f, 3.566406f, 7.242188f, -20.218750f, -13.812500f, -2.103516f, -5.898438f, -10.656250f, -18.750000f, 7.906250f, 4.113281f, -12.890625f, -7.105469f, 13.460938f, -15.992188f, 3.611328f, 2.626953f, -1.838867f, 18.593750f, -8.804688f, 1.431641f, 15.398438f, 4.101562f, -2.572266f, -10.460938f, -6.152344f, 16.609375f, -5.960938f, 7.226562f, 9.609375f, -24.343750f, 18.406250f, 6.402344f, 0.636230f, -1.091797f, 2.783203f, -0.231079f, 11.945312f, 2.378906f, -2.330078f, 1.351562f, -2.423828f, 12.226562f, 8.796875f, 9.390625f, -8.289062f, 0.511719f, 1.365234f, 3.087891f, -4.914062f, 1.901367f, 12.468750f, 0.159180f, 4.800781f, 3.748047f, -0.082825f, -4.101562f, 14.750000f, -5.820312f, -3.429688f, 24.718750f, 30.250000f, -6.785156f, 2.703125f, -3.664062f, 1.665039f, 1.109375f, -2.734375f, -0.119019f, -4.863281f, 5.292969f, -7.425781f, 12.523438f, -6.457031f, 17.750000f, -1.216797f, -10.210938f, -6.394531f, -10.968750f, 0.717285f, 6.308594f, 1.257812f, -1.912109f, -2.736328f, 9.687500f, -0.408936f, 0.526855f, -8.593750f, 15.132812f, 3.976562f, -10.250000f, 1.744141f, -2.257812f, -2.257812f, 22.250000f, -2.246094f, -0.832031f, 13.335938f, -16.765625f, 9.632812f, 7.125000f, -8.382812f, 11.640625f, -6.289062f, -0.278809f, 5.394531f, 1.989258f, -0.907227f, -8.648438f, -0.577637f, 9.484375f, 12.156250f, -5.796875f, 10.093750f, -0.526855f, -12.398438f, -4.675781f, -6.261719f, -6.097656f, -5.230469f, -16.640625f, -6.210938f, -2.806641f, 13.773438f, -4.402344f, -9.289062f, -14.421875f, -3.628906f, -6.820312f, 7.531250f, 4.675781f, -24.234375f, -3.785156f, -0.126953f, -11.031250f, 6.062500f, -1.961914f, -1.720703f, 8.921875f, 11.789062f, 9.203125f, 9.640625f, 3.234375f, 5.058594f, -7.839844f, 0.149780f, 15.976562f, 8.578125f, 5.656250f, -15.976562f, -3.330078f, -9.023438f, -16.640625f, 1.863281f, 2.037109f, 20.859375f, 1.063477f, -5.574219f, -5.289062f, -13.250000f, -14.632812f, -8.835938f, -25.203125f, 9.625000f, 7.085938f, -2.464844f, -12.140625f, 9.796875f, 0.330811f, -8.460938f, 5.695312f, 9.000000f, 23.843750f, -10.335938f, -3.339844f, -6.285156f, 3.925781f, -12.859375f, -2.066406f, -21.500000f, -7.488281f, -3.958984f, 2.798828f, -9.054688f, -27.109375f, 4.773438f, 6.203125f, 8.593750f, 5.882812f, -8.726562f, 7.406250f, -6.609375f, -4.253906f, -2.849609f, 0.671387f, 4.214844f, -9.687500f, -10.578125f, -7.906250f, 5.113281f, -3.427734f, 19.578125f, 7.003906f, -13.929688f, -2.462891f, -6.906250f, -10.593750f, 16.750000f, -0.988770f, -2.187500f, 5.695312f, 13.203125f, -10.609375f, 21.468750f, -1.658203f, -5.210938f, 23.406250f, 0.646973f, -15.429688f, -11.914062f, 3.132812f, 8.679688f, 30.562500f, -0.248169f, 10.960938f, 4.082031f, -6.152344f, -1.837891f, -16.109375f, 19.187500f, -11.203125f, -8.046875f, 18.593750f, -9.781250f, 7.203125f, 6.546875f, 4.121094f, -6.117188f, -24.218750f, 6.363281f, -17.250000f, 0.157104f, -15.578125f, 1.067383f, 4.015625f, 2.878906f, -26.281250f, -6.234375f, -5.882812f, 4.375000f, 8.062500f, -10.781250f, -9.148438f, 1.250977f, 7.363281f, 0.524414f, 1.513672f, -3.490234f, 4.972656f, -6.363281f, 12.734375f, 2.570312f, -7.476562f, 1.382812f, -16.265625f, 15.062500f, 1.976562f, -4.269531f, -11.320312f, -3.914062f, -0.600586f, 7.722656f, -2.472656f, -2.923828f, -6.515625f, 8.968750f, 4.179688f, -13.796875f, -0.821289f, 8.421875f, -8.585938f, -5.750000f, -10.210938f, 2.574219f, -3.623047f, 7.132812f, 3.119141f, -11.000000f, 12.898438f, 18.546875f, -7.695312f, -5.003906f, -14.117188f, -10.890625f, -6.429688f, -10.742188f, 3.093750f, 0.568359f, -9.546875f, 7.703125f, -21.000000f, 9.640625f, 5.597656f, 6.578125f, 11.664062f, 5.171875f, 10.531250f, -5.167969f, 5.167969f, -6.925781f, -1.409180f, 13.937500f, 11.632812f, -10.062500f, 2.634766f, -8.054688f, 17.484375f, -5.949219f, 8.984375f, 3.773438f, -2.812500f, -7.824219f, 3.425781f, 7.273438f, 15.015625f, 9.593750f, -4.394531f, -3.253906f, -21.718750f, 4.109375f, 3.130859f, 2.628906f, -6.808594f, -16.062500f, 6.171875f, 6.871094f, 2.097656f, 19.921875f, -4.304688f, 4.343750f, -10.062500f, 9.835938f, -3.902344f, 14.492188f, 6.296875f, -3.097656f, 15.226562f, -2.404297f, 0.917969f, 5.675781f, 5.394531f, -2.919922f, -3.923828f, -15.015625f, -11.453125f, 12.460938f, -5.726562f, -9.328125f, 0.348389f, 4.160156f, -5.011719f, -6.015625f, -13.578125f, -6.199219f, 0.405273f, 9.984375f, -1.296875f, 7.261719f, -12.593750f, -5.363281f, -8.453125f, -11.710938f, -6.285156f, -12.695312f, 2.912109f, -16.078125f, 7.144531f, 10.164062f, 5.515625f, 21.390625f, -16.062500f, -8.226562f, -13.476562f, -14.968750f, 26.078125f, 11.890625f, -12.906250f, 18.140625f, 3.310547f, -21.109375f, -1.125977f, 10.007812f, -2.330078f, 23.781250f, -3.802734f, 0.410156f, -30.218750f, 3.349609f, -3.091797f, 3.078125f, -16.859375f, -4.878906f, -10.148438f, -3.800781f, -6.925781f, 31.296875f, 24.656250f, -8.304688f, 0.892578f, 5.140625f, 9.578125f, -0.250244f, -15.445312f, 0.578125f, -1.429688f, -11.468750f, 18.234375f, -5.542969f, -17.687500f, 4.300781f, -11.195312f, 10.625000f, -1.443359f, -0.548340f, 2.328125f, -1.599609f, -2.935547f, 11.367188f, 6.554688f, 16.765625f, 4.507812f, 2.878906f, -22.390625f, 1.195312f, -1.779297f, -20.250000f, 19.406250f, -2.880859f, 6.632812f, -17.000000f, 12.546875f, -3.007812f, -3.748047f, -4.347656f, -6.894531f, -11.203125f, -0.281494f, -13.070312f, 8.468750f, 18.437500f, -22.421875f, 12.750000f, 13.984375f, 10.375000f, 4.082031f, 18.546875f, 5.289062f, -2.878906f, -9.273438f, 15.007812f, -20.031250f, 4.261719f, -10.789062f, 6.730469f, -14.562500f, -1.368164f, -8.585938f, -10.179688f, 12.312500f, -3.388672f, 1.082031f, 12.359375f, -5.718750f, 3.824219f, -0.758301f, 15.062500f, 2.693359f, -12.273438f, 7.386719f, -17.625000f, -1.206055f, 9.000000f, -1.870117f, 2.822266f, 4.699219f, 11.148438f, 5.207031f, -8.546875f, 10.882812f, -7.460938f, 12.164062f, -0.763672f, 3.191406f, 3.195312f, 1.099609f, -10.781250f, -6.855469f, -3.833984f, 17.921875f, 6.191406f, 3.541016f, -12.500000f, -14.085938f, -5.710938f, 2.511719f, 14.851562f, 5.738281f, -0.362305f, 1.852539f, 9.421875f, 5.753906f, 14.625000f, -22.250000f, -3.306641f, -24.406250f, 2.023438f, -6.074219f, -0.008224f, -8.414062f, 3.396484f, 4.070312f, -0.928223f, 0.539062f, -14.398438f, -3.154297f, -1.222656f, 16.750000f, -1.496094f, 5.625000f, 9.757812f, 4.773438f, -2.812500f, 7.226562f, 1.958984f, -7.371094f, -3.460938f, -17.562500f, 16.296875f, 6.898438f, -8.296875f, -2.494141f, -10.710938f, 16.187500f, -7.796875f, -9.234375f, 11.773438f, 3.273438f, 10.578125f, 1.082031f, 10.656250f, 0.808594f, 0.022354f, 14.929688f, -5.738281f, 4.617188f, -6.832031f, 10.382812f, -9.507812f, -7.585938f, -3.958984f, -0.890625f, 6.242188f, -12.726562f, 20.171875f, 16.468750f, -5.222656f, 1.040039f, -1.831055f, -4.117188f, 4.988281f, 11.734375f, 17.750000f, -9.164062f, -8.945312f, 7.234375f, 16.828125f, 3.572266f, -10.257812f, 1.791992f, 4.820312f, -1.999023f, -1.303711f, 2.408203f, -6.343750f, 7.277344f, -26.234375f, -13.414062f, 4.933594f, -2.771484f, 19.890625f, 10.968750f, -2.109375f, -10.375000f, 1.605469f, -16.828125f, -1.062500f, 2.210938f, -8.414062f, -10.195312f, 3.179688f, 7.324219f, 9.679688f, -9.414062f, 11.234375f, 14.554688f, -0.486816f, -9.531250f, 10.179688f, -2.160156f, -1.119141f, 8.007812f, -16.812500f, 0.406738f, -16.281250f, 13.171875f, -11.468750f, -8.078125f, 20.125000f, 0.630859f, 0.912109f, -3.695312f, -0.964844f, 5.484375f, 1.816406f, -12.351562f, 5.242188f, 3.457031f, 3.759766f, -7.687500f, 9.390625f, 3.554688f, 10.460938f, 14.523438f, 1.813477f, 6.027344f, 14.171875f, -6.828125f, 6.503906f, 18.671875f, 3.759766f, 3.320312f, -3.156250f, 4.800781f, -5.523438f, 4.839844f, -16.343750f, 19.218750f, -3.429688f, -9.921875f, -9.796875f, 4.585938f, 4.156250f, 7.460938f, 3.607422f, 17.437500f, -1.125000f, -17.328125f, -12.671875f, 9.625000f, -19.671875f, 1.270508f, 8.875000f, -6.550781f, -3.000000f, -9.718750f, 19.859375f, 8.101562f, 3.701172f, -12.859375f, -7.625000f, 9.515625f, -20.656250f, 10.281250f, 8.398438f, -2.662109f, -5.613281f, 7.207031f, -11.625000f, -4.617188f, 11.609375f, -7.238281f, 5.796875f, 4.867188f, 3.601562f, 5.011719f, 4.847656f, 16.687500f, 4.839844f, -0.902832f, -8.070312f, -13.046875f, 4.707031f, 15.054688f, 5.445312f, 3.304688f, -12.484375f, -0.558594f, -2.917969f, 13.140625f, 11.906250f, 1.407227f, -9.750000f, -2.888672f, 15.039062f, -0.389893f, 16.187500f, -0.348389f, 1.447266f, -21.140625f, 5.058594f, 12.875000f, -19.968750f, -0.904785f, 1.042969f, 9.328125f, -1.541016f, -10.000000f, 20.968750f, 8.437500f, -10.945312f, 0.778809f, 8.046875f, -16.375000f, -2.007812f, -14.507812f, 2.732422f, 3.521484f, -5.636719f, 24.984375f, -12.765625f, 2.916016f, 8.125000f, -4.109375f, 8.960938f, 0.900879f, -16.187500f, 6.199219f, -0.394287f, -1.849609f, -1.206055f, -3.244141f, 10.281250f, 9.156250f, 7.785156f, 1.040039f, -8.164062f, 1.750977f, -14.054688f, -10.960938f, -22.828125f, 2.654297f, 1.677734f, -1.385742f, 3.074219f, 15.796875f, 17.203125f, -2.501953f, 4.023438f, 7.714844f, -6.527344f, 5.570312f, 1.583984f, -12.351562f, 9.296875f, -1.274414f, 1.003906f, -1.606445f, -7.363281f, -17.593750f, -7.316406f, 10.851562f, -11.937500f, 5.820312f, -6.382812f, -15.960938f, 12.226562f, 0.604004f, 0.601074f, 4.742188f, 11.500000f, 5.792969f, 10.000000f, -9.445312f, -3.517578f, -4.039062f, 1.384766f, -9.804688f, -7.222656f, -3.376953f, 13.851562f, -5.226562f, -1.320312f, 11.500000f, -0.049835f, -21.234375f, -1.339844f, -6.324219f, 4.054688f, -2.345703f, -8.382812f, 1.623047f, -20.062500f, 0.097229f, -8.476562f, -4.218750f, 19.593750f, -2.728516f, -4.207031f, -7.218750f, -3.150391f, 9.140625f, 10.867188f, -12.484375f, 12.031250f, 7.187500f, 5.289062f, 11.945312f, 3.921875f, 11.421875f, 7.027344f, -12.750000f, 12.898438f, 18.359375f, -7.242188f, -9.421875f, -9.671875f, -4.882812f, -3.970703f, -9.945312f, 6.207031f, -7.222656f, -4.781250f, -11.460938f, -2.261719f, 13.492188f, 5.968750f, -3.279297f, -8.804688f, -14.929688f, 9.906250f, -8.429688f, 3.837891f, -4.816406f, -3.964844f, 6.132812f, 19.875000f, 5.039062f, -0.617676f, 9.929688f, -0.126587f, 6.714844f, 11.539062f, 4.925781f, 7.730469f, 10.414062f, -12.742188f, -8.460938f, -0.374268f, -1.544922f, -9.085938f, -4.597656f, 9.914062f, 7.847656f, 2.966797f, 13.609375f, 17.015625f, 5.953125f, -1.748047f, -4.453125f, 8.265625f, 9.093750f, -7.921875f, 26.828125f, 9.312500f, -10.742188f, 25.671875f, -2.867188f, -21.593750f, -14.445312f, 0.218750f, -1.667969f, 4.425781f, 11.492188f, -1.258789f, -9.617188f, -10.359375f, 0.895020f, 4.660156f, 17.968750f, -1.890625f, -3.224609f, 0.218140f, 3.183594f, 2.398438f, -2.939453f, 8.843750f, -6.546875f, 5.000000f, 3.207031f, 1.528320f, -17.343750f, 1.593750f, -3.007812f, 8.093750f, -2.490234f, -11.203125f, -3.878906f, 2.400391f, 20.031250f, -3.388672f, -14.789062f, 0.083008f, -14.851562f, -10.539062f, 6.726562f, 9.406250f, -3.121094f, 6.945312f, 19.781250f, -5.386719f, 1.784180f, 3.916016f, 0.955078f, -1.461914f, 6.863281f, -1.799805f, -8.054688f, 0.048492f, 4.062500f, -12.351562f, 11.546875f, 8.148438f, 13.578125f, -7.906250f, 7.753906f, -0.098938f, -8.984375f, -3.148438f, -11.789062f, 13.015625f, -18.375000f }; +static const float16 expected[] = { 7.527344f, 4.726562f, 2.126953f, 3.083984f, -6.585938f, 16.734375f, 12.390625f, 9.773438f, -9.421875f, 2.328125f, 11.960938f, 19.000000f, 0.446289f, -19.796875f, -2.322266f, -18.406250f, 6.281250f, -8.773438f, -13.828125f, -2.273438f, -7.570312f, -4.644531f, -5.777344f, 7.148438f, -0.109375f, -22.000000f, -1.882812f, 12.195312f, 17.546875f, 6.011719f, 6.710938f, -16.828125f, 5.730469f, 23.781250f, -16.531250f, 29.140625f, 9.812500f, -25.843750f, -21.906250f, -20.671875f, 8.437500f, -24.546875f, -9.406250f, 6.640625f, -12.796875f, -12.773438f, 7.328125f, 17.609375f, -1.396484f, 9.593750f, -6.187500f, 13.140625f, -0.972656f, -14.812500f, 14.343750f, 0.118652f, -33.781250f, 11.265625f, 17.515625f, -4.273438f, 6.570312f, -12.101562f, 10.859375f, 20.468750f, 6.843750f, 9.703125f, -11.992188f, 16.828125f, 5.984375f, 0.349609f, -1.218750f, 2.125000f, -7.746094f, 2.269531f, 8.093750f, 8.218750f, 12.992188f, 2.546875f, -6.109375f, 5.390625f, 13.718750f, -6.046875f, 6.714844f, -12.750000f, 9.992188f, 5.695312f, -2.093750f, 25.250000f, 8.179688f, 0.808594f, 2.781250f, -23.937500f, -17.468750f, 13.531250f, 16.062500f, -13.125000f, -24.375000f, -5.351562f, -8.539062f, -3.148438f, -7.929688f, 23.468750f, 6.941406f, 8.984375f, -6.648438f, -14.765625f, 25.703125f, -11.171875f, 9.125000f, -53.812500f, -10.531250f, 14.492188f, -26.859375f, 14.101562f, 9.031250f, -4.031250f, -3.492188f, -42.812500f, 11.093750f, -0.476562f, 11.015625f, 19.156250f, 8.375000f, 18.000000f, -16.953125f, 6.003906f, -2.214844f, 23.093750f, -31.562500f, -16.906250f, -18.359375f, -10.335938f, -5.242188f, -26.218750f, 15.148438f, 1.300781f, 9.625000f, 0.657715f, -16.718750f, -19.125000f, -2.451172f, -3.882812f, 21.781250f, -3.398438f, 4.394531f, -5.859375f, 8.828125f, 7.113281f, 6.980469f, 0.492188f, -18.906250f, 0.421875f, -23.343750f, -13.718750f, -6.187500f, -7.089844f, -7.281250f, 31.187500f, -6.718750f, -7.132812f, -11.828125f, -41.250000f, -22.812500f, 6.273438f, 1.859375f, -0.078125f, 23.906250f, 22.140625f, 0.349609f, -1.007812f, 20.765625f, 12.164062f, 1.781250f, 3.242188f, 31.546875f, -8.656250f, -13.203125f, -9.304688f, 5.640625f, -23.531250f, -11.796875f, 25.875000f, -5.664062f, 4.355469f, 35.500000f, -4.574219f, 26.218750f, 15.187500f, 21.906250f, -4.238281f, -22.625000f, -3.980469f, -13.328125f, -2.500000f, -19.500000f, 8.539062f, 18.421875f, -1.951172f, 7.210938f, -2.652344f, -16.750000f, -0.841797f, -34.125000f, 2.232422f, -5.980469f, -3.775391f, -7.226562f, 7.984375f, 5.804688f, -11.078125f, 0.507812f, 6.992188f, -5.054688f, -5.238281f, -12.773438f, 24.578125f, -6.511719f, 22.468750f, 5.492188f, 21.859375f, 10.421875f, -3.730469f, -18.656250f, 3.054688f, 22.562500f, 13.070312f, -0.611328f, -18.296875f, -0.910156f, 2.578125f, -17.562500f, 13.765625f, -15.679688f, 16.343750f, -8.171875f, -13.953125f, 9.648438f, 28.031250f, 15.640625f, 2.152344f, 0.819336f, -13.210938f, 9.468750f, 1.443359f, -1.378906f, -7.183594f, 22.140625f, 31.359375f, -30.031250f, -11.453125f, 29.531250f, -6.902344f, 1.859375f, -12.046875f, 15.500000f, 25.031250f, 17.750000f, 10.781250f, 16.062500f, -8.953125f, -5.699219f, 6.023438f, 11.515625f, -6.273438f, 6.476562f, -7.281250f, 9.992188f, -12.382812f, -27.203125f, 3.472656f, 11.031250f, -4.500000f, 7.593750f, -0.962891f, -0.994141f, -10.828125f, 5.890625f, 7.332031f, -11.023438f, 0.344727f, 1.730469f, -22.875000f, 8.015625f, 8.718750f, 29.156250f, -1.394531f, -6.566406f, 22.593750f, -1.117188f, 14.125000f, -17.578125f, -14.945312f, -8.250000f, -10.921875f, 2.765625f, 6.894531f, -6.902344f, 1.644531f, -6.234375f, -10.398438f, 21.750000f, -12.046875f, -10.937500f, -19.562500f, 13.859375f, 3.501953f, 34.875000f, -8.148438f, -3.759766f, 6.613281f, -17.390625f, 5.484375f, -9.906250f, -12.289062f, 15.750000f, -9.750000f, -3.812500f, -9.554688f, -4.671875f, 22.562500f, -8.015625f, 6.769531f, 3.312500f, -16.218750f, 12.921875f, 2.214844f, -11.984375f, -12.429688f, -20.234375f, -13.250000f, 26.890625f, -12.203125f, -17.437500f, 19.765625f, -11.890625f, -17.890625f, -19.109375f, 13.476562f, 1.386719f, 2.632812f, 14.453125f, -5.851562f, 11.335938f, -7.066406f, 2.535156f, -10.609375f, 20.140625f, 4.230469f, 15.257812f, 22.265625f, -8.546875f, -13.734375f, -16.500000f, -0.531250f, -5.265625f, -13.289062f, -7.000000f, 14.953125f, -6.402344f, 0.703125f, 4.960938f, -4.171875f, -1.750000f, 10.210938f, -4.945312f, 28.765625f, 4.304688f, -2.011719f, 17.140625f, 20.640625f, -23.250000f, -16.687500f, -5.601562f, -19.500000f, 32.156250f, -1.828125f, -14.031250f, 17.500000f, 7.679688f, 2.722656f, 21.125000f, -7.691406f, 6.117188f, 6.648438f, -3.978516f, 20.000000f, 7.597656f, -7.101562f, 3.757812f, -14.968750f, -15.312500f, -5.500000f, 17.375000f, 6.789062f, -4.828125f, -4.449219f, 19.953125f, 6.316406f, -10.882812f, 10.460938f, 16.453125f, -23.625000f, -1.710938f, -10.421875f, 3.777344f, -14.570312f, 5.109375f, 10.312500f, -17.343750f, -24.046875f, -3.869141f, -9.468750f, 12.968750f, 5.867188f, 8.296875f, -5.132812f, 19.500000f, -3.320312f, -1.734375f, 5.535156f, -13.890625f, -7.265625f, -1.847656f, 0.904297f, -26.968750f, 9.187500f, -9.023438f, 21.031250f, -11.390625f, 17.453125f, 8.281250f, -23.031250f, -1.589844f, 17.062500f, 0.271973f, -0.605469f, 25.781250f, -4.632812f, 4.242188f, -4.632812f, -20.984375f, -8.445312f, 2.234375f, 5.289062f, 16.640625f, -15.195312f, 11.921875f, -0.250000f, -21.031250f, -11.992188f, -3.058594f, 5.347656f, -21.671875f, 14.242188f, 17.531250f, 18.453125f, -12.242188f, -15.710938f, -2.511719f, 6.781250f, 21.343750f, -4.152344f, -2.121094f, -1.903320f, -6.683594f, -3.226562f, -1.373047f, 18.078125f, -17.562500f, -7.765625f, -2.451172f, -28.468750f, 2.662109f, 4.414062f, 38.937500f, 4.007812f, 11.843750f, 6.964844f, -13.914062f, -6.492188f, -22.562500f, 21.000000f, 34.406250f, -1.804688f, 3.023438f, -4.289062f, 8.484375f, -33.593750f, -7.312500f, -13.875000f, 21.937500f, 4.714844f, 20.828125f, -1.466797f, 7.437500f, -3.005859f, 6.753906f, -20.890625f, -5.449219f, -0.765625f, 1.304688f, -10.773438f, 11.125000f, -22.296875f, 18.875000f, -17.437500f, -5.179688f, -0.199219f, 2.314453f, -8.789062f, 6.738281f, 3.382812f, 34.937500f, 10.750000f, 1.945312f, 16.875000f, -2.386719f, -17.890625f, 3.318359f, -7.136719f, 13.890625f, -28.218750f, 14.546875f, 1.810547f, -7.203125f, 4.878906f, 17.343750f, -9.179688f, -13.265625f, 22.140625f, 19.437500f, -0.519531f, 5.539062f, -9.476562f, -11.578125f, -2.978516f, 5.265625f, -5.718750f, -10.984375f, 14.523438f, -15.992188f, -4.562500f, 12.468750f, 9.804688f, -1.332031f, 12.210938f, -8.500000f, -21.875000f, -1.931641f, 7.007812f, 0.328125f, 1.093750f, -8.406250f, -15.789062f, -3.414062f, -12.648438f, 18.859375f, 9.703125f, 1.964844f, 6.027344f, 4.597656f, 17.984375f, 1.464844f, 15.562500f, 8.796875f, -22.781250f, 17.562500f, -6.152344f, 2.460938f, 9.625000f, -4.640625f, -4.523438f, 11.140625f, -5.746094f, 8.625000f, -15.140625f, -19.687500f, 9.687500f, 3.066406f, -13.375000f, -8.351562f, 10.921875f, 14.109375f, -20.093750f, -10.953125f, -4.679688f, -3.779297f, 5.238281f, -1.589844f, -1.830078f, -20.156250f, 27.218750f, 0.089844f, 4.824219f, -10.398438f, -17.343750f, -3.851562f, 2.343750f, 5.488281f, -7.480469f, 25.281250f, 2.390625f, 12.171875f, -6.437500f, 1.402344f, -11.156250f, -1.605469f, -4.109375f, 9.273438f, -25.093750f, -17.250000f, -11.226562f, -8.218750f, 4.601562f, 16.281250f, -15.218750f, 5.933594f, 5.609375f, -6.312500f, 1.609375f, -7.546875f, 2.513672f, 1.718750f, 12.031250f, -20.343750f, -12.226562f, -0.390625f, -6.812500f, 8.656250f, -11.484375f, -9.218750f, 8.210938f, 2.234375f, -8.531250f, 5.261719f, 12.765625f, -4.359375f, -18.234375f, -17.328125f, -25.750000f, 4.992188f, 14.281250f, 16.625000f, -12.507812f, 30.812500f, 7.511719f, -15.281250f, -10.109375f, 4.109375f, -24.562500f, 8.328125f, 30.656250f, 15.812500f, 4.187500f, 1.904297f, 18.375000f, -11.914062f, 8.109375f, 15.281250f, -9.828125f, -1.222656f, -13.953125f, -4.492188f, -12.617188f, -6.332031f, -17.812500f, 16.718750f, 24.781250f, -21.953125f, 1.582031f, 10.148438f, 3.080078f, 6.402344f, -13.523438f, 8.718750f, -10.812500f, -2.808594f, 4.101562f, 1.066406f, -7.613281f, -12.890625f, -18.312500f, -4.871094f, 7.714844f, -3.925781f, 22.859375f, 12.757812f, -14.484375f, -5.148438f, -20.296875f, 13.210938f, 12.890625f, 25.156250f, 21.750000f, 32.062500f, 15.453125f, 18.968750f, 7.937500f, -0.609375f, -9.765625f, 31.406250f, 10.031250f, 6.164062f, -3.636719f, 13.109375f, -27.437500f, 13.562500f, 11.546875f, -20.531250f, 1.377930f, -4.167969f, 19.250000f, 0.128906f, 6.984375f, 12.078125f, -4.296875f, -10.218750f, 6.160156f, -1.609375f, -6.796875f, 5.402344f, -0.710938f, 19.093750f, -8.718750f, -16.984375f, 0.750000f, -34.093750f, 6.929688f, -30.625000f, 9.453125f, -29.140625f, -5.406250f, 9.289062f, -11.046875f, 5.816406f, -13.609375f, -3.943359f, -9.070312f, 37.937500f, 1.945312f, -9.390625f, 13.429688f, -15.453125f, -2.273438f, 0.648438f, -8.796875f, -6.339844f, -17.093750f, 11.210938f, -16.437500f, -13.375000f, -2.203125f, -4.886719f, 15.046875f, -1.949219f, -5.437500f, 1.656250f, 4.656250f, -7.277344f, -4.546875f, 5.187500f, -9.593750f, -6.113281f, -23.671875f, -0.146973f, -13.140625f, -17.156250f, -17.421875f, -23.843750f, -9.679688f, -17.468750f, 2.287109f, -3.171875f, -9.648438f, 20.781250f, -3.394531f, 5.171875f, -44.000000f, 3.121094f, -4.593750f, 5.562500f, -6.785156f, 11.296875f, 11.468750f, -1.898438f, -17.203125f, -7.007812f, -22.031250f, -20.593750f, 3.164062f, 13.953125f, 4.914062f, 4.519531f, 15.140625f, -7.886719f, -9.023438f, -13.625000f, -9.750000f, -19.687500f, 3.730469f, -24.250000f, 0.175781f, -9.460938f, 12.375000f, 3.562500f, -5.019531f, -15.429688f, 15.804688f, 5.441406f, 2.195312f, -4.835938f, -1.250000f, 1.727539f, -47.562500f, -11.437500f, 16.140625f, -24.093750f, -10.453125f, -9.859375f, 28.500000f, -19.578125f, -4.332031f, -6.320312f, 9.031250f, 6.308594f, 4.984375f, -5.886719f, -15.179688f, 26.718750f, 18.625000f, 17.187500f, -11.359375f, 14.453125f, 15.328125f, 2.519531f, 7.617188f, 11.328125f, -6.832031f, 1.128906f, -3.039062f, -12.773438f, 2.777344f, -11.875000f, -27.343750f, 7.101562f, 20.359375f, -9.703125f, 20.718750f, 4.316406f, -14.218750f, 1.390625f, 25.484375f, 19.781250f, 14.335938f, -6.742188f, -7.476562f, 8.773438f, -7.824219f, 7.574219f, -10.812500f, -16.125000f, -21.937500f, -7.820312f, -2.130859f, 8.617188f, 4.464844f, 7.679688f, -15.234375f, 5.023438f, 0.058594f, -9.492188f, 3.390625f, 4.867188f, -15.601562f, -10.156250f, 4.195312f, 13.460938f, 9.609375f, -33.093750f, -3.789062f, 12.031250f, -9.429688f, -15.421875f, -15.156250f, -2.250000f, 15.976562f, 0.785156f, 11.398438f, 7.261719f, -2.595703f, 15.328125f, -32.625000f, -14.382812f, 20.843750f, -0.351562f, 14.632812f, -0.238281f, 18.375000f, -4.125000f, -28.468750f, 2.968750f, -13.156250f, -31.968750f, 26.218750f, 28.343750f, -6.664062f, -20.281250f, -2.992188f, 1.328125f, -23.078125f, 9.882812f, 11.789062f, 22.375000f, 7.695312f, -12.281250f, 4.875000f, 8.945312f, 25.875000f, -7.632812f, -12.609375f, -10.953125f, 12.226562f, 5.714844f, 4.515625f, 22.375000f, -18.562500f, 15.648438f, -2.878906f, -19.421875f, -3.978516f, -11.023438f, -7.363281f, -14.968750f, 6.640625f, -26.468750f, 2.660156f, -17.703125f, -3.382812f, -12.546875f, 12.460938f, 8.570312f, 6.488281f, 5.480469f, -14.406250f, -18.093750f, -15.101562f, -0.876953f, -2.632812f, 1.765625f, -4.187500f, -0.742188f, 9.343750f, 8.179688f, -3.560547f, 20.937500f, 6.703125f, 22.093750f, 15.492188f, 22.031250f, 3.214844f, -13.515625f, -19.671875f, 8.390625f, 7.406250f, 20.578125f, -3.625000f, -12.335938f, 3.023438f, -25.343750f, -21.718750f, -2.761719f, -9.828125f, 20.593750f, -10.257812f, -2.289062f, 6.164062f, -13.093750f, 4.886719f, -8.148438f, 7.179688f, -6.699219f, -9.437500f, -26.906250f, -4.515625f, -14.335938f, -22.546875f, -20.906250f, 6.792969f, -0.900391f, 9.015625f, 17.156250f, -20.593750f, -4.914062f, 41.531250f, 3.750000f, 22.921875f, 4.429688f, 7.847656f, 9.312500f, -4.593750f, -2.648438f, -2.789062f, -10.125000f, -11.757812f, -21.625000f, 18.656250f, -31.421875f, 4.835938f, 7.800781f, 7.781250f, -12.085938f, 11.812500f, -22.562500f, -7.863281f, 15.351562f, 8.437500f, -19.375000f, 16.421875f, 6.125000f, 21.687500f, 6.957031f, -3.652344f, 3.351562f, -17.593750f, -19.890625f, 20.875000f, -23.921875f, -7.156250f, -12.507812f, 15.414062f, 23.625000f, -5.242188f, -12.703125f, 6.156250f, 5.460938f, 1.125977f, 7.125000f, -16.156250f, 6.929688f, 10.484375f, -4.492188f, -5.289062f, -5.875000f, 7.214844f, 7.562500f, 7.324219f, 9.453125f, -17.156250f, 6.265625f, 12.593750f, 10.484375f, -10.171875f, 3.306641f, 10.328125f, 7.070312f, -11.859375f, 2.560547f, -4.820312f, -18.250000f, 7.679688f, 15.585938f, 11.773438f, 23.437500f, -8.523438f, 2.781250f, -23.375000f, 18.390625f, 11.687500f, 6.601562f, 2.757812f, 10.773438f, -11.390625f, -13.156250f, -14.281250f, 1.554688f, -5.984375f, 27.156250f, -8.875000f, 12.398438f, -12.109375f, 23.656250f, 4.828125f, 7.718750f, -18.187500f, 15.203125f, -22.796875f, 11.250000f, -24.343750f, -9.218750f, -3.195312f, 7.488281f, 24.500000f, -9.335938f, 18.781250f, 1.132812f, 20.093750f, -13.843750f, -15.593750f, 22.703125f, 25.093750f, -26.625000f, -24.375000f, -11.718750f, -4.191406f, 1.676758f, -4.109375f, -3.398438f, -12.984375f, 10.500000f, 13.921875f, -27.546875f, -26.156250f, -14.960938f, -9.257812f, -31.781250f, -41.875000f, -1.750000f, 5.949219f, -19.437500f, -0.667969f, 2.070312f, -14.453125f, 21.718750f, 6.687500f, 12.906250f, 13.421875f, -9.156250f, 8.070312f, 9.843750f, -8.250000f, -9.710938f, -13.234375f, 2.441406f, 29.875000f, 3.734375f, 6.914062f, 13.375000f, -26.375000f, 35.812500f, 9.578125f, -0.813965f, 15.984375f, 3.011719f, 16.656250f, 43.906250f, 3.738281f, 11.171875f, -1.574219f, -3.779297f, 16.812500f, 17.281250f, -5.812500f, -14.960938f, -0.590820f, 7.476562f, 18.046875f, -16.437500f, 15.625000f, 16.234375f, -4.570312f, -9.015625f, 12.757812f, -5.285156f, -15.265625f, 24.531250f, -11.328125f, -7.234375f, 11.304688f, 27.453125f, 0.003906f, -0.181641f, 7.484375f, 14.570312f, 2.576172f, -11.070312f, 3.261719f, -11.375000f, -6.425781f, 0.730469f, 1.804688f, -29.609375f, 25.406250f, 0.685547f, -3.457031f, -12.343750f, -17.031250f, 10.804688f, 8.390625f, 0.363770f, -2.277344f, -2.792969f, 32.468750f, 11.695312f, 6.695312f, -10.070312f, 18.937500f, 8.046875f, -18.421875f, 26.640625f, 3.562500f, 7.726562f, 12.882812f, -6.023438f, 14.968750f, 18.500000f, -23.796875f, 0.593750f, 21.531250f, -33.125000f, 15.000000f, 4.945312f, -6.707031f, 18.328125f, 1.902344f, -1.439453f, -10.226562f, -5.734375f, 16.531250f, 21.562500f, -9.984375f, 10.507812f, -4.265625f, -14.742188f, -9.710938f, 2.285156f, -10.929688f, -2.687500f, -29.593750f, 6.507812f, 4.164062f, 7.226562f, 14.718750f, -14.890625f, -1.921875f, -7.531250f, -6.675781f, 11.875000f, 1.542969f, -31.250000f, -14.484375f, -9.070312f, -11.226562f, 14.218750f, 6.859375f, -8.234375f, 27.718750f, 21.031250f, 10.429688f, 4.425781f, 9.437500f, 20.625000f, -5.539062f, -7.003906f, 15.593750f, 11.250000f, -3.250000f, -10.515625f, 10.046875f, -21.531250f, -18.984375f, 10.156250f, 10.023438f, 17.046875f, 10.273438f, -18.390625f, -11.250000f, -23.078125f, -19.625000f, -10.523438f, -28.453125f, 12.367188f, 17.843750f, -8.484375f, -19.828125f, -5.695312f, -8.835938f, -8.679688f, 0.187500f, 0.882812f, 11.820312f, 20.656250f, -17.125000f, -6.132812f, -0.085938f, -15.125000f, -3.101562f, -22.859375f, -6.628906f, 1.041016f, 23.078125f, -20.656250f, -16.593750f, 5.339844f, -1.136719f, -4.046875f, 3.927734f, -7.980469f, 7.546875f, -14.757812f, 5.246094f, -20.625000f, -5.308594f, -2.882812f, -0.539062f, -19.859375f, -4.707031f, 0.445312f, 4.335938f, 19.562500f, 7.675781f, -7.054688f, -12.757812f, -16.468750f, -18.531250f, 17.656250f, -3.580078f, -0.680664f, 12.093750f, 18.484375f, -13.437500f, 33.375000f, 0.429688f, -18.812500f, 42.750000f, 5.054688f, -1.609375f, -18.093750f, -2.625000f, 20.031250f, 29.859375f, 0.807617f, 19.953125f, 6.277344f, 0.660156f, 7.210938f, -6.695312f, 29.796875f, -7.695312f, -15.929688f, 20.312500f, -0.093750f, 11.000000f, 12.906250f, -17.015625f, -6.097656f, -22.734375f, 12.593750f, -10.484375f, 5.683594f, -12.265625f, 10.335938f, 23.562500f, 2.462891f, -31.312500f, 15.656250f, -15.484375f, -2.652344f, 11.562500f, 1.804688f, -7.855469f, -6.132812f, 4.796875f, -18.656250f, 4.117188f, -2.015625f, 30.687500f, -0.105469f, 27.312500f, -11.335938f, -2.429688f, 10.023438f, -22.328125f, 9.703125f, 6.960938f, -1.568359f, -24.968750f, -0.080078f, 2.738281f, 16.515625f, 3.257812f, -5.312500f, 7.937500f, 8.625000f, 23.281250f, -21.890625f, -3.988281f, 15.578125f, -1.515625f, -4.363281f, 2.601562f, 9.359375f, -1.267578f, 8.609375f, -2.376953f, -27.328125f, 4.085938f, 32.125000f, -2.035156f, -21.671875f, -10.234375f, -12.953125f, 6.320312f, -23.562500f, 25.656250f, 29.000000f, -3.523438f, -3.164062f, -22.593750f, 21.578125f, 19.562500f, 10.914062f, 11.554688f, -1.558594f, -3.289062f, -4.070312f, -4.785156f, 1.683594f, -15.023438f, 10.007812f, 1.859375f, 7.812500f, 7.484375f, 10.414062f, 30.875000f, -16.968750f, 19.687500f, 10.601562f, -10.015625f, 14.671875f, 3.554688f, 13.000000f, 5.757812f, -19.734375f, -25.984375f, 6.207031f, -27.437500f, -4.218750f, 7.835938f, 13.656250f, 12.328125f, -21.984375f, 2.007812f, 21.218750f, -7.441406f, 12.820312f, -9.687500f, -2.687500f, -0.304688f, -3.390625f, -7.429688f, 24.500000f, -6.179688f, -1.363281f, 16.828125f, 2.927734f, -3.023438f, 9.250000f, 4.492188f, 9.914062f, 18.937500f, -25.796875f, -1.164062f, -1.531250f, -3.294922f, -9.234375f, 8.351562f, -32.218750f, -2.513672f, -12.750000f, -16.859375f, -9.015625f, 19.968750f, 3.968750f, 0.195312f, 9.070312f, 7.656250f, 7.980469f, -10.781250f, 3.937500f, -10.015625f, -26.187500f, 5.378906f, -25.546875f, 8.132812f, 2.480469f, 5.382812f, 22.234375f, -11.421875f, -18.250000f, 3.679688f, -16.234375f, 22.250000f, 18.312500f, -7.367188f, 29.843750f, -10.804688f, -24.734375f, 1.456055f, 12.265625f, -2.953125f, 30.015625f, -1.232422f, 6.652344f, -37.156250f, 9.296875f, -22.078125f, 2.361328f, -28.656250f, 6.550781f, -8.695312f, -19.984375f, -15.359375f, 30.218750f, 15.835938f, 1.640625f, 1.298828f, -3.867188f, -7.687500f, -20.234375f, -6.414062f, 25.578125f, 6.718750f, -5.320312f, 1.171875f, -15.906250f, -15.523438f, -7.503906f, -12.375000f, 1.992188f, -1.740234f, -6.585938f, 0.544922f, 8.109375f, 3.748047f, 17.234375f, 9.078125f, 40.937500f, -4.179688f, -12.453125f, -30.953125f, 0.696289f, -2.568359f, -26.203125f, 22.937500f, -11.226562f, 2.347656f, -9.062500f, 23.281250f, 6.375000f, -28.140625f, 0.019531f, -20.703125f, -18.281250f, -8.812500f, -20.187500f, 3.273438f, 39.093750f, -27.703125f, 4.250000f, -3.859375f, 3.085938f, 14.031250f, 10.945312f, 25.062500f, -18.578125f, -19.781250f, 25.593750f, -16.593750f, -8.500000f, -15.562500f, 6.328125f, 8.421875f, -0.828613f, -3.500000f, -15.898438f, -0.531250f, -29.890625f, 0.951172f, -12.296875f, 7.632812f, -17.656250f, 9.726562f, 28.171875f, 7.601562f, -21.843750f, 4.953125f, -29.765625f, -3.855469f, 21.906250f, 4.140625f, -3.904297f, 18.500000f, -14.898438f, -11.421875f, 2.562500f, 11.773438f, -7.851562f, 21.843750f, 17.281250f, 2.351562f, -18.000000f, 4.363281f, -19.500000f, 3.410156f, -8.929688f, 9.953125f, -18.093750f, -18.437500f, -21.437500f, -5.367188f, -18.468750f, 7.230469f, 14.281250f, -3.917969f, 3.769531f, 2.351562f, 8.195312f, -19.312500f, 19.484375f, -9.335938f, 6.101562f, -24.031250f, 0.807617f, 13.468750f, 0.347656f, -3.906250f, -7.820312f, -19.125000f, 24.421875f, -4.765625f, -5.429688f, -18.125000f, -11.859375f, 18.171875f, 2.519531f, 4.144531f, 17.828125f, -15.476562f, 0.359375f, 0.691406f, 5.722656f, 0.214844f, -5.929688f, -32.875000f, 23.750000f, -9.046875f, -1.644531f, 0.246094f, -25.062500f, 4.898438f, -13.875000f, -3.621094f, 12.117188f, -4.789062f, 13.734375f, -8.937500f, 13.484375f, -0.016602f, -11.468750f, 13.507812f, -12.609375f, -6.062500f, -4.945312f, 17.687500f, -17.078125f, -11.835938f, -13.171875f, -7.324219f, 3.058594f, -17.531250f, 23.062500f, 25.781250f, -2.968750f, -7.382812f, 14.578125f, -2.902344f, 13.812500f, 5.140625f, 25.906250f, -0.382812f, -36.812500f, -0.636719f, 40.875000f, 4.453125f, -18.281250f, -19.390625f, 5.046875f, -1.246094f, 3.093750f, 2.865234f, -3.035156f, -7.441406f, -15.953125f, -5.535156f, 12.585938f, -7.031250f, 14.648438f, 19.437500f, -9.187500f, -14.820312f, 10.593750f, 4.546875f, 4.546875f, 5.882812f, -7.515625f, -19.125000f, 12.117188f, 9.515625f, 9.710938f, 3.960938f, 22.515625f, 35.750000f, -19.265625f, -16.593750f, 9.609375f, -1.775391f, 0.779297f, 9.804688f, -17.453125f, -14.726562f, -33.593750f, 12.671875f, -6.324219f, 6.773438f, 20.687500f, 5.164062f, 10.937500f, -24.187500f, 2.314453f, 19.125000f, 15.859375f, -6.015625f, 20.953125f, 8.695312f, 11.789062f, -5.625000f, 8.515625f, 2.654297f, 13.445312f, 12.289062f, 17.406250f, 25.609375f, 14.484375f, -22.484375f, 19.406250f, 41.406250f, 14.281250f, -13.835938f, 11.726562f, 17.515625f, -15.890625f, 19.968750f, -10.062500f, 19.484375f, -3.306641f, -9.125000f, -5.007812f, 18.093750f, -8.000000f, -7.093750f, 10.046875f, 41.031250f, 3.859375f, -12.156250f, -19.515625f, 3.382812f, -7.570312f, -17.343750f, 12.929688f, 0.210938f, -11.281250f, -17.875000f, 25.750000f, 16.968750f, 13.421875f, -16.625000f, -7.511719f, -8.703125f, -14.835938f, 24.406250f, 6.324219f, 0.365234f, 3.332031f, -6.746094f, -6.136719f, -7.523438f, 13.593750f, 1.292969f, 8.257812f, 12.171875f, 4.335938f, 22.796875f, 13.968750f, 2.335938f, 5.964844f, -3.367188f, -3.218750f, -26.500000f, 7.656250f, 6.554688f, 10.484375f, 5.539062f, -14.851562f, -3.347656f, -7.957031f, 12.242188f, 25.093750f, -5.691406f, -32.125000f, 0.250000f, 31.843750f, -6.894531f, -4.437500f, -7.039062f, 21.703125f, -21.828125f, 2.408203f, 12.078125f, -21.265625f, 7.687500f, -0.779297f, 0.757812f, -16.046875f, -22.593750f, 27.562500f, 7.082031f, -5.593750f, -4.425781f, 14.445312f, -11.039062f, 8.500000f, -15.875000f, 1.264648f, -25.000000f, -11.234375f, 36.125000f, -6.667969f, 0.757812f, 9.507812f, -10.546875f, 18.765625f, -9.234375f, -14.554688f, -3.113281f, -19.984375f, -1.567383f, -1.138672f, 11.429688f, -0.296875f, 2.433594f, 13.234375f, -4.878906f, -6.359375f, 0.265625f, -23.171875f, -22.031250f, -11.429688f, 12.406250f, 15.507812f, 3.179688f, 17.671875f, 27.109375f, 20.515625f, -13.281250f, -22.687500f, 6.976562f, -6.078125f, 1.257812f, 8.140625f, -18.828125f, -12.203125f, -3.902344f, 5.777344f, -7.011719f, 7.691406f, -9.382812f, -10.664062f, 14.031250f, -32.125000f, 10.828125f, 3.046875f, -19.109375f, 10.554688f, 27.593750f, 12.648438f, -2.437500f, 23.796875f, 14.140625f, 0.273438f, -13.710938f, 14.859375f, 2.636719f, -5.421875f, -8.289062f, -6.437500f, -7.640625f, -3.351562f, -1.478516f, -12.265625f, 0.445312f, -22.968750f, -21.500000f, -11.781250f, -25.921875f, 17.234375f, -8.351562f, -2.953125f, -7.679688f, -27.812500f, -12.890625f, -21.218750f, -1.308594f, 12.367188f, -8.179688f, -14.328125f, -20.718750f, 16.156250f, 43.875000f, 10.062500f, -18.265625f, 16.437500f, -1.335938f, 4.046875f, 6.089844f, 13.000000f, 31.734375f, 5.886719f, -12.367188f, 6.457031f, 8.820312f, -21.531250f, 1.140625f, -13.921875f, -0.312500f, 1.376953f, -18.093750f, -6.792969f, 2.847656f, -3.933594f, -18.125000f, -2.546875f, 11.296875f, 9.421875f, -8.023438f, -11.890625f, -14.546875f, 8.218750f, -2.937500f, 18.968750f, 8.859375f, -9.218750f, -7.421875f, 25.390625f, 15.820312f, 4.902344f, 12.984375f, 2.277344f, 10.312500f, 14.109375f, 6.382812f, 16.843750f, 0.937500f, -14.585938f, -12.039062f, 11.195312f, -6.625000f, 22.437500f, -11.890625f, 13.468750f, 8.273438f, 14.062500f, 4.281250f, 11.953125f, -1.031250f, -12.218750f, 0.167969f, 7.363281f, 15.531250f, -0.921875f, 19.718750f, 11.554688f, -15.281250f, 31.906250f, -13.070312f, -23.828125f, -11.554688f, -5.839844f, -29.921875f, 21.937500f, 13.054688f, -5.527344f, -10.640625f, 0.281250f, -7.152344f, -2.437500f, 17.437500f, -9.148438f, -6.183594f, 14.562500f, 23.390625f, 4.976562f, -3.000000f, 0.945312f, -23.875000f, -5.250000f, -11.093750f, -19.500000f, -5.125000f, 0.161133f, 2.429688f, 8.734375f, -1.078125f, -8.875000f, -20.593750f, 12.765625f, 12.031250f, -1.864258f, -18.109375f, -18.609375f, -18.781250f, -10.695312f, -2.140625f, 15.296875f, -17.359375f, 0.664062f, 22.500000f, -18.593750f, -5.875000f, 19.500000f, 5.945312f, 9.203125f, -12.796875f, -9.828125f, -9.492188f, -6.980469f, 9.742188f, -13.062500f, 8.250000f, 12.085938f, 21.718750f, -12.234375f, -5.972656f, -4.867188f, -13.390625f, -10.109375f, -39.062500f, 15.296875f, 1.203125f }; + +#endif /* DATA_H_ */ diff --git a/tests/spatz_on_magia/onnx_add/test_data/generator.py b/tests/spatz_on_magia/onnx_add/test_data/generator.py new file mode 100644 index 00000000..9034e927 --- /dev/null +++ b/tests/spatz_on_magia/onnx_add/test_data/generator.py @@ -0,0 +1,76 @@ +import os +import sys +import numpy as np +import onnx +import onnxruntime as ort +from onnx import helper, TensorProto + +def parse_args(): + if len(sys.argv) != 2: + print("Error: missing argument ") + print("Usage: python3 generator.py ") + sys.exit(1) + + try: + length = int(sys.argv[1]) + except ValueError: + print("Error: must be an integer") + print("Usage: python3 generator.py ") + sys.exit(1) + + return length + +def run_onnx_add(vec_a, vec_b): + a_info = helper.make_tensor_value_info('A', TensorProto.FLOAT16, vec_a.shape) + b_info = helper.make_tensor_value_info('B', TensorProto.FLOAT16, vec_b.shape) + out_info = helper.make_tensor_value_info('Sum', TensorProto.FLOAT16, vec_a.shape) + + node_def = helper.make_node('Add', ['A', 'B'], ['Sum']) + graph_def = helper.make_graph( + [node_def], + 'onnx-add-test', + [a_info, b_info], + [out_info] + ) + model_def = helper.make_model(graph_def, producer_name='onnx-generator') + + sess = ort.InferenceSession(model_def.SerializeToString()) + res = sess.run(None, {'A': vec_a, 'B': vec_b}) + + return res[0] + +def format_array(array): + return "{ " + ", ".join(f"{x:f}f" for x in array) + " }" + +def generate_header_file(length, vec_a, vec_b, expected, filename="data.h"): + + script_dir = os.path.dirname(os.path.abspath(__file__)) + filepath = os.path.join(script_dir, filename) + + with open(filepath, "w") as f: + f.write("/* Automatically generated header file for Spatz ONNX testing */\n") + f.write("#ifndef DATA_H_\n") + f.write("#define DATA_H_\n\n") + + f.write(f"#define LEN {length}\n\n") + + f.write(f"static const float16 vec_a[] = {format_array(vec_a)};\n") + f.write(f"static const float16 vec_b[] = {format_array(vec_b)};\n") + f.write(f"static const float16 expected[] = {format_array(expected)};\n\n") + + f.write("#endif /* DATA_H_ */\n") + +def main(): + length = parse_args() + + vec_a = (np.random.randn(length) * 10).astype(np.float16) + vec_b = (np.random.randn(length) * 10).astype(np.float16) + + expected = run_onnx_add(vec_a, vec_b) + + generate_header_file(length, vec_a, vec_b, expected) + + print(f"File 'data.h' successfully generated with {length} elements.") + +if __name__ == "__main__": + main() diff --git a/tests/utils/compare_utils.h b/tests/utils/compare_utils.h new file mode 100644 index 00000000..279661f7 --- /dev/null +++ b/tests/utils/compare_utils.h @@ -0,0 +1,35 @@ +#ifndef COMPARE_UTILS_H_ +#define COMPARE_UTILS_H_ + +#include + +#include "magia_tile_utils.h" + +#define TOLL 0.004f + +static inline bool vector_compare_fp16(uintptr_t addr_res, uintptr_t addr_exp, int len) { + uint32_t offset; + float abs_diff; + float computed; + float expected; + bool ret; + + ret = true; + for (int i = 0; i < len; i++) { + offset = i * sizeof(float16); + + computed = (float)mmio_fp16(addr_res + offset); + expected = (float)mmio_fp16(addr_exp + offset); + + abs_diff = fabs(computed - expected); + + if (abs_diff > TOLL) { + printf("Mismatch at index %d\n", i); + ret = false; + } + } + + return ret; +} + +#endif /* COMPARE_UTILS_H_ */ diff --git a/tests/utils/magia_tile_utils.h b/tests/utils/magia_tile_utils.h index 38e57896..e050b0a0 100644 --- a/tests/utils/magia_tile_utils.h +++ b/tests/utils/magia_tile_utils.h @@ -63,6 +63,10 @@ #define mmio16(x) (*(volatile uint16_t *)(x)) #define mmio8(x) (*(volatile uint8_t *)(x)) +#define mmio_fp64(x) (*(volatile float64 *)(x)) +#define mmio_fp32(x) (*(volatile float32 *)(x)) +#define mmio_fp16(x) (*(volatile float16 *)(x)) + // Spatz Control: Use magia_spatz_utils.h for Spatz programming functions #define addr64(x) (*(uint64_t *)(&x)) From 7a2e820a9456d44d6f1cb304ce8cf3ec1b789d98 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 13 Feb 2026 09:01:36 +0100 Subject: [PATCH 31/67] [targets/magia_v2] tile_add_map: change number of tiles to 1 --- targets/magia_v2/include/addr_map/tile_addr_map.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/targets/magia_v2/include/addr_map/tile_addr_map.h b/targets/magia_v2/include/addr_map/tile_addr_map.h index aad50ee4..266f09b4 100644 --- a/targets/magia_v2/include/addr_map/tile_addr_map.h +++ b/targets/magia_v2/include/addr_map/tile_addr_map.h @@ -54,11 +54,11 @@ #define IDMA_BASE_AXI2OBI (IDMA_BASE) // direction=0, L2 to L1 #define IDMA_BASE_OBI2AXI (IDMA_BASE + 0x200) // direction=1, L1 to L2 -#define MESH_X_TILES 2 -#define MESH_Y_TILES 2 +#define MESH_X_TILES 1 +#define MESH_Y_TILES 1 #define NUM_HARTS (MESH_X_TILES*MESH_Y_TILES) -#define MAX_SYNC_LVL 2 -#define MESH_2_POWER 1 +#define MAX_SYNC_LVL 0 +#define MESH_2_POWER 0 #define STR_OFFSET (0x00000000) #define STR_BASE (RESERVED_START + STR_OFFSET) From 129f8995e7ca1ce08f13e403771a4d23e1a0b6b0 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 13 Feb 2026 09:25:07 +0100 Subject: [PATCH 32/67] [cmake] spatz_helpers.cmake: Improve Spatz task build logic --- cmake/spatz_helpers.cmake | 135 +++++++++++++++--- .../spatz_on_magia/double_task/CMakeLists.txt | 15 +- .../spatz_on_magia/hello_spatz/CMakeLists.txt | 15 +- tests/spatz_on_magia/hello_spatz/main.c | 2 +- tests/spatz_on_magia/onnx_add/CMakeLists.txt | 15 +- 5 files changed, 128 insertions(+), 54 deletions(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 6bfd2505..60591771 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -1,15 +1,61 @@ -# Spatz task compilation and embedding helpers +# ============================================================================ +# Spatz Task Compilation and Embedding Helpers +# ============================================================================ +# +# This module provides two main CMake functions for building Spatz tasks +# and embedding them in CV32 executables: +# +# 1. add_spatz_task() +# - Compiles Spatz task binary +# - Generates header with embedded binary + task symbols +# - Outputs to: build/bin/spatz_on_magia//spatz_task/ +# +# 2. add_cv32_executable_with_spatz() +# - Builds CV32 executable with embedded Spatz binary +# - Generates disassembly and simulation stimuli +# - Outputs to: build/bin/ +# build/bin/spatz_on_magia//stim/ +# ============================================================================ include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) # Function: add_spatz_task # Compiles Spatz task binary, generates header with binary array + task symbols, and stimuli +# Parameters: +# TEST_NAME (required): Task identifier used for output file naming +# TASK_SOURCES (required): List of source files to compile +# CRT0_SRC: Path to CRT0 assembly (default: SPATZ_CRT0_SRC from config) +# LINKER_SCRIPT: Path to linker script (default: SPATZ_LINK_SCRIPT from config) +# OUTPUT_DIR: Base output directory (default: CMAKE_BINARY_DIR) +# OUTPUT_SPATZ_DIR: Spatz task output directory +# - If provided: use it directly +# - If not provided: use ${OUTPUT_DIR}/bin/spatz_on_magia/${TEST_NAME}/spatz_task +# OUTPUT_VAR: CMake variable to store TASK_HEADER path (default: ${TEST_NAME}_SPATZ_HEADER) +# FIRST_TASK_NAME: Entry point function name (default: ${TEST_NAME}_task) +# INCLUDE_DIRS: Additional include directories function(add_spatz_task) set(options) - set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_SPATZ_DIR OUTPUT_VAR) - set(multiValueArgs TASK_SOURCES FIRST_TASK_NAME INCLUDE_DIRS) + set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_SPATZ_DIR OUTPUT_VAR FIRST_TASK_NAME) + set(multiValueArgs TASK_SOURCES INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + # Apply defaults for optional parameters + if(NOT DEFINED ARG_CRT0_SRC) + set(ARG_CRT0_SRC ${SPATZ_CRT0_SRC}) + endif() + if(NOT DEFINED ARG_LINKER_SCRIPT) + set(ARG_LINKER_SCRIPT ${SPATZ_LINK_SCRIPT}) + endif() + if(NOT DEFINED ARG_OUTPUT_DIR) + set(ARG_OUTPUT_DIR ${CMAKE_BINARY_DIR}) + endif() + if(NOT DEFINED ARG_OUTPUT_VAR) + set(ARG_OUTPUT_VAR ${ARG_TEST_NAME}_SPATZ_HEADER) + endif() + if(NOT DEFINED ARG_FIRST_TASK_NAME) + set(ARG_FIRST_TASK_NAME ${ARG_TEST_NAME}_task) + endif() + if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") endif() @@ -17,21 +63,31 @@ function(add_spatz_task) set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") endif() - # Use OUTPUT_SPATZ_DIR if provided, otherwise use OUTPUT_DIR - if(ARG_OUTPUT_SPATZ_DIR) - set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_SPATZ_DIR}") - else() - set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_DIR}") + # Compute OUTPUT_SPATZ_DIR default if not provided + if(NOT DEFINED ARG_OUTPUT_SPATZ_DIR) + set(ARG_OUTPUT_SPATZ_DIR "${ARG_OUTPUT_DIR}/bin/spatz_on_magia/${ARG_TEST_NAME}/spatz_task") endif() + set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_SPATZ_DIR}") # Create output directory if it doesn't exist file(MAKE_DIRECTORY "${SPATZ_OUTPUT_DIR}") - set(TASK_CRT0_OBJ "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_crt0.o") - set(TASK_ELF "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.elf") - set(TASK_BIN "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.bin") - set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task_bin.h") - set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${ARG_TEST_NAME}_task.dump") + # Compute filename prefix: avoid double "_task" if TEST_NAME already ends with "_task" + # Logic: if TEST_NAME ends with "_task", use as-is; otherwise append "_task" + string(REGEX MATCH "_task$" HAS_TASK_SUFFIX "${ARG_TEST_NAME}") + if(HAS_TASK_SUFFIX) + # TEST_NAME already ends with "_task" (e.g., "double_task" -> use "double_task" directly) + set(FILE_PREFIX "${ARG_TEST_NAME}") + else() + # TEST_NAME doesn't end with "_task" (e.g., "hello_spatz" -> append "_task") + set(FILE_PREFIX "${ARG_TEST_NAME}_task") + endif() + + set(TASK_CRT0_OBJ "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_crt0.o") + set(TASK_ELF "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.elf") + set(TASK_BIN "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.bin") + set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_bin.h") + set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.dump") set(INCLUDE_FLAGS "") foreach(INCLUDE_DIR ${ARG_INCLUDE_DIRS}) @@ -116,18 +172,43 @@ function(add_spatz_task) ${TASK_DUMP} ) + # Export to parent scope set(${ARG_OUTPUT_VAR} ${TASK_HEADER} PARENT_SCOPE) set(${ARG_TEST_NAME}_TASK_BIN ${TASK_BIN} PARENT_SCOPE) + set(${ARG_TEST_NAME}_TASK_HEADER ${TASK_HEADER} PARENT_SCOPE) + set(${ARG_TEST_NAME}_SPATZ_OUTPUT_DIR ${SPATZ_OUTPUT_DIR} PARENT_SCOPE) + # Also set generic SPATZ_HEADER for convenience when TEST_NAME==TARGET_NAME + set(SPATZ_HEADER ${TASK_HEADER} PARENT_SCOPE) + set(SPATZ_TASK_NAME ${ARG_TEST_NAME} PARENT_SCOPE) endfunction() # Function: add_cv32_executable_with_spatz -# Builds CV32 executable with embedded Spatz task binary +# Builds CV32 executable with embedded Spatz task binary and generates disassembly/stimuli +# Parameters: +# TARGET_NAME (required): Executable name +# SPATZ_HEADER (required): Path to Spatz task header file +# SOURCES (required): List of source files to compile +# CRT0_SRC: Path to CV32 CRT0 assembly (default: CV32_CRT0_SRC from config) +# LINK_SCRIPT: Path to CV32 linker script (default: CV32_LINK_SCRIPT from config) +# INCLUDE_DIRS: Additional include directories +# Output locations: +# Executable: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME} +# Disassembly: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.s +# Stimuli files: ${CMAKE_BINARY_DIR}/bin/spatz_on_magia/${TARGET_NAME}/stim/ function(add_cv32_executable_with_spatz) set(options) set(oneValueArgs TARGET_NAME SPATZ_HEADER LINK_SCRIPT CRT0_SRC) set(multiValueArgs SOURCES INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + # Apply defaults for optional parameters + if(NOT DEFINED ARG_CRT0_SRC) + set(ARG_CRT0_SRC ${CV32_CRT0_SRC}) + endif() + if(NOT DEFINED ARG_LINK_SCRIPT) + set(ARG_LINK_SCRIPT ${CV32_LINK_SCRIPT}) + endif() + if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") endif() @@ -187,19 +268,27 @@ function(add_cv32_executable_with_spatz) endif() if(ARG_SPATZ_HEADER) - get_filename_component(HEADER_FILENAME "${ARG_SPATZ_HEADER}" NAME) - string(REGEX REPLACE "_task_bin.*$" "" TEST_NAME "${HEADER_FILENAME}") - add_dependencies(${ARG_TARGET_NAME} ${TEST_NAME}_spatz_header) + # Use SPATZ_TASK_NAME if available (set by add_spatz_task), otherwise extract from header filename + if(DEFINED SPATZ_TASK_NAME) + set(EXTRACTED_TEST_NAME ${SPATZ_TASK_NAME}) + else() + # Fallback: extract TEST_NAME from header filename (legacy support) + get_filename_component(HEADER_FILENAME "${ARG_SPATZ_HEADER}" NAME) + string(REGEX REPLACE "_task_bin.*$" "" EXTRACTED_TEST_NAME "${HEADER_FILENAME}") + endif() + add_dependencies(${ARG_TARGET_NAME} ${EXTRACTED_TEST_NAME}_spatz_header) endif() # Post-build: disassembly and stimuli [MAGIA/Makefile: $(STIM_INSTR) $(STIM_DATA)] + set(STIM_DIR "${CMAKE_BINARY_DIR}/bin/spatz_on_magia/${ARG_TARGET_NAME}/stim/") set(ELF_DUMP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${ARG_TARGET_NAME}.s") - set(ELF_OBJDUMP "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.objdump") - set(ELF_ITB "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.itb") - set(ELF_S19 "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.s19") - set(ELF_TXT "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}.txt") - set(STIM_INSTR "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}_stim_instr.txt") - set(STIM_DATA "${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}_stim_data.txt") + set(ELF_OBJDUMP "${STIM_DIR}${ARG_TARGET_NAME}.objdump") + set(ELF_ITB "${STIM_DIR}${ARG_TARGET_NAME}.itb") + set(ELF_S19 "${STIM_DIR}${ARG_TARGET_NAME}.s19") + set(ELF_TXT "${STIM_DIR}${ARG_TARGET_NAME}.txt") + set(STIM_INSTR "${STIM_DIR}${ARG_TARGET_NAME}_stim_instr.txt") + set(STIM_DATA "${STIM_DIR}${ARG_TARGET_NAME}_stim_data.txt") + file(MAKE_DIRECTORY "${STIM_DIR}") add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -D -S $ > ${ELF_DUMP} diff --git a/tests/spatz_on_magia/double_task/CMakeLists.txt b/tests/spatz_on_magia/double_task/CMakeLists.txt index b2ecaa1e..ddd8f35b 100644 --- a/tests/spatz_on_magia/double_task/CMakeLists.txt +++ b/tests/spatz_on_magia/double_task/CMakeLists.txt @@ -1,25 +1,20 @@ +set(TEST_NAME double_task) + # Compile Spatz task add_spatz_task( - TEST_NAME double - CRT0_SRC ${SPATZ_CRT0_SRC} + TEST_NAME ${TEST_NAME} TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/idma_task.c - LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} - OUTPUT_DIR ${CMAKE_BINARY_DIR} - OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/double_task - OUTPUT_VAR HELLO_SPATZ_HEADER FIRST_TASK_NAME hello_task INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( - TARGET_NAME double_task - SPATZ_HEADER ${HELLO_SPATZ_HEADER} - CRT0_SRC ${CV32_CRT0_SRC} + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c - LINK_SCRIPT ${CV32_LINK_SCRIPT} INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt index 3ae6d622..fcc80b54 100644 --- a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -1,23 +1,18 @@ +set(TEST_NAME hello_spatz) + # Compile Spatz task add_spatz_task( - TEST_NAME hello - CRT0_SRC ${SPATZ_CRT0_SRC} + TEST_NAME ${TEST_NAME} TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c - LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} - OUTPUT_DIR ${CMAKE_BINARY_DIR} - OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/hello_spatz - OUTPUT_VAR HELLO_SPATZ_HEADER FIRST_TASK_NAME hello_task INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( - TARGET_NAME hello_spatz - SPATZ_HEADER ${HELLO_SPATZ_HEADER} - CRT0_SRC ${CV32_CRT0_SRC} + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c - LINK_SCRIPT ${CV32_LINK_SCRIPT} INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) diff --git a/tests/spatz_on_magia/hello_spatz/main.c b/tests/spatz_on_magia/hello_spatz/main.c index 3faa7da5..f61a8b8f 100644 --- a/tests/spatz_on_magia/hello_spatz/main.c +++ b/tests/spatz_on_magia/hello_spatz/main.c @@ -1,7 +1,7 @@ #include "magia_tile_utils.h" #include "magia_spatz_utils.h" #include "event_unit_utils.h" -#include "hello_task_bin.h" +#include "hello_spatz_task_bin.h" int main(void) { diff --git a/tests/spatz_on_magia/onnx_add/CMakeLists.txt b/tests/spatz_on_magia/onnx_add/CMakeLists.txt index e72cbdd4..af7aaffc 100644 --- a/tests/spatz_on_magia/onnx_add/CMakeLists.txt +++ b/tests/spatz_on_magia/onnx_add/CMakeLists.txt @@ -1,12 +1,9 @@ +set(TEST_NAME onnx_add) + # Compile Spatz task add_spatz_task( - TEST_NAME onnx_add - CRT0_SRC ${SPATZ_CRT0_SRC} + TEST_NAME ${TEST_NAME} TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/onnx_add_task.c - LINKER_SCRIPT ${SPATZ_LINK_SCRIPT} - OUTPUT_DIR ${CMAKE_BINARY_DIR} - OUTPUT_SPATZ_DIR ${CMAKE_BINARY_DIR}/bin/spatz/onnx_add - OUTPUT_VAR ONNX_ADD_HEADER FIRST_TASK_NAME onnx_add_task INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils @@ -16,11 +13,9 @@ add_spatz_task( # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( - TARGET_NAME onnx_add - SPATZ_HEADER ${ONNX_ADD_HEADER} - CRT0_SRC ${CV32_CRT0_SRC} + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c - LINK_SCRIPT ${CV32_LINK_SCRIPT} INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ${CMAKE_CURRENT_SOURCE_DIR}/test_data From f0a04cd6867dfe5aee8d84a57685e2e3d4b0ed1f Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 16 Feb 2026 16:55:39 +0100 Subject: [PATCH 33/67] [targets/magia_v2/include] Port utility header from MAGIA to magia v2 --- cmake/spatz_helpers.cmake | 16 +- .../magia_v2/include/addr_map/tile_addr_map.h | 10 +- targets/magia_v2/include/regs/tile_ctrl.h | 21 +- targets/magia_v2/include/tile.h | 5 +- targets/magia_v2/include/utils/amo_utils.h | 4 +- .../magia_v2/include}/utils/compare_utils.h | 2 + .../include}/utils/event_unit_utils.h | 90 +-- .../magia_v2/include/utils/fsync_isa_utils.h | 77 +- .../magia_v2/include}/utils/idma_mm_utils.h | 34 +- targets/magia_v2/include/utils/io.h | 4 +- .../include}/utils/magia_spatz_utils.h | 3 +- .../magia_v2/include/utils/magia_tile_utils.h | 77 +- targets/magia_v2/include/utils/magia_utils.h | 10 +- .../include/utils/performance_utils.h | 4 +- targets/magia_v2/include/utils/printf.h | 4 +- .../magia_v2/include/utils/printf_wrapper.h | 11 + .../include}/utils/redmule_mm_utils.h | 19 +- .../include/utils/spatz_perf_counters.h | 0 targets/magia_v2/include/utils/tinyprintf.h | 15 +- .../spatz_on_magia/double_task/CMakeLists.txt | 3 - .../spatz_on_magia/hello_spatz/CMakeLists.txt | 3 - tests/spatz_on_magia/onnx_add/CMakeLists.txt | 2 - tests/utils/magia_tile_utils.h | 241 ------ tests/utils/magia_utils.h | 143 ---- tests/utils/tinyprintf.h | 702 ------------------ 25 files changed, 192 insertions(+), 1308 deletions(-) rename {tests => targets/magia_v2/include}/utils/compare_utils.h (94%) rename {tests => targets/magia_v2/include}/utils/event_unit_utils.h (70%) rename {tests => targets/magia_v2/include}/utils/idma_mm_utils.h (82%) rename {tests => targets/magia_v2/include}/utils/magia_spatz_utils.h (97%) create mode 100644 targets/magia_v2/include/utils/printf_wrapper.h rename {tests => targets/magia_v2/include}/utils/redmule_mm_utils.h (87%) rename tests/utils/perf_counters.h => targets/magia_v2/include/utils/spatz_perf_counters.h (100%) delete mode 100644 tests/utils/magia_tile_utils.h delete mode 100644 tests/utils/magia_utils.h delete mode 100644 tests/utils/tinyprintf.h diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 60591771..b0d8374c 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -90,6 +90,12 @@ function(add_spatz_task) set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.dump") set(INCLUDE_FLAGS "") + # Add targets/magia_v2 include paths + list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include") + list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils") + list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map") + list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs") + # Add user-provided include directories foreach(INCLUDE_DIR ${ARG_INCLUDE_DIRS}) list(APPEND INCLUDE_FLAGS "-I${INCLUDE_DIR}") endforeach() @@ -112,6 +118,7 @@ function(add_spatz_task) COMMAND ${SPATZ_CLANG} ${SPATZ_COMPILE_FLAGS} ${SPATZ_CFLAGS_DEFINES} + -DSPATZ_TARGET ${INCLUDE_FLAGS} ${SPATZ_LINK_FLAGS} -T${ARG_LINKER_SCRIPT} @@ -216,12 +223,17 @@ function(add_cv32_executable_with_spatz) set(ARG_LINK_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINK_SCRIPT}") endif() - add_executable(${ARG_TARGET_NAME} ${ARG_CRT0_SRC} ${ARG_SOURCES}) + # Add io.c source to provide string functions for printf/prf.h + set(IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") + add_executable(${ARG_TARGET_NAME} ${ARG_CRT0_SRC} ${ARG_SOURCES} ${IO_SRC}) target_include_directories(${ARG_TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/inc - ${CMAKE_SOURCE_DIR}/tests/utils + ${CMAKE_SOURCE_DIR}/targets/magia_v2/include + ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils + ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map + ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs ${CMAKE_SOURCE_DIR}/hal/include ${CMAKE_SOURCE_DIR}/drivers/eventunit32/include ${ARG_INCLUDE_DIRS} diff --git a/targets/magia_v2/include/addr_map/tile_addr_map.h b/targets/magia_v2/include/addr_map/tile_addr_map.h index 266f09b4..a81dc8f5 100644 --- a/targets/magia_v2/include/addr_map/tile_addr_map.h +++ b/targets/magia_v2/include/addr_map/tile_addr_map.h @@ -17,7 +17,7 @@ * Authors: Victor Isachi * Alberto Dequino * Luca Balboni - * + * * MAGIA Tile Address Map */ @@ -39,8 +39,10 @@ #define FSYNC_END (0x000006FF) #define EU_BASE (0x00000700) #define EU_END (0x000016FF) -#define RESERVED_START (0x00001700) -#define RESERVED_END (0x0000FFFF) +#define SPATZ_CTRL_BASE (0x00001700) +#define SPATZ_CTRL_END (0x000017FF) +#define RESERVED_START (0x00001800) +#define RESERVED_END (0x0000FFFF) #define STACK_START (0x00010000) #define STACK_END (0x0001FFFF) #define L1_BASE (0x00020000) @@ -114,4 +116,4 @@ // Hardware mutex registers (0x04 * mutex_id offset) #define EU_CORE_HW_MUTEX (EU_BASE + 0x0C0) // R/W: HW mutex management -#endif // _TILE_ADDR_MAP_INCLUDE_GUARD_ \ No newline at end of file +#endif // _TILE_ADDR_MAP_INCLUDE_GUARD_ diff --git a/targets/magia_v2/include/regs/tile_ctrl.h b/targets/magia_v2/include/regs/tile_ctrl.h index d4db7304..c3a6ed52 100644 --- a/targets/magia_v2/include/regs/tile_ctrl.h +++ b/targets/magia_v2/include/regs/tile_ctrl.h @@ -17,7 +17,7 @@ * Authors: Victor Isachi * Alberto Dequino * Luca Balboni - * + * * MAGIA Tile Control registers and IRQ */ @@ -50,7 +50,7 @@ #define EU_DMA_EVT_1_BIT (3) // DMA event 1 (error/status) #define EU_DMA_EVT_MASK (0x0000000C) // bits 3:2 -// Timer Events [5:4] - timer_events_i mapping +// Timer Events [5:4] - timer_events_i mapping #define EU_TIMER_EVT_0_BIT (4) // Timer event 0 #define EU_TIMER_EVT_1_BIT (5) // Timer event 1 #define EU_TIMER_EVT_MASK (0x00000030) // bits 5:4 @@ -88,7 +88,7 @@ // iDMA extended status via cluster events [31:26] #define EU_IDMA_A2O_ERROR_BIT (26) // iDMA AXI2OBI error -#define EU_IDMA_O2A_ERROR_BIT (27) // iDMA OBI2AXI error +#define EU_IDMA_O2A_ERROR_BIT (27) // iDMA OBI2AXI error #define EU_IDMA_A2O_START_BIT (28) // iDMA AXI2OBI start #define EU_IDMA_O2A_START_BIT (29) // iDMA OBI2AXI start #define EU_IDMA_A2O_BUSY_BIT (30) // iDMA AXI2OBI busy @@ -119,15 +119,22 @@ #define EU_SYNC_EVT_MASK (0x00000001) // bit 0 #define EU_DISPATCH_EVT_MASK (0x00000002) // bit 1 +// Spatz events (accelerator events [8] + cluster events [23]) +#define EU_SPATZ_DONE_BIT (8) // Spatz completion event (acc_events_array[0][0]) +#define EU_SPATZ_START_BIT (23) // Spatz start trigger event (other_events_array[0][23]) +#define EU_SPATZ_DONE_MASK (1 << EU_SPATZ_DONE_BIT) // 0x100 +#define EU_SPATZ_START_MASK (1 << EU_SPATZ_START_BIT) // 0x800000 +#define EU_SPATZ_ALL_MASK (EU_SPATZ_DONE_MASK | EU_SPATZ_START_MASK) // 0x800100 + //============================================================================= // IDMA Register Addresses //============================================================================= #define IDMA_CONF_OFFSET (0x00) -#define IDMA_STATUS_OFFSET (0x04) -#define IDMA_NEXT_ID_OFFSET (0x44) -#define IDMA_DONE_ID_OFFSET (0x84) +#define IDMA_STATUS_OFFSET (0x04) +#define IDMA_NEXT_ID_OFFSET (0x44) +#define IDMA_DONE_ID_OFFSET (0x84) #define IDMA_DST_ADDR_LOW_OFFSET (0xD0) #define IDMA_SRC_ADDR_LOW_OFFSET (0xD8) #define IDMA_LENGTH_LOW_OFFSET (0xE0) @@ -193,4 +200,4 @@ #define FSYNC_STATUS_BUSY_MASK (1 << 2) -#endif // _TILE_REG_DEFS_ \ No newline at end of file +#endif // _TILE_REG_DEFS_ diff --git a/targets/magia_v2/include/tile.h b/targets/magia_v2/include/tile.h index 55d511cf..e1d32589 100644 --- a/targets/magia_v2/include/tile.h +++ b/targets/magia_v2/include/tile.h @@ -11,8 +11,7 @@ #include #include "regs/tile_ctrl.h" #include "addr_map/tile_addr_map.h" -//#include "utils/tinyprintf.h" -#include "utils/printf.h" +#include "utils/printf_wrapper.h" #include "utils/magia_tile_utils.h" #include "utils/magia_utils.h" #include "utils/idma_isa_utils.h" @@ -23,4 +22,4 @@ //#include "utils/amo_utils.h" #include "utils/eu_isa_utils.h" -#endif //_TILE_INCLUDE_GUARD_ \ No newline at end of file +#endif //_TILE_INCLUDE_GUARD_ diff --git a/targets/magia_v2/include/utils/amo_utils.h b/targets/magia_v2/include/utils/amo_utils.h index 543cde8a..58069368 100644 --- a/targets/magia_v2/include/utils/amo_utils.h +++ b/targets/magia_v2/include/utils/amo_utils.h @@ -15,7 +15,7 @@ * SPDX-License-Identifier: Apache-2.0 * * Authors: Alberto Dequino - * + * * MAGIA Atomic Memory Operations Utils */ @@ -43,4 +43,4 @@ inline void amo_increment(volatile uint32_t addr){ asm volatile("amoadd.w t2, t1, (t0)" ::); } -#endif //AMO_UTILS_H \ No newline at end of file +#endif //AMO_UTILS_H diff --git a/tests/utils/compare_utils.h b/targets/magia_v2/include/utils/compare_utils.h similarity index 94% rename from tests/utils/compare_utils.h rename to targets/magia_v2/include/utils/compare_utils.h index 279661f7..08b6d16b 100644 --- a/tests/utils/compare_utils.h +++ b/targets/magia_v2/include/utils/compare_utils.h @@ -2,8 +2,10 @@ #define COMPARE_UTILS_H_ #include +#include #include "magia_tile_utils.h" +#include "printf_wrapper.h" #define TOLL 0.004f diff --git a/tests/utils/event_unit_utils.h b/targets/magia_v2/include/utils/event_unit_utils.h similarity index 70% rename from tests/utils/event_unit_utils.h rename to targets/magia_v2/include/utils/event_unit_utils.h index 754f9bb8..04954205 100644 --- a/tests/utils/event_unit_utils.h +++ b/targets/magia_v2/include/utils/event_unit_utils.h @@ -25,99 +25,13 @@ #include #include "magia_tile_utils.h" +#include "addr_map/tile_addr_map.h" +#include "regs/tile_ctrl.h" //============================================================================= // REGISTER DEFINITIONS AND CONSTANTS //============================================================================= -#define EU_BASE EVENT_UNIT_BASE - -// Control and status registers -#define EU_CORE_MASK (EU_BASE + 0x00) -#define EU_CORE_MASK_AND (EU_BASE + 0x04) -#define EU_CORE_MASK_OR (EU_BASE + 0x08) -#define EU_CORE_IRQ_MASK (EU_BASE + 0x0C) -#define EU_CORE_IRQ_MASK_AND (EU_BASE + 0x10) -#define EU_CORE_IRQ_MASK_OR (EU_BASE + 0x14) -#define EU_CORE_STATUS (EU_BASE + 0x18) -#define EU_CORE_BUFFER (EU_BASE + 0x1C) -#define EU_CORE_BUFFER_MASKED (EU_BASE + 0x20) -#define EU_CORE_BUFFER_IRQ_MASKED (EU_BASE + 0x24) -#define EU_CORE_BUFFER_CLEAR (EU_BASE + 0x28) - -// Wait registers (blocking with p.elw) -#define EU_CORE_EVENT_WAIT (EU_BASE + 0x38) -#define EU_CORE_EVENT_WAIT_CLEAR (EU_BASE + 0x3C) - -// Hardware mutex registers (0x04 * mutex_id offset) -#define EU_CORE_HW_MUTEX (EU_BASE + 0x0C0) // R/W: HW mutex management - -// Hardware barrier registers (0x20 * barr_id offset) -#define HW_BARR_TRIGGER_MASK (EU_BASE + 0x400) // R/W: Barrier trigger mask -#define HW_BARR_STATUS (EU_BASE + 0x404) // R: Barrier status -#define HW_BARR_TARGET_MASK (EU_BASE + 0x40C) // R/W: Barrier target mask -#define HW_BARR_TRIGGER (EU_BASE + 0x410) // W: Manual barrier trigger -#define HW_BARR_TRIGGER_SELF (EU_BASE + 0x414) // R: Automatic trigger -#define HW_BARR_TRIGGER_WAIT (EU_BASE + 0x418) // R: Trigger + sleep -#define HW_BARR_TRIGGER_WAIT_CLEAR (EU_BASE + 0x41C) // R: Trigger + sleep + clear - -// Software event trigger registers (0x04 * sw_event_id offset) -#define EU_CORE_TRIGG_SW_EVENT (EU_BASE + 0x600) // W: Generate SW event -#define EU_CORE_TRIGG_SW_EVENT_WAIT (EU_BASE + 0x640) // R: Generate event + sleep -#define EU_CORE_TRIGG_SW_EVENT_WAIT_CLEAR (EU_BASE + 0x680) // R: Generate event + sleep + clear - -// SoC event FIFO register -#define EU_CORE_CURRENT_EVENT (EU_BASE + 0x700) // R: SoC event FIFO - -// Event bit mapping -#define EU_DMA_EVT_0_BIT 2 -#define EU_DMA_EVT_1_BIT 3 -#define EU_TIMER_EVT_0_BIT 4 -#define EU_TIMER_EVT_1_BIT 5 - -#define EU_REDMULE_UNUSED_BIT 8 -#define EU_REDMULE_BUSY_BIT 9 -#define EU_REDMULE_DONE_BIT 10 -#define EU_REDMULE_EVT1_BIT 11 - -// RedMulE event masks -#define EU_REDMULE_DONE_MASK (1 << EU_REDMULE_DONE_BIT) -#define EU_REDMULE_BUSY_MASK (1 << EU_REDMULE_BUSY_BIT) -#define EU_REDMULE_ALL_MASK 0x0F00 - -// iDMA events (DMA events [3:2] + extended [31:26]) -#define EU_IDMA_A2O_DONE_BIT 2 -#define EU_IDMA_O2A_DONE_BIT 3 -#define EU_IDMA_A2O_DONE_MASK (1 << EU_IDMA_A2O_DONE_BIT) -#define EU_IDMA_O2A_DONE_MASK (1 << EU_IDMA_O2A_DONE_BIT) -#define EU_IDMA_ALL_DONE_MASK (EU_IDMA_A2O_DONE_MASK | EU_IDMA_O2A_DONE_MASK) -#define EU_IDMA_A2O_ERROR_BIT 26 -#define EU_IDMA_O2A_ERROR_BIT 27 -#define EU_IDMA_A2O_START_BIT 28 -#define EU_IDMA_O2A_START_BIT 29 -#define EU_IDMA_A2O_BUSY_BIT 30 -#define EU_IDMA_O2A_BUSY_BIT 31 -#define EU_IDMA_A2O_ERROR_MASK (1 << EU_IDMA_A2O_ERROR_BIT) -#define EU_IDMA_O2A_ERROR_MASK (1 << EU_IDMA_O2A_ERROR_BIT) -#define EU_IDMA_A2O_START_MASK (1 << EU_IDMA_A2O_START_BIT) -#define EU_IDMA_O2A_START_MASK (1 << EU_IDMA_O2A_START_BIT) -#define EU_IDMA_A2O_BUSY_MASK (1 << EU_IDMA_A2O_BUSY_BIT) -#define EU_IDMA_O2A_BUSY_MASK (1 << EU_IDMA_O2A_BUSY_BIT) - -// FSync events (cluster events [25:24]) -#define EU_FSYNC_DONE_BIT 24 -#define EU_FSYNC_ERROR_BIT 25 -#define EU_FSYNC_DONE_MASK (1 << EU_FSYNC_DONE_BIT) -#define EU_FSYNC_ERROR_MASK (1 << EU_FSYNC_ERROR_BIT) -#define EU_FSYNC_ALL_MASK (EU_FSYNC_DONE_MASK | EU_FSYNC_ERROR_MASK) - -// Spatz events (accelerator events [8] + cluster events [23]) -#define EU_SPATZ_DONE_BIT 8 // acc_events_array[0][0] - Spatz completion -#define EU_SPATZ_START_BIT 23 // other_events_array[0][23] - Spatz start trigger -#define EU_SPATZ_DONE_MASK (1 << EU_SPATZ_DONE_BIT) -#define EU_SPATZ_START_MASK (1 << EU_SPATZ_START_BIT) -#define EU_SPATZ_ALL_MASK (EU_SPATZ_DONE_MASK | EU_SPATZ_START_MASK) - // Wait modes typedef enum { EU_WAIT_MODE_POLLING = 0, diff --git a/targets/magia_v2/include/utils/fsync_isa_utils.h b/targets/magia_v2/include/utils/fsync_isa_utils.h index 3d72ab2a..1c1cad8b 100644 --- a/targets/magia_v2/include/utils/fsync_isa_utils.h +++ b/targets/magia_v2/include/utils/fsync_isa_utils.h @@ -16,15 +16,14 @@ * * Authors: Victor Isachi * Alberto Dequino - * + * * MAGIA FractalSync ISA Utils */ #ifndef FSYNC_ISA_UTILS_H #define FSYNC_ISA_UTILS_H -//#include "utils/tinyprintf.h" -#include "utils/printf.h" +#include "printf_wrapper.h" #include "addr_map/tile_addr_map.h" #include "regs/tile_ctrl.h" #include "performance_utils.h" @@ -69,70 +68,70 @@ inline void fsync_legacy(volatile uint32_t level){ // (0x0 << 7) | \ /* Reserved - 0x0 */ // (0b1011011 << 0) \n"); /* OPCODE */ /** - * This ISA instruction is the bread and butter for synchronizing the current tile with an arbitrary subset of - * other tiles in the MAGIA mesh. The functionality of this instruction is NOT easy to understand or correctly - * utilize, it is heavily recomended to avoid directly using this instruction and instead use the API wrappers + * This ISA instruction is the bread and butter for synchronizing the current tile with an arbitrary subset of + * other tiles in the MAGIA mesh. The functionality of this instruction is NOT easy to understand or correctly + * utilize, it is heavily recomended to avoid directly using this instruction and instead use the API wrappers * hiding this behemoth. - * + * * But if you insist to use it for your little, special experiment, then be my fucking guest. - * + * * ID and AGGREGATE are the two values that guide the entire synchronization process. - * - * Starting from the tile this instruction is called, the fractal sync tree is explored in reverse order, towards + * + * Starting from the tile this instruction is called, the fractal sync tree is explored in reverse order, towards * the root node. - * + * * If ID is even (or zero), the HORIZONTAL tree is explored. If ID is odd, the VERTICAL tree is explored. - * - * The number of nodes traversed is equal to the number of significant bits passed in the AGGREGATE value. + * + * The number of nodes traversed is equal to the number of significant bits passed in the AGGREGATE value. * In fact, you should always pass AGGREGATE as a bit string to know what you are exactly doing. (I.E. 0b110) - * + * * The MSB is the highest level explored, the LSB is the lowest. - * - * If there is at least one tile you want to synchronize with, which visible from a certain level, you should put 1 in - * the bit associated for that level. Instead, if there are no tiles you have to synchronize with in a certain + * + * If there is at least one tile you want to synchronize with, which visible from a certain level, you should put 1 in + * the bit associated for that level. Instead, if there are no tiles you have to synchronize with in a certain * level THAT YOU HAVEN'T SYNCHRONIZED WITH IN A PREVIOUS ONE, then you put 0 in its associated bit. - * - * If you mess up and put 1 in a level in which there are no other tiles to synchronize with, - * or in which there are only tiles you already synchronized in a previous level, you are in Deadlock City baby. - * + * + * If you mess up and put 1 in a level in which there are no other tiles to synchronize with, + * or in which there are only tiles you already synchronized in a previous level, you are in Deadlock City baby. + * * Told you to use the fucking APIs! - * - * If the AGGREGATE value is EXACTLY 1, then a special behavior is activated. - * + * + * If the AGGREGATE value is EXACTLY 1, then a special behavior is activated. + * * Depending on the ID value, the current tile will synchronize with: - * + * * ID == 0 : The tile at synchronization level 0 in the horizontal fsync tree * ID == 1 : The tile at synchronization level 0 in the vertical fsync tree * ID == 2 : The tile horizontally neighboring NOT visible at synch level 0 in the horizontal fsync tree * ID == 3 : The tile vertically neighboring NOT visible at synch level 0 in the vertical fsync tree - * + * * If you have no fucking clue on what you just read means, then I'm sorry but you are not in the right place. * Try the MAGIA repository README file! - * + * * There is more! The ID value, in fact, isn't just used to decide whether we explore the horizontal or vertical * tree. In fact, through a single synchronization tree node there might be multiple fsync calls going through in - * parallel at the same time. - * - * To avoid collisions, multiple barriers are set up for each node, the one on which the instruction waits is + * parallel at the same time. + * + * To avoid collisions, multiple barriers are set up for each node, the one on which the instruction waits is * chosen by the ID value. - * + * * It's up to YOU to make sure that the tiles that are synchronizing are calling the fsync over the same barrier ID. - * + * * Unfortunately, you can't choose whichever ID you want. There is a physical ID limit equal to: - * + * * - For the horizontal fsync tree: 2 * ((2^L) - 1) * - For the vertical fsync tree: 2 * ((2^L) - 1) + 1 * - For the nodes that are in both fsync trees: ((2^L) - 1) - * - * Where L is the level of the MSB in the AGGREGATE value. This means that you must have a solid idea of the + * + * Where L is the level of the MSB in the AGGREGATE value. This means that you must have a solid idea of the * nature of the highest node you are synchronizing with. And of the fsync map, in general. If you mess up, you're screwed. - * + * * I'd gladly write down some examples, but my ASCII art skills are dogshit, so instead just open the APIs and * take a look on how it is possible to do stuff like synchronizing specific rows, columns, diagnolas, the outer * ring, and from there you should have a rough idea on how to do this. - * + * * Maybe. - * + * * Good luck! */ inline void fsync(volatile uint32_t id, volatile uint32_t aggregate){ @@ -168,6 +167,6 @@ inline void fsync(volatile uint32_t id, volatile uint32_t aggregate){ #endif #endif } - + #endif /*FSYNC_ISA_UTILS_H*/ diff --git a/tests/utils/idma_mm_utils.h b/targets/magia_v2/include/utils/idma_mm_utils.h similarity index 82% rename from tests/utils/idma_mm_utils.h rename to targets/magia_v2/include/utils/idma_mm_utils.h index 4b29c509..eb1d5bec 100644 --- a/tests/utils/idma_mm_utils.h +++ b/targets/magia_v2/include/utils/idma_mm_utils.h @@ -25,6 +25,8 @@ #include #include "magia_tile_utils.h" +#include "addr_map/tile_addr_map.h" +#include "regs/tile_ctrl.h" //============================================================================= // Register Definitions and Constants @@ -35,35 +37,6 @@ #define IDMA_MM_BASE_AXI2OBI (IDMA_BASE) // direction=0, L2 to L1 #define IDMA_MM_BASE_OBI2AXI (IDMA_BASE + IDMA_MM_DIRECTION_OFFSET) // direction=1, L1 to L2 -#define IDMA_CONF_OFFSET (0x00) -#define IDMA_STATUS_OFFSET (0x04) -#define IDMA_NEXT_ID_OFFSET (0x44) -#define IDMA_DONE_ID_OFFSET (0x84) -#define IDMA_DST_ADDR_LOW_OFFSET (0xD0) -#define IDMA_SRC_ADDR_LOW_OFFSET (0xD8) -#define IDMA_LENGTH_LOW_OFFSET (0xE0) -#define IDMA_DST_STRIDE_2_LOW_OFFSET (0xE8) -#define IDMA_SRC_STRIDE_2_LOW_OFFSET (0xF0) -#define IDMA_REPS_2_LOW_OFFSET (0xF8) -#define IDMA_DST_STRIDE_3_LOW_OFFSET (0x100) -#define IDMA_SRC_STRIDE_3_LOW_OFFSET (0x108) -#define IDMA_REPS_3_LOW_OFFSET (0x110) - -// Register Addresses - now direction-aware -#define IDMA_CONF_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_CONF_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_CONF_OFFSET)) -#define IDMA_STATUS_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_STATUS_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_STATUS_OFFSET + ((id) * 4))) -#define IDMA_NEXT_ID_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_NEXT_ID_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_NEXT_ID_OFFSET + ((id) * 4))) -#define IDMA_DONE_ID_ADDR(is_l1_to_l2, id) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DONE_ID_OFFSET + ((id) * 4)) : (IDMA_MM_BASE_AXI2OBI + IDMA_DONE_ID_OFFSET + ((id) * 4))) -#define IDMA_DST_ADDR_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_ADDR_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_ADDR_LOW_OFFSET)) -#define IDMA_SRC_ADDR_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_ADDR_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_ADDR_LOW_OFFSET)) -#define IDMA_LENGTH_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_LENGTH_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_LENGTH_LOW_OFFSET)) -#define IDMA_DST_STRIDE_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_STRIDE_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_STRIDE_2_LOW_OFFSET)) -#define IDMA_SRC_STRIDE_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_STRIDE_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_STRIDE_2_LOW_OFFSET)) -#define IDMA_REPS_2_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_REPS_2_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_REPS_2_LOW_OFFSET)) -#define IDMA_DST_STRIDE_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_DST_STRIDE_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_DST_STRIDE_3_LOW_OFFSET)) -#define IDMA_SRC_STRIDE_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_SRC_STRIDE_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_SRC_STRIDE_3_LOW_OFFSET)) -#define IDMA_REPS_3_LOW_ADDR(is_l1_to_l2) ((is_l1_to_l2) ? (IDMA_MM_BASE_OBI2AXI + IDMA_REPS_3_LOW_OFFSET) : (IDMA_MM_BASE_AXI2OBI + IDMA_REPS_3_LOW_OFFSET)) - // Configuration Register Bit Fields #define IDMA_CONF_DECOUPLE_AW_BIT (0) #define IDMA_CONF_DECOUPLE_RW_BIT (1) @@ -76,9 +49,6 @@ #define IDMA_CONF_ENABLE_ND_MASK (0xC00) // bits 11:10 #define IDMA_CONF_ENABLE_ND_SHIFT (10) -// Status Register Bit Fields -#define IDMA_STATUS_BUSY_MASK (0x3FF) // bits 9:0 - // Transfer Direction Constants #define IDMA_DIR_L2_TO_L1 (0) // AXI2OBI direction #define IDMA_DIR_L1_TO_L2 (1) // OBI2AXI direction diff --git a/targets/magia_v2/include/utils/io.h b/targets/magia_v2/include/utils/io.h index 11226b92..417826ea 100644 --- a/targets/magia_v2/include/utils/io.h +++ b/targets/magia_v2/include/utils/io.h @@ -17,7 +17,7 @@ * * Authors: * Alberto Dequino - * + * * IO */ #ifndef IO_H @@ -148,4 +148,4 @@ void *memcpy(void *dst0, const void *src0, size_t len0); void *memmove(void *d, const void *s, size_t n); -#endif // IO_H \ No newline at end of file +#endif // IO_H diff --git a/tests/utils/magia_spatz_utils.h b/targets/magia_v2/include/utils/magia_spatz_utils.h similarity index 97% rename from tests/utils/magia_spatz_utils.h rename to targets/magia_v2/include/utils/magia_spatz_utils.h index b5969a9e..9590a0c8 100644 --- a/tests/utils/magia_spatz_utils.h +++ b/targets/magia_v2/include/utils/magia_spatz_utils.h @@ -23,6 +23,7 @@ #include #include "magia_tile_utils.h" +#include "addr_map/tile_addr_map.h" #define SPATZ_CLK_EN (SPATZ_CTRL_BASE + 0x00) #define SPATZ_START (SPATZ_CTRL_BASE + 0x04) @@ -31,8 +32,6 @@ #define SPATZ_RETURN (SPATZ_CTRL_BASE + 0x10) #define SPATZ_DONE (SPATZ_CTRL_BASE + 0x14) -#define mmio32(x) (*(volatile uint32_t *)(x)) - static inline void spatz_clk_en(void) { mmio32(SPATZ_CLK_EN) = 1; } diff --git a/targets/magia_v2/include/utils/magia_tile_utils.h b/targets/magia_v2/include/utils/magia_tile_utils.h index 789371b6..21797f58 100644 --- a/targets/magia_v2/include/utils/magia_tile_utils.h +++ b/targets/magia_v2/include/utils/magia_tile_utils.h @@ -16,21 +16,24 @@ * * Authors: Victor Isachi * Alberto Dequino - * + * * MAGIA Tile Utils */ #ifndef MAGIA_TILE_UTILS_H #define MAGIA_TILE_UTILS_H -//#include "tinyprintf.h" -#include "printf.h" +#include "printf_wrapper.h" #define mmio64(x) (*(volatile uint64_t *)(x)) #define mmio32(x) (*(volatile uint32_t *)(x)) #define mmio16(x) (*(volatile uint16_t *)(x)) #define mmio8(x) (*(volatile uint8_t *)(x)) +#define mmio_fp64(x) (*(volatile float64 *)(x)) +#define mmio_fp32(x) (*(volatile float32 *)(x)) +#define mmio_fp16(x) (*(volatile float16 *)(x)) + #define addr64(x) (*(uint64_t *)(&x)) #define addr32(x) (*(uint32_t *)(&x)) #define addr16(x) (*(uint16_t *)(&x)) @@ -122,4 +125,70 @@ static uint32_t get_time(){ return timel; } -#endif /*MAGIA_TILE_UTILS_H*/ \ No newline at end of file +static inline uint32_t get_mstatus(){ + uint32_t mstatus; + asm volatile("csrr %0, 0x300" :"=r"(mstatus):); // MSTATUS (0x300) + return mstatus; +} + +static inline void set_mstatus(uint32_t value){ + asm volatile("csrw 0x300, %0" ::"r"(value)); // MSTATUS (0x300) +} + +static inline uint32_t get_mtvec(){ + uint32_t mtvec; + asm volatile("csrr %0, 0x305" :"=r"(mtvec):); // MTVEC (0x305) + return mtvec; +} + +static inline void set_mtvec(uint32_t value){ + asm volatile("csrw 0x305, %0" ::"r"(value)); // MTVEC (0x305) +} + +static inline uint32_t get_mepc(){ + uint32_t mepc; + asm volatile("csrr %0, 0x341" :"=r"(mepc):); // MEPC (0x341) + return mepc; +} + +static inline void set_mepc(uint32_t value){ + asm volatile("csrw 0x341, %0" ::"r"(value)); // MEPC (0x341) +} + +static inline uint32_t get_mcause(){ + uint32_t mcause; + asm volatile("csrr %0, 0x342" :"=r"(mcause):); // MCAUSE (0x342) + return mcause; +} + +static inline uint32_t get_privlv(){ + uint32_t privlv; + asm volatile("csrr %0, 0xc10" :"=r"(privlv):); // PRIVLV (0xC10) + return privlv; +} + +static inline uint32_t get_uhartid(){ + uint32_t uhartid; + asm volatile("csrr %0, 0x014" :"=r"(uhartid):); // UHARTID (0x014) + return uhartid; +} + +// CV32E40P Performance Counter Functions +static inline void cv32e40p_ccount_enable(){ + asm volatile("csrw 0x7E0, %0" :: "r"(0x1)); // Enable PCCR[0] + asm volatile("csrw 0x7E1, %0" :: "r"(0x1)); // Enable counting, , no saturation +} + +// Read CV32E40P cycle counter +static inline uint32_t cv32e40p_get_cycles(){ + uint32_t cycles; + asm volatile("csrr %0, 0x780" : "=r"(cycles)); // Read PCCR[0] + return cycles; +} + +// Disable CV32E40P cycle counter +static inline void cv32e40p_ccount_disable(){ + asm volatile("csrw 0x7E1, %0" :: "r"(0x0)); // Disable counting +} + +#endif /*MAGIA_TILE_UTILS_H*/ diff --git a/targets/magia_v2/include/utils/magia_utils.h b/targets/magia_v2/include/utils/magia_utils.h index 2d7c69d7..fa6dfc1c 100644 --- a/targets/magia_v2/include/utils/magia_utils.h +++ b/targets/magia_v2/include/utils/magia_utils.h @@ -16,7 +16,7 @@ * * Authors: Victor Isachi * Alberto Dequino - * + * * MAGIA Utils */ @@ -57,8 +57,8 @@ inline uint32_t get_l1_base(uint32_t hartid){ static char* utoa(unsigned int value, unsigned int base, char* result) { if (base < 2 || base > 16){ - *result = '\0'; - return result; + *result = '\0'; + return result; } char *ptr0 = result; @@ -73,7 +73,7 @@ static char* utoa(unsigned int value, unsigned int base, char* result) { } while (value); *ptr0-- = '\0'; - + // Reverse the string while(ptr1 < ptr0) { tmp_char = *ptr0; @@ -144,4 +144,4 @@ static void magia_return(uint32_t hartid, uint32_t exit_code){ mmio16(TEST_END_ADDR + hartid*2) = (uint16_t) (exit_code - get_hartid()); } -#endif /*MAGIA_UTILS_H*/ \ No newline at end of file +#endif /* MAGIA_UTILS_H */ diff --git a/targets/magia_v2/include/utils/performance_utils.h b/targets/magia_v2/include/utils/performance_utils.h index cb00079c..8d1fc11b 100644 --- a/targets/magia_v2/include/utils/performance_utils.h +++ b/targets/magia_v2/include/utils/performance_utils.h @@ -16,7 +16,7 @@ * * Authors: Victor Isachi * Alberto Dequino - * + * * MAGIA Utils */ @@ -153,4 +153,4 @@ static inline void stnl_r(){ asm volatile("addi x0, x0, 0x5EE" ::); } -#endif \ No newline at end of file +#endif diff --git a/targets/magia_v2/include/utils/printf.h b/targets/magia_v2/include/utils/printf.h index eb140f06..805e828d 100644 --- a/targets/magia_v2/include/utils/printf.h +++ b/targets/magia_v2/include/utils/printf.h @@ -17,7 +17,7 @@ * * Authors: * Alberto Dequino - * + * * PRINTF */ #ifndef PRINTF_H @@ -41,4 +41,4 @@ static int printf(const char *format, ...) //#define printf tfp_printf -#endif // PRINTF_H \ No newline at end of file +#endif // PRINTF_H diff --git a/targets/magia_v2/include/utils/printf_wrapper.h b/targets/magia_v2/include/utils/printf_wrapper.h new file mode 100644 index 00000000..e493b96f --- /dev/null +++ b/targets/magia_v2/include/utils/printf_wrapper.h @@ -0,0 +1,11 @@ +#ifndef PRINTF_WRAPPER_H_ +#define PRINTF_WRAPPER_H_ + +// Spatz tasks are built standalone (-nostdlib), use tinyprintf there. +#ifdef SPATZ_TARGET +#include "tinyprintf.h" +#else +#include "printf.h" +#endif + +#endif /* PRINTF_WRAPPER_H_ */ diff --git a/tests/utils/redmule_mm_utils.h b/targets/magia_v2/include/utils/redmule_mm_utils.h similarity index 87% rename from tests/utils/redmule_mm_utils.h rename to targets/magia_v2/include/utils/redmule_mm_utils.h index d054fe9b..2fe02551 100644 --- a/tests/utils/redmule_mm_utils.h +++ b/targets/magia_v2/include/utils/redmule_mm_utils.h @@ -26,6 +26,8 @@ #include #include "magia_tile_utils.h" +#include "addr_map/tile_addr_map.h" +#include "regs/tile_ctrl.h" /* OBI2HWPE Protocol Stamps */ #define REDMULE_ADDR_BASE REDMULE_BASE @@ -33,23 +35,6 @@ #define HWPE_WRITE(value, offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) = value #define HWPE_READ(offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) -/* Register offsets (RedMulE hwpe-ctrl) */ -#define REDMULE_REG_OFFS 0x00 -#define REDMULE_TRIGGER 0x00 -#define REDMULE_ACQUIRE 0x04 -#define REDMULE_EVT_ENABLE 0x08 -#define REDMULE_STATUS 0x0C -#define REDMULE_RUNNING_JOB 0x10 -#define REDMULE_SOFT_CLEAR 0x14 - -/* RedMulE configuration registers */ -#define REDMULE_REG_X_PTR 0x40 -#define REDMULE_REG_W_PTR 0x44 -#define REDMULE_REG_Z_PTR 0x48 -#define REDMULE_MCFG0_PTR 0x4C -#define REDMULE_MCFG1_PTR 0x50 -#define REDMULE_ARITH_PTR 0x54 - /* Operations and formats */ #define gemm_ops 0x1 #define Float16 0x1 diff --git a/tests/utils/perf_counters.h b/targets/magia_v2/include/utils/spatz_perf_counters.h similarity index 100% rename from tests/utils/perf_counters.h rename to targets/magia_v2/include/utils/spatz_perf_counters.h diff --git a/targets/magia_v2/include/utils/tinyprintf.h b/targets/magia_v2/include/utils/tinyprintf.h index cfc11750..01d54716 100644 --- a/targets/magia_v2/include/utils/tinyprintf.h +++ b/targets/magia_v2/include/utils/tinyprintf.h @@ -145,7 +145,16 @@ static void putf(char *null, char c) { /* Optional external types dependencies */ #if TINYPRINTF_DEFINE_TFP_SPRINTF -# include /* size_t */ +/* For standalone SPATZ builds (no libc headers) define size_t locally; + for other targets prefer the standard header. */ +# if defined(SPATZ_TARGET) + /* size_t is defined as unsigned long for standalone embedded systems */ +# ifndef size_t +# define size_t unsigned long +# endif +# else +# include +# endif #endif /* Declarations */ @@ -602,7 +611,7 @@ static void tfp_format(void *putp, putcf putf__, const char *fmt, va_list va) break; } } - } + } abort:; } @@ -706,4 +715,4 @@ static int tfp_sprintf(char *str, const char *format, ...) } #endif -#endif \ No newline at end of file +#endif diff --git a/tests/spatz_on_magia/double_task/CMakeLists.txt b/tests/spatz_on_magia/double_task/CMakeLists.txt index ddd8f35b..1935b298 100644 --- a/tests/spatz_on_magia/double_task/CMakeLists.txt +++ b/tests/spatz_on_magia/double_task/CMakeLists.txt @@ -7,7 +7,6 @@ add_spatz_task( ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/idma_task.c FIRST_TASK_NAME hello_task - INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) # Compile CV32 executable with embedded Spatz binary @@ -15,6 +14,4 @@ add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c - INCLUDE_DIRS - ${CMAKE_SOURCE_DIR}/tests/utils ) diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt index fcc80b54..7dc82bde 100644 --- a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -5,7 +5,6 @@ add_spatz_task( TEST_NAME ${TEST_NAME} TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c FIRST_TASK_NAME hello_task - INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/tests/utils ) # Compile CV32 executable with embedded Spatz binary @@ -13,6 +12,4 @@ add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c - INCLUDE_DIRS - ${CMAKE_SOURCE_DIR}/tests/utils ) diff --git a/tests/spatz_on_magia/onnx_add/CMakeLists.txt b/tests/spatz_on_magia/onnx_add/CMakeLists.txt index af7aaffc..371c3ca9 100644 --- a/tests/spatz_on_magia/onnx_add/CMakeLists.txt +++ b/tests/spatz_on_magia/onnx_add/CMakeLists.txt @@ -6,7 +6,6 @@ add_spatz_task( TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/onnx_add_task.c FIRST_TASK_NAME onnx_add_task INCLUDE_DIRS - ${CMAKE_SOURCE_DIR}/tests/utils ${CMAKE_CURRENT_SOURCE_DIR}/test_data ${CMAKE_CURRENT_SOURCE_DIR}/include ) @@ -17,7 +16,6 @@ add_cv32_executable_with_spatz( SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c INCLUDE_DIRS - ${CMAKE_SOURCE_DIR}/tests/utils ${CMAKE_CURRENT_SOURCE_DIR}/test_data ${CMAKE_CURRENT_SOURCE_DIR}/include ) diff --git a/tests/utils/magia_tile_utils.h b/tests/utils/magia_tile_utils.h deleted file mode 100644 index e050b0a0..00000000 --- a/tests/utils/magia_tile_utils.h +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Victor Isachi - * - * MAGIA Tile Utils - */ - -#ifndef MAGIA_TILE_UTILS_H -#define MAGIA_TILE_UTILS_H - -#include -#include "tinyprintf.h" - - -#define NUM_L1_BANKS (32) -#define WORDS_BANK (8192) -#define BITS_WORD (32) -#define BITS_BYTE (8) - -#define REDMULE_BASE (0x00000100) -#define REDMULE_END (0x000001FF) -#define IDMA_BASE (0x00000200) -#define IDMA_END (0x000005FF) -#define FSYNC_BASE (0x00000600) -#define FSYNC_END (0x000006FF) -#define EVENT_UNIT_BASE (0x00000700) -#define EVENT_UNIT_END (0x000016FF) -#define SPATZ_CTRL_BASE (0x00001700) -#define SPATZ_CTRL_END (0x000017FF) -#define RESERVED_START (0x00001800) -#define RESERVED_END (0x0000FFFF) -#define STACK_START (0x00010000) -#define STACK_END (0x0001FFFF) -#define L1_BASE (0x00020000) -#define L1_SIZE (0x000DFFFF) -#define L1_TILE_OFFSET (0x00100000) -#define L2_BASE (0xCC000000) -#define TEST_END_ADDR (0xCCFF0000) - -#define DEFAULT_EXIT_CODE (0xDEFC) -#define PASS_EXIT_CODE (0xAAAA) -#define FAIL_EXIT_CODE (0xFFFF) - -// Individual IRQ indices removed - Event Unit provides unified interrupt management -// Use Event Unit API (event_unit_utils.h) for event handling - -#define mmio64(x) (*(volatile uint64_t *)(x)) -#define mmio32(x) (*(volatile uint32_t *)(x)) -#define mmio16(x) (*(volatile uint16_t *)(x)) -#define mmio8(x) (*(volatile uint8_t *)(x)) - -#define mmio_fp64(x) (*(volatile float64 *)(x)) -#define mmio_fp32(x) (*(volatile float32 *)(x)) -#define mmio_fp16(x) (*(volatile float16 *)(x)) - -// Spatz Control: Use magia_spatz_utils.h for Spatz programming functions - -#define addr64(x) (*(uint64_t *)(&x)) -#define addr32(x) (*(uint32_t *)(&x)) -#define addr16(x) (*(uint16_t *)(&x)) -#define addr8(x) (*(uint8_t *)(&x)) - -void wait_print(unsigned int cycles){ - for(int i = 0; i <= cycles; i++){ - printf("Waiting: ["); - for(int j = 0; j < i; j++) - printf("+"); - for(int j = 0; j < cycles - i; j++) - printf("-"); - printf("]\n"); - } -} - -static inline void irq_en(volatile uint32_t index_oh){ - asm volatile("addi t0, %0, 0\n\t" - "csrrs zero, mie, t0" - ::"r"(index_oh)); -} - -static inline uint32_t irq_st(){ - uint32_t irq_status; - asm volatile("csrr %0, mip" - :"=r"(irq_status):); - return irq_status; -} - -static inline void wait_nop(uint32_t nops){ - for (int i = 0; i < nops; i++) asm volatile("addi x0, x0, 0" ::); -} - -static inline void sentinel_instr_id(){ - asm volatile("addi x0, x0, 0x404" ::); -} - -static inline void sentinel_instr_ex(){ - asm volatile("addi x0, x0, 0x505" ::); -} - -static inline void sentinel_start(){ - asm volatile("addi x0, x0, 0x5AA" ::); -} - -static inline void sentinel_end(){ - asm volatile("addi x0, x0, 0x5FF" ::); -} - -static inline void ccount_en(){ - uint32_t pcmr = 1; - asm volatile("csrw 0x7e1, %0" ::"r"(pcmr)); -} - -static inline void ccount_dis(){ - uint32_t pcmr = 0; - asm volatile("csrw 0x7e1, %0" ::"r"(pcmr)); -} - -static inline uint32_t get_cyclel(){ - uint32_t cyclel; - asm volatile("csrr %0, 0x780" - :"=r"(cyclel):); - return cyclel; -} - -static inline uint32_t get_cycleh(){ - uint32_t cycleh; - asm volatile("csrr %0, cycleh" - :"=r"(cycleh):); - return cycleh; -} - -uint32_t get_cycle(){ - uint32_t cyclel = get_cyclel(); - uint32_t cycleh = get_cycleh(); - if (cycleh) return 0; - return cyclel; -} - -static inline uint32_t get_timel(){ - uint32_t timel; - asm volatile("csrr %0, 0x781" - :"=r"(timel):); - return timel; -} - -static inline uint32_t get_timeh(){ - uint32_t timeh; - // RI5CY doesn't have separate timeh, return 0 - asm volatile("csrr %0, timeh" - :"=r"(timeh):); - return timeh; -} - -uint32_t get_time(){ - uint32_t timel = get_timel(); - uint32_t timeh = get_timeh(); - if (timeh) return 0; - return timel; -} - -static inline uint32_t get_mstatus(){ - uint32_t mstatus; - asm volatile("csrr %0, 0x300" :"=r"(mstatus):); // MSTATUS (0x300) - return mstatus; -} - -static inline void set_mstatus(uint32_t value){ - asm volatile("csrw 0x300, %0" ::"r"(value)); // MSTATUS (0x300) -} - -static inline uint32_t get_mtvec(){ - uint32_t mtvec; - asm volatile("csrr %0, 0x305" :"=r"(mtvec):); // MTVEC (0x305) - return mtvec; -} - -static inline void set_mtvec(uint32_t value){ - asm volatile("csrw 0x305, %0" ::"r"(value)); // MTVEC (0x305) -} - -static inline uint32_t get_mepc(){ - uint32_t mepc; - asm volatile("csrr %0, 0x341" :"=r"(mepc):); // MEPC (0x341) - return mepc; -} - -static inline void set_mepc(uint32_t value){ - asm volatile("csrw 0x341, %0" ::"r"(value)); // MEPC (0x341) -} - -static inline uint32_t get_mcause(){ - uint32_t mcause; - asm volatile("csrr %0, 0x342" :"=r"(mcause):); // MCAUSE (0x342) - return mcause; -} - -static inline uint32_t get_privlv(){ - uint32_t privlv; - asm volatile("csrr %0, 0xc10" :"=r"(privlv):); // PRIVLV (0xC10) - return privlv; -} - -static inline uint32_t get_uhartid(){ - uint32_t uhartid; - asm volatile("csrr %0, 0x014" :"=r"(uhartid):); // UHARTID (0x014) - return uhartid; -} - - -// CV32E40P Performance Counter Functions -static inline void cv32e40p_ccount_enable(){ - asm volatile("csrw 0x7E0, %0" :: "r"(0x1)); // Enable PCCR[0] - asm volatile("csrw 0x7E1, %0" :: "r"(0x1)); // Enable counting, , no saturation -} - -// Read CV32E40P cycle counter -static inline uint32_t cv32e40p_get_cycles(){ - uint32_t cycles; - asm volatile("csrr %0, 0x780" : "=r"(cycles)); // Read PCCR[0] - return cycles; -} - -// Disable CV32E40P cycle counter -static inline void cv32e40p_ccount_disable(){ - asm volatile("csrw 0x7E1, %0" :: "r"(0x0)); // Disable counting -} - -#endif /*MAGIA_TILE_UTILS_H*/ diff --git a/tests/utils/magia_utils.h b/tests/utils/magia_utils.h deleted file mode 100644 index 0290d2d3..00000000 --- a/tests/utils/magia_utils.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Victor Isachi - * - * MAGIA Utils - */ - -#ifndef MAGIA_UTILS_H -#define MAGIA_UTILS_H - -#include "magia_tile_utils.h" - -#define STR_OFFSET (0x00000000) -#define STR_BASE (RESERVED_START + STR_OFFSET) -#define SYNC_OFFSET (0x0000F000) -#define SYNC_BASE (RESERVED_START + SYNC_OFFSET) -#define SYNC_EN (SYNC_BASE + 0x4) - -#define MESH_Y_TILES (4) -#define MESH_X_TILES (4) -#define NUM_HARTS (MESH_Y_TILES*MESH_X_TILES) - -#define GET_Y_ID(mhartid) ((mhartid)/MESH_X_TILES) -#define GET_X_ID(mhartid) ((mhartid)%MESH_X_TILES) -#define GET_ID(y_id, x_id) (((y_id)*MESH_X_TILES)+(x_id)) - -#define h_pprintf(x) (h_psprint(get_hartid(), x)) -#define n_pprintf(x) (n_psprint(get_hartid(), x)) -#define pprintf(x) ( psprint(get_hartid(), x)) -#define pprintln ( pprintf("\n")) - -static inline uint32_t get_hartid(){ - uint32_t hartid; - // In MAGIA: hartid = tile_id (each tile contains exactly one Flex-V core) - // mhartid_i is passed to each magia_tile and represents both tile and hart ID - asm volatile("csrr %0, mhartid" - :"=r"(hartid):); - return hartid; // Hart ID = Tile ID in MAGIA architecture -} - -static inline void amo_increment(volatile uint32_t addr, volatile uint32_t amnt){ - asm volatile("amoadd.w x0, %1, (%0)" ::"r"(addr), "r"(amnt):"memory"); -} - -char* utoa(unsigned int value, unsigned int base, char* result) { - if (base < 2 || base > 16){ - *result = '\0'; - return result; - } - - char *ptr0 = result; - char *ptr1 = result; - char tmp_char; - unsigned int tmp_value; - - do { - tmp_value = value; - value /= base; - *ptr0++ = "0123456789ABCDEF"[tmp_value - value * base]; - } while (value); - - *ptr0-- = '\0'; - - // Reverse the string - while(ptr1 < ptr0) { - tmp_char = *ptr0; - *ptr0-- = *ptr1; - *ptr1++ = tmp_char; - } - return result; -} - -char* bs(uint32_t x) { - uint32_t hartid = get_hartid(); - char *address = STR_BASE + L1_TILE_OFFSET*hartid; - - return utoa(x, 2, address); -} - -char* ds(uint32_t x) { - uint32_t hartid = get_hartid(); - char *address = STR_BASE + L1_TILE_OFFSET*hartid; - - return utoa(x, 10, address); -} - -char* hs(uint32_t x) { - uint32_t hartid = get_hartid(); - char *address = STR_BASE + L1_TILE_OFFSET*hartid; - - return utoa(x, 16, address); -} - -void h_psprint(uint32_t hartid, const char* string){ - mmio8(0xFFFF0004 + (hartid*4)) = '['; - mmio8(0xFFFF0004 + (hartid*4)) = 'm'; - mmio8(0xFFFF0004 + (hartid*4)) = 'h'; - mmio8(0xFFFF0004 + (hartid*4)) = 'a'; - mmio8(0xFFFF0004 + (hartid*4)) = 'r'; - mmio8(0xFFFF0004 + (hartid*4)) = 't'; - mmio8(0xFFFF0004 + (hartid*4)) = 'i'; - mmio8(0xFFFF0004 + (hartid*4)) = 'd'; - mmio8(0xFFFF0004 + (hartid*4)) = ' '; - char* mhardid_str = ds(hartid); - uint8_t mhartid_idx = 0; - while (mhardid_str[mhartid_idx] != '\0') - mmio8(0xFFFF0004 + (hartid*4)) = mhardid_str[mhartid_idx++]; - mmio8(0xFFFF0004 + (hartid*4)) = ']'; - mmio8(0xFFFF0004 + (hartid*4)) = ' '; - - uint8_t index = 0; - while (string[index] != '\0') - mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; -} - -void n_psprint(uint32_t hartid, const char* string){ - uint8_t index = 0; - while (string[index] != '\0') - mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; - mmio8(0xFFFF0004 + (hartid*4)) = '\n'; -} - -void psprint(uint32_t hartid, const char* string){ - uint8_t index = 0; - while (string[index] != '\0') - mmio8(0xFFFF0004 + (hartid*4)) = string[index++]; -} - -#endif /*MAGIA_UTILS_H*/ diff --git a/tests/utils/tinyprintf.h b/tests/utils/tinyprintf.h deleted file mode 100644 index aa7e96dc..00000000 --- a/tests/utils/tinyprintf.h +++ /dev/null @@ -1,702 +0,0 @@ -/* - -Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL 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. - -This modified tinyprintf is distributed under the conditions of the BSD-new license -as explicitly allowed: - -> https://github.com/cjlano/tinyprintf commit 2ee3012 - -They provide a simple and small (+400 loc) printf functionality to -be used in embedded systems. - -I've found them so useful in debugging that I do not bother with a -debugger at all. - -They are distributed in source form, so to use them, just compile them -into your project. - -Two printf variants are provided: printf and the 'sprintf' family of -functions ('snprintf', 'sprintf', 'vsnprintf', 'vsprintf'). - -The formats supported by this implementation are: -'c' 'd' 'i' 'o' 'p' 'u' 's' 'x' 'X'. - -Zero padding and field width are also supported. - -If the library is compiled with 'PRINTF_SUPPORT_LONG' defined, then -the long specifier is also supported. Note that this will pull in some -long math routines (pun intended!) and thus make your executable -noticeably longer. Likewise with 'PRINTF_LONG_LONG_SUPPORT' for the -long long specifier, and with 'PRINTF_SIZE_T_SUPPORT' for the size_t -specifier. - -The memory footprint of course depends on the target CPU, compiler and -compiler options, but a rough guesstimate (based on a H8S target) is about -1.4 kB for code and some twenty 'int's and 'char's, say 60 bytes of stack space. -Not too bad. Your mileage may vary. By hacking the source code you can -get rid of some hundred bytes, I'm sure, but personally I feel the balance of -functionality and flexibility versus code size is close to optimal for -many embedded systems. - -To use the printf, you need to supply your own character output function, -something like : - -void putc ( void* p, char c) -{ - while (!SERIAL_PORT_EMPTY) ; - SERIAL_PORT_TX_REGISTER = c; -} - -Before you can call printf, you need to initialize it to use your -character output function with something like: - -init_printf(NULL,putc); - -Notice the 'NULL' in 'init_printf' and the parameter 'void* p' in 'putc', -the NULL (or any pointer) you pass into the 'init_printf' will eventually be -passed to your 'putc' routine. This allows you to pass some storage space (or -anything really) to the character output function, if necessary. -This is not often needed but it was implemented like that because it made -implementing the sprintf function so neat (look at the source code). - -The code is re-entrant, except for the 'init_printf' function, so it is safe -to call it from interrupts too, although this may result in mixed output. -If you rely on re-entrancy, take care that your 'putc' function is re-entrant! - -The printf and sprintf functions are actually macros that translate to -'tfp_printf' and 'tfp_sprintf' when 'TINYPRINTF_OVERRIDE_LIBC' is set -(default). Setting it to 0 makes it possible to use them along with -'stdio.h' printf's in a single source file. When -'TINYPRINTF_OVERRIDE_LIBC' is set, please note that printf/sprintf are -not function-like macros, so if you have variables or struct members -with these names, things will explode in your face. Without variadic -macros this is the best we can do to wrap these function. If it is a -problem, just give up the macros and use the functions directly, or -rename them. - -It is also possible to avoid defining tfp_printf and/or tfp_sprintf by -clearing 'TINYPRINTF_DEFINE_TFP_PRINTF' and/or -'TINYPRINTF_DEFINE_TFP_SPRINTF' to 0. This allows for example to -export only tfp_format, which is at the core of all the other -functions. - -For further details see source code. - -regs Kusti, 23.10.2004 -*/ - -void putf(char *null, char c) { - *(volatile int *) (0xFFFF0004) = (int)c; -} - -#ifndef __TFP_PRINTF__ -#define __TFP_PRINTF__ - -#include - -/* Global configuration */ - -/* Set this to 0 if you do not want to provide tfp_printf */ -#ifndef TINYPRINTF_DEFINE_TFP_PRINTF -# define TINYPRINTF_DEFINE_TFP_PRINTF 1 -#endif - -/* Set this to 0 if you do not want to provide - tfp_sprintf/snprintf/vsprintf/vsnprintf */ -#ifndef TINYPRINTF_DEFINE_TFP_SPRINTF -# define TINYPRINTF_DEFINE_TFP_SPRINTF 1 -#endif - -/* Set this to 0 if you do not want tfp_printf and - tfp_{vsn,sn,vs,s}printf to be also available as - printf/{vsn,sn,vs,s}printf */ -#ifndef TINYPRINTF_OVERRIDE_LIBC -# define TINYPRINTF_OVERRIDE_LIBC 1 -#endif - -/* Optional external types dependencies */ - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -// Define size_t for embedded environment (no sys/types.h) -typedef unsigned int size_t; -#endif - -/* Declarations */ - -#ifdef __GNUC__ -# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) \ - __attribute__((format (printf, fmt_idx, arg1_idx))) -#else -# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*putcf) (void *, char); - -/* - 'tfp_format' really is the central function for all tinyprintf. For - each output character after formatting, the 'putf' callback is - called with 2 args: - - an arbitrary void* 'putp' param defined by the user and - passed unmodified from 'tfp_format', - - the character. - The 'tfp_printf' and 'tfp_sprintf' functions simply define their own - callback and pass to it the right 'putp' it is expecting. -*/ -void tfp_format(void *putp, putcf putf, const char *fmt, va_list va); - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -int tfp_vsnprintf(char *str, size_t size, const char *fmt, va_list ap); -int tfp_snprintf(char *str, size_t size, const char *fmt, ...) \ - _TFP_SPECIFY_PRINTF_FMT(3, 4); -int tfp_vsprintf(char *str, const char *fmt, va_list ap); -int tfp_sprintf(char *str, const char *fmt, ...) \ - _TFP_SPECIFY_PRINTF_FMT(2, 3); -# if TINYPRINTF_OVERRIDE_LIBC -# define vsnprintf tfp_vsnprintf -# define snprintf tfp_snprintf -# define vsprintf tfp_vsprintf -# define sprintf tfp_sprintf -# endif -#endif - -#if TINYPRINTF_DEFINE_TFP_PRINTF -void init_printf(void *putp, putcf putf); -void tfp_printf(char *fmt, ...) _TFP_SPECIFY_PRINTF_FMT(1, 2); -# if TINYPRINTF_OVERRIDE_LIBC -# define printf tfp_printf -# endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif - - - -/* - * Configuration - */ - -/* Enable long int support */ -// #define PRINTF_LONG_SUPPORT - -/* Enable long long int support (implies long int support) */ -// #define PRINTF_LONG_LONG_SUPPORT - -/* Enable %z (size_t) support */ -// #define PRINTF_SIZE_T_SUPPORT - -/* - * Configuration adjustments - */ -#ifdef PRINTF_SIZE_T_SUPPORT -#include -#endif - -#ifdef PRINTF_LONG_LONG_SUPPORT -# define PRINTF_LONG_SUPPORT -#endif - -/* __SIZEOF___ defined at least by gcc */ -#ifdef __SIZEOF_POINTER__ -# define SIZEOF_POINTER __SIZEOF_POINTER__ -#endif -#ifdef __SIZEOF_LONG_LONG__ -# define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__ -#endif -#ifdef __SIZEOF_LONG__ -# define SIZEOF_LONG __SIZEOF_LONG__ -#endif -#ifdef __SIZEOF_INT__ -# define SIZEOF_INT __SIZEOF_INT__ -#endif - -#ifdef __GNUC__ -# define _TFP_GCC_NO_INLINE_ __attribute__ ((noinline)) -#else -# define _TFP_GCC_NO_INLINE_ -#endif - -/* - * Implementation - */ -struct param { - char lz:1; /**< Leading zeros */ - char alt:1; /**< alternate form */ - char uc:1; /**< Upper case (for base16 only) */ - char align_left:1; /**< 0 == align right (default), 1 == align left */ - unsigned int width; /**< field width */ - char sign; /**< The sign to display (if any) */ - unsigned int base; /**< number base (e.g.: 8, 10, 16) */ - char *bf; /**< Buffer to output */ -}; - - -#ifdef PRINTF_LONG_LONG_SUPPORT -static void _TFP_GCC_NO_INLINE_ ulli2a( - unsigned long long int num, struct param *p) -{ - int n = 0; - unsigned long long int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void lli2a(long long int num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - ulli2a(num, p); -} -#endif - -#ifdef PRINTF_LONG_SUPPORT -static void uli2a(unsigned long int num, struct param *p) -{ - int n = 0; - unsigned long int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void li2a(long num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - uli2a(num, p); -} -#endif - -static void ui2a(unsigned int num, struct param *p) -{ - int n = 0; - unsigned int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void i2a(int num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - ui2a(num, p); -} - -static int a2d(char ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - else if (ch >= 'a' && ch <= 'f') - return ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') - return ch - 'A' + 10; - else - return -1; -} - -static char a2u(char ch, const char **src, int base, unsigned int *nump) -{ - const char *p = *src; - unsigned int num = 0; - int digit; - while ((digit = a2d(ch)) >= 0) { - if (digit > base) - break; - num = num * base + digit; - ch = *p++; - } - *src = p; - *nump = num; - return ch; -} - -static void putchw(void *putp, putcf putf__, struct param *p) -{ - char ch; - int n = p->width; - char *bf = p->bf; - - /* Number of filling characters */ - while (*bf++ && n > 0) - n--; - if (p->sign) - n--; - if (p->alt && p->base == 16) - n -= 2; - else if (p->alt && p->base == 8) - n--; - - /* Fill with space to align to the right, before alternate or sign */ - if (!p->lz && !p->align_left) { - while (n-- > 0) - putf(putp, ' '); - } - - /* print sign */ - if (p->sign) - putf(putp, p->sign); - - /* Alternate */ - if (p->alt && p->base == 16) { - putf(putp, '0'); - putf(putp, (p->uc ? 'X' : 'x')); - } else if (p->alt && p->base == 8) { - putf(putp, '0'); - } - - /* Fill with zeros, after alternate or sign */ - if (p->lz) { - while (n-- > 0) - putf(putp, '0'); - } - - /* Put actual buffer */ - bf = p->bf; - while ((ch = *bf++)) - putf(putp, ch); - - /* Fill with space to align to the left, after string */ - if (!p->lz && p->align_left) { - while (n-- > 0) - putf(putp, ' '); - } -} - -void tfp_format(void *putp, putcf putf__, const char *fmt, va_list va) -{ - struct param p; -#ifdef PRINTF_LONG_SUPPORT - char bf[23]; /* long = 64b on some architectures */ -#else - char bf[12]; /* int = 32b on some architectures */ -#endif - char ch; - p.bf = bf; - - while ((ch = *(fmt++))) { - if (ch != '%') { - putf(putp, ch); - } else { -#ifdef PRINTF_LONG_SUPPORT - char lng = 0; /* 1 for long, 2 for long long */ -#endif - /* Init parameter struct */ - p.lz = 0; - p.alt = 0; - p.width = 0; - p.align_left = 0; - p.sign = 0; - - /* Flags */ - while ((ch = *(fmt++))) { - switch (ch) { - case '-': - p.align_left = 1; - continue; - case '0': - p.lz = 1; - continue; - case '#': - p.alt = 1; - continue; - default: - break; - } - break; - } - - /* Width */ - if (ch >= '0' && ch <= '9') { - ch = a2u(ch, &fmt, 10, &(p.width)); - } - - /* We accept 'x.y' format but don't support it completely: - * we ignore the 'y' digit => this ignores 0-fill - * size and makes it == width (ie. 'x') */ - if (ch == '.') { - p.lz = 1; /* zero-padding */ - /* ignore actual 0-fill size: */ - do { - ch = *(fmt++); - } while ((ch >= '0') && (ch <= '9')); - } - -#ifdef PRINTF_SIZE_T_SUPPORT -# ifdef PRINTF_LONG_SUPPORT - if (ch == 'z') { - ch = *(fmt++); - if (sizeof(size_t) == sizeof(unsigned long int)) - lng = 1; -# ifdef PRINTF_LONG_LONG_SUPPORT - else if (sizeof(size_t) == sizeof(unsigned long long int)) - lng = 2; -# endif - } else -# endif -#endif - -#ifdef PRINTF_LONG_SUPPORT - if (ch == 'l') { - ch = *(fmt++); - lng = 1; -#ifdef PRINTF_LONG_LONG_SUPPORT - if (ch == 'l') { - ch = *(fmt++); - lng = 2; - } -#endif - } -#endif - switch (ch) { - case 0: - goto abort; - case 'u': - p.base = 10; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - ulli2a(va_arg(va, unsigned long long int), &p); - else -#endif - if (1 == lng) - uli2a(va_arg(va, unsigned long int), &p); - else -#endif - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'd': - case 'i': - p.base = 10; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - lli2a(va_arg(va, long long int), &p); - else -#endif - if (1 == lng) - li2a(va_arg(va, long int), &p); - else -#endif - i2a(va_arg(va, int), &p); - putchw(putp, putf, &p); - break; -#ifdef SIZEOF_POINTER - case 'p': - p.alt = 1; -#ifdef PRINTF_LONG_SUPPORT -# if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT - lng = 0; -# elif defined(SIZEOF_LONG) && SIZEOF_POINTER <= SIZEOF_LONG - lng = 1; -# elif defined(SIZEOF_LONG_LONG) && SIZEOF_POINTER <= SIZEOF_LONG_LONG - lng = 2; -# endif -#endif -#endif - case 'x': - case 'X': - p.base = 16; - p.uc = (ch == 'X')?1:0; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - ulli2a(va_arg(va, unsigned long long int), &p); - else -#endif - if (1 == lng) - uli2a(va_arg(va, unsigned long int), &p); - else -#endif - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'o': - p.base = 8; - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'c': - putf(putp, (char)(va_arg(va, int))); - break; - case 's': - p.bf = va_arg(va, char *); - putchw(putp, putf, &p); - p.bf = bf; - break; - case '%': - putf(putp, ch); - default: - break; - } - } - } - abort:; -} - -#if TINYPRINTF_DEFINE_TFP_PRINTF -static putcf stdout_putf; -static void *stdout_putp; - -void init_printf(void *putp, putcf putf__) -{ - stdout_putf = putf; - stdout_putp = putp; -} - -void tfp_printf(char *fmt, ...) -{ - va_list va; - va_start(va, fmt); - tfp_format(stdout_putp, stdout_putf, fmt, va); - va_end(va); -} -#endif - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -struct _vsnprintf_putcf_data -{ - size_t dest_capacity; - char *dest; - size_t num_chars; -}; - -static void _vsnprintf_putcf(void *p, char c) -{ - struct _vsnprintf_putcf_data *data = (struct _vsnprintf_putcf_data*)p; - if (data->num_chars < data->dest_capacity) - data->dest[data->num_chars] = c; - data->num_chars ++; -} - -int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - struct _vsnprintf_putcf_data data; - - if (size < 1) - return 0; - - data.dest = str; - data.dest_capacity = size-1; - data.num_chars = 0; - tfp_format(&data, _vsnprintf_putcf, format, ap); - - if (data.num_chars < data.dest_capacity) - data.dest[data.num_chars] = '\0'; - else - data.dest[data.dest_capacity] = '\0'; - - return data.num_chars; -} - -int tfp_snprintf(char *str, size_t size, const char *format, ...) -{ - va_list ap; - int retval; - - va_start(ap, format); - retval = tfp_vsnprintf(str, size, format, ap); - va_end(ap); - return retval; -} - -struct _vsprintf_putcf_data -{ - char *dest; - size_t num_chars; -}; - -static void _vsprintf_putcf(void *p, char c) -{ - struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p; - data->dest[data->num_chars++] = c; -} - -int tfp_vsprintf(char *str, const char *format, va_list ap) -{ - struct _vsprintf_putcf_data data; - data.dest = str; - data.num_chars = 0; - tfp_format(&data, _vsprintf_putcf, format, ap); - data.dest[data.num_chars] = '\0'; - return data.num_chars; -} - -int tfp_sprintf(char *str, const char *format, ...) -{ - va_list ap; - int retval; - - va_start(ap, format); - retval = tfp_vsprintf(str, format, ap); - va_end(ap); - return retval; -} -#endif From 079b7143a75fa852de5a3c7c2e8450e84bff08bb Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 17 Feb 2026 14:25:45 +0100 Subject: [PATCH 34/67] [tests/spatz_on_magia/onnx_add] main: Fix len param in vector compare --- tests/spatz_on_magia/onnx_add/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 7a8770c5..a26430a2 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -54,7 +54,7 @@ static int run_spatz_task() static bool check_result() { - return vector_compare_fp16(params->addr_res, params->addr_exp, params->addr_exp); + return vector_compare_fp16(params->addr_res, params->addr_exp, params->len); } static bool run_test() From b7e3e58dd6f82946b46ad993d5e9ea31612f02af Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 17 Feb 2026 14:27:19 +0100 Subject: [PATCH 35/67] [tests/spatz_on_magia/onnx_add] onnx_add_mem_layout: Map L1 memory based on tile hart ID --- tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h b/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h index ed92d0eb..a0078470 100644 --- a/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h +++ b/tests/spatz_on_magia/onnx_add/include/onnx_add_mem_layout.h @@ -3,15 +3,17 @@ #include "data.h" #include "magia_tile_utils.h" +#include "magia_utils.h" #include "onnx_add_params.h" #define ALIGNMENT 4 /* Aligns the given address to 4-byte */ #define ALIGN_4B(addr) (((addr) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)) -#define VEC_SIZE (LEN * sizeof(float16)) +#define L1_BASE_TILE (L1_BASE + (get_hartid() * L1_TILE_OFFSET)) +#define VEC_SIZE (LEN * sizeof(float16)) -#define ONNX_ADD_PARAMS_BASE L1_BASE +#define ONNX_ADD_PARAMS_BASE L1_BASE_TILE #define ONNX_ADD_PARAMS_SIZE ALIGN_4B(sizeof(onnx_add_params_t)) #define SRC_A_BASE ALIGN_4B(ONNX_ADD_PARAMS_BASE + ONNX_ADD_PARAMS_SIZE) From 2197e0eeaadc38098a4357dc5ff3a603316db28e Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 17 Feb 2026 14:32:52 +0100 Subject: [PATCH 36/67] [targets/magia_v2] link.ld: Fix CV32 stack size --- targets/magia_v2/link.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/magia_v2/link.ld b/targets/magia_v2/link.ld index 3c3703ec..77ba5ed5 100644 --- a/targets/magia_v2/link.ld +++ b/targets/magia_v2/link.ld @@ -22,7 +22,7 @@ MEMORY { instrram : ORIGIN = 0xcc000000, LENGTH = 0x8000 dataram : ORIGIN = 0xcc100000, LENGTH = 0xF00000 - stack : ORIGIN = 0x00010000, LENGTH = 0x10000 /* 64K, maybe it's a bit too much (?) */ + stack : ORIGIN = 0x00010000, LENGTH = 0xC000 } /* Stack information variables */ From 2f3929b08bc017619bdc09e4611d4a994e1619e6 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 19 Feb 2026 11:18:19 +0100 Subject: [PATCH 37/67] [tests/spatz_on_magia] onnx_div: Add ONNX DIV test --- tests/spatz_on_magia/CMakeLists.txt | 1 + tests/spatz_on_magia/onnx_div/CMakeLists.txt | 21 ++++ .../onnx_div/include/onnx_div_mem_layout.h | 31 ++++++ .../onnx_div/include/onnx_div_params.h | 14 +++ tests/spatz_on_magia/onnx_div/main.c | 95 +++++++++++++++++++ .../onnx_div/spatz_task/onnx_div_task.c | 39 ++++++++ .../spatz_on_magia/onnx_div/test_data/data.h | 11 +++ .../onnx_div/test_data/generator.py | 88 +++++++++++++++++ 8 files changed, 300 insertions(+) create mode 100644 tests/spatz_on_magia/onnx_div/CMakeLists.txt create mode 100644 tests/spatz_on_magia/onnx_div/include/onnx_div_mem_layout.h create mode 100644 tests/spatz_on_magia/onnx_div/include/onnx_div_params.h create mode 100644 tests/spatz_on_magia/onnx_div/main.c create mode 100644 tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c create mode 100644 tests/spatz_on_magia/onnx_div/test_data/data.h create mode 100644 tests/spatz_on_magia/onnx_div/test_data/generator.py diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt index 79901f2d..87dedb75 100644 --- a/tests/spatz_on_magia/CMakeLists.txt +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(double_task) add_subdirectory(hello_spatz) add_subdirectory(onnx_add) +add_subdirectory(onnx_div) diff --git a/tests/spatz_on_magia/onnx_div/CMakeLists.txt b/tests/spatz_on_magia/onnx_div/CMakeLists.txt new file mode 100644 index 00000000..4c613aa5 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/CMakeLists.txt @@ -0,0 +1,21 @@ +set(TEST_NAME onnx_div) + +# Compile Spatz task +add_spatz_task( + TEST_NAME ${TEST_NAME} + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/onnx_div_task.c + FIRST_TASK_NAME onnx_div_task + INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +# Compile CV32 executable with embedded Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c + INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) diff --git a/tests/spatz_on_magia/onnx_div/include/onnx_div_mem_layout.h b/tests/spatz_on_magia/onnx_div/include/onnx_div_mem_layout.h new file mode 100644 index 00000000..3db9e030 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/include/onnx_div_mem_layout.h @@ -0,0 +1,31 @@ +#ifndef ONNX_DIV_H_ +#define ONNX_DIV_H_ + +#include "data.h" +#include "magia_tile_utils.h" +#include "magia_utils.h" +#include "onnx_div_params.h" + +#define ALIGNMENT 4 +/* Aligns the given address to 4-byte */ +#define ALIGN_4B(addr) (((addr) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)) + +#define L1_BASE_TILE (L1_BASE + (get_hartid() * L1_TILE_OFFSET)) +#define VEC_SIZE (LEN * sizeof(float16)) + +#define ONNX_DIV_PARAMS_BASE L1_BASE_TILE +#define ONNX_DIV_PARAMS_SIZE ALIGN_4B(sizeof(onnx_div_params_t)) + +#define SRC_A_BASE ALIGN_4B(ONNX_DIV_PARAMS_BASE + ONNX_DIV_PARAMS_SIZE) +#define SRC_A_SIZE ALIGN_4B(VEC_SIZE) + +#define SRC_B_BASE ALIGN_4B(SRC_A_BASE + SRC_A_SIZE) +#define SRC_B_SIZE ALIGN_4B(VEC_SIZE) + +#define RES_BASE ALIGN_4B(SRC_B_BASE + SRC_B_SIZE) +#define RES_SIZE ALIGN_4B(VEC_SIZE) + +#define EXP_BASE ALIGN_4B(RES_BASE + RES_SIZE) +#define EXP_SIZE ALIGN_4B(VEC_SIZE) + +#endif /* ONNX_DIV_H_ */ diff --git a/tests/spatz_on_magia/onnx_div/include/onnx_div_params.h b/tests/spatz_on_magia/onnx_div/include/onnx_div_params.h new file mode 100644 index 00000000..24fe4007 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/include/onnx_div_params.h @@ -0,0 +1,14 @@ +#ifndef ONNX_DIV_PARAMS_H_ +#define ONNX_DIV_PARAMS_H_ + +#include + +typedef struct { + uintptr_t addr_res; + uintptr_t addr_exp; + uintptr_t addr_a; + uintptr_t addr_b; + uint32_t len; +} onnx_div_params_t; + +#endif /* ONNX_DIV_PARAMS_H_ */ diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c new file mode 100644 index 00000000..ed271843 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -0,0 +1,95 @@ +#include + +#include "compare_utils.h" +#include "data.h" +#include "event_unit_utils.h" +#include "onnx_div_mem_layout.h" +#include "onnx_div_params.h" +#include "onnx_div_task_bin.h" + +#include "magia_tile_utils.h" +#include "magia_spatz_utils.h" + +volatile onnx_div_params_t *params; + +static void init_data() +{ + uint32_t offset; + + for (int i = 0; i < LEN; i++) { + offset = i * sizeof(float16); + + mmio_fp16(EXP_BASE + offset) = expected[i]; + mmio_fp16(SRC_A_BASE + offset) = vec_a[i]; + mmio_fp16(SRC_B_BASE + offset) = vec_b[i]; + mmio_fp16(RES_BASE + offset) = 0; + } + + params = (volatile onnx_div_params_t *) ONNX_DIV_PARAMS_BASE; + params->addr_a = SRC_A_BASE; + params->addr_b = SRC_B_BASE; + params->addr_res = RES_BASE; + params->addr_exp = EXP_BASE; + params->len = LEN; +} + +static int run_spatz_task() +{ + int ret; + + eu_init(); + eu_enable_events(EU_SPATZ_DONE_MASK); + + spatz_init(SPATZ_BINARY_START); + spatz_run_task_with_params(ONNX_DIV_TASK, ONNX_DIV_PARAMS_BASE); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + ret = spatz_get_exit_code(); + + spatz_clk_dis(); + + return ret; +} + +static bool check_result() +{ + return vector_compare_fp16(params->addr_res, params->addr_exp, params->len); +} + +static bool run_test() +{ + int ret; + bool check; + + init_data(); + + ret = run_spatz_task(); + if (ret != 0) { + printf("[CV32] Spatz task FAILED with error: %d", ret); + return ret; + } + + check = check_result(); + if (check) { + printf("[CV32] Test SUCCESS\n"); + } else { + printf("[CV32 Test FAILED\n]"); + ret = -1; + } + + return ret; +} + +int main(void) +{ + int ret; + + printf("\n##################################### ONNX_DIV TEST #####################################\n\n"); + + ret = run_test(); + + printf("\n##########################################################################################\n\n"); + + return ret; +} diff --git a/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c b/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c new file mode 100644 index 00000000..ffabd35d --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c @@ -0,0 +1,39 @@ +#include "magia_spatz_utils.h" +#include "magia_tile_utils.h" +#include "onnx_div_params.h" + +int onnx_div_task(void) +{ + volatile onnx_div_params_t *params; + uintptr_t params_addr; + _Float16 *a; + _Float16 *b; + _Float16 *r; + size_t avl; + size_t vl; + + params_addr = mmio32(SPATZ_DATA); + params = (volatile onnx_div_params_t *) params_addr; + + r = (_Float16 *)params->addr_res; + a = (_Float16 *)params->addr_a; + b = (_Float16 *)params->addr_b; + avl = params->len; + + for (; avl > 0; avl -= vl) { + asm volatile ("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + asm volatile ("vle16.v v0, (%0)" :: "r"(a)); + asm volatile ("vle16.v v8, (%0)" :: "r"(b)); + + asm volatile ("vfdiv.vv v16, v0, v8"); + + asm volatile ("vse16.v v16, (%0)" :: "r"(r)); + + a += vl; + b += vl; + r += vl; + } + + return 0; +} diff --git a/tests/spatz_on_magia/onnx_div/test_data/data.h b/tests/spatz_on_magia/onnx_div/test_data/data.h new file mode 100644 index 00000000..f709ff16 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/test_data/data.h @@ -0,0 +1,11 @@ +/* Automatically generated header file for Spatz ONNX testing */ +#ifndef DATA_H_ +#define DATA_H_ + +#define LEN 2048 + +static const float16 vec_a[] = { 13.375000f, 12.640625f, -7.101562f, 1.538086f, 0.739746f, 4.250000f, -5.000000f, -3.652344f, -2.320312f, 8.109375f, 13.507812f, 8.367188f, -6.031250f, 7.761719f, 12.109375f, 12.664062f, -10.070312f, -9.406250f, 3.363281f, 18.218750f, 6.035156f, -1.087891f, 15.851562f, 1.745117f, 18.062500f, 5.625000f, -17.859375f, -5.734375f, 3.966797f, -6.683594f, -8.617188f, -11.125000f, 0.708984f, -8.296875f, -13.734375f, -4.277344f, -16.140625f, -7.031250f, 2.183594f, 2.525391f, -7.656250f, 2.076172f, -0.684570f, 0.437500f, -5.640625f, 22.828125f, 13.367188f, 13.000000f, -6.863281f, -3.158203f, -11.898438f, -4.812500f, -8.554688f, -4.562500f, -6.222656f, 5.539062f, 8.460938f, -13.718750f, 5.738281f, 10.414062f, 1.543945f, -16.390625f, -2.914062f, -9.796875f, -6.402344f, 7.238281f, -12.296875f, -1.791992f, 1.468750f, 16.843750f, -15.367188f, 2.865234f, -9.078125f, -1.943359f, 6.863281f, 0.167480f, -3.408203f, -2.458984f, -25.000000f, 10.851562f, -13.898438f, -4.246094f, -5.625000f, -14.273438f, 7.449219f, 4.300781f, 16.187500f, -7.003906f, -6.765625f, 9.007812f, -6.800781f, 1.050781f, 1.951172f, -17.906250f, 1.378906f, 8.687500f, -4.972656f, 5.273438f, -18.781250f, -1.076172f, -21.000000f, -1.599609f, -6.140625f, -15.226562f, -14.250000f, -5.945312f, -15.414062f, 19.718750f, -0.470459f, -8.226562f, -16.625000f, -6.222656f, 12.320312f, -1.435547f, 5.964844f, 5.554688f, -9.835938f, 9.273438f, 14.937500f, 8.687500f, -6.812500f, -0.137573f, 7.699219f, -0.018005f, -10.875000f, -0.012680f, -14.203125f, 3.005859f, 4.683594f, 16.781250f, -6.367188f, 3.470703f, -2.630859f, 6.835938f, -0.931152f, -15.617188f, -4.871094f, 0.866211f, 2.562500f, -2.066406f, -7.046875f, 8.937500f, 22.250000f, -7.460938f, -0.099426f, 18.218750f, -0.967285f, 0.076538f, 3.392578f, 18.046875f, 6.460938f, 9.085938f, -2.583984f, 8.414062f, -18.890625f, 3.873047f, -9.953125f, -0.754395f, 10.359375f, 6.226562f, -2.216797f, 5.945312f, -0.942383f, 5.226562f, -4.390625f, 6.511719f, 7.679688f, -14.593750f, -10.843750f, -12.343750f, 1.383789f, 1.241211f, -1.405273f, -25.921875f, 3.173828f, -7.199219f, 3.925781f, -34.375000f, -12.007812f, -15.429688f, 15.328125f, -10.617188f, 11.437500f, -4.492188f, -6.449219f, -9.593750f, 1.816406f, 2.824219f, 13.796875f, -0.421143f, 5.425781f, 6.523438f, 7.433594f, 2.224609f, -11.414062f, -16.453125f, 8.765625f, 10.117188f, 10.570312f, 7.273438f, -19.750000f, -10.281250f, -6.292969f, -9.320312f, 12.429688f, 6.976562f, -1.887695f, -16.109375f, 12.101562f, 16.125000f, 15.945312f, -4.515625f, -2.087891f, 16.296875f, 11.406250f, 4.058594f, 11.867188f, 10.414062f, 13.898438f, -14.578125f, -1.620117f, -7.429688f, -2.806641f, -1.946289f, -8.898438f, 4.835938f, 7.183594f, 1.278320f, 6.066406f, -2.500000f, -10.601562f, -12.671875f, 13.968750f, -10.468750f, 0.810059f, 19.421875f, -7.937500f, 6.285156f, -6.375000f, 14.304688f, -0.866699f, -2.494141f, 11.476562f, 10.875000f, -5.738281f, 4.066406f, -6.093750f, 7.582031f, -10.656250f, -9.351562f, -2.119141f, 0.334961f, -8.062500f, -9.789062f, -18.437500f, 8.820312f, 18.109375f, 1.313477f, 3.988281f, 9.617188f, 17.781250f, -7.101562f, -3.804688f, 16.296875f, 9.320312f, -2.781250f, -8.226562f, 11.031250f, 7.507812f, 7.070312f, 5.519531f, -0.426025f, -1.387695f, -3.466797f, -18.156250f, 1.342773f, -11.515625f, 20.031250f, -2.519531f, 8.171875f, -12.406250f, -15.968750f, -1.495117f, -3.957031f, 3.310547f, 10.937500f, 5.253906f, -10.789062f, -2.751953f, -0.229858f, 17.734375f, -6.402344f, -8.000000f, 15.937500f, -2.857422f, 13.617188f, -27.453125f, -0.712891f, 3.246094f, 15.390625f, 9.476562f, 6.851562f, -8.429688f, 6.960938f, 4.617188f, -1.795898f, -6.062500f, 5.644531f, -4.812500f, 18.250000f, -2.115234f, 8.734375f, 18.265625f, -7.507812f, -3.253906f, 0.384766f, 10.859375f, 0.836914f, -10.046875f, -0.708008f, 7.195312f, 0.480713f, 14.140625f, 5.449219f, 14.578125f, 8.539062f, -2.007812f, -8.953125f, -13.695312f, -14.570312f, 3.269531f, -0.106750f, -12.773438f, 11.484375f, 0.624023f, 3.505859f, -21.734375f, 4.328125f, -8.921875f, 7.156250f, 9.703125f, 9.867188f, 18.921875f, -1.944336f, 0.431885f, 13.367188f, 1.660156f, 2.460938f, 5.449219f, 3.886719f, -17.687500f, -2.130859f, 18.609375f, -15.890625f, -7.136719f, 1.945312f, -0.704590f, -4.687500f, 3.849609f, 2.507812f, 5.941406f, 5.691406f, 4.652344f, 0.396484f, -3.310547f, -15.562500f, 3.062500f, 2.500000f, -12.789062f, -12.906250f, 11.687500f, 3.976562f, -8.984375f, 20.093750f, -17.359375f, 7.777344f, -1.104492f, -3.755859f, 12.820312f, -9.398438f, -0.575195f, -12.500000f, 1.647461f, -1.597656f, -7.562500f, -13.421875f, -15.070312f, -7.261719f, -10.078125f, 23.125000f, 23.765625f, 0.197632f, -8.273438f, 6.449219f, -13.507812f, -3.759766f, 13.960938f, 21.312500f, 19.859375f, 0.919434f, -9.351562f, 12.468750f, -0.870605f, -2.886719f, 1.153320f, -7.878906f, 2.001953f, 0.727539f, 2.474609f, -5.574219f, 13.898438f, -4.453125f, -3.257812f, 17.437500f, 12.351562f, 15.484375f, -10.070312f, -12.359375f, -1.338867f, -10.343750f, 1.244141f, -13.132812f, -2.820312f, -2.027344f, -1.280273f, 0.211792f, -4.347656f, 1.772461f, 2.197266f, 2.144531f, -2.332031f, 0.341309f, 1.862305f, -8.585938f, -8.296875f, -9.492188f, 6.972656f, -6.304688f, -11.570312f, -17.890625f, 11.437500f, -0.193115f, -2.535156f, -13.718750f, -17.531250f, -7.488281f, 14.640625f, 12.968750f, -3.357422f, -18.968750f, -2.439453f, -5.953125f, -8.070312f, -8.125000f, -1.274414f, 5.527344f, 7.417969f, 1.231445f, 13.765625f, 5.113281f, -1.682617f, -14.812500f, -13.484375f, 9.843750f, 14.226562f, 3.039062f, -10.882812f, -11.343750f, 1.583984f, 6.683594f, -2.921875f, 0.780273f, 6.351562f, 4.917969f, 1.808594f, 21.531250f, -3.777344f, 19.046875f, 4.363281f, 7.691406f, 3.859375f, -10.765625f, 9.085938f, 2.248047f, 0.214600f, -7.902344f, -5.347656f, 20.265625f, -4.328125f, -0.634277f, 14.757812f, -15.718750f, 0.025803f, 15.406250f, -12.093750f, -13.765625f, -9.320312f, 4.230469f, 5.757812f, -7.105469f, -11.648438f, -6.648438f, 16.046875f, 13.523438f, 13.046875f, 6.074219f, 3.857422f, -16.656250f, 4.375000f, 13.296875f, 7.875000f, 15.531250f, -2.003906f, 10.976562f, -7.382812f, -2.689453f, -1.261719f, -10.335938f, 17.406250f, 3.789062f, 1.991211f, 14.617188f, 4.261719f, 6.414062f, -1.912109f, 1.611328f, -10.359375f, -19.031250f, -3.443359f, 1.792969f, -5.167969f, -1.970703f, -6.781250f, 3.115234f, -6.371094f, -4.242188f, -20.125000f, 20.859375f, -10.039062f, -7.875000f, -15.515625f, -3.580078f, -13.148438f, -6.445312f, -0.592773f, 10.945312f, -13.242188f, -3.701172f, 8.468750f, -9.132812f, -19.625000f, 13.945312f, -2.281250f, -14.773438f, -15.671875f, 6.585938f, -18.593750f, 15.156250f, 17.031250f, -1.169922f, 2.232422f, -3.814453f, 3.822266f, -13.015625f, -1.654297f, 10.429688f, -11.187500f, 1.670898f, -1.543945f, 10.062500f, 2.798828f, -6.070312f, -15.437500f, -13.593750f, 3.380859f, -23.062500f, 1.964844f, -1.111328f, 5.597656f, -21.593750f, -33.218750f, 0.822754f, -0.697754f, -2.482422f, -14.210938f, 1.055664f, 19.937500f, 7.066406f, 0.019470f, 5.164062f, 9.914062f, 3.078125f, 8.000000f, -20.203125f, -1.555664f, -5.078125f, 5.371094f, 18.859375f, -2.283203f, -2.652344f, -11.859375f, -11.289062f, 3.058594f, 7.332031f, 3.744141f, 8.812500f, 2.111328f, 4.058594f, -4.437500f, -6.410156f, -22.640625f, -23.062500f, -1.119141f, -3.310547f, -3.330078f, 10.726562f, -10.492188f, -6.054688f, -2.941406f, -15.367188f, 2.066406f, -16.687500f, 5.339844f, -15.109375f, -7.441406f, -7.000000f, 2.546875f, 10.367188f, -5.601562f, 12.117188f, -9.312500f, 9.070312f, -1.901367f, -1.027344f, 2.931641f, -3.816406f, 1.923828f, 5.796875f, 6.968750f, 7.660156f, -0.179199f, 16.000000f, 3.111328f, 5.277344f, 9.328125f, 2.898438f, 4.968750f, 4.808594f, -1.181641f, 7.097656f, 12.710938f, -7.339844f, 7.171875f, -8.054688f, -0.069458f, -6.058594f, -3.068359f, 4.218750f, 14.085938f, 2.814453f, -0.021255f, -7.750000f, -6.734375f, 4.812500f, 7.867188f, 4.144531f, 4.175781f, -15.406250f, 9.468750f, -20.953125f, -1.560547f, -8.781250f, -21.437500f, 4.562500f, 20.437500f, -1.975586f, 22.046875f, -6.078125f, -7.773438f, -9.015625f, -2.800781f, -0.023697f, -4.664062f, -13.867188f, -15.234375f, -0.790039f, 8.429688f, 5.054688f, -2.527344f, 3.365234f, -17.140625f, -7.476562f, 24.140625f, 14.632812f, -5.640625f, -12.492188f, 25.140625f, 1.019531f, 2.412109f, -10.789062f, 13.000000f, -13.250000f, -2.220703f, 10.218750f, -3.482422f, 2.232422f, 5.347656f, -26.984375f, -9.156250f, 0.873535f, 10.820312f, 0.979980f, -7.035156f, 4.632812f, -8.039062f, -3.267578f, -5.855469f, -19.406250f, 0.443848f, 12.625000f, 5.714844f, 9.000000f, -15.070312f, 8.835938f, -2.746094f, -5.933594f, 3.494141f, -10.070312f, -9.109375f, 18.671875f, 9.687500f, -6.726562f, -14.257812f, 12.539062f, 12.914062f, -11.960938f, 6.113281f, 8.992188f, -10.625000f, -1.656250f, 2.802734f, -0.249023f, 2.904297f, 9.796875f, 1.746094f, 12.375000f, 7.292969f, 4.207031f, -3.812500f, -2.988281f, 2.574219f, -27.718750f, 3.791016f, -0.817871f, -14.500000f, 18.406250f, -12.601562f, -10.195312f, 3.183594f, 6.472656f, 14.789062f, 5.242188f, -3.550781f, -4.695312f, -13.796875f, -7.117188f, 12.335938f, -10.375000f, -3.177734f, -6.046875f, 8.281250f, -13.039062f, -3.093750f, 27.218750f, 2.214844f, -2.009766f, -0.225708f, -8.570312f, -2.769531f, -13.578125f, -6.976562f, -35.375000f, -2.353516f, -11.007812f, 20.484375f, 11.515625f, -6.304688f, 6.585938f, 1.870117f, -11.406250f, 6.832031f, -7.929688f, 12.523438f, 14.789062f, 18.312500f, -8.867188f, 14.320312f, 15.125000f, 17.109375f, 0.556152f, -16.218750f, 7.410156f, 6.113281f, 0.166992f, -13.328125f, -5.640625f, 3.542969f, -5.824219f, -7.277344f, 5.210938f, -3.054688f, -2.611328f, -10.515625f, -16.406250f, -5.222656f, -9.648438f, 10.960938f, 10.390625f, 5.628906f, -3.738281f, 17.375000f, 6.285156f, -15.679688f, -1.489258f, 15.234375f, 13.687500f, -5.476562f, -27.312500f, 2.580078f, -0.081787f, -2.230469f, -3.052734f, -2.240234f, 2.593750f, 3.083984f, 3.566406f, -14.382812f, -3.664062f, -26.109375f, -14.562500f, -8.304688f, -2.972656f, -12.687500f, -1.711914f, -3.550781f, -1.784180f, -7.429688f, 2.914062f, -13.289062f, -14.312500f, 21.312500f, 7.140625f, -8.921875f, 0.952148f, -7.945312f, 14.804688f, -13.500000f, 1.321289f, -14.921875f, 18.984375f, 8.429688f, 11.148438f, 14.484375f, 5.582031f, 5.945312f, -6.664062f, -5.546875f, -3.060547f, 7.546875f, 2.855469f, 8.523438f, -1.766602f, -0.687012f, 6.042969f, -10.109375f, -19.953125f, 4.625000f, 2.376953f, 3.015625f, 10.585938f, 16.953125f, 1.773438f, 10.078125f, 9.195312f, 5.226562f, -10.664062f, 1.516602f, 8.375000f, -6.234375f, -14.062500f, -1.080078f, -16.343750f, -5.425781f, -11.734375f, 2.439453f, 6.328125f, -0.404297f, 17.484375f, -1.832031f, 23.296875f, 1.720703f, 21.046875f, -17.531250f, 13.328125f, -4.144531f, 6.003906f, 2.767578f, 4.277344f, -0.564453f, 9.046875f, 6.273438f, 22.453125f, 4.031250f, 1.722656f, 1.125977f, -3.867188f, -11.578125f, -0.296631f, 3.500000f, -18.953125f, 0.452393f, 11.210938f, -4.617188f, 4.968750f, -6.304688f, 6.527344f, -4.113281f, 7.523438f, -21.593750f, -2.742188f, -15.539062f, 11.773438f, 3.994141f, 8.000000f, -6.343750f, 0.225464f, 22.406250f, 8.101562f, 9.734375f, 8.226562f, -1.659180f, -7.238281f, 16.671875f, 6.488281f, -9.710938f, -0.755859f, 6.910156f, -9.117188f, -13.140625f, 5.261719f, 15.796875f, 7.398438f, -26.125000f, 5.738281f, 13.968750f, -8.023438f, 10.445312f, -7.496094f, 16.765625f, -16.640625f, -3.904297f, 11.632812f, 7.175781f, -9.039062f, 1.875977f, 4.355469f, 3.847656f, -5.480469f, -4.613281f, 19.921875f, 4.820312f, -6.625000f, 1.696289f, 2.574219f, -4.964844f, -14.078125f, -0.264160f, -6.828125f, 5.980469f, -4.246094f, 23.562500f, 7.292969f, -3.525391f, -13.906250f, 0.611328f, 14.343750f, -8.492188f, -7.625000f, -11.703125f, -5.703125f, -9.101562f, 0.451172f, 18.937500f, 15.148438f, -1.603516f, 4.085938f, 9.539062f, -6.703125f, 6.101562f, 4.062500f, 12.171875f, -13.359375f, -1.354492f, 6.269531f, 10.882812f, -18.000000f, -4.777344f, -9.640625f, -1.679688f, 1.945312f, 6.988281f, -11.968750f, -18.640625f, 10.867188f, -2.853516f, -13.835938f, -0.342041f, 0.238525f, -4.289062f, -0.439209f, -7.820312f, -3.240234f, 11.382812f, -4.601562f, 3.472656f, -0.317627f, -1.686523f, -13.164062f, -5.074219f, 27.093750f, 9.398438f, -0.906250f, 0.516113f, 10.218750f, 21.109375f, -4.179688f, -18.640625f, 11.343750f, -23.203125f, 3.578125f, 19.609375f, 18.750000f, 1.047852f, 3.234375f, 1.600586f, 11.320312f, -1.328125f, -5.171875f, -19.375000f, 6.343750f, 2.927734f, 6.289062f, -3.433594f, 16.218750f, -11.828125f, 2.162109f, 11.664062f, 9.632812f, -15.609375f, -13.828125f, 5.453125f, -2.068359f, 0.256836f, -0.169434f, -2.240234f, 15.507812f, -0.507812f, 2.234375f, 9.500000f, 10.476562f, 2.423828f, -13.632812f, 7.257812f, -11.281250f, -4.296875f, 2.537109f, 6.304688f, 3.015625f, -4.734375f, -14.476562f, 3.882812f, -13.789062f, 8.125000f, 7.371094f, -1.534180f, -2.839844f, -11.851562f, -2.193359f, 7.109375f, 9.468750f, 4.390625f, -13.695312f, -0.116028f, -10.757812f, 5.015625f, -4.242188f, -9.890625f, 0.008736f, -4.183594f, -6.031250f, 9.101562f, -7.722656f, -4.496094f, -17.656250f, 0.920410f, 21.812500f, -12.804688f, -9.679688f, 5.949219f, 12.281250f, 2.677734f, -7.957031f, -11.820312f, -8.921875f, -6.980469f, -3.085938f, -8.570312f, 3.513672f, 3.457031f, -0.972656f, -2.287109f, 0.461914f, 6.710938f, 15.671875f, -11.554688f, 3.216797f, 3.863281f, 5.871094f, 0.506348f, -23.953125f, 5.289062f, -15.937500f, -2.382812f, -15.414062f, 27.734375f, 21.765625f, -14.335938f, -17.109375f, 6.828125f, 17.875000f, 10.703125f, -18.671875f, -13.882812f, -1.803711f, 2.324219f, -11.117188f, -3.990234f, -3.988281f, 0.961426f, 0.430176f, -17.812500f, 8.171875f, 2.185547f, 11.187500f, -6.679688f, -9.382812f, 9.429688f, 15.789062f, -7.871094f, -4.308594f, 15.601562f, -0.599121f, 11.406250f, 17.953125f, -14.023438f, 9.117188f, 12.265625f, -16.625000f, -3.835938f, 10.218750f, 21.359375f, 12.851562f, -7.019531f, -6.875000f, -10.804688f, 0.242554f, -7.238281f, -5.203125f, -8.117188f, 4.613281f, 3.339844f, -20.718750f, -12.492188f, 0.344482f, 4.941406f, 5.792969f, 18.171875f, 2.980469f, -6.324219f, 18.218750f, 1.821289f, -14.500000f, -12.656250f, 8.656250f, -6.398438f, -12.437500f, 8.742188f, -3.835938f, 10.695312f, -2.392578f, 8.632812f, -0.157593f, 1.920898f, -0.417969f, 1.019531f, -8.273438f, -16.234375f, -7.187500f, -8.984375f, -5.789062f, -4.437500f, -3.480469f, -12.070312f, -6.128906f, 6.988281f, -5.792969f, 6.515625f, 16.062500f, -4.070312f, 0.173706f, -2.515625f, -4.957031f, 9.500000f, -18.703125f, -3.029297f, -5.566406f, -5.445312f, 5.636719f, -12.718750f, 15.515625f, 4.164062f, -10.148438f, 3.880859f, 23.171875f, -10.757812f, 7.535156f, -7.574219f, -24.453125f, -7.957031f, 3.617188f, 4.671875f, -8.390625f, -4.121094f, 6.121094f, 6.777344f, -11.820312f, 2.316406f, 13.421875f, 12.976562f, 8.210938f, 1.196289f, -18.796875f, 4.539062f, -7.957031f, -4.003906f, 24.875000f, -2.990234f, -5.707031f, -0.254639f, -4.925781f, -1.029297f, -11.390625f, -13.843750f, -0.464600f, 17.015625f, -17.265625f, -15.484375f, 7.050781f, 0.687500f, -16.312500f, -23.765625f, 4.292969f, 9.343750f, 13.632812f, -9.695312f, 13.765625f, -2.156250f, -5.410156f, 2.427734f, 8.718750f, 0.444824f, 11.242188f, -3.251953f, -16.375000f, -4.093750f, 11.726562f, -5.847656f, 14.718750f, -0.486816f, 0.748535f, 0.419922f, -2.990234f, 3.726562f, -28.281250f, -16.593750f, 2.546875f, -14.304688f, 2.011719f, -7.980469f, 10.562500f, 14.726562f, 4.425781f, 1.742188f, 1.907227f, -0.798828f, -3.824219f, -10.585938f, 8.046875f, -9.390625f, -5.667969f, -10.578125f, -2.775391f, 12.921875f, -3.703125f, 5.773438f, 8.562500f, 9.562500f, 10.625000f, 10.875000f, -12.257812f, -8.382812f, 8.585938f, -9.437500f, -6.285156f, -10.984375f, -3.937500f, 7.578125f, 6.808594f, 1.359375f, -7.804688f, -19.921875f, -9.835938f, -2.611328f, 7.339844f, -15.015625f, -10.734375f, -1.287109f, 3.410156f, 9.179688f, 0.935547f, 2.041016f, -15.742188f, -12.429688f, 11.546875f, -0.912598f, -7.054688f, 6.894531f, 12.648438f, 1.964844f, -1.995117f, 4.847656f, 12.921875f, -0.662598f, -4.308594f, -5.222656f, 13.281250f, 5.214844f, 6.847656f, -7.250000f, -0.868652f, -4.507812f, -1.020508f, -3.806641f, -1.188477f, -4.921875f, -13.796875f, 22.187500f, -11.226562f, 5.621094f, -11.101562f, 6.593750f, 5.039062f, 5.480469f, -9.640625f, 10.109375f, -7.226562f, 2.310547f, -7.761719f, 0.339844f, -6.902344f, 5.058594f, 9.984375f, 12.750000f, -9.929688f, -15.601562f, -16.687500f, -1.421875f, 12.460938f, -16.750000f, 0.671387f, -2.427734f, 14.375000f, 10.492188f, 8.570312f, 9.507812f, 10.617188f, -16.593750f, -9.921875f, 2.035156f, -1.250000f, 3.886719f, 4.796875f, -7.703125f, -5.796875f, -17.203125f, -10.750000f, -2.220703f, 2.546875f, 9.554688f, -5.898438f, 20.843750f, -7.332031f, -7.800781f, 8.070312f, -16.500000f, -21.984375f, 9.375000f, 0.200562f, 0.799805f, 0.412842f, 1.871094f, -9.625000f, 0.148193f, 10.429688f, 5.468750f, 1.358398f, -0.734863f, 9.437500f, 1.203125f, 4.757812f, 14.234375f, 12.851562f, 3.386719f, -0.622070f, -11.984375f, 5.945312f, -1.348633f, -0.412842f, -7.042969f, 9.820312f, 3.898438f, 6.507812f, 7.226562f, 0.948730f, 5.332031f, -22.968750f, 6.523438f, 9.406250f, -4.054688f, -2.640625f, -2.486328f, -5.027344f, 3.255859f, -15.250000f, 0.107971f, -11.015625f, 8.546875f, -5.757812f, 7.460938f, 10.257812f, -11.304688f, -1.981445f, -14.687500f, 12.242188f, 13.875000f, -22.656250f, -5.691406f, -8.804688f, 3.875000f, 0.033417f, 8.984375f, -27.578125f, -9.414062f, 23.406250f, -4.156250f, 3.833984f, 2.539062f, 8.554688f, -16.250000f, -9.992188f, 1.302734f, 22.296875f, -16.890625f, -25.562500f, -3.544922f, -5.843750f, 2.531250f, -6.570312f, 6.082031f, -15.093750f, -0.511230f, 0.744629f, 1.049805f, -3.882812f, -1.634766f, -0.179688f, -9.000000f, 8.351562f, 3.416016f, 4.406250f, -0.814941f, -5.421875f, 6.187500f, 9.484375f, 3.482422f, -13.210938f, 1.721680f, -8.460938f, -7.882812f, 7.738281f, -5.230469f, -11.382812f, 4.863281f, -1.270508f, 10.945312f, 1.562500f, 1.564453f, -2.871094f, -18.046875f, 2.263672f, 4.019531f, 4.644531f, 7.523438f, 1.979492f, -12.195312f, 6.074219f, -8.523438f, -2.125000f, 8.296875f, 3.402344f, 2.136719f, 18.812500f, 1.597656f, 1.828125f, 0.350098f, -9.046875f, -6.859375f, 20.671875f, 0.978516f, 4.730469f, 13.476562f, -9.085938f, -1.445312f, 6.484375f, 8.750000f, 12.601562f, 3.068359f, -8.890625f, -16.656250f, 14.203125f, -12.859375f, -0.910156f, -12.656250f, 0.489502f, 11.804688f, 16.015625f, -6.699219f, 6.957031f, -8.453125f, 4.363281f, -13.500000f, -9.820312f, -5.917969f, 11.867188f, 10.242188f, 10.703125f, 10.070312f, -4.125000f, 8.140625f, -6.019531f, 20.421875f, 11.867188f, 1.169922f, -9.078125f, -4.757812f, -14.992188f, -4.363281f, 10.750000f, -6.882812f, -0.408203f, -14.765625f, -15.781250f, -0.123962f, -13.914062f, -7.320312f, 4.078125f, 2.666016f, 4.972656f, 1.576172f, -9.375000f, 9.859375f, 0.345215f, 6.152344f, 7.367188f, -2.214844f, -13.609375f, 1.009766f, -13.507812f, 12.093750f, 1.190430f, -5.660156f, 5.593750f, -19.437500f, 17.437500f, -8.062500f, -6.953125f, -10.484375f, 8.953125f, -2.351562f, -6.652344f, -9.179688f, -2.757812f, 2.843750f, 6.871094f, -10.203125f, 16.781250f, -1.027344f, -12.234375f, 2.509766f, -1.168945f, 4.101562f, 2.039062f, 5.148438f, 14.109375f, 1.338867f, 12.453125f, 26.843750f, 11.640625f, 2.500000f, 0.619629f, -7.320312f, 9.984375f, -7.972656f, 10.757812f, -22.093750f, -10.851562f, -7.382812f, 6.433594f, -1.346680f, 14.296875f, -11.992188f, 10.625000f, -3.558594f, 3.994141f, -12.101562f, -9.335938f, 1.636719f, -3.916016f, 14.843750f, 9.859375f, -17.609375f, -5.503906f, 21.484375f, 10.750000f, 2.564453f, -26.937500f, 1.275391f, 3.861328f, 0.266602f, 12.937500f, -8.617188f, 12.140625f, -11.812500f, 0.253174f, -10.453125f, -1.754883f, -6.707031f, 11.648438f, 4.445312f, 3.365234f, 0.368164f, -4.734375f, 3.937500f, 16.015625f, -10.796875f, -12.710938f, -1.673828f, 17.593750f, 8.953125f, -17.156250f, 4.593750f, -6.535156f, 0.596680f, -11.062500f, -0.856934f, 8.078125f, -4.117188f, 10.257812f, -12.835938f, -13.585938f, -0.140381f, 5.453125f, 16.078125f, 18.296875f, -5.191406f, 2.140625f, -6.781250f, 8.328125f, 12.328125f, 2.320312f, -7.468750f, -15.695312f, -9.242188f, 1.868164f, -17.640625f, 3.056641f, -22.562500f, 15.523438f, 9.750000f, -19.343750f, 3.707031f, -4.222656f, 7.171875f, -2.128906f, -0.553223f, 6.046875f, 10.742188f, 0.485840f, -6.957031f, 3.574219f, 20.625000f, 10.281250f, 9.617188f, 3.509766f, -3.230469f, -2.326172f, -18.093750f, -4.417969f, 2.556641f, -3.207031f, -5.902344f, 4.292969f, -15.921875f, -0.257812f, -17.609375f, 0.293457f, -13.296875f, -11.585938f, 4.804688f, 1.904297f, -0.340332f, -0.272461f, 1.341797f, 2.753906f, 4.148438f, -11.726562f, -17.437500f, -1.759766f, 1.939453f, -6.191406f, 3.421875f, 1.262695f, 20.828125f, -1.323242f, -2.132812f, -14.289062f, 11.695312f, -15.093750f, -6.453125f, -9.445312f, 7.492188f, -13.234375f, -3.087891f, -8.945312f, 27.265625f, 17.421875f, 3.707031f, -4.175781f, 6.738281f, 14.875000f, -9.468750f, -4.621094f, 19.109375f, 0.158081f, 0.026978f, -1.777344f, -0.719238f, 0.955078f, -5.417969f, -7.828125f, 9.039062f, -9.609375f, 6.437500f, 4.605469f, -6.871094f, 16.078125f, 3.708984f, 0.302002f, -0.696289f, -0.704590f, -7.136719f, -13.429688f, -2.378906f, 4.257812f, -17.046875f, -9.695312f, -3.316406f, -9.343750f, -2.025391f, -5.472656f, -0.655273f, -7.953125f, -0.625488f, 4.652344f, 16.953125f, 5.167969f, -13.382812f, 15.890625f, -3.218750f, 1.004883f, 12.062500f, 4.742188f, 1.678711f, -12.320312f, -6.027344f, 11.250000f, 10.046875f, 0.279541f, -22.718750f, -12.960938f, 2.302734f, -13.140625f, -7.121094f, -21.250000f, 7.410156f, 2.552734f, -12.218750f, 12.546875f, 21.375000f, 1.121094f, -17.000000f, -8.593750f, -5.476562f, -7.894531f, 6.535156f, 10.679688f, -10.187500f, 13.875000f, -14.789062f, -3.363281f, 7.648438f, 7.781250f, 4.257812f, -22.484375f, 6.300781f, 11.289062f, 5.734375f, -11.695312f, -21.421875f, -13.109375f, 6.792969f, 2.193359f, -8.210938f, -12.031250f, 13.218750f, -9.632812f, -14.171875f, 0.402344f, -0.494141f, 0.029724f, -3.052734f, 11.539062f, 17.140625f, 6.617188f, 28.640625f, 8.929688f, 7.546875f, 13.859375f, -9.734375f, -8.757812f, 11.781250f, -14.617188f, -3.720703f, -7.789062f, 9.054688f, 1.609375f, -1.468750f, 4.437500f, -7.171875f, -1.668945f, -3.048828f, 2.847656f, 5.792969f, -17.500000f, 5.664062f, 1.816406f, -12.195312f, -1.610352f, 10.195312f, 1.409180f, 0.506836f, 4.398438f, -7.847656f, 5.476562f, -24.140625f, -4.222656f, 8.921875f, -3.316406f, 16.343750f, -2.732422f, -1.881836f, -2.787109f, 18.609375f, 2.337891f, 5.730469f, -10.765625f, 2.697266f, 1.504883f, -14.945312f, -6.054688f, -5.335938f, -2.859375f, -2.980469f, -1.719727f, 10.453125f, -1.175781f, 0.001366f, 1.819336f, -8.453125f, -8.054688f, 12.265625f, -5.773438f, 14.031250f, -3.617188f, 10.070312f, 11.304688f, -1.307617f, -9.320312f, 4.957031f, -12.609375f, 2.134766f, -9.851562f, -0.063843f, 10.257812f, -3.332031f, -7.410156f, 11.468750f, 0.487305f, 15.421875f, 1.496094f, 0.225952f, -2.550781f, 7.558594f, 8.062500f, 10.929688f, 13.257812f, 6.386719f, 7.949219f, -6.484375f, 16.609375f, 6.132812f, -2.900391f, -6.894531f, 4.386719f, 13.101562f, 2.472656f, 0.867188f, 11.867188f, -11.039062f, 8.187500f, -1.906250f, -19.937500f, 2.976562f, 3.978516f, 4.402344f, 2.332031f, -2.060547f, 1.347656f, 16.312500f, -5.812500f, -6.292969f, -3.603516f, -8.492188f, -11.140625f, -5.574219f, -11.601562f, -1.159180f, -9.007812f, -16.546875f, -7.910156f, -3.488281f, -4.917969f, -7.730469f, -6.343750f, 7.046875f, 6.070312f, -2.845703f, -3.554688f, -4.824219f, -1.256836f, 5.343750f, 10.015625f, -11.617188f, -14.523438f, 11.062500f, -15.914062f, 9.656250f, 3.072266f, -3.945312f, -28.671875f, 3.734375f, -11.898438f, -10.140625f, 24.484375f, -5.285156f, 5.460938f, 7.789062f, 8.835938f, -5.183594f, -0.898438f, -12.828125f, -2.923828f, 2.140625f, 13.148438f, 22.171875f, -10.531250f, 5.781250f, -2.214844f, 11.968750f, 3.126953f, 22.953125f, -19.218750f, 14.757812f, 10.953125f, -8.632812f, -18.937500f, -5.429688f, -4.039062f, -2.478516f, -6.500000f, 2.296875f, -12.187500f, -5.777344f, -6.683594f, -3.906250f, 17.531250f, 0.767090f, -5.828125f, 0.546875f, -12.156250f, 7.921875f, -7.492188f, -6.089844f, -21.046875f, 13.250000f, 19.796875f, 9.906250f, -4.718750f }; +static const float16 vec_b[] = { -7.289062f, 8.796875f, -20.312500f, -13.632812f, -9.484375f, -27.484375f, -0.328369f, 8.812500f, -1.603516f, -5.343750f, 1.144531f, -6.339844f, 13.671875f, -14.570312f, 11.148438f, 9.164062f, 1.923828f, -6.109375f, -6.386719f, 16.031250f, -19.437500f, 13.835938f, 18.296875f, -0.481689f, -13.054688f, -0.025726f, -7.128906f, -3.638672f, 4.546875f, 5.671875f, -17.046875f, -3.566406f, 9.906250f, 6.660156f, 3.759766f, -0.114746f, -21.140625f, 8.007812f, -10.718750f, 18.375000f, 3.000000f, 5.019531f, 4.207031f, -14.359375f, 12.695312f, 6.394531f, 11.507812f, 11.992188f, 13.312500f, 7.750000f, -1.370117f, 3.771484f, -12.351562f, -2.716797f, 14.656250f, 15.726562f, 1.442383f, 5.433594f, 17.015625f, 2.673828f, 21.296875f, -0.902344f, -10.515625f, 7.937500f, -7.472656f, 0.192627f, 1.977539f, -24.015625f, -10.718750f, -18.000000f, 7.429688f, -0.196045f, 6.140625f, 3.429688f, -12.101562f, 2.228516f, -3.998047f, 8.968750f, -7.925781f, -3.369141f, 7.914062f, 11.000000f, -3.220703f, 0.470947f, -5.078125f, 1.471680f, -2.042969f, 20.875000f, -13.968750f, 2.234375f, -14.085938f, -0.246582f, -3.470703f, -6.519531f, 3.000000f, 7.300781f, 10.132812f, 9.132812f, -6.781250f, 10.976562f, -3.560547f, 0.851074f, -3.759766f, -11.234375f, 0.826660f, -3.587891f, -0.254150f, -5.867188f, 12.312500f, -9.351562f, -4.542969f, 11.320312f, 15.828125f, -15.890625f, -5.726562f, -1.074219f, -13.992188f, 8.242188f, -12.273438f, 5.796875f, -8.750000f, -2.384766f, -6.789062f, -5.082031f, 9.007812f, 5.605469f, 9.304688f, 31.765625f, -16.406250f, 8.617188f, 4.519531f, 12.648438f, 4.015625f, 1.390625f, -9.867188f, -11.101562f, 16.406250f, 10.117188f, 18.109375f, 4.445312f, 7.191406f, 0.185547f, 4.804688f, 2.648438f, -9.687500f, 2.009766f, 14.343750f, -3.636719f, 2.361328f, -2.880859f, 6.757812f, -6.175781f, -13.789062f, -19.328125f, 19.093750f, -4.359375f, -7.378906f, 10.445312f, -14.023438f, -2.324219f, -4.855469f, 12.890625f, -10.164062f, -2.953125f, 12.593750f, 25.484375f, 10.359375f, 22.968750f, -0.619629f, 5.476562f, -2.052734f, -5.906250f, -16.812500f, 10.039062f, 5.644531f, 2.107422f, -13.960938f, 6.250000f, 0.185181f, 10.789062f, -10.656250f, 11.429688f, 5.179688f, -7.000000f, -5.261719f, -7.125000f, -13.328125f, -17.109375f, -0.913086f, -2.615234f, 0.759277f, -14.078125f, -14.195312f, -0.323975f, 19.031250f, -16.312500f, -4.539062f, -0.218262f, -5.917969f, -21.015625f, 17.203125f, -2.839844f, 4.195312f, -6.074219f, 5.472656f, -18.203125f, -7.902344f, -2.810547f, -11.273438f, -5.300781f, 4.179688f, -9.554688f, 17.328125f, -1.090820f, 6.234375f, -0.465088f, -0.708984f, 4.152344f, -17.171875f, 1.466797f, 1.021484f, -6.863281f, 0.671387f, -0.196411f, 7.843750f, -13.218750f, -1.906250f, -6.941406f, -3.023438f, -15.273438f, 4.718750f, -8.484375f, -1.927734f, 1.020508f, -18.187500f, -0.481445f, -15.351562f, 8.226562f, 2.289062f, -3.595703f, 7.972656f, 1.419922f, -13.906250f, -0.272705f, -3.113281f, -4.199219f, -2.734375f, -1.293945f, 6.031250f, -9.273438f, 12.609375f, -6.535156f, -12.789062f, 13.281250f, 11.414062f, 12.054688f, 12.484375f, -0.201416f, -1.745117f, -12.804688f, 7.171875f, -11.093750f, 16.796875f, -14.570312f, -7.093750f, 2.935547f, 4.875000f, 3.130859f, 7.953125f, -0.176880f, 10.257812f, 16.609375f, -4.652344f, -7.582031f, 3.417969f, 9.226562f, 12.984375f, -4.566406f, 1.060547f, 5.644531f, -21.468750f, 2.558594f, -11.054688f, -6.410156f, -7.109375f, 6.945312f, -12.562500f, -2.867188f, 19.500000f, -6.386719f, 4.312500f, 6.878906f, 12.226562f, 0.510254f, -12.367188f, -24.218750f, 17.546875f, -3.755859f, -12.390625f, -0.673828f, 2.841797f, -7.664062f, 8.671875f, -5.921875f, 12.710938f, -4.687500f, -9.531250f, -3.845703f, 1.411133f, -4.144531f, 6.191406f, 16.359375f, -6.703125f, -8.414062f, -12.679688f, 7.578125f, -17.968750f, 1.682617f, 17.015625f, 3.494141f, -1.513672f, 9.578125f, 4.460938f, 7.757812f, 2.525391f, 5.304688f, -5.921875f, -6.554688f, -13.437500f, -4.445312f, 15.648438f, 6.066406f, -8.914062f, 7.882812f, 6.156250f, -7.031250f, 6.105469f, 14.750000f, -1.643555f, 13.171875f, -15.945312f, 5.453125f, 0.328369f, -18.828125f, -11.281250f, -7.632812f, 19.406250f, -6.207031f, -21.656250f, -0.635254f, -2.568359f, 17.437500f, 2.183594f, 2.150391f, 7.406250f, -13.507812f, 0.998535f, -20.734375f, 19.656250f, -6.746094f, -23.296875f, -16.796875f, -12.109375f, -13.007812f, -9.484375f, -5.128906f, -1.745117f, 9.921875f, 0.523438f, 8.546875f, -10.000000f, -2.900391f, -20.062500f, 11.382812f, 2.199219f, -10.242188f, -3.412109f, 8.015625f, 16.765625f, -17.687500f, -1.549805f, 20.140625f, -12.289062f, 4.398438f, 1.385742f, -0.269287f, 2.931641f, -2.011719f, -2.683594f, -9.953125f, -3.087891f, -23.328125f, 5.300781f, 5.878906f, 10.148438f, -12.546875f, 1.537109f, -17.531250f, 14.328125f, 6.207031f, -4.582031f, 23.625000f, 7.343750f, -7.390625f, -5.726562f, -3.988281f, 1.729492f, 17.859375f, -5.300781f, 12.000000f, 2.017578f, 11.351562f, 8.875000f, 3.310547f, 3.001953f, 1.922852f, -8.929688f, -9.492188f, 12.484375f, 10.234375f, -33.781250f, 2.189453f, 5.390625f, 14.671875f, -0.053406f, -5.273438f, -10.796875f, -0.408447f, -8.851562f, 15.109375f, 19.187500f, 9.375000f, -8.406250f, 12.429688f, 19.031250f, -5.996094f, -7.781250f, 0.795898f, 2.828125f, 1.451172f, 22.656250f, -4.621094f, -11.687500f, 12.312500f, -4.929688f, 7.238281f, 4.019531f, -8.351562f, -3.076172f, 10.109375f, 7.187500f, -0.645508f, -13.046875f, -1.791992f, 1.444336f, 3.476562f, -1.087891f, -1.376953f, -2.306641f, 5.894531f, 4.847656f, 2.767578f, -3.326172f, 14.500000f, -14.148438f, -12.695312f, 12.796875f, 20.671875f, -0.251709f, -6.703125f, -3.931641f, 15.359375f, 0.631348f, 5.792969f, -9.765625f, -9.085938f, -9.578125f, 10.960938f, 14.984375f, -19.203125f, 6.878906f, 4.472656f, -8.734375f, -4.015625f, -1.121094f, 10.820312f, -0.045258f, -10.351562f, -7.921875f, -6.500000f, 18.406250f, -0.063293f, -3.728516f, 5.175781f, 2.009766f, 10.789062f, -4.660156f, 1.763672f, -7.347656f, -2.648438f, -12.960938f, -9.789062f, 1.315430f, -11.257812f, 9.898438f, -10.625000f, -0.835449f, 8.445312f, -15.859375f, 0.901855f, -12.203125f, -3.431641f, 13.101562f, -4.734375f, -0.999023f, -9.523438f, 10.195312f, -19.656250f, -12.890625f, -14.148438f, -12.750000f, 19.671875f, -2.365234f, -1.854492f, 2.478516f, 4.398438f, -13.203125f, -11.554688f, -3.996094f, 10.984375f, -14.468750f, 7.820312f, -4.562500f, -3.589844f, 1.588867f, -2.818359f, 1.605469f, 10.851562f, -12.093750f, 10.656250f, -2.386719f, 3.611328f, 0.742188f, -8.257812f, -3.566406f, -5.964844f, 2.375000f, -5.648438f, 6.925781f, 6.988281f, 5.820312f, 1.923828f, 5.281250f, 14.539062f, -2.054688f, 0.102661f, -3.277344f, -13.156250f, -2.644531f, -5.757812f, -5.718750f, 6.722656f, -4.941406f, 1.197266f, -10.054688f, -13.953125f, -1.300781f, -15.515625f, 14.187500f, 11.796875f, -7.792969f, -3.691406f, 5.265625f, -16.843750f, 18.906250f, -0.421387f, -15.617188f, 4.167969f, 3.316406f, -1.110352f, -16.265625f, -0.065674f, -10.320312f, -18.046875f, 3.267578f, -0.447266f, 1.203125f, 0.407959f, -9.937500f, 1.914062f, -5.796875f, 7.156250f, -0.688477f, -8.234375f, -4.562500f, -15.359375f, -19.531250f, 1.115234f, 9.210938f, -16.953125f, -11.593750f, -13.570312f, 10.718750f, -14.289062f, -2.226562f, -11.859375f, -19.515625f, 1.763672f, 0.632324f, -7.816406f, 7.597656f, -16.281250f, 25.609375f, -4.277344f, -9.187500f, -4.562500f, 1.794922f, -7.648438f, -0.874512f, -18.375000f, 9.828125f, 13.125000f, 6.828125f, -12.890625f, -4.203125f, -8.343750f, 2.849609f, -0.891602f, -5.269531f, 8.265625f, 8.820312f, -0.656738f, 2.701172f, -5.035156f, 2.388672f, 5.687500f, -2.503906f, -11.312500f, -3.742188f, -10.507812f, 14.726562f, 3.929688f, 18.046875f, -1.987305f, -7.406250f, -0.720215f, -3.986328f, 3.617188f, 0.841309f, 6.613281f, 8.984375f, -12.101562f, -1.857422f, -18.250000f, 8.859375f, -13.109375f, -6.328125f, -14.062500f, 16.109375f, 8.375000f, 11.953125f, 1.534180f, -4.312500f, -9.382812f, -0.202637f, -19.046875f, -20.671875f, 2.044922f, 1.091797f, 7.800781f, 3.558594f, 5.035156f, 1.966797f, 3.220703f, 12.328125f, -5.675781f, -1.219727f, -8.289062f, -4.343750f, 8.109375f, 10.156250f, -22.156250f, 2.537109f, -0.525391f, -0.927246f, -7.816406f, 7.878906f, 3.035156f, 1.968750f, 6.906250f, -6.929688f, -9.960938f, 11.515625f, 1.176758f, 3.130859f, 0.533691f, -14.140625f, 18.750000f, 1.634766f, 2.261719f, -5.062500f, 9.367188f, 0.865723f, 3.826172f, 3.052734f, 27.000000f, 8.640625f, -5.437500f, 19.218750f, 1.699219f, -0.889648f, -6.214844f, -12.828125f, 11.578125f, 4.992188f, 1.073242f, 0.474854f, -2.634766f, 0.171021f, 6.433594f, 9.453125f, 2.746094f, 8.578125f, -5.683594f, -0.344482f, -6.687500f, -12.187500f, 6.234375f, 3.242188f, 4.449219f, 0.754883f, -4.906250f, -5.804688f, 6.003906f, -1.361328f, -1.363281f, -15.960938f, 20.359375f, 2.998047f, -19.062500f, -16.171875f, 0.464111f, 2.054688f, -18.453125f, 6.492188f, 10.851562f, -6.750000f, 6.609375f, -5.019531f, -13.367188f, 3.599609f, 0.235229f, 11.187500f, -7.664062f, 19.781250f, 3.933594f, 10.171875f, -7.582031f, 3.337891f, -4.988281f, 14.585938f, -15.101562f, -11.437500f, -5.308594f, 10.171875f, -5.003906f, 6.347656f, -3.607422f, 8.929688f, -5.996094f, -10.734375f, -2.205078f, -7.554688f, -6.507812f, 6.851562f, 7.812500f, 4.851562f, 19.140625f, 2.685547f, 10.117188f, 6.812500f, 1.380859f, -5.832031f, -2.265625f, 24.156250f, 9.289062f, 8.335938f, -1.715820f, 17.875000f, 5.964844f, -0.133789f, -1.529297f, 21.750000f, -6.800781f, 19.531250f, -6.312500f, 10.218750f, -8.281250f, -10.085938f, 12.515625f, -19.468750f, -0.210815f, -1.290039f, -11.328125f, 11.375000f, -6.753906f, 0.887695f, 13.648438f, -4.265625f, -2.414062f, 5.757812f, -17.484375f, 6.777344f, -16.156250f, 6.011719f, 5.035156f, -3.853516f, 7.335938f, -0.071045f, 8.984375f, -1.783203f, -1.447266f, -19.765625f, 17.859375f, 11.289062f, -6.191406f, -16.656250f, -8.351562f, 15.742188f, 18.156250f, 9.578125f, 4.851562f, -5.886719f, -11.101562f, -12.289062f, 8.507812f, 5.843750f, -6.449219f, -10.710938f, -4.890625f, 14.742188f, 4.960938f, -4.644531f, -1.206055f, -3.578125f, 17.453125f, -3.138672f, -7.675781f, -13.617188f, 11.203125f, -4.832031f, 10.218750f, 9.640625f, 1.342773f, -4.917969f, 10.757812f, -3.103516f, -18.406250f, 0.186890f, -8.656250f, -9.906250f, 4.421875f, 16.500000f, -8.125000f, 1.752930f, 1.453125f, 0.287598f, -1.258789f, -8.117188f, -23.468750f, 12.656250f, -5.800781f, 11.945312f, 4.742188f, 16.203125f, 1.796875f, 4.804688f, -7.003906f, 0.362793f, 8.468750f, 19.531250f, -23.515625f, -2.373047f, 1.969727f, -6.570312f, -11.187500f, -1.838867f, -8.726562f, 9.828125f, -0.407959f, 1.312500f, 12.632812f, -5.394531f, 7.031250f, 2.076172f, -7.609375f, -1.354492f, -10.554688f, 3.599609f, -5.949219f, 15.414062f, -0.606445f, 10.617188f, 6.609375f, 22.843750f, 1.425781f, -6.441406f, -3.761719f, -4.570312f, -0.982910f, -6.628906f, 7.742188f, -5.019531f, -1.332031f, 10.085938f, -5.125000f, 14.289062f, 0.077881f, 0.052094f, 19.046875f, -7.347656f, -21.078125f, 4.949219f, 1.802734f, -12.250000f, 0.814941f, -0.700684f, 1.202148f, 0.540527f, -3.125000f, 9.812500f, 9.390625f, 25.921875f, 0.729004f, 1.905273f, -4.996094f, -18.625000f, 3.187500f, -0.410400f, 1.663086f, 10.046875f, 10.250000f, -4.964844f, 5.582031f, 1.952148f, -3.564453f, -14.109375f, -2.945312f, 0.707031f, 13.054688f, -8.609375f, 2.919922f, -8.859375f, 1.507812f, -5.402344f, -10.953125f, 15.507812f, 15.617188f, -5.687500f, -0.325195f, 9.757812f, -26.140625f, -6.695312f, 13.148438f, -4.277344f, 5.984375f, 6.886719f, -11.937500f, -3.533203f, -17.265625f, 6.246094f, 5.578125f, -5.734375f, -3.195312f, 4.730469f, -17.671875f, -26.625000f, -8.773438f, 8.773438f, -1.392578f, -7.046875f, 15.914062f, 11.312500f, 6.890625f, 1.508789f, -2.662109f, 3.880859f, 12.773438f, 7.007812f, 15.429688f, -10.578125f, 5.558594f, -4.515625f, 17.296875f, -12.437500f, 13.500000f, 13.242188f, -0.543457f, 14.429688f, 6.578125f, -8.679688f, -4.785156f, -1.598633f, 3.988281f, 3.707031f, 1.142578f, -3.556641f, 15.546875f, 14.796875f, 10.609375f, -12.164062f, 6.042969f, 19.234375f, 7.398438f, -8.937500f, 21.687500f, 1.115234f, -17.859375f, 9.945312f, -13.117188f, 16.640625f, 3.136719f, -0.645508f, 17.953125f, 5.074219f, 11.539062f, -16.000000f, 7.593750f, -6.203125f, -12.429688f, 13.656250f, 6.046875f, -18.859375f, 2.835938f, -2.056641f, -1.421875f, -0.637207f, -10.835938f, -18.531250f, 16.812500f, -2.669922f, 12.750000f, 19.515625f, -20.000000f, 1.944336f, -5.804688f, 12.351562f, -1.315430f, 8.882812f, 11.546875f, -6.761719f, 10.398438f, 1.570312f, -10.640625f, -5.414062f, -3.908203f, -8.437500f, 8.367188f, 1.294922f, -3.546875f, -14.843750f, 1.791992f, -5.367188f, 0.998047f, 0.971191f, 4.843750f, -17.484375f, -6.832031f, -5.648438f, -4.093750f, -7.812500f, -0.122742f, -12.156250f, 5.726562f, 1.945312f, 16.937500f, -11.789062f, 7.550781f, 13.382812f, 1.334961f, 0.113220f, -2.171875f, 2.224609f, -14.429688f, -2.837891f, 1.783203f, -6.140625f, 6.910156f, -20.109375f, 9.257812f, -1.501953f, 10.414062f, -6.062500f, 1.785156f, 10.523438f, 10.187500f, 0.302490f, 0.087158f, 8.359375f, 5.750000f, 0.728516f, 0.358398f, -0.778809f, -10.523438f, -0.525879f, -10.554688f, 6.078125f, 5.746094f, -19.828125f, -9.578125f, 5.066406f, -2.507812f, -7.765625f, -8.835938f, -9.851562f, 3.480469f, -3.296875f, 12.187500f, 10.664062f, 3.218750f, -11.234375f, 15.695312f, -7.332031f, -3.750000f, 11.757812f, 15.945312f, 9.953125f, 13.867188f, 9.726562f, 8.617188f, 1.443359f, 7.683594f, -4.894531f, 24.953125f, -10.820312f, 6.160156f, -15.523438f, -2.269531f, -8.726562f, -4.304688f, 1.289062f, 2.744141f, 0.945801f, 12.625000f, 4.210938f, 2.316406f, 11.039062f, -13.023438f, -0.658691f, 16.390625f, 1.954102f, 3.794922f, -8.132812f, 11.187500f, -9.539062f, 0.171143f, -12.984375f, -7.734375f, -0.893555f, 4.953125f, 21.656250f, -3.673828f, -2.845703f, -0.958984f, 1.078125f, 0.605957f, 8.796875f, -6.875000f, -5.792969f, 11.500000f, 7.671875f, 4.296875f, -4.316406f, 6.410156f, -18.468750f, -14.539062f, -11.367188f, 17.671875f, -4.230469f, -2.142578f, 22.234375f, 4.250000f, 0.253174f, 5.218750f, 2.357422f, 3.351562f, 4.269531f, -5.871094f, 14.226562f, -9.062500f, 14.960938f, 0.581543f, 7.835938f, 9.257812f, 2.255859f, 8.546875f, -2.521484f, 2.742188f, -2.845703f, 10.937500f, -16.109375f, -2.837891f, 7.082031f, -20.546875f, -12.109375f, 3.056641f, -9.750000f, 12.414062f, -14.406250f, 3.732422f, -3.853516f, 1.366211f, 4.453125f, 9.937500f, -9.382812f, 9.664062f, -21.046875f, 17.593750f, -5.710938f, -8.304688f, 8.070312f, 10.242188f, -8.523438f, -6.941406f, -15.195312f, 7.824219f, 4.804688f, 1.754883f, 0.813965f, 15.890625f, -5.792969f, 10.718750f, 1.877930f, 2.425781f, 12.117188f, 0.195435f, -9.054688f, 2.171875f, 9.734375f, 2.230469f, 1.303711f, 0.926270f, -13.703125f, -8.226562f, 0.126831f, 14.484375f, -13.843750f, -8.164062f, 3.638672f, -10.132812f, -6.027344f, 6.937500f, -14.992188f, -18.015625f, 1.342773f, 10.687500f, -10.351562f, 7.433594f, -17.250000f, 9.585938f, 15.554688f, -7.195312f, -5.093750f, 13.656250f, -3.611328f, 0.518066f, 28.578125f, 14.257812f, -15.273438f, 0.081848f, 15.359375f, -9.335938f, -2.769531f, -8.156250f, 7.542969f, 6.441406f, -3.462891f, -11.593750f, -11.695312f, -9.023438f, -2.441406f, -5.902344f, 5.917969f, 7.261719f, 4.960938f, -11.742188f, -2.333984f, -6.929688f, 3.769531f, -11.851562f, 10.273438f, -6.792969f, 4.972656f, -4.320312f, 14.835938f, -1.179688f, 2.921875f, 7.511719f, -21.484375f, 0.861816f, -8.734375f, -5.449219f, 16.609375f, -5.253906f, 12.078125f, 2.794922f, 5.765625f, 13.609375f, 3.318359f, 6.074219f, 5.097656f, -5.949219f, -5.449219f, -4.500000f, 3.109375f, -7.378906f, 8.234375f, 8.898438f, 15.171875f, 4.101562f, 7.269531f, -5.980469f, 12.968750f, -4.281250f, 6.058594f, -11.242188f, -9.140625f, -9.367188f, 10.679688f, 4.632812f, -1.673828f, 8.734375f, 1.173828f, 3.722656f, 7.238281f, -2.636719f, -1.119141f, 13.984375f, -1.569336f, 2.748047f, -1.900391f, 13.210938f, -1.144531f, 7.402344f, -3.345703f, -14.960938f, 14.000000f, -4.703125f, -11.710938f, -11.039062f, 0.052399f, 4.832031f, -5.292969f, 9.539062f, -0.956543f, -4.859375f, -1.677734f, 2.347656f, 7.800781f, 14.179688f, -10.156250f, -10.093750f, -0.407471f, 1.005859f, 8.062500f, 4.230469f, -5.914062f, 8.851562f, 7.636719f, -4.417969f, 3.466797f, -1.559570f, 4.542969f, 1.521484f, -11.171875f, -11.203125f, -21.671875f, 9.890625f, 1.971680f, 13.898438f, 9.906250f, -4.945312f, 4.515625f, 0.285156f, -13.382812f, 4.964844f, -3.244141f, 3.437500f, 2.769531f, 4.207031f, -1.695312f, 3.437500f, 5.828125f, 18.734375f, -3.128906f, 3.302734f, -21.812500f, -5.859375f, 11.226562f, 3.359375f, 14.187500f, 1.665039f, -5.632812f, 3.949219f, -6.460938f, -12.421875f, 0.561035f, -18.515625f, 5.800781f, -8.765625f, 9.898438f, -20.031250f, 2.136719f, 21.375000f, -11.414062f, 0.364258f, -21.765625f, -5.742188f, 2.257812f, 8.750000f, -13.312500f, 3.037109f, 1.750977f, -12.179688f, -11.312500f, 19.828125f, -1.222656f, 0.885254f, 2.619141f, -5.246094f, 0.171997f, -10.632812f, -3.353516f, 6.386719f, -10.351562f, -1.735352f, -3.509766f, 7.812500f, 3.017578f, 12.125000f, -3.468750f, -20.109375f, -20.890625f, 10.429688f, -5.292969f, 7.437500f, -6.539062f, -7.695312f, 2.796875f, -32.687500f, 17.812500f, 12.289062f, -3.386719f, -13.218750f, 9.031250f, -7.582031f, -16.500000f, -0.046814f, -2.601562f, 2.933594f, -3.023438f, -9.187500f, -8.968750f, -3.416016f, -4.425781f, -0.450928f, -2.355469f, -0.220337f, 9.726562f, 8.109375f, 0.607910f, 17.203125f, 18.265625f, 3.699219f, 0.201782f, 3.693359f, -14.093750f, -3.542969f, 7.433594f, -2.509766f, 9.554688f, -22.921875f, -6.953125f, -10.164062f, -1.545898f, 1.541992f, 2.751953f, 4.230469f, -4.582031f, 3.050781f, 6.484375f, 12.773438f, -7.261719f, 2.160156f, 20.718750f, 17.968750f, -3.064453f, 4.199219f, -6.250000f, 24.500000f, -5.523438f, 6.421875f, 6.031250f, -15.742188f, -11.046875f, -5.312500f, -10.335938f, 0.411133f, 12.679688f, -7.308594f, 9.632812f, 9.867188f, 10.867188f, 0.572754f, -4.847656f, -2.625000f, 1.919922f, 14.531250f, 7.808594f, -11.945312f, 4.230469f, 6.609375f, 1.684570f, 1.472656f, -19.015625f, -5.953125f, 0.569336f, 4.585938f, 25.468750f, 5.566406f, 11.257812f, -2.111328f, -13.929688f, 11.937500f, 1.245117f, 10.015625f, -13.359375f, 2.111328f, -3.414062f, -4.406250f, 6.589844f, 11.507812f, -7.476562f, 13.125000f, 0.273193f, -8.007812f, 2.140625f, 6.113281f, 9.820312f, 2.851562f, -2.615234f, 1.146484f, 5.144531f, -6.238281f, 18.078125f, -0.826172f, 8.851562f, 23.171875f, 5.765625f, -5.031250f, -1.306641f, -12.773438f, 10.679688f, -3.117188f, -4.871094f, -6.417969f, 26.656250f, 3.236328f, -2.800781f, -15.468750f, 8.609375f, -10.375000f, -1.908203f, -0.970703f, 3.505859f, 1.544922f, 24.828125f, 0.655762f, -17.640625f, 9.382812f, -7.339844f, 11.375000f, 6.621094f, -13.992188f, 9.585938f, 2.585938f, 5.585938f, 6.457031f, 11.234375f, -2.447266f, -10.312500f, 6.988281f, 3.673828f, -10.234375f, 3.781250f, 12.140625f, 10.195312f, 7.355469f, 3.685547f, -7.375000f, 2.603516f, 1.975586f, 1.423828f, -0.800293f, 13.570312f, -9.210938f, 6.324219f, -6.433594f, 10.078125f, -5.199219f, 0.248901f, 0.210205f, -15.875000f, -2.910156f, -16.765625f, 1.877930f, -0.389893f, 3.345703f, 14.265625f, 7.816406f, -18.781250f, 1.777344f, -0.630859f, 23.375000f, 3.246094f, 14.929688f, 1.899414f, -1.970703f, -4.730469f, -6.539062f, -4.132812f, 0.479980f, 7.070312f, 3.089844f, 0.603516f, -0.469482f, 6.910156f, 9.406250f, 6.863281f, 14.250000f, 1.137695f, -3.869141f, -1.564453f, -15.984375f, 5.597656f, 5.566406f, -9.085938f, -6.375000f, -7.246094f, 10.132812f, 15.835938f, -6.687500f, 6.199219f, -8.875000f, -6.468750f, -4.382812f, -8.210938f, 18.203125f, -1.602539f, 1.415039f, -0.548340f, -0.256348f, 10.156250f, -11.242188f, -7.265625f, 12.281250f, -4.113281f, 15.703125f, 6.304688f, -8.421875f, -1.918945f, 4.574219f, 0.452881f, -3.285156f, 1.147461f, -24.937500f, -7.058594f, 17.984375f, -6.062500f, -1.152344f, 10.906250f, -12.179688f, 5.312500f, 7.113281f, 8.710938f, -8.085938f, 1.649414f, 4.859375f, 3.369141f, -5.234375f, 11.359375f, 10.437500f, 4.207031f, -9.906250f, 0.295654f, -1.774414f, -6.269531f, -11.671875f, -13.484375f, 9.851562f, -4.058594f, 12.085938f, -5.855469f, 22.375000f, 15.203125f, -1.832031f, 2.978516f, -14.062500f, 8.960938f, -24.062500f, -5.316406f, 1.110352f, -2.044922f, 11.250000f, -0.441650f, -7.710938f, 4.375000f, -20.250000f, -10.031250f, -2.474609f, 3.988281f, -1.891602f, 2.658203f, 22.921875f, -2.968750f, -16.937500f, 8.351562f, 12.164062f, 0.888184f, -1.564453f, -3.656250f, 4.109375f, 3.027344f, 14.257812f, -7.843750f, 3.150391f, 9.304688f, 5.882812f, 0.300781f, 5.820312f, 0.993652f, -7.113281f, -7.285156f, 14.851562f, -10.890625f, -3.511719f, 6.078125f, 0.290283f, -4.257812f, 6.984375f, 19.140625f, 6.695312f, -1.406250f, -7.148438f, 2.068359f, 0.223511f, -20.203125f, 14.000000f, -19.640625f, -5.089844f, -4.625000f, 10.679688f, 4.214844f, -17.671875f, -7.671875f, 3.904297f, 6.257812f, 4.511719f, 7.218750f, -5.921875f, 16.171875f, 7.179688f, -4.699219f, -20.406250f, 18.281250f, 2.347656f, -24.718750f, -2.281250f, 2.490234f, 3.298828f, -1.105469f, -6.140625f, -7.441406f, 14.726562f, 3.093750f, -4.128906f, -4.726562f, 9.609375f, -16.718750f, 16.218750f, -2.953125f, 12.593750f, -8.906250f, -2.648438f, -5.035156f, -5.753906f, -1.930664f, 8.492188f, 6.421875f, -13.226562f, 6.980469f, -2.369141f, 9.320312f, 10.062500f, -5.363281f, -7.621094f, 2.667969f, -9.085938f, 16.328125f, 9.781250f, -11.546875f, 7.582031f, -4.843750f, -0.751953f, 10.929688f, 3.001953f, -7.722656f, 8.789062f, 2.453125f, 16.437500f, 5.914062f, 7.527344f, 3.392578f, 4.820312f, -9.976562f, 1.294922f, 14.734375f, -6.351562f, 3.595703f, -4.914062f, -1.964844f, -8.218750f, -13.664062f, 4.250000f, -7.476562f, 11.007812f, 7.425781f, -11.812500f, 2.144531f, 9.484375f, 0.803711f, -14.578125f, -20.046875f, 15.828125f, -15.906250f, -5.691406f, 7.757812f, -4.410156f, 5.496094f, -4.074219f, 8.656250f, -24.546875f, -13.398438f, 8.171875f, 2.097656f, 2.025391f, 13.359375f, -1.739258f, 11.914062f, -0.121826f, -15.359375f, 9.039062f, -5.917969f, 29.984375f, 11.000000f, -8.882812f, 0.575684f, 9.570312f, 4.488281f, -7.562500f, 3.041016f, -6.121094f, 8.015625f, -7.574219f, -12.960938f, 3.861328f, 6.898438f, -10.195312f, 7.875000f, 11.906250f, 10.882812f, 6.496094f, -9.750000f, -8.023438f, -13.656250f, -0.966309f, 0.869629f, 13.539062f, -3.150391f, 8.117188f, -3.021484f, 3.701172f, 6.980469f, 1.652344f, -4.878906f, -5.445312f, -4.164062f, 14.203125f, 9.375000f, 14.593750f, -6.734375f, -22.656250f, 5.894531f, 2.789062f, 1.153320f, 16.312500f, -13.679688f, -2.388672f, 5.195312f, -15.375000f, 1.401367f, 10.343750f, 18.890625f, -1.953125f, 12.640625f, -5.835938f, 8.968750f, 9.070312f, -8.406250f, -13.570312f, 0.685547f, 11.539062f, -5.269531f, -3.900391f, -14.851562f, 0.184448f, -0.927734f, -18.703125f, -2.111328f, -5.218750f, 12.101562f, 5.636719f, 12.648438f, -5.105469f, 7.761719f, -6.269531f, -4.515625f, -9.171875f, 13.867188f, 3.240234f, -2.560547f, -8.664062f, 1.476562f, -9.851562f, -9.812500f, -5.730469f, -1.889648f, 21.750000f, 1.995117f, 0.122314f, 3.302734f, 8.054688f, 5.320312f, -0.367920f, 1.373047f, -37.125000f, -3.386719f, -10.617188f, -4.441406f, -9.695312f, -6.050781f, -2.083984f, -8.070312f, -2.750000f, -2.966797f, -3.654297f, 6.066406f, -4.828125f, -19.500000f, 0.844238f, -1.522461f, 8.625000f, 23.375000f, 7.054688f, 12.031250f, 10.960938f, 6.523438f, 2.185547f, -16.703125f, 15.718750f, 3.478516f, 2.794922f, -6.976562f, -8.328125f, -5.406250f, -3.701172f, 1.221680f, 5.972656f, 14.296875f, 8.523438f, -8.960938f, -5.363281f, 6.835938f, 13.046875f, -14.820312f, 1.042969f, 3.013672f, -1.483398f, -5.945312f, 4.300781f, -5.566406f, -11.585938f, -3.539062f, 11.750000f, -4.546875f, -11.031250f, -5.964844f, -12.789062f, 12.796875f, 11.015625f, 8.195312f, 21.312500f, 2.007812f, -8.234375f, 7.769531f, 9.445312f, -5.527344f, 2.027344f, -0.370850f, 2.671875f, -0.531250f, -7.589844f, -14.343750f, 9.976562f, 12.281250f, 7.023438f, -7.464844f, -1.584961f, -4.894531f, 16.484375f, -15.593750f, 2.546875f, 4.546875f, -8.515625f, 5.078125f, -1.478516f, -0.440186f, 0.437012f, -10.789062f, -6.500000f, 5.867188f, 6.632812f, 8.039062f, -13.242188f, 16.593750f, 5.757812f, 29.062500f, -2.060547f }; +static const float16 expected[] = { -1.834961f, 1.436523f, 0.349609f, -0.112793f, -0.078003f, -0.154663f, 15.226562f, -0.414551f, 1.447266f, -1.517578f, 11.804688f, -1.319336f, -0.441162f, -0.532715f, 1.085938f, 1.381836f, -5.234375f, 1.540039f, -0.526367f, 1.136719f, -0.310547f, -0.078613f, 0.866211f, -3.623047f, -1.383789f, -218.625000f, 2.505859f, 1.576172f, 0.872559f, -1.178711f, 0.505371f, 3.119141f, 0.071594f, -1.246094f, -3.652344f, 37.281250f, 0.763672f, -0.877930f, -0.203735f, 0.137451f, -2.552734f, 0.413574f, -0.162720f, -0.030472f, -0.444336f, 3.570312f, 1.161133f, 1.083984f, -0.515625f, -0.407471f, 8.687500f, -1.276367f, 0.692383f, 1.679688f, -0.424561f, 0.352295f, 5.867188f, -2.525391f, 0.337158f, 3.894531f, 0.072510f, 18.171875f, 0.277100f, -1.234375f, 0.856934f, 37.562500f, -6.218750f, 0.074646f, -0.137085f, -0.935547f, -2.068359f, -14.617188f, -1.478516f, -0.566406f, -0.567383f, 0.075134f, 0.852539f, -0.274170f, 3.154297f, -3.220703f, -1.755859f, -0.385986f, 1.746094f, -30.312500f, -1.466797f, 2.921875f, -7.921875f, -0.335449f, 0.484375f, 4.031250f, 0.482910f, -4.261719f, -0.562012f, 2.746094f, 0.459717f, 1.189453f, -0.490723f, 0.577637f, 2.769531f, -0.098022f, 5.898438f, -1.879883f, 1.632812f, 1.355469f, -17.234375f, 1.657227f, 60.656250f, -3.361328f, -0.038208f, 0.879883f, 3.660156f, -0.549805f, 0.778320f, 0.090332f, -1.041992f, -5.171875f, 0.703125f, 1.125000f, -1.216797f, 1.499023f, 0.778809f, 0.057678f, -1.133789f, 0.003544f, -1.207031f, -0.002262f, -1.526367f, 0.094604f, -0.285400f, 1.947266f, -1.409180f, 0.274414f, -0.655273f, 4.914062f, 0.094360f, 1.407227f, -0.296875f, 0.085632f, 0.141479f, -0.464844f, -0.979980f, 48.156250f, 4.632812f, -2.816406f, 0.010262f, 9.062500f, -0.067444f, -0.021042f, 1.436523f, -6.265625f, 0.956055f, -1.471680f, 0.187378f, -0.435303f, -0.989258f, -0.888672f, 1.348633f, -0.072205f, -0.738770f, -2.679688f, 0.456543f, 0.461182f, 0.092712f, -1.769531f, -0.348633f, 0.255615f, 0.741211f, -0.635254f, 17.500000f, -2.253906f, -0.674316f, -0.210205f, 0.083557f, -2.582031f, 0.562500f, -3.416016f, -0.281250f, -5.500000f, -64.875000f, -1.429688f, -1.438477f, -0.928711f, 2.208984f, 0.641602f, 1.225586f, 1.346680f, -0.136230f, -0.165039f, -15.109375f, 0.161011f, 7.144531f, -0.463379f, -0.523438f, -6.867188f, -0.599609f, 1.008789f, -1.931641f, -46.343750f, -1.786133f, -0.346191f, -1.148438f, 3.621094f, -1.500000f, 1.534180f, 2.271484f, -0.383301f, 0.238892f, 5.730469f, -1.073242f, -3.042969f, 3.814453f, 0.472656f, -0.120483f, -14.937500f, 1.829102f, -8.726562f, -16.734375f, 2.507812f, -0.809570f, -9.937500f, -1.585938f, 1.083008f, -4.179688f, 9.906250f, -1.134766f, -0.365723f, -3.767578f, -0.184204f, -2.005859f, 0.163696f, -2.246094f, 1.493164f, -7.246094f, -10.257812f, -0.044525f, -40.343750f, 0.517090f, 0.764160f, -2.785156f, -3.978516f, -0.108704f, -1.756836f, -0.825195f, -39.875000f, 1.842773f, -0.968262f, 2.228516f, -5.859375f, -1.766602f, 1.008789f, -0.168091f, -0.051270f, 0.630371f, -0.736816f, -1.615234f, 0.731934f, 1.450195f, -6.519531f, -2.285156f, -0.750977f, 2.478516f, 0.640137f, -0.226562f, -1.118164f, -1.313477f, -0.947266f, -1.687500f, 3.523438f, 0.943848f, -39.968750f, 0.538086f, -0.025650f, 0.298340f, 0.457275f, -5.312500f, 0.145508f, -0.886719f, -4.386719f, -2.375000f, 1.447266f, 0.577637f, -6.242188f, 0.135254f, 0.617188f, -0.465576f, 1.575195f, -0.418213f, 3.763672f, -0.141113f, 0.035980f, 4.113281f, -0.930664f, -0.654297f, 31.234375f, 0.231079f, -0.562500f, -1.564453f, 0.189819f, -0.261963f, -22.843750f, 3.333984f, -0.894043f, -0.972168f, -1.175781f, 0.363281f, 0.383057f, 0.636230f, -1.467773f, -3.410156f, -4.402344f, -0.341553f, 0.533691f, -2.724609f, 0.892090f, 0.256592f, 0.050781f, -0.604492f, 0.497314f, -0.590332f, -0.202637f, -4.753906f, 0.050201f, 3.169922f, 0.702637f, 5.773438f, 1.609375f, 0.339111f, 1.366211f, 1.019531f, 3.277344f, 0.208984f, -0.017593f, 1.432617f, 1.457031f, 0.101379f, -0.498535f, -3.560547f, 0.293457f, 5.429688f, 0.543457f, -0.608398f, 1.809570f, 57.625000f, 0.103271f, -0.038269f, -1.750977f, 0.085571f, -0.396484f, -0.251709f, -6.117188f, 6.886719f, -0.122192f, 8.523438f, -7.390625f, -0.963379f, -0.144043f, -0.705566f, 0.226074f, 0.195801f, -0.371826f, -0.255127f, -0.338867f, -0.384277f, -0.030487f, 0.349121f, 3.035156f, -1.754883f, 0.251953f, -24.437500f, -1.509766f, -1.168945f, -1.371094f, 0.447754f, 1.765625f, -7.894531f, -0.759277f, 0.323730f, -0.468506f, 0.764648f, 0.531250f, 0.371094f, -0.620605f, -0.134033f, -0.363281f, -5.457031f, 49.843750f, -5.140625f, 3.609375f, 3.755859f, -2.324219f, -7.695312f, -0.008469f, -1.560547f, 1.096680f, -1.331055f, 0.299561f, 9.085938f, -1.215820f, 1.385742f, 0.148071f, 2.041016f, 0.527832f, -0.118530f, 0.390625f, -0.201416f, 1.975586f, 1.157227f, 0.040741f, -0.466797f, -0.464600f, 6.890625f, -0.392334f, -0.367188f, 5.265625f, 4.113281f, 8.054688f, 1.127930f, 1.301758f, -0.107239f, -1.010742f, -0.036835f, -6.000000f, -0.522949f, -0.138184f, 23.968750f, -0.040161f, 0.402588f, -4.339844f, -0.248291f, 0.141968f, -0.121521f, 0.036407f, -0.221558f, -0.690918f, -0.436035f, 1.583008f, -0.895996f, -7.921875f, -4.089844f, -12.328125f, 0.504883f, 0.041779f, 0.216919f, -1.114258f, 3.556641f, -1.034180f, 3.642578f, -1.552734f, 1.091797f, -1.875977f, -0.339355f, 9.218750f, 0.618652f, 4.535156f, -0.882324f, 1.589844f, -6.820312f, -0.894531f, -5.968750f, 0.867676f, -0.347168f, -5.351562f, 4.054688f, 0.678711f, -1.005859f, -0.239380f, -0.850586f, -0.548828f, -6.292969f, -0.997070f, 0.743164f, 0.050812f, 10.062500f, 0.849121f, -0.185181f, -2.369141f, 0.394287f, 1.737305f, 0.291260f, -0.400635f, 0.561035f, -2.406250f, -1.040039f, -0.560059f, -0.191406f, -0.730469f, 118.187500f, -1.958008f, 0.546387f, 0.097595f, 0.801758f, 248.375000f, -0.006920f, 2.976562f, -6.015625f, -1.276367f, 2.000000f, 2.398438f, -0.783691f, 2.683594f, 0.898926f, 0.679199f, 12.195312f, -1.201172f, 1.318359f, -0.571777f, -4.617188f, -1.972656f, -0.275879f, 14.742188f, -0.645508f, -4.527344f, -0.152954f, -2.318359f, 7.390625f, 0.282471f, -0.123779f, 0.525879f, -1.350586f, -0.267822f, -0.156128f, 0.743164f, -1.801758f, -3.458984f, -0.771484f, 0.366455f, 0.784668f, 1.647461f, 0.861816f, 0.163208f, 0.357178f, -0.251953f, 1.486328f, -0.867676f, -4.011719f, 1.504883f, -12.539062f, 1.921875f, 0.830078f, -0.738770f, 6.500000f, -0.991211f, -17.718750f, 0.780273f, 0.166260f, -1.834961f, -5.574219f, 0.655273f, 1.222656f, -1.306641f, -3.371094f, 7.250000f, -0.431885f, -1.016602f, 7.628906f, 64.125000f, 5.671875f, -1.152344f, -6.441406f, 0.203247f, -0.390381f, -0.567383f, -0.773438f, -10.875000f, 0.164551f, -0.747559f, 8.601562f, -0.107666f, -0.108826f, 0.853027f, -0.359131f, 1.644531f, -2.931641f, 0.807129f, 0.178833f, 54.718750f, -0.125854f, -0.266602f, 1.687500f, 19.453125f, 2.042969f, -12.531250f, 0.067627f, 0.137573f, -4.347656f, -2.359375f, 16.578125f, 17.328125f, -0.001959f, 2.697266f, -1.709961f, 0.430176f, -11.617188f, 2.453125f, 0.341064f, 0.330566f, -0.274902f, 16.906250f, -0.247925f, 0.156494f, 1.022461f, 0.832031f, 0.285400f, -0.513184f, -1.681641f, -0.743164f, -0.108215f, 2.300781f, -7.019531f, 0.820312f, -2.980469f, 1.416992f, -0.043701f, 0.773926f, 0.362549f, -2.351562f, -5.843750f, 0.791504f, 3.363281f, 0.836426f, 0.210205f, -1.271484f, 0.782227f, 1.171875f, 1.770508f, 0.838867f, 0.893555f, -11.625000f, 1.063477f, 1.465820f, -1.055664f, -13.812500f, -0.704102f, 0.203979f, 1.227539f, -0.670898f, -0.768555f, -0.512207f, -1.862305f, -0.729004f, -0.012169f, 4.070312f, 0.172363f, -2.656250f, -1.259766f, -4.023438f, -1.246094f, 1.329102f, -1.404297f, 1.073242f, 1.415039f, 0.606445f, -3.861328f, 0.441406f, -0.007843f, 0.462158f, 0.484863f, -0.300049f, 0.874512f, 0.335938f, -0.001779f, -5.050781f, 1.561523f, -0.512695f, -38.812500f, -0.217651f, -0.202026f, -7.535156f, 8.671875f, -2.685547f, -0.438477f, -1.744141f, -10.898438f, 1.416992f, 1.658203f, 0.348145f, -18.078125f, 0.733398f, 1.790039f, -1.111328f, -0.275879f, 0.001069f, -1.837891f, 26.390625f, 16.437500f, 0.101074f, 1.070312f, 1.665039f, -1.284180f, 0.487305f, 2.472656f, 0.750488f, 2.095703f, 12.437500f, -1.801758f, -23.406250f, -1.778320f, 0.054382f, 1.475586f, -4.769531f, -2.568359f, -1.414062f, -2.564453f, 2.669922f, -1.140625f, 0.082703f, 0.619141f, 4.960938f, -0.476318f, 0.514160f, -12.164062f, -0.157715f, 0.548340f, 0.400146f, -1.610352f, -3.044922f, -12.328125f, 7.367188f, 2.595703f, 1.961914f, 0.604492f, 3.277344f, -1.756836f, -1.554688f, 7.972656f, 0.887207f, -0.286621f, -1.615234f, -2.810547f, 4.195312f, 12.835938f, 1.371094f, 2.457031f, 2.087891f, -9.484375f, 8.773438f, -0.383057f, 0.441650f, -3.544922f, 0.086914f, -0.173340f, -0.536621f, 1.413086f, -0.530762f, 0.269043f, 1.140625f, -1.080078f, 0.636719f, 0.759766f, 0.223511f, 0.715332f, -117.812500f, 0.338867f, 0.106689f, -0.732910f, 4.679688f, -1.239258f, 1.344727f, 0.953613f, -1.297852f, 1.013672f, -0.347168f, 0.310547f, 0.884277f, -1.356445f, 1.421875f, 1.943359f, 2.876953f, -0.355957f, 1.008789f, -0.771484f, 5.914062f, 0.409424f, -4.183594f, 0.323242f, -0.257324f, -0.046509f, -0.447754f, -1.031250f, -1.341797f, -1.024414f, -25.625000f, 0.403564f, 4.859375f, 0.848145f, 1.239258f, -0.756348f, -3.837891f, 0.104614f, -1.912109f, -51.062500f, 5.183594f, 0.575684f, -2.173828f, 0.937500f, 1.404297f, 1.401367f, -1.826172f, -1.696289f, 0.044434f, 0.833008f, -35.156250f, -4.738281f, -0.014740f, -1.171875f, 0.834961f, 3.990234f, -0.426758f, 1.706055f, -2.158203f, -0.530762f, 0.149292f, -1.551758f, 1.015625f, -0.868652f, -1.916016f, -2.843750f, 1.416016f, -79.250000f, -0.416016f, -9.742188f, -4.343750f, 0.793457f, -0.083374f, 1.349609f, -2.210938f, 0.328857f, 3.269531f, 0.163940f, -0.004505f, -0.232910f, -0.629395f, 0.380615f, -0.233643f, -0.250977f, 0.419189f, -2.460938f, 0.568359f, 2.437500f, 2.978516f, -0.563477f, -0.599121f, 2.732422f, 1.418945f, 0.992188f, -0.102234f, 2.367188f, -0.379639f, 0.976074f, -1.277344f, -4.410156f, 0.698730f, -0.925293f, 0.708984f, 1.615234f, 1.375977f, 4.351562f, -0.071777f, -79.812500f, -2.193359f, -0.851074f, 2.521484f, 0.877930f, -0.687012f, 3.392578f, -4.585938f, -19.281250f, 2.431641f, -0.929688f, -0.121643f, 0.673340f, 0.304443f, -0.057526f, 1.274414f, -0.624023f, -11.101562f, 0.962402f, -0.339355f, 8.312500f, 1.250000f, 0.868164f, -0.075439f, -4.246094f, 4.667969f, -0.795410f, 0.953125f, -0.824707f, -0.959473f, -0.634277f, 34.468750f, -0.822754f, -1.293945f, 1.005859f, -1.668945f, 1.174805f, -0.831543f, 0.298584f, -1.656250f, -0.508789f, -3.916016f, 0.111633f, -34.718750f, -1.651367f, 2.015625f, -0.181396f, 4.210938f, -0.429688f, -1.136719f, 0.123474f, -9.203125f, -0.946289f, 2.900391f, -0.803223f, -1.292969f, 0.111633f, 0.754395f, -0.810059f, -3.808594f, 67.187500f, -0.995117f, -0.061584f, -0.531738f, -0.933105f, 2.755859f, 0.514648f, 8.007812f, 5.871094f, 6.257812f, -39.937500f, 0.877441f, -1.583984f, 1.253906f, 0.154053f, 10.976562f, -3.330078f, -0.045135f, -1.203125f, 2.541016f, -23.718750f, 4.945312f, -0.165161f, -0.706055f, -3.357422f, 1.162109f, -4.972656f, 0.212036f, -0.489746f, 3.095703f, -18.578125f, 0.403076f, -1.834961f, 2.533203f, 2.949219f, 3.806641f, -2.585938f, 0.732422f, 0.673340f, -0.479980f, -2.947266f, 51.156250f, -0.400146f, -0.445068f, -1.071289f, -0.687500f, -0.438477f, 0.728027f, 0.558594f, 0.458984f, 1.305664f, -1.154297f, 0.771973f, -1.187500f, -0.295898f, -0.805664f, -1.049805f, 0.796875f, 0.009918f, 0.778320f, 0.681641f, 3.048828f, -3.343750f, 0.458252f, -0.311523f, -2.017578f, 0.405273f, -5.386719f, -2.187500f, -0.597168f, -1.669922f, -0.369629f, 0.860352f, 0.081177f, -4.195312f, 0.875977f, 0.128906f, 0.302734f, 0.720215f, 12.335938f, 0.422852f, 0.617676f, -1.402344f, 2.791016f, 0.847168f, 1.572266f, 2.935547f, -15.750000f, 1.342773f, -0.620117f, -0.113525f, 0.183350f, -0.574707f, -1.980469f, -0.969238f, 1.468750f, 0.319336f, -0.638184f, -0.306641f, -0.013359f, -0.431152f, 0.033478f, -0.469971f, -1.033203f, -17.640625f, -0.256348f, 0.684570f, -0.027527f, 0.105408f, -1.733398f, 0.817871f, -2.179688f, 0.687988f, -0.149902f, -0.027359f, 3.603516f, -10.265625f, 2.939453f, 29.250000f, -1.046875f, 1.251953f, 0.212769f, -7.343750f, 1.470703f, 0.053680f, -0.161743f, 0.823242f, -1.950195f, -0.107544f, 3.931641f, -2.181641f, 0.549316f, -0.433105f, 0.604980f, -2.187500f, -1.524414f, 2.185547f, -0.553223f, -1.382812f, 1.151367f, -12.054688f, 3.898438f, -0.367432f, -1.154297f, -0.047852f, -0.169800f, -2.306641f, 3.201172f, 0.029037f, -0.327148f, -1.681641f, -2.558594f, -0.310303f, 111.062500f, -0.597168f, -1.969727f, -2.208984f, 0.149780f, -0.534668f, 0.399414f, -0.353760f, -10.843750f, 34.281250f, 6.347656f, 3.652344f, -0.510742f, 0.540527f, -1.592773f, 1.929688f, -0.317383f, -0.353516f, 1.022461f, -2.923828f, -1.315430f, 0.019135f, -6.027344f, 0.476562f, -0.416504f, -32.687500f, 0.100220f, -0.500488f, -1.048828f, 12.492188f, -21.546875f, 5.773438f, 1.677734f, -1.750000f, -2.066406f, -2.107422f, -1.684570f, -0.300049f, -1.282227f, 0.528320f, 3.173828f, 1.522461f, 1.009766f, 0.708496f, -0.886719f, 2.599609f, 0.288330f, 0.324219f, -0.302246f, 0.203613f, 0.029434f, -0.915527f, -4.179688f, -0.982910f, 0.201782f, 0.388184f, 0.423340f, 0.052063f, -2.779297f, 3.664062f, -2.074219f, 0.486816f, -0.617676f, -2.562500f, 3.533203f, 0.923340f, 7.539062f, -0.782227f, -4.152344f, 8.304688f, -6.804688f, -14.679688f, -0.142822f, 0.551758f, -4.800781f, -0.361572f, 0.306152f, -1.459961f, 0.026245f, -9.117188f, 2.154297f, -0.268799f, 1.000000f, 0.700195f, -54.812500f, -0.726074f, -2.041016f, 8.812500f, -0.870117f, 0.720215f, 0.163086f, -4.007812f, -18.718750f, -13.007812f, 15.046875f, 1.394531f, 2.417969f, 0.662109f, 0.888672f, 2.783203f, 2.990234f, 1.625977f, -1.072266f, 0.584961f, -0.016678f, 0.636719f, -0.294434f, 1.918945f, -2.152344f, 0.150269f, -4.875000f, -49.343750f, 0.065979f, 2.095703f, 1.728516f, 4.257812f, -0.507812f, -0.444580f, -2.009766f, 0.121765f, -24.937500f, -1.615234f, 0.935059f, -2.835938f, -1.455078f, -3.466797f, -1.398438f, -3.757812f, -0.218750f, -0.535645f, 0.055542f, 0.271240f, 0.020340f, -0.084167f, -2.707031f, 1.665039f, -0.579102f, 0.623535f, -1.550781f, 1.151367f, -2.546875f, -2.710938f, -0.616699f, -0.744629f, -0.599609f, -0.309570f, 0.913086f, 0.712891f, -0.020920f, -0.311768f, -0.483887f, -1.114258f, 2.695312f, 0.199341f, -0.711426f, -1.133789f, 3.212891f, -15.625000f, 0.976562f, -0.718750f, -0.946777f, 2.066406f, 9.554688f, -0.887695f, 38.562500f, 0.836426f, -11.257812f, -0.817383f, 1.622070f, 3.583984f, -9.054688f, 0.300781f, -0.744141f, 53.437500f, -0.815918f, -0.167358f, -1.643555f, 3.566406f, -0.810547f, -0.198486f, -2.708984f, -0.302734f, 0.441650f, -2.982422f, 2.328125f, 0.288818f, -0.767578f, 0.014763f, -0.513672f, -0.066162f, 1.583008f, 2.718750f, -0.034027f, -4.710938f, -33.312500f, -0.541992f, 0.494629f, -0.045013f, -199.250000f, -1.546875f, -0.459717f, -3.373047f, -1.671875f, -1.285156f, 2.136719f, 0.622559f, 0.466553f, -0.207642f, -0.966309f, -0.182251f, -1.904297f, -0.549316f, -2.255859f, -0.825195f, -0.998535f, 2.505859f, -2.123047f, -0.129150f, -0.063171f, 0.040863f, 0.440186f, 0.749512f, 6.546875f, -1.118164f, -2.158203f, -4.894531f, 0.267822f, 0.371338f, 12.257812f, -1.686523f, -0.812012f, 0.104919f, -0.363037f, -0.066162f, -1.368164f, -1.835938f, 0.591309f, -2.830078f, -0.933105f, -2.074219f, 0.466553f, -2.371094f, 0.822754f, 1.856445f, -1.160156f, 1.161133f, 1.194336f, 0.716797f, -2.988281f, -1.153320f, -1.435547f, -0.727539f, 1.467773f, -1.813477f, 0.350342f, -0.829102f, -0.727051f, 0.127319f, -1.684570f, 11.898438f, -1.125977f, -2.224609f, 1.971680f, -2.074219f, 4.070312f, 1.150391f, 0.243896f, -5.847656f, 0.340332f, -1.074219f, -1.191406f, 10.859375f, 1.559570f, 0.272705f, 0.471436f, 0.492432f, -2.689453f, -0.167725f, 0.180786f, 92.500000f, 2.673828f, 0.125244f, -0.451660f, 5.460938f, -2.732422f, -3.107422f, 2.916016f, -0.929199f, -0.061249f, 0.443848f, 0.101074f, 9.343750f, -1.181641f, -0.610352f, -3.261719f, -3.751953f, -1.268555f, 0.735840f, 2.513672f, 1.902344f, -3.230469f, 1.206055f, -6.335938f, -0.904785f, 0.645020f, -0.106628f, -0.784668f, 0.172363f, -0.496582f, 0.510742f, -2.019531f, 2.824219f, -34.812500f, 1.166016f, -3.361328f, 0.438232f, 3.625000f, -6.046875f, 0.159546f, 1.431641f, 4.183594f, 1.799805f, 0.457520f, -3.039062f, 3.214844f, 0.760742f, 1.693359f, 0.181274f, -0.372070f, 0.273926f, 2.880859f, 1.367188f, -1.467773f, 2.662109f, 0.865234f, -3.958984f, -0.137573f, 1.647461f, 0.672852f, 2.105469f, 0.365967f, -3.650391f, 0.377441f, 1.445312f, -60.343750f, -0.430664f, -0.034943f, 0.354248f, 0.047180f, -0.140503f, -3.169922f, 0.084656f, -0.856445f, -0.483398f, 0.068481f, 0.601074f, 10.664062f, 0.459473f, -0.906738f, 82.750000f, -1.208984f, -1.009766f, -0.097412f, 1.158203f, -3.425781f, 0.384277f, -0.052856f, -2.333984f, 0.810059f, -1.124023f, -0.323730f, -0.345947f, 0.090942f, -1.007812f, -3.087891f, -0.997559f, -1.222656f, -1.450195f, 0.080811f, -0.139526f, -0.409180f, -0.961426f, 1.153320f, 0.011955f, 1.453125f, -0.518066f, 123.000000f, -2.867188f, 3.496094f, 3.738281f, 0.215698f, 1.637695f, -3.583984f, -3.134766f, 50.250000f, 2.416016f, 39.968750f, 0.398438f, 0.004120f, 14.781250f, -1.603516f, -0.515625f, 6.328125f, -20.593750f, 1.038086f, -0.180176f, -2.414062f, -2.185547f, 3.980469f, 0.136353f, -0.972656f, 2.429688f, 2.515625f, 2.292969f, -3.789062f, 0.919922f, -1.552734f, -1.327148f, -4.949219f, -0.078857f, 0.058289f, -0.144531f, -1.797852f, -0.078918f, -0.010002f, 2.937500f, 1.989258f, -0.546387f, 0.179810f, 0.147583f, -0.844238f, 1.026367f, -0.602539f, -0.315186f, 2.486328f, -0.166626f, -20.578125f, -0.621582f, -1.058594f, -0.542969f, -1.153320f, 0.447510f, -2.218750f, -2.257812f, -0.595215f, 0.814941f, -0.197632f, -2.310547f, -0.189453f, 0.950195f, 0.702637f, 4.464844f, 1.343750f, 0.641113f, -1.020508f, -14.968750f, -0.463379f, 0.325684f, 0.611328f, 0.189819f, -8.914062f, -0.114685f, 0.153198f, 0.281250f, -0.903320f, 0.513672f, 9.789062f, -0.286621f, -1.073242f, 2.044922f, -0.789551f, 0.193359f, 0.494141f, 32.031250f, -1.573242f, 1.433594f, -1.454102f, -1.696289f, 4.980469f, 4.917969f, -0.793945f, -2.460938f, -0.078491f, 0.652832f, -19.390625f, -0.756836f, 0.300293f, -1.465820f, -0.867188f, 10.328125f, 0.769043f, -0.554199f, -3.806641f, -2.103516f, -1.667969f, 0.377686f, -1.274414f, -2.906250f, 0.389160f, 2.371094f, -1.143555f, -0.613281f, 9.351562f, -1.357422f, -9.703125f, -0.175781f, 16.390625f, 0.390137f, -0.043518f, 2.011719f, -1.387695f, -0.018723f, 0.994629f, -0.763672f, 1.577148f, 0.477295f, 0.770020f, 0.140259f, 3.830078f, -0.956055f, 0.049408f, 1.674805f, -0.719727f, -0.585938f, -1.121094f, 0.099060f, -1.836914f, 3.281250f, -0.161377f, -2.173828f, 2.832031f, -13.648438f, -21.781250f, -0.594238f, 0.754883f, -1.658203f, -1.391602f, -0.233276f, 1.279297f, -36.875000f, -13.117188f, -0.179077f, -2.361328f, 0.608398f, 8.937500f, 2.634766f, -3.656250f, 0.175903f, -0.149536f, -0.218384f, 1.147461f, -8.164062f, 0.603516f, 0.412354f, 0.833984f, 14.132812f, -5.906250f, -0.528320f, -0.094788f, 1.771484f, 20.796875f, -1.127930f, 3.482422f, -36.593750f, 23.109375f, -1.068359f, 0.684082f, -0.196167f, 1.002930f, -10.539062f, -2.746094f, 2.275391f, -0.249878f, -2.162109f, -1.676758f, -0.180176f, 0.614258f, -2.048828f, 0.973145f, -1.112305f, 0.823242f, 3.464844f, -1.210938f, -0.396484f, 6.144531f, -0.155273f, 0.212158f, -0.166382f, 9.140625f, 15.718750f, -47.375000f, -1.163086f, -0.022522f, 1.438477f, -0.142944f, 1.630859f, 0.741699f, 0.705078f, -0.399658f, -0.191895f, -1.035156f, 8.695312f, -4.875000f, -9.406250f, 0.509766f, 0.237183f, 0.978516f, -1.476562f, 14.890625f, 0.421143f, 0.536621f, 0.112305f, -1.555664f, -0.098389f, -0.999023f, -2.496094f, 2.111328f, -3.810547f, 2.595703f, -0.012360f, 0.522461f, 3.822266f, -1.846680f, -17.562500f, -1.206055f, 1.082031f, -0.713379f, -0.914062f, 0.235474f, 1.839844f, -1.298828f, 1.578125f, 0.083496f, -1.160156f, -1.667969f, -7.574219f, -1.103516f, 1.087891f, 0.803711f, -0.697266f, -3.802734f, -3.507812f, -0.189209f, 1.252930f, -0.784180f, 2.455078f, -0.023987f, 0.693359f, -1.444336f, 5.171875f, -5.433594f, 3.617188f, 0.153076f, 1.087891f, 0.137329f, -2.166016f, -0.363281f, 2.878906f, 2.050781f, 1.614258f, 1.044922f, -5.257812f, -0.018082f, 2.244141f, 0.093140f, -1.428711f, -1.969727f, 15.976562f, 0.327148f, -0.342529f, 0.038300f, -0.184204f, 0.185425f, -0.380859f, 3.339844f, -2.869141f, -6.062500f, -0.455566f, -0.886230f, 0.178833f, 0.188599f, -14.812500f, 0.185059f, -1.031250f, -63.937500f, -0.579102f, -1.078125f, 0.328613f, 1.855469f, -1.620117f, -1.239258f, -0.732422f, 0.506348f, -3.554688f, 4.460938f, 0.592285f, -0.925781f, 0.933594f, -2.511719f, -0.585449f, -0.643555f, -4.066406f, -0.007748f, 0.001475f, -0.756836f, 0.029099f, -0.418701f, -2.175781f, -2.373047f, -8.179688f, 1.564453f, -0.865234f, 0.312744f, -2.220703f, -3.894531f, -0.784668f, 0.031433f, 0.041656f, -0.043457f, 2.416016f, -1.066406f, 0.267090f, -1.607422f, 3.384766f, 1.684570f, 1.717773f, -1.100586f, -0.315430f, 0.413818f, -0.093872f, 3.357422f, -0.067139f, 0.462402f, -3.160156f, -0.678223f, -5.015625f, -1.749023f, -0.197144f, 0.102722f, -1.044922f, 0.625488f, -0.346680f, 16.390625f, -0.551270f, 3.748047f, -1.300781f, 0.031799f, -9.257812f, -0.788574f, 0.389404f, -1.746094f, -2.099609f, -4.410156f, -0.742676f, 1.971680f, -0.829102f, -1.975586f, 5.945312f, -0.228149f, 8.648438f, 1.045898f, 0.400879f, -1.857422f, -0.874023f, 0.970215f, -1.372070f, -1.174805f, -6.894531f, -0.354492f, 9.515625f, -0.533691f, -0.212402f, -1.420898f, -0.396240f, -1.983398f, 0.739258f, 2.652344f, -3.898438f, 3.216797f, 0.784668f, -0.089355f, 0.612793f, -1.472656f, 6.300781f, -4.757812f, -1.060547f, -0.231323f, -0.041473f, -0.244019f, 0.198730f, 1.276367f, -2.896484f, 0.220703f, 2.603516f, -1.004883f, 13.109375f, 1.448242f, -2.167969f, 1.158203f, 3.875000f, 2.388672f, -0.464111f, 1.028320f, -0.698730f, 0.416748f, -0.212891f, -0.435303f, -0.910645f, -0.140137f, -0.280029f, 0.438477f, -0.594238f, 2.181641f, -0.414795f, -1.879883f, -14.023438f, -0.118958f, -3.236328f, 0.173584f, -0.167725f, 1.188477f, -1.124023f, 3.314453f, 4.949219f, 0.775391f, -2.142578f, -0.233521f, 1.743164f, -0.187256f, 0.279541f, 0.123047f, 3.156250f, 0.838379f, 4.968750f, -0.660156f, -0.197144f, -0.629883f, -2.876953f, 0.393799f, -3.808594f, -0.276367f, -0.157715f, 0.880371f, 0.827148f, 0.201416f, 0.000152f, 0.200562f, 1.005859f, 0.593750f, 17.890625f, -0.500488f, -2.662109f, 0.927246f, -0.678223f, 61.281250f, 1.409180f, 0.498291f, -2.347656f, 2.416016f, 0.176392f, -1.748047f, -0.005047f, -2.009766f, -0.429199f, 1.181641f, -2.539062f, -0.053131f, 1.112305f, 0.461670f, -0.088257f, 0.294434f, 5.117188f, -0.818359f, -1.114258f, -2.314453f, -3.378906f, 0.365479f, -3.250000f, 135.750000f, 1.856445f, -0.360107f, -1.295898f, -11.921875f, 9.539062f, -0.066589f, -0.256104f, -1.118164f, 2.486328f, -0.844238f, 0.314941f, 9.570312f, -0.368896f, -1.446289f, -1.483398f, -0.638184f, -0.339600f, -0.279053f, -0.836426f, -6.886719f, 4.132812f, -0.417725f, -0.363281f, -1.579102f, -0.463379f, -1.058594f, -0.177734f, -4.121094f, 0.990723f, -0.503418f, -1.002930f, -1.759766f, 1.108398f, 0.761719f, -1.303711f, -1.639648f, -2.330078f, -0.595215f, -0.337402f, -0.147461f, -0.596191f, -1.867188f, -1.699219f, -1.113281f, -0.746582f, -15.257812f, 3.205078f, -2.070312f, 0.663574f, -6.667969f, -0.670898f, 1.027344f, 2.865234f, 2.083984f, 1.162109f, -0.495117f, -1.305664f, -0.690918f, -0.405029f, -0.081543f, -1.565430f, -0.137207f, 1.066406f, -1.596680f, 2.853516f, -1.115234f, -1.045898f, -1.092773f, -32.281250f, 1.169922f, -43.218750f, 2.531250f, -1.029297f, 1.097656f, -0.703125f, -2.697266f, 0.727539f, 2.548828f, 0.506348f, -0.394287f, -0.147339f, -4.785156f, -1.270508f, 0.784668f, -0.769043f, -11.859375f, -1.742188f, -13.335938f, -0.050690f, 1.870117f, 1.350586f, -1.129883f, -0.757324f, 1.589844f, 0.798340f, 3.437500f, 0.340820f, 2.291016f }; + +#endif /* DATA_H_ */ diff --git a/tests/spatz_on_magia/onnx_div/test_data/generator.py b/tests/spatz_on_magia/onnx_div/test_data/generator.py new file mode 100644 index 00000000..6139a886 --- /dev/null +++ b/tests/spatz_on_magia/onnx_div/test_data/generator.py @@ -0,0 +1,88 @@ +import os +import sys +import numpy as np +import onnx +import onnxruntime as ort +from onnx import helper, TensorProto + +def parse_args(): + if len(sys.argv) != 2: + print("Error: missing argument ") + print("Usage: python3 generator.py ") + sys.exit(1) + + try: + length = int(sys.argv[1]) + except ValueError: + print("Error: must be an integer") + print("Usage: python3 generator.py ") + sys.exit(1) + + return length + +def generate_operands(length): + a = (np.random.randn(length) * 10).astype(np.float16) + b = (np.random.randn(length) * 10).astype(np.float16) + + # avoid 0 and Inf or NaN + epsilon = 1e-3 + a[a==0] += epsilon + b[b==0] += epsilon + a[~np.isfinite(a)] = 1.0 + b[~np.isfinite(a)] = 1.0 + + return a, b + + +def run_onnx_div(vec_a, vec_b): + a_info = helper.make_tensor_value_info('A', TensorProto.FLOAT16, vec_a.shape) + b_info = helper.make_tensor_value_info('B', TensorProto.FLOAT16, vec_b.shape) + out_info = helper.make_tensor_value_info('Quot', TensorProto.FLOAT16, vec_a.shape) + + node_def = helper.make_node('Div', ['A', 'B'], ['Quot']) + graph_def = helper.make_graph( + [node_def], + 'onnx-div-test', + [a_info, b_info], + [out_info] + ) + model_def = helper.make_model(graph_def, producer_name='onnx-generator') + + sess = ort.InferenceSession(model_def.SerializeToString()) + res = sess.run(None, {'A': vec_a, 'B': vec_b}) + + return res[0] + +def format_array(array): + return "{ " + ", ".join(f"{x:f}f" for x in array) + " }" + +def generate_header_file(length, vec_a, vec_b, expected, filename="data.h"): + + script_dir = os.path.dirname(os.path.abspath(__file__)) + filepath = os.path.join(script_dir, filename) + + with open(filepath, "w") as f: + f.write("/* Automatically generated header file for Spatz ONNX testing */\n") + f.write("#ifndef DATA_H_\n") + f.write("#define DATA_H_\n\n") + + f.write(f"#define LEN {length}\n\n") + + f.write(f"static const float16 vec_a[] = {format_array(vec_a)};\n") + f.write(f"static const float16 vec_b[] = {format_array(vec_b)};\n") + f.write(f"static const float16 expected[] = {format_array(expected)};\n\n") + + f.write("#endif /* DATA_H_ */\n") + +def main(): + length = parse_args() + + vec_a, vec_b = generate_operands(length) + expected = run_onnx_div(vec_a, vec_b) + + generate_header_file(length, vec_a, vec_b, expected) + + print(f"File 'data.h' successfully generated with {length} elements.") + +if __name__ == "__main__": + main() From b6b5c0d4efc6a5638b840dd061b46ebcad4fe4e7 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 09:14:37 +0100 Subject: [PATCH 38/67] [tests/spatz_on_magia] onnx_add: Fix typo --- tests/spatz_on_magia/onnx_add/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index a26430a2..271a6e9c 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -74,7 +74,7 @@ static bool run_test() if (check) { printf("[CV32] Test SUCCESS\n"); } else { - printf("[CV32 Test FAILED\n]"); + printf("[CV32] Test FAILED\n"); ret = -1; } From ef9bf73b26279272abe31a76e8ddd6dc650f7ca8 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 09:15:01 +0100 Subject: [PATCH 39/67] [tests/spatz_on_magia]: onnx_div: Fix typo --- tests/spatz_on_magia/onnx_div/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index ed271843..d7b81692 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -74,7 +74,7 @@ static bool run_test() if (check) { printf("[CV32] Test SUCCESS\n"); } else { - printf("[CV32 Test FAILED\n]"); + printf("[CV32] Test FAILED\n"); ret = -1; } From 331d90523301cda85a9c536161053351fa384f65 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:31:33 +0100 Subject: [PATCH 40/67] [magia_v2/include/utils] compare_utils: Use raw uint16_t for compare instead of float16 HP Float support seems to have problems --- .../magia_v2/include/utils/compare_utils.h | 21 +++++++------------ tests/spatz_on_magia/onnx_add/main.c | 2 +- tests/spatz_on_magia/onnx_div/main.c | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/targets/magia_v2/include/utils/compare_utils.h b/targets/magia_v2/include/utils/compare_utils.h index 08b6d16b..d1c0d26f 100644 --- a/targets/magia_v2/include/utils/compare_utils.h +++ b/targets/magia_v2/include/utils/compare_utils.h @@ -7,26 +7,21 @@ #include "magia_tile_utils.h" #include "printf_wrapper.h" -#define TOLL 0.004f - -static inline bool vector_compare_fp16(uintptr_t addr_res, uintptr_t addr_exp, int len) { +static inline bool vector_compare_fp16_bitwise(uintptr_t addr_res, uintptr_t addr_exp, int len) { + volatile uint16_t val_exp; + volatile uint16_t val_res; uint32_t offset; - float abs_diff; - float computed; - float expected; bool ret; ret = true; for (int i = 0; i < len; i++) { - offset = i * sizeof(float16); - - computed = (float)mmio_fp16(addr_res + offset); - expected = (float)mmio_fp16(addr_exp + offset); + offset = i * sizeof (uint16_t); - abs_diff = fabs(computed - expected); + val_exp = mmio16(addr_exp + offset); + val_res = mmio16(addr_res + offset); - if (abs_diff > TOLL) { - printf("Mismatch at index %d\n", i); + if (val_exp != val_res) { + printf("Mismatch at index %d - expected raw: 0x%04x - computed raw: 0x%04x\n", i, val_exp, val_res); ret = false; } } diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 271a6e9c..38d71066 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -54,7 +54,7 @@ static int run_spatz_task() static bool check_result() { - return vector_compare_fp16(params->addr_res, params->addr_exp, params->len); + return vector_compare_fp16_bitwise(params->addr_res, params->addr_exp, params->len); } static bool run_test() diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index d7b81692..79acb2c9 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -54,7 +54,7 @@ static int run_spatz_task() static bool check_result() { - return vector_compare_fp16(params->addr_res, params->addr_exp, params->len); + return vector_compare_fp16_bitwise(params->addr_res, params->addr_exp, params->len); } static bool run_test() From f40ccda48ebefe67197bfc9a9042fde7e80af8d7 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:25:34 +0100 Subject: [PATCH 41/67] [tests/spatz_on_magia] Add onnx clip test --- tests/spatz_on_magia/CMakeLists.txt | 2 + tests/spatz_on_magia/onnx_clip/CMakeLists.txt | 21 ++++ .../onnx_clip/include/onnx_clip_mem_layout.h | 34 ++++++ .../onnx_clip/include/onnx_clip_params.h | 14 +++ tests/spatz_on_magia/onnx_clip/main.c | 107 ++++++++++++++++++ .../onnx_clip/spatz_task/onnx_clip_task.c | 43 +++++++ .../spatz_on_magia/onnx_clip/test_data/data.h | 12 ++ .../onnx_clip/test_data/generator.py | 89 +++++++++++++++ 8 files changed, 322 insertions(+) create mode 100644 tests/spatz_on_magia/onnx_clip/CMakeLists.txt create mode 100644 tests/spatz_on_magia/onnx_clip/include/onnx_clip_mem_layout.h create mode 100644 tests/spatz_on_magia/onnx_clip/include/onnx_clip_params.h create mode 100644 tests/spatz_on_magia/onnx_clip/main.c create mode 100644 tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c create mode 100644 tests/spatz_on_magia/onnx_clip/test_data/data.h create mode 100644 tests/spatz_on_magia/onnx_clip/test_data/generator.py diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt index 87dedb75..2d46a54d 100644 --- a/tests/spatz_on_magia/CMakeLists.txt +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -1,4 +1,6 @@ add_subdirectory(double_task) add_subdirectory(hello_spatz) + add_subdirectory(onnx_add) +add_subdirectory(onnx_clip) add_subdirectory(onnx_div) diff --git a/tests/spatz_on_magia/onnx_clip/CMakeLists.txt b/tests/spatz_on_magia/onnx_clip/CMakeLists.txt new file mode 100644 index 00000000..0cf56766 --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/CMakeLists.txt @@ -0,0 +1,21 @@ +set(TEST_NAME onnx_clip) + +# Compile Spatz task +add_spatz_task( + TEST_NAME ${TEST_NAME} + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/onnx_clip_task.c + FIRST_TASK_NAME onnx_clip_task + INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +# Compile CV32 executable with embedded Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c + INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_SOURCE_DIR}/include +) diff --git a/tests/spatz_on_magia/onnx_clip/include/onnx_clip_mem_layout.h b/tests/spatz_on_magia/onnx_clip/include/onnx_clip_mem_layout.h new file mode 100644 index 00000000..0bae4e9f --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/include/onnx_clip_mem_layout.h @@ -0,0 +1,34 @@ +#ifndef ONNX_CLIP_MEM_LAYOUT_H_ +#define ONNX_CLIP_MEM_LAYOUT_H_ + +#include "magia_utils.h" +#include "data.h" +#include "onnx_clip_params.h" + +#define ALIGNMENT 4 +/* Aligns the given address to 4-byte */ +#define ALIGN_4B(addr) (((addr) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)) + +#define L1_BASE_TILE (L1_BASE + (get_hartid() * L1_TILE_OFFSET)) +#define VEC_SIZE (LEN * sizeof(float16)) +#define SCALAR_SIZE (sizeof(float16)) + +#define ONNX_CLIP_PARAMS_BASE L1_BASE_TILE +#define ONNX_CLIP_PARAMS_SIZE ALIGN_4B(sizeof(onnx_clip_params_t)) + +#define INPUT_VEC_BASE ALIGN_4B(ONNX_CLIP_PARAMS_BASE + ONNX_CLIP_PARAMS_SIZE) +#define INPUT_VEC_SIZE ALIGN_4B(VEC_SIZE) + +#define MIN_VAL_BASE ALIGN_4B(INPUT_VEC_BASE + INPUT_VEC_SIZE) +#define MIN_VAL_SIZE ALIGN_4B(SCALAR_SIZE) + +#define MAX_VAL_BASE ALIGN_4B(MIN_VAL_BASE + MIN_VAL_SIZE) +#define MAX_VAL_SIZE ALIGN_4B(SCALAR_SIZE) + +#define RES_BASE ALIGN_4B(MAX_VAL_BASE + MAX_VAL_SIZE) +#define RES_SIZE ALIGN_4B(VEC_SIZE) + +#define EXP_BASE ALIGN_4B(RES_BASE + RES_SIZE) +#define EXP_SIZE ALIGN_4B(VEC_SIZE) + +#endif /* ONNX_CLIP_MEM_LAYOUT_H_ */ diff --git a/tests/spatz_on_magia/onnx_clip/include/onnx_clip_params.h b/tests/spatz_on_magia/onnx_clip/include/onnx_clip_params.h new file mode 100644 index 00000000..b2deeeed --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/include/onnx_clip_params.h @@ -0,0 +1,14 @@ +#ifndef ONNX_CLIP_PARAMS_H_ +#define ONNX_CLIP_PARAMS_H_ + +#include +typedef struct { + uintptr_t addr_input; + uintptr_t addr_res; + uintptr_t addr_exp; + uintptr_t addr_min; + uintptr_t addr_max; + uint32_t len; +} onnx_clip_params_t; + +#endif /* ONNX_CLIP_PARAMS_H_ */ diff --git a/tests/spatz_on_magia/onnx_clip/main.c b/tests/spatz_on_magia/onnx_clip/main.c new file mode 100644 index 00000000..bff0c1ca --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/main.c @@ -0,0 +1,107 @@ +#include + +#include "magia_tile_utils.h" +#include "onnx_clip_mem_layout.h" +#include "onnx_clip_params.h" +#include "onnx_clip_task_bin.h" + +#include "compare_utils.h" +#include "event_unit_utils.h" +#include "magia_spatz_utils.h" + +static int init_data(void *params) +{ + uint32_t offset; + volatile onnx_clip_params_t *clip_params; + + clip_params = (volatile onnx_clip_params_t *) params; + for (int i = 0; i < LEN; i++) { + offset = i * sizeof(float16); + + mmio_fp16(INPUT_VEC_BASE + offset) = input_vec[i]; + mmio_fp16(EXP_BASE + offset) = expected[i]; + mmio_fp16(RES_BASE + offset) = 0; + } + + mmio_fp16(MIN_VAL_BASE) = min_val; + mmio_fp16(MAX_VAL_BASE) = max_val; + + clip_params->addr_input = INPUT_VEC_BASE; + clip_params->addr_min = MIN_VAL_BASE; + clip_params->addr_max = MAX_VAL_BASE; + clip_params->addr_exp = EXP_BASE; + clip_params->addr_res = RES_BASE; + clip_params->len = LEN; + + return 0; +} + +static int run_spatz_task() +{ + int ret; + + eu_init(); + eu_enable_events(EU_SPATZ_DONE_MASK); + + spatz_init(SPATZ_BINARY_START); + spatz_run_task_with_params(ONNX_CLIP_TASK, ONNX_CLIP_PARAMS_BASE); + + eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + + ret = spatz_get_exit_code(); + + spatz_clk_dis(); + + return ret; +} + +static bool check_result(void *params) +{ + volatile onnx_clip_params_t *clip_params; + clip_params = (volatile onnx_clip_params_t *) params; + return vector_compare_fp16_bitwise(clip_params->addr_res, clip_params->addr_exp, clip_params->len); +} + +static int run_test() +{ + int ret; + bool check; + volatile onnx_clip_params_t *params; + + params = (volatile onnx_clip_params_t *) ONNX_CLIP_PARAMS_BASE; + + ret = init_data(params); + if (ret != 0) { + printf("[CV32] Params initialization failed with error: %d\n", ret); + return ret; + } + + ret = run_spatz_task(); + if (ret != 0) { + printf("[CV32] Spatz task FAILED with error: %d\n", ret); + return ret; + } + + check = check_result(params); + if (check) { + printf("[CV32] Test SUCCESS\n"); + } else { + printf("[CV32] Test FAILED\n"); + ret = -1; + } + + return ret; +} + +int main(void) +{ + int ret; + + printf("\n##################################### ONNX_CLIP TEST #####################################\n\n"); + + ret = run_test(); + + printf("\n##########################################################################################\n\n"); + + return ret; +} diff --git a/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c b/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c new file mode 100644 index 00000000..a181ee5a --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c @@ -0,0 +1,43 @@ +#include "onnx_clip_params.h" + +#include "magia_spatz_utils.h" +#include "magia_tile_utils.h" + +int onnx_clip_task(void) +{ + volatile onnx_clip_params_t *params; + uintptr_t params_addr; + + _Float16 *result; + _Float16 *input; + _Float16 min; + _Float16 max; + + size_t avl; + size_t vl; + + params_addr = mmio32(SPATZ_DATA); + params = (volatile onnx_clip_params_t *) params_addr; + + input = (_Float16 *)params->addr_input; + result = (_Float16 *)params->addr_res; + min = *(_Float16 *)params->addr_min; + max = *(_Float16 *)params->addr_max; + avl = params->len; + + for (; avl > 0; avl -= vl) { + asm volatile ("vsetvli %0, %1, e16, m8, ta, ma" : "=r"(vl) : "r"(avl)); + + asm volatile ("vle16.v v0, (%0)" :: "r"(input)); + + asm volatile ("vfmin.vf v8, v0, %0" :: "f"(max)); + asm volatile ("vfmax.vf v8, v8, %0" :: "f"(min)); + + asm volatile ("vse16.v v8, (%0)" :: "r"(result)); + + result += vl; + input += vl; + } + + return 0; +} diff --git a/tests/spatz_on_magia/onnx_clip/test_data/data.h b/tests/spatz_on_magia/onnx_clip/test_data/data.h new file mode 100644 index 00000000..2b5ff1ff --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/test_data/data.h @@ -0,0 +1,12 @@ +/* Automatically generated header file for Spatz ONNX testing */ +#ifndef DATA_H_ +#define DATA_H_ + +#define LEN 2048 + +static const float16 input_vec[] = { 5.062500f, 19.921875f, -2.808594f, 3.906250f, 16.718750f, -2.402344f, -1.770508f, 14.242188f, 20.046875f, 7.382812f, 3.841797f, 2.298828f, -17.406250f, 25.203125f, 6.218750f, 1.691406f, -10.265625f, -19.421875f, 7.781250f, -2.794922f, 12.164062f, 0.761719f, -5.367188f, 4.867188f, 6.097656f, -0.366943f, -2.781250f, 10.375000f, -5.710938f, -10.367188f, 3.687500f, -10.156250f, 4.812500f, 18.796875f, 9.296875f, 2.417969f, -5.730469f, 3.048828f, 0.258789f, 10.000000f, -7.953125f, -2.646484f, 1.547852f, -0.626465f, -3.564453f, -28.203125f, -13.375000f, -4.976562f, -0.637207f, -0.257812f, -21.453125f, -16.203125f, 4.296875f, -15.921875f, 9.656250f, -12.281250f, 0.331299f, 0.023376f, 7.332031f, -20.156250f, 8.476562f, 15.656250f, 11.125000f, -15.171875f, 8.312500f, -0.458008f, -11.156250f, 0.671387f, -7.156250f, -6.640625f, -5.542969f, 5.597656f, 0.870117f, 11.359375f, 2.376953f, -16.062500f, -1.016602f, -1.394531f, -0.675781f, -0.872070f, 0.842285f, -1.569336f, 7.761719f, -4.023438f, -2.041016f, -11.054688f, -4.398438f, 0.016647f, 0.061279f, 2.457031f, 25.203125f, 23.921875f, -0.462646f, -16.312500f, 9.445312f, 19.156250f, 6.988281f, -19.515625f, -7.625000f, -12.171875f, -6.218750f, -2.687500f, 3.720703f, 2.718750f, -11.164062f, 15.265625f, -6.910156f, 6.003906f, -10.562500f, 8.132812f, 18.109375f, -13.875000f, 6.855469f, 4.691406f, -6.203125f, -7.417969f, -15.554688f, 23.625000f, 22.265625f, -2.857422f, 1.242188f, 12.953125f, -0.638184f, -8.093750f, -8.500000f, 8.742188f, 0.336670f, -2.767578f, -9.687500f, 23.390625f, -16.921875f, 7.562500f, 12.367188f, -2.212891f, 9.132812f, -0.349609f, 3.035156f, -0.456787f, 3.541016f, -3.666016f, 8.898438f, 4.324219f, -8.390625f, 15.289062f, -10.820312f, 2.113281f, 7.191406f, 11.632812f, 9.609375f, 6.191406f, 13.945312f, 4.316406f, 10.179688f, 24.765625f, -3.472656f, 3.208984f, -2.917969f, 2.578125f, -11.265625f, -17.796875f, -17.625000f, 10.539062f, -5.335938f, 7.394531f, 5.742188f, -10.531250f, -5.902344f, 13.679688f, -20.390625f, -9.648438f, -0.414551f, 0.672852f, 9.671875f, -5.855469f, -4.949219f, -28.812500f, -7.359375f, 4.492188f, 1.772461f, -11.195312f, 3.822266f, 2.144531f, -6.390625f, -6.578125f, 5.605469f, -0.882324f, 14.578125f, -7.132812f, 10.875000f, -7.953125f, 9.148438f, 4.789062f, 4.398438f, -11.796875f, 11.968750f, -13.578125f, 1.472656f, 0.180786f, -6.214844f, -7.144531f, -28.796875f, -15.460938f, 5.187500f, 12.015625f, 7.199219f, -9.882812f, -3.003906f, -1.137695f, -2.757812f, -5.007812f, -4.589844f, 11.328125f, -14.750000f, 5.742188f, -0.018524f, -13.562500f, -1.334961f, -9.304688f, -16.093750f, 6.449219f, -8.171875f, -13.210938f, -11.742188f, 6.835938f, 7.917969f, 7.691406f, 11.242188f, -7.785156f, 8.703125f, -1.873047f, 24.390625f, 28.515625f, 3.457031f, 11.242188f, 16.468750f, 2.667969f, 9.429688f, -6.980469f, -12.757812f, -1.304688f, -15.562500f, 0.024933f, -22.687500f, -8.804688f, 18.484375f, -0.554688f, -6.117188f, 2.580078f, 4.699219f, 4.363281f, 2.255859f, -4.539062f, -12.671875f, 1.221680f, -4.238281f, 16.390625f, 2.539062f, -16.328125f, 0.538086f, -1.554688f, -5.195312f, -6.164062f, -19.343750f, 8.984375f, -7.191406f, 8.710938f, -1.295898f, 14.445312f, 12.789062f, 0.256348f, -9.132812f, 1.065430f, -11.968750f, -21.281250f, -4.863281f, -11.656250f, 0.661621f, -4.621094f, -13.671875f, 8.070312f, -17.375000f, 21.015625f, -1.147461f, 0.382324f, 14.710938f, 20.875000f, -1.817383f, -5.703125f, -14.601562f, -3.425781f, 9.984375f, 6.960938f, 2.152344f, 4.054688f, -6.257812f, -2.062500f, 3.919922f, -1.499023f, 4.417969f, 2.218750f, 8.476562f, -4.023438f, 7.675781f, -11.406250f, 0.330322f, -12.671875f, 8.968750f, 1.190430f, 11.796875f, 13.703125f, -0.432617f, 5.691406f, 2.125000f, 0.469482f, 14.468750f, 11.164062f, 0.600098f, 7.734375f, 12.914062f, 4.281250f, -1.070312f, -9.140625f, 11.468750f, 3.509766f, 5.722656f, -5.585938f, -28.140625f, -6.484375f, 6.171875f, -5.878906f, -8.914062f, 6.085938f, 1.708008f, 9.500000f, -6.652344f, 1.345703f, -17.593750f, 12.625000f, 1.398438f, -10.085938f, -3.496094f, -6.363281f, -7.062500f, -12.218750f, -6.945312f, -11.117188f, -11.625000f, 0.591797f, -9.507812f, -12.117188f, -5.648438f, -9.570312f, 3.835938f, 13.867188f, 9.320312f, -4.339844f, 6.062500f, -6.464844f, -20.703125f, 3.712891f, 2.759766f, 2.037109f, 9.054688f, -8.406250f, 1.660156f, -3.876953f, 2.851562f, -8.453125f, -13.656250f, 9.492188f, 2.328125f, -10.367188f, 18.765625f, -1.257812f, 1.274414f, 14.195312f, 4.394531f, -15.265625f, 4.902344f, -2.511719f, -1.938477f, -0.682617f, -0.805664f, 13.359375f, -15.585938f, 7.097656f, 21.718750f, 4.011719f, 0.913086f, 6.542969f, 29.593750f, 3.250000f, 7.750000f, 3.845703f, -4.070312f, 10.460938f, -11.046875f, -2.904297f, 1.387695f, 0.667969f, -6.664062f, 14.742188f, -0.638672f, 0.547852f, -23.093750f, 4.687500f, -13.085938f, -8.007812f, 9.539062f, -3.539062f, -6.605469f, -3.650391f, 0.606934f, -16.656250f, 2.562500f, -0.960449f, 1.914062f, 4.453125f, 0.057831f, 5.609375f, 5.027344f, 7.292969f, -5.613281f, 7.664062f, -14.335938f, 19.156250f, 2.908203f, -17.031250f, -7.593750f, 22.156250f, 10.968750f, 1.789062f, 5.394531f, -0.011292f, -2.056641f, -9.281250f, -5.886719f, 2.177734f, -14.648438f, -5.875000f, -15.179688f, -1.727539f, -7.105469f, -4.480469f, 4.125000f, -1.218750f, -12.171875f, 6.226562f, 1.337891f, 10.054688f, -15.234375f, 19.875000f, 16.125000f, -5.738281f, 26.796875f, 11.062500f, 7.332031f, -4.437500f, -10.109375f, -2.744141f, 2.724609f, -13.992188f, 4.136719f, -4.753906f, 2.720703f, 3.832031f, 6.804688f, 6.585938f, 4.019531f, 0.641602f, -3.208984f, 6.574219f, 19.218750f, 5.371094f, -3.337891f, 19.687500f, -2.724609f, -0.476318f, -14.218750f, 13.445312f, 4.156250f, 3.769531f, -12.500000f, 7.996094f, -5.046875f, -1.600586f, 1.039062f, 13.375000f, -2.500000f, -6.253906f, -19.703125f, 16.890625f, 11.039062f, -15.070312f, -13.625000f, 19.703125f, 5.304688f, 1.453125f, -13.656250f, 10.398438f, 7.707031f, -10.460938f, 12.015625f, 21.296875f, -10.101562f, -15.914062f, -30.421875f, 3.808594f, 1.636719f, -14.968750f, 7.242188f, -10.578125f, -10.234375f, 7.539062f, 5.226562f, 3.537109f, -10.234375f, 6.640625f, 11.382812f, -0.225586f, 0.172729f, 1.709961f, 11.398438f, 4.664062f, -13.312500f, 5.472656f, -2.917969f, -15.437500f, -16.687500f, -1.251953f, 14.835938f, -4.789062f, -0.067627f, 29.515625f, 0.263184f, -9.773438f, 14.859375f, -11.460938f, 11.281250f, -12.421875f, -5.675781f, -25.640625f, 1.407227f, -4.777344f, 11.273438f, -5.113281f, -18.453125f, -8.640625f, 5.949219f, 0.109985f, 18.171875f, 20.125000f, 24.656250f, 9.632812f, -3.679688f, 7.917969f, 10.070312f, -5.605469f, -10.046875f, 13.226562f, -20.953125f, -5.484375f, 13.507812f, 2.648438f, -7.035156f, 14.335938f, -13.445312f, -1.238281f, -9.984375f, -12.945312f, -7.222656f, -3.974609f, 5.042969f, -7.074219f, -6.445312f, 2.724609f, -2.425781f, 11.125000f, -3.998047f, 4.394531f, 5.671875f, -16.921875f, 6.859375f, 2.822266f, -4.234375f, 4.691406f, 4.210938f, -4.960938f, -0.245972f, -44.656250f, -9.140625f, 5.359375f, 0.563965f, 19.937500f, 1.136719f, 21.953125f, 4.269531f, -14.164062f, 1.148438f, -21.375000f, 12.179688f, 0.612793f, -15.171875f, 2.679688f, -14.734375f, -11.132812f, -10.796875f, 13.968750f, 2.169922f, 14.937500f, 11.500000f, -5.484375f, 1.376953f, -14.539062f, 2.277344f, -2.908203f, -10.304688f, 4.519531f, 11.421875f, 6.417969f, 9.875000f, -3.804688f, 7.195312f, 0.005409f, 5.050781f, -7.218750f, 12.640625f, 13.929688f, -12.812500f, -18.078125f, 7.257812f, -1.008789f, -14.648438f, -9.484375f, 21.000000f, -2.269531f, -2.103516f, -0.542480f, -3.148438f, -4.140625f, -7.164062f, -11.640625f, 6.855469f, 11.890625f, 10.148438f, 12.625000f, 9.257812f, 8.851562f, -14.351562f, 15.679688f, 16.984375f, -12.054688f, 10.343750f, -2.326172f, 18.578125f, 9.898438f, -14.453125f, 13.570312f, -9.710938f, -4.980469f, -19.109375f, -2.578125f, -3.662109f, 4.906250f, -9.968750f, 8.843750f, 13.585938f, 6.484375f, 8.703125f, 6.027344f, 0.803223f, -7.289062f, 1.192383f, 3.525391f, 8.578125f, 4.781250f, 2.400391f, 8.710938f, -3.789062f, -5.296875f, -11.421875f, -4.621094f, 2.472656f, -3.169922f, -4.964844f, -0.406006f, 2.029297f, -1.854492f, -13.703125f, 4.308594f, 1.157227f, 1.907227f, 8.187500f, 3.099609f, 9.625000f, 15.289062f, 21.359375f, -11.093750f, 9.328125f, 14.789062f, 3.574219f, 14.671875f, -0.086853f, -1.828125f, 8.859375f, 0.217529f, 11.351562f, -1.333984f, 10.820312f, -3.009766f, -4.195312f, 3.179688f, -5.488281f, -14.070312f, 4.003906f, 2.953125f, 10.328125f, 7.648438f, 4.652344f, 16.859375f, -5.503906f, 0.506836f, 6.570312f, 5.558594f, -11.289062f, -8.585938f, -6.687500f, -12.281250f, -0.050964f, -2.933594f, -6.644531f, 4.000000f, -4.910156f, -9.164062f, -2.101562f, -16.375000f, -16.250000f, -0.207520f, 6.382812f, 2.978516f, -4.722656f, 10.882812f, 2.298828f, -15.648438f, -14.921875f, -0.279541f, -8.484375f, 7.210938f, 11.640625f, -9.726562f, -3.718750f, 0.416992f, -7.890625f, 0.890137f, 1.445312f, -4.507812f, -3.591797f, 8.273438f, 4.300781f, 8.226562f, -0.015251f, 10.898438f, -5.324219f, 1.726562f, -1.801758f, 6.210938f, 8.046875f, -4.757812f, -0.826660f, 4.796875f, 12.367188f, 7.335938f, 0.619629f, 7.429688f, 6.238281f, 8.335938f, -13.617188f, 8.367188f, -2.109375f, 0.155884f, 4.019531f, -1.195312f, 4.000000f, 14.968750f, -1.419922f, -22.781250f, 17.125000f, 1.264648f, 6.152344f, 17.031250f, 7.386719f, -1.012695f, 18.468750f, 4.089844f, -9.156250f, 10.781250f, 4.531250f, 2.343750f, -18.718750f, 1.572266f, 18.703125f, -23.046875f, -9.390625f, 16.015625f, 9.367188f, 4.750000f, -11.734375f, -2.566406f, -21.250000f, -0.991699f, -4.816406f, 1.274414f, 3.363281f, 3.896484f, 19.406250f, -23.125000f, -13.664062f, 9.218750f, 7.437500f, -6.679688f, -2.837891f, 6.070312f, 6.445312f, -6.066406f, 3.789062f, 3.765625f, -4.351562f, 4.023438f, -9.421875f, 10.890625f, 6.726562f, -1.788086f, 20.062500f, 3.681641f, -13.390625f, -8.992188f, 5.500000f, -7.906250f, 6.261719f, 16.265625f, 15.476562f, 3.121094f, 1.127930f, 0.982422f, -3.095703f, -17.750000f, -2.900391f, -2.419922f, -5.312500f, 19.109375f, -17.343750f, -9.023438f, -14.000000f, 1.553711f, -5.726562f, 7.253906f, 18.187500f, 0.348633f, -7.164062f, 6.152344f, 4.242188f, 5.296875f, -3.275391f, -2.462891f, 22.515625f, -2.212891f, 7.707031f, -10.492188f, 4.000000f, 22.078125f, -1.268555f, 10.398438f, 8.343750f, -5.769531f, 3.437500f, -4.023438f, -12.078125f, -18.781250f, -7.367188f, 0.614258f, -0.435547f, -15.906250f, -8.664062f, -10.023438f, 9.976562f, 17.593750f, -15.578125f, 7.269531f, 1.741211f, -12.609375f, 2.580078f, -7.468750f, -11.328125f, 12.906250f, 3.373047f, -15.992188f, 6.488281f, 5.171875f, -4.363281f, 2.199219f, 3.169922f, -1.734375f, 12.921875f, 0.979004f, -5.628906f, 7.910156f, -2.798828f, 4.832031f, 5.144531f, 5.175781f, -0.265625f, 4.207031f, 14.914062f, 0.057251f, 15.367188f, -18.578125f, 7.597656f, 1.343750f, -3.564453f, 6.152344f, 0.045563f, -0.333496f, -4.613281f, 18.515625f, 0.306885f, -10.468750f, -24.062500f, -4.453125f, 6.179688f, 10.500000f, -18.109375f, 2.400391f, -3.437500f, 5.636719f, 2.951172f, 0.159424f, 5.304688f, -7.429688f, -0.469971f, 9.632812f, 4.835938f, 7.253906f, 9.773438f, 6.859375f, 1.550781f, 6.472656f, -0.766113f, -18.953125f, 7.992188f, 3.888672f, 1.912109f, -8.710938f, -0.570801f, 9.421875f, 2.240234f, 15.640625f, -11.070312f, -13.484375f, 1.448242f, -11.218750f, 0.868652f, 6.527344f, 0.831543f, -8.476562f, 14.718750f, -11.265625f, 7.914062f, -13.085938f, -5.160156f, -15.437500f, 14.789062f, -8.789062f, -0.429443f, 15.960938f, 6.156250f, 0.110779f, 4.875000f, 11.867188f, 0.320068f, -3.972656f, -1.533203f, -0.380859f, -5.585938f, 7.562500f, -16.656250f, 22.312500f, 14.164062f, -11.234375f, -1.147461f, 0.249756f, 3.753906f, -5.851562f, -28.250000f, -4.414062f, 0.599121f, -20.046875f, -1.142578f, -15.250000f, 2.728516f, 2.943359f, 9.742188f, 1.430664f, 17.093750f, 7.082031f, 2.320312f, 7.203125f, 4.132812f, -7.152344f, -0.589355f, 8.875000f, 4.835938f, -0.407471f, -1.727539f, -22.984375f, -9.164062f, 1.875977f, 5.820312f, 9.546875f, -2.287109f, 0.034332f, -7.625000f, -19.671875f, -5.144531f, -6.070312f, -1.679688f, 5.601562f, -9.000000f, -0.353027f, -6.660156f, -1.754883f, -13.515625f, 17.078125f, 6.914062f, 0.134766f, -10.367188f, -2.464844f, 1.695312f, 5.265625f, -2.457031f, 0.081177f, 4.082031f, 14.140625f, -14.242188f, -23.625000f, 34.687500f, 7.519531f, 3.123047f, 2.097656f, 11.851562f, -13.210938f, -8.789062f, -4.289062f, -17.765625f, 15.132812f, -6.203125f, 5.820312f, -12.742188f, -0.219849f, 5.632812f, 4.156250f, -2.970703f, 0.750488f, 10.289062f, -0.438232f, -5.808594f, 4.664062f, 8.578125f, 33.218750f, 1.136719f, 7.359375f, -1.896484f, -17.546875f, 3.787109f, 4.492188f, -3.150391f, -11.578125f, 4.765625f, -1.725586f, -4.226562f, -6.148438f, 4.605469f, -2.324219f, 1.339844f, 10.648438f, 1.154297f, 31.515625f, 5.652344f, 6.914062f, 7.542969f, -0.362549f, -9.546875f, 8.039062f, 9.156250f, 6.472656f, -10.703125f, -6.746094f, 10.640625f, 7.460938f, -5.699219f, -4.238281f, 1.440430f, 3.650391f, -2.492188f, 2.775391f, -5.500000f, -16.390625f, -12.437500f, 14.015625f, 18.515625f, -13.765625f, -9.835938f, -10.101562f, 11.601562f, 16.953125f, -4.988281f, 15.601562f, 8.867188f, 0.647461f, 11.734375f, 4.753906f, -2.029297f, 2.931641f, 5.296875f, 4.105469f, 20.218750f, 12.890625f, -0.045959f, 0.124207f, -18.531250f, -4.664062f, 5.128906f, 3.244141f, -13.687500f, -14.882812f, -12.312500f, 5.964844f, 11.070312f, -7.148438f, -0.971680f, 5.531250f, -1.369141f, 10.265625f, -8.773438f, -5.347656f, -4.972656f, 7.265625f, 3.728516f, 16.718750f, -1.668945f, -0.595215f, 4.941406f, -5.796875f, 20.625000f, -3.132812f, 6.535156f, -15.187500f, 17.140625f, -0.906250f, -19.609375f, 5.781250f, -6.761719f, -0.615234f, -12.742188f, -3.970703f, 6.332031f, 24.000000f, -11.531250f, 2.609375f, 12.382812f, 0.104309f, 6.914062f, -1.954102f, -1.468750f, 5.929688f, 9.906250f, 11.484375f, 12.117188f, -10.632812f, 1.847656f, 4.906250f, -3.796875f, -1.178711f, 3.404297f, -18.250000f, 1.322266f, 0.804199f, -10.109375f, -6.519531f, -10.914062f, 5.519531f, -13.476562f, -1.863281f, 0.950684f, -9.882812f, 10.078125f, -7.761719f, -5.175781f, 10.875000f, -4.843750f, 15.210938f, 4.789062f, -1.625000f, -1.651367f, -9.937500f, 3.744141f, -0.253418f, 4.867188f, 1.367188f, 1.846680f, 7.484375f, 1.194336f, 2.162109f, -9.492188f, -16.078125f, 4.351562f, -8.585938f, 5.550781f, -9.531250f, -9.070312f, -27.125000f, 4.496094f, 21.765625f, -2.630859f, 4.886719f, 0.705566f, 19.703125f, -9.039062f, -13.695312f, 2.330078f, 9.226562f, -3.517578f, 1.130859f, 2.816406f, 6.167969f, -3.369141f, -0.565430f, -9.453125f, -0.049805f, 13.070312f, 5.734375f, -6.687500f, -11.695312f, -10.554688f, 14.593750f, -22.140625f, -1.067383f, 1.041016f, -4.054688f, -0.302246f, 6.746094f, 20.093750f, -17.468750f, -14.523438f, -7.554688f, 5.093750f, 19.359375f, 1.894531f, 10.414062f, 13.226562f, 21.484375f, 13.453125f, 17.500000f, 8.750000f, 9.015625f, -14.398438f, -13.460938f, 0.108337f, -1.505859f, 3.984375f, 1.970703f, 4.082031f, 7.304688f, -3.238281f, -5.339844f, -5.820312f, 6.832031f, 1.647461f, -0.320801f, 20.234375f, 3.541016f, 7.089844f, 1.440430f, 18.671875f, -1.457031f, -3.884766f, 9.703125f, 1.930664f, 9.515625f, -4.050781f, 13.531250f, -2.394531f, 8.453125f, -10.343750f, 18.359375f, 5.929688f, 6.570312f, 3.789062f, -6.925781f, -5.042969f, 4.960938f, 0.454834f, -7.031250f, 13.054688f, 16.390625f, -2.888672f, 3.402344f, -7.648438f, 9.476562f, 4.320312f, -6.085938f, 6.058594f, 7.210938f, -6.574219f, -6.128906f, 6.656250f, 22.265625f, 7.671875f, -13.218750f, -1.315430f, 8.671875f, -11.429688f, -7.296875f, 6.273438f, 5.113281f, 3.541016f, -8.578125f, 10.375000f, 10.335938f, 8.500000f, 1.320312f, 1.143555f, 2.488281f, -7.144531f, 12.757812f, -13.734375f, 3.078125f, -13.304688f, -3.433594f, -9.257812f, -4.414062f, -4.804688f, -1.407227f, -1.355469f, -16.531250f, -0.401123f, 29.437500f, 0.613770f, 7.960938f, -16.890625f, 4.675781f, -1.982422f, 3.283203f, -10.171875f, 8.218750f, 3.259766f, -10.265625f, -12.359375f, -16.046875f, 15.351562f, 4.121094f, 9.351562f, -17.625000f, -4.746094f, -4.652344f, -4.042969f, -11.296875f, 1.207031f, 10.429688f, 2.347656f, -15.890625f, -4.503906f, -2.902344f, -1.708008f, -3.849609f, -8.171875f, 12.195312f, -5.707031f, -10.625000f, -10.125000f, 17.843750f, -9.765625f, 26.640625f, 15.500000f, 2.080078f, -9.843750f, 5.695312f, -23.250000f, -3.224609f, -10.093750f, -9.781250f, -5.171875f, 9.664062f, -1.185547f, -9.281250f, -13.093750f, -10.125000f, 14.476562f, -2.423828f, 13.148438f, -4.648438f, 1.208008f, 5.250000f, 9.445312f, -10.062500f, 16.750000f, -3.095703f, -3.373047f, 0.571777f, -6.039062f, 9.843750f, -5.570312f, -6.941406f, -6.914062f, -0.615234f, 8.406250f, 9.781250f, -8.531250f, -2.779297f, -7.355469f, -11.539062f, 9.531250f, 18.171875f, 4.062500f, -0.013100f, 0.016052f, 2.531250f, 3.812500f, 10.648438f, 10.046875f, -13.921875f, 6.265625f, -8.234375f, -6.988281f, 4.628906f, -5.171875f, 10.289062f, 8.757812f, -3.447266f, 8.039062f, 5.066406f, 12.937500f, 1.721680f, -3.269531f, -0.505859f, 0.158813f, -3.886719f, -3.345703f, -4.042969f, -0.747070f, -18.046875f, -0.142822f, 12.414062f, -5.957031f, -4.675781f, 1.763672f, -2.078125f, 2.703125f, 2.173828f, 3.703125f, 1.984375f, -3.910156f, 22.562500f, -4.445312f, 3.130859f, -3.587891f, 6.597656f, -3.814453f, -10.085938f, 5.125000f, 3.914062f, -1.489258f, 13.312500f, 9.882812f, 11.710938f, -5.050781f, 7.492188f, -9.703125f, 9.187500f, 5.687500f, -0.451416f, -6.800781f, 5.578125f, 9.257812f, -13.281250f, 8.148438f, 4.441406f, 15.023438f, -0.763184f, 7.988281f, 19.078125f, -13.281250f, 0.649414f, -7.187500f, 11.414062f, 5.976562f, 9.492188f, -16.671875f, -8.515625f, 22.421875f, 5.238281f, 12.945312f, -0.001776f, 5.273438f, -5.250000f, -18.171875f, 9.671875f, -8.539062f, -6.355469f, 17.296875f, 6.515625f, -13.515625f, 7.785156f, 3.888672f, -4.312500f, 10.976562f, 2.179688f, -1.838867f, 0.095032f, 3.710938f, 24.000000f, 10.765625f, -14.187500f, -21.156250f, -0.802246f, 6.277344f, 1.205078f, 7.980469f, -20.375000f, -5.171875f, -10.570312f, 18.968750f, 29.640625f, 9.265625f, -1.155273f, -1.240234f, 8.859375f, 11.429688f, -2.833984f, -1.505859f, -16.484375f, 16.359375f, 1.352539f, 13.195312f, 6.828125f, 17.937500f, 4.167969f, 9.726562f, 0.022339f, 16.046875f, -0.683105f, -4.035156f, -11.414062f, -7.167969f, -15.953125f, -9.820312f, 6.078125f, 10.054688f, -12.781250f, 4.109375f, 4.707031f, 4.695312f, 11.843750f, -23.515625f, 3.140625f, -2.468750f, -1.955078f, 4.378906f, 15.914062f, -4.242188f, -14.500000f, -2.976562f, -3.632812f, 5.867188f, 19.265625f, 19.062500f, 10.210938f, 9.453125f, -7.359375f, 5.902344f, -8.976562f, 7.003906f, -16.000000f, -6.738281f, 8.062500f, 11.632812f, -7.308594f, 2.755859f, -11.835938f, -10.664062f, -7.195312f, -7.777344f, -5.457031f, 0.488281f, 3.013672f, 10.445312f, 1.414062f, 1.024414f, 12.742188f, 6.605469f, -2.482422f, -16.031250f, 3.640625f, 0.425781f, -3.849609f, 13.929688f, 6.601562f, -7.476562f, -0.965332f, -3.310547f, 2.828125f, 8.960938f, -33.156250f, -3.699219f, -5.945312f, 1.919922f, -6.675781f, -16.781250f, 5.093750f, -0.670898f, -18.953125f, -0.916016f, -5.953125f, -19.656250f, 23.125000f, -7.296875f, 22.171875f, -5.886719f, 3.460938f, -8.429688f, 0.007805f, 12.750000f, -0.564941f, -6.109375f, -11.085938f, -7.046875f, 9.265625f, 5.265625f, 3.501953f, -5.160156f, -1.670898f, -9.304688f, 1.069336f, 5.261719f, 4.433594f, -25.265625f, 13.062500f, -2.705078f, -2.398438f, -2.222656f, 14.367188f, -4.882812f, -4.640625f, 6.082031f, 16.953125f, 5.230469f, 0.397949f, 7.273438f, 4.148438f, 2.650391f, -12.562500f, 9.656250f, 10.812500f, 0.575684f, -0.367188f, -25.359375f, -11.414062f, 2.087891f, -4.746094f, 4.394531f, -9.562500f, 3.201172f, -10.734375f, 16.296875f, -8.500000f, -1.680664f, 14.359375f, -5.363281f, 7.605469f, 15.507812f, 4.250000f, 2.011719f, 8.953125f, 0.166992f, 4.402344f, -17.281250f, 10.257812f, 4.410156f, -21.937500f, -1.259766f, 15.632812f, 5.925781f, -12.054688f, 2.136719f, -0.063293f, -12.203125f, 7.894531f, 29.250000f, -5.179688f, -15.062500f, 11.078125f, -5.953125f, -10.453125f, -1.941406f, -1.483398f, 4.015625f, -7.984375f, 2.625000f, 12.265625f, -11.093750f, -1.731445f, 3.414062f, -4.031250f, 4.488281f, -2.994141f, -5.429688f, -1.330078f, 12.742188f, 1.086914f, 7.835938f, 11.257812f, 9.023438f, -0.422119f, 5.304688f, 16.109375f, 7.277344f, 8.054688f, 3.439453f, -18.734375f, -15.359375f, 7.281250f, 8.304688f, -6.773438f, 9.312500f, -11.296875f, 3.695312f, 4.757812f, 14.429688f, 9.265625f, -4.296875f, -5.800781f, 1.625977f, -6.667969f, 12.726562f, -7.125000f, 3.962891f, -8.312500f, -12.148438f, -14.015625f, 8.437500f, 1.345703f, 7.175781f, -4.039062f, -3.585938f, -7.167969f, 2.748047f, -10.304688f, 2.783203f, 15.304688f, 5.148438f, -10.335938f, -0.645508f, -11.585938f, 10.953125f, -1.397461f, -25.484375f, 20.640625f, -9.210938f, 3.335938f, -6.613281f, 27.562500f, 15.921875f, -14.320312f, 18.187500f, -12.679688f, 4.648438f, -13.820312f, -4.953125f, -2.052734f, 15.617188f, -3.146484f, -18.281250f, -0.649902f, 14.617188f, 16.218750f, -10.429688f, 6.824219f, -4.054688f, -5.128906f, 3.882812f, -8.476562f, -5.601562f, 1.890625f, 1.994141f, -26.984375f, 16.593750f, -3.156250f, -12.531250f, 9.460938f, 7.203125f, 3.869141f, -12.054688f, -22.765625f, 7.070312f, 0.105774f, 0.789551f, 1.774414f, 4.253906f, 6.289062f, 5.085938f, -11.125000f, -3.406250f, 2.427734f, -9.375000f, -1.005859f, -6.304688f, -7.046875f, 21.875000f, -0.953125f, 13.390625f, 3.193359f, -6.960938f, -6.980469f, -2.804688f, 5.058594f, -21.000000f, 12.585938f, -5.496094f, -18.015625f, -8.625000f, 24.156250f, -5.179688f, 1.222656f, -16.078125f, 3.861328f, -10.203125f, 0.800293f, 0.203613f, 9.820312f, -9.062500f, 1.699219f, -23.640625f, 4.546875f, 2.171875f, -7.769531f, -10.078125f, 12.945312f, 20.437500f, 18.515625f, -0.297852f, 8.453125f, -10.953125f, -11.945312f, -4.242188f, -1.308594f, 20.453125f, -2.158203f, 9.507812f, -5.136719f, 8.375000f, 2.962891f, -4.601562f, -2.976562f, 6.070312f, 10.468750f, -6.769531f, 9.414062f, 2.929688f, -2.990234f, -4.875000f, -8.187500f, 10.390625f, 3.802734f, -10.726562f, -13.414062f, -15.882812f, 12.390625f, -3.441406f, -29.281250f, 5.046875f, -6.265625f, -8.890625f, 1.815430f, 13.312500f, -12.257812f, 11.148438f, -9.046875f, 18.375000f, -0.316895f, 5.468750f, 2.164062f, 19.906250f, 5.582031f, -9.351562f, 3.095703f, 5.468750f, -0.825684f, 2.208984f, -9.898438f, -2.675781f, 15.046875f, -1.788086f, -7.410156f, 3.138672f, -20.812500f, -14.304688f, -6.550781f, 3.351562f, 17.687500f, -9.679688f, 6.695312f, -4.359375f, -0.132324f, 15.093750f, -5.406250f, -7.335938f, 14.742188f, -9.820312f, -1.004883f, -15.492188f, 3.732422f, -2.605469f, 4.472656f, 10.726562f, -17.671875f, 13.390625f, -9.390625f, 6.289062f, 2.562500f, -8.671875f, 13.562500f, 0.044006f, -3.078125f, -13.687500f, -12.773438f, 5.269531f, 5.320312f, -0.205078f, 5.203125f, -18.234375f, 1.648438f, -6.472656f, -4.277344f, 2.216797f, -0.094666f, -1.126953f, -10.890625f, -14.273438f, -11.195312f, 12.718750f, -10.007812f, -0.407227f, -8.937500f, -9.250000f, 9.843750f, 0.242676f, -11.875000f, 3.529297f, -3.119141f, -2.636719f, 27.953125f, -4.757812f, 11.515625f, -0.868652f, -0.487061f, -1.577148f, -12.875000f, -9.664062f, -8.296875f, 16.343750f, -3.892578f, 4.117188f, -8.500000f, -1.601562f, 2.781250f, 24.734375f, -9.218750f, -0.551758f, -4.089844f, -5.433594f, 5.429688f, -3.564453f, -0.053650f, -12.734375f, -2.404297f, -2.839844f, 5.152344f, 3.279297f, 11.695312f, -4.042969f, 1.494141f, -4.636719f, -3.148438f, 9.742188f, 3.615234f, -16.421875f, -7.023438f, 9.343750f, 11.226562f, -8.835938f, 10.789062f, -9.109375f, -12.859375f, 1.666992f, 4.000000f, 12.320312f, 2.041016f, -1.267578f, 25.656250f, -11.640625f, -7.472656f, -1.515625f, 3.882812f, 0.261230f, 4.253906f, -12.562500f, -1.404297f, -0.706543f, -3.833984f, -2.656250f, -4.363281f, 0.877930f, 2.888672f, -2.529297f, -6.152344f, -7.238281f, 3.451172f, -22.187500f, -4.621094f, 18.171875f, 12.195312f, -26.312500f, 3.687500f, -8.593750f, 0.791992f, -6.347656f, 13.742188f, -13.851562f, -8.640625f, -11.343750f, -7.367188f, 4.210938f, 5.199219f, 13.890625f, 0.604980f, -1.551758f, 26.343750f, -3.759766f, -25.828125f }; +static const float16 min_val = -9.328125; +static const float16 max_val = -0.358643; +static const float16 expected[] = { -0.358643f, -0.358643f, -2.808594f, -0.358643f, -0.358643f, -2.402344f, -1.770508f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -2.794922f, -0.358643f, -0.358643f, -5.367188f, -0.358643f, -0.358643f, -0.366943f, -2.781250f, -0.358643f, -5.710938f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.730469f, -0.358643f, -0.358643f, -0.358643f, -7.953125f, -2.646484f, -0.358643f, -0.626465f, -3.564453f, -9.328125f, -9.328125f, -4.976562f, -0.637207f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.458008f, -9.328125f, -0.358643f, -7.156250f, -6.640625f, -5.542969f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -1.016602f, -1.394531f, -0.675781f, -0.872070f, -0.358643f, -1.569336f, -0.358643f, -4.023438f, -2.041016f, -9.328125f, -4.398438f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.462646f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -7.625000f, -9.328125f, -6.218750f, -2.687500f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -6.910156f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -6.203125f, -7.417969f, -9.328125f, -0.358643f, -0.358643f, -2.857422f, -0.358643f, -0.358643f, -0.638184f, -8.093750f, -8.500000f, -0.358643f, -0.358643f, -2.767578f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -2.212891f, -0.358643f, -0.358643f, -0.358643f, -0.456787f, -0.358643f, -3.666016f, -0.358643f, -0.358643f, -8.390625f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.472656f, -0.358643f, -2.917969f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -5.335938f, -0.358643f, -0.358643f, -9.328125f, -5.902344f, -0.358643f, -9.328125f, -9.328125f, -0.414551f, -0.358643f, -0.358643f, -5.855469f, -4.949219f, -9.328125f, -7.359375f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -6.390625f, -6.578125f, -0.358643f, -0.882324f, -0.358643f, -7.132812f, -0.358643f, -7.953125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -6.214844f, -7.144531f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -3.003906f, -1.137695f, -2.757812f, -5.007812f, -4.589844f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -1.334961f, -9.304688f, -9.328125f, -0.358643f, -8.171875f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.785156f, -0.358643f, -1.873047f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -6.980469f, -9.328125f, -1.304688f, -9.328125f, -0.358643f, -9.328125f, -8.804688f, -0.358643f, -0.554688f, -6.117188f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -4.539062f, -9.328125f, -0.358643f, -4.238281f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -1.554688f, -5.195312f, -6.164062f, -9.328125f, -0.358643f, -7.191406f, -0.358643f, -1.295898f, -0.358643f, -0.358643f, -0.358643f, -9.132812f, -0.358643f, -9.328125f, -9.328125f, -4.863281f, -9.328125f, -0.358643f, -4.621094f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -1.147461f, -0.358643f, -0.358643f, -0.358643f, -1.817383f, -5.703125f, -9.328125f, -3.425781f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -6.257812f, -2.062500f, -0.358643f, -1.499023f, -0.358643f, -0.358643f, -0.358643f, -4.023438f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.432617f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.070312f, -9.140625f, -0.358643f, -0.358643f, -0.358643f, -5.585938f, -9.328125f, -6.484375f, -0.358643f, -5.878906f, -8.914062f, -0.358643f, -0.358643f, -0.358643f, -6.652344f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -3.496094f, -6.363281f, -7.062500f, -9.328125f, -6.945312f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -9.328125f, -5.648438f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -4.339844f, -0.358643f, -6.464844f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -8.406250f, -0.358643f, -3.876953f, -0.358643f, -8.453125f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -1.257812f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.511719f, -1.938477f, -0.682617f, -0.805664f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -4.070312f, -0.358643f, -9.328125f, -2.904297f, -0.358643f, -0.358643f, -6.664062f, -0.358643f, -0.638672f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -8.007812f, -0.358643f, -3.539062f, -6.605469f, -3.650391f, -0.358643f, -9.328125f, -0.358643f, -0.960449f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.613281f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -7.593750f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -2.056641f, -9.281250f, -5.886719f, -0.358643f, -9.328125f, -5.875000f, -9.328125f, -1.727539f, -7.105469f, -4.480469f, -0.358643f, -1.218750f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -5.738281f, -0.358643f, -0.358643f, -0.358643f, -4.437500f, -9.328125f, -2.744141f, -0.358643f, -9.328125f, -0.358643f, -4.753906f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.208984f, -0.358643f, -0.358643f, -0.358643f, -3.337891f, -0.358643f, -2.724609f, -0.476318f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -5.046875f, -1.600586f, -0.358643f, -0.358643f, -2.500000f, -6.253906f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.917969f, -9.328125f, -9.328125f, -1.251953f, -0.358643f, -4.789062f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -5.675781f, -9.328125f, -0.358643f, -4.777344f, -0.358643f, -5.113281f, -9.328125f, -8.640625f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.679688f, -0.358643f, -0.358643f, -5.605469f, -9.328125f, -0.358643f, -9.328125f, -5.484375f, -0.358643f, -0.358643f, -7.035156f, -0.358643f, -9.328125f, -1.238281f, -9.328125f, -9.328125f, -7.222656f, -3.974609f, -0.358643f, -7.074219f, -6.445312f, -0.358643f, -2.425781f, -0.358643f, -3.998047f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -4.234375f, -0.358643f, -0.358643f, -4.960938f, -0.358643f, -9.328125f, -9.140625f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.484375f, -0.358643f, -9.328125f, -0.358643f, -2.908203f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.804688f, -0.358643f, -0.358643f, -0.358643f, -7.218750f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -1.008789f, -9.328125f, -9.328125f, -0.358643f, -2.269531f, -2.103516f, -0.542480f, -3.148438f, -4.140625f, -7.164062f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.326172f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -4.980469f, -9.328125f, -2.578125f, -3.662109f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.289062f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.789062f, -5.296875f, -9.328125f, -4.621094f, -0.358643f, -3.169922f, -4.964844f, -0.406006f, -0.358643f, -1.854492f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.828125f, -0.358643f, -0.358643f, -0.358643f, -1.333984f, -0.358643f, -3.009766f, -4.195312f, -0.358643f, -5.488281f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.503906f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -8.585938f, -6.687500f, -9.328125f, -0.358643f, -2.933594f, -6.644531f, -0.358643f, -4.910156f, -9.164062f, -2.101562f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -4.722656f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -8.484375f, -0.358643f, -0.358643f, -9.328125f, -3.718750f, -0.358643f, -7.890625f, -0.358643f, -0.358643f, -4.507812f, -3.591797f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.324219f, -0.358643f, -1.801758f, -0.358643f, -0.358643f, -4.757812f, -0.826660f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.109375f, -0.358643f, -0.358643f, -1.195312f, -0.358643f, -0.358643f, -1.419922f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.012695f, -0.358643f, -0.358643f, -9.156250f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -2.566406f, -9.328125f, -0.991699f, -4.816406f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -6.679688f, -2.837891f, -0.358643f, -0.358643f, -6.066406f, -0.358643f, -0.358643f, -4.351562f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -1.788086f, -0.358643f, -0.358643f, -9.328125f, -8.992188f, -0.358643f, -7.906250f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.095703f, -9.328125f, -2.900391f, -2.419922f, -5.312500f, -0.358643f, -9.328125f, -9.023438f, -9.328125f, -0.358643f, -5.726562f, -0.358643f, -0.358643f, -0.358643f, -7.164062f, -0.358643f, -0.358643f, -0.358643f, -3.275391f, -2.462891f, -0.358643f, -2.212891f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -1.268555f, -0.358643f, -0.358643f, -5.769531f, -0.358643f, -4.023438f, -9.328125f, -9.328125f, -7.367188f, -0.358643f, -0.435547f, -9.328125f, -8.664062f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -7.468750f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -4.363281f, -0.358643f, -0.358643f, -1.734375f, -0.358643f, -0.358643f, -5.628906f, -0.358643f, -2.798828f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -3.564453f, -0.358643f, -0.358643f, -0.358643f, -4.613281f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -4.453125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -3.437500f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.429688f, -0.469971f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.766113f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -8.710938f, -0.570801f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -8.476562f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -5.160156f, -9.328125f, -0.358643f, -8.789062f, -0.429443f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.972656f, -1.533203f, -0.380859f, -5.585938f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -1.147461f, -0.358643f, -0.358643f, -5.851562f, -9.328125f, -4.414062f, -0.358643f, -9.328125f, -1.142578f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.152344f, -0.589355f, -0.358643f, -0.358643f, -0.407471f, -1.727539f, -9.328125f, -9.164062f, -0.358643f, -0.358643f, -0.358643f, -2.287109f, -0.358643f, -7.625000f, -9.328125f, -5.144531f, -6.070312f, -1.679688f, -0.358643f, -9.000000f, -0.358643f, -6.660156f, -1.754883f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -2.464844f, -0.358643f, -0.358643f, -2.457031f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -8.789062f, -4.289062f, -9.328125f, -0.358643f, -6.203125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -2.970703f, -0.358643f, -0.358643f, -0.438232f, -5.808594f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.896484f, -9.328125f, -0.358643f, -0.358643f, -3.150391f, -9.328125f, -0.358643f, -1.725586f, -4.226562f, -6.148438f, -0.358643f, -2.324219f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.362549f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -6.746094f, -0.358643f, -0.358643f, -5.699219f, -4.238281f, -0.358643f, -0.358643f, -2.492188f, -0.358643f, -5.500000f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -4.988281f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -2.029297f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -4.664062f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -7.148438f, -0.971680f, -0.358643f, -1.369141f, -0.358643f, -8.773438f, -5.347656f, -4.972656f, -0.358643f, -0.358643f, -0.358643f, -1.668945f, -0.595215f, -0.358643f, -5.796875f, -0.358643f, -3.132812f, -0.358643f, -9.328125f, -0.358643f, -0.906250f, -9.328125f, -0.358643f, -6.761719f, -0.615234f, -9.328125f, -3.970703f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.954102f, -1.468750f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -3.796875f, -1.178711f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -6.519531f, -9.328125f, -0.358643f, -9.328125f, -1.863281f, -0.358643f, -9.328125f, -0.358643f, -7.761719f, -5.175781f, -0.358643f, -4.843750f, -0.358643f, -0.358643f, -1.625000f, -1.651367f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -8.585938f, -0.358643f, -9.328125f, -9.070312f, -9.328125f, -0.358643f, -0.358643f, -2.630859f, -0.358643f, -0.358643f, -0.358643f, -9.039062f, -9.328125f, -0.358643f, -0.358643f, -3.517578f, -0.358643f, -0.358643f, -0.358643f, -3.369141f, -0.565430f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -6.687500f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -1.067383f, -0.358643f, -4.054688f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -7.554688f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -1.505859f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.238281f, -5.339844f, -5.820312f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.457031f, -3.884766f, -0.358643f, -0.358643f, -0.358643f, -4.050781f, -0.358643f, -2.394531f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -6.925781f, -5.042969f, -0.358643f, -0.358643f, -7.031250f, -0.358643f, -0.358643f, -2.888672f, -0.358643f, -7.648438f, -0.358643f, -0.358643f, -6.085938f, -0.358643f, -0.358643f, -6.574219f, -6.128906f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -1.315430f, -0.358643f, -9.328125f, -7.296875f, -0.358643f, -0.358643f, -0.358643f, -8.578125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.144531f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -3.433594f, -9.257812f, -4.414062f, -4.804688f, -1.407227f, -1.355469f, -9.328125f, -0.401123f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -1.982422f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -4.746094f, -4.652344f, -4.042969f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -4.503906f, -2.902344f, -1.708008f, -3.849609f, -8.171875f, -0.358643f, -5.707031f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -3.224609f, -9.328125f, -9.328125f, -5.171875f, -0.358643f, -1.185547f, -9.281250f, -9.328125f, -9.328125f, -0.358643f, -2.423828f, -0.358643f, -4.648438f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -3.095703f, -3.373047f, -0.358643f, -6.039062f, -0.358643f, -5.570312f, -6.941406f, -6.914062f, -0.615234f, -0.358643f, -0.358643f, -8.531250f, -2.779297f, -7.355469f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -8.234375f, -6.988281f, -0.358643f, -5.171875f, -0.358643f, -0.358643f, -3.447266f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.269531f, -0.505859f, -0.358643f, -3.886719f, -3.345703f, -4.042969f, -0.747070f, -9.328125f, -0.358643f, -0.358643f, -5.957031f, -4.675781f, -0.358643f, -2.078125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -3.910156f, -0.358643f, -4.445312f, -0.358643f, -3.587891f, -0.358643f, -3.814453f, -9.328125f, -0.358643f, -0.358643f, -1.489258f, -0.358643f, -0.358643f, -0.358643f, -5.050781f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.451416f, -6.800781f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.763184f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -7.187500f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -8.515625f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -5.250000f, -9.328125f, -0.358643f, -8.539062f, -6.355469f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -4.312500f, -0.358643f, -0.358643f, -1.838867f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.802246f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -5.171875f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -1.155273f, -1.240234f, -0.358643f, -0.358643f, -2.833984f, -1.505859f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.683105f, -4.035156f, -9.328125f, -7.167969f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.468750f, -1.955078f, -0.358643f, -0.358643f, -4.242188f, -9.328125f, -2.976562f, -3.632812f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -7.359375f, -0.358643f, -8.976562f, -0.358643f, -9.328125f, -6.738281f, -0.358643f, -0.358643f, -7.308594f, -0.358643f, -9.328125f, -9.328125f, -7.195312f, -7.777344f, -5.457031f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -2.482422f, -9.328125f, -0.358643f, -0.358643f, -3.849609f, -0.358643f, -0.358643f, -7.476562f, -0.965332f, -3.310547f, -0.358643f, -0.358643f, -9.328125f, -3.699219f, -5.945312f, -0.358643f, -6.675781f, -9.328125f, -0.358643f, -0.670898f, -9.328125f, -0.916016f, -5.953125f, -9.328125f, -0.358643f, -7.296875f, -0.358643f, -5.886719f, -0.358643f, -8.429688f, -0.358643f, -0.358643f, -0.564941f, -6.109375f, -9.328125f, -7.046875f, -0.358643f, -0.358643f, -0.358643f, -5.160156f, -1.670898f, -9.304688f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -2.705078f, -2.398438f, -2.222656f, -0.358643f, -4.882812f, -4.640625f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.367188f, -9.328125f, -9.328125f, -0.358643f, -4.746094f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -8.500000f, -1.680664f, -0.358643f, -5.363281f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -1.259766f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -5.179688f, -9.328125f, -0.358643f, -5.953125f, -9.328125f, -1.941406f, -1.483398f, -0.358643f, -7.984375f, -0.358643f, -0.358643f, -9.328125f, -1.731445f, -0.358643f, -4.031250f, -0.358643f, -2.994141f, -5.429688f, -1.330078f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.422119f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -6.773438f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -4.296875f, -5.800781f, -0.358643f, -6.667969f, -0.358643f, -7.125000f, -0.358643f, -8.312500f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -4.039062f, -3.585938f, -7.167969f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.645508f, -9.328125f, -0.358643f, -1.397461f, -9.328125f, -0.358643f, -9.210938f, -0.358643f, -6.613281f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -4.953125f, -2.052734f, -0.358643f, -3.146484f, -9.328125f, -0.649902f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -4.054688f, -5.128906f, -0.358643f, -8.476562f, -5.601562f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -3.156250f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -3.406250f, -0.358643f, -9.328125f, -1.005859f, -6.304688f, -7.046875f, -0.358643f, -0.953125f, -0.358643f, -0.358643f, -6.960938f, -6.980469f, -2.804688f, -0.358643f, -9.328125f, -0.358643f, -5.496094f, -9.328125f, -8.625000f, -0.358643f, -5.179688f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -9.062500f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -7.769531f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -4.242188f, -1.308594f, -0.358643f, -2.158203f, -0.358643f, -5.136719f, -0.358643f, -0.358643f, -4.601562f, -2.976562f, -0.358643f, -0.358643f, -6.769531f, -0.358643f, -0.358643f, -2.990234f, -4.875000f, -8.187500f, -0.358643f, -0.358643f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -3.441406f, -9.328125f, -0.358643f, -6.265625f, -8.890625f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.046875f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -0.825684f, -0.358643f, -9.328125f, -2.675781f, -0.358643f, -1.788086f, -7.410156f, -0.358643f, -9.328125f, -9.328125f, -6.550781f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -4.359375f, -0.358643f, -0.358643f, -5.406250f, -7.335938f, -0.358643f, -9.328125f, -1.004883f, -9.328125f, -0.358643f, -2.605469f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -9.328125f, -0.358643f, -0.358643f, -8.671875f, -0.358643f, -0.358643f, -3.078125f, -9.328125f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -6.472656f, -4.277344f, -0.358643f, -0.358643f, -1.126953f, -9.328125f, -9.328125f, -9.328125f, -0.358643f, -9.328125f, -0.407227f, -8.937500f, -9.250000f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -3.119141f, -2.636719f, -0.358643f, -4.757812f, -0.358643f, -0.868652f, -0.487061f, -1.577148f, -9.328125f, -9.328125f, -8.296875f, -0.358643f, -3.892578f, -0.358643f, -8.500000f, -1.601562f, -0.358643f, -0.358643f, -9.218750f, -0.551758f, -4.089844f, -5.433594f, -0.358643f, -3.564453f, -0.358643f, -9.328125f, -2.404297f, -2.839844f, -0.358643f, -0.358643f, -0.358643f, -4.042969f, -0.358643f, -4.636719f, -3.148438f, -0.358643f, -0.358643f, -9.328125f, -7.023438f, -0.358643f, -0.358643f, -8.835938f, -0.358643f, -9.109375f, -9.328125f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.267578f, -0.358643f, -9.328125f, -7.472656f, -1.515625f, -0.358643f, -0.358643f, -0.358643f, -9.328125f, -1.404297f, -0.706543f, -3.833984f, -2.656250f, -4.363281f, -0.358643f, -0.358643f, -2.529297f, -6.152344f, -7.238281f, -0.358643f, -9.328125f, -4.621094f, -0.358643f, -0.358643f, -9.328125f, -0.358643f, -8.593750f, -0.358643f, -6.347656f, -0.358643f, -9.328125f, -8.640625f, -9.328125f, -7.367188f, -0.358643f, -0.358643f, -0.358643f, -0.358643f, -1.551758f, -0.358643f, -3.759766f, -9.328125f }; + +#endif /* DATA_H_ */ diff --git a/tests/spatz_on_magia/onnx_clip/test_data/generator.py b/tests/spatz_on_magia/onnx_clip/test_data/generator.py new file mode 100644 index 00000000..4043b459 --- /dev/null +++ b/tests/spatz_on_magia/onnx_clip/test_data/generator.py @@ -0,0 +1,89 @@ +import os +import sys +import numpy as np +import onnx +import onnxruntime as ort +from onnx import helper, TensorProto + +def parse_args(): + if len(sys.argv) != 2: + print("Error: missing argument ") + print("Usage: python3 generator.py ") + sys.exit(1) + + try: + length = int(sys.argv[1]) + except ValueError: + print("Error: must be an integer") + print("Usage: python3 generator.py ") + sys.exit(1) + + return length + +def generate_data(length): + vals = (np.random.randn(2) * 5).astype(np.float16) + val_min = np.array([np.min(vals)], dtype=np.float16) + val_max = np.array([np.max(vals)], dtype=np.float16) + + a = (np.random.randn(length) * 10).astype(np.float16) + + return a, val_min, val_max + +def run_onnx_clip(input_vec, val_min, val_max): + a_info = helper.make_tensor_value_info('A', TensorProto.FLOAT16, input_vec.shape) + min_info = helper.make_tensor_value_info('Min', TensorProto.FLOAT16, val_min.shape) + max_info = helper.make_tensor_value_info('Max', TensorProto.FLOAT16, val_max.shape) + out_info = helper.make_tensor_value_info('Output', TensorProto.FLOAT16, input_vec.shape) + + node_def = helper.make_node('Clip', ['A', 'Min', 'Max'], ['Output']) + graph_def = helper.make_graph( + [node_def], + 'onnx-clip-test', + [a_info, min_info, max_info], + [out_info] + ) + + model_def = helper.make_model(graph_def, producer_name='onnx-generator') + sess = ort.InferenceSession(model_def.SerializeToString()) + res = sess.run(None, {'A': input_vec, 'Min': val_min, 'Max': val_max}) + + return res[0] + +def format_array(array): + return "{ " + ", ".join(f"{x:f}f" for x in array) + " }" + +def format_float(value): + """Convert a float value into a C-style representation.""" + return f"{value:f}" + +def generate_header_file(length, input_vec, min, max, expected, filename="data.h"): + + script_dir = os.path.dirname(os.path.abspath(__file__)) + filepath = os.path.join(script_dir, filename) + + with open(filepath, "w") as f: + f.write("/* Automatically generated header file for Spatz ONNX testing */\n") + f.write("#ifndef DATA_H_\n") + f.write("#define DATA_H_\n\n") + + f.write(f"#define LEN {length}\n\n") + + f.write(f"static const float16 input_vec[] = {format_array(input_vec)};\n") + f.write(f"static const float16 min_val = {format_float(min.item())};\n") + f.write(f"static const float16 max_val = {format_float(max.item())};\n") + f.write(f"static const float16 expected[] = {format_array(expected)};\n\n") + + f.write("#endif /* DATA_H_ */\n") + +def main(): + length = parse_args() + + input, min, max = generate_data(length) + expected = run_onnx_clip(input, min, max) + + generate_header_file(length, input, min, max, expected) + + print(f"File 'data.h' successfully generated with {length} elements.") + +if __name__ == "__main__": + main() From 29bff40259d32b58216277466937b7e53f6a025d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:33:54 +0100 Subject: [PATCH 42/67] [tests/spatz_on_magia] onnx_add: Refactor - use L1 for params --- tests/spatz_on_magia/onnx_add/main.c | 37 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 38d71066..8f48abda 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -10,12 +10,12 @@ #include "magia_tile_utils.h" #include "magia_spatz_utils.h" -volatile onnx_add_params_t *params; - -static void init_data() +static int init_data(void *params) { uint32_t offset; + volatile onnx_add_params_t *add_params; + add_params = (volatile onnx_add_params_t *) params; for (int i = 0; i < LEN; i++) { offset = i * sizeof(float16); @@ -25,12 +25,14 @@ static void init_data() mmio_fp16(RES_BASE + offset) = 0; } - params = (volatile onnx_add_params_t *) ONNX_ADD_PARAMS_BASE; - params->addr_a = SRC_A_BASE; - params->addr_b = SRC_B_BASE; - params->addr_res = RES_BASE; - params->addr_exp = EXP_BASE; - params->len = LEN; + + add_params->addr_a = SRC_A_BASE; + add_params->addr_b = SRC_B_BASE; + add_params->addr_res = RES_BASE; + add_params->addr_exp = EXP_BASE; + add_params->len = LEN; + + return 0; } static int run_spatz_task() @@ -52,17 +54,26 @@ static int run_spatz_task() return ret; } -static bool check_result() +static bool check_result(void *params) { - return vector_compare_fp16_bitwise(params->addr_res, params->addr_exp, params->len); + volatile onnx_add_params_t *add_params; + add_params = (volatile onnx_add_params_t *) params; + return vector_compare_fp16_bitwise(add_params->addr_res, add_params->addr_exp, add_params->len); } static bool run_test() { int ret; bool check; + volatile onnx_add_params_t *params; - init_data(); + params = (volatile onnx_add_params_t *) ONNX_ADD_PARAMS_BASE; + + ret = init_data(params); + if (ret != 0) { + printf("[CV32] Params initialization failed with error: %d\n", ret); + return ret; + } ret = run_spatz_task(); if (ret != 0) { @@ -70,7 +81,7 @@ static bool run_test() return ret; } - check = check_result(); + check = check_result(params); if (check) { printf("[CV32] Test SUCCESS\n"); } else { From d09fd3fbbdf753a0d4ddfc609b16186cd256c9fc Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:39:16 +0100 Subject: [PATCH 43/67] [tests/spatz_on_magia] onnx_div: Refactor - use L1 for params --- tests/spatz_on_magia/onnx_div/main.c | 36 ++++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index 79acb2c9..8c7a23c6 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -10,12 +10,12 @@ #include "magia_tile_utils.h" #include "magia_spatz_utils.h" -volatile onnx_div_params_t *params; - -static void init_data() +static int init_data(void *params) { uint32_t offset; + volatile onnx_div_params_t *div_params; + div_params = (volatile onnx_div_params_t *) params; for (int i = 0; i < LEN; i++) { offset = i * sizeof(float16); @@ -25,12 +25,13 @@ static void init_data() mmio_fp16(RES_BASE + offset) = 0; } - params = (volatile onnx_div_params_t *) ONNX_DIV_PARAMS_BASE; - params->addr_a = SRC_A_BASE; - params->addr_b = SRC_B_BASE; - params->addr_res = RES_BASE; - params->addr_exp = EXP_BASE; - params->len = LEN; + div_params->addr_a = SRC_A_BASE; + div_params->addr_b = SRC_B_BASE; + div_params->addr_res = RES_BASE; + div_params->addr_exp = EXP_BASE; + div_params->len = LEN; + + return 0; } static int run_spatz_task() @@ -52,17 +53,26 @@ static int run_spatz_task() return ret; } -static bool check_result() +static bool check_result(void *params) { - return vector_compare_fp16_bitwise(params->addr_res, params->addr_exp, params->len); + volatile onnx_div_params_t *div_params; + div_params = (volatile onnx_div_params_t *) params; + return vector_compare_fp16_bitwise(div_params->addr_res, div_params->addr_exp, div_params->len); } static bool run_test() { int ret; bool check; + volatile onnx_div_params_t *params; + + params = (volatile onnx_div_params_t *) ONNX_DIV_PARAMS_BASE; - init_data(); + ret = init_data(params); + if (ret != 0) { + printf("[CV32] Params initialization failed with error: %d\n", ret); + return ret; + } ret = run_spatz_task(); if (ret != 0) { @@ -70,7 +80,7 @@ static bool run_test() return ret; } - check = check_result(); + check = check_result(params); if (check) { printf("[CV32] Test SUCCESS\n"); } else { From d6a80fffafa39b4e4b7712a54c43c500cdd89ad4 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:50:39 +0100 Subject: [PATCH 44/67] [Makefile] Add rule to support gvsoc simulation for executables with spatz task --- Makefile | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Makefile b/Makefile index ee085158..4f23ce18 100644 --- a/Makefile +++ b/Makefile @@ -121,6 +121,22 @@ else $(error Only rtl and gvsoc are supported as platforms.) endif +run_with_spatz: set_mesh +ifndef test + $(error Proper formatting is: make run_with_spatz test= platform=) +endif +ifeq (,$(wildcard ./build/bin/$(test))) + $(error No test found with name: $(test)) +endif +ifndef platform + $(error Proper formatting is: make run_with_spatz test= platform=rtl|gvsoc) +endif +ifeq ($(platform), gvsoc) + $(GVSOC_DIR)/install/bin/gvrun --target magia_v2 --work-dir $(GVSOC_ABS_PATH)/Documents/test --param binary=$(BIN_ABS_PATH)/$(test) run --attr magia/n_tiles_x=$(tiles) --attr magia/n_tiles_y=$(tiles) --attr magia_v2/spatz_romfile=$(BIN_ABS_PATH)/bootrom/spatz_init.bin +else + $(error Only gvsoc is currently supported as emulation platform.) +endif + MAGIA: set_mesh ifeq ($(shell expr $(tiles_2) \> 256), 1) $(eval tiles_2=256) From 32285235b6f5802296e4f3e79d139544742f6231 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:29:35 +0100 Subject: [PATCH 45/67] WIP - [cmake] Refactor compilation flow for spatz and add support for RTL sim --- Makefile | 6 +++-- cmake/spatz_helpers.cmake | 36 ++++------------------------ targets/magia_v2/link.ld | 2 +- tests/spatz_on_magia/onnx_add/main.c | 1 + tests/spatz_on_magia/onnx_div/main.c | 3 +++ 5 files changed, 13 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index 4f23ce18..a6bc44dd 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ SHELL := /bin/bash BUILD_DIR ?= ../sw/tests/$(test) -MAGIA_DIR ?= ../ +MAGIA_DIR ?= ../MAGIA GVSOC_DIR ?= ./gvsoc CURR_DIR ?= $(shell pwd) GVSOC_ABS_PATH ?= $(CURR_DIR)/gvsoc @@ -133,8 +133,10 @@ ifndef platform endif ifeq ($(platform), gvsoc) $(GVSOC_DIR)/install/bin/gvrun --target magia_v2 --work-dir $(GVSOC_ABS_PATH)/Documents/test --param binary=$(BIN_ABS_PATH)/$(test) run --attr magia/n_tiles_x=$(tiles) --attr magia/n_tiles_y=$(tiles) --attr magia_v2/spatz_romfile=$(BIN_ABS_PATH)/bootrom/spatz_init.bin +else ifeq ($(platform), rtl) + $(MAKE) run test=$(test) platform=rtl else - $(error Only gvsoc is currently supported as emulation platform.) + $(error Only rtl and gvsoc are supported as platforms.) endif MAGIA: set_mesh diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index b0d8374c..65194eb0 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -12,9 +12,7 @@ # # 2. add_cv32_executable_with_spatz() # - Builds CV32 executable with embedded Spatz binary -# - Generates disassembly and simulation stimuli # - Outputs to: build/bin/ -# build/bin/spatz_on_magia//stim/ # ============================================================================ include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) @@ -176,7 +174,9 @@ function(add_spatz_task) DEPENDS ${TASK_HEADER} ${TASK_BIN} - ${TASK_DUMP} + ) + add_custom_target(${ARG_TEST_NAME}_spatz_dump + DEPENDS ${TASK_DUMP} ) # Export to parent scope @@ -190,7 +190,7 @@ function(add_spatz_task) endfunction() # Function: add_cv32_executable_with_spatz -# Builds CV32 executable with embedded Spatz task binary and generates disassembly/stimuli +# Builds CV32 executable with embedded Spatz task binary # Parameters: # TARGET_NAME (required): Executable name # SPATZ_HEADER (required): Path to Spatz task header file @@ -200,8 +200,6 @@ endfunction() # INCLUDE_DIRS: Additional include directories # Output locations: # Executable: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME} -# Disassembly: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.s -# Stimuli files: ${CMAKE_BINARY_DIR}/bin/spatz_on_magia/${TARGET_NAME}/stim/ function(add_cv32_executable_with_spatz) set(options) set(oneValueArgs TARGET_NAME SPATZ_HEADER LINK_SCRIPT CRT0_SRC) @@ -291,30 +289,4 @@ function(add_cv32_executable_with_spatz) add_dependencies(${ARG_TARGET_NAME} ${EXTRACTED_TEST_NAME}_spatz_header) endif() - # Post-build: disassembly and stimuli [MAGIA/Makefile: $(STIM_INSTR) $(STIM_DATA)] - set(STIM_DIR "${CMAKE_BINARY_DIR}/bin/spatz_on_magia/${ARG_TARGET_NAME}/stim/") - set(ELF_DUMP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${ARG_TARGET_NAME}.s") - set(ELF_OBJDUMP "${STIM_DIR}${ARG_TARGET_NAME}.objdump") - set(ELF_ITB "${STIM_DIR}${ARG_TARGET_NAME}.itb") - set(ELF_S19 "${STIM_DIR}${ARG_TARGET_NAME}.s19") - set(ELF_TXT "${STIM_DIR}${ARG_TARGET_NAME}.txt") - set(STIM_INSTR "${STIM_DIR}${ARG_TARGET_NAME}_stim_instr.txt") - set(STIM_DATA "${STIM_DIR}${ARG_TARGET_NAME}_stim_data.txt") - file(MAKE_DIRECTORY "${STIM_DIR}") - - add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD - COMMAND ${CMAKE_OBJDUMP} -D -S $ > ${ELF_DUMP} - COMMAND ${CMAKE_OBJDUMP} -h -S $ > ${ELF_OBJDUMP} - COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/objdump2itb.py ${ELF_OBJDUMP} > ${ELF_ITB} - COMMENT "[CV32] Generating disassembly and ITB for ${ARG_TARGET_NAME}" - VERBATIM - ) - - add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD - COMMAND ${CMAKE_OBJCOPY} --srec-len 1 --output-target=srec $ ${ELF_S19} - COMMAND perl ${CMAKE_SOURCE_DIR}/scripts/parse_s19.pl ${ELF_S19} > ${ELF_TXT} - COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/s19tomem.py ${ELF_TXT} ${STIM_INSTR} ${STIM_DATA} - COMMENT "[CV32] Generating stimuli for ${ARG_TARGET_NAME}" - VERBATIM - ) endfunction() diff --git a/targets/magia_v2/link.ld b/targets/magia_v2/link.ld index 77ba5ed5..bc276504 100644 --- a/targets/magia_v2/link.ld +++ b/targets/magia_v2/link.ld @@ -21,7 +21,7 @@ __DYNAMIC = 0; MEMORY { instrram : ORIGIN = 0xcc000000, LENGTH = 0x8000 - dataram : ORIGIN = 0xcc100000, LENGTH = 0xF00000 + dataram : ORIGIN = 0xcc010000, LENGTH = 0xF00000 // TODOs: fix this stack : ORIGIN = 0x00010000, LENGTH = 0xC000 } diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 8f48abda..4286621c 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -43,6 +43,7 @@ static int run_spatz_task() eu_enable_events(EU_SPATZ_DONE_MASK); spatz_init(SPATZ_BINARY_START); + printf("[CV32] Random print just to slow down CV32 between Spatz init and run\n"); // TODOs: remove me spatz_run_task_with_params(ONNX_ADD_TASK, ONNX_ADD_PARAMS_BASE); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index 8c7a23c6..2f459880 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -41,7 +41,10 @@ static int run_spatz_task() eu_init(); eu_enable_events(EU_SPATZ_DONE_MASK); + + spatz_init(SPATZ_BINARY_START); + printf("[CV32] Random print just to slow down CV32 between Spatz init and run\n"); // TODOs: remove me spatz_run_task_with_params(ONNX_DIV_TASK, ONNX_DIV_PARAMS_BASE); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); From 9b6704c09d393fe8bc3304adb75422c9a430ecd2 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:46:53 +0100 Subject: [PATCH 46/67] [targets/magia_v2] compare_utils.h: Introduce tollerance in comparison --- targets/magia_v2/include/utils/compare_utils.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/targets/magia_v2/include/utils/compare_utils.h b/targets/magia_v2/include/utils/compare_utils.h index d1c0d26f..983815df 100644 --- a/targets/magia_v2/include/utils/compare_utils.h +++ b/targets/magia_v2/include/utils/compare_utils.h @@ -7,9 +7,12 @@ #include "magia_tile_utils.h" #include "printf_wrapper.h" +#define TOLL 0x0011 + static inline bool vector_compare_fp16_bitwise(uintptr_t addr_res, uintptr_t addr_exp, int len) { volatile uint16_t val_exp; volatile uint16_t val_res; + volatile uint16_t abs_diff; uint32_t offset; bool ret; @@ -19,9 +22,10 @@ static inline bool vector_compare_fp16_bitwise(uintptr_t addr_res, uintptr_t add val_exp = mmio16(addr_exp + offset); val_res = mmio16(addr_res + offset); + abs_diff = (val_exp > val_res) ? (val_exp - val_res) : (val_res - val_exp); - if (val_exp != val_res) { - printf("Mismatch at index %d - expected raw: 0x%04x - computed raw: 0x%04x\n", i, val_exp, val_res); + if (abs_diff > TOLL) { + printf("Mismatch at index %d - expected raw: 0x%04x - computed raw: 0x%04x - abs_diff: 0x%04x\n", i, val_exp, val_res, abs_diff); ret = false; } } From 22c8c2c38ab9970747d36f967b27dbc1de4d80f9 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:48:25 +0100 Subject: [PATCH 47/67] [Makefile] finalize refactor compilation flow for spatz and add support for RTL sim --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a6bc44dd..1b951323 100644 --- a/Makefile +++ b/Makefile @@ -20,8 +20,8 @@ SHELL := /bin/bash -BUILD_DIR ?= ../sw/tests/$(test) MAGIA_DIR ?= ../MAGIA +BUILD_DIR ?= $(MAGIA_DIR)/sw/tests/$(test) GVSOC_DIR ?= ./gvsoc CURR_DIR ?= $(shell pwd) GVSOC_ABS_PATH ?= $(CURR_DIR)/gvsoc @@ -110,8 +110,8 @@ else ifeq ($(platform), rtl) scripts/parse_s19.pl $(BIN).s19 > $(BIN).txt python3 scripts/s19tomem.py $(BIN).txt $(BUILD_DIR)/build/stim_instr.txt $(BUILD_DIR)/build/stim_data.txt cd $(BUILD_DIR) && \ - cp -sf ../../../sim/modelsim.ini modelsim.ini && \ - ln -sfn ../../../sim/work work + cp -sf "$(MAGIA_DIR)/sim/modelsim.ini" modelsim.ini && \ + ln -sfn "$(MAGIA_DIR)/sim/work" work riscv32-unknown-elf-objdump -d -S -Mmarch=$(ISA) $(BIN) > $(BIN).dump riscv32-unknown-elf-objdump -d -l -s -Mmarch=$(ISA) $(BIN) > $(BIN).objdump python3 scripts/objdump2itb.py $(BIN).objdump > $(BIN).itb From a792fe38735f0854d616bfabd53a75ad2113add1 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:49:42 +0100 Subject: [PATCH 48/67] [scripts] parse_s19.pl: Add execution permission --- scripts/parse_s19.pl | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/parse_s19.pl diff --git a/scripts/parse_s19.pl b/scripts/parse_s19.pl old mode 100644 new mode 100755 From a283f0e7a1f3cfe577818d8d12c609651ef3bbb5 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Thu, 26 Feb 2026 14:04:06 +0100 Subject: [PATCH 49/67] [cmake] spatz_helper.cmake: re-introduce disassembly generation --- cmake/spatz_helpers.cmake | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 65194eb0..450ced6a 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -12,6 +12,7 @@ # # 2. add_cv32_executable_with_spatz() # - Builds CV32 executable with embedded Spatz binary +# - Generates disassembly # - Outputs to: build/bin/ # ============================================================================ @@ -174,9 +175,7 @@ function(add_spatz_task) DEPENDS ${TASK_HEADER} ${TASK_BIN} - ) - add_custom_target(${ARG_TEST_NAME}_spatz_dump - DEPENDS ${TASK_DUMP} + ${TASK_DUMP} ) # Export to parent scope @@ -190,7 +189,7 @@ function(add_spatz_task) endfunction() # Function: add_cv32_executable_with_spatz -# Builds CV32 executable with embedded Spatz task binary +# Builds CV32 executable with embedded Spatz task binary and generates disassembly # Parameters: # TARGET_NAME (required): Executable name # SPATZ_HEADER (required): Path to Spatz task header file @@ -200,6 +199,7 @@ endfunction() # INCLUDE_DIRS: Additional include directories # Output locations: # Executable: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME} +# Disassembly: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.s function(add_cv32_executable_with_spatz) set(options) set(oneValueArgs TARGET_NAME SPATZ_HEADER LINK_SCRIPT CRT0_SRC) @@ -289,4 +289,10 @@ function(add_cv32_executable_with_spatz) add_dependencies(${ARG_TARGET_NAME} ${EXTRACTED_TEST_NAME}_spatz_header) endif() + set(ELF_DUMP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${ARG_TARGET_NAME}.s") + add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_OBJDUMP} -D -S $ > ${ELF_DUMP} + VERBATIM + ) + endfunction() From cabfa879be43783c966310aa2982e3be2328be11 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:20:50 +0100 Subject: [PATCH 50/67] [Makefile] Add rule to download and build spatz llvm --- .gitignore | 1 + Makefile | 35 ++++++++++++++++++++++++++++++++++- cmake/spatz_config.cmake | 8 ++++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e2c52ea3..7e7f3b27 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ testsuite.py test.conf testsuite* testlogs/ +llvm/ diff --git a/Makefile b/Makefile index 1b951323..d9fff41d 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,14 @@ gui ?= 0 tiles ?= 2 spatz_tests ?= 1 +LLVM_CMAKE ?= cmake +LLVM_DIR ?= llvm +LLVM_REPO ?= git@github.com:pulp-platform/llvm-project.git +LLVM_COMMIT ?= b494f2d8dde88723026db8ec16ac6c7ee1e140ca +LLVM_INSTALL_DIR ?= $(CURR_DIR)/llvm/install +LLVM_BUILD_DIR ?= $(LLVM_DIR)/llvm-project/build +LLVM_JOBS ?= 8 + tiles_2 := $(shell echo $$(( $(tiles) * $(tiles) ))) tiles_log := $(shell awk 'BEGIN { printf "%.0f", log($(tiles_2))/log(2) }') tiles_log_real := $(shell awk 'BEGIN { printf "%.0f", log($(tiles))/log(2) }') @@ -80,7 +88,7 @@ ifeq ($(compiler), GCC_MULTILIB) sed -i -E 's/^#add_subdirectory\(flatatt\)/add_subdirectory\(flatatt\)/' ./tests/magia/mesh/CMakeLists.txt sed -i -E 's/^\/\/#include "utils\/attention_utils.h"/#include "utils\/attention_utils.h"/' ./targets/$(target_platform)/include/tile.h endif - cmake -DTARGET_PLATFORM=$(target_platform) -DEVAL=$(eval) -DSTALLING=$(stalling) -DFSYNC_MM=$(fsync_mm) -DIDMA_MM=$(idma_mm) -DREDMULE_MM=$(redmule_mm) -DCOMPILER=$(compiler) -DPROFILE_CMP=$(profile_cmp) -DPROFILE_CMI=$(profile_cmi) -DPROFILE_CMO=$(profile_cmo) -DPROFILE_SNC=$(profile_snc) -DSPATZ_TESTS=$(spatz_tests) -B build --trace-expand + cmake -DTARGET_PLATFORM=$(target_platform) -DEVAL=$(eval) -DSTALLING=$(stalling) -DFSYNC_MM=$(fsync_mm) -DIDMA_MM=$(idma_mm) -DREDMULE_MM=$(redmule_mm) -DCOMPILER=$(compiler) -DPROFILE_CMP=$(profile_cmp) -DPROFILE_CMI=$(profile_cmi) -DPROFILE_CMO=$(profile_cmo) -DPROFILE_SNC=$(profile_snc) -DSPATZ_TESTS=$(spatz_tests) -DSPATZ_LLVM_PATH=$(LLVM_INSTALL_DIR) -B build --trace-expand cmake --build build --verbose set_mesh: @@ -193,3 +201,28 @@ gvsoc_init: git checkout lz/magia-v2-core && \ cd ../pulp && \ git checkout lz/magia-v2-pulp + +llvm: + mkdir -p $(LLVM_DIR) + if [ ! -d "$(LLVM_DIR)/llvm-project/.git" ]; then \ + cd $(LLVM_DIR) && git clone $(LLVM_REPO); \ + fi + cd $(LLVM_DIR)/llvm-project && \ + git checkout $(LLVM_COMMIT) && \ + git submodule update --init --recursive --jobs=$(LLVM_JOBS) . + mkdir -p $(LLVM_INSTALL_DIR) + cd $(LLVM_DIR)/llvm-project && mkdir -p build && cd build && \ + $(LLVM_CMAKE) \ + -DCMAKE_INSTALL_PREFIX=$(LLVM_INSTALL_DIR) \ + -DCMAKE_CXX_COMPILER=${CXX} \ + -DCMAKE_C_COMPILER=${CC} \ + -DLLVM_OPTIMIZED_TABLEGEN=True \ + -DLLVM_ENABLE_PROJECTS="clang;lld" \ + -DLLVM_TARGETS_TO_BUILD="RISCV" \ + -DLLVM_DEFAULT_TARGET_TRIPLE=riscv32-unknown-elf \ + -DLLVM_ENABLE_LLD=False \ + -DLLVM_APPEND_VC_REV=ON \ + -DCMAKE_BUILD_TYPE=Release \ + ../llvm && \ + make -j$(LLVM_JOBS) all && \ + make install diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index f82a4702..1ea3d787 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -1,11 +1,11 @@ # Spatz task global config -set(SPATZ_LLVM_PATH "/opt/riscv/spatz-14-llvm" CACHE PATH "Path to Spatz LLVM installation") # Toolchain paths [MAGIA/spatz/sw/Makefile] -find_program(SPATZ_CLANG clang PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) -find_program(SPATZ_OBJCOPY llvm-objcopy PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) -find_program(SPATZ_OBJDUMP llvm-objdump PATHS "${SPATZ_LLVM_PATH}/bin" REQUIRED) +set(SPATZ_LLVM_PATH "${CMAKE_SOURCE_DIR}/../llvm/install" CACHE PATH "Path to Spatz LLVM installation") +set(SPATZ_CLANG "${SPATZ_LLVM_PATH}/bin/clang" CACHE PATHS "a") +set(SPATZ_OBJCOPY "${SPATZ_LLVM_PATH}/bin/llvm-objcopy" CACHE PATHS "b") +set(SPATZ_OBJDUMP "${SPATZ_LLVM_PATH}/bin/llvm-objdump" CACHE PATHS "c") # Spatz configuration options [MAGIA/Makefile] set(SPATZ_RVD 0 CACHE INT "0: 32-bit TCDM w/ ELEN=32, 1: 64-bit TCDM w/ ELEN=64") From 6e56ea1f0356e45376a5c58c9fe9b1b2301767f7 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:36:49 +0100 Subject: [PATCH 51/67] [targets/magia_v2] spatz: Align SDK with recent RTL changes to fix Spatz boot race condition --- .../include/utils/magia_spatz_utils.h | 11 +++---- targets/magia_v2/spatz/bootrom/spatz_init.S | 6 ++-- targets/magia_v2/spatz/src/spatz_crt0.S | 29 ++++++++++++++----- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/targets/magia_v2/include/utils/magia_spatz_utils.h b/targets/magia_v2/include/utils/magia_spatz_utils.h index 9590a0c8..c30f7afb 100644 --- a/targets/magia_v2/include/utils/magia_spatz_utils.h +++ b/targets/magia_v2/include/utils/magia_spatz_utils.h @@ -26,11 +26,12 @@ #include "addr_map/tile_addr_map.h" #define SPATZ_CLK_EN (SPATZ_CTRL_BASE + 0x00) -#define SPATZ_START (SPATZ_CTRL_BASE + 0x04) -#define SPATZ_TASKBIN (SPATZ_CTRL_BASE + 0x08) -#define SPATZ_DATA (SPATZ_CTRL_BASE + 0x0C) -#define SPATZ_RETURN (SPATZ_CTRL_BASE + 0x10) -#define SPATZ_DONE (SPATZ_CTRL_BASE + 0x14) +#define SPATZ_READY (SPATZ_CTRL_BASE + 0x04) +#define SPATZ_START (SPATZ_CTRL_BASE + 0x08) +#define SPATZ_TASKBIN (SPATZ_CTRL_BASE + 0x0C) +#define SPATZ_DATA (SPATZ_CTRL_BASE + 0x10) +#define SPATZ_RETURN (SPATZ_CTRL_BASE + 0x14) +#define SPATZ_DONE (SPATZ_CTRL_BASE + 0x18) static inline void spatz_clk_en(void) { mmio32(SPATZ_CLK_EN) = 1; diff --git a/targets/magia_v2/spatz/bootrom/spatz_init.S b/targets/magia_v2/spatz/bootrom/spatz_init.S index 43f5e9c3..9b7b11c9 100644 --- a/targets/magia_v2/spatz/bootrom/spatz_init.S +++ b/targets/magia_v2/spatz/bootrom/spatz_init.S @@ -18,17 +18,17 @@ * Authors: Luca Balboni * * All initialization (stack, regs, vector, BSS) done in spatz_crt0.S - * Minimal Boot ROM - only read FUNC_PTR and jump + * Minimal Boot ROM - only read TASKBIN_ADDR and jump */ -#define TASKBIN_ADDR 0x00001708 // OBI slave ctrl exchange register +#define TASKBIN_ADDR 0x0000170C // OBI slave ctrl exchange register .section .text.bootrom .global _start .option norvc _start: - // Read dispatcher loop address from TASKBIN_REG (set by CV32) + // Read dispatcher loop address from TASKBIN_ADDR (set by CV32) li t0, TASKBIN_ADDR lw t1, 0(t0) diff --git a/targets/magia_v2/spatz/src/spatz_crt0.S b/targets/magia_v2/spatz/src/spatz_crt0.S index 49bb7566..72bf2896 100644 --- a/targets/magia_v2/spatz/src/spatz_crt0.S +++ b/targets/magia_v2/spatz/src/spatz_crt0.S @@ -21,11 +21,12 @@ * */ -#define START_ADDR 0x00001704 -#define TASKBIN_ADDR 0x00001708 -#define DATA_ADDR 0x0000170C -#define RETURN_ADDR 0x00001710 -#define DONE_ADDR 0x00001714 +#define READY_ADDR 0x00001704 +#define START_ADDR 0x00001708 +#define TASKBIN_ADDR 0x0000170C +#define DATA_ADDR 0x00001710 +#define RETURN_ADDR 0x00001714 +#define DONE_ADDR 0x00001718 #define MSTATUS_VS 0x200 // Vector Status [9:8] = 01 #define MSTATUS_MIE 0x8 // Machine Interrupt Enable #define MIE_MEIE 0x800 // External interrupt enable @@ -94,7 +95,19 @@ _start: li t0, MSTATUS_MIE csrs mstatus, t0 - /* Fall through to dispatcher loop */ + /* Signal ready to CV32 - now ready to receive interrupts */ + li t0, READY_ADDR + li t1, 1 + sw t1, 0(t0) + + /* First WFI - after this we deassert READY */ + wfi + + /* Deassert READY after first wakeup (only once) */ + li t0, READY_ADDR + sw zero, 0(t0) + + /* Fall through to main dispatcher loop */ dispatcher_loop: /* Wait for interrupt from CV32 */ @@ -109,7 +122,7 @@ _trap_handler: csrr t0, mcause bltz t0, _handle_interrupt // mcause[31]=1 → interrupt - /* EXCEPTION: Write error code to EXCHANGE_REG, signal DONE, halt */ + /* EXCEPTION: Write error code to RETURN_ADDR, signal DONE, halt */ _handle_exception: csrr t1, mcause // Read full mcause andi t1, t1, 0xFF // Extract exception code [7:0] @@ -131,7 +144,7 @@ _handle_interrupt: li t1, 11 bne t0, t1, _trap_ret - /* Read task address from EXCHANGE_REG and save it in t1 */ + /* Read task address from TASKBIN_ADDR and save it in t1 */ li t0, TASKBIN_ADDR lw t1, 0(t0) beqz t1, _trap_ret From 7de237c904411cee8436a0f9f68c2432b18b2c2a Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:49:30 +0100 Subject: [PATCH 52/67] [targets/magia_v2] link.ld: Fix broken comment --- targets/magia_v2/link.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/magia_v2/link.ld b/targets/magia_v2/link.ld index bc276504..b844e801 100644 --- a/targets/magia_v2/link.ld +++ b/targets/magia_v2/link.ld @@ -21,7 +21,7 @@ __DYNAMIC = 0; MEMORY { instrram : ORIGIN = 0xcc000000, LENGTH = 0x8000 - dataram : ORIGIN = 0xcc010000, LENGTH = 0xF00000 // TODOs: fix this + dataram : ORIGIN = 0xcc010000, LENGTH = 0xF00000 /* TODOs: restore ORIGIN addr to 0xcc100000 when RTL will be aligned */ stack : ORIGIN = 0x00010000, LENGTH = 0xC000 } From dc5990c848c714cea7cf4cd353dccd1a525ae54b Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 09:13:18 +0100 Subject: [PATCH 53/67] [targets/magia_v2] spatz: Align also magia_spat_utils.h SDK with recent RTL changes to fix Spatz boot race condition --- targets/magia_v2/include/utils/magia_spatz_utils.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/targets/magia_v2/include/utils/magia_spatz_utils.h b/targets/magia_v2/include/utils/magia_spatz_utils.h index c30f7afb..e9e8926c 100644 --- a/targets/magia_v2/include/utils/magia_spatz_utils.h +++ b/targets/magia_v2/include/utils/magia_spatz_utils.h @@ -79,6 +79,9 @@ static inline void spatz_run_task_with_params(uint32_t spatz_task_addr, uint32_t static inline void spatz_init(uint32_t spatz_start_addr) { spatz_set_func(spatz_start_addr); spatz_clk_en(); + while (mmio32(SPATZ_READY) == 0){ + printf("Waiting for Spatz to be ready...\n"); + }; } #endif From 09b40848552d7ecefca2bf2f1768770b349aa229 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 09:18:49 +0100 Subject: [PATCH 54/67] [tests/spatz_on_magia] Removes unnecessary prints --- targets/magia_v2/include/utils/magia_spatz_utils.h | 2 +- tests/spatz_on_magia/onnx_add/main.c | 1 - tests/spatz_on_magia/onnx_div/main.c | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/targets/magia_v2/include/utils/magia_spatz_utils.h b/targets/magia_v2/include/utils/magia_spatz_utils.h index e9e8926c..03638bd9 100644 --- a/targets/magia_v2/include/utils/magia_spatz_utils.h +++ b/targets/magia_v2/include/utils/magia_spatz_utils.h @@ -80,7 +80,7 @@ static inline void spatz_init(uint32_t spatz_start_addr) { spatz_set_func(spatz_start_addr); spatz_clk_en(); while (mmio32(SPATZ_READY) == 0){ - printf("Waiting for Spatz to be ready...\n"); + printf("[CV32] Waiting for Spatz to be ready...\n"); }; } diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 4286621c..8f48abda 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -43,7 +43,6 @@ static int run_spatz_task() eu_enable_events(EU_SPATZ_DONE_MASK); spatz_init(SPATZ_BINARY_START); - printf("[CV32] Random print just to slow down CV32 between Spatz init and run\n"); // TODOs: remove me spatz_run_task_with_params(ONNX_ADD_TASK, ONNX_ADD_PARAMS_BASE); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index 2f459880..8c7a23c6 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -41,10 +41,7 @@ static int run_spatz_task() eu_init(); eu_enable_events(EU_SPATZ_DONE_MASK); - - spatz_init(SPATZ_BINARY_START); - printf("[CV32] Random print just to slow down CV32 between Spatz init and run\n"); // TODOs: remove me spatz_run_task_with_params(ONNX_DIV_TASK, ONNX_DIV_PARAMS_BASE); eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); From 57e730b1523211e047c71b58a4f80bb72353e189 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 27 Feb 2026 12:17:38 +0100 Subject: [PATCH 55/67] Update README with spatz integration info --- README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0ff77d26..73956348 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ The following *optional* parameters can be specified when running the make comma `profile_cmp|cmi|cmo|snc`: **0**|**1** (**Default**: 0). Activates the profiling utilities for computing|comunication(input line)|comunication(output line)|synchronization +`spatz_tests`: **0**|**1** (**Default**: 1). Enable compilation of tests with Spatz task (along with default mesh tests) + 0. In case you are using this SDK as non-submodule: Clone the [MAGIA](https://github.com/pulp-platform/MAGIA/tree/main) repository: `git clone git@github.com:pulp-platform/MAGIA.git` @@ -51,9 +53,9 @@ The following *optional* parameters can be specified when running the make comma 1. Initialize the GVSoC submodule: `make gvsoc_init` - + 2. Build the Magia architecture (*this command may take time and return an error, please be patient.*): - + `make MAGIA ` And/Or the GVSoC module: @@ -90,7 +92,7 @@ The following *optional* parameters can be specified when running the make comma `make run test= ` -***WARNING: YOU HAVE TO REBUILD BOTH RTL/GVSOC AND THE TEST BINARY EACH TIME YOU WANT TO TEST A MAGIA MESH WITH A DIFFERENT NUMBER OF TILES.*** +***WARNING: YOU HAVE TO REBUILD BOTH RTL/GVSOC AND THE TEST BINARY EACH TIME YOU WANT TO TEST A MAGIA MESH WITH A DIFFERENT NUMBER OF TILES.*** If you want to run gvsoc or a binary from outside the magia-sdk directory you can edit the **GVSOC_ABS_PATH** and **BIN_ABS_PATH** option in Makefile or directly on the *run* command line. @@ -122,7 +124,7 @@ To add your own test, you have to integrate a new test folder inside the **tests 4. Add to the *\* directory: 1. A new CMakeList.txt file following this template: - + set(TEST_NAME ) file(GLOB_RECURSE TEST_SRCS @@ -142,11 +144,81 @@ To add your own test, you have to integrate a new test folder inside the **tests TARGET ${TEST_NAME} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -dhS -Mmarch=${ISA} $ > $.s) - + 2. An **src** directory containing your test's source (.c) files 3. An **include** directory containing your test's header (.h) files +## Spatz integration in MAGIA + +This SDK provides a flow to compile C code for the Spatz vector accelerator, embed the resulting binary into the main CV32 executable, and manage the execution. This allows the main RISC-V core (CV32) to offload tasks to the Spatz accelerator. + +Examples using this flow are available in the `tests/spatz_on_magia/` directory. Each test sub-folder contains a `main.c` for the CV32 host and a `spatz_task/` directory with the source code for the Spatz accelerator. + +For more informations about hardware integration, configuration parameters, control interface, programming APIs and execution flow please refer to the [MAGIA-Spatz README](https://github.com/pulp-platform/MAGIA/tree/lb/magia-spatz/spatz) + +### Prerequisites + +The compilation flow requires a dedicated Spatz LLVM toolchain. +You can install it automatically by running the following command from the SDK root: + +```sh +make llvm +``` +This will clone the required repository and build the toolchain in the `llvm/install` directory. Alternatively, if you have a pre-built toolchain, you can specify its location by passing the `LLVM_INSTALL_DIR` variable to the make command: +```sh +make build LLVM_INSTALL_DIR=/path/to/your/llvm/install +``` + +### Compilation Flow + +The compilation process is managed by two CMake functions defined in `cmake/spatz_helpers.cmake`: `add_spatz_task` and `add_cv32_executable_with_spatz`. + +#### 1. `add_spatz_task` +This function compiles the C code for the Spatz accelerator and prepares it for embedding. + +* **What it does**: + 1. Compiles the Spatz source code into an ELF binary using a dedicated `clang` compiler from the Spatz LLVM toolchain. + 2. Converts the ELF file into a raw binary format (`.bin`). + 3. Uses the `scripts/bin2header.py` script to transform the raw binary into a C header file. This header contains a `uint32_t` array holding the machine code of the Spatz task. This array is placed in a special linker section named `.spatz_binary`. + 4. Runs the `scripts/extract_task_symbols.sh` script to append additional information to the header. This script inspects the Spatz ELF file and extracts the addresses of key symbols, defining them as macros. These symbols include: + * `SPATZ_BINARY_START`: The starting memory address where the Spatz binary will be loaded. This is resolved by the CV32 linker. + * `SPATZ_DISPATCHER_LOOP`: The entry point for the Spatz control loop. + * Task function addresses (e.g., `MY_TASK`): Entry points for specific functions within the Spatz code that can be called from the CV32 host. + +#### 2. `add_cv32_executable_with_spatz` +This function compiles the main application for the CV32 core and embeds the Spatz binary within it. + +* **What it does**: + 1. Compiles the C source code for the CV32 processor. + 2. Includes the header file generated by `add_spatz_task`. By including this header, the Spatz binary (as a C array) becomes part of the CV32 application's source. + 3. Links the compiled CV32 code with the Spatz binary data. The main linker script (`targets/magia_v2/link.ld`) ensures that the `.spatz_binary` section is placed at the correct memory address. + +### Example Usage +To use this flow, you need to call the two functions in your `CMakeLists.txt`. The convention is to have separate sources for the host (CV32) and the accelerator (Spatz). + +Here is an example from `tests/spatz_on_magia/hello_spatz/CMakeLists.txt`: +```cmake +set(TEST_NAME hello_spatz) + +# Step 1: Compile the Spatz task and generate the C header +add_spatz_task( + TEST_NAME ${TEST_NAME} + TASK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c + FIRST_TASK_NAME hello_task +) + +# Step 2: Compile the CV32 executable and embed the Spatz binary +add_cv32_executable_with_spatz( + TARGET_NAME ${TEST_NAME} + SPATZ_HEADER ${SPATZ_HEADER} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c +) +``` + +### Run Tests +To run test a special Makefile rule can be used: `make run_with_spatz test= platform=`. + ## Folder Structure ### README.md @@ -171,7 +243,7 @@ Contains the weak definitions of this SDK APIs. These are the API instruction th Contains the architecture-specific implementation and source code for the HAL APIs. Despite each implementation having different names, thanks to an aliasing system the programmer can use the same name for the same API instruction on different architectures. ### devices -Nothing there. +Nothing there. If MAGIA ever evolves to have a host-offload mechanism, this folder will contain the trampoline functions. @@ -180,4 +252,3 @@ Contains utility files for *cmake* automatic compilation. ### gvsoc A submodule containing the Germain Virtual System on Chip, built to simulate MAGIA (and other PULP-related platforms). - From ead118e21d380da957cc32f91d61188580441e20 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 3 Mar 2026 11:00:21 +0100 Subject: [PATCH 56/67] Makefile: Revert changes to MAGIA_DIR and BUILD_DIR and add a custom command to run RTL simulations for MAGIA-Spatz tests --- Makefile | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d9fff41d..19c9e029 100644 --- a/Makefile +++ b/Makefile @@ -20,8 +20,10 @@ SHELL := /bin/bash -MAGIA_DIR ?= ../MAGIA -BUILD_DIR ?= $(MAGIA_DIR)/sw/tests/$(test) +BUILD_DIR ?= ../sw/tests/$(test) +MAGIA_DIR ?= ../ +MAGIA_DIR_ABS ?= $(abspath $(MAGIA_DIR)) +BUILD_DIR_ABS ?= $(MAGIA_DIR_ABS)/sw/tests/$(test) GVSOC_DIR ?= ./gvsoc CURR_DIR ?= $(shell pwd) GVSOC_ABS_PATH ?= $(CURR_DIR)/gvsoc @@ -118,8 +120,8 @@ else ifeq ($(platform), rtl) scripts/parse_s19.pl $(BIN).s19 > $(BIN).txt python3 scripts/s19tomem.py $(BIN).txt $(BUILD_DIR)/build/stim_instr.txt $(BUILD_DIR)/build/stim_data.txt cd $(BUILD_DIR) && \ - cp -sf "$(MAGIA_DIR)/sim/modelsim.ini" modelsim.ini && \ - ln -sfn "$(MAGIA_DIR)/sim/work" work + cp -sf ../../../sim/modelsim.ini modelsim.ini && \ + ln -sfn ../../../sim/work work riscv32-unknown-elf-objdump -d -S -Mmarch=$(ISA) $(BIN) > $(BIN).dump riscv32-unknown-elf-objdump -d -l -s -Mmarch=$(ISA) $(BIN) > $(BIN).objdump python3 scripts/objdump2itb.py $(BIN).objdump > $(BIN).itb @@ -142,7 +144,19 @@ endif ifeq ($(platform), gvsoc) $(GVSOC_DIR)/install/bin/gvrun --target magia_v2 --work-dir $(GVSOC_ABS_PATH)/Documents/test --param binary=$(BIN_ABS_PATH)/$(test) run --attr magia/n_tiles_x=$(tiles) --attr magia/n_tiles_y=$(tiles) --attr magia_v2/spatz_romfile=$(BIN_ABS_PATH)/bootrom/spatz_init.bin else ifeq ($(platform), rtl) - $(MAKE) run test=$(test) platform=rtl + mkdir -p $(BUILD_DIR_ABS) && cd $(BUILD_DIR_ABS) && mkdir -p build + cp ./build/bin/$(test) $(BUILD_DIR_ABS)/build/verif + objcopy --srec-len 1 --output-target=srec $(BUILD_DIR_ABS)/build/verif $(BUILD_DIR_ABS)/build/verif.s19 + scripts/parse_s19.pl $(BUILD_DIR_ABS)/build/verif.s19 > $(BUILD_DIR_ABS)/build/verif.txt + python3 scripts/s19tomem.py $(BUILD_DIR_ABS)/build/verif.txt $(BUILD_DIR_ABS)/build/stim_instr.txt $(BUILD_DIR_ABS)/build/stim_data.txt + cd $(BUILD_DIR_ABS) && \ + cp -sf "$(MAGIA_DIR_ABS)/sim/modelsim.ini" modelsim.ini && \ + ln -sfn "$(MAGIA_DIR_ABS)/sim/work" work + riscv32-unknown-elf-objdump -d -S -Mmarch=$(ISA) $(BUILD_DIR_ABS)/build/verif > $(BUILD_DIR_ABS)/build/verif.dump + riscv32-unknown-elf-objdump -d -l -s -Mmarch=$(ISA) $(BUILD_DIR_ABS)/build/verif > $(BUILD_DIR_ABS)/build/verif.objdump + python3 scripts/objdump2itb.py $(BUILD_DIR_ABS)/build/verif.objdump > $(BUILD_DIR_ABS)/build/verif.itb + cd $(MAGIA_DIR_ABS) && \ + make run test=$(test) gui=$(gui) mesh_dv=$(mesh_dv) else $(error Only rtl and gvsoc are supported as platforms.) endif From f635d53d23dead612be05cced348c40661b3a9a2 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 3 Mar 2026 11:02:19 +0100 Subject: [PATCH 57/67] README: Added warning regarding potential inaccuracies in the MAGIA-Spatz README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 73956348..05a3c86a 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,8 @@ Examples using this flow are available in the `tests/spatz_on_magia/` directory. For more informations about hardware integration, configuration parameters, control interface, programming APIs and execution flow please refer to the [MAGIA-Spatz README](https://github.com/pulp-platform/MAGIA/tree/lb/magia-spatz/spatz) +> **Warning:** The external README linked above is tailored for baremetal hardware development. Some information may overlap or contain minor inaccuracies regarding the specific abstractions and automation provided by this SDK. + ### Prerequisites The compilation flow requires a dedicated Spatz LLVM toolchain. From 550f19415b7e7f1f65d4610a99b29def3754da97 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:56:27 +0100 Subject: [PATCH 58/67] [targets/magia_v2] utils: replace tinyprintf with printf for spatz tasks --- cmake/spatz_config.cmake | 3 +- cmake/spatz_helpers.cmake | 3 + targets/magia_v2/include/tile.h | 2 +- .../magia_v2/include/utils/compare_utils.h | 2 +- .../magia_v2/include/utils/fsync_isa_utils.h | 2 +- .../magia_v2/include/utils/magia_tile_utils.h | 2 +- .../magia_v2/include/utils/printf_wrapper.h | 11 - targets/magia_v2/include/utils/tinyprintf.h | 718 ------------------ 8 files changed, 8 insertions(+), 735 deletions(-) delete mode 100644 targets/magia_v2/include/utils/printf_wrapper.h delete mode 100644 targets/magia_v2/include/utils/tinyprintf.h diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 1ea3d787..8351448c 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -72,8 +72,7 @@ set(SPATZ_COMPILE_FLAGS "-ffunction-sections" "-fdata-sections" "-fPIC" - "-fno-builtin-memset" - "-fno-builtin-memcpy" + "-fno-builtin" "-mcmodel=medany" ) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 450ced6a..740eff93 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -87,6 +87,7 @@ function(add_spatz_task) set(TASK_BIN "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.bin") set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_bin.h") set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.dump") + set(SPATZ_IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") set(INCLUDE_FLAGS "") # Add targets/magia_v2 include paths @@ -124,9 +125,11 @@ function(add_spatz_task) -Wl,--defsym,__first_task=${ARG_FIRST_TASK_NAME} -o ${TASK_ELF} ${TASK_CRT0_OBJ} + ${SPATZ_IO_SRC} ${ARG_TASK_SOURCES} DEPENDS ${TASK_CRT0_OBJ} + ${SPATZ_IO_SRC} ${ARG_TASK_SOURCES} ${ARG_LINKER_SCRIPT} COMMENT "[SPATZ] Building ELF..." diff --git a/targets/magia_v2/include/tile.h b/targets/magia_v2/include/tile.h index e1d32589..58095e9f 100644 --- a/targets/magia_v2/include/tile.h +++ b/targets/magia_v2/include/tile.h @@ -11,7 +11,7 @@ #include #include "regs/tile_ctrl.h" #include "addr_map/tile_addr_map.h" -#include "utils/printf_wrapper.h" +#include "utils/printf.h" #include "utils/magia_tile_utils.h" #include "utils/magia_utils.h" #include "utils/idma_isa_utils.h" diff --git a/targets/magia_v2/include/utils/compare_utils.h b/targets/magia_v2/include/utils/compare_utils.h index 983815df..e40039e8 100644 --- a/targets/magia_v2/include/utils/compare_utils.h +++ b/targets/magia_v2/include/utils/compare_utils.h @@ -5,7 +5,7 @@ #include #include "magia_tile_utils.h" -#include "printf_wrapper.h" +#include "printf.h" #define TOLL 0x0011 diff --git a/targets/magia_v2/include/utils/fsync_isa_utils.h b/targets/magia_v2/include/utils/fsync_isa_utils.h index 1c1cad8b..5cc75444 100644 --- a/targets/magia_v2/include/utils/fsync_isa_utils.h +++ b/targets/magia_v2/include/utils/fsync_isa_utils.h @@ -23,7 +23,7 @@ #ifndef FSYNC_ISA_UTILS_H #define FSYNC_ISA_UTILS_H -#include "printf_wrapper.h" +#include "printf.h" #include "addr_map/tile_addr_map.h" #include "regs/tile_ctrl.h" #include "performance_utils.h" diff --git a/targets/magia_v2/include/utils/magia_tile_utils.h b/targets/magia_v2/include/utils/magia_tile_utils.h index 21797f58..05cc75bc 100644 --- a/targets/magia_v2/include/utils/magia_tile_utils.h +++ b/targets/magia_v2/include/utils/magia_tile_utils.h @@ -23,7 +23,7 @@ #ifndef MAGIA_TILE_UTILS_H #define MAGIA_TILE_UTILS_H -#include "printf_wrapper.h" +#include "printf.h" #define mmio64(x) (*(volatile uint64_t *)(x)) #define mmio32(x) (*(volatile uint32_t *)(x)) diff --git a/targets/magia_v2/include/utils/printf_wrapper.h b/targets/magia_v2/include/utils/printf_wrapper.h deleted file mode 100644 index e493b96f..00000000 --- a/targets/magia_v2/include/utils/printf_wrapper.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PRINTF_WRAPPER_H_ -#define PRINTF_WRAPPER_H_ - -// Spatz tasks are built standalone (-nostdlib), use tinyprintf there. -#ifdef SPATZ_TARGET -#include "tinyprintf.h" -#else -#include "printf.h" -#endif - -#endif /* PRINTF_WRAPPER_H_ */ diff --git a/targets/magia_v2/include/utils/tinyprintf.h b/targets/magia_v2/include/utils/tinyprintf.h deleted file mode 100644 index 01d54716..00000000 --- a/targets/magia_v2/include/utils/tinyprintf.h +++ /dev/null @@ -1,718 +0,0 @@ -/* - -Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL 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. - -This modified tinyprintf is distributed under the conditions of the BSD-new license -as explicitly allowed: - -> https://github.com/cjlano/tinyprintf commit 2ee3012 - -They provide a simple and small (+400 loc) printf functionality to -be used in embedded systems. - -I've found them so useful in debugging that I do not bother with a -debugger at all. - -They are distributed in source form, so to use them, just compile them -into your project. - -Two printf variants are provided: printf and the 'sprintf' family of -functions ('snprintf', 'sprintf', 'vsnprintf', 'vsprintf'). - -The formats supported by this implementation are: -'c' 'd' 'i' 'o' 'p' 'u' 's' 'x' 'X'. - -Zero padding and field width are also supported. - -If the library is compiled with 'PRINTF_SUPPORT_LONG' defined, then -the long specifier is also supported. Note that this will pull in some -long math routines (pun intended!) and thus make your executable -noticeably longer. Likewise with 'PRINTF_LONG_LONG_SUPPORT' for the -long long specifier, and with 'PRINTF_SIZE_T_SUPPORT' for the size_t -specifier. - -The memory footprint of course depends on the target CPU, compiler and -compiler options, but a rough guesstimate (based on a H8S target) is about -1.4 kB for code and some twenty 'int's and 'char's, say 60 bytes of stack space. -Not too bad. Your mileage may vary. By hacking the source code you can -get rid of some hundred bytes, I'm sure, but personally I feel the balance of -functionality and flexibility versus code size is close to optimal for -many embedded systems. - -To use the printf, you need to supply your own character output function, -something like : - -void putc ( void* p, char c) -{ - while (!SERIAL_PORT_EMPTY) ; - SERIAL_PORT_TX_REGISTER = c; -} - -Before you can call printf, you need to initialize it to use your -character output function with something like: - -init_printf(NULL,putc); - -Notice the 'NULL' in 'init_printf' and the parameter 'void* p' in 'putc', -the NULL (or any pointer) you pass into the 'init_printf' will eventually be -passed to your 'putc' routine. This allows you to pass some storage space (or -anything really) to the character output function, if necessary. -This is not often needed but it was implemented like that because it made -implementing the sprintf function so neat (look at the source code). - -The code is re-entrant, except for the 'init_printf' function, so it is safe -to call it from interrupts too, although this may result in mixed output. -If you rely on re-entrancy, take care that your 'putc' function is re-entrant! - -The printf and sprintf functions are actually macros that translate to -'tfp_printf' and 'tfp_sprintf' when 'TINYPRINTF_OVERRIDE_LIBC' is set -(default). Setting it to 0 makes it possible to use them along with -'stdio.h' printf's in a single source file. When -'TINYPRINTF_OVERRIDE_LIBC' is set, please note that printf/sprintf are -not function-like macros, so if you have variables or struct members -with these names, things will explode in your face. Without variadic -macros this is the best we can do to wrap these function. If it is a -problem, just give up the macros and use the functions directly, or -rename them. - -It is also possible to avoid defining tfp_printf and/or tfp_sprintf by -clearing 'TINYPRINTF_DEFINE_TFP_PRINTF' and/or -'TINYPRINTF_DEFINE_TFP_SPRINTF' to 0. This allows for example to -export only tfp_format, which is at the core of all the other -functions. - -For further details see source code. - -regs Kusti, 23.10.2004 -*/ - -#include "addr_map/tile_addr_map.h" -#include - -#ifndef _TINYPRINTF_INCLUDE_GUARD_ -#define _TINYPRINTF_INCLUDE_GUARD_ - -static void putf(char *null, char c) { - *(volatile uint8_t *) (PRINT_ADDR) = (uint8_t)c; -} - -#ifndef __TFP_PRINTF__ -#define __TFP_PRINTF__ - -#include - -/* Global configuration */ - -/* Set this to 0 if you do not want to provide tfp_printf */ -#ifndef TINYPRINTF_DEFINE_TFP_PRINTF -# define TINYPRINTF_DEFINE_TFP_PRINTF 1 -#endif - -/* Set this to 0 if you do not want to provide - tfp_sprintf/snprintf/vsprintf/vsnprintf */ -#ifndef TINYPRINTF_DEFINE_TFP_SPRINTF -# define TINYPRINTF_DEFINE_TFP_SPRINTF 1 -#endif - -/* Set this to 0 if you do not want tfp_printf and - tfp_{vsn,sn,vs,s}printf to be also available as - printf/{vsn,sn,vs,s}printf */ -#ifndef TINYPRINTF_OVERRIDE_LIBC -# define TINYPRINTF_OVERRIDE_LIBC 1 -#endif - -/* Optional external types dependencies */ - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -/* For standalone SPATZ builds (no libc headers) define size_t locally; - for other targets prefer the standard header. */ -# if defined(SPATZ_TARGET) - /* size_t is defined as unsigned long for standalone embedded systems */ -# ifndef size_t -# define size_t unsigned long -# endif -# else -# include -# endif -#endif - -/* Declarations */ - -#ifdef __GNUC__ -# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) \ - __attribute__((format (printf, fmt_idx, arg1_idx))) -#else -# define _TFP_SPECIFY_PRINTF_FMT(fmt_idx,arg1_idx) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*putcf) (void *, char); - -/* - 'tfp_format' really is the central function for all tinyprintf. For - each output character after formatting, the 'putf' callback is - called with 2 args: - - an arbitrary void* 'putp' param defined by the user and - passed unmodified from 'tfp_format', - - the character. - The 'tfp_printf' and 'tfp_sprintf' functions simply define their own - callback and pass to it the right 'putp' it is expecting. -*/ -static void tfp_format(void *putp, putcf putf, const char *fmt, va_list va); - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -static int tfp_vsnprintf(char *str, size_t size, const char *fmt, va_list ap); -static int tfp_snprintf(char *str, size_t size, const char *fmt, ...) \ - _TFP_SPECIFY_PRINTF_FMT(3, 4); -static int tfp_vsprintf(char *str, const char *fmt, va_list ap); -static int tfp_sprintf(char *str, const char *fmt, ...) \ - _TFP_SPECIFY_PRINTF_FMT(2, 3); -# if TINYPRINTF_OVERRIDE_LIBC -# define vsnprintf tfp_vsnprintf -# define snprintf tfp_snprintf -# define vsprintf tfp_vsprintf -# define sprintf tfp_sprintf -# endif -#endif - -#if TINYPRINTF_DEFINE_TFP_PRINTF -static void init_printf(void *putp, putcf putf); -static void tfp_printf(char *fmt, ...) _TFP_SPECIFY_PRINTF_FMT(1, 2); -# if TINYPRINTF_OVERRIDE_LIBC -# define printf tfp_printf -# endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif - - - -/* - * Configuration - */ - -/* Enable long int support */ -// #define PRINTF_LONG_SUPPORT - -/* Enable long long int support (implies long int support) */ -// #define PRINTF_LONG_LONG_SUPPORT - -/* Enable %z (size_t) support */ -// #define PRINTF_SIZE_T_SUPPORT - -/* - * Configuration adjustments - */ -#ifdef PRINTF_SIZE_T_SUPPORT -#include -#endif - -#ifdef PRINTF_LONG_LONG_SUPPORT -# define PRINTF_LONG_SUPPORT -#endif - -/* __SIZEOF___ defined at least by gcc */ -#ifdef __SIZEOF_POINTER__ -# define SIZEOF_POINTER __SIZEOF_POINTER__ -#endif -#ifdef __SIZEOF_LONG_LONG__ -# define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__ -#endif -#ifdef __SIZEOF_LONG__ -# define SIZEOF_LONG __SIZEOF_LONG__ -#endif -#ifdef __SIZEOF_INT__ -# define SIZEOF_INT __SIZEOF_INT__ -#endif - -#ifdef __GNUC__ -# define _TFP_GCC_NO_INLINE_ __attribute__ ((noinline)) -#else -# define _TFP_GCC_NO_INLINE_ -#endif - -/* - * Implementation - */ -struct param { - char lz:1; /**< Leading zeros */ - char alt:1; /**< alternate form */ - char uc:1; /**< Upper case (for base16 only) */ - char align_left:1; /**< 0 == align right (default), 1 == align left */ - unsigned int width; /**< field width */ - char sign; /**< The sign to display (if any) */ - unsigned int base; /**< number base (e.g.: 8, 10, 16) */ - char *bf; /**< Buffer to output */ -}; - - -#ifdef PRINTF_LONG_LONG_SUPPORT -static void _TFP_GCC_NO_INLINE_ ulli2a( - unsigned long long int num, struct param *p) -{ - int n = 0; - unsigned long long int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void lli2a(long long int num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - ulli2a(num, p); -} -#endif - -#ifdef PRINTF_LONG_SUPPORT -static void uli2a(unsigned long int num, struct param *p) -{ - int n = 0; - unsigned long int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void li2a(long num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - uli2a(num, p); -} -#endif - -static void ui2a(unsigned int num, struct param *p) -{ - int n = 0; - unsigned int d = 1; - char *bf = p->bf; - while (num / d >= p->base) - d *= p->base; - while (d != 0) { - int dgt = num / d; - num %= d; - d /= p->base; - if (n || dgt > 0 || d == 0) { - *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10); - ++n; - } - } - *bf = 0; -} - -static void i2a(int num, struct param *p) -{ - if (num < 0) { - num = -num; - p->sign = '-'; - } - ui2a(num, p); -} - -static int a2d(char ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - else if (ch >= 'a' && ch <= 'f') - return ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') - return ch - 'A' + 10; - else - return -1; -} - -static char a2u(char ch, const char **src, int base, unsigned int *nump) -{ - const char *p = *src; - unsigned int num = 0; - int digit; - while ((digit = a2d(ch)) >= 0) { - if (digit > base) - break; - num = num * base + digit; - ch = *p++; - } - *src = p; - *nump = num; - return ch; -} - -static void putchw(void *putp, putcf putf__, struct param *p) -{ - char ch; - int n = p->width; - char *bf = p->bf; - - /* Number of filling characters */ - while (*bf++ && n > 0) - n--; - if (p->sign) - n--; - if (p->alt && p->base == 16) - n -= 2; - else if (p->alt && p->base == 8) - n--; - - /* Fill with space to align to the right, before alternate or sign */ - if (!p->lz && !p->align_left) { - while (n-- > 0) - putf(putp, ' '); - } - - /* print sign */ - if (p->sign) - putf(putp, p->sign); - - /* Alternate */ - if (p->alt && p->base == 16) { - putf(putp, '0'); - putf(putp, (p->uc ? 'X' : 'x')); - } else if (p->alt && p->base == 8) { - putf(putp, '0'); - } - - /* Fill with zeros, after alternate or sign */ - if (p->lz) { - while (n-- > 0) - putf(putp, '0'); - } - - /* Put actual buffer */ - bf = p->bf; - while ((ch = *bf++)) - putf(putp, ch); - - /* Fill with space to align to the left, after string */ - if (!p->lz && p->align_left) { - while (n-- > 0) - putf(putp, ' '); - } -} - -static void tfp_format(void *putp, putcf putf__, const char *fmt, va_list va) -{ - struct param p; -#ifdef PRINTF_LONG_SUPPORT - char bf[23]; /* long = 64b on some architectures */ -#else - char bf[12]; /* int = 32b on some architectures */ -#endif - char ch; - p.bf = bf; - - while ((ch = *(fmt++))) { - if (ch != '%') { - putf(putp, ch); - } else { -#ifdef PRINTF_LONG_SUPPORT - char lng = 0; /* 1 for long, 2 for long long */ -#endif - /* Init parameter struct */ - p.lz = 0; - p.alt = 0; - p.width = 0; - p.align_left = 0; - p.sign = 0; - - /* Flags */ - while ((ch = *(fmt++))) { - switch (ch) { - case '-': - p.align_left = 1; - continue; - case '0': - p.lz = 1; - continue; - case '#': - p.alt = 1; - continue; - default: - break; - } - break; - } - - /* Width */ - if (ch >= '0' && ch <= '9') { - ch = a2u(ch, &fmt, 10, &(p.width)); - } - - /* We accept 'x.y' format but don't support it completely: - * we ignore the 'y' digit => this ignores 0-fill - * size and makes it == width (ie. 'x') */ - if (ch == '.') { - p.lz = 1; /* zero-padding */ - /* ignore actual 0-fill size: */ - do { - ch = *(fmt++); - } while ((ch >= '0') && (ch <= '9')); - } - -#ifdef PRINTF_SIZE_T_SUPPORT -# ifdef PRINTF_LONG_SUPPORT - if (ch == 'z') { - ch = *(fmt++); - if (sizeof(size_t) == sizeof(unsigned long int)) - lng = 1; -# ifdef PRINTF_LONG_LONG_SUPPORT - else if (sizeof(size_t) == sizeof(unsigned long long int)) - lng = 2; -# endif - } else -# endif -#endif - -#ifdef PRINTF_LONG_SUPPORT - if (ch == 'l') { - ch = *(fmt++); - lng = 1; -#ifdef PRINTF_LONG_LONG_SUPPORT - if (ch == 'l') { - ch = *(fmt++); - lng = 2; - } -#endif - } -#endif - switch (ch) { - case 0: - goto abort; - case 'u': - p.base = 10; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - ulli2a(va_arg(va, unsigned long long int), &p); - else -#endif - if (1 == lng) - uli2a(va_arg(va, unsigned long int), &p); - else -#endif - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'd': - case 'i': - p.base = 10; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - lli2a(va_arg(va, long long int), &p); - else -#endif - if (1 == lng) - li2a(va_arg(va, long int), &p); - else -#endif - i2a(va_arg(va, int), &p); - putchw(putp, putf, &p); - break; -#ifdef SIZEOF_POINTER - case 'p': - p.alt = 1; -#ifdef PRINTF_LONG_SUPPORT -# if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT - lng = 0; -# elif defined(SIZEOF_LONG) && SIZEOF_POINTER <= SIZEOF_LONG - lng = 1; -# elif defined(SIZEOF_LONG_LONG) && SIZEOF_POINTER <= SIZEOF_LONG_LONG - lng = 2; -# endif -#endif -#endif - case 'x': - case 'X': - p.base = 16; - p.uc = (ch == 'X')?1:0; -#ifdef PRINTF_LONG_SUPPORT -#ifdef PRINTF_LONG_LONG_SUPPORT - if (2 == lng) - ulli2a(va_arg(va, unsigned long long int), &p); - else -#endif - if (1 == lng) - uli2a(va_arg(va, unsigned long int), &p); - else -#endif - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'o': - p.base = 8; - ui2a(va_arg(va, unsigned int), &p); - putchw(putp, putf, &p); - break; - case 'c': - putf(putp, (char)(va_arg(va, int))); - break; - case 's': - p.bf = va_arg(va, char *); - putchw(putp, putf, &p); - p.bf = bf; - break; - case '%': - putf(putp, ch); - default: - break; - } - } - } - abort:; -} - -#if TINYPRINTF_DEFINE_TFP_PRINTF -static putcf stdout_putf; -static void *stdout_putp; - -static void init_printf(void *putp, putcf putf__) -{ - stdout_putf = putf; - stdout_putp = putp; -} - -static void tfp_printf(char *fmt, ...) -{ - va_list va; - va_start(va, fmt); - tfp_format(stdout_putp, stdout_putf, fmt, va); - va_end(va); -} -#endif - -#if TINYPRINTF_DEFINE_TFP_SPRINTF -struct _vsnprintf_putcf_data -{ - size_t dest_capacity; - char *dest; - size_t num_chars; -}; - -static void _vsnprintf_putcf(void *p, char c) -{ - struct _vsnprintf_putcf_data *data = (struct _vsnprintf_putcf_data*)p; - if (data->num_chars < data->dest_capacity) - data->dest[data->num_chars] = c; - data->num_chars ++; -} - -static int tfp_vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - struct _vsnprintf_putcf_data data; - - if (size < 1) - return 0; - - data.dest = str; - data.dest_capacity = size-1; - data.num_chars = 0; - tfp_format(&data, _vsnprintf_putcf, format, ap); - - if (data.num_chars < data.dest_capacity) - data.dest[data.num_chars] = '\0'; - else - data.dest[data.dest_capacity] = '\0'; - - return data.num_chars; -} - -static int tfp_snprintf(char *str, size_t size, const char *format, ...) -{ - va_list ap; - int retval; - - va_start(ap, format); - retval = tfp_vsnprintf(str, size, format, ap); - va_end(ap); - return retval; -} - -struct _vsprintf_putcf_data -{ - char *dest; - size_t num_chars; -}; - -static void _vsprintf_putcf(void *p, char c) -{ - struct _vsprintf_putcf_data *data = (struct _vsprintf_putcf_data*)p; - data->dest[data->num_chars++] = c; -} - -static int tfp_vsprintf(char *str, const char *format, va_list ap) -{ - struct _vsprintf_putcf_data data; - data.dest = str; - data.num_chars = 0; - tfp_format(&data, _vsprintf_putcf, format, ap); - data.dest[data.num_chars] = '\0'; - return data.num_chars; -} - -static int tfp_sprintf(char *str, const char *format, ...) -{ - va_list ap; - int retval; - - va_start(ap, format); - retval = tfp_vsprintf(str, format, ap); - va_end(ap); - return retval; -} -#endif - -#endif From 28e7bf2823899107c75712628c96cd806d27f446 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:00:01 +0100 Subject: [PATCH 59/67] [drivers] eventunit: Move Spatz-specific event functions to drivers --- cmake/spatz_helpers.cmake | 15 +---- drivers/eventunit32/src/eventunit32.c | 62 ++++++++++++++++--- hal/include/eventunit.h | 31 ++++++++-- hal/src/eventunit.c | 5 +- targets/magia_v2/include/tile.h | 2 + .../magia_v2/include/utils/compare_utils.h | 1 - .../magia_v2/include/utils/event_unit_utils.h | 46 +++++++------- tests/spatz_on_magia/double_task/main.c | 32 ++++++---- .../double_task/spatz_task/hello_task.c | 2 +- tests/spatz_on_magia/hello_spatz/main.c | 28 ++++++--- .../hello_spatz/spatz_task/hello_task.c | 2 +- tests/spatz_on_magia/onnx_add/main.c | 21 ++++--- .../onnx_add/spatz_task/onnx_add_task.c | 3 +- tests/spatz_on_magia/onnx_clip/main.c | 22 ++++--- .../onnx_clip/spatz_task/onnx_clip_task.c | 4 +- tests/spatz_on_magia/onnx_div/main.c | 21 ++++--- .../onnx_div/spatz_task/onnx_div_task.c | 3 +- 17 files changed, 194 insertions(+), 106 deletions(-) diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 740eff93..177edee2 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -198,14 +198,13 @@ endfunction() # SPATZ_HEADER (required): Path to Spatz task header file # SOURCES (required): List of source files to compile # CRT0_SRC: Path to CV32 CRT0 assembly (default: CV32_CRT0_SRC from config) -# LINK_SCRIPT: Path to CV32 linker script (default: CV32_LINK_SCRIPT from config) # INCLUDE_DIRS: Additional include directories # Output locations: # Executable: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME} # Disassembly: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.s function(add_cv32_executable_with_spatz) set(options) - set(oneValueArgs TARGET_NAME SPATZ_HEADER LINK_SCRIPT CRT0_SRC) + set(oneValueArgs TARGET_NAME SPATZ_HEADER CRT0_SRC) set(multiValueArgs SOURCES INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -213,16 +212,10 @@ function(add_cv32_executable_with_spatz) if(NOT DEFINED ARG_CRT0_SRC) set(ARG_CRT0_SRC ${CV32_CRT0_SRC}) endif() - if(NOT DEFINED ARG_LINK_SCRIPT) - set(ARG_LINK_SCRIPT ${CV32_LINK_SCRIPT}) - endif() if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") endif() - if(ARG_LINK_SCRIPT AND NOT IS_ABSOLUTE "${ARG_LINK_SCRIPT}") - set(ARG_LINK_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINK_SCRIPT}") - endif() # Add io.c source to provide string functions for printf/prf.h set(IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") @@ -245,6 +238,8 @@ function(add_cv32_executable_with_spatz) target_include_directories(${ARG_TARGET_NAME} PRIVATE ${SPATZ_HEADER_DIR}) endif() + target_link_libraries(${ARG_TARGET_NAME} PUBLIC runtime hal) + # Compiler flags [MAGIA/Makefile: CC_OPTS] target_compile_options(${ARG_TARGET_NAME} PRIVATE ${CV32_MARCH} @@ -276,10 +271,6 @@ function(add_cv32_executable_with_spatz) -Wl,--gc-sections ) - if(ARG_LINK_SCRIPT) - target_link_options(${ARG_TARGET_NAME} PRIVATE -T${ARG_LINK_SCRIPT}) - endif() - if(ARG_SPATZ_HEADER) # Use SPATZ_TASK_NAME if available (set by add_spatz_task), otherwise extract from header filename if(DEFINED SPATZ_TASK_NAME) diff --git a/drivers/eventunit32/src/eventunit32.c b/drivers/eventunit32/src/eventunit32.c index fa51e7de..8841d821 100644 --- a/drivers/eventunit32/src/eventunit32.c +++ b/drivers/eventunit32/src/eventunit32.c @@ -24,7 +24,7 @@ void eu32_init(eu_controller_t *ctrl) { // Clear all pending events mmio32(EU_CORE_BUFFER_CLEAR) = 0xFFFFFFFF; - + // Reset masks to default (disabled) mmio32(EU_CORE_MASK) = 0x00000000; mmio32(EU_CORE_IRQ_MASK) = 0x00000000; @@ -41,7 +41,7 @@ void eu32_init(eu_controller_t *ctrl) { void eu32_redmule_init(eu_controller_t *ctrl, uint32_t enable_irq) { // Enable RedMulE events in mask eu_enable_events(EU_REDMULE_ALL_MASK); - + // Optionally enable IRQ for RedMulE completion if (enable_irq) { eu_enable_irq(EU_REDMULE_DONE_MASK); @@ -78,7 +78,7 @@ uint32_t eu32_redmule_is_done(eu_controller_t *ctrl) { } //============================================================================= -// iDMA-specific Event Functions +// iDMA-specific Event Functions //============================================================================= /** @@ -88,7 +88,7 @@ uint32_t eu32_redmule_is_done(eu_controller_t *ctrl) { void eu32_idma_init(eu_controller_t *ctrl, uint32_t enable_irq) { // Enable iDMA events in mask (both directions) eu_enable_events(EU_IDMA_ALL_MASK); - + // Optionally enable IRQ for iDMA completion (both directions) if (enable_irq) { eu_enable_irq(EU_IDMA_ALL_DONE_MASK); @@ -138,7 +138,7 @@ uint32_t eu32_idma_wait_a2o(eu_controller_t *ctrl, eu_wait_mode_t mode) { } /** - * @brief Wait for L1->L2 (OBI2AXI) completion specifically + * @brief Wait for L1->L2 (OBI2AXI) completion specifically * @param mode Wait mode (polling, WFE, etc.) * @return Non-zero if L1->L2 completed, 0 if timeout/error */ @@ -235,7 +235,7 @@ uint32_t eu32_idma_o2a_is_busy(eu_controller_t *ctrl) { void eu32_fsync_init(eu_controller_t *ctrl, uint32_t enable_irq) { // Enable FSync events in mask (bits 25:24) eu_enable_events(EU_FSYNC_ALL_MASK); - + // Optionally enable IRQ for FSync completion (bit 24) if (enable_irq) { eu_enable_irq(EU_FSYNC_DONE_MASK); @@ -271,12 +271,49 @@ uint32_t eu32_fsync_has_error(eu_controller_t *ctrl) { return eu_check_events(EU_FSYNC_ERROR_MASK); } +//============================================================================= +// Spatz-specific Event Functions +//============================================================================= + +/** + * @brief Initialize Event Unit for Spatz events + * @param enable_irq If true, enable IRQ for Spatz completion + */ +void eu32_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq) { + eu_enable_events(EU_SPATZ_ALL_MASK); + + if (enable_irq) { + eu_enable_irq(EU_SPATZ_DONE_MASK); + } +} + +/** + * @brief Wait for Spatz completion using specific mode + * @param mode Wait mode (polling, WFE, etc.) + * @return Non-zero if FSync completed, 0 if timeout/error + */ +void eu32_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) { + uint32_t retval = eu_wait_events(EU_SPATZ_DONE_MASK, mode, 1000000); + #if PROFILE_SNC == 1 + stnl_snc_f(); + #endif + return retval; // 1M cycle timeout +} + +/** + * @brief Check if Spatz has completed, non-blocking + * @return Non-zero if Spatz completed + */ +uint32_t eu32_spatz_is_done(eu_controller_t *ctrl) { + return eu_check_events(EU_SPATZ_DONE_MASK); +} + extern void eu_init(eu_controller_t *ctrl) __attribute__((alias("eu32_init"), used, visibility("default"))); extern void eu_redmule_init(eu_controller_t *ctrl, uint32_t enable_irq) __attribute__((alias("eu32_redmule_init"), used, visibility("default"))); extern uint32_t eu_redmule_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) - __attribute__((alias("eu32_redmule_wait"), used, visibility("default"))); + __attribute__((alias("eu32_redmule_wait"), used, visibility("default"))); extern uint32_t eu_redmule_is_busy(eu_controller_t *ctrl) __attribute__((alias("eu32_redmule_is_busy"), used, visibility("default"))); extern uint32_t eu_redmule_is_done(eu_controller_t *ctrl) @@ -315,6 +352,12 @@ extern uint32_t eu_fsync_is_done(eu_controller_t *ctrl) __attribute__((alias("eu32_fsync_is_done"), used, visibility("default"))); extern uint32_t eu_fsync_has_error(eu_controller_t *ctrl) __attribute__((alias("eu32_fsync_has_error"), used, visibility("default"))); +extern void eu_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq) + __attribute__((alias("eu32_spatz_init"), used, visibility("default"))); +extern void eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) + __attribute__((alias("eu32_spatz_wait"), used, visibility("default"))); +extern uint32_t eu_spatz_is_done(eu_controller_t *ctrl) + __attribute__((alias("eu32_spatz_is_done"), used, visibility("default"))); eu_controller_api_t eu_api = { .init = eu32_init, @@ -339,4 +382,7 @@ eu_controller_api_t eu_api = { .fsync_wait = eu32_fsync_wait, .fsync_is_done = eu32_fsync_is_done, .fsync_has_error = eu32_fsync_has_error, -}; \ No newline at end of file + .spatz_init = eu32_spatz_init, + .spatz_wait = eu32_spatz_wait, + .spatz_is_done = eu32_spatz_is_done, +}; diff --git a/hal/include/eventunit.h b/hal/include/eventunit.h index c6a1888a..74bd5110 100644 --- a/hal/include/eventunit.h +++ b/hal/include/eventunit.h @@ -71,7 +71,7 @@ extern uint32_t eu_redmule_is_busy(eu_controller_t *ctrl); extern uint32_t eu_redmule_is_done(eu_controller_t *ctrl); //============================================================================= -// iDMA-specific Event Functions +// iDMA-specific Event Functions //============================================================================= /** @@ -103,7 +103,7 @@ extern uint32_t eu_idma_wait_direction(eu_controller_t *ctrl, uint32_t direction extern uint32_t eu_idma_wait_a2o(eu_controller_t *ctrl, eu_wait_mode_t mode); /** - * @brief Wait for L1->L2 (OBI2AXI) completion specifically + * @brief Wait for L1->L2 (OBI2AXI) completion specifically * @param mode Wait mode (polling, WFE, etc.) * @return Non-zero if L1->L2 completed, 0 if timeout/error */ @@ -192,10 +192,30 @@ extern uint32_t eu_fsync_is_done(eu_controller_t *ctrl); */ extern uint32_t eu_fsync_has_error(eu_controller_t *ctrl); +//============================================================================= +// Spatz-specific Event Functions +//============================================================================= + +/** + * @brief Initialize Event Unit for Spatz events + */ +extern void eu_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq); + +/** + * @brief Wait for Spatz completion in WFE mode + */ +extern void eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode); + +/** + * @brief Check if Spatz has completed, non-blocking + * @return Non-zero if Spatz completed + */ +extern uint32_t eu_spatz_is_done(eu_controller_t *ctrl); + struct eu_controller_api { void (*init) (eu_controller_t *ctrl); void (*redmule_init) (eu_controller_t *ctrl, uint32_t enable_irq); - uint32_t (*redmule_wait) (eu_controller_t *ctrl, eu_wait_mode_t mode); + uint32_t (*redmule_wait) (eu_controller_t *ctrl, eu_wait_mode_t mode); uint32_t (*redmule_is_busy) (eu_controller_t *ctrl); uint32_t (*redmule_is_done) (eu_controller_t *ctrl); void (*idma_init) (eu_controller_t *ctrl, uint32_t enable_irq); @@ -215,6 +235,9 @@ struct eu_controller_api { uint32_t (*fsync_wait) (eu_controller_t *ctrl, eu_wait_mode_t mode); uint32_t (*fsync_is_done) (eu_controller_t *ctrl); uint32_t (*fsync_has_error) (eu_controller_t *ctrl); + void (*spatz_init) (eu_controller_t *ctrl, uint32_t enable_irq); + void (*spatz_wait) (eu_controller_t *ctrl, eu_wait_mode_t mode); + uint32_t (*spatz_is_done) (eu_controller_t *ctrl); }; /* @@ -222,4 +245,4 @@ struct eu_controller_api { */ extern eu_controller_api_t eu_api; -#endif // HAL_EU_H \ No newline at end of file +#endif // HAL_EU_H diff --git a/hal/src/eventunit.c b/hal/src/eventunit.c index f0c064ce..cd768d5e 100644 --- a/hal/src/eventunit.c +++ b/hal/src/eventunit.c @@ -32,4 +32,7 @@ __attribute__((weak)) eu_controller_api_t eu_api = { .fsync_wait = eu_fsync_wait, .fsync_is_done = eu_fsync_is_done, .fsync_has_error = eu_fsync_has_error, -}; \ No newline at end of file + .spatz_init = eu_spatz_init, + .spatz_wait = eu_spatz_wait, + .spatz_is_done = eu_spatz_is_done, +}; diff --git a/targets/magia_v2/include/tile.h b/targets/magia_v2/include/tile.h index 58095e9f..051c5f6b 100644 --- a/targets/magia_v2/include/tile.h +++ b/targets/magia_v2/include/tile.h @@ -21,5 +21,7 @@ #include "utils/performance_utils.h" //#include "utils/amo_utils.h" #include "utils/eu_isa_utils.h" +#include "utils/magia_spatz_utils.h" +#include "utils/compare_utils.h" #endif //_TILE_INCLUDE_GUARD_ diff --git a/targets/magia_v2/include/utils/compare_utils.h b/targets/magia_v2/include/utils/compare_utils.h index e40039e8..657e1ef6 100644 --- a/targets/magia_v2/include/utils/compare_utils.h +++ b/targets/magia_v2/include/utils/compare_utils.h @@ -2,7 +2,6 @@ #define COMPARE_UTILS_H_ #include -#include #include "magia_tile_utils.h" #include "printf.h" diff --git a/targets/magia_v2/include/utils/event_unit_utils.h b/targets/magia_v2/include/utils/event_unit_utils.h index 04954205..d375cc15 100644 --- a/targets/magia_v2/include/utils/event_unit_utils.h +++ b/targets/magia_v2/include/utils/event_unit_utils.h @@ -246,29 +246,29 @@ static inline uint32_t eu_fsync_has_error(void) { // SPATZ FUNCTIONS //============================================================================= -static inline void eu_spatz_init(void) { - eu_clear_events(0xFFFFFFFF); - eu_enable_events(EU_SPATZ_DONE_MASK); -} - -static inline uint32_t eu_spatz_is_done(void) { - return eu_check_events(EU_SPATZ_DONE_MASK); -} - - -static inline void eu_wait_spatz_wfe(uint32_t event_mask) { - while (!eu_check_events(event_mask)) { - eu_evt_wait(); - } - eu_clear_events(event_mask); -} - -static inline void eu_wait_spatz_polling(uint32_t event_mask) { - while (!eu_check_events(event_mask)) { - wait_nop(10); - } - eu_clear_events(event_mask); -} +// static inline void eu_spatz_init(void) { +// eu_clear_events(0xFFFFFFFF); +// eu_enable_events(EU_SPATZ_DONE_MASK); +// } + +// static inline uint32_t eu_spatz_is_done(void) { +// return eu_check_events(EU_SPATZ_DONE_MASK); +// } + + +// static inline void eu_wait_spatz_wfe(uint32_t event_mask) { +// while (!eu_check_events(event_mask)) { +// eu_evt_wait(); +// } +// eu_clear_events(event_mask); +// } + +// static inline void eu_wait_spatz_polling(uint32_t event_mask) { +// while (!eu_check_events(event_mask)) { +// wait_nop(10); +// } +// eu_clear_events(event_mask); +// } //============================================================================= // MULTI-ACCELERATOR FUNCTIONS diff --git a/tests/spatz_on_magia/double_task/main.c b/tests/spatz_on_magia/double_task/main.c index ca4683b0..575a29ce 100644 --- a/tests/spatz_on_magia/double_task/main.c +++ b/tests/spatz_on_magia/double_task/main.c @@ -19,14 +19,15 @@ * Double Spatz Test - CV32 launches Spatz task twice consecutively * */ -#include "magia_tile_utils.h" -#include "magia_spatz_utils.h" -#include "event_unit_utils.h" +#include "tile.h" +#include "eventunit.h" + #include "double_task_bin.h" int main(void) { - - int errors = 0; + int errors; + eu_config_t eu_cfg; + eu_controller_t eu_ctrl; printf("[CV32] Double Spatz Test:\n"); @@ -34,12 +35,19 @@ int main(void) { // Initialization of Event Unit and Spatz // ========================================== - // Initialize Event Unit - eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); // Enable Spatz DONE event + errors = 0; + eu_cfg.hartid = get_hartid(); + eu_ctrl.base = NULL, + eu_ctrl.cfg = &eu_cfg, + eu_ctrl.api = &eu_api, + + printf("[CV32] Initializing Event Unit\n"); + eu_init(&eu_ctrl); + + printf("[CV32] Initializing Spatz Event Unit\n"); + eu_spatz_init(&eu_ctrl, 0); - // Enable clk and initialize Spatz (bootrom jumps to _start, does full init) - printf("\n[CV32] Initializing Spatz...\n"); + printf("[CV32] Initializing Spatz\n"); spatz_init(SPATZ_BINARY_START); // ========================================== @@ -48,7 +56,7 @@ int main(void) { printf("\n[CV32] Launching SPATZ Task (Run 1)\n"); spatz_run_task(HELLO_TASK); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); if(spatz_get_exit_code() != 0) { printf("[CV32] SPATZ TASK RUN 1 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); @@ -71,7 +79,7 @@ int main(void) { printf("\n[CV32] Launching SPATZ Task (Run 2)\n"); spatz_run_task(IDMA_SIMPLE_TASK); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); if(spatz_get_exit_code() != 0) { printf("[CV32] SPATZ TASK RUN 2 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); diff --git a/tests/spatz_on_magia/double_task/spatz_task/hello_task.c b/tests/spatz_on_magia/double_task/spatz_task/hello_task.c index 4002a7dc..0c731f76 100644 --- a/tests/spatz_on_magia/double_task/spatz_task/hello_task.c +++ b/tests/spatz_on_magia/double_task/spatz_task/hello_task.c @@ -1,4 +1,4 @@ -#include "magia_tile_utils.h" +#include "printf.h" int hello_task(void) { printf("[SNITCH] Hello World from Spatz!\n"); diff --git a/tests/spatz_on_magia/hello_spatz/main.c b/tests/spatz_on_magia/hello_spatz/main.c index f61a8b8f..4243d696 100644 --- a/tests/spatz_on_magia/hello_spatz/main.c +++ b/tests/spatz_on_magia/hello_spatz/main.c @@ -1,24 +1,34 @@ -#include "magia_tile_utils.h" -#include "magia_spatz_utils.h" -#include "event_unit_utils.h" +#include "tile.h" +#include "eventunit.h" + #include "hello_spatz_task_bin.h" int main(void) { + int errors; + eu_config_t eu_cfg; + eu_controller_t eu_ctrl; + + printf("[CV32] Hello Spatz Test\n"); - int errors = 0; + errors = 0; + eu_cfg.hartid = get_hartid(); + eu_ctrl.base = NULL, + eu_ctrl.cfg = &eu_cfg, + eu_ctrl.api = &eu_api, - printf("[CV32] Spatz Test:\n"); + printf("[CV32] Initializing Event Unit\n"); + eu_init(&eu_ctrl); - eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); + printf("[CV32] Initializing Spatz Event Unit\n"); + eu_spatz_init(&eu_ctrl, 0); - printf("[CV32] Initializing Spatz...\n"); + printf("[CV32] Initializing Spatz\n"); spatz_init(SPATZ_BINARY_START); printf("[CV32] Launching SPATZ Task\n"); spatz_run_task(HELLO_TASK); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); if(spatz_get_exit_code() != 0) { printf("[CV32] SPATZ TASK ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); diff --git a/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c b/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c index 4002a7dc..0c731f76 100644 --- a/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c +++ b/tests/spatz_on_magia/hello_spatz/spatz_task/hello_task.c @@ -1,4 +1,4 @@ -#include "magia_tile_utils.h" +#include "printf.h" int hello_task(void) { printf("[SNITCH] Hello World from Spatz!\n"); diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index 8f48abda..c8c28d71 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -1,15 +1,11 @@ -#include +#include "tile.h" +#include "eventunit.h" -#include "compare_utils.h" #include "data.h" -#include "event_unit_utils.h" #include "onnx_add_mem_layout.h" #include "onnx_add_params.h" #include "onnx_add_task_bin.h" -#include "magia_tile_utils.h" -#include "magia_spatz_utils.h" - static int init_data(void *params) { uint32_t offset; @@ -38,14 +34,21 @@ static int init_data(void *params) static int run_spatz_task() { int ret; + eu_config_t eu_cfg; + eu_controller_t eu_ctrl; + + eu_cfg.hartid = get_hartid(); + eu_ctrl.base = NULL, + eu_ctrl.cfg = &eu_cfg, + eu_ctrl.api = &eu_api, - eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); + eu_init(&eu_ctrl); + eu_spatz_init(&eu_ctrl, 0); spatz_init(SPATZ_BINARY_START); spatz_run_task_with_params(ONNX_ADD_TASK, ONNX_ADD_PARAMS_BASE); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); ret = spatz_get_exit_code(); diff --git a/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c b/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c index 1cc12f69..b1ba50a9 100644 --- a/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c +++ b/tests/spatz_on_magia/onnx_add/spatz_task/onnx_add_task.c @@ -1,5 +1,4 @@ -#include "magia_spatz_utils.h" -#include "magia_tile_utils.h" +#include "tile.h" #include "onnx_add_params.h" int onnx_add_task(void) diff --git a/tests/spatz_on_magia/onnx_clip/main.c b/tests/spatz_on_magia/onnx_clip/main.c index bff0c1ca..d672a0d3 100644 --- a/tests/spatz_on_magia/onnx_clip/main.c +++ b/tests/spatz_on_magia/onnx_clip/main.c @@ -1,14 +1,11 @@ -#include +#include "tile.h" +#include "eventunit.h" -#include "magia_tile_utils.h" +#include "data.h" #include "onnx_clip_mem_layout.h" #include "onnx_clip_params.h" #include "onnx_clip_task_bin.h" -#include "compare_utils.h" -#include "event_unit_utils.h" -#include "magia_spatz_utils.h" - static int init_data(void *params) { uint32_t offset; @@ -39,14 +36,21 @@ static int init_data(void *params) static int run_spatz_task() { int ret; + eu_config_t eu_cfg; + eu_controller_t eu_ctrl; + + eu_cfg.hartid = get_hartid(); + eu_ctrl.base = NULL, + eu_ctrl.cfg = &eu_cfg, + eu_ctrl.api = &eu_api, - eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); + eu_init(&eu_ctrl); + eu_spatz_init(&eu_ctrl, 0); spatz_init(SPATZ_BINARY_START); spatz_run_task_with_params(ONNX_CLIP_TASK, ONNX_CLIP_PARAMS_BASE); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); ret = spatz_get_exit_code(); diff --git a/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c b/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c index a181ee5a..3641df2a 100644 --- a/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c +++ b/tests/spatz_on_magia/onnx_clip/spatz_task/onnx_clip_task.c @@ -1,8 +1,6 @@ +#include "tile.h" #include "onnx_clip_params.h" -#include "magia_spatz_utils.h" -#include "magia_tile_utils.h" - int onnx_clip_task(void) { volatile onnx_clip_params_t *params; diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index 8c7a23c6..bbe9a2d7 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -1,15 +1,11 @@ -#include +#include "tile.h" +#include "eventunit.h" -#include "compare_utils.h" #include "data.h" -#include "event_unit_utils.h" #include "onnx_div_mem_layout.h" #include "onnx_div_params.h" #include "onnx_div_task_bin.h" -#include "magia_tile_utils.h" -#include "magia_spatz_utils.h" - static int init_data(void *params) { uint32_t offset; @@ -37,14 +33,21 @@ static int init_data(void *params) static int run_spatz_task() { int ret; + eu_config_t eu_cfg; + eu_controller_t eu_ctrl; + + eu_cfg.hartid = get_hartid(); + eu_ctrl.base = NULL, + eu_ctrl.cfg = &eu_cfg, + eu_ctrl.api = &eu_api, - eu_init(); - eu_enable_events(EU_SPATZ_DONE_MASK); + eu_init(&eu_ctrl); + eu_spatz_init(&eu_ctrl, 0); spatz_init(SPATZ_BINARY_START); spatz_run_task_with_params(ONNX_DIV_TASK, ONNX_DIV_PARAMS_BASE); - eu_wait_spatz_wfe(EU_SPATZ_DONE_MASK); + eu_spatz_wait(&eu_ctrl, WFE); ret = spatz_get_exit_code(); diff --git a/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c b/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c index ffabd35d..c269e75b 100644 --- a/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c +++ b/tests/spatz_on_magia/onnx_div/spatz_task/onnx_div_task.c @@ -1,5 +1,4 @@ -#include "magia_spatz_utils.h" -#include "magia_tile_utils.h" +#include "tile.h" #include "onnx_div_params.h" int onnx_div_task(void) From 889188a657a0c5ff051061295e8b9b94bedfc3e8 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:09:30 +0100 Subject: [PATCH 60/67] [tests/spatz_on_magia] Remove double task example --- tests/spatz_on_magia/CMakeLists.txt | 1 - .../spatz_on_magia/double_task/CMakeLists.txt | 17 --- tests/spatz_on_magia/double_task/main.c | 107 ------------------ .../double_task/spatz_task/hello_task.c | 6 - .../double_task/spatz_task/idma_task.c | 95 ---------------- 5 files changed, 226 deletions(-) delete mode 100644 tests/spatz_on_magia/double_task/CMakeLists.txt delete mode 100644 tests/spatz_on_magia/double_task/main.c delete mode 100644 tests/spatz_on_magia/double_task/spatz_task/hello_task.c delete mode 100644 tests/spatz_on_magia/double_task/spatz_task/idma_task.c diff --git a/tests/spatz_on_magia/CMakeLists.txt b/tests/spatz_on_magia/CMakeLists.txt index 2d46a54d..432ff162 100644 --- a/tests/spatz_on_magia/CMakeLists.txt +++ b/tests/spatz_on_magia/CMakeLists.txt @@ -1,4 +1,3 @@ -add_subdirectory(double_task) add_subdirectory(hello_spatz) add_subdirectory(onnx_add) diff --git a/tests/spatz_on_magia/double_task/CMakeLists.txt b/tests/spatz_on_magia/double_task/CMakeLists.txt deleted file mode 100644 index 1935b298..00000000 --- a/tests/spatz_on_magia/double_task/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -set(TEST_NAME double_task) - -# Compile Spatz task -add_spatz_task( - TEST_NAME ${TEST_NAME} - TASK_SOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/hello_task.c - ${CMAKE_CURRENT_SOURCE_DIR}/spatz_task/idma_task.c - FIRST_TASK_NAME hello_task -) - -# Compile CV32 executable with embedded Spatz binary -add_cv32_executable_with_spatz( - TARGET_NAME ${TEST_NAME} - SPATZ_HEADER ${SPATZ_HEADER} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c -) diff --git a/tests/spatz_on_magia/double_task/main.c b/tests/spatz_on_magia/double_task/main.c deleted file mode 100644 index 575a29ce..00000000 --- a/tests/spatz_on_magia/double_task/main.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * - * Double Spatz Test - CV32 launches Spatz task twice consecutively - * - */ -#include "tile.h" -#include "eventunit.h" - -#include "double_task_bin.h" - -int main(void) { - int errors; - eu_config_t eu_cfg; - eu_controller_t eu_ctrl; - - printf("[CV32] Double Spatz Test:\n"); - - // ========================================== - // Initialization of Event Unit and Spatz - // ========================================== - - errors = 0; - eu_cfg.hartid = get_hartid(); - eu_ctrl.base = NULL, - eu_ctrl.cfg = &eu_cfg, - eu_ctrl.api = &eu_api, - - printf("[CV32] Initializing Event Unit\n"); - eu_init(&eu_ctrl); - - printf("[CV32] Initializing Spatz Event Unit\n"); - eu_spatz_init(&eu_ctrl, 0); - - printf("[CV32] Initializing Spatz\n"); - spatz_init(SPATZ_BINARY_START); - - // ========================================== - // Test 1: First Spatz Task Run - // ========================================== - printf("\n[CV32] Launching SPATZ Task (Run 1)\n"); - spatz_run_task(HELLO_TASK); - - eu_spatz_wait(&eu_ctrl, WFE); - - if(spatz_get_exit_code() != 0) { - printf("[CV32] SPATZ TASK RUN 1 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); - errors++; - } else { - printf("[CV32] SPATZ TASK RUN 1 ENDED successfully\n"); - } - - // Disable Spatz clock between tasks - printf("\n[CV32] Disabling Spatz clock...\n"); - spatz_clk_dis(); - - // Re-enable Spatz clock - printf("[CV32] Re-enabling Spatz clock...\n"); - spatz_clk_en(); - - // ========================================== - // Test 2: Second Spatz Task Run - // ========================================== - printf("\n[CV32] Launching SPATZ Task (Run 2)\n"); - spatz_run_task(IDMA_SIMPLE_TASK); - - eu_spatz_wait(&eu_ctrl, WFE); - - if(spatz_get_exit_code() != 0) { - printf("[CV32] SPATZ TASK RUN 2 ENDED with exit code: 0x%03x\n", spatz_get_exit_code()); - errors++; - } else { - printf("[CV32] SPATZ TASK RUN 2 ENDED successfully\n"); - } - - // ========================================== - // Summary - // ========================================== - if(errors == 0) { - printf("\n[CV32] ========================================\n"); - printf("[CV32] ALL TESTS PASSED (2 runs completed)\n"); - printf("[CV32] ========================================\n"); - } else { - printf("\n[CV32] TESTS FAILED with %d errors\n", errors); - } - - // Disable Spatz clock - spatz_clk_dis(); - - // Return error status for CV32 - return errors; -} diff --git a/tests/spatz_on_magia/double_task/spatz_task/hello_task.c b/tests/spatz_on_magia/double_task/spatz_task/hello_task.c deleted file mode 100644 index 0c731f76..00000000 --- a/tests/spatz_on_magia/double_task/spatz_task/hello_task.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "printf.h" - -int hello_task(void) { - printf("[SNITCH] Hello World from Spatz!\n"); - return 0; -} diff --git a/tests/spatz_on_magia/double_task/spatz_task/idma_task.c b/tests/spatz_on_magia/double_task/spatz_task/idma_task.c deleted file mode 100644 index 2f86a215..00000000 --- a/tests/spatz_on_magia/double_task/spatz_task/idma_task.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * - * iDMA Task for MAGIA Tile - Demonstrates iDMA Transfers with Event Unit controlled by Spatz_cc - */ -#include -#include "magia_tile_utils.h" -#include "event_unit_utils.h" -#include "idma_mm_utils.h" - -#define L1_DMA_SRC ((volatile uint32_t *)(L1_BASE + 0x1000)) -#define L1_DMA_DST ((volatile uint32_t *)(L1_BASE + 0x2000)) -#define L2_DMA_BUF ((volatile uint32_t *)(L2_BASE + 0x1000)) -#define DMA_SIZE 64 - -int idma_simple_task(void) { - printf("[SNITCH] \n========================================\n"); - printf("[SNITCH] IDMA TASK: DMA Transfers + Event Unit\n"); - printf("[SNITCH] ========================================\n"); - int errors = 0; - - // Enable iDMA events (keep EU_SPATZ_DONE enabled for CV32) - printf("[SNITCH] Enabling iDMA events...\n"); - eu_enable_events(EU_IDMA_ALL_DONE_MASK); - - // 1. Test iDMA transfer L1→L2 - printf("[SNITCH] Testing iDMA L1 to L2 transfer...\n"); - - // Initialize source data in L1 - for (int i = 0; i < (DMA_SIZE/4); i++) { - L1_DMA_SRC[i] = 0xA0000000 + i; - } - - // Launch DMA transfer (L1→L2) - int tid = idma_L1ToL2((uint32_t)L1_DMA_SRC, (uint32_t)L2_DMA_BUF, DMA_SIZE); - - // Wait for O2A completion with polling (10ms timeout) - uint32_t events = eu_idma_wait_o2a_completion(EU_WAIT_MODE_POLLING); - - if (events & EU_IDMA_O2A_DONE_MASK) { - printf("[SNITCH] DMA L1 to L2 complete (O2A event detected)\n"); - } else { - printf("[SNITCH] DMA L1 to L2 TIMEOUT\n"); - errors++; - } - - // 2. Test iDMA transfer L2→L1 - printf("[SNITCH] Testing iDMA L2 to L1 transfer...\n"); - - // Clear destination - for (int i = 0; i < (DMA_SIZE/4); i++) { - L1_DMA_DST[i] = 0; - } - - tid = idma_L2ToL1((uint32_t)L2_DMA_BUF, (uint32_t)L1_DMA_DST, DMA_SIZE); - - // Wait for A2O completion with polling (10ms timeout) - events = eu_idma_wait_a2o_completion(EU_WAIT_MODE_POLLING); - - if (events & EU_IDMA_A2O_DONE_MASK) { - printf("[SNITCH] DMA L2 to L1 complete (A2O event detected)\n"); - } else { - printf("[SNITCH] DMA L2 to L1 TIMEOUT\n"); - errors++; - } - - // Verify transferred data (using mmio32) - printf("[SNITCH] Verifying transferred data...\n"); - for (int i = 0; i < (DMA_SIZE/4); i++) { - uint32_t expected = 0xA0000000 + i; - uint32_t computed = mmio32((uint32_t)L1_DMA_DST + 4*i); - if (computed != expected) { - printf("[SNITCH] [%d] FAIL: computed=0x%08x, expected=0x%08x\n", - i, computed, expected); - errors++; - } - } - if (errors == 0) printf("[SNITCH] Data verification: OK\n"); - return 0; -} From d925e398bc4b9ceadb128bbe3a9d79f21c9835b1 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:15:14 +0100 Subject: [PATCH 61/67] [targets/magia_v2] utils: remove unnecessary utils --- .../magia_v2/include/utils/event_unit_utils.h | 329 ------------------ .../magia_v2/include/utils/idma_mm_utils.h | 325 ----------------- .../magia_v2/include/utils/redmule_mm_utils.h | 131 ------- 3 files changed, 785 deletions(-) delete mode 100644 targets/magia_v2/include/utils/event_unit_utils.h delete mode 100644 targets/magia_v2/include/utils/idma_mm_utils.h delete mode 100644 targets/magia_v2/include/utils/redmule_mm_utils.h diff --git a/targets/magia_v2/include/utils/event_unit_utils.h b/targets/magia_v2/include/utils/event_unit_utils.h deleted file mode 100644 index d375cc15..00000000 --- a/targets/magia_v2/include/utils/event_unit_utils.h +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (C) 2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * - * MAGIA Event Unit Utilities - * Two modes: POLLING (non-blocking) and WFE (blocking with p.elw sleep) - */ - -#ifndef EVENT_UNIT_UTILS_H -#define EVENT_UNIT_UTILS_H - -#include -#include "magia_tile_utils.h" -#include "addr_map/tile_addr_map.h" -#include "regs/tile_ctrl.h" - -//============================================================================= -// REGISTER DEFINITIONS AND CONSTANTS -//============================================================================= - -// Wait modes -typedef enum { - EU_WAIT_MODE_POLLING = 0, - EU_WAIT_MODE_WFE = 1 -} eu_wait_mode_t; - -//============================================================================= -// LOW-LEVEL HAL (PULP-compatible evt_read32) -//============================================================================= - -// evt_read32: blocking read with p.elw instruction -static inline unsigned int evt_read32(unsigned int base, unsigned int offset) { - unsigned int value; - unsigned int addr = base + offset; - // Direct p.elw inline assembly for PULP cores (RI5CY, CV32E40P) - __asm__ __volatile__ ( - "p.elw %0, 0(%1)" - : "=r" (value) - : "r" (addr) - : "memory" - ); - return value; -} - -//============================================================================= -// BASIC CONTROL FUNCTIONS -//============================================================================= - -static inline void eu_init(void) { - mmio32(EU_CORE_BUFFER_CLEAR) = 0xFFFFFFFF; - mmio32(EU_CORE_MASK) = 0x00000000; - mmio32(EU_CORE_IRQ_MASK) = 0x00000000; -} - -static inline void eu_enable_events(uint32_t event_mask) { - mmio32(EU_CORE_MASK_OR) = event_mask; -} - -static inline void eu_disable_events(uint32_t event_mask) { - mmio32(EU_CORE_MASK_AND) = event_mask; -} - -static inline void eu_enable_irq(uint32_t irq_mask) { - mmio32(EU_CORE_IRQ_MASK_OR) = irq_mask; -} - -static inline void eu_disable_irq(uint32_t irq_mask) { - mmio32(EU_CORE_IRQ_MASK_AND) = irq_mask; -} - -static inline void eu_clear_events(uint32_t event_mask) { - mmio32(EU_CORE_BUFFER_CLEAR) = event_mask; -} - -//============================================================================= -// STATUS READ FUNCTIONS (non-blocking) -//============================================================================= - -static inline uint32_t eu_get_events(void) { - return mmio32(EU_CORE_BUFFER); -} - -static inline uint32_t eu_get_events_masked(void) { - return mmio32(EU_CORE_BUFFER_MASKED); -} - -static inline uint32_t eu_check_events(uint32_t event_mask) { - return mmio32(EU_CORE_BUFFER_MASKED) & event_mask; -} - -//============================================================================= -// WAIT FUNCTIONS (polling and blocking) -//============================================================================= - -// POLLING mode: non-blocking busy-wait -static inline uint32_t eu_wait_events_polling(uint32_t event_mask, uint32_t timeout_cycles) { - uint32_t cycles = 0; - uint32_t detected_events; - do { - detected_events = eu_check_events(event_mask); - if (detected_events){ - eu_clear_events(detected_events); - return detected_events; - } - wait_nop(10); - cycles += 10; - } while (timeout_cycles == 0 || cycles < timeout_cycles); - return 0; -} - -// WFE mode: blocking sleep with p.elw -static inline uint32_t eu_wait_events_wfe(uint32_t event_mask) { - eu_enable_events(event_mask); - return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); -} - -// Generic wait with mode selection -static inline uint32_t eu_wait_events(uint32_t event_mask, eu_wait_mode_t mode, uint32_t timeout_cycles) { - if (mode == EU_WAIT_MODE_WFE) - return eu_wait_events_wfe(event_mask); - else - return eu_wait_events_polling(event_mask, timeout_cycles); -} - -// PULP HAL compatible functions -static inline unsigned int eu_evt_wait(void) { - return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT - EU_BASE); -} - -static inline unsigned int eu_evt_waitAndClr(void) { - return evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); -} - -static inline unsigned int eu_evt_maskWaitAndClr(unsigned int evtMask) { - eu_enable_events(evtMask); - unsigned int result = eu_evt_waitAndClr(); - eu_disable_events(evtMask); - return result; -} - -//============================================================================= -// REDMULE FUNCTIONS -//============================================================================= - -static inline void eu_redmule_init(void) { - eu_clear_events(0xFFFFFFFF); - eu_enable_events(EU_REDMULE_DONE_MASK); -} - -static inline uint32_t eu_redmule_wait_completion(eu_wait_mode_t mode) { - return eu_wait_events(EU_REDMULE_DONE_MASK, mode, 1000000); -} - -static inline uint32_t eu_redmule_is_busy(void) { - return eu_check_events(EU_REDMULE_BUSY_MASK); -} - -static inline uint32_t eu_redmule_is_done(void) { - return eu_check_events(EU_REDMULE_DONE_MASK); -} - -//============================================================================= -// IDMA FUNCTIONS -//============================================================================= - -static inline void eu_idma_init(void) { - eu_clear_events(0xFFFFFFFF); - eu_enable_events(EU_IDMA_ALL_DONE_MASK); -} - -static inline uint32_t eu_idma_wait_completion(eu_wait_mode_t mode) { - return eu_wait_events(EU_IDMA_ALL_DONE_MASK, mode, 1000000); -} - -static inline uint32_t eu_idma_wait_direction_completion(uint32_t direction, eu_wait_mode_t mode) { - uint32_t wait_mask = direction ? EU_IDMA_O2A_DONE_MASK : EU_IDMA_A2O_DONE_MASK; - return eu_wait_events(wait_mask, mode, 1000000); -} - -static inline uint32_t eu_idma_wait_a2o_completion(eu_wait_mode_t mode) { - return eu_wait_events(EU_IDMA_A2O_DONE_MASK, mode, 1000000); -} - -static inline uint32_t eu_idma_wait_o2a_completion(eu_wait_mode_t mode) { - return eu_wait_events(EU_IDMA_O2A_DONE_MASK, mode, 1000000); -} - -static inline uint32_t eu_idma_is_done(void) { - return eu_check_events(EU_IDMA_ALL_DONE_MASK); -} - -static inline uint32_t eu_idma_a2o_is_done(void) { - return eu_check_events(EU_IDMA_A2O_DONE_MASK); -} - -static inline uint32_t eu_idma_o2a_is_done(void) { - return eu_check_events(EU_IDMA_O2A_DONE_MASK); -} - -static inline uint32_t eu_idma_is_busy(void) { - uint32_t events = eu_get_events(); - return events & (EU_IDMA_A2O_BUSY_MASK | EU_IDMA_O2A_BUSY_MASK); -} - -static inline uint32_t eu_idma_has_error(void) { - uint32_t events = eu_get_events(); - return events & (EU_IDMA_A2O_ERROR_MASK | EU_IDMA_O2A_ERROR_MASK); -} - -//============================================================================= -// FSYNC FUNCTIONS -//============================================================================= - -static inline void eu_fsync_init(void) { - eu_clear_events(0xFFFFFFFF); - eu_enable_events(EU_FSYNC_ALL_MASK); -} - -static inline uint32_t eu_fsync_wait_completion(eu_wait_mode_t mode) { - return eu_wait_events(EU_FSYNC_DONE_MASK, mode, 1000000); -} - -static inline uint32_t eu_fsync_is_done(void) { - return eu_check_events(EU_FSYNC_DONE_MASK); -} - -static inline uint32_t eu_fsync_has_error(void) { - return eu_check_events(EU_FSYNC_ERROR_MASK); -} - -//============================================================================= -// SPATZ FUNCTIONS -//============================================================================= - -// static inline void eu_spatz_init(void) { -// eu_clear_events(0xFFFFFFFF); -// eu_enable_events(EU_SPATZ_DONE_MASK); -// } - -// static inline uint32_t eu_spatz_is_done(void) { -// return eu_check_events(EU_SPATZ_DONE_MASK); -// } - - -// static inline void eu_wait_spatz_wfe(uint32_t event_mask) { -// while (!eu_check_events(event_mask)) { -// eu_evt_wait(); -// } -// eu_clear_events(event_mask); -// } - -// static inline void eu_wait_spatz_polling(uint32_t event_mask) { -// while (!eu_check_events(event_mask)) { -// wait_nop(10); -// } -// eu_clear_events(event_mask); -// } - -//============================================================================= -// MULTI-ACCELERATOR FUNCTIONS -//============================================================================= - -static inline void eu_multi_init(uint32_t redmule_en, uint32_t idma_a2o_en, - uint32_t idma_o2a_en, uint32_t fsync_en) { - eu_clear_events(0xFFFFFFFF); - uint32_t event_mask = 0; - - if (redmule_en) { - event_mask |= EU_REDMULE_ALL_MASK; - } - if (idma_a2o_en) { - event_mask |= EU_IDMA_A2O_DONE_MASK; - } - if (idma_o2a_en) { - event_mask |= EU_IDMA_O2A_DONE_MASK; - } - if (fsync_en) { - event_mask |= EU_FSYNC_ALL_MASK; - } - - if (event_mask) eu_enable_events(event_mask); -} - -static inline uint32_t eu_multi_wait_all(uint32_t wait_redmule, uint32_t wait_idma_a2o, - uint32_t wait_idma_o2a, uint32_t wait_fsync, - eu_wait_mode_t mode) { - uint32_t required_mask = 0; - if (wait_redmule) required_mask |= EU_REDMULE_DONE_MASK; - if (wait_idma_a2o) required_mask |= EU_IDMA_A2O_DONE_MASK; - if (wait_idma_o2a) required_mask |= EU_IDMA_O2A_DONE_MASK; - if (wait_fsync) required_mask |= EU_FSYNC_DONE_MASK; - - eu_enable_events(required_mask); - - if (mode == EU_WAIT_MODE_WFE) { - uint32_t accumulated = 0; - while ((accumulated & required_mask) != required_mask) { - uint32_t new_events = evt_read32(EU_BASE, EU_CORE_EVENT_WAIT_CLEAR - EU_BASE); - accumulated |= new_events; - } - return accumulated; - } else { - uint32_t timeout = 1000000; - uint32_t cycles = 0; - uint32_t accumulated = 0; - while (cycles < timeout && (accumulated & required_mask) != required_mask) { - accumulated |= eu_check_events(required_mask); - wait_nop(10); - cycles += 10; - } - return accumulated; - } -} - -#endif /* EVENT_UNIT_UTILS_H */ diff --git a/targets/magia_v2/include/utils/idma_mm_utils.h b/targets/magia_v2/include/utils/idma_mm_utils.h deleted file mode 100644 index eb1d5bec..00000000 --- a/targets/magia_v2/include/utils/idma_mm_utils.h +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * Based on idma_utils.h by Victor Isachi - * - * MAGIA iDMA Memory-Mapped I/O Utils - */ - -#ifndef IDMA_MM_UTILS_H -#define IDMA_MM_UTILS_H - -#include -#include "magia_tile_utils.h" -#include "addr_map/tile_addr_map.h" -#include "regs/tile_ctrl.h" - -//============================================================================= -// Register Definitions and Constants -//============================================================================= - -// iDMA Memory-Mapped Register Base Addresses -#define IDMA_MM_DIRECTION_OFFSET (0x200) -#define IDMA_MM_BASE_AXI2OBI (IDMA_BASE) // direction=0, L2 to L1 -#define IDMA_MM_BASE_OBI2AXI (IDMA_BASE + IDMA_MM_DIRECTION_OFFSET) // direction=1, L1 to L2 - -// Configuration Register Bit Fields -#define IDMA_CONF_DECOUPLE_AW_BIT (0) -#define IDMA_CONF_DECOUPLE_RW_BIT (1) -#define IDMA_CONF_SRC_REDUCE_LEN_BIT (2) -#define IDMA_CONF_DST_REDUCE_LEN_BIT (3) -#define IDMA_CONF_SRC_MAX_LLEN_MASK (0x70) // bits 6:4 -#define IDMA_CONF_SRC_MAX_LLEN_SHIFT (4) -#define IDMA_CONF_DST_MAX_LLEN_MASK (0x380) // bits 9:7 -#define IDMA_CONF_DST_MAX_LLEN_SHIFT (7) -#define IDMA_CONF_ENABLE_ND_MASK (0xC00) // bits 11:10 -#define IDMA_CONF_ENABLE_ND_SHIFT (10) - -// Transfer Direction Constants -#define IDMA_DIR_L2_TO_L1 (0) // AXI2OBI direction -#define IDMA_DIR_L1_TO_L2 (1) // OBI2AXI direction - -// Direction aliases -#define IDMA_EXT2LOC 0 // L2 to L1 (AXI2OBI) -#define IDMA_LOC2EXT 1 // L1 to L2 (OBI2AXI) - -// Transfer dimensions -#define IDMA_1D 0 -#define IDMA_2D 1 -#define IDMA_3D 2 - -// Protocol definitions -typedef enum { - IDMA_PROT_AXI = 0, // AXI protocol: L2 memory - IDMA_PROT_OBI = 1 // OBI protocol: L1 memory -} idma_prot_t; - -typedef unsigned int dma_ext_t; - -// Configuration macros -#define IDMA_DEFAULT_CONFIG 0x0 - -//============================================================================= -// Low-Level Register Access Functions -//============================================================================= - -static inline void idma_mm_conf_dir(uint32_t is_l1_to_l2, uint32_t decouple_aw, uint32_t decouple_rw, - uint32_t src_reduce_len, uint32_t dst_reduce_len, - uint32_t src_max_llen, uint32_t dst_max_llen, - uint32_t enable_nd) { - uint32_t conf_val = 0; - - if (decouple_aw) conf_val |= (1 << IDMA_CONF_DECOUPLE_AW_BIT); - if (decouple_rw) conf_val |= (1 << IDMA_CONF_DECOUPLE_RW_BIT); - if (src_reduce_len) conf_val |= (1 << IDMA_CONF_SRC_REDUCE_LEN_BIT); - if (dst_reduce_len) conf_val |= (1 << IDMA_CONF_DST_REDUCE_LEN_BIT); - - conf_val |= ((src_max_llen & 0x7) << IDMA_CONF_SRC_MAX_LLEN_SHIFT); - conf_val |= ((dst_max_llen & 0x7) << IDMA_CONF_DST_MAX_LLEN_SHIFT); - conf_val |= ((enable_nd & 0x3) << IDMA_CONF_ENABLE_ND_SHIFT); - - mmio32(IDMA_CONF_ADDR(is_l1_to_l2)) = conf_val; -} - -static inline void idma_mm_conf_default_dir(uint32_t is_l1_to_l2) { - idma_mm_conf_dir(is_l1_to_l2, 0, 0, 0, 0, 0, 0, 3); -} - -static inline uint32_t idma_mm_is_busy_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { - if (stream_id >= 16) return 0; - uint32_t status = mmio32(IDMA_STATUS_ADDR(is_l1_to_l2, stream_id)); - return (status & IDMA_STATUS_BUSY_MASK) ? 1 : 0; -} - -static inline uint32_t idma_mm_start_transfer_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { - if (stream_id >= 16) return 0; - uint32_t transfer_id = mmio32(IDMA_NEXT_ID_ADDR(is_l1_to_l2, stream_id)); - return transfer_id; -} - -static inline uint32_t idma_mm_get_done_id_dir(uint32_t is_l1_to_l2, uint32_t stream_id) { - if (stream_id >= 16) return 0; - return mmio32(IDMA_DONE_ID_ADDR(is_l1_to_l2, stream_id)); -} - -static inline void idma_mm_set_addr_len_dir(uint32_t is_l1_to_l2, uint32_t dst_addr, uint32_t src_addr, uint32_t length) { - mmio32(IDMA_DST_ADDR_LOW_ADDR(is_l1_to_l2)) = dst_addr; - mmio32(IDMA_SRC_ADDR_LOW_ADDR(is_l1_to_l2)) = src_addr; - mmio32(IDMA_LENGTH_LOW_ADDR(is_l1_to_l2)) = length; -} - -static inline void idma_mm_set_2d_params_dir(uint32_t is_l1_to_l2, uint32_t dst_stride_2, uint32_t src_stride_2, uint32_t reps_2) { - mmio32(IDMA_DST_STRIDE_2_LOW_ADDR(is_l1_to_l2)) = dst_stride_2; - mmio32(IDMA_SRC_STRIDE_2_LOW_ADDR(is_l1_to_l2)) = src_stride_2; - mmio32(IDMA_REPS_2_LOW_ADDR(is_l1_to_l2)) = reps_2; -} - -static inline void idma_mm_set_3d_params_dir(uint32_t is_l1_to_l2, uint32_t dst_stride_3, uint32_t src_stride_3, uint32_t reps_3) { - mmio32(IDMA_DST_STRIDE_3_LOW_ADDR(is_l1_to_l2)) = dst_stride_3; - mmio32(IDMA_SRC_STRIDE_3_LOW_ADDR(is_l1_to_l2)) = src_stride_3; - mmio32(IDMA_REPS_3_LOW_ADDR(is_l1_to_l2)) = reps_3; -} - -static inline uint32_t idma_mm_wait_for_completion(uint32_t direction, uint32_t transfer_id) { - if (transfer_id == 0) return 0; - - uint32_t is_l1_to_l2 = (direction == IDMA_DIR_L1_TO_L2) ? 1 : 0; - uint32_t stream_id = 0; - uint32_t timeout = 1000000; - - while (timeout-- > 0) { - uint32_t is_busy = idma_mm_is_busy_dir(is_l1_to_l2, stream_id); - - if (!is_busy) { - uint32_t done_id = idma_mm_get_done_id_dir(is_l1_to_l2, stream_id); - if (done_id == transfer_id) { - return 1; - } - } - - wait_nop(10); - } - - return 0; -} - -//============================================================================= -// High-Level DMA API - 1D Transfers -//============================================================================= - -// Forward declarations -static inline int idma_L1ToL2(unsigned int src, unsigned int dst, unsigned short size); -static inline int idma_L2ToL1(unsigned int src, unsigned int dst, unsigned short size); -static inline int idma_L1ToL1(unsigned int src, unsigned int dst, unsigned short size); -static inline int idma_L1ToL2_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); -static inline int idma_L2ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); -static inline int idma_L1ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps); - -static inline int dma_memcpy(dma_ext_t ext, unsigned int loc, unsigned short size, int ext2loc) { - if (ext2loc) - return idma_L2ToL1(ext, loc, size); - else - return idma_L1ToL2(loc, ext, size); -} - -static inline int dma_l1ToExt(dma_ext_t ext, unsigned int loc, unsigned short size) { - return idma_L1ToL2(loc, ext, size); -} - -static inline int dma_extToL1(unsigned int loc, dma_ext_t ext, unsigned short size) { - return idma_L2ToL1(ext, loc, size); -} - -static inline int idma_memcpy(unsigned int src, unsigned int dst, unsigned int size, - idma_prot_t src_prot, idma_prot_t dst_prot) { - if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_AXI) { - return idma_L1ToL2(src, dst, size); - } else if (src_prot == IDMA_PROT_AXI && dst_prot == IDMA_PROT_OBI) { - return idma_L2ToL1(src, dst, size); - } else if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_OBI) { - return idma_L1ToL1(src, dst, size); - } - return 0; -} - -static inline int idma_L1ToL2(unsigned int src, unsigned int dst, unsigned short size) { - idma_mm_conf_default_dir(1); - idma_mm_set_addr_len_dir(1, dst, src, size); - idma_mm_set_2d_params_dir(1, 0, 0, 1); - idma_mm_set_3d_params_dir(1, 0, 0, 1); - return idma_mm_start_transfer_dir(1, 0); -} - -static inline int idma_L2ToL1(unsigned int src, unsigned int dst, unsigned short size) { - idma_mm_conf_default_dir(0); - idma_mm_set_addr_len_dir(0, dst, src, size); - idma_mm_set_2d_params_dir(0, 0, 0, 1); - idma_mm_set_3d_params_dir(0, 0, 0, 1); - return idma_mm_start_transfer_dir(0, 0); -} - -// L1-to-L1 transfers: Remote to Local (PULL) -static inline int idma_L1ToL1_pull(unsigned int remote_src, unsigned int local_dst, unsigned short size) { - idma_mm_conf_default_dir(0); // AXI2OBI: read from remote (AXI), write to local (OBI) - idma_mm_set_addr_len_dir(0, local_dst, remote_src, size); - idma_mm_set_2d_params_dir(0, 0, 0, 1); - idma_mm_set_3d_params_dir(0, 0, 0, 1); - return idma_mm_start_transfer_dir(0, 0); -} - -// L1-to-L1 transfers: Local to Remote (PUSH) -static inline int idma_L1ToL1_push(unsigned int local_src, unsigned int remote_dst, unsigned short size) { - idma_mm_conf_default_dir(1); // OBI2AXI: read from local (OBI), write to remote (AXI) - idma_mm_set_addr_len_dir(1, remote_dst, local_src, size); - idma_mm_set_2d_params_dir(1, 0, 0, 1); - idma_mm_set_3d_params_dir(1, 0, 0, 1); - return idma_mm_start_transfer_dir(1, 0); -} - - -//============================================================================= -// High-Level DMA API - 2D Transfers -//============================================================================= - -static inline int idma_memcpy_2d(unsigned int src, unsigned int dst, unsigned int size, - unsigned int src_stride, unsigned int dst_stride, - unsigned int num_reps, idma_prot_t src_prot, idma_prot_t dst_prot) { - if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_AXI) { - return idma_L1ToL2_2d(src, dst, size, src_stride, dst_stride, num_reps); - } else if (src_prot == IDMA_PROT_AXI && dst_prot == IDMA_PROT_OBI) { - return idma_L2ToL1_2d(src, dst, size, src_stride, dst_stride, num_reps); - } else if (src_prot == IDMA_PROT_OBI && dst_prot == IDMA_PROT_OBI) { - return idma_L1ToL1_2d(src, dst, size, src_stride, dst_stride, num_reps); - } - return 0; -} - -static inline int idma_L1ToL2_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { - idma_mm_conf_default_dir(1); - idma_mm_set_addr_len_dir(1, dst, src, size); - idma_mm_set_2d_params_dir(1, dst_stride, src_stride, num_reps); - idma_mm_set_3d_params_dir(1, 0, 0, 1); - return idma_mm_start_transfer_dir(1, 0); -} - -static inline int idma_L2ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { - idma_mm_conf_default_dir(0); - idma_mm_set_addr_len_dir(0, dst, src, size); - idma_mm_set_2d_params_dir(0, dst_stride, src_stride, num_reps); - idma_mm_set_3d_params_dir(0, 0, 0, 1); - return idma_mm_start_transfer_dir(0, 0); -} - -// L1-to-L1 2D transfers: Remote to Local (PULL) -static inline int idma_L1ToL1_pull_2d(unsigned int remote_src, unsigned int local_dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { - idma_mm_conf_default_dir(0); // AXI2OBI - idma_mm_set_addr_len_dir(0, local_dst, remote_src, size); - idma_mm_set_2d_params_dir(0, dst_stride, src_stride, num_reps); - idma_mm_set_3d_params_dir(0, 0, 0, 1); - return idma_mm_start_transfer_dir(0, 0); -} - -// L1-to-L1 2D transfers: Local to Remote (PUSH) -static inline int idma_L1ToL1_push_2d(unsigned int local_src, unsigned int remote_dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { - idma_mm_conf_default_dir(1); // OBI2AXI - idma_mm_set_addr_len_dir(1, remote_dst, local_src, size); - idma_mm_set_2d_params_dir(1, dst_stride, src_stride, num_reps); - idma_mm_set_3d_params_dir(1, 0, 0, 1); - return idma_mm_start_transfer_dir(1, 0); -} - -// Legacy L1-to-L1 2D function (assumes remote->local for backward compatibility) -static inline int idma_L1ToL1_2d(unsigned int src, unsigned int dst, unsigned short size, - unsigned int src_stride, unsigned int dst_stride, unsigned int num_reps) { - return idma_L1ToL1_pull_2d(src, dst, size, src_stride, dst_stride, num_reps); -} - -//============================================================================= -// Status and Wait Functions -//============================================================================= - -static inline unsigned int idma_tx_cplt(unsigned int dma_tx_id) { - uint32_t done_id_axi2obi = idma_mm_get_done_id_dir(0, 0); - uint32_t done_id_obi2axi = idma_mm_get_done_id_dir(1, 0); - - return (done_id_axi2obi == dma_tx_id) || (done_id_obi2axi == dma_tx_id); -} - -static inline unsigned int dma_status() { - return idma_mm_is_busy_dir(0, 0) || idma_mm_is_busy_dir(1, 0); -} - -static inline void dma_wait(unsigned int dma_tx_id) { - while(!idma_tx_cplt(dma_tx_id)) { - wait_nop(1); - } -} - -static inline void dma_barrier() { - while(dma_status()) { - wait_nop(1); - } -} - -#endif /*IDMA_MM_UTILS_H*/ diff --git a/targets/magia_v2/include/utils/redmule_mm_utils.h b/targets/magia_v2/include/utils/redmule_mm_utils.h deleted file mode 100644 index 2fe02551..00000000 --- a/targets/magia_v2/include/utils/redmule_mm_utils.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * - * RedMulE MM Utilities - * - * This header contains MM-related definitions and functions for RedMulE control - * using MMIO-based register access. - */ - -#ifndef REDMULE_MM_UTILS_H -#define REDMULE_MM_UTILS_H - -#include -#include "magia_tile_utils.h" -#include "addr_map/tile_addr_map.h" -#include "regs/tile_ctrl.h" - -/* OBI2HWPE Protocol Stamps */ -#define REDMULE_ADDR_BASE REDMULE_BASE - -#define HWPE_WRITE(value, offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) = value -#define HWPE_READ(offset) *(volatile int *)(REDMULE_ADDR_BASE + offset) - -/* Operations and formats */ -#define gemm_ops 0x1 -#define Float16 0x1 -#define Float16Alt 0x2 -#define Float8 0x3 -#define Float8Alt 0x4 - -/* HWPE Register Access Functions */ -static inline void redmule_x_add_set(unsigned int value) { - HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_X_PTR); -} - -static inline void redmule_w_add_set(unsigned int value) { - HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_W_PTR); -} - -static inline void redmule_z_add_set(unsigned int value) { - HWPE_WRITE(value, REDMULE_REG_OFFS + REDMULE_REG_Z_PTR); -} - -static inline void redmule_mcfg_set(uint32_t mcfg0, uint32_t mcfg1) { - HWPE_WRITE(mcfg0, REDMULE_REG_OFFS + REDMULE_MCFG0_PTR); - HWPE_WRITE(mcfg1, REDMULE_REG_OFFS + REDMULE_MCFG1_PTR); -} - -static inline void redmule_arith_set(uint32_t arith) { - HWPE_WRITE(arith, REDMULE_REG_OFFS + REDMULE_ARITH_PTR); -} - -static inline void hwpe_trigger_job() { - HWPE_WRITE(0, REDMULE_TRIGGER); -} - -static inline int hwpe_acquire_job() { - int result = HWPE_READ(REDMULE_ACQUIRE); - return result; -} - -static inline unsigned int hwpe_get_status() { - unsigned int result = HWPE_READ(REDMULE_STATUS); - return result; -} - -static inline void hwpe_soft_clear() { - HWPE_WRITE(0, REDMULE_SOFT_CLEAR); -} - -static inline void hwpe_cg_enable() { - return; -} - -static inline void hwpe_cg_disable() { - return; -} - -static inline void hwpe_wait_for_completion() { - // Polling-based completion detection - unsigned int status; - unsigned int poll_count = 0; - unsigned int max_polls = 100000; - - do { - status = hwpe_get_status(); - poll_count++; - - // Small pause to not overload system - if (poll_count % 50 == 0) { - wait_nop(10); - } - - // Exit conditions: idle status (0) or timeout - if (status == 0 || poll_count >= max_polls) { - break; - } - - } while (1); -} - -/* RedMulE Configuration Function */ -static inline void redmule_cfg(unsigned int x, unsigned int w, unsigned int z, uint16_t m_size, uint16_t n_size, - uint16_t k_size, uint8_t gemm_op, uint8_t gemm_fmt) { - - uint32_t mcfg_reg0 = (k_size << 16) | (m_size << 0); - uint32_t mcfg_reg1 = n_size << 0; - uint32_t arith_reg = (gemm_op << 10) | (gemm_fmt << 7); - - redmule_x_add_set((unsigned int)x); - redmule_w_add_set((unsigned int)w); - redmule_z_add_set((unsigned int)z); - redmule_mcfg_set((unsigned int)mcfg_reg0, (unsigned int)mcfg_reg1); - redmule_arith_set((unsigned int)arith_reg); -} - -#endif /* REDMULE_MM_UTILS_H */ From 108dd5e07a88fa4b140274d9d9d2c8adf9497e47 Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:08:53 +0100 Subject: [PATCH 62/67] [cmake] Refactor and cleanup of Spatz cmake files --- cmake/bootrom_helpers.cmake | 72 +---- cmake/spatz_config.cmake | 151 +++++++--- cmake/spatz_helpers.cmake | 274 ++++++------------ targets/magia_v2/CMakeLists.txt | 25 +- .../spatz_on_magia/hello_spatz/CMakeLists.txt | 1 - tests/spatz_on_magia/onnx_add/CMakeLists.txt | 1 - tests/spatz_on_magia/onnx_clip/CMakeLists.txt | 1 - tests/spatz_on_magia/onnx_div/CMakeLists.txt | 1 - 8 files changed, 216 insertions(+), 310 deletions(-) diff --git a/cmake/bootrom_helpers.cmake b/cmake/bootrom_helpers.cmake index bb2b265d..0d4d4c9e 100644 --- a/cmake/bootrom_helpers.cmake +++ b/cmake/bootrom_helpers.cmake @@ -1,83 +1,43 @@ # Spatz bootrom compilation helpers -include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) - -# Function: add_spatz_bootrom -# Compiles Spatz bootrom +# add_spatz_bootrom() +# Builds the Spatz bootrom artifacts (ELF/BIN/DUMP). function(add_spatz_bootrom) - set(options) - set(oneValueArgs BOOTROM_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_VAR SV_OUTPUT) - set(multiValueArgs) - cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if(NOT ARG_OUTPUT_DIR) - set(ARG_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) - endif() - - # Create output directory if it doesn't exist - file(MAKE_DIRECTORY "${ARG_OUTPUT_DIR}") - - if(NOT IS_ABSOLUTE "${ARG_BOOTROM_SRC}") - set(ARG_BOOTROM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_BOOTROM_SRC}") - endif() - if(NOT IS_ABSOLUTE "${ARG_LINKER_SCRIPT}") - set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") - endif() - - set(BOOTROM_ELF "${ARG_OUTPUT_DIR}/spatz_init.elf") - set(BOOTROM_BIN "${ARG_OUTPUT_DIR}/spatz_init.bin") - set(BOOTROM_DUMP "${ARG_OUTPUT_DIR}/spatz_init.dump") + file(MAKE_DIRECTORY "${SPATZ_BOOTROM_OUTPUT_DIR}") # Compile bootrom ELF [MAGIA/spatz/bootrom/Makefile: $(ELF)] add_custom_command( - OUTPUT ${BOOTROM_ELF} + OUTPUT ${SPATZ_BOOTROM_ELF} COMMAND ${SPATZ_CLANG} ${SPATZ_COMPILE_FLAGS} ${SPATZ_CFLAGS_DEFINES} ${SPATZ_LINK_FLAGS} - -T${ARG_LINKER_SCRIPT} - -o ${BOOTROM_ELF} - ${ARG_BOOTROM_SRC} - DEPENDS ${ARG_BOOTROM_SRC} ${ARG_LINKER_SCRIPT} + -T${SPATZ_BOOTROM_LINK_SCRIPT} + -o ${SPATZ_BOOTROM_ELF} + ${SPATZ_BOOTROM_SRC} + DEPENDS ${SPATZ_BOOTROM_SRC} ${SPATZ_BOOTROM_LINK_SCRIPT} COMMENT "[SPATZ-BOOTROM] Compiling bootrom ELF..." VERBATIM ) # Extract binary [MAGIA/spatz/bootrom/Makefile: $(BIN)] add_custom_command( - OUTPUT ${BOOTROM_BIN} - COMMAND ${SPATZ_OBJCOPY} -O binary ${BOOTROM_ELF} ${BOOTROM_BIN} - DEPENDS ${BOOTROM_ELF} + OUTPUT ${SPATZ_BOOTROM_BIN} + COMMAND ${SPATZ_OBJCOPY} -O binary ${SPATZ_BOOTROM_ELF} ${SPATZ_BOOTROM_BIN} + DEPENDS ${SPATZ_BOOTROM_ELF} COMMENT "[SPATZ-BOOTROM] Generating bootrom binary..." VERBATIM ) # Generate disassembly [MAGIA/spatz/bootrom/Makefile: $(DUMP)] add_custom_command( - OUTPUT ${BOOTROM_DUMP} - COMMAND ${SPATZ_OBJDUMP} -D ${BOOTROM_ELF} > ${BOOTROM_DUMP} - DEPENDS ${BOOTROM_ELF} + OUTPUT ${SPATZ_BOOTROM_DUMP} + COMMAND ${SPATZ_OBJDUMP} -D ${SPATZ_BOOTROM_ELF} > ${SPATZ_BOOTROM_DUMP} + DEPENDS ${SPATZ_BOOTROM_ELF} COMMENT "[SPATZ-BOOTROM] Generating disassembly..." VERBATIM ) - set(BOOTROM_TARGET_OUTPUTS ${BOOTROM_BIN} ${BOOTROM_DUMP}) - - # Generate SystemVerilog bootrom module [MAGIA/spatz/bootrom/Makefile: "sv"] - if(ARG_SV_OUTPUT) - add_custom_command( - OUTPUT ${ARG_SV_OUTPUT} - COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/generate_spatz_bootrom.py - ${BOOTROM_BIN} - -o ${ARG_SV_OUTPUT} - DEPENDS ${BOOTROM_BIN} - COMMENT "[SPATZ-BOOTROM] Generating hardware bootrom: ${ARG_SV_OUTPUT}" - VERBATIM - ) - list(APPEND BOOTROM_TARGET_OUTPUTS ${ARG_SV_OUTPUT}) - endif() - - add_custom_target(spatz_bootrom ALL DEPENDS ${BOOTROM_TARGET_OUTPUTS}) - - set(${ARG_OUTPUT_VAR} ${BOOTROM_BIN} PARENT_SCOPE) + add_custom_target(spatz_bootrom ALL DEPENDS ${SPATZ_BOOTROM_BIN} ${SPATZ_BOOTROM_DUMP}) + set(SPATZ_BOOTROM_BIN ${SPATZ_BOOTROM_BIN} PARENT_SCOPE) endfunction() diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 8351448c..2ce43af7 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -1,13 +1,93 @@ -# Spatz task global config +# Spatz/CV32/Bootrom configuration shared by helper modules. +# ============================================================================== +# Spatz LLVM Toolchain [MAGIA/spatz/sw/Makefile] +# ============================================================================== +set(SPATZ_LLVM_PATH "$ENV{LLVM_INSTALL_DIR}" CACHE PATH "Path to Spatz LLVM installation") +if(NOT SPATZ_LLVM_PATH) + set(SPATZ_LLVM_PATH "${CMAKE_SOURCE_DIR}/../llvm/install" CACHE PATH "Path to Spatz LLVM installation" FORCE) +endif() +set(SPATZ_CLANG "${SPATZ_LLVM_PATH}/bin/clang" CACHE PATH "Path to Spatz clang") +set(SPATZ_OBJCOPY "${SPATZ_LLVM_PATH}/bin/llvm-objcopy" CACHE PATH "Path to Spatz llvm-objcopy") +set(SPATZ_OBJDUMP "${SPATZ_LLVM_PATH}/bin/llvm-objdump" CACHE PATH "Path to Spatz llvm-objdump") + +# ============================================================================== +# BOOTROM settings (used by add_spatz_bootrom) +# ============================================================================== +set(SPATZ_BOOTROM_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/bootrom/spatz_init.S" CACHE PATH "Spatz bootrom source") +set(SPATZ_BOOTROM_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/bootrom/spatz_init.ld" CACHE PATH "Spatz bootrom linker script") +set(SPATZ_BOOTROM_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin/bootrom") +set(SPATZ_BOOTROM_ELF "${SPATZ_BOOTROM_OUTPUT_DIR}/spatz_init.elf") +set(SPATZ_BOOTROM_BIN "${SPATZ_BOOTROM_OUTPUT_DIR}/spatz_init.bin") +set(SPATZ_BOOTROM_DUMP "${SPATZ_BOOTROM_OUTPUT_DIR}/spatz_init.dump") + +# ============================================================================== +# CV32 settings (used by add_cv32_executable_with_spatz) +# ============================================================================== + +# Paths +set(CV32_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/crt0.S" CACHE PATH "CV32 CRT0 assembly") +set(MAGIA_IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") +set(MAGIA_TARGET_INCLUDE_DIRS + "${CMAKE_SOURCE_DIR}/targets/magia_v2/include" + "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils" + "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map" + "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs" +) +set(MAGIA_CV32_EXTRA_INCLUDE_DIRS + "${CMAKE_SOURCE_DIR}/hal/include" + "${CMAKE_SOURCE_DIR}/drivers/eventunit32/include" +) -# Toolchain paths [MAGIA/spatz/sw/Makefile] -set(SPATZ_LLVM_PATH "${CMAKE_SOURCE_DIR}/../llvm/install" CACHE PATH "Path to Spatz LLVM installation") -set(SPATZ_CLANG "${SPATZ_LLVM_PATH}/bin/clang" CACHE PATHS "a") -set(SPATZ_OBJCOPY "${SPATZ_LLVM_PATH}/bin/llvm-objcopy" CACHE PATHS "b") -set(SPATZ_OBJDUMP "${SPATZ_LLVM_PATH}/bin/llvm-objdump" CACHE PATHS "c") +# ISA setup [MAGIA/Makefile] +set(CV32_ARCH rv CACHE STRING "CV32 ARCH prefix") +set(CV32_XLEN 32 CACHE STRING "CV32 XLEN") +set(CV32_XTEN imcxgap9 CACHE STRING "CV32 ISA extensions") +set(CV32_ABI ilp CACHE STRING "CV32 ABI prefix") +set(CV32_XABI f CACHE STRING "CV32 ABI extension") +set(CV32_MARCH "-march=${CV32_ARCH}${CV32_XLEN}${CV32_XTEN}") +set(CV32_MABI "-mabi=${CV32_ABI}${CV32_XLEN}${CV32_XABI}") -# Spatz configuration options [MAGIA/Makefile] +# Compiler flags [MAGIA/Makefile: CC_OPTS] +set(CV32_COMPILE_FLAGS + ${CV32_MARCH} + ${CV32_MABI} + "-D__riscv__" + "-O2" + "-g" + "-Wall" + "-Wextra" + "-Wno-unused-parameter" + "-Wno-unused-variable" + "-Wno-unused-function" + "-Wundef" + "-fdata-sections" + "-ffunction-sections" + "-MMD" + "-MP" +) + +# Linker flags [MAGIA/Makefile: LD_OPTS] +set(CV32_LINK_FLAGS + ${CV32_MARCH} + ${CV32_MABI} + "-D__riscv__" + "-MMD" + "-MP" + "-nostartfiles" + "-nostdlib" + "-Wl,--gc-sections" +) + +# ============================================================================== +# SPATZ settings (used by add_spatz_task) +# ============================================================================== + +# Paths +set(SPATZ_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_crt0.S" CACHE PATH "Spatz CRT0 assembly") +set(SPATZ_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_program.ld" CACHE PATH "Spatz linker script") + +# Spatz arch configuration options [MAGIA/Makefile] set(SPATZ_RVD 0 CACHE INT "0: 32-bit TCDM w/ ELEN=32, 1: 64-bit TCDM w/ ELEN=64") set(SPATZ_VLEN 256 CACHE INT "Vector length in bits (128, 256, 512, ...)") set(SPATZ_NRVREG 32 CACHE INT "Number of vector registers - RISC-V standar=32") @@ -20,12 +100,12 @@ set(SPATZ_XDMA 0 CACHE INT "0: DMA disabled, 1: enabled") set(SPATZ_RVF 1 CACHE INT "0: single-precision FP disabled, 1: enabled") set(SPATZ_RVV 1 CACHE INT "0: vector extension disabled, 1: enabled") -# Spatz ISA configuration [MAGIA/spatz/sw/Makefile] -set(SPATZ_ARCH rv CACHE STRING "Spatz ARCH prefix (e.g. rv)") -set(SPATZ_XLEN 32 CACHE STRING "Spatz XLEN (32 or 64)") -set(SPATZ_ABI ilp CACHE STRING "Spatz ABI prefix (e.g. ilp)") +# ISA setup [MAGIA/spatz/sw/Makefile] +set(SPATZ_ARCH rv CACHE STRING "Spatz ARCH prefix") +set(SPATZ_XLEN 32 CACHE STRING "Spatz XLEN") +set(SPATZ_ABI ilp CACHE STRING "Spatz ABI prefix") -# Build isa string dynamically [MAGIA/spatz/sw/Makefile] +# Build ISA string dynamically [MAGIA/spatz/sw/Makefile] set(SPATZ_XTEN "ima") if(SPATZ_RVD) set(SPATZ_XTEN "${SPATZ_XTEN}fd") @@ -36,30 +116,22 @@ elseif(SPATZ_RVF) else() set(SPATZ_XABI "32") endif() - if(SPATZ_RVV) set(SPATZ_XTEN "${SPATZ_XTEN}v") endif() - set(SPATZ_XTEN "${SPATZ_XTEN}_zfh") set(SPATZ_MARCH "-march=${SPATZ_ARCH}${SPATZ_XLEN}${SPATZ_XTEN}") set(SPATZ_MABI "-mabi=${SPATZ_ABI}${SPATZ_XABI}") -# CV32 configuration options [MAGIA/Makefile] -set(CV32_ARCH rv CACHE STRING "CV32 ARCH prefix (e.g. rv)") -set(CV32_XLEN 32 CACHE STRING "CV32 XLEN (32 or 64)") -set(CV32_XTEN imcxgap9 CACHE STRING "CV32 XTEN (ISA extensions)") -set(CV32_ABI ilp CACHE STRING "CV32 ABI prefix (e.g. ilp)") -set(CV32_XABI f CACHE STRING "CV32 XABI (32, 32f, 32d)") -set(CV32_MARCH "-march=${CV32_ARCH}${CV32_XLEN}${CV32_XTEN}") -set(CV32_MABI "-mabi=${CV32_ABI}${CV32_XLEN}${CV32_XABI}") - -# Compiler flags [MAGIA/spatz/sw/Makefile] -set(SPATZ_COMPILE_FLAGS +# Compiler and linker flags [MAGIA/spatz/sw/Makefile] +set(SPATZ_ARCH_FLAGS "--target=riscv32" ${SPATZ_MARCH} ${SPATZ_MABI} "-menable-experimental-extensions" +) +set(SPATZ_COMPILE_FLAGS + ${SPATZ_ARCH_FLAGS} "-static" "-nostartfiles" "-nostdlib" @@ -75,16 +147,6 @@ set(SPATZ_COMPILE_FLAGS "-fno-builtin" "-mcmodel=medany" ) - -# Architecture flags [MAGIA/spatz/sw/Makefile] -set(SPATZ_ARCH_FLAGS - "--target=riscv32" - ${SPATZ_MARCH} - ${SPATZ_MABI} - "-menable-experimental-extensions" - ) - -# Spatz defines [MAGIA/spatz/sw/Makefile] set(SPATZ_CFLAGS_DEFINES "-DSPATZ_RVD=${SPATZ_RVD}" "-DSPATZ_VLEN=${SPATZ_VLEN}" @@ -95,21 +157,18 @@ set(SPATZ_CFLAGS_DEFINES "-DSPATZ_RVF=${SPATZ_RVF}" "-DSPATZ_RVV=${SPATZ_RVV}" ) - -# Linker flags [MAGIA/spatz/sw/Makefile] set(SPATZ_LINK_FLAGS "-fuse-ld=${SPATZ_LLVM_PATH}/bin/ld.lld" "-Wl,-z,norelro" "-Wl,--allow-multiple-definition" ) -set(SPATZ_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_crt0.S" CACHE PATH "Spatz CRT0 assembly") -set(SPATZ_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/spatz/src/spatz_program.ld" CACHE PATH "Spatz linker script") -set(CV32_CRT0_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/crt0.S" CACHE PATH "CV32 CRT0 assembly") -set(CV32_LINK_SCRIPT "${CMAKE_SOURCE_DIR}/targets/magia_v2/link.ld" CACHE PATH "CV32 linker script") +# add_spatz_task defaults +set(SPATZ_TASK_DEFINE "-DSPATZ_TARGET") +set(SPATZ_TASK_OUTPUT_ROOT "${CMAKE_BINARY_DIR}/bin/spatz_on_magia") +set(SPATZ_TASK_BIN2HEADER_SCRIPT "${CMAKE_SOURCE_DIR}/scripts/bin2header.py") +set(SPATZ_TASK_EXTRACT_SYMBOLS_SCRIPT "${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh") +set(SPATZ_TASK_HEADER_SECTION ".spatz_binary") +set(SPATZ_TASK_HEADER_ADDRESS "dynamic (_spatz_binary_start)") -# Log info -message(STATUS "Spatz Configuration:") -message(STATUS " LLVM Path: ${SPATZ_LLVM_PATH}") -message(STATUS " ISA: rv32${SPATZ_XTEN}") -message(STATUS " VLEN: ${SPATZ_VLEN} bits") +message(STATUS "Spatz Configuration: LLVM=${SPATZ_LLVM_PATH}, ISA=rv32${SPATZ_XTEN}, VLEN=${SPATZ_VLEN}") diff --git a/cmake/spatz_helpers.cmake b/cmake/spatz_helpers.cmake index 177edee2..ecc72258 100644 --- a/cmake/spatz_helpers.cmake +++ b/cmake/spatz_helpers.cmake @@ -1,142 +1,97 @@ -# ============================================================================ -# Spatz Task Compilation and Embedding Helpers -# ============================================================================ -# -# This module provides two main CMake functions for building Spatz tasks -# and embedding them in CV32 executables: -# -# 1. add_spatz_task() -# - Compiles Spatz task binary -# - Generates header with embedded binary + task symbols -# - Outputs to: build/bin/spatz_on_magia//spatz_task/ -# -# 2. add_cv32_executable_with_spatz() -# - Builds CV32 executable with embedded Spatz binary -# - Generates disassembly -# - Outputs to: build/bin/ -# ============================================================================ - -include(${CMAKE_CURRENT_LIST_DIR}/spatz_config.cmake) - -# Function: add_spatz_task -# Compiles Spatz task binary, generates header with binary array + task symbols, and stimuli -# Parameters: -# TEST_NAME (required): Task identifier used for output file naming -# TASK_SOURCES (required): List of source files to compile -# CRT0_SRC: Path to CRT0 assembly (default: SPATZ_CRT0_SRC from config) -# LINKER_SCRIPT: Path to linker script (default: SPATZ_LINK_SCRIPT from config) -# OUTPUT_DIR: Base output directory (default: CMAKE_BINARY_DIR) -# OUTPUT_SPATZ_DIR: Spatz task output directory -# - If provided: use it directly -# - If not provided: use ${OUTPUT_DIR}/bin/spatz_on_magia/${TEST_NAME}/spatz_task -# OUTPUT_VAR: CMake variable to store TASK_HEADER path (default: ${TEST_NAME}_SPATZ_HEADER) -# FIRST_TASK_NAME: Entry point function name (default: ${TEST_NAME}_task) -# INCLUDE_DIRS: Additional include directories +# Helpers for building Spatz tasks and CV32 executables that embed them. + +# add_spatz_task( +# TEST_NAME +# TASK_SOURCES +# [FIRST_TASK_NAME ] +# [INCLUDE_DIRS ] +# ) +# Builds a Spatz task ELF/BIN/DUMP, generates _task_bin.h and exports +# per-test variables (_SPATZ_HEADER, _TASK_BIN, ...). function(add_spatz_task) set(options) - set(oneValueArgs TEST_NAME CRT0_SRC LINKER_SCRIPT OUTPUT_DIR OUTPUT_SPATZ_DIR OUTPUT_VAR FIRST_TASK_NAME) + set(oneValueArgs TEST_NAME FIRST_TASK_NAME) set(multiValueArgs TASK_SOURCES INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - # Apply defaults for optional parameters - if(NOT DEFINED ARG_CRT0_SRC) - set(ARG_CRT0_SRC ${SPATZ_CRT0_SRC}) - endif() - if(NOT DEFINED ARG_LINKER_SCRIPT) - set(ARG_LINKER_SCRIPT ${SPATZ_LINK_SCRIPT}) - endif() - if(NOT DEFINED ARG_OUTPUT_DIR) - set(ARG_OUTPUT_DIR ${CMAKE_BINARY_DIR}) - endif() - if(NOT DEFINED ARG_OUTPUT_VAR) - set(ARG_OUTPUT_VAR ${ARG_TEST_NAME}_SPATZ_HEADER) - endif() - if(NOT DEFINED ARG_FIRST_TASK_NAME) - set(ARG_FIRST_TASK_NAME ${ARG_TEST_NAME}_task) - endif() - - if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") - set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") + if(NOT ARG_TEST_NAME) + message(FATAL_ERROR "add_spatz_task requires TEST_NAME") endif() - if(NOT IS_ABSOLUTE "${ARG_LINKER_SCRIPT}") - set(ARG_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINKER_SCRIPT}") + if(NOT ARG_TASK_SOURCES) + message(FATAL_ERROR "add_spatz_task(${ARG_TEST_NAME}) requires TASK_SOURCES") endif() - - # Compute OUTPUT_SPATZ_DIR default if not provided - if(NOT DEFINED ARG_OUTPUT_SPATZ_DIR) - set(ARG_OUTPUT_SPATZ_DIR "${ARG_OUTPUT_DIR}/bin/spatz_on_magia/${ARG_TEST_NAME}/spatz_task") + if(NOT ARG_FIRST_TASK_NAME) + set(ARG_FIRST_TASK_NAME "${ARG_TEST_NAME}_task") endif() - set(SPATZ_OUTPUT_DIR "${ARG_OUTPUT_SPATZ_DIR}") - # Create output directory if it doesn't exist + # -------------------------------------------------------------------------- + # Paths and names + # -------------------------------------------------------------------------- + set(SPATZ_OUTPUT_DIR "${SPATZ_TASK_OUTPUT_ROOT}/${ARG_TEST_NAME}/spatz_task") file(MAKE_DIRECTORY "${SPATZ_OUTPUT_DIR}") - # Compute filename prefix: avoid double "_task" if TEST_NAME already ends with "_task" - # Logic: if TEST_NAME ends with "_task", use as-is; otherwise append "_task" string(REGEX MATCH "_task$" HAS_TASK_SUFFIX "${ARG_TEST_NAME}") if(HAS_TASK_SUFFIX) - # TEST_NAME already ends with "_task" (e.g., "double_task" -> use "double_task" directly) set(FILE_PREFIX "${ARG_TEST_NAME}") else() - # TEST_NAME doesn't end with "_task" (e.g., "hello_spatz" -> append "_task") set(FILE_PREFIX "${ARG_TEST_NAME}_task") endif() set(TASK_CRT0_OBJ "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_crt0.o") set(TASK_ELF "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.elf") set(TASK_BIN "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.bin") - set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_bin.h") set(TASK_DUMP "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}.dump") - set(SPATZ_IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") + set(TASK_HEADER "${SPATZ_OUTPUT_DIR}/${FILE_PREFIX}_bin.h") - set(INCLUDE_FLAGS "") - # Add targets/magia_v2 include paths - list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include") - list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils") - list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map") - list(APPEND INCLUDE_FLAGS "-I${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs") - # Add user-provided include directories + set(TASK_INCLUDE_FLAGS "") + foreach(INCLUDE_DIR ${MAGIA_TARGET_INCLUDE_DIRS}) + list(APPEND TASK_INCLUDE_FLAGS "-I${INCLUDE_DIR}") + endforeach() foreach(INCLUDE_DIR ${ARG_INCLUDE_DIRS}) - list(APPEND INCLUDE_FLAGS "-I${INCLUDE_DIR}") + list(APPEND TASK_INCLUDE_FLAGS "-I${INCLUDE_DIR}") endforeach() + # -------------------------------------------------------------------------- + # Custom commands + # -------------------------------------------------------------------------- + # Compile crt0.S [MAGIA/spatz/sw/Makefile: $(CRT0_OBJ)] add_custom_command( OUTPUT ${TASK_CRT0_OBJ} COMMAND ${SPATZ_CLANG} ${SPATZ_ARCH_FLAGS} -c -o ${TASK_CRT0_OBJ} - ${ARG_CRT0_SRC} - DEPENDS ${ARG_CRT0_SRC} + ${SPATZ_CRT0_SRC} + DEPENDS ${SPATZ_CRT0_SRC} COMMENT "[SPATZ] Compiling crt0..." VERBATIM ) - # Build ELF with crt0 + task sources [MAGIA/spatz/sw/Makefile: $(ELF)] + # Build ELF [MAGIA/spatz/sw/Makefile: $(ELF)] add_custom_command( OUTPUT ${TASK_ELF} COMMAND ${SPATZ_CLANG} ${SPATZ_COMPILE_FLAGS} ${SPATZ_CFLAGS_DEFINES} - -DSPATZ_TARGET - ${INCLUDE_FLAGS} + ${SPATZ_TASK_DEFINE} + ${TASK_INCLUDE_FLAGS} ${SPATZ_LINK_FLAGS} - -T${ARG_LINKER_SCRIPT} + -T${SPATZ_LINK_SCRIPT} -Wl,--defsym,__first_task=${ARG_FIRST_TASK_NAME} -o ${TASK_ELF} ${TASK_CRT0_OBJ} - ${SPATZ_IO_SRC} + ${MAGIA_IO_SRC} ${ARG_TASK_SOURCES} DEPENDS ${TASK_CRT0_OBJ} - ${SPATZ_IO_SRC} + ${MAGIA_IO_SRC} ${ARG_TASK_SOURCES} - ${ARG_LINKER_SCRIPT} + ${SPATZ_LINK_SCRIPT} COMMENT "[SPATZ] Building ELF..." VERBATIM ) - # Generate binary from ELF [MAGIA/spatz/sw/Makefile: $(BIN)] + # Generate binary [MAGIA/spatz/sw/Makefile: $(BIN)] add_custom_command( OUTPUT ${TASK_BIN} COMMAND ${SPATZ_OBJCOPY} -O binary ${TASK_ELF} ${TASK_BIN} @@ -154,26 +109,28 @@ function(add_spatz_task) VERBATIM ) - - set(BIN2HEADER_SCRIPT "${CMAKE_SOURCE_DIR}/scripts/bin2header.py") - - # Generate header with binary array [MAGIA/spatz/sw/Makefile: $(HEADER)] + # Generate header [MAGIA/spatz/sw/Makefile: $(HEADER)] add_custom_command( - OUTPUT ${TASK_HEADER} - # Python Script - COMMAND python3 ${BIN2HEADER_SCRIPT} + OUTPUT ${TASK_HEADER} + COMMAND python3 ${SPATZ_TASK_BIN2HEADER_SCRIPT} ${TASK_BIN} ${TASK_HEADER} --name ${ARG_TEST_NAME}_task_bin - --section .spatz_binary - --address "dynamic (_spatz_binary_start)" - # Extrac symbols - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh + --section ${SPATZ_TASK_HEADER_SECTION} + --address "${SPATZ_TASK_HEADER_ADDRESS}" + COMMAND bash ${SPATZ_TASK_EXTRACT_SYMBOLS_SCRIPT} ${ARG_TEST_NAME} ${TASK_ELF} ${TASK_HEADER} ${SPATZ_OBJDUMP} - DEPENDS ${TASK_BIN} ${TASK_ELF} ${BIN2HEADER_SCRIPT} ${CMAKE_SOURCE_DIR}/scripts/extract_task_symbols.sh - COMMENT "[SPATZ] Generating header and extracting task symbols..." - VERBATIM -) + DEPENDS + ${TASK_BIN} + ${TASK_ELF} + ${SPATZ_TASK_BIN2HEADER_SCRIPT} + ${SPATZ_TASK_EXTRACT_SYMBOLS_SCRIPT} + COMMENT "[SPATZ] Generating header and extracting task symbols..." + VERBATIM + ) + # -------------------------------------------------------------------------- + # Target and exported variables + # -------------------------------------------------------------------------- add_custom_target(${ARG_TEST_NAME}_spatz_header ALL DEPENDS ${TASK_HEADER} @@ -181,112 +138,65 @@ function(add_spatz_task) ${TASK_DUMP} ) - # Export to parent scope - set(${ARG_OUTPUT_VAR} ${TASK_HEADER} PARENT_SCOPE) + set(${ARG_TEST_NAME}_SPATZ_HEADER ${TASK_HEADER} PARENT_SCOPE) set(${ARG_TEST_NAME}_TASK_BIN ${TASK_BIN} PARENT_SCOPE) set(${ARG_TEST_NAME}_TASK_HEADER ${TASK_HEADER} PARENT_SCOPE) set(${ARG_TEST_NAME}_SPATZ_OUTPUT_DIR ${SPATZ_OUTPUT_DIR} PARENT_SCOPE) - # Also set generic SPATZ_HEADER for convenience when TEST_NAME==TARGET_NAME - set(SPATZ_HEADER ${TASK_HEADER} PARENT_SCOPE) - set(SPATZ_TASK_NAME ${ARG_TEST_NAME} PARENT_SCOPE) endfunction() -# Function: add_cv32_executable_with_spatz -# Builds CV32 executable with embedded Spatz task binary and generates disassembly -# Parameters: -# TARGET_NAME (required): Executable name -# SPATZ_HEADER (required): Path to Spatz task header file -# SOURCES (required): List of source files to compile -# CRT0_SRC: Path to CV32 CRT0 assembly (default: CV32_CRT0_SRC from config) -# INCLUDE_DIRS: Additional include directories -# Output locations: -# Executable: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME} -# Disassembly: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.s +# add_cv32_executable_with_spatz( +# TARGET_NAME +# SOURCES +# [INCLUDE_DIRS ] +# ) +# Builds a CV32 executable linked with runtime/hal. +# Requires `add_spatz_task(TEST_NAME )` to be called first in the +# same CMake scope. function(add_cv32_executable_with_spatz) set(options) - set(oneValueArgs TARGET_NAME SPATZ_HEADER CRT0_SRC) + set(oneValueArgs TARGET_NAME) set(multiValueArgs SOURCES INCLUDE_DIRS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - # Apply defaults for optional parameters - if(NOT DEFINED ARG_CRT0_SRC) - set(ARG_CRT0_SRC ${CV32_CRT0_SRC}) + if(NOT ARG_TARGET_NAME) + message(FATAL_ERROR "add_cv32_executable_with_spatz requires TARGET_NAME") endif() - - if(NOT IS_ABSOLUTE "${ARG_CRT0_SRC}") - set(ARG_CRT0_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_CRT0_SRC}") + if(NOT ARG_SOURCES) + message(FATAL_ERROR "add_cv32_executable_with_spatz(${ARG_TARGET_NAME}) requires SOURCES") + endif() + if(NOT DEFINED ${ARG_TARGET_NAME}_SPATZ_HEADER) + message(FATAL_ERROR "add_cv32_executable_with_spatz(${ARG_TARGET_NAME}) requires add_spatz_task(TEST_NAME ${ARG_TARGET_NAME}) first.") endif() - # Add io.c source to provide string functions for printf/prf.h - set(IO_SRC "${CMAKE_SOURCE_DIR}/targets/magia_v2/src/io.c") - add_executable(${ARG_TARGET_NAME} ${ARG_CRT0_SRC} ${ARG_SOURCES} ${IO_SRC}) + # -------------------------------------------------------------------------- + # Target definition + # -------------------------------------------------------------------------- + add_executable(${ARG_TARGET_NAME} + ${CV32_CRT0_SRC} + ${ARG_SOURCES} + ${MAGIA_IO_SRC} + ) + get_filename_component(SPATZ_HEADER_DIR "${${ARG_TARGET_NAME}_SPATZ_HEADER}" DIRECTORY) target_include_directories(${ARG_TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/inc - ${CMAKE_SOURCE_DIR}/targets/magia_v2/include - ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils - ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map - ${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs - ${CMAKE_SOURCE_DIR}/hal/include - ${CMAKE_SOURCE_DIR}/drivers/eventunit32/include + ${MAGIA_TARGET_INCLUDE_DIRS} + ${MAGIA_CV32_EXTRA_INCLUDE_DIRS} ${ARG_INCLUDE_DIRS} + ${SPATZ_HEADER_DIR} ) - if(ARG_SPATZ_HEADER) - get_filename_component(SPATZ_HEADER_DIR "${ARG_SPATZ_HEADER}" DIRECTORY) - target_include_directories(${ARG_TARGET_NAME} PRIVATE ${SPATZ_HEADER_DIR}) - endif() - + target_compile_options(${ARG_TARGET_NAME} PRIVATE ${CV32_COMPILE_FLAGS}) + target_link_options(${ARG_TARGET_NAME} PRIVATE ${CV32_LINK_FLAGS}) target_link_libraries(${ARG_TARGET_NAME} PUBLIC runtime hal) - # Compiler flags [MAGIA/Makefile: CC_OPTS] - target_compile_options(${ARG_TARGET_NAME} PRIVATE - ${CV32_MARCH} - ${CV32_MABI} - -D__riscv__ - -O2 - -g - -Wall - -Wextra - -Wno-unused-parameter - -Wno-unused-variable - -Wno-unused-function - -Wundef - -fdata-sections - -ffunction-sections - -MMD - -MP - ) - - # Linker flags [MAGIA/Makefile: LD_OPTS] - target_link_options(${ARG_TARGET_NAME} PRIVATE - ${CV32_MARCH} - ${CV32_MABI} - -D__riscv__ - -MMD - -MP - -nostartfiles - -nostdlib - -Wl,--gc-sections - ) - - if(ARG_SPATZ_HEADER) - # Use SPATZ_TASK_NAME if available (set by add_spatz_task), otherwise extract from header filename - if(DEFINED SPATZ_TASK_NAME) - set(EXTRACTED_TEST_NAME ${SPATZ_TASK_NAME}) - else() - # Fallback: extract TEST_NAME from header filename (legacy support) - get_filename_component(HEADER_FILENAME "${ARG_SPATZ_HEADER}" NAME) - string(REGEX REPLACE "_task_bin.*$" "" EXTRACTED_TEST_NAME "${HEADER_FILENAME}") - endif() - add_dependencies(${ARG_TARGET_NAME} ${EXTRACTED_TEST_NAME}_spatz_header) - endif() - + # -------------------------------------------------------------------------- + # Post-build dump + # -------------------------------------------------------------------------- set(ELF_DUMP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${ARG_TARGET_NAME}.s") add_custom_command(TARGET ${ARG_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -D -S $ > ${ELF_DUMP} VERBATIM ) - endfunction() diff --git a/targets/magia_v2/CMakeLists.txt b/targets/magia_v2/CMakeLists.txt index 86918596..4e6a054a 100644 --- a/targets/magia_v2/CMakeLists.txt +++ b/targets/magia_v2/CMakeLists.txt @@ -68,26 +68,7 @@ target_link_options(runtime -Wl,--gc-sections #ZL-MOD 03072025 ) - -# ==================== SPATZ INTEGRATION ==================== - -# Include Spatz configuration and helpers if Spatz is available -if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/spatz") - include(${CMAKE_SOURCE_DIR}/cmake/spatz_config.cmake) - include(${CMAKE_SOURCE_DIR}/cmake/spatz_helpers.cmake) - include(${CMAKE_SOURCE_DIR}/cmake/bootrom_helpers.cmake) - - # Build bootrom only if Spatz tests are enabled - if(SPATZ_TESTS) - add_spatz_bootrom( - BOOTROM_SRC ${CMAKE_CURRENT_LIST_DIR}/spatz/bootrom/spatz_init.S - LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/spatz/bootrom/spatz_init.ld - OUTPUT_DIR ${CMAKE_BINARY_DIR}/bin/bootrom - ) - message(STATUS "[MAGIA-SDK] Spatz integration enabled for magia_v2 (bootrom will be built)") - else() - message(STATUS "[MAGIA-SDK] Spatz integration disabled (SPATZ_TESTS=0)") - endif() +# Build bootrom only when Spatz tests are enabled. +if(SPATZ_TESTS) + add_spatz_bootrom() endif() - -# ========================================================= diff --git a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt index 7dc82bde..1adb6936 100644 --- a/tests/spatz_on_magia/hello_spatz/CMakeLists.txt +++ b/tests/spatz_on_magia/hello_spatz/CMakeLists.txt @@ -10,6 +10,5 @@ add_spatz_task( # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} - SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c ) diff --git a/tests/spatz_on_magia/onnx_add/CMakeLists.txt b/tests/spatz_on_magia/onnx_add/CMakeLists.txt index 371c3ca9..8ae16823 100644 --- a/tests/spatz_on_magia/onnx_add/CMakeLists.txt +++ b/tests/spatz_on_magia/onnx_add/CMakeLists.txt @@ -13,7 +13,6 @@ add_spatz_task( # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} - SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/test_data diff --git a/tests/spatz_on_magia/onnx_clip/CMakeLists.txt b/tests/spatz_on_magia/onnx_clip/CMakeLists.txt index 0cf56766..069cc94e 100644 --- a/tests/spatz_on_magia/onnx_clip/CMakeLists.txt +++ b/tests/spatz_on_magia/onnx_clip/CMakeLists.txt @@ -13,7 +13,6 @@ add_spatz_task( # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} - SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/test_data diff --git a/tests/spatz_on_magia/onnx_div/CMakeLists.txt b/tests/spatz_on_magia/onnx_div/CMakeLists.txt index 4c613aa5..1f597123 100644 --- a/tests/spatz_on_magia/onnx_div/CMakeLists.txt +++ b/tests/spatz_on_magia/onnx_div/CMakeLists.txt @@ -13,7 +13,6 @@ add_spatz_task( # Compile CV32 executable with embedded Spatz binary add_cv32_executable_with_spatz( TARGET_NAME ${TEST_NAME} - SPATZ_HEADER ${SPATZ_HEADER} SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.c INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/test_data From ff5c2fcac18d397dcac7453503a1162bf228474d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:12:02 +0100 Subject: [PATCH 63/67] [targets/magia_v2] magile_tile_utils: remove unused APIs --- .../magia_v2/include/utils/magia_tile_utils.h | 68 +------------------ 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/targets/magia_v2/include/utils/magia_tile_utils.h b/targets/magia_v2/include/utils/magia_tile_utils.h index 05cc75bc..a40c3672 100644 --- a/targets/magia_v2/include/utils/magia_tile_utils.h +++ b/targets/magia_v2/include/utils/magia_tile_utils.h @@ -125,70 +125,4 @@ static uint32_t get_time(){ return timel; } -static inline uint32_t get_mstatus(){ - uint32_t mstatus; - asm volatile("csrr %0, 0x300" :"=r"(mstatus):); // MSTATUS (0x300) - return mstatus; -} - -static inline void set_mstatus(uint32_t value){ - asm volatile("csrw 0x300, %0" ::"r"(value)); // MSTATUS (0x300) -} - -static inline uint32_t get_mtvec(){ - uint32_t mtvec; - asm volatile("csrr %0, 0x305" :"=r"(mtvec):); // MTVEC (0x305) - return mtvec; -} - -static inline void set_mtvec(uint32_t value){ - asm volatile("csrw 0x305, %0" ::"r"(value)); // MTVEC (0x305) -} - -static inline uint32_t get_mepc(){ - uint32_t mepc; - asm volatile("csrr %0, 0x341" :"=r"(mepc):); // MEPC (0x341) - return mepc; -} - -static inline void set_mepc(uint32_t value){ - asm volatile("csrw 0x341, %0" ::"r"(value)); // MEPC (0x341) -} - -static inline uint32_t get_mcause(){ - uint32_t mcause; - asm volatile("csrr %0, 0x342" :"=r"(mcause):); // MCAUSE (0x342) - return mcause; -} - -static inline uint32_t get_privlv(){ - uint32_t privlv; - asm volatile("csrr %0, 0xc10" :"=r"(privlv):); // PRIVLV (0xC10) - return privlv; -} - -static inline uint32_t get_uhartid(){ - uint32_t uhartid; - asm volatile("csrr %0, 0x014" :"=r"(uhartid):); // UHARTID (0x014) - return uhartid; -} - -// CV32E40P Performance Counter Functions -static inline void cv32e40p_ccount_enable(){ - asm volatile("csrw 0x7E0, %0" :: "r"(0x1)); // Enable PCCR[0] - asm volatile("csrw 0x7E1, %0" :: "r"(0x1)); // Enable counting, , no saturation -} - -// Read CV32E40P cycle counter -static inline uint32_t cv32e40p_get_cycles(){ - uint32_t cycles; - asm volatile("csrr %0, 0x780" : "=r"(cycles)); // Read PCCR[0] - return cycles; -} - -// Disable CV32E40P cycle counter -static inline void cv32e40p_ccount_disable(){ - asm volatile("csrw 0x7E1, %0" :: "r"(0x0)); // Disable counting -} - -#endif /*MAGIA_TILE_UTILS_H*/ +#endif /* MAGIA_TILE_UTILS_H */ From 89eaf35708821f9ac1fc546d49307964a31c85ce Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:12:54 +0100 Subject: [PATCH 64/67] [targets/magia_v2] removes unused spatz_perf_counters header file --- .../include/utils/spatz_perf_counters.h | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 targets/magia_v2/include/utils/spatz_perf_counters.h diff --git a/targets/magia_v2/include/utils/spatz_perf_counters.h b/targets/magia_v2/include/utils/spatz_perf_counters.h deleted file mode 100644 index 8f83a71e..00000000 --- a/targets/magia_v2/include/utils/spatz_perf_counters.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2023-2024 ETH Zurich and University of Bologna - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * SPDX-License-Identifier: Apache-2.0 - * - * Authors: Luca Balboni - * - * Performance Counter Utilities for Snitch - */ - -#ifndef __PERF_COUNTERS_H__ -#define __PERF_COUNTERS_H__ - -#include - -static inline uint32_t read_mcyclel(void) { - uint32_t cyclel; - asm volatile("csrr %0, mcycle" : "=r"(cyclel)); - return cyclel; -} - -static inline uint32_t read_mcycleh(void) { - uint32_t cycleh; - asm volatile("csrr %0, mcycleh" : "=r"(cycleh)); - return cycleh; -} - -static inline uint32_t read_mcycle(void) { - return read_mcyclel(); -} - -#define PERF_START() read_mcycle() -#define PERF_END(start) (read_mcycle() - (start)) - -#endif // __PERF_COUNTERS_H__ From fff7314be2048b47fee67f1ccbbb7ba513e6125d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:34:48 +0100 Subject: [PATCH 65/67] [targets/mavia_v2] move compare_utils from targets/../utils to tests --- cmake/spatz_config.cmake | 1 + targets/magia_v2/include/tile.h | 1 - .../utils => tests/spatz_on_magia/common}/compare_utils.h | 3 +-- tests/spatz_on_magia/onnx_add/main.c | 1 + tests/spatz_on_magia/onnx_clip/main.c | 1 + tests/spatz_on_magia/onnx_div/main.c | 1 + 6 files changed, 5 insertions(+), 3 deletions(-) rename {targets/magia_v2/include/utils => tests/spatz_on_magia/common}/compare_utils.h (94%) diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 2ce43af7..5eb84781 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -33,6 +33,7 @@ set(MAGIA_TARGET_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils" "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map" "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs" + "${CMAKE_SOURCE_DIR}/tests/spatz_on_magia/common" ) set(MAGIA_CV32_EXTRA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/hal/include" diff --git a/targets/magia_v2/include/tile.h b/targets/magia_v2/include/tile.h index 051c5f6b..6719eb6f 100644 --- a/targets/magia_v2/include/tile.h +++ b/targets/magia_v2/include/tile.h @@ -22,6 +22,5 @@ //#include "utils/amo_utils.h" #include "utils/eu_isa_utils.h" #include "utils/magia_spatz_utils.h" -#include "utils/compare_utils.h" #endif //_TILE_INCLUDE_GUARD_ diff --git a/targets/magia_v2/include/utils/compare_utils.h b/tests/spatz_on_magia/common/compare_utils.h similarity index 94% rename from targets/magia_v2/include/utils/compare_utils.h rename to tests/spatz_on_magia/common/compare_utils.h index 657e1ef6..df4e4a31 100644 --- a/targets/magia_v2/include/utils/compare_utils.h +++ b/tests/spatz_on_magia/common/compare_utils.h @@ -3,8 +3,7 @@ #include -#include "magia_tile_utils.h" -#include "printf.h" +#include "tile.h" #define TOLL 0x0011 diff --git a/tests/spatz_on_magia/onnx_add/main.c b/tests/spatz_on_magia/onnx_add/main.c index c8c28d71..a7b65ea8 100644 --- a/tests/spatz_on_magia/onnx_add/main.c +++ b/tests/spatz_on_magia/onnx_add/main.c @@ -1,6 +1,7 @@ #include "tile.h" #include "eventunit.h" +#include "compare_utils.h" #include "data.h" #include "onnx_add_mem_layout.h" #include "onnx_add_params.h" diff --git a/tests/spatz_on_magia/onnx_clip/main.c b/tests/spatz_on_magia/onnx_clip/main.c index d672a0d3..639c1785 100644 --- a/tests/spatz_on_magia/onnx_clip/main.c +++ b/tests/spatz_on_magia/onnx_clip/main.c @@ -1,6 +1,7 @@ #include "tile.h" #include "eventunit.h" +#include "compare_utils.h" #include "data.h" #include "onnx_clip_mem_layout.h" #include "onnx_clip_params.h" diff --git a/tests/spatz_on_magia/onnx_div/main.c b/tests/spatz_on_magia/onnx_div/main.c index bbe9a2d7..584c1803 100644 --- a/tests/spatz_on_magia/onnx_div/main.c +++ b/tests/spatz_on_magia/onnx_div/main.c @@ -1,6 +1,7 @@ #include "tile.h" #include "eventunit.h" +#include "compare_utils.h" #include "data.h" #include "onnx_div_mem_layout.h" #include "onnx_div_params.h" From 02d10a61490d41eb343b95e8ec9aaa3dad98bd5d Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:04:53 +0100 Subject: [PATCH 66/67] [drivers] eventunit: Fix return value for eu_spatz_wait --- drivers/eventunit32/src/eventunit32.c | 4 ++-- hal/include/eventunit.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/eventunit32/src/eventunit32.c b/drivers/eventunit32/src/eventunit32.c index 8841d821..4669e045 100644 --- a/drivers/eventunit32/src/eventunit32.c +++ b/drivers/eventunit32/src/eventunit32.c @@ -292,7 +292,7 @@ void eu32_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq) { * @param mode Wait mode (polling, WFE, etc.) * @return Non-zero if FSync completed, 0 if timeout/error */ -void eu32_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) { +uint32_t eu32_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) { uint32_t retval = eu_wait_events(EU_SPATZ_DONE_MASK, mode, 1000000); #if PROFILE_SNC == 1 stnl_snc_f(); @@ -354,7 +354,7 @@ extern uint32_t eu_fsync_has_error(eu_controller_t *ctrl) __attribute__((alias("eu32_fsync_has_error"), used, visibility("default"))); extern void eu_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq) __attribute__((alias("eu32_spatz_init"), used, visibility("default"))); -extern void eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) +extern uint32_t eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode) __attribute__((alias("eu32_spatz_wait"), used, visibility("default"))); extern uint32_t eu_spatz_is_done(eu_controller_t *ctrl) __attribute__((alias("eu32_spatz_is_done"), used, visibility("default"))); diff --git a/hal/include/eventunit.h b/hal/include/eventunit.h index 74bd5110..35754723 100644 --- a/hal/include/eventunit.h +++ b/hal/include/eventunit.h @@ -204,7 +204,7 @@ extern void eu_spatz_init(eu_controller_t *ctrl, uint32_t enable_irq); /** * @brief Wait for Spatz completion in WFE mode */ -extern void eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode); +extern uint32_t eu_spatz_wait(eu_controller_t *ctrl, eu_wait_mode_t mode); /** * @brief Check if Spatz has completed, non-blocking From 2616a62eccf5541ea993c25c9a14ad457ee2d4fb Mon Sep 17 00:00:00 2001 From: callme-sam <219649100+callme-sam@users.noreply.github.com> Date: Wed, 11 Mar 2026 09:53:45 +0100 Subject: [PATCH 67/67] [test/common] compare_utils: Refactor compare logic to use ULP and move common dir at test top-dir --- cmake/spatz_config.cmake | 2 +- tests/common/compare_utils.h | 95 +++++++++++++++++++++ tests/spatz_on_magia/common/compare_utils.h | 34 -------- 3 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 tests/common/compare_utils.h delete mode 100644 tests/spatz_on_magia/common/compare_utils.h diff --git a/cmake/spatz_config.cmake b/cmake/spatz_config.cmake index 5eb84781..801bb350 100644 --- a/cmake/spatz_config.cmake +++ b/cmake/spatz_config.cmake @@ -33,7 +33,7 @@ set(MAGIA_TARGET_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/utils" "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/addr_map" "${CMAKE_SOURCE_DIR}/targets/magia_v2/include/regs" - "${CMAKE_SOURCE_DIR}/tests/spatz_on_magia/common" + "${CMAKE_SOURCE_DIR}/tests/common" ) set(MAGIA_CV32_EXTRA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/hal/include" diff --git a/tests/common/compare_utils.h b/tests/common/compare_utils.h new file mode 100644 index 00000000..9ab44cbc --- /dev/null +++ b/tests/common/compare_utils.h @@ -0,0 +1,95 @@ +#ifndef COMPARE_UTILS_H_ +#define COMPARE_UTILS_H_ + +#include +#include + +#include "tile.h" + +/** + * One ULP is the difference between two consecutive FP16 numbers + * A tollerance of 8 ULP means that two values can differ by a maximum + * of 8 consecutive representable FP16 values. + */ +#define ULP_TOLL (8) + +/** + * @brief Check if a FP16 value is NaN or (+/-)Inf + * + * @param [in] x FP16 value represented as uint16_t + * + * In IEEE754 half precision: + * - exponent = 11111 (0x7C00) indicates special values + * - mantissa = 0 -> Inf + * - mantissa != 0 -> NaN + * + * @return true if NaN or Inf, false otherwise + */ +static inline bool fp16_is_invalid(uint16_t x) +{ + return (x & 0x7C00) == 0x7C00; +} + +/** + * @brief Convert a FP16 raw value into ordered I32 + * + * @param [in] uint16_t x FP16 value casted to uitn16_t + * + * If negative, remove sign (i % 0x7FFF) and invert order (0x8000 - ) + * If positive, move the value to the "upper" part of I32 range (i + 0x8000) + * + * @return int32_t {description} + */ +static inline int32_t fp16_to_ordered(uint16_t x) +{ + int32_t i = (int32_t) x; + return (i & 0x8000) ? (0x8000 - (i & 0x7FFF)) : (i + 0x8000); +} + +/** + * @brief Compare two FP16 vectors using Units in the Last Place tollerance + * + * @param [in] uintptr_t addr_res result vector start address + * @param [in] uintptr_t addr_exp expected vector start address + * @param [in] int len number of elements of the two vectors + * + * @return true if match, false otherwise + */ +static inline bool vector_compare_fp16_bitwise(uintptr_t addr_res, uintptr_t addr_exp, int len) { + uint16_t expected; + uint16_t result; + int32_t ord_exp; + int32_t ord_res; + uint32_t offset; + int32_t diff; + bool ret; + + ret = true; + for (int i = 0; i < len; i++) { + offset = i * sizeof (uint16_t); + + expected = mmio16(addr_exp + offset); + result = mmio16(addr_res + offset); + + /* Reject NaN or Inf */ + if (fp16_is_invalid(expected) || fp16_is_invalid(result)) { + printf("Invalid FP16 value at idx %d\t-\texpected: %x\t-\tcomputed: %x\n", i, expected, result); + ret = false; + continue; + } + + ord_exp = fp16_to_ordered(expected); + ord_res = fp16_to_ordered(result); + + diff = (ord_exp > ord_res) ? (ord_exp - ord_res) : (ord_res - ord_exp); + + if (diff > ULP_TOLL) { + printf("Mismatch at index %d\t-\texpected: %x\t-\tcomputed: %x\n", i, expected, result); + ret = false; + } + } + + return ret; +} + +#endif /* COMPARE_UTILS_H_ */ diff --git a/tests/spatz_on_magia/common/compare_utils.h b/tests/spatz_on_magia/common/compare_utils.h deleted file mode 100644 index df4e4a31..00000000 --- a/tests/spatz_on_magia/common/compare_utils.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef COMPARE_UTILS_H_ -#define COMPARE_UTILS_H_ - -#include - -#include "tile.h" - -#define TOLL 0x0011 - -static inline bool vector_compare_fp16_bitwise(uintptr_t addr_res, uintptr_t addr_exp, int len) { - volatile uint16_t val_exp; - volatile uint16_t val_res; - volatile uint16_t abs_diff; - uint32_t offset; - bool ret; - - ret = true; - for (int i = 0; i < len; i++) { - offset = i * sizeof (uint16_t); - - val_exp = mmio16(addr_exp + offset); - val_res = mmio16(addr_res + offset); - abs_diff = (val_exp > val_res) ? (val_exp - val_res) : (val_res - val_exp); - - if (abs_diff > TOLL) { - printf("Mismatch at index %d - expected raw: 0x%04x - computed raw: 0x%04x - abs_diff: 0x%04x\n", i, val_exp, val_res, abs_diff); - ret = false; - } - } - - return ret; -} - -#endif /* COMPARE_UTILS_H_ */