diff options
author | Jerry Ge <jerry.ge@arm.com> | 2024-06-14 20:09:53 +0000 |
---|---|---|
committer | Jerry Ge <jerry.ge@arm.com> | 2024-06-18 21:15:16 +0000 |
commit | 895822576f97ca9470709378e7ff122ccbea5d00 (patch) | |
tree | 373e54315f2bf2e27e78cb02378634f2321a3c3b | |
parent | ca6fa5fbc4af9f486d87d36c7baeff924edd0534 (diff) | |
download | serialization_lib-895822576f97ca9470709378e7ff122ccbea5d00.tar.gz |
Enable serialization_lib to load tosa schema directly from a header
- Implement convert_schema_to_header.py to convert tosa schema file to
tosa_schema.h
- Enable loading tosa schema directly from a string from the header file
Signed-off-by: Jerry Ge <jerry.ge@arm.com>
Change-Id: Iafcccf2a03fd8968acd2d12c0081e85c10a91ef4
-rw-r--r-- | .pre-commit-config.yaml | 2 | ||||
-rw-r--r-- | CMakeLists.txt | 7 | ||||
-rw-r--r-- | include/tosa_schema.h | 355 | ||||
-rw-r--r-- | include/tosa_serialization_handler.h | 1 | ||||
-rwxr-xr-x | regenerate_headers.sh | 1 | ||||
-rw-r--r-- | schema/convert_schema_to_header.py | 55 | ||||
-rw-r--r-- | src/tosa_serialization_handler.cpp | 16 |
7 files changed, 435 insertions, 2 deletions
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3afbd2d..a0886e9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: clang-format name: clang-format - exclude: tosa_generated.h|build|third_party + exclude: tosa_generated.h|build|third_party|tosa_schema.h language: system entry: clang-format types: ["c++"] diff --git a/CMakeLists.txt b/CMakeLists.txt index 1248d86..4adde30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,3 +112,10 @@ install(EXPORT TosaSerializationLibTargets NAMESPACE tosa:: DESTINATION ${TOSA_SERIALIZATION_LIB_CMAKE_DIR} ) + +# Run the following script to generate tosa schema as a C/C++ header file +find_package(Python COMPONENTS Interpreter REQUIRED) +execute_process( + COMMAND ${Python_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/schema/convert_schema_to_header.py" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/schema" +) diff --git a/include/tosa_schema.h b/include/tosa_schema.h new file mode 100644 index 0000000..0d645de --- /dev/null +++ b/include/tosa_schema.h @@ -0,0 +1,355 @@ +const char TOSA_SCHEMA[] = { +0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, +0x29, 0x20, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x32, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x41, 0x52, 0x4d, +0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, +0x20, 0x20, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, +0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, +0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, +0x30, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, +0x29, 0x3b, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, +0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, +0x6c, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, +0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, +0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, +0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, +0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, +0x65, 0x6e, 0x73, 0x65, 0x20, 0x61, 0x74, 0x0a, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, +0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, +0x6e, 0x73, 0x65, 0x73, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x2d, 0x32, 0x2e, 0x30, +0x0a, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x6c, 0x65, 0x73, 0x73, +0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x70, 0x70, +0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x61, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x61, +0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, +0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x2f, 0x2f, +0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, +0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, +0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, +0x20, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x20, 0x42, +0x41, 0x53, 0x49, 0x53, 0x2c, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x57, 0x49, 0x54, 0x48, +0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, +0x52, 0x20, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x20, 0x4f, 0x46, 0x20, +0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, +0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, +0x69, 0x65, 0x64, 0x2e, 0x0a, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, +0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, +0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x6c, 0x61, 0x6e, 0x67, +0x75, 0x61, 0x67, 0x65, 0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x70, +0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x2f, +0x2f, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, +0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, +0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x74, +0x6f, 0x73, 0x61, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, +0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, +0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, +0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x22, 0x54, 0x4f, 0x53, 0x41, 0x22, +0x3b, 0x0a, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, +0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, +0x65, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, +0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x22, 0x74, 0x6f, 0x73, 0x61, 0x22, 0x3b, +0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x4e, 0x4f, 0x54, 0x45, 0x3a, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x76, +0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, +0x68, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, +0x20, 0x62, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x0a, 0x2f, 0x2f, 0x20, 0x61, 0x74, +0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, +0x6c, 0x69, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, +0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x20, 0x73, 0x74, 0x61, +0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x44, 0x54, 0x79, 0x70, 0x65, +0x3a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x55, 0x4e, 0x4b, 0x4e, +0x4f, 0x57, 0x4e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x42, 0x4f, 0x4f, 0x4c, 0x2c, +0x0a, 0x20, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x38, 0x2c, 0x0a, 0x20, 0x20, 0x49, 0x4e, 0x54, 0x34, +0x2c, 0x0a, 0x20, 0x20, 0x49, 0x4e, 0x54, 0x38, 0x2c, 0x0a, 0x20, 0x20, 0x49, 0x4e, 0x54, 0x31, +0x36, 0x2c, 0x0a, 0x20, 0x20, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x49, 0x4e, +0x54, 0x34, 0x38, 0x2c, 0x0a, 0x20, 0x20, 0x46, 0x50, 0x33, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x55, +0x49, 0x4e, 0x54, 0x31, 0x36, 0x2c, 0x0a, 0x20, 0x20, 0x46, 0x50, 0x31, 0x36, 0x2c, 0x0a, 0x20, +0x20, 0x42, 0x46, 0x31, 0x36, 0x2c, 0x0a, 0x20, 0x20, 0x53, 0x48, 0x41, 0x50, 0x45, 0x2c, 0x0a, +0x20, 0x20, 0x46, 0x50, 0x38, 0x45, 0x34, 0x4d, 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x46, 0x50, 0x38, +0x45, 0x35, 0x4d, 0x32, 0x2c, 0x0a, 0x7d, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x52, 0x65, +0x73, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x20, +0x7b, 0x0a, 0x20, 0x20, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x20, 0x3d, 0x20, 0x30, 0x2c, +0x0a, 0x20, 0x20, 0x4e, 0x45, 0x41, 0x52, 0x45, 0x53, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x42, 0x49, +0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x2c, 0x0a, 0x7d, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x20, +0x4f, 0x70, 0x3a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x55, 0x4e, +0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x52, 0x47, +0x4d, 0x41, 0x58, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x56, 0x47, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x32, +0x44, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4f, 0x4e, 0x56, 0x32, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x43, +0x4f, 0x4e, 0x56, 0x33, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x44, 0x45, 0x50, 0x54, 0x48, 0x57, 0x49, +0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x56, 0x32, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x46, 0x55, 0x4c, +0x4c, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x2c, 0x0a, 0x20, 0x20, +0x4d, 0x41, 0x54, 0x4d, 0x55, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x50, 0x4f, +0x4f, 0x4c, 0x32, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x50, 0x4f, 0x53, +0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x56, 0x32, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4c, 0x41, 0x4d, +0x50, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x2c, 0x0a, 0x20, +0x20, 0x53, 0x49, 0x47, 0x4d, 0x4f, 0x49, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x54, 0x41, 0x4e, 0x48, +0x2c, 0x0a, 0x20, 0x20, 0x41, 0x44, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x52, 0x49, 0x54, 0x48, +0x4d, 0x45, 0x54, 0x49, 0x43, 0x5f, 0x52, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x48, 0x49, 0x46, +0x54, 0x2c, 0x0a, 0x20, 0x20, 0x42, 0x49, 0x54, 0x57, 0x49, 0x53, 0x45, 0x5f, 0x41, 0x4e, 0x44, +0x2c, 0x0a, 0x20, 0x20, 0x42, 0x49, 0x54, 0x57, 0x49, 0x53, 0x45, 0x5f, 0x4f, 0x52, 0x2c, 0x0a, +0x20, 0x20, 0x42, 0x49, 0x54, 0x57, 0x49, 0x53, 0x45, 0x5f, 0x58, 0x4f, 0x52, 0x2c, 0x0a, 0x20, +0x20, 0x49, 0x4e, 0x54, 0x44, 0x49, 0x56, 0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x49, 0x43, +0x41, 0x4c, 0x5f, 0x41, 0x4e, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, +0x4c, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x53, 0x48, 0x49, 0x46, 0x54, 0x2c, 0x0a, 0x20, 0x20, +0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x52, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x48, +0x49, 0x46, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x4f, +0x52, 0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x58, 0x4f, 0x52, +0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x41, 0x58, 0x49, 0x4d, 0x55, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x4d, +0x49, 0x4e, 0x49, 0x4d, 0x55, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x55, 0x4c, 0x2c, 0x0a, 0x20, +0x20, 0x50, 0x4f, 0x57, 0x2c, 0x0a, 0x20, 0x20, 0x53, 0x55, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x54, +0x41, 0x42, 0x4c, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x42, 0x53, 0x2c, 0x0a, 0x20, 0x20, 0x42, +0x49, 0x54, 0x57, 0x49, 0x53, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x45, +0x49, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4c, 0x5a, 0x2c, 0x0a, 0x20, 0x20, 0x45, 0x58, 0x50, +0x2c, 0x0a, 0x20, 0x20, 0x46, 0x4c, 0x4f, 0x4f, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, +0x2c, 0x0a, 0x20, 0x20, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x4e, 0x4f, 0x54, 0x2c, +0x0a, 0x20, 0x20, 0x4e, 0x45, 0x47, 0x41, 0x54, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x43, +0x49, 0x50, 0x52, 0x4f, 0x43, 0x41, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x53, 0x51, 0x52, 0x54, +0x2c, 0x0a, 0x20, 0x20, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x45, 0x51, +0x55, 0x41, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x2c, 0x0a, +0x20, 0x20, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x2c, +0x0a, 0x20, 0x20, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4e, 0x59, 0x2c, 0x0a, 0x20, +0x20, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x52, +0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x44, +0x55, 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x4e, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x44, 0x55, 0x43, +0x45, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x44, +0x55, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4f, 0x4e, 0x43, 0x41, +0x54, 0x2c, 0x0a, 0x20, 0x20, 0x50, 0x41, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x53, 0x48, +0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x45, 0x2c, 0x0a, +0x20, 0x20, 0x53, 0x4c, 0x49, 0x43, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x54, 0x49, 0x4c, 0x45, 0x2c, +0x0a, 0x20, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x50, 0x4f, 0x53, 0x45, 0x2c, 0x0a, 0x20, 0x20, +0x47, 0x41, 0x54, 0x48, 0x45, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x53, 0x43, 0x41, 0x54, 0x54, 0x45, +0x52, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x43, +0x41, 0x53, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x45, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x2c, 0x0a, +0x20, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x49, 0x44, 0x45, 0x4e, 0x54, +0x49, 0x54, 0x59, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x2c, 0x0a, 0x20, +0x20, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x46, 0x2c, 0x0a, 0x20, 0x20, 0x57, 0x48, 0x49, 0x4c, +0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, 0x20, 0x20, 0x46, 0x46, 0x54, 0x32, 0x44, 0x2c, +0x0a, 0x20, 0x20, 0x52, 0x46, 0x46, 0x54, 0x32, 0x44, 0x2c, 0x0a, 0x20, 0x20, 0x45, 0x52, 0x46, +0x2c, 0x0a, 0x20, 0x20, 0x44, 0x49, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x54, +0x5f, 0x53, 0x48, 0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4f, 0x4e, 0x43, 0x41, 0x54, +0x5f, 0x53, 0x48, 0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x44, 0x44, 0x5f, 0x53, 0x48, +0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x53, 0x55, 0x42, 0x5f, 0x53, 0x48, 0x41, 0x50, 0x45, +0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x55, 0x4c, 0x5f, 0x53, 0x48, 0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, +0x20, 0x44, 0x49, 0x56, 0x5f, 0x53, 0x48, 0x41, 0x50, 0x45, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x4f, +0x53, 0x2c, 0x0a, 0x20, 0x20, 0x53, 0x49, 0x4e, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x41, 0x53, 0x54, +0x5f, 0x53, 0x54, 0x4f, 0x43, 0x48, 0x41, 0x53, 0x54, 0x49, 0x43, 0x2c, 0x0a, 0x7d, 0x0a, 0x0a, +0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, +0x7b, 0x0a, 0x20, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, +0x65, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, +0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x43, +0x6f, 0x6e, 0x76, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, +0x50, 0x61, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, +0x41, 0x78, 0x69, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, +0x20, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, +0x2c, 0x0a, 0x20, 0x20, 0x43, 0x6c, 0x61, 0x6d, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, +0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x52, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x74, 0x74, +0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x75, 0x6c, 0x41, 0x74, 0x74, +0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, +0x65, 0x74, 0x69, 0x63, 0x52, 0x69, 0x67, 0x68, 0x74, 0x53, 0x68, 0x69, 0x66, 0x74, 0x41, 0x74, +0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x49, +0x66, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x57, 0x68, +0x69, 0x6c, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, +0x2c, 0x0a, 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, +0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x41, +0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x4d, 0x61, 0x74, 0x4d, +0x75, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x46, +0x75, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, +0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x65, +0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x43, 0x75, 0x73, +0x74, 0x6f, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, +0x46, 0x46, 0x54, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x20, 0x20, +0x52, 0x46, 0x46, 0x54, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x0a, 0x7d, +0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x64, 0x3a, 0x20, 0x5b, +0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, +0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, +0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, +0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, +0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x61, 0x63, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, +0x20, 0x44, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, +0x20, 0x43, 0x6f, 0x6e, 0x76, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, +0x0a, 0x20, 0x20, 0x70, 0x61, 0x64, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, +0x0a, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, +0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x64, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, +0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, +0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x77, 0x65, +0x69, 0x67, 0x68, 0x74, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, +0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x62, +0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x61, 0x63, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, +0x20, 0x44, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, +0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x76, 0x41, 0x74, +0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5f, +0x70, 0x61, 0x64, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, +0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, +0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x7a, 0x70, 0x3a, +0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, +0x62, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x61, +0x63, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x44, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x0a, +0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x50, 0x61, 0x64, 0x41, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x64, 0x5f, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x3a, 0x20, 0x5b, 0x75, 0x62, 0x79, 0x74, 0x65, 0x5d, 0x20, 0x28, 0x66, 0x6f, +0x72, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x38, 0x29, 0x3b, 0x0a, 0x7d, +0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x41, 0x78, 0x69, 0x73, 0x41, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, 0x78, 0x69, 0x73, 0x3a, 0x20, +0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, +0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, +0x7b, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x31, +0x36, 0x5d, 0x20, 0x28, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x29, 0x3b, +0x0a, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x31, +0x36, 0x5d, 0x20, 0x28, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x29, 0x3b, +0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x5b, 0x69, 0x6e, 0x74, 0x31, +0x36, 0x5d, 0x20, 0x28, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x29, 0x3b, +0x0a, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x4d, +0x6f, 0x64, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x43, 0x6c, +0x61, 0x6d, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, +0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x3a, 0x20, 0x5b, 0x75, 0x62, 0x79, 0x74, 0x65, +0x5d, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, +0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x3a, 0x20, 0x5b, +0x75, 0x62, 0x79, 0x74, 0x65, 0x5d, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x6c, +0x69, 0x67, 0x6e, 0x3a, 0x20, 0x38, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x52, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, +0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x7a, 0x70, 0x3a, +0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, +0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x63, +0x61, 0x6c, 0x65, 0x33, 0x32, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x64, +0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, +0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, +0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, +0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, +0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, +0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x4d, 0x75, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, +0x0a, 0x20, 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, +0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, +0x65, 0x74, 0x69, 0x63, 0x52, 0x69, 0x67, 0x68, 0x74, 0x53, 0x68, 0x69, 0x66, 0x74, 0x41, 0x74, +0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x75, 0x6e, +0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x49, 0x66, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, +0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, +0x3a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, +0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, +0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x68, 0x69, 0x6c, 0x65, 0x4c, 0x6f, +0x6f, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, +0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x69, +0x6e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, +0x3a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, +0x6c, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, +0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x3a, +0x20, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, +0x6c, 0x65, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, +0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x5b, 0x69, 0x6e, +0x74, 0x31, 0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x4d, +0x61, 0x74, 0x4d, 0x75, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, +0x0a, 0x20, 0x20, 0x61, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, +0x20, 0x20, 0x62, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x7d, +0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6e, +0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, +0x7b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, +0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x7a, 0x70, +0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, +0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x31, 0x5f, 0x7a, 0x70, 0x3a, +0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, +0x5f, 0x7a, 0x70, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, +0x61, 0x62, 0x6c, 0x65, 0x20, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, +0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, +0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x20, +0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x74, 0x72, +0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x3a, 0x5b, 0x75, 0x62, 0x79, +0x74, 0x65, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x46, 0x46, +0x54, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, +0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x0a, 0x20, 0x20, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, +0x6c, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x52, 0x46, 0x46, 0x54, +0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, +0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, +0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x3a, 0x20, 0x69, 0x6e, +0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x69, 0x6e, +0x6f, 0x72, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0x3b, 0x0a, +0x20, 0x20, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x20, +0x3d, 0x20, 0x2d, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x20, +0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, +0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, +0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, +0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, +0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2c, 0x20, 0x75, 0x73, +0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x64, +0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x0a, 0x20, 0x20, 0x73, 0x68, 0x61, 0x70, +0x65, 0x3a, 0x5b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5d, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, +0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, +0x6e, 0x73, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x44, 0x54, 0x79, 0x70, +0x65, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x64, 0x61, 0x74, 0x61, +0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6e, +0x73, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x5b, 0x75, 0x62, 0x79, +0x74, 0x65, 0x5d, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, +0x3a, 0x20, 0x38, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x72, 0x61, 0x77, 0x20, 0x64, +0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x27, +0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x6e, +0x73, 0x6f, 0x72, 0x2e, 0x0a, 0x20, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x3a, +0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x69, 0x73, 0x20, 0x74, +0x68, 0x69, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, +0x65, 0x6e, 0x73, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x75, 0x6e, 0x72, 0x61, 0x6e, +0x6b, 0x65, 0x64, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x68, 0x65, +0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, +0x75, 0x6e, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x0a, +0x20, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, +0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, +0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, +0x74, 0x65, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, +0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6f, 0x70, 0x3a, +0x4f, 0x70, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, +0x6f, 0x72, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, +0x75, 0x74, 0x65, 0x3a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x3b, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x72, +0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, +0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, +0x75, 0x74, 0x73, 0x3a, 0x5b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5d, 0x3b, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, +0x66, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x6e, +0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x3a, 0x5b, +0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5d, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x2f, 0x2f, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x70, +0x75, 0x74, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, +0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, 0x42, 0x61, 0x73, +0x69, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, +0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x62, 0x61, 0x73, 0x69, 0x63, 0x20, 0x62, +0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x72, +0x61, 0x74, 0x6f, 0x72, 0x73, 0x3a, 0x5b, 0x54, 0x6f, 0x73, 0x61, 0x4f, 0x70, 0x65, 0x72, 0x61, +0x74, 0x6f, 0x72, 0x5d, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, +0x72, 0x73, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, +0x72, 0x73, 0x3a, 0x5b, 0x54, 0x6f, 0x73, 0x61, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5d, 0x3b, +0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x20, +0x61, 0x72, 0x72, 0x61, 0x79, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x3a, 0x5b, +0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5d, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x61, +0x70, 0x68, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x70, +0x75, 0x74, 0x73, 0x3a, 0x5b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5d, 0x3b, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, +0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x0a, 0x7d, +0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, 0x52, 0x65, 0x67, 0x69, +0x6f, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x74, 0x72, 0x69, +0x6e, 0x67, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, +0x6e, 0x0a, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x3a, 0x5b, 0x54, 0x6f, 0x73, 0x61, +0x42, 0x61, 0x73, 0x69, 0x63, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5d, 0x3b, 0x20, 0x2f, 0x2f, 0x20, +0x62, 0x61, 0x73, 0x69, 0x63, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x72, 0x72, +0x61, 0x79, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, +0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, +0x6e, 0x3a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, +0x72, 0x65, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x3a, +0x5b, 0x54, 0x6f, 0x73, 0x61, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5d, 0x3b, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, +0x72, 0x72, 0x61, 0x79, 0x0a, 0x7d, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x74, 0x79, 0x70, +0x65, 0x20, 0x54, 0x6f, 0x73, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3b, 0x0a, 0x00 }; + +const size_t TOSA_SCHEMA_SIZE = 5629; diff --git a/include/tosa_serialization_handler.h b/include/tosa_serialization_handler.h index c09a47d..5b3882e 100644 --- a/include/tosa_serialization_handler.h +++ b/include/tosa_serialization_handler.h @@ -410,6 +410,7 @@ public: tosa_err_t SaveFileJson(const char* filename); tosa_err_t SaveFileTosaFlatbuffer(const char* filename); tosa_err_t LoadFileSchema(const char* schema_filename); + tosa_err_t LoadTosaSchema(); // data format conversion. little-endian. static tosa_err_t ConvertBF16toU8(const std::vector<bf16>& in, std::vector<uint8_t>& out); diff --git a/regenerate_headers.sh b/regenerate_headers.sh index 9fef94b..f01bd76 100755 --- a/regenerate_headers.sh +++ b/regenerate_headers.sh @@ -34,4 +34,3 @@ popd > /dev/null pushd python/ > /dev/null ../third_party/flatbuffers/flatc --python ../schema/tosa.fbs popd > /dev/null - diff --git a/schema/convert_schema_to_header.py b/schema/convert_schema_to_header.py new file mode 100644 index 0000000..99886a6 --- /dev/null +++ b/schema/convert_schema_to_header.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024, ARM Limited. +# +# 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. + +# This short python script converts the tosa flatbuffer schema file to a C/C++ header + +with open("tosa.fbs", "rb") as schema_file: + schema_string = schema_file.read().hex() + + # add trailing 00 + schema_string += "00" + + # split into bytes and add 0x for each byte + bytes_list = [schema_string[i : i + 2] for i in range(0, len(schema_string), 2)] + for i in range(len(bytes_list)): + bytes_list[i] = " 0x" + bytes_list[i] + + # construct the string with , delimiter + schema_string_splitted = ",".join(bytes_list) + + # wrap the long string into 16 bytes per new line + # each byte is of length 6 including the leading white space. e.g, " 0x1a," + # 6*16 = 96 + byte_group_16 = [ + schema_string_splitted[i : i + 96] + for i in range(0, len(schema_string_splitted), 96) + ] + for i in range(len(byte_group_16)): + # remove leading whitespace for each 16 bytes group string + byte_group_16[i] = byte_group_16[i][1:] + # glue back to the long string with new lines + schema_string_splitted_wrapped = "\n".join(byte_group_16) + + # construct the final long string + var_name = "const char TOSA_SCHEMA[] = {\n" + schema_string_splitted_wrapped = ( + var_name + schema_string_splitted_wrapped + " };\n\n" + ) + schema_size_var = "const size_t TOSA_SCHEMA_SIZE = " + schema_size_string = schema_size_var + str(len(bytes_list) - 1) + ";\n" + schema_file_string = schema_string_splitted_wrapped + schema_size_string + + # save to a header file + with open("../include/tosa_schema.h", "w") as schema_header_file: + schema_header_file.write(schema_file_string) diff --git a/src/tosa_serialization_handler.cpp b/src/tosa_serialization_handler.cpp index 06c0431..eb71b69 100644 --- a/src/tosa_serialization_handler.cpp +++ b/src/tosa_serialization_handler.cpp @@ -15,6 +15,7 @@ #include "tosa_serialization_handler.h" #include "half.hpp" +#include "tosa_schema.h" #include <iostream> using namespace tosa; @@ -235,6 +236,21 @@ tosa_err_t TosaSerializationHandler::LoadFileSchema(const char* schema_filename) return TOSA_OK; } +tosa_err_t TosaSerializationHandler::LoadTosaSchema() +{ + bool ok; + ok = _parser.Parse(TOSA_SCHEMA); + + if (!ok) + { + printf("Error parsing ISA schema contents \n"); + return TOSA_FILE_ERROR; + } + + _schemaLoaded = true; + return TOSA_OK; +} + tosa_err_t TosaSerializationHandler::LoadFileJson(const char* filename) { std::string jsonfile; |