diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..1a53109 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,103 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Coffee Crisis Arcade Edition is a 2-player cooperative arcade shooter built with C++20 and SDL3. Players defend coffee against giant balloons. The game targets Windows, Linux, macOS (Intel/Apple Silicon), Raspberry Pi, and Anbernic handhelds. + +## Build Commands + +The project uses both CMake and a top-level Makefile. The Makefile is the primary build interface. + +### CMake (generates compile_commands.json for IDE/linter support) +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Debug # configure +cmake --build build # build +``` + +### Makefile (direct compilation, platform-specific targets) +```bash +make linux # build for Linux +make linux_debug # debug build with -DDEBUG -DVERBOSE +make linux_release # release tar.gz with resources.pack +make windows # build for Windows (cross-compile or native) +make windows_debug # Windows debug build +make macos # build for macOS (arm64) +make raspi # build for Raspberry Pi +make anbernic # build for Anbernic (no shaders, arcade mode) +make no_audio # build without audio system +``` + +### Tools & Resources +```bash +make pack_tool # compile resource packer +make resources.pack # pack data/ into resources.pack (required for release builds) +make spirv # compile GLSL shaders to SPIR-V headers +``` + +### Code Quality +```bash +make format # run clang-format on all sources (or: cmake --build build --target format) +make format-check # check formatting without modifying +make tidy # run clang-tidy static analysis (cmake --build build --target tidy) +make tidy-fix # run clang-tidy with auto-fix +``` + +## Architecture + +### Singletons (core systems) +- **Director** (`source/director.hpp`) — Application state machine, orchestrates scene transitions (Logo → Intro → Title → Game → Credits/HiScore → Title) +- **Screen** (`source/screen.hpp`) — Window management, SDL3 GPU rendering pipeline, post-processing effects +- **Resource** (`source/resource.hpp`) — Asset loading/caching with PRELOAD and LAZY_LOAD modes, reads from `resources.pack` +- **Audio** (`source/audio.hpp`) — Music and SFX management +- **Input** (`source/input.hpp`) — Keyboard and gamepad input handling + +### Scenes (source/sections/) +Each scene is a self-contained class with update/render lifecycle. Scene flow is managed by Director. + +### Entity Managers +- `BalloonManager` / `BulletManager` — Object pool-based entity management +- `Player` — Two-player support (player 1: keyboard, player 2: gamepad) + +### Rendering Pipeline +- SDL3 GPU API (Vulkan/Metal/D3D12 backends) +- SPIR-V shaders compiled offline from GLSL (`data/shaders/`) via `glslc` +- Compiled shader headers embedded in `source/rendering/sdl3gpu/postfx_*_spv.h` +- macOS uses Metal (no SPIR-V compilation needed) + +### Configuration +- Game parameters: `config/param_320x240.txt`, `config/param_320x256.txt` +- Asset manifest: `config/assets.txt` +- Balloon formations: `config/formations.txt` +- Level definitions: `config/stages.txt` +- Gamepad mappings: `config/gamecontrollerdb.txt` + +### External Libraries (header-only/vendored in source/external/) +- nlohmann/json, fkyaml (YAML), stb_image, stb_vorbis, jail_audio + +## Code Style + +Enforced via `.clang-format` (Google-based) and `.clang-tidy`: + +- **Naming conventions**: Classes/structs `CamelCase`, methods/functions `camelBack`, variables/params `snake_case`, private/protected members `snake_case_` (trailing underscore), constants/constexpr `UPPER_CASE`, namespaces `CamelCase`, enum values `UPPER_CASE` +- 4-space indentation, no column limit, braces attach to statement +- clang-tidy treats all warnings as errors + +## Conditional Compilation Defines + +| Define | Purpose | +|--------|---------| +| `WINDOWS_BUILD` / `LINUX_BUILD` / `MACOS_BUILD` | Platform selection | +| `DEBUG` / `VERBOSE` | Debug output | +| `RELEASE_BUILD` | Release-specific code paths | +| `RECORDING` | Demo recording mode | +| `NO_SHADERS` | Disable shader pipeline (Anbernic) | +| `NO_AUDIO` | Build without audio | +| `ARCADE` | Arcade-specific mode | +| `MACOS_BUNDLE` | macOS .app bundle paths | +| `ANBERNIC` | Anbernic handheld build | + +## Language + +Code comments are in Spanish/Catalan. Game UI supports multiple languages via JSON files in `data/lang/`. diff --git a/CMakeLists.txt b/CMakeLists.txt index 31305c5..8a9d53c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,32 +123,43 @@ message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}") if(NOT APPLE) find_program(GLSLC_EXE NAMES glslc) - set(SHADER_VERT_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.vert") - set(SHADER_FRAG_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.frag") - set(SHADER_VERT_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/postfx_vert_spv.h") - set(SHADER_FRAG_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/postfx_frag_spv.h") + set(SHADER_VERT_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.vert") + set(SHADER_FRAG_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.frag") + set(SHADER_CRTPI_SRC "${CMAKE_SOURCE_DIR}/data/shaders/crtpi_frag.glsl") + set(SHADER_UPSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/upscale.frag") + set(SHADER_DOWNSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/downscale.frag") + + set(SHADER_VERT_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/postfx_vert_spv.h") + set(SHADER_FRAG_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/postfx_frag_spv.h") + set(SHADER_CRTPI_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/crtpi_frag_spv.h") + set(SHADER_UPSCALE_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/upscale_frag_spv.h") + set(SHADER_DOWNSCALE_H "${CMAKE_SOURCE_DIR}/source/rendering/sdl3gpu/downscale_frag_spv.h") + + set(ALL_SHADER_SOURCES "${SHADER_VERT_SRC}" "${SHADER_FRAG_SRC}" "${SHADER_CRTPI_SRC}" "${SHADER_UPSCALE_SRC}" "${SHADER_DOWNSCALE_SRC}") + set(ALL_SHADER_HEADERS "${SHADER_VERT_H}" "${SHADER_FRAG_H}" "${SHADER_CRTPI_H}" "${SHADER_UPSCALE_H}" "${SHADER_DOWNSCALE_H}") if(GLSLC_EXE) add_custom_command( - OUTPUT "${SHADER_VERT_H}" "${SHADER_FRAG_H}" + OUTPUT ${ALL_SHADER_HEADERS} COMMAND "${CMAKE_SOURCE_DIR}/tools/shaders/compile_spirv.sh" - DEPENDS "${SHADER_VERT_SRC}" "${SHADER_FRAG_SRC}" + DEPENDS ${ALL_SHADER_SOURCES} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" COMMENT "Compilando shaders SPIR-V..." ) - add_custom_target(shaders DEPENDS "${SHADER_VERT_H}" "${SHADER_FRAG_H}") + add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS}) message(STATUS "glslc encontrado: shaders se compilarán automáticamente") else() - if(NOT EXISTS "${SHADER_VERT_H}" OR NOT EXISTS "${SHADER_FRAG_H}") - message(FATAL_ERROR - "glslc no encontrado y headers SPIR-V no existen.\n" - " Instala glslc: sudo apt install glslang-tools (Linux)\n" - " choco install vulkan-sdk (Windows)\n" - " O genera los headers manualmente: tools/shaders/compile_spirv.sh" - ) - else() - message(STATUS "glslc no encontrado - usando headers SPIR-V precompilados") - endif() + foreach(_h IN LISTS ALL_SHADER_HEADERS) + if(NOT EXISTS "${_h}") + message(FATAL_ERROR + "glslc no encontrado y header SPIR-V no existe: ${_h}\n" + " Instala glslc: sudo apt install glslang-tools (Linux)\n" + " choco install vulkan-sdk (Windows)\n" + " O genera los headers manualmente: tools/shaders/compile_spirv.sh" + ) + endif() + endforeach() + message(STATUS "glslc no encontrado - usando headers SPIR-V precompilados") endif() else() message(STATUS "macOS: shaders SPIR-V omitidos (usa Metal)") diff --git a/config/assets.txt b/config/assets.txt index d4be10f..1abc35d 100644 --- a/config/assets.txt +++ b/config/assets.txt @@ -7,6 +7,7 @@ DATA|${SYSTEM_FOLDER}/config.yaml|optional,absolute DATA|${SYSTEM_FOLDER}/controllers.json|optional,absolute DATA|${SYSTEM_FOLDER}/postfx.yaml|optional,absolute +DATA|${SYSTEM_FOLDER}/crtpi.yaml|optional,absolute DATA|${SYSTEM_FOLDER}/score.bin|optional,absolute # Archivos de configuración del juego diff --git a/data/shaders/crtpi_frag.glsl b/data/shaders/crtpi_frag.glsl new file mode 100644 index 0000000..48f0fa3 --- /dev/null +++ b/data/shaders/crtpi_frag.glsl @@ -0,0 +1,152 @@ +#version 450 + +// Vulkan GLSL fragment shader — CRT-Pi PostFX +// Algoritmo de scanlines continuas con pesos gaussianos, bloom y máscara de fósforo. +// Basado en el shader CRT-Pi original (GLSL 3.3), portado a GLSL 4.50 con parámetros uniformes. +// +// Compile: glslc -fshader-stage=frag --target-env=vulkan1.0 crtpi_frag.glsl -o crtpi_frag.spv +// xxd -i crtpi_frag.spv > ../../source/core/rendering/sdl3gpu/crtpi_frag_spv.h + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D Texture; + +layout(set = 3, binding = 0) uniform CrtPiBlock { + // vec4 #0 + float scanline_weight; // Ajuste gaussiano de scanlines (default 6.0) + float scanline_gap_brightness; // Brillo mínimo entre scanlines (default 0.12) + float bloom_factor; // Factor de brillo en zonas iluminadas (default 3.5) + float input_gamma; // Gamma de entrada — linealización (default 2.4) + // vec4 #1 + float output_gamma; // Gamma de salida — codificación (default 2.2) + float mask_brightness; // Brillo sub-píxeles de la máscara (default 0.80) + float curvature_x; // Distorsión barrel eje X (default 0.05) + float curvature_y; // Distorsión barrel eje Y (default 0.10) + // vec4 #2 + int mask_type; // 0=ninguna, 1=verde/magenta, 2=RGB fósforo + int enable_scanlines; // 0 = off, 1 = on + int enable_multisample; // 0 = off, 1 = on (antialiasing analítico de scanlines) + int enable_gamma; // 0 = off, 1 = on + // vec4 #3 + int enable_curvature; // 0 = off, 1 = on + int enable_sharper; // 0 = off, 1 = on + float texture_width; // Ancho del canvas lógico en píxeles + float texture_height; // Alto del canvas lógico en píxeles +} u; + +// Distorsión barrel CRT +vec2 distort(vec2 coord, vec2 screen_scale) { + vec2 curvature = vec2(u.curvature_x, u.curvature_y); + vec2 barrel_scale = 1.0 - (0.23 * curvature); + coord *= screen_scale; + coord -= vec2(0.5); + float rsq = coord.x * coord.x + coord.y * coord.y; + coord += coord * (curvature * rsq); + coord *= barrel_scale; + if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5) { + return vec2(-1.0); // fuera de pantalla + } + coord += vec2(0.5); + coord /= screen_scale; + return coord; +} + +float calcScanLineWeight(float dist) { + return max(1.0 - dist * dist * u.scanline_weight, u.scanline_gap_brightness); +} + +float calcScanLine(float dy, float filter_width) { + float weight = calcScanLineWeight(dy); + if (u.enable_multisample != 0) { + weight += calcScanLineWeight(dy - filter_width); + weight += calcScanLineWeight(dy + filter_width); + weight *= 0.3333333; + } + return weight; +} + +void main() { + vec2 tex_size = vec2(u.texture_width, u.texture_height); + + // filterWidth: equivalente al original (768.0 / TextureSize.y) / 3.0 + float filter_width = (768.0 / u.texture_height) / 3.0; + + vec2 texcoord = v_uv; + + // Curvatura barrel opcional + if (u.enable_curvature != 0) { + texcoord = distort(texcoord, vec2(1.0, 1.0)); + if (texcoord.x < 0.0) { + out_color = vec4(0.0, 0.0, 0.0, 1.0); + return; + } + } + + vec2 texcoord_in_pixels = texcoord * tex_size; + vec2 tc; + float scan_line_weight; + + if (u.enable_sharper != 0) { + // Modo SHARPER: filtrado bicúbico-like con subpixel sharpen + vec2 temp_coord = floor(texcoord_in_pixels) + 0.5; + tc = temp_coord / tex_size; + vec2 deltas = texcoord_in_pixels - temp_coord; + scan_line_weight = calcScanLine(deltas.y, filter_width); + vec2 signs = sign(deltas); + deltas.x *= 2.0; + deltas = deltas * deltas; + deltas.y = deltas.y * deltas.y; + deltas.x *= 0.5; + deltas.y *= 8.0; + deltas /= tex_size; + deltas *= signs; + tc = tc + deltas; + } else { + // Modo estándar + float temp_y = floor(texcoord_in_pixels.y) + 0.5; + float y_coord = temp_y / tex_size.y; + float dy = texcoord_in_pixels.y - temp_y; + scan_line_weight = calcScanLine(dy, filter_width); + float sign_y = sign(dy); + dy = dy * dy; + dy = dy * dy; + dy *= 8.0; + dy /= tex_size.y; + dy *= sign_y; + tc = vec2(texcoord.x, y_coord + dy); + } + + vec3 colour = texture(Texture, tc).rgb; + + if (u.enable_scanlines != 0) { + if (u.enable_gamma != 0) { + colour = pow(colour, vec3(u.input_gamma)); + } + colour *= scan_line_weight * u.bloom_factor; + if (u.enable_gamma != 0) { + colour = pow(colour, vec3(1.0 / u.output_gamma)); + } + } + + // Máscara de fósforo + if (u.mask_type == 1) { + float which_mask = fract(gl_FragCoord.x * 0.5); + vec3 mask = (which_mask < 0.5) + ? vec3(u.mask_brightness, 1.0, u.mask_brightness) + : vec3(1.0, u.mask_brightness, 1.0); + colour *= mask; + } else if (u.mask_type == 2) { + float which_mask = fract(gl_FragCoord.x * 0.3333333); + vec3 mask = vec3(u.mask_brightness); + if (which_mask < 0.3333333) + mask.x = 1.0; + else if (which_mask < 0.6666666) + mask.y = 1.0; + else + mask.z = 1.0; + colour *= mask; + } + + out_color = vec4(colour, 1.0); +} diff --git a/data/shaders/downscale.frag b/data/shaders/downscale.frag new file mode 100644 index 0000000..fe5b9b5 --- /dev/null +++ b/data/shaders/downscale.frag @@ -0,0 +1,48 @@ +#version 450 +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D source; + +layout(set = 3, binding = 0) uniform DownscaleUniforms { + int algorithm; // 0 = Lanczos2 (ventana 2, ±2 taps), 1 = Lanczos3 (ventana 3, ±3 taps) + float pad0; + float pad1; + float pad2; +} u; + +// Kernel Lanczos normalizado: sinc(t) * sinc(t/a) para |t| < a, 0 fuera. +float lanczos(float t, float a) { + t = abs(t); + if (t < 0.0001) { return 1.0; } + if (t >= a) { return 0.0; } + const float PI = 3.14159265358979; + float pt = PI * t; + return (a * sin(pt) * sin(pt / a)) / (pt * pt); +} + +void main() { + vec2 src_size = vec2(textureSize(source, 0)); + // Posición en coordenadas de texel (centros de texel en N+0.5) + vec2 p = v_uv * src_size; + vec2 p_floor = floor(p); + + float a = (u.algorithm == 0) ? 2.0 : 3.0; + int win = int(a); + + vec4 color = vec4(0.0); + float weight_sum = 0.0; + + for (int j = -win; j <= win; j++) { + for (int i = -win; i <= win; i++) { + // Centro del texel (i,j) relativo a p_floor + vec2 tap_center = p_floor + vec2(float(i), float(j)) + 0.5; + vec2 offset = tap_center - p; + float w = lanczos(offset.x, a) * lanczos(offset.y, a); + color += texture(source, tap_center / src_size) * w; + weight_sum += w; + } + } + + out_color = (weight_sum > 0.0) ? (color / weight_sum) : vec4(0.0, 0.0, 0.0, 1.0); +} diff --git a/data/shaders/upscale.frag b/data/shaders/upscale.frag new file mode 100644 index 0000000..fb9200d --- /dev/null +++ b/data/shaders/upscale.frag @@ -0,0 +1,15 @@ +#version 450 + +// Vulkan GLSL fragment shader — Nearest-neighbour upscale pass +// Used as the first render pass when supersampling is active. +// Compile: glslc upscale.frag -o upscale.frag.spv +// xxd -i upscale.frag.spv > ../../source/core/rendering/sdl3gpu/upscale_frag_spv.h + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D scene; + +void main() { + out_color = texture(scene, v_uv); +} diff --git a/source/animated_sprite.hpp b/source/animated_sprite.hpp index 41a806c..5b89748 100644 --- a/source/animated_sprite.hpp +++ b/source/animated_sprite.hpp @@ -57,13 +57,13 @@ class AnimatedSprite : public MovingSprite { void update(float delta_time) override; // Actualiza la animación (time-based) // --- Control de animaciones --- - void setCurrentAnimation(const std::string& name = "default", bool reset = true); // Establece la animación por nombre - void setCurrentAnimation(int index = 0, bool reset = true); // Establece la animación por índice - void resetAnimation(); // Reinicia la animación actual - void setAnimationSpeed(float value); // Establece la velocidad de la animación + void setCurrentAnimation(const std::string& name = "default", bool reset = true); // Establece la animación por nombre + void setCurrentAnimation(int index = 0, bool reset = true); // Establece la animación por índice + void resetAnimation(); // Reinicia la animación actual + void setAnimationSpeed(float value); // Establece la velocidad de la animación [[nodiscard]] auto getAnimationSpeed() const -> float { return animations_[current_animation_].speed; } // Obtiene la velocidad de la animación actual - void animtionPause() { animations_[current_animation_].paused = true; } // Detiene la animación - void animationResume() { animations_[current_animation_].paused = false; } // Reanuda la animación + void animtionPause() { animations_[current_animation_].paused = true; } // Detiene la animación + void animationResume() { animations_[current_animation_].paused = false; } // Reanuda la animación [[nodiscard]] auto getCurrentAnimationFrame() const -> size_t { return animations_[current_animation_].current_frame; } // Obtiene el numero de frame de la animación actual // --- Consultas --- diff --git a/source/asset.hpp b/source/asset.hpp index 269afaf..7b62633 100644 --- a/source/asset.hpp +++ b/source/asset.hpp @@ -34,7 +34,7 @@ class Asset { void add(const std::string& file_path, Type type, bool required = true, bool absolute = false); void loadFromFile(const std::string& config_file_path, const std::string& prefix = "", const std::string& system_folder = ""); // Con soporte para variables [[nodiscard]] auto getPath(const std::string& filename) const -> std::string; - [[nodiscard]] auto loadData(const std::string& filename) const -> std::vector; // Carga datos del archivo + [[nodiscard]] auto loadData(const std::string& filename) const -> std::vector; // Carga datos del archivo [[nodiscard]] auto check() const -> bool; [[nodiscard]] auto getListByType(Type type) const -> std::vector; [[nodiscard]] auto exists(const std::string& filename) const -> bool; // Nueva función para verificar existencia diff --git a/source/balloon_formations.cpp b/source/balloon_formations.cpp index ad106c5..3014ba2 100644 --- a/source/balloon_formations.cpp +++ b/source/balloon_formations.cpp @@ -1,7 +1,6 @@ #include "balloon_formations.hpp" #include // Para max, min, copy -#include // Para std::cmp_less #include // Para array #include // Para isdigit #include // Para size_t @@ -11,6 +10,7 @@ #include // Para map, operator==, _Rb_tree_iterator #include // Para basic_istringstream #include // Para string, char_traits, allocator, operator==, stoi, getline, operator<=>, basic_string +#include // Para std::cmp_less #include "asset.hpp" // Para Asset #include "balloon.hpp" // Para Balloon diff --git a/source/defaults.hpp b/source/defaults.hpp index e19afbc..4215e3d 100644 --- a/source/defaults.hpp +++ b/source/defaults.hpp @@ -186,8 +186,11 @@ namespace Defaults::Video { constexpr bool FULLSCREEN = false; constexpr bool VSYNC = true; constexpr bool INTEGER_SCALE = true; - constexpr bool POSTFX = false; - constexpr int SUPERSAMPLING = 1; + constexpr bool GPU_ACCELERATION = true; + constexpr bool SHADER_ENABLED = false; + constexpr bool SUPERSAMPLING = false; + constexpr bool LINEAR_UPSCALE = false; + constexpr int DOWNSCALE_ALGO = 1; } // namespace Defaults::Video namespace Defaults::Music { diff --git a/source/director.cpp b/source/director.cpp index 280f477..b5d3443 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -103,13 +103,15 @@ void Director::init() { Input::init(Asset::get()->getPath("gamecontrollerdb.txt"), Asset::get()->getPath("controllers.json")); // Carga configuración de controles Logger::section("INIT CONFIG"); - Options::setConfigFile(Asset::get()->getPath("config.yaml")); // Establece el fichero de configuración + Options::setConfigFile(Asset::get()->getPath("config.yaml")); // Establece el fichero de configuración Options::setControllersFile(Asset::get()->getPath("controllers.json")); // Establece el fichero de configuración de mandos Options::setPostFXFile(Asset::get()->getPath("postfx.yaml")); // Establece el fichero de presets PostFX - Options::loadFromFile(); // Carga el archivo de configuración - Options::loadPostFXFromFile(); // Carga los presets PostFX - loadParams(); // Carga los parámetros del programa - loadScoreFile(); // Carga el archivo de puntuaciones + Options::setCrtPiFile(Asset::get()->getPath("crtpi.yaml")); // Establece el fichero de presets CrtPi + Options::loadFromFile(); // Carga el archivo de configuración + Options::loadPostFXFromFile(); // Carga los presets PostFX + Options::loadCrtPiFromFile(); // Carga los presets CrtPi + loadParams(); // Carga los parámetros del programa + loadScoreFile(); // Carga el archivo de puntuaciones // Inicialización de subsistemas principales Lang::setLanguage(Options::settings.language); // Carga el archivo de idioma diff --git a/source/enter_name.hpp b/source/enter_name.hpp index 934a549..65abdfa 100644 --- a/source/enter_name.hpp +++ b/source/enter_name.hpp @@ -33,8 +33,8 @@ class EnterName { private: // --- Variables de estado --- std::string character_list_{"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{"}; // Lista de caracteres permitidos - std::string name_; // Nombre en proceso - size_t selected_index_ = 0; // Índice del carácter seleccionado en "character_list_" + std::string name_; // Nombre en proceso + size_t selected_index_ = 0; // Índice del carácter seleccionado en "character_list_" [[nodiscard]] auto sanitizeName(const std::string& name) const -> std::string; // Valida y limpia el nombre static auto getRandomName() -> std::string; // Devuelve un nombre al azar diff --git a/source/fade.hpp b/source/fade.hpp index 30436cb..f0af3bc 100644 --- a/source/fade.hpp +++ b/source/fade.hpp @@ -72,7 +72,7 @@ class Fade { int num_squares_width_; // Cuadrados en horizontal int num_squares_height_; // Cuadrados en vertical int square_transition_duration_; // Duración de transición de cada cuadrado en ms - int fading_duration_{0}; // Duración del estado FADING en milisegundos + int fading_duration_{0}; // Duración del estado FADING en milisegundos Uint32 fading_start_time_ = 0; // Tiempo de inicio del estado FADING int post_duration_ = 0; // Duración posterior en milisegundos Uint32 post_start_time_ = 0; // Tiempo de inicio del estado POST diff --git a/source/global_events.cpp b/source/global_events.cpp index f30b2d4..e35c0a1 100644 --- a/source/global_events.cpp +++ b/source/global_events.cpp @@ -54,7 +54,7 @@ namespace GlobalEvents { break; case SDL_EVENT_WINDOW_RESIZED: - Screen::initPostFX(); + Screen::initShaders(); break; default: diff --git a/source/global_inputs.cpp b/source/global_inputs.cpp index c9e1357..ac7f140 100644 --- a/source/global_inputs.cpp +++ b/source/global_inputs.cpp @@ -62,25 +62,36 @@ namespace GlobalInputs { Notifier::get()->show({Lang::getText("[NOTIFICATIONS] 14") + " " + boolToOnOff(Options::video.vsync)}); } - // Activa o desactiva los efectos PostFX - void togglePostFX() { - Screen::togglePostFX(); - Notifier::get()->show({Lang::getText("[NOTIFICATIONS] 13") + " " + boolToOnOff(Options::video.postfx)}); + // Activa o desactiva los shaders + void toggleShaders() { + Screen::toggleShaders(); + Notifier::get()->show({Lang::getText("[NOTIFICATIONS] 13") + " " + boolToOnOff(Options::video.shader.enabled)}); } - // Avanza al siguiente preset PostFX - void nextPostFXPreset() { - Screen::nextPostFXPreset(); - const std::string name = Options::postfx_presets.empty() ? "" : Options::postfx_presets.at(static_cast(Options::current_postfx_preset)).name; - Notifier::get()->show({"PostFX: " + name}); + // Cambia entre PostFX y CrtPi + void nextShader() { + Screen::nextShader(); + const std::string SHADER_NAME = (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) ? "CrtPi" : "PostFX"; + Notifier::get()->show({"Shader: " + SHADER_NAME}); } - // Activa o desactiva el supersampling 3x + // Avanza al siguiente preset PostFX o CrtPi según shader activo + void nextPreset() { + if (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) { + Screen::nextCrtPiPreset(); + const std::string name = Options::crtpi_presets.empty() ? "" : Options::crtpi_presets.at(static_cast(Options::video.shader.current_crtpi_preset)).name; + Notifier::get()->show({"CrtPi: " + name}); + } else { + Screen::nextPostFXPreset(); + const std::string name = Options::postfx_presets.empty() ? "" : Options::postfx_presets.at(static_cast(Options::video.shader.current_postfx_preset)).name; + Notifier::get()->show({"PostFX: " + name}); + } + } + + // Activa o desactiva el supersampling void toggleSupersampling() { Screen::toggleSupersampling(); - const int SS = Options::video.supersampling; - const std::string SS_LABEL = (SS <= 1) ? "OFF" : (std::to_string(SS) + "\xC3\x97"); - Notifier::get()->show({"SS: " + SS_LABEL}); + Notifier::get()->show({"SS: " + std::string(Options::video.supersampling.enabled ? "ON" : "OFF")}); } // Cambia al siguiente idioma @@ -202,11 +213,15 @@ namespace GlobalInputs { } if (Input::get()->checkAction(Input::Action::TOGGLE_VIDEO_POSTFX, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) { - togglePostFX(); + toggleShaders(); + return true; + } + if (Input::get()->checkAction(Input::Action::NEXT_SHADER, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) { + nextShader(); return true; } if (Input::get()->checkAction(Input::Action::NEXT_POSTFX_PRESET, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) { - nextPostFXPreset(); + nextPreset(); return true; } if (Input::get()->checkAction(Input::Action::TOGGLE_SUPERSAMPLING, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) { diff --git a/source/input.hpp b/source/input.hpp index 4c2fcb7..6fc604f 100644 --- a/source/input.hpp +++ b/source/input.hpp @@ -82,6 +82,7 @@ class Input { {Action::WINDOW_INC_SIZE, KeyState(SDL_SCANCODE_F2)}, {Action::WINDOW_FULLSCREEN, KeyState(SDL_SCANCODE_F3)}, {Action::TOGGLE_VIDEO_POSTFX, KeyState(SDL_SCANCODE_F4)}, + {Action::NEXT_SHADER, KeyState(SDL_SCANCODE_8)}, {Action::NEXT_POSTFX_PRESET, KeyState(SDL_SCANCODE_9)}, {Action::TOGGLE_SUPERSAMPLING, KeyState(SDL_SCANCODE_0)}, {Action::TOGGLE_VIDEO_INTEGER_SCALE, KeyState(SDL_SCANCODE_F5)}, diff --git a/source/input_types.cpp b/source/input_types.cpp index 06c646a..7e1ef02 100644 --- a/source/input_types.cpp +++ b/source/input_types.cpp @@ -22,6 +22,7 @@ const std::unordered_map ACTION_TO_STRING = { {InputAction::WINDOW_INC_SIZE, "WINDOW_INC_SIZE"}, {InputAction::WINDOW_DEC_SIZE, "WINDOW_DEC_SIZE"}, {InputAction::TOGGLE_VIDEO_POSTFX, "TOGGLE_VIDEO_POSTFX"}, + {InputAction::NEXT_SHADER, "NEXT_SHADER"}, {InputAction::NEXT_POSTFX_PRESET, "NEXT_POSTFX_PRESET"}, {InputAction::TOGGLE_SUPERSAMPLING, "TOGGLE_SUPERSAMPLING"}, {InputAction::TOGGLE_VIDEO_INTEGER_SCALE, "TOGGLE_VIDEO_INTEGER_SCALE"}, @@ -54,6 +55,7 @@ const std::unordered_map STRING_TO_ACTION = { {"WINDOW_INC_SIZE", InputAction::WINDOW_INC_SIZE}, {"WINDOW_DEC_SIZE", InputAction::WINDOW_DEC_SIZE}, {"TOGGLE_VIDEO_POSTFX", InputAction::TOGGLE_VIDEO_POSTFX}, + {"NEXT_SHADER", InputAction::NEXT_SHADER}, {"NEXT_POSTFX_PRESET", InputAction::NEXT_POSTFX_PRESET}, {"TOGGLE_SUPERSAMPLING", InputAction::TOGGLE_SUPERSAMPLING}, {"TOGGLE_VIDEO_INTEGER_SCALE", InputAction::TOGGLE_VIDEO_INTEGER_SCALE}, diff --git a/source/input_types.hpp b/source/input_types.hpp index c4fe226..c46ced7 100644 --- a/source/input_types.hpp +++ b/source/input_types.hpp @@ -32,6 +32,7 @@ enum class InputAction : int { // Acciones de entrada posibles en el juego WINDOW_INC_SIZE, WINDOW_DEC_SIZE, TOGGLE_VIDEO_POSTFX, + NEXT_SHADER, NEXT_POSTFX_PRESET, TOGGLE_SUPERSAMPLING, TOGGLE_VIDEO_INTEGER_SCALE, diff --git a/source/options.cpp b/source/options.cpp index 6990a15..dd3330a 100644 --- a/source/options.cpp +++ b/source/options.cpp @@ -8,7 +8,7 @@ #include // Para string #include // Para vector -#include "difficulty.hpp" // Para Code, init +#include "difficulty.hpp" // Para Code, init #include "external/fkyaml_node.hpp" // Para fkyaml::node #include "input.hpp" // Para Input #include "lang.hpp" // Para getText, Code @@ -24,16 +24,17 @@ namespace Options { GamepadManager gamepad_manager; // Opciones de mando para cada jugador Keyboard keyboard; // Opciones para el teclado PendingChanges pending_changes; // Opciones que se aplican al cerrar - std::vector postfx_presets = { // Lista de presets de PostFX - {"CRT", 0.6F, 0.7F, 0.15F, 0.5F, 0.5F, 0.0F, 0.0F, 0.0F}, - {"NTSC", 0.4F, 0.5F, 0.2F, 0.3F, 0.3F, 0.0F, 0.6F, 0.0F}, - {"CURVED", 0.5F, 0.6F, 0.1F, 0.4F, 0.4F, 0.8F, 0.0F, 0.0F}, - {"SCANLINES", 0.0F, 0.8F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}, - {"SUBTLE", 0.3F, 0.4F, 0.05F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F}, - {"CRT LIVE", 0.5F, 0.6F, 0.3F, 0.3F, 0.4F, 0.3F, 0.4F, 0.8F}, + std::vector postfx_presets = { + {"CRT", 0.6F, 0.7F, 0.15F, 0.5F, 0.5F, 0.0F, 0.0F, 0.0F}, + {"NTSC", 0.4F, 0.5F, 0.2F, 0.3F, 0.3F, 0.0F, 0.6F, 0.0F}, + {"CURVED", 0.5F, 0.6F, 0.1F, 0.4F, 0.4F, 0.8F, 0.0F, 0.0F}, + {"SCANLINES", 0.0F, 0.8F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}, + {"SUBTLE", 0.3F, 0.4F, 0.05F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F}, + {"CRT LIVE", 0.5F, 0.6F, 0.3F, 0.3F, 0.4F, 0.3F, 0.4F, 0.8F}, }; - int current_postfx_preset = 0; // Índice del preset PostFX activo - std::string postfx_file_path; // Ruta al fichero de presets PostFX + std::string postfx_file_path; + std::vector crtpi_presets; + std::string crtpi_file_path; // Establece el fichero de configuración void setConfigFile(const std::string& file_path) { settings.config_file = file_path; } @@ -44,6 +45,9 @@ namespace Options { // Establece la ruta del fichero de PostFX void setPostFXFile(const std::string& path) { postfx_file_path = path; } + // Establece la ruta del fichero de CrtPi + void setCrtPiFile(const std::string& path) { crtpi_file_path = path; } + // Helper: extrae un campo float de un nodo YAML si existe, ignorando errores de conversión static void parseFloatField(const fkyaml::node& node, const std::string& key, float& target) { if (node.contains(key)) { @@ -89,11 +93,21 @@ namespace Options { } if (!postfx_presets.empty()) { - current_postfx_preset = std::clamp( - current_postfx_preset, 0, + // Resolver nombre → índice + if (!video.shader.current_postfx_preset_name.empty()) { + for (int i = 0; i < static_cast(postfx_presets.size()); ++i) { + if (postfx_presets[static_cast(i)].name == video.shader.current_postfx_preset_name) { + video.shader.current_postfx_preset = i; + break; + } + } + } + video.shader.current_postfx_preset = std::clamp( + video.shader.current_postfx_preset, + 0, static_cast(postfx_presets.size()) - 1); } else { - current_postfx_preset = 0; + video.shader.current_postfx_preset = 0; } SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "PostFX file loaded: %zu preset(s)", postfx_presets.size()); @@ -190,17 +204,141 @@ namespace Options { // Cargar los presets recién escritos postfx_presets.clear(); - postfx_presets.push_back({"CRT", 0.6F, 0.7F, 0.15F, 0.5F, 0.5F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"NTSC", 0.4F, 0.5F, 0.2F, 0.3F, 0.3F, 0.0F, 0.6F, 0.0F}); - postfx_presets.push_back({"CURVED", 0.5F, 0.6F, 0.1F, 0.4F, 0.4F, 0.8F, 0.0F, 0.0F}); - postfx_presets.push_back({"SCANLINES", 0.0F, 0.8F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"SUBTLE", 0.3F, 0.4F, 0.05F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F}); - postfx_presets.push_back({"CRT LIVE", 0.5F, 0.6F, 0.3F, 0.3F, 0.4F, 0.3F, 0.4F, 0.8F}); - current_postfx_preset = 0; + postfx_presets.push_back({"CRT", 0.6F, 0.7F, 0.15F, 0.5F, 0.5F, 0.0F, 0.0F, 0.0F}); + postfx_presets.push_back({"NTSC", 0.4F, 0.5F, 0.2F, 0.3F, 0.3F, 0.0F, 0.6F, 0.0F}); + postfx_presets.push_back({"CURVED", 0.5F, 0.6F, 0.1F, 0.4F, 0.4F, 0.8F, 0.0F, 0.0F}); + postfx_presets.push_back({"SCANLINES", 0.0F, 0.8F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}); + postfx_presets.push_back({"SUBTLE", 0.3F, 0.4F, 0.05F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F}); + postfx_presets.push_back({"CRT LIVE", 0.5F, 0.6F, 0.3F, 0.3F, 0.4F, 0.3F, 0.4F, 0.8F}); + video.shader.current_postfx_preset = 0; return true; } + // Helper: extrae un campo bool de un nodo YAML si existe, ignorando errores + static void parseBoolField(const fkyaml::node& node, const std::string& key, bool& target) { + if (node.contains(key)) { + try { + target = node[key].get_value(); + } catch (...) {} + } + } + + // Helper: extrae un campo int de un nodo YAML si existe, ignorando errores + static void parseIntField(const fkyaml::node& node, const std::string& key, int& target) { + if (node.contains(key)) { + try { + target = node[key].get_value(); + } catch (...) {} + } + } + + // Rellena los presets CrtPi por defecto + static void populateDefaultCrtPiPresets() { + crtpi_presets.clear(); + crtpi_presets.push_back({"DEFAULT", 6.0F, 0.12F, 3.5F, 2.4F, 2.2F, 0.80F, 0.05F, 0.10F, 2, true, true, true, false, false}); + crtpi_presets.push_back({"CURVED", 6.0F, 0.12F, 3.5F, 2.4F, 2.2F, 0.80F, 0.05F, 0.10F, 2, true, true, true, true, false}); + crtpi_presets.push_back({"SHARP", 6.0F, 0.12F, 3.5F, 2.4F, 2.2F, 0.80F, 0.05F, 0.10F, 2, true, false, true, false, true}); + crtpi_presets.push_back({"MINIMAL", 8.0F, 0.05F, 2.0F, 2.4F, 2.2F, 1.00F, 0.0F, 0.0F, 0, true, false, false, false, false}); + } + + // Escribe los presets CrtPi por defecto al fichero + static auto saveCrtPiDefaults() -> bool { + if (crtpi_file_path.empty()) { return false; } + std::ofstream file(crtpi_file_path); + if (!file.is_open()) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error: %s can't be opened for writing", crtpi_file_path.c_str()); + return false; + } + file << "# Coffee Crisis Arcade Edition - CrtPi Shader Presets\n"; + file << "# scanline_weight: gaussian adjustment (higher = narrower scanlines, default 6.0)\n"; + file << "# scanline_gap_brightness: min brightness between scanlines (0.0-1.0, default 0.12)\n"; + file << "# bloom_factor: brightness for bright areas (default 3.5)\n"; + file << "# input_gamma: input gamma - linearization (default 2.4)\n"; + file << "# output_gamma: output gamma - encoding (default 2.2)\n"; + file << "# mask_brightness: sub-pixel brightness (default 0.80)\n"; + file << "# curvature_x/y: barrel CRT distortion (0.0 = flat)\n"; + file << "# mask_type: 0=none, 1=green/magenta, 2=RGB phosphor\n"; + file << "# enable_scanlines/multisample/gamma/curvature/sharper: true/false\n"; + file << "\npresets:\n"; + file << " - name: \"DEFAULT\"\n scanline_weight: 6.0\n scanline_gap_brightness: 0.12\n bloom_factor: 3.5\n input_gamma: 2.4\n output_gamma: 2.2\n mask_brightness: 0.80\n curvature_x: 0.05\n curvature_y: 0.10\n mask_type: 2\n enable_scanlines: true\n enable_multisample: true\n enable_gamma: true\n enable_curvature: false\n enable_sharper: false\n"; + file << " - name: \"CURVED\"\n scanline_weight: 6.0\n scanline_gap_brightness: 0.12\n bloom_factor: 3.5\n input_gamma: 2.4\n output_gamma: 2.2\n mask_brightness: 0.80\n curvature_x: 0.05\n curvature_y: 0.10\n mask_type: 2\n enable_scanlines: true\n enable_multisample: true\n enable_gamma: true\n enable_curvature: true\n enable_sharper: false\n"; + file << " - name: \"SHARP\"\n scanline_weight: 6.0\n scanline_gap_brightness: 0.12\n bloom_factor: 3.5\n input_gamma: 2.4\n output_gamma: 2.2\n mask_brightness: 0.80\n curvature_x: 0.05\n curvature_y: 0.10\n mask_type: 2\n enable_scanlines: true\n enable_multisample: false\n enable_gamma: true\n enable_curvature: false\n enable_sharper: true\n"; + file << " - name: \"MINIMAL\"\n scanline_weight: 8.0\n scanline_gap_brightness: 0.05\n bloom_factor: 2.0\n input_gamma: 2.4\n output_gamma: 2.2\n mask_brightness: 1.00\n curvature_x: 0.0\n curvature_y: 0.0\n mask_type: 0\n enable_scanlines: true\n enable_multisample: false\n enable_gamma: false\n enable_curvature: false\n enable_sharper: false\n"; + file.close(); + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "CrtPi file created with defaults: %s", crtpi_file_path.c_str()); + populateDefaultCrtPiPresets(); + return true; + } + + // Carga los presets de CrtPi desde el fichero + auto loadCrtPiFromFile() -> bool { + crtpi_presets.clear(); + + std::ifstream file(crtpi_file_path); + if (!file.good()) { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "CrtPi file not found, creating default: %s", crtpi_file_path.c_str()); + return saveCrtPiDefaults(); + } + + std::string content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + try { + auto yaml = fkyaml::node::deserialize(content); + + if (yaml.contains("presets")) { + const auto& presets = yaml["presets"]; + for (const auto& p : presets) { + CrtPiPreset preset; + if (p.contains("name")) { + preset.name = p["name"].get_value(); + } + parseFloatField(p, "scanline_weight", preset.scanline_weight); + parseFloatField(p, "scanline_gap_brightness", preset.scanline_gap_brightness); + parseFloatField(p, "bloom_factor", preset.bloom_factor); + parseFloatField(p, "input_gamma", preset.input_gamma); + parseFloatField(p, "output_gamma", preset.output_gamma); + parseFloatField(p, "mask_brightness", preset.mask_brightness); + parseFloatField(p, "curvature_x", preset.curvature_x); + parseFloatField(p, "curvature_y", preset.curvature_y); + parseIntField(p, "mask_type", preset.mask_type); + parseBoolField(p, "enable_scanlines", preset.enable_scanlines); + parseBoolField(p, "enable_multisample", preset.enable_multisample); + parseBoolField(p, "enable_gamma", preset.enable_gamma); + parseBoolField(p, "enable_curvature", preset.enable_curvature); + parseBoolField(p, "enable_sharper", preset.enable_sharper); + crtpi_presets.push_back(preset); + } + } + + if (!crtpi_presets.empty()) { + // Resolver nombre → índice + if (!video.shader.current_crtpi_preset_name.empty()) { + for (int i = 0; i < static_cast(crtpi_presets.size()); ++i) { + if (crtpi_presets[static_cast(i)].name == video.shader.current_crtpi_preset_name) { + video.shader.current_crtpi_preset = i; + break; + } + } + } + video.shader.current_crtpi_preset = std::clamp( + video.shader.current_crtpi_preset, + 0, + static_cast(crtpi_presets.size()) - 1); + } else { + video.shader.current_crtpi_preset = 0; + } + + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "CrtPi file loaded: %zu preset(s)", crtpi_presets.size()); + return true; + + } catch (const fkyaml::exception& e) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Error parsing CrtPi YAML: %s. Recreating defaults.", e.what()); + return saveCrtPiDefaults(); + } + } + // Inicializa las opciones del programa void init() { // Dificultades @@ -234,55 +372,109 @@ namespace Options { const auto& vid = yaml["video"]; if (vid.contains("fullscreen")) { - try { video.fullscreen = vid["fullscreen"].get_value(); } catch (...) {} + try { + video.fullscreen = vid["fullscreen"].get_value(); + } catch (...) {} } if (vid.contains("scale_mode")) { - try { video.scale_mode = static_cast(vid["scale_mode"].get_value()); } catch (...) {} + try { + video.scale_mode = static_cast(vid["scale_mode"].get_value()); + } catch (...) {} } if (vid.contains("vsync")) { - try { video.vsync = vid["vsync"].get_value(); } catch (...) {} + try { + video.vsync = vid["vsync"].get_value(); + } catch (...) {} } if (vid.contains("integer_scale")) { - try { video.integer_scale = vid["integer_scale"].get_value(); } catch (...) {} + try { + video.integer_scale = vid["integer_scale"].get_value(); + } catch (...) {} } - if (vid.contains("postfx")) { - try { video.postfx = vid["postfx"].get_value(); } catch (...) {} - } - // Nuevo formato: supersampling (bool) + supersampling_amount (int) - // Backward compat: si solo existe supersampling como int, también funciona - { - bool ss_enabled = false; - int ss_amount = 3; - if (vid.contains("supersampling")) { + + // --- GPU --- + if (vid.contains("gpu")) { + const auto& gpu_node = vid["gpu"]; + if (gpu_node.contains("acceleration")) { try { - const auto& node = vid["supersampling"]; - if (node.is_boolean()) { - ss_enabled = node.get_value(); + video.gpu.acceleration = gpu_node["acceleration"].get_value(); + } catch (...) {} + } + if (gpu_node.contains("preferred_driver")) { + try { + video.gpu.preferred_driver = gpu_node["preferred_driver"].get_value(); + } catch (...) {} + } + } + + // --- Shader config --- + if (vid.contains("shader")) { + const auto& sh = vid["shader"]; + if (sh.contains("enabled")) { + try { + video.shader.enabled = sh["enabled"].get_value(); + } catch (...) {} + } + if (sh.contains("current_shader")) { + try { + auto s = sh["current_shader"].get_value(); + video.shader.current_shader = (s == "crtpi") ? Rendering::ShaderType::CRTPI : Rendering::ShaderType::POSTFX; + } catch (...) {} + } + if (sh.contains("postfx_preset")) { + try { + video.shader.current_postfx_preset_name = sh["postfx_preset"].get_value(); + } catch (...) {} + } + if (sh.contains("crtpi_preset")) { + try { + video.shader.current_crtpi_preset_name = sh["crtpi_preset"].get_value(); + } catch (...) {} + } + } else if (vid.contains("postfx")) { + // Backward compat: formato antiguo plano + try { + video.shader.enabled = vid["postfx"].get_value(); + } catch (...) {} + if (vid.contains("postfx_preset")) { + try { + int preset = vid["postfx_preset"].get_value(); + if (preset >= 0) { video.shader.current_postfx_preset = preset; } + } catch (...) {} + } + } + + // --- Supersampling --- + if (vid.contains("supersampling")) { + const auto& ss_node = vid["supersampling"]; + if (ss_node.is_mapping()) { + // Nuevo formato anidado + if (ss_node.contains("enabled")) { + try { + video.supersampling.enabled = ss_node["enabled"].get_value(); + } catch (...) {} + } + if (ss_node.contains("linear_upscale")) { + try { + video.supersampling.linear_upscale = ss_node["linear_upscale"].get_value(); + } catch (...) {} + } + if (ss_node.contains("downscale_algo")) { + try { + video.supersampling.downscale_algo = ss_node["downscale_algo"].get_value(); + } catch (...) {} + } + } else { + // Backward compat: bool o int + try { + if (ss_node.is_boolean()) { + video.supersampling.enabled = ss_node.get_value(); } else { - // Formato antiguo: int directamente - int factor = node.get_value(); - ss_enabled = factor >= 2; - ss_amount = (factor >= 2) ? factor : 3; + int factor = ss_node.get_value(); + video.supersampling.enabled = factor >= 2; } } catch (...) {} } - if (vid.contains("supersampling_amount")) { - try { - int amount = vid["supersampling_amount"].get_value(); - if (amount >= 2) { ss_amount = amount; } - } catch (...) {} - } - video.supersampling = ss_enabled ? ss_amount : 1; - } - if (vid.contains("postfx_preset")) { - try { - int preset = vid["postfx_preset"].get_value(); - // No validamos contra postfx_presets.size() aquí porque postfx.yaml - // aún no se ha cargado. El clamp se hace en loadPostFXFromFile(). - if (preset >= 0) { - current_postfx_preset = preset; - } - } catch (...) {} } } @@ -291,27 +483,39 @@ namespace Options { const auto& aud = yaml["audio"]; if (aud.contains("enabled")) { - try { audio.enabled = aud["enabled"].get_value(); } catch (...) {} + try { + audio.enabled = aud["enabled"].get_value(); + } catch (...) {} } if (aud.contains("volume")) { - try { audio.volume = std::clamp(aud["volume"].get_value(), 0, 100); } catch (...) {} + try { + audio.volume = std::clamp(aud["volume"].get_value(), 0, 100); + } catch (...) {} } if (aud.contains("music")) { const auto& mus = aud["music"]; if (mus.contains("enabled")) { - try { audio.music.enabled = mus["enabled"].get_value(); } catch (...) {} + try { + audio.music.enabled = mus["enabled"].get_value(); + } catch (...) {} } if (mus.contains("volume")) { - try { audio.music.volume = std::clamp(mus["volume"].get_value(), 0, 100); } catch (...) {} + try { + audio.music.volume = std::clamp(mus["volume"].get_value(), 0, 100); + } catch (...) {} } } if (aud.contains("sound")) { const auto& snd = aud["sound"]; if (snd.contains("enabled")) { - try { audio.sound.enabled = snd["enabled"].get_value(); } catch (...) {} + try { + audio.sound.enabled = snd["enabled"].get_value(); + } catch (...) {} } if (snd.contains("volume")) { - try { audio.sound.volume = std::clamp(snd["volume"].get_value(), 0, 100); } catch (...) {} + try { + audio.sound.volume = std::clamp(snd["volume"].get_value(), 0, 100); + } catch (...) {} } } } @@ -338,13 +542,19 @@ namespace Options { } catch (...) {} } if (game.contains("autofire")) { - try { settings.autofire = game["autofire"].get_value(); } catch (...) {} + try { + settings.autofire = game["autofire"].get_value(); + } catch (...) {} } if (game.contains("shutdown_enabled")) { - try { settings.shutdown_enabled = game["shutdown_enabled"].get_value(); } catch (...) {} + try { + settings.shutdown_enabled = game["shutdown_enabled"].get_value(); + } catch (...) {} } if (game.contains("params_file")) { - try { settings.params_file = game["params_file"].get_value(); } catch (...) {} + try { + settings.params_file = game["params_file"].get_value(); + } catch (...) {} } } @@ -356,10 +566,14 @@ namespace Options { for (const auto& ctrl : controllers) { if (i >= GamepadManager::size()) { break; } if (ctrl.contains("name")) { - try { gamepad_manager[i].name = ctrl["name"].get_value(); } catch (...) {} + try { + gamepad_manager[i].name = ctrl["name"].get_value(); + } catch (...) {} } if (ctrl.contains("path")) { - try { gamepad_manager[i].path = ctrl["path"].get_value(); } catch (...) {} + try { + gamepad_manager[i].path = ctrl["path"].get_value(); + } catch (...) {} } if (ctrl.contains("player")) { try { @@ -379,7 +593,9 @@ namespace Options { if (!yaml.contains("keyboard")) { return; } const auto& kb = yaml["keyboard"]; if (kb.contains("player")) { - try { keyboard.player_id = static_cast(kb["player"].get_value()); } catch (...) {} + try { + keyboard.player_id = static_cast(kb["player"].get_value()); + } catch (...) {} } } @@ -452,10 +668,26 @@ namespace Options { file << " scale_mode: " << static_cast(video.scale_mode) << " # " << static_cast(SDL_ScaleMode::SDL_SCALEMODE_NEAREST) << ": nearest, " << static_cast(SDL_ScaleMode::SDL_SCALEMODE_LINEAR) << ": linear\n"; file << " vsync: " << boolToString(video.vsync) << "\n"; file << " integer_scale: " << boolToString(video.integer_scale) << "\n"; - file << " postfx: " << boolToString(video.postfx) << "\n"; - file << " postfx_preset: " << current_postfx_preset << "\n"; - file << " supersampling: " << boolToString(video.supersampling > 1) << "\n"; - file << " supersampling_amount: " << std::max(2, video.supersampling) << "\n"; + file << " gpu:\n"; + file << " acceleration: " << boolToString(video.gpu.acceleration) << "\n"; + file << " preferred_driver: \"" << video.gpu.preferred_driver << "\"\n"; + file << " shader:\n"; + file << " enabled: " << boolToString(video.shader.enabled) << "\n"; + file << " current_shader: " << (video.shader.current_shader == Rendering::ShaderType::CRTPI ? "crtpi" : "postfx") << "\n"; + { + std::string postfx_name = (!postfx_presets.empty() && video.shader.current_postfx_preset < static_cast(postfx_presets.size())) + ? postfx_presets[static_cast(video.shader.current_postfx_preset)].name + : ""; + std::string crtpi_name = (!crtpi_presets.empty() && video.shader.current_crtpi_preset < static_cast(crtpi_presets.size())) + ? crtpi_presets[static_cast(video.shader.current_crtpi_preset)].name + : ""; + file << " postfx_preset: \"" << postfx_name << "\"\n"; + file << " crtpi_preset: \"" << crtpi_name << "\"\n"; + } + file << " supersampling:\n"; + file << " enabled: " << boolToString(video.supersampling.enabled) << "\n"; + file << " linear_upscale: " << boolToString(video.supersampling.linear_upscale) << "\n"; + file << " downscale_algo: " << video.supersampling.downscale_algo << "\n"; file << "\n"; // AUDIO diff --git a/source/options.hpp b/source/options.hpp index 690ffe8..572c110 100644 --- a/source/options.hpp +++ b/source/options.hpp @@ -14,11 +14,12 @@ #include // Para vector #include "defaults.hpp" -#include "difficulty.hpp" // for Code -#include "input.hpp" // for Input -#include "lang.hpp" // for Code -#include "manage_hiscore_table.hpp" // for ManageHiScoreTable, Table -#include "player.hpp" // for Player +#include "difficulty.hpp" // for Code +#include "input.hpp" // for Input +#include "lang.hpp" // for Code +#include "manage_hiscore_table.hpp" // for ManageHiScoreTable, Table +#include "player.hpp" // for Player +#include "rendering/shader_backend.hpp" // for Rendering::ShaderType // --- Namespace Options: gestión de configuración y opciones del juego --- namespace Options { @@ -36,20 +37,59 @@ namespace Options { float flicker{0.0F}; }; + struct CrtPiPreset { + std::string name; + float scanline_weight{6.0F}; + float scanline_gap_brightness{0.12F}; + float bloom_factor{3.5F}; + float input_gamma{2.4F}; + float output_gamma{2.2F}; + float mask_brightness{0.80F}; + float curvature_x{0.05F}; + float curvature_y{0.10F}; + int mask_type{2}; + bool enable_scanlines{true}; + bool enable_multisample{true}; + bool enable_gamma{true}; + bool enable_curvature{false}; + bool enable_sharper{false}; + }; + struct Window { - std::string caption = Defaults::Window::CAPTION; // Texto que aparece en la barra de título de la ventana - int zoom = Defaults::Window::ZOOM; // Valor por el que se multiplica el tamaño de la ventana - int max_zoom = Defaults::Window::MAX_ZOOM; // Tamaño máximo para que la ventana no sea mayor que la pantalla + std::string caption = Defaults::Window::CAPTION; + int zoom = Defaults::Window::ZOOM; + int max_zoom = Defaults::Window::MAX_ZOOM; + }; + + struct GPU { + bool acceleration{Defaults::Video::GPU_ACCELERATION}; + std::string preferred_driver; + }; + + struct Supersampling { + bool enabled{Defaults::Video::SUPERSAMPLING}; + bool linear_upscale{Defaults::Video::LINEAR_UPSCALE}; + int downscale_algo{Defaults::Video::DOWNSCALE_ALGO}; + }; + + struct ShaderConfig { + bool enabled{Defaults::Video::SHADER_ENABLED}; + Rendering::ShaderType current_shader{Rendering::ShaderType::POSTFX}; + std::string current_postfx_preset_name; + std::string current_crtpi_preset_name; + int current_postfx_preset{0}; + int current_crtpi_preset{0}; }; struct Video { - SDL_ScaleMode scale_mode = Defaults::Video::SCALE_MODE; // Filtro usado para el escalado de la imagen - bool fullscreen = Defaults::Video::FULLSCREEN; // Indica si se usa pantalla completa - bool vsync = Defaults::Video::VSYNC; // Indica si se usa vsync - bool integer_scale = Defaults::Video::INTEGER_SCALE; // Indica si se usa escalado entero - bool postfx = Defaults::Video::POSTFX; // Indica si se usan efectos PostFX - int supersampling = Defaults::Video::SUPERSAMPLING; // Factor de supersampling: 1=off, 2=2×, 3=3× - std::string info; // Información sobre el modo de vídeo + SDL_ScaleMode scale_mode = Defaults::Video::SCALE_MODE; + bool fullscreen = Defaults::Video::FULLSCREEN; + bool vsync = Defaults::Video::VSYNC; + bool integer_scale = Defaults::Video::INTEGER_SCALE; + std::string info; + GPU gpu{}; + Supersampling supersampling{}; + ShaderConfig shader{}; }; struct Music { @@ -63,8 +103,8 @@ namespace Options { }; struct Audio { - Music music; // Opciones para la música - Sound sound; // Opciones para los efectos de sonido + Music music; // Opciones para la música + Sound sound; // Opciones para los efectos de sonido bool enabled = Defaults::Audio::ENABLED; // Indica si el audio está activo o no int volume = Defaults::Audio::VOLUME; // Volumen general del audio }; @@ -292,16 +332,19 @@ namespace Options { extern Keyboard keyboard; // Opciones para el teclado extern PendingChanges pending_changes; // Opciones que se aplican al cerrar extern std::vector postfx_presets; // Lista de presets de PostFX - extern int current_postfx_preset; // Índice del preset PostFX activo extern std::string postfx_file_path; // Ruta al fichero de presets PostFX + extern std::vector crtpi_presets; // Lista de presets de CrtPi + extern std::string crtpi_file_path; // Ruta al fichero de presets CrtPi // --- Funciones --- void init(); // Inicializa las opciones del programa void setConfigFile(const std::string& file_path); // Establece el fichero de configuración void setControllersFile(const std::string& file_path); // Establece el fichero de configuración de mandos void setPostFXFile(const std::string& path); // Establece el fichero de presets PostFX + void setCrtPiFile(const std::string& path); // Establece el fichero de presets CrtPi auto loadPostFXFromFile() -> bool; // Carga los presets PostFX desde fichero auto savePostFXToFile() -> bool; // Guarda los presets PostFX por defecto al fichero + auto loadCrtPiFromFile() -> bool; // Carga los presets CrtPi desde fichero auto loadFromFile() -> bool; // Carga el fichero de configuración auto saveToFile() -> bool; // Guarda el fichero de configuración void setKeyboardToPlayer(Player::Id player_id); // Asigna el teclado al jugador diff --git a/source/rendering/sdl3gpu/crtpi_frag_spv.h b/source/rendering/sdl3gpu/crtpi_frag_spv.h new file mode 100644 index 0000000..0f67335 --- /dev/null +++ b/source/rendering/sdl3gpu/crtpi_frag_spv.h @@ -0,0 +1,10361 @@ +#pragma once +#include +#include +static const uint8_t kcrtpi_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x08, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x64, + 0x69, + 0x73, + 0x74, + 0x6f, + 0x72, + 0x74, + 0x28, + 0x76, + 0x66, + 0x32, + 0x3b, + 0x76, + 0x66, + 0x32, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x72, + 0x65, + 0x65, + 0x6e, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x08, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x63, + 0x61, + 0x6c, + 0x63, + 0x53, + 0x63, + 0x61, + 0x6e, + 0x4c, + 0x69, + 0x6e, + 0x65, + 0x57, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x64, + 0x69, + 0x73, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x63, + 0x61, + 0x6c, + 0x63, + 0x53, + 0x63, + 0x61, + 0x6e, + 0x4c, + 0x69, + 0x6e, + 0x65, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x64, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x66, + 0x69, + 0x6c, + 0x74, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x43, + 0x72, + 0x74, + 0x50, + 0x69, + 0x42, + 0x6c, + 0x6f, + 0x63, + 0x6b, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x06, + 0x00, + 0x09, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x67, + 0x61, + 0x70, + 0x5f, + 0x62, + 0x72, + 0x69, + 0x67, + 0x68, + 0x74, + 0x6e, + 0x65, + 0x73, + 0x73, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x62, + 0x6c, + 0x6f, + 0x6f, + 0x6d, + 0x5f, + 0x66, + 0x61, + 0x63, + 0x74, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x69, + 0x6e, + 0x70, + 0x75, + 0x74, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x70, + 0x75, + 0x74, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x5f, + 0x62, + 0x72, + 0x69, + 0x67, + 0x68, + 0x74, + 0x6e, + 0x65, + 0x73, + 0x73, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x78, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x79, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x5f, + 0x74, + 0x79, + 0x70, + 0x65, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x73, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x6d, + 0x75, + 0x6c, + 0x74, + 0x69, + 0x73, + 0x61, + 0x6d, + 0x70, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x73, + 0x68, + 0x61, + 0x72, + 0x70, + 0x65, + 0x72, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x68, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x62, + 0x61, + 0x72, + 0x72, + 0x65, + 0x6c, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x72, + 0x73, + 0x71, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x5f, + 0x73, + 0x69, + 0x7a, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x66, + 0x69, + 0x6c, + 0x74, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x5f, + 0x69, + 0x6e, + 0x5f, + 0x70, + 0x69, + 0x78, + 0x65, + 0x6c, + 0x73, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x6d, + 0x70, + 0x5f, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x74, + 0x63, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x64, + 0x65, + 0x6c, + 0x74, + 0x61, + 0x73, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x73, + 0x69, + 0x67, + 0x6e, + 0x73, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x6d, + 0x70, + 0x5f, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x79, + 0x5f, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x64, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x73, + 0x69, + 0x67, + 0x6e, + 0x5f, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x75, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x54, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x77, + 0x68, + 0x69, + 0x63, + 0x68, + 0x5f, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x46, + 0x72, + 0x61, + 0x67, + 0x43, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x77, + 0x68, + 0x69, + 0x63, + 0x68, + 0x5f, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x12, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x85, + 0x6b, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x02, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0xbf, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0xaa, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x44, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x20, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x17, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0x2a, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x04, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x07, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kcrtpi_frag_spv_size = 10356; diff --git a/source/rendering/sdl3gpu/downscale_frag_spv.h b/source/rendering/sdl3gpu/downscale_frag_spv.h new file mode 100644 index 0000000..6d96082 --- /dev/null +++ b/source/rendering/sdl3gpu/downscale_frag_spv.h @@ -0,0 +1,4253 @@ +#pragma once +#include +#include +static const uint8_t kdownscale_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x07, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x61, + 0x6e, + 0x63, + 0x7a, + 0x6f, + 0x73, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x70, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x73, + 0x72, + 0x63, + 0x5f, + 0x73, + 0x69, + 0x7a, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x73, + 0x6f, + 0x75, + 0x72, + 0x63, + 0x65, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x70, + 0x5f, + 0x66, + 0x6c, + 0x6f, + 0x6f, + 0x72, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x44, + 0x6f, + 0x77, + 0x6e, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x55, + 0x6e, + 0x69, + 0x66, + 0x6f, + 0x72, + 0x6d, + 0x73, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x61, + 0x6c, + 0x67, + 0x6f, + 0x72, + 0x69, + 0x74, + 0x68, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x31, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x32, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x77, + 0x69, + 0x6e, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x5f, + 0x73, + 0x75, + 0x6d, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x74, + 0x61, + 0x70, + 0x5f, + 0x63, + 0x65, + 0x6e, + 0x74, + 0x65, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x66, + 0x66, + 0x73, + 0x65, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x17, + 0xb7, + 0xd1, + 0x38, + 0x14, + 0x00, + 0x02, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x0f, + 0x49, + 0x40, + 0x17, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x06, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x20, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x15, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x05, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0xa9, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x04, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x04, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x05, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x05, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kdownscale_frag_spv_size = 4248; diff --git a/source/rendering/sdl3gpu/postfx_frag_spv.h b/source/rendering/sdl3gpu/postfx_frag_spv.h index dbd2688..a125677 100644 --- a/source/rendering/sdl3gpu/postfx_frag_spv.h +++ b/source/rendering/sdl3gpu/postfx_frag_spv.h @@ -14,7 +14,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x0d, 0x00, - 0xbc, + 0xdd, 0x01, 0x00, 0x00, @@ -102,7 +102,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x97, + 0xa1, 0x01, 0x00, 0x00, @@ -602,6 +602,94 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x70, + 0x69, + 0x78, + 0x65, + 0x6c, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x74, + 0x69, + 0x6d, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x76, + 0x65, + 0x72, + 0x73, + 0x61, + 0x6d, + 0x70, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x66, + 0x6c, + 0x69, + 0x63, + 0x6b, + 0x65, + 0x72, + 0x00, 0x05, 0x00, 0x03, @@ -740,12 +828,28 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x03, + 0x04, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0x73, + 0x74, + 0x65, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, 0x79, 0x63, 0x63, @@ -754,7 +858,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xc8, + 0xce, 0x00, 0x00, 0x00, @@ -770,7 +874,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xcb, + 0xd1, 0x00, 0x00, 0x00, @@ -786,7 +890,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xd4, + 0xda, 0x00, 0x00, 0x00, @@ -802,7 +906,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xd7, + 0xdd, 0x00, 0x00, 0x00, @@ -818,7 +922,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xdf, + 0xe5, 0x00, 0x00, 0x00, @@ -834,7 +938,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xe2, + 0xe8, 0x00, 0x00, 0x00, @@ -850,7 +954,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xea, + 0xf0, 0x00, 0x00, 0x00, @@ -866,7 +970,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xed, + 0xf3, 0x00, 0x00, 0x00, @@ -882,7 +986,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0xf5, + 0xfb, 0x00, 0x00, 0x00, @@ -898,7 +1002,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, @@ -914,7 +1018,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x12, + 0x18, 0x01, 0x00, 0x00, @@ -930,7 +1034,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x1b, + 0x21, 0x01, 0x00, 0x00, @@ -942,7 +1046,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x37, + 0x47, 0x01, 0x00, 0x00, @@ -952,101 +1056,73 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x05, - 0x00, - 0x42, - 0x01, - 0x00, - 0x00, - 0x74, - 0x65, - 0x78, - 0x48, - 0x65, - 0x69, - 0x67, - 0x68, - 0x74, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x48, - 0x01, - 0x00, - 0x00, - 0x73, - 0x63, - 0x61, - 0x6c, - 0x65, - 0x59, - 0x00, - 0x00, - 0x05, - 0x00, - 0x04, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x73, - 0x63, - 0x72, - 0x65, - 0x65, - 0x6e, - 0x59, - 0x00, - 0x05, - 0x00, - 0x05, - 0x00, - 0x54, - 0x01, - 0x00, - 0x00, - 0x70, - 0x6f, - 0x73, - 0x49, - 0x6e, - 0x52, - 0x6f, - 0x77, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x00, - 0x05, + 0x03, 0x00, 0x58, 0x01, 0x00, 0x00, + 0x70, 0x73, - 0x63, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x66, + 0x72, 0x61, - 0x6e, - 0x4c, + 0x63, + 0x5f, 0x69, 0x6e, - 0x65, - 0x44, - 0x59, - 0x00, + 0x5f, + 0x72, + 0x6f, + 0x77, 0x00, 0x05, 0x00, 0x04, 0x00, - 0x5d, + 0x66, + 0x01, + 0x00, + 0x00, + 0x72, + 0x6f, + 0x77, + 0x5f, + 0x70, + 0x6f, + 0x73, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x69, + 0x73, + 0x5f, + 0x64, + 0x61, + 0x72, + 0x6b, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x70, 0x01, 0x00, 0x00, @@ -1062,7 +1138,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x74, + 0x7e, 0x01, 0x00, 0x00, @@ -1074,7 +1150,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x7f, + 0x89, 0x01, 0x00, 0x00, @@ -1086,7 +1162,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x83, + 0x8d, 0x01, 0x00, 0x00, @@ -1106,7 +1182,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x95, + 0x9f, 0x01, 0x00, 0x00, @@ -1126,7 +1202,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x06, 0x00, - 0x97, + 0xa1, 0x01, 0x00, 0x00, @@ -1150,7 +1226,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x9e, + 0xa8, 0x01, 0x00, 0x00, @@ -1162,6 +1238,30 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0x66, + 0x6c, + 0x69, + 0x63, + 0x6b, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x61, + 0x76, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, 0x47, 0x00, 0x04, @@ -1350,6 +1450,86 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, 0x47, 0x00, 0x04, @@ -1434,7 +1614,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x97, + 0xa1, 0x01, 0x00, 0x00, @@ -1896,7 +2076,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x1e, 0x00, - 0x0a, + 0x0e, 0x00, 0x6f, 0x00, @@ -1934,6 +2114,22 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, 0x20, 0x00, 0x04, @@ -2318,11 +2514,27 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, 0x06, 0x00, 0x00, 0x00, - 0xce, + 0xd4, 0x00, 0x00, 0x00, @@ -2338,7 +2550,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x09, + 0x0f, 0x01, 0x00, 0x00, @@ -2354,7 +2566,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1c, + 0x22, 0x01, 0x00, 0x00, @@ -2370,7 +2582,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1f, + 0x25, 0x01, 0x00, 0x00, @@ -2382,11 +2594,59 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x99, + 0x19, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, 0x72, 0x00, 0x00, 0x00, - 0x31, + 0x28, + 0x01, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x99, + 0xe9, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x41, 0x01, 0x00, 0x00, @@ -2402,7 +2662,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x39, + 0x49, 0x01, 0x00, 0x00, @@ -2418,19 +2678,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3a, + 0x4a, 0x01, 0x00, 0x00, - 0x39, + 0x49, 0x01, 0x00, 0x00, - 0x39, + 0x49, 0x01, 0x00, 0x00, - 0x39, + 0x49, 0x01, 0x00, 0x00, @@ -2442,7 +2702,39 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x49, + 0x52, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x61, 0x01, 0x00, 0x00, @@ -2458,71 +2750,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x61, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0xc0, - 0x40, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x64, - 0x01, - 0x00, - 0x00, - 0x8f, - 0xc2, - 0xf5, - 0x3d, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x66, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x60, - 0x40, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, - 0x69, - 0x01, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x76, + 0x80, 0x01, 0x00, 0x00, @@ -2538,19 +2766,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x77, + 0x81, 0x01, 0x00, 0x00, - 0x76, + 0x80, 0x01, 0x00, 0x00, - 0x76, + 0x80, 0x01, 0x00, 0x00, - 0x76, + 0x80, 0x01, 0x00, 0x00, @@ -2562,7 +2790,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x8f, + 0x99, 0x01, 0x00, 0x00, @@ -2574,7 +2802,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x96, + 0xa0, 0x01, 0x00, 0x00, @@ -2590,11 +2818,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x96, + 0xa0, 0x01, 0x00, 0x00, - 0x97, + 0xa1, 0x01, 0x00, 0x00, @@ -2606,7 +2834,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x98, + 0xa2, 0x01, 0x00, 0x00, @@ -2626,7 +2854,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9b, + 0xa5, 0x01, 0x00, 0x00, @@ -2642,7 +2870,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9f, + 0xa9, 0x01, 0x00, 0x00, @@ -2658,19 +2886,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa0, + 0xaa, 0x01, 0x00, 0x00, - 0x9f, + 0xa9, 0x01, 0x00, 0x00, - 0x9f, + 0xa9, 0x01, 0x00, 0x00, - 0x9f, + 0xa9, 0x01, 0x00, 0x00, @@ -2682,7 +2910,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa8, + 0xb2, 0x01, 0x00, 0x00, @@ -2690,6 +2918,54 @@ static const uint8_t kpostfx_frag_spv[] = { 0xaa, 0x2a, 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x42, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0x0a, + 0xd7, + 0x23, + 0x3d, 0x36, 0x00, 0x05, @@ -2834,7 +3110,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x08, + 0x13, 0x00, 0x00, 0x00, @@ -2854,7 +3130,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc8, + 0xcd, 0x00, 0x00, 0x00, @@ -2870,7 +3146,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcb, + 0xce, 0x00, 0x00, 0x00, @@ -2886,7 +3162,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd4, + 0xd1, 0x00, 0x00, 0x00, @@ -2902,7 +3178,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd7, + 0xda, 0x00, 0x00, 0x00, @@ -2918,7 +3194,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xdf, + 0xdd, 0x00, 0x00, 0x00, @@ -2934,7 +3210,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe2, + 0xe5, 0x00, 0x00, 0x00, @@ -2950,7 +3226,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xea, + 0xe8, 0x00, 0x00, 0x00, @@ -2966,7 +3242,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xed, + 0xf0, 0x00, 0x00, 0x00, @@ -2982,7 +3258,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf5, + 0xf3, 0x00, 0x00, 0x00, @@ -2998,7 +3274,23 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x10, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x16, 0x01, 0x00, 0x00, @@ -3014,7 +3306,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x12, + 0x18, 0x01, 0x00, 0x00, @@ -3030,7 +3322,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1b, + 0x21, 0x01, 0x00, 0x00, @@ -3046,71 +3338,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x37, - 0x01, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x42, - 0x01, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x48, - 0x01, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x3b, - 0x00, - 0x04, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0x54, + 0x47, 0x01, 0x00, 0x00, @@ -3142,7 +3370,55 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x5d, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x70, 0x01, 0x00, 0x00, @@ -3158,7 +3434,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x74, + 0x7e, 0x01, 0x00, 0x00, @@ -3174,7 +3450,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x7f, + 0x89, 0x01, 0x00, 0x00, @@ -3190,7 +3466,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x83, + 0x8d, 0x01, 0x00, 0x00, @@ -3206,7 +3482,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x95, + 0x9f, 0x01, 0x00, 0x00, @@ -3222,7 +3498,23 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9e, + 0xa8, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xc7, 0x01, 0x00, 0x00, @@ -4394,7 +4686,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x19, + 0x1f, 0x01, 0x00, 0x00, @@ -4506,6 +4798,90 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, 0x3d, 0x00, 0x04, @@ -4514,7 +4890,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc9, + 0xcf, 0x00, 0x00, 0x00, @@ -4526,11 +4902,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xc8, + 0xce, 0x00, 0x00, 0x00, - 0xc9, + 0xcf, 0x00, 0x00, 0x00, @@ -4542,7 +4918,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xca, + 0xd0, 0x00, 0x00, 0x00, @@ -4550,7 +4926,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc8, + 0xce, 0x00, 0x00, 0x00, @@ -4558,63 +4934,63 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, 0xc7, 0x00, 0x00, 0x00, - 0xca, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xcc, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xcd, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xcf, - 0x00, - 0x00, - 0x00, - 0xbf, - 0x00, - 0x00, - 0x00, - 0x88, + 0x85, 0x00, 0x05, 0x00, @@ -4622,15 +4998,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd0, + 0xd6, 0x00, 0x00, 0x00, - 0xce, + 0xd4, 0x00, 0x00, 0x00, - 0xcf, + 0xd5, 0x00, 0x00, 0x00, @@ -4642,335 +5018,131 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd1, - 0x00, - 0x00, - 0x00, - 0xd0, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xd2, - 0x00, - 0x00, - 0x00, - 0xcd, - 0x00, - 0x00, - 0x00, - 0xd1, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xd3, - 0x00, - 0x00, - 0x00, - 0xcc, - 0x00, - 0x00, - 0x00, - 0xd2, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xd5, - 0x00, - 0x00, - 0x00, - 0xd3, - 0x00, - 0x00, - 0x00, - 0xd3, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xd4, - 0x00, - 0x00, - 0x00, - 0xd5, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xd6, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0xd4, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xcb, - 0x00, - 0x00, - 0x00, - 0xd6, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0xd8, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xd9, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xda, - 0x00, - 0x00, - 0x00, - 0xbf, - 0x00, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0xdb, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xda, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xdc, - 0x00, - 0x00, - 0x00, - 0xdb, - 0x00, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xdd, - 0x00, - 0x00, - 0x00, - 0xd9, - 0x00, - 0x00, - 0x00, - 0xdc, - 0x00, - 0x00, - 0x00, - 0x57, - 0x00, - 0x05, - 0x00, - 0xa8, - 0x00, - 0x00, - 0x00, - 0xde, - 0x00, - 0x00, - 0x00, - 0xd8, - 0x00, - 0x00, - 0x00, - 0xdd, - 0x00, - 0x00, - 0x00, - 0x4f, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xe0, - 0x00, - 0x00, - 0x00, - 0xde, - 0x00, - 0x00, - 0x00, - 0xde, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xdf, - 0x00, - 0x00, - 0x00, - 0xe0, - 0x00, - 0x00, - 0x00, - 0x39, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xe1, - 0x00, - 0x00, - 0x00, - 0x0b, - 0x00, - 0x00, - 0x00, - 0xdf, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, 0xd7, 0x00, 0x00, 0x00, - 0xe1, + 0xd6, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xdc, 0x00, 0x00, 0x00, @@ -4982,7 +5154,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe3, + 0xde, 0x00, 0x00, 0x00, @@ -4998,7 +5170,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe4, + 0xdf, 0x00, 0x00, 0x00, @@ -5014,15 +5186,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe5, + 0xe0, 0x00, 0x00, 0x00, - 0xbf, + 0xc7, 0x00, 0x00, 0x00, - 0x88, + 0x85, 0x00, 0x05, 0x00, @@ -5030,7 +5202,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe6, + 0xe1, 0x00, 0x00, 0x00, @@ -5038,7 +5210,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe5, + 0xe0, 0x00, 0x00, 0x00, @@ -5050,11 +5222,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe7, + 0xe2, 0x00, 0x00, 0x00, - 0xe6, + 0xe1, 0x00, 0x00, 0x00, @@ -5062,7 +5234,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x81, + 0x83, 0x00, 0x05, 0x00, @@ -5070,15 +5242,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe8, + 0xe3, 0x00, 0x00, 0x00, - 0xe4, + 0xdf, 0x00, 0x00, 0x00, - 0xe7, + 0xe2, 0x00, 0x00, 0x00, @@ -5090,7 +5262,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe9, + 0xe4, + 0x00, + 0x00, + 0x00, + 0xde, 0x00, 0x00, 0x00, @@ -5098,10 +5274,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xe8, - 0x00, - 0x00, - 0x00, 0x4f, 0x00, 0x08, @@ -5110,15 +5282,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xeb, + 0xe6, 0x00, 0x00, 0x00, - 0xe9, + 0xe4, 0x00, 0x00, 0x00, - 0xe9, + 0xe4, 0x00, 0x00, 0x00, @@ -5138,11 +5310,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xea, + 0xe5, 0x00, 0x00, 0x00, - 0xeb, + 0xe6, 0x00, 0x00, 0x00, @@ -5154,7 +5326,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xec, + 0xe7, 0x00, 0x00, 0x00, @@ -5162,7 +5334,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xea, + 0xe5, 0x00, 0x00, 0x00, @@ -5170,11 +5342,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xe2, + 0xdd, 0x00, 0x00, 0x00, - 0xec, + 0xe7, 0x00, 0x00, 0x00, @@ -5186,7 +5358,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xee, + 0xe9, 0x00, 0x00, 0x00, @@ -5202,7 +5374,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xef, + 0xea, 0x00, 0x00, 0x00, @@ -5218,15 +5390,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf0, + 0xeb, 0x00, 0x00, 0x00, - 0xbf, + 0xc7, 0x00, 0x00, 0x00, - 0x88, + 0x85, 0x00, 0x05, 0x00, @@ -5234,15 +5406,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf1, + 0xec, 0x00, 0x00, 0x00, - 0xce, + 0x63, 0x00, 0x00, 0x00, - 0xf0, + 0xeb, 0x00, 0x00, 0x00, @@ -5254,11 +5426,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf2, + 0xed, 0x00, 0x00, 0x00, - 0xf1, + 0xec, 0x00, 0x00, 0x00, @@ -5274,15 +5446,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf3, + 0xee, 0x00, 0x00, 0x00, - 0xef, + 0xea, 0x00, 0x00, 0x00, - 0xf2, + 0xed, 0x00, 0x00, 0x00, @@ -5294,7 +5466,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf4, + 0xef, + 0x00, + 0x00, + 0x00, + 0xe9, 0x00, 0x00, 0x00, @@ -5302,10 +5478,6 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf3, - 0x00, - 0x00, - 0x00, 0x4f, 0x00, 0x08, @@ -5314,15 +5486,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf6, + 0xf1, 0x00, 0x00, 0x00, - 0xf4, + 0xef, 0x00, 0x00, 0x00, - 0xf4, + 0xef, 0x00, 0x00, 0x00, @@ -5342,11 +5514,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xf5, + 0xf0, 0x00, 0x00, 0x00, - 0xf6, + 0xf1, 0x00, 0x00, 0x00, @@ -5358,7 +5530,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf7, + 0xf2, 0x00, 0x00, 0x00, @@ -5366,7 +5538,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf5, + 0xf0, 0x00, 0x00, 0x00, @@ -5374,11 +5546,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0xed, + 0xe8, 0x00, 0x00, 0x00, - 0xf7, + 0xf2, 0x00, 0x00, 0x00, @@ -5386,7 +5558,75 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x07, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, 0x00, 0x00, 0x00, @@ -5394,13 +5634,17 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xcb, + 0xf7, 0x00, 0x00, 0x00, - 0x4f, + 0x62, 0x00, - 0x07, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, 0x00, 0x69, 0x00, @@ -5410,7 +5654,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf8, + 0xf5, 0x00, 0x00, 0x00, @@ -5418,19 +5662,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x01, + 0x57, 0x00, + 0x05, 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, + 0xa8, 0x00, 0x00, 0x00, @@ -5438,63 +5674,63 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xd7, + 0xf4, + 0x00, + 0x00, + 0x00, + 0xf9, 0x00, 0x00, 0x00, 0x4f, 0x00, + 0x08, + 0x00, 0x07, 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0xfb, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, 0xfb, 0x00, 0x00, 0x00, - 0xce, + 0xfc, 0x00, 0x00, 0x00, - 0x81, + 0x39, 0x00, 0x05, 0x00, - 0x69, + 0x07, 0x00, 0x00, 0x00, @@ -5502,11 +5738,23 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xf9, + 0x0b, 0x00, 0x00, 0x00, - 0xfc, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xfd, 0x00, 0x00, 0x00, @@ -5522,7 +5770,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xc7, + 0xd1, 0x00, 0x00, 0x00, @@ -5554,6 +5802,50 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, 0x8e, 0x00, 0x05, @@ -5562,7 +5854,27 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x02, + 0x01, 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x03, 0x01, 0x00, 0x00, @@ -5570,27 +5882,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xce, - 0x00, - 0x00, - 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x01, - 0x01, - 0x00, - 0x00, - 0xfd, - 0x00, - 0x00, - 0x00, - 0x00, + 0x02, 0x01, 0x00, 0x00, @@ -5602,11 +5894,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x02, + 0x04, 0x01, 0x00, 0x00, - 0xe2, + 0xcd, 0x00, 0x00, 0x00, @@ -5618,15 +5910,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x03, + 0x05, 0x01, 0x00, 0x00, - 0x02, + 0x04, 0x01, 0x00, 0x00, - 0x02, + 0x04, 0x01, 0x00, 0x00, @@ -5646,15 +5938,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x04, + 0x06, 0x01, 0x00, 0x00, - 0x03, + 0x05, 0x01, 0x00, 0x00, - 0xce, + 0xd4, 0x00, 0x00, 0x00, @@ -5666,15 +5958,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x05, + 0x07, 0x01, 0x00, 0x00, - 0x01, + 0x03, 0x01, 0x00, 0x00, - 0x04, + 0x06, 0x01, 0x00, 0x00, @@ -5686,11 +5978,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x06, + 0x08, 0x01, 0x00, 0x00, - 0xed, + 0xe8, 0x00, 0x00, 0x00, @@ -5702,15 +5994,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x07, + 0x09, 0x01, 0x00, 0x00, - 0x06, + 0x08, 0x01, 0x00, 0x00, - 0x06, + 0x08, 0x01, 0x00, 0x00, @@ -5722,27 +6014,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x81, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x08, - 0x01, - 0x00, - 0x00, - 0x05, - 0x01, - 0x00, - 0x00, - 0x07, - 0x01, - 0x00, - 0x00, - 0x50, + 0x8e, 0x00, 0x05, 0x00, @@ -5758,11 +6030,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x09, - 0x01, + 0xd4, 0x00, 0x00, - 0x88, + 0x00, + 0x81, 0x00, 0x05, 0x00, @@ -5774,7 +6046,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x08, + 0x07, 0x01, 0x00, 0x00, @@ -5782,6 +6054,110 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, 0x41, 0x00, 0x05, @@ -5790,11 +6166,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0c, + 0x12, 0x01, 0x00, 0x00, - 0xc7, + 0xcd, 0x00, 0x00, 0x00, @@ -5810,11 +6186,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0d, + 0x13, 0x01, 0x00, 0x00, - 0x0b, + 0x11, 0x01, 0x00, 0x00, @@ -5826,11 +6202,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x0c, + 0x12, 0x01, 0x00, 0x00, - 0x0d, + 0x13, 0x01, 0x00, 0x00, @@ -5842,11 +6218,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0e, + 0x14, 0x01, 0x00, 0x00, - 0xc7, + 0xcd, 0x00, 0x00, 0x00, @@ -5862,11 +6238,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x0f, + 0x15, 0x01, 0x00, 0x00, - 0x0b, + 0x11, 0x01, 0x00, 0x00, @@ -5878,11 +6254,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x0e, + 0x14, 0x01, 0x00, 0x00, - 0x0f, + 0x15, 0x01, 0x00, 0x00, @@ -5894,7 +6270,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x11, + 0x17, 0x01, 0x00, 0x00, @@ -5910,11 +6286,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x13, + 0x19, 0x01, 0x00, 0x00, - 0xc7, + 0xcd, 0x00, 0x00, 0x00, @@ -5922,11 +6298,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x12, + 0x18, 0x01, 0x00, 0x00, - 0x13, + 0x19, 0x01, 0x00, 0x00, @@ -5938,7 +6314,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x14, + 0x1a, 0x01, 0x00, 0x00, @@ -5946,7 +6322,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x12, + 0x18, 0x01, 0x00, 0x00, @@ -5958,7 +6334,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x15, + 0x1b, 0x01, 0x00, 0x00, @@ -5978,162 +6354,162 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x15, - 0x01, - 0x00, - 0x00, - 0x50, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x17, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x16, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x18, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x11, - 0x01, - 0x00, - 0x00, - 0x14, - 0x01, - 0x00, - 0x00, - 0x17, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x18, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xbe, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x19, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x1a, - 0x01, - 0x00, - 0x00, - 0xb0, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x1a, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xbe, - 0x00, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xbe, - 0x00, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x1d, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, 0x3d, 0x00, 0x04, @@ -6142,11 +6518,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x1e, + 0x24, 0x01, 0x00, 0x00, - 0x1d, + 0x23, 0x01, 0x00, 0x00, @@ -6158,15 +6534,155 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x20, + 0x26, 0x01, 0x00, 0x00, - 0x1e, + 0x24, 0x01, 0x00, 0x00, - 0x1f, + 0x25, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x2f, 0x01, 0x00, 0x00, @@ -6174,11 +6690,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x1b, + 0x21, 0x01, 0x00, 0x00, - 0x20, + 0x30, 0x01, 0x00, 0x00, @@ -6190,7 +6706,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x21, + 0x31, 0x01, 0x00, 0x00, @@ -6206,7 +6722,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x22, + 0x32, 0x01, 0x00, 0x00, @@ -6222,11 +6738,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x23, + 0x33, 0x01, 0x00, 0x00, - 0x1b, + 0x21, 0x01, 0x00, 0x00, @@ -6238,11 +6754,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x24, + 0x34, 0x01, 0x00, 0x00, - 0x23, + 0x33, 0x01, 0x00, 0x00, @@ -6258,15 +6774,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x25, + 0x35, 0x01, 0x00, 0x00, - 0x22, + 0x32, 0x01, 0x00, 0x00, - 0x24, + 0x34, 0x01, 0x00, 0x00, @@ -6278,15 +6794,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x26, + 0x36, 0x01, 0x00, 0x00, - 0x21, + 0x31, 0x01, 0x00, 0x00, - 0x25, + 0x35, 0x01, 0x00, 0x00, @@ -6298,11 +6814,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x27, + 0x37, 0x01, 0x00, 0x00, - 0x26, + 0x36, 0x01, 0x00, 0x00, @@ -6318,11 +6834,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x28, + 0x38, 0x01, 0x00, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, @@ -6334,11 +6850,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x28, + 0x38, 0x01, 0x00, 0x00, - 0x27, + 0x37, 0x01, 0x00, 0x00, @@ -6350,7 +6866,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x29, + 0x39, 0x01, 0x00, 0x00, @@ -6366,7 +6882,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2a, + 0x3a, 0x01, 0x00, 0x00, @@ -6382,11 +6898,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2b, + 0x3b, 0x01, 0x00, 0x00, - 0x1b, + 0x21, 0x01, 0x00, 0x00, @@ -6398,11 +6914,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2c, + 0x3c, 0x01, 0x00, 0x00, - 0x2b, + 0x3b, 0x01, 0x00, 0x00, @@ -6418,15 +6934,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2d, + 0x3d, 0x01, 0x00, 0x00, - 0x2a, + 0x3a, 0x01, 0x00, 0x00, - 0x2c, + 0x3c, 0x01, 0x00, 0x00, @@ -6438,15 +6954,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2e, + 0x3e, 0x01, 0x00, 0x00, - 0x29, + 0x39, 0x01, 0x00, 0x00, - 0x2d, + 0x3d, 0x01, 0x00, 0x00, @@ -6458,11 +6974,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x2f, + 0x3f, 0x01, 0x00, 0x00, - 0x2e, + 0x3e, 0x01, 0x00, 0x00, @@ -6478,11 +6994,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x30, + 0x40, 0x01, 0x00, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, @@ -6494,11 +7010,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x30, + 0x40, 0x01, 0x00, 0x00, - 0x2f, + 0x3f, 0x01, 0x00, 0x00, @@ -6510,7 +7026,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x32, + 0x42, 0x01, 0x00, 0x00, @@ -6518,7 +7034,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x31, + 0x41, 0x01, 0x00, 0x00, @@ -6530,11 +7046,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x33, + 0x43, 0x01, 0x00, 0x00, - 0x32, + 0x42, 0x01, 0x00, 0x00, @@ -6546,11 +7062,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x34, + 0x44, 0x01, 0x00, 0x00, - 0x33, + 0x43, 0x01, 0x00, 0x00, @@ -6562,7 +7078,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x36, + 0x46, 0x01, 0x00, 0x00, @@ -6574,15 +7090,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x04, 0x00, - 0x34, + 0x44, 0x01, 0x00, 0x00, - 0x35, + 0x45, 0x01, 0x00, 0x00, - 0x36, + 0x46, 0x01, 0x00, 0x00, @@ -6590,7 +7106,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x35, + 0x45, 0x01, 0x00, 0x00, @@ -6602,11 +7118,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x38, + 0x48, 0x01, 0x00, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, @@ -6618,7 +7134,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3b, + 0x4b, 0x01, 0x00, 0x00, @@ -6630,11 +7146,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x38, + 0x48, 0x01, 0x00, 0x00, - 0x3a, + 0x4a, 0x01, 0x00, 0x00, @@ -6642,11 +7158,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x37, + 0x47, 0x01, 0x00, 0x00, - 0x3b, + 0x4b, 0x01, 0x00, 0x00, @@ -6658,11 +7174,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3c, + 0x4c, 0x01, 0x00, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, @@ -6674,11 +7190,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3d, + 0x4d, 0x01, 0x00, 0x00, - 0x37, + 0x47, 0x01, 0x00, 0x00, @@ -6690,7 +7206,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3e, + 0x4e, 0x01, 0x00, 0x00, @@ -6698,7 +7214,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x31, + 0x41, 0x01, 0x00, 0x00, @@ -6710,11 +7226,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3f, + 0x4f, 0x01, 0x00, 0x00, - 0x3e, + 0x4e, 0x01, 0x00, 0x00, @@ -6726,19 +7242,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x40, + 0x50, 0x01, 0x00, 0x00, - 0x3f, + 0x4f, 0x01, 0x00, 0x00, - 0x3f, + 0x4f, 0x01, 0x00, 0x00, - 0x3f, + 0x4f, 0x01, 0x00, 0x00, @@ -6750,7 +7266,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x41, + 0x51, 0x01, 0x00, 0x00, @@ -6762,15 +7278,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x3c, + 0x4c, 0x01, 0x00, 0x00, - 0x3d, + 0x4d, 0x01, 0x00, 0x00, - 0x40, + 0x50, 0x01, 0x00, 0x00, @@ -6778,11 +7294,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, - 0x41, + 0x51, 0x01, 0x00, 0x00, @@ -6790,7 +7306,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x36, + 0x46, 0x01, 0x00, 0x00, @@ -6798,110 +7314,10 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x02, 0x00, - 0x36, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0xb2, - 0x00, - 0x00, - 0x00, - 0x43, - 0x01, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x00, - 0x00, - 0x64, - 0x00, - 0x04, - 0x00, - 0xb1, - 0x00, - 0x00, - 0x00, - 0x44, - 0x01, - 0x00, - 0x00, - 0x43, - 0x01, - 0x00, - 0x00, - 0x67, - 0x00, - 0x05, - 0x00, - 0xc3, - 0x00, - 0x00, - 0x00, - 0x45, - 0x01, - 0x00, - 0x00, - 0x44, - 0x01, - 0x00, - 0x00, - 0xc1, - 0x00, - 0x00, - 0x00, - 0x51, - 0x00, - 0x05, - 0x00, - 0x72, - 0x00, - 0x00, - 0x00, 0x46, 0x01, 0x00, 0x00, - 0x45, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x47, - 0x01, - 0x00, - 0x00, - 0x46, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x42, - 0x01, - 0x00, - 0x00, - 0x47, - 0x01, - 0x00, - 0x00, 0x41, 0x00, 0x05, @@ -6910,7 +7326,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x4a, + 0x53, 0x01, 0x00, 0x00, @@ -6918,7 +7334,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x49, + 0x52, 0x01, 0x00, 0x00, @@ -6930,47 +7346,155 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x4b, + 0x54, 0x01, 0x00, 0x00, - 0x4a, + 0x53, 0x01, 0x00, 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x4c, - 0x01, - 0x00, - 0x00, - 0x42, - 0x01, - 0x00, - 0x00, - 0x88, + 0xba, 0x00, 0x05, 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, 0x06, 0x00, 0x00, 0x00, - 0x4d, + 0x5b, 0x01, 0x00, 0x00, - 0x4b, + 0x5a, 0x01, 0x00, 0x00, - 0x4c, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x5c, 0x01, 0x00, 0x00, @@ -6978,11 +7502,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x48, + 0x58, 0x01, 0x00, 0x00, - 0x4d, + 0x5d, 0x01, 0x00, 0x00, @@ -6994,7 +7518,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x4f, + 0x5f, 0x01, 0x00, 0x00, @@ -7014,11 +7538,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x50, + 0x60, 0x01, 0x00, 0x00, - 0x4f, + 0x5f, 0x01, 0x00, 0x00, @@ -7030,7 +7554,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x51, + 0x62, 0x01, 0x00, 0x00, @@ -7038,281 +7562,13 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x49, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x52, - 0x01, - 0x00, - 0x00, - 0x51, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x53, - 0x01, - 0x00, - 0x00, - 0x50, - 0x01, - 0x00, - 0x00, - 0x52, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x53, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x55, - 0x01, - 0x00, - 0x00, - 0x4e, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x56, - 0x01, - 0x00, - 0x00, - 0x48, - 0x01, - 0x00, - 0x00, - 0x8d, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x57, - 0x01, - 0x00, - 0x00, - 0x55, - 0x01, - 0x00, - 0x00, - 0x56, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x54, - 0x01, - 0x00, - 0x00, - 0x57, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x59, - 0x01, - 0x00, - 0x00, - 0x54, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5a, - 0x01, - 0x00, - 0x00, - 0x48, - 0x01, - 0x00, - 0x00, - 0x88, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5b, - 0x01, - 0x00, - 0x00, - 0x59, - 0x01, - 0x00, - 0x00, - 0x5a, - 0x01, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5c, - 0x01, - 0x00, - 0x00, - 0x5b, - 0x01, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x58, - 0x01, - 0x00, - 0x00, - 0x5c, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5e, - 0x01, - 0x00, - 0x00, - 0x58, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x5f, - 0x01, - 0x00, - 0x00, - 0x58, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x60, - 0x01, - 0x00, - 0x00, - 0x5e, - 0x01, - 0x00, - 0x00, - 0x5f, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x62, - 0x01, - 0x00, - 0x00, - 0x60, - 0x01, - 0x00, - 0x00, 0x61, 0x01, 0x00, 0x00, - 0x83, + 0x3d, 0x00, - 0x05, + 0x04, 0x00, 0x06, 0x00, @@ -7322,970 +7578,42 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0x63, - 0x00, - 0x00, - 0x00, 0x62, 0x01, 0x00, 0x00, - 0x0c, + 0x85, 0x00, - 0x07, + 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x65, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x28, - 0x00, - 0x00, - 0x00, - 0x63, - 0x01, - 0x00, - 0x00, 0x64, 0x01, 0x00, 0x00, - 0x85, + 0x60, + 0x01, 0x00, - 0x05, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x0c, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x00, - 0x67, - 0x01, - 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, - 0x66, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x5d, - 0x01, - 0x00, - 0x00, - 0x67, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x68, - 0x01, - 0x00, - 0x00, - 0x5d, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x6a, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x69, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x6b, - 0x01, - 0x00, - 0x00, - 0x6a, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x6c, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0x68, - 0x01, - 0x00, - 0x00, - 0x6b, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x6d, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x6e, - 0x01, - 0x00, - 0x00, - 0x6d, - 0x01, - 0x00, - 0x00, - 0x6c, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x6e, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x6f, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x31, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x70, - 0x01, - 0x00, - 0x00, - 0x6f, - 0x01, - 0x00, - 0x00, - 0xba, - 0x00, - 0x05, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x71, - 0x01, - 0x00, - 0x00, - 0x70, - 0x01, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0x73, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x71, - 0x01, - 0x00, - 0x00, - 0x72, - 0x01, - 0x00, - 0x00, - 0x73, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x72, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x75, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x07, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x78, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x1a, - 0x00, - 0x00, - 0x00, - 0x75, - 0x01, - 0x00, - 0x00, - 0x77, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x74, - 0x01, - 0x00, - 0x00, - 0x78, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x79, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x7a, - 0x01, - 0x00, - 0x00, - 0x74, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x7b, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x31, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x7c, - 0x01, - 0x00, - 0x00, - 0x7b, - 0x01, - 0x00, - 0x00, - 0x50, - 0x00, - 0x06, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x7d, - 0x01, - 0x00, - 0x00, - 0x7c, - 0x01, - 0x00, - 0x00, - 0x7c, - 0x01, - 0x00, - 0x00, - 0x7c, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x7e, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2e, - 0x00, - 0x00, - 0x00, - 0x79, - 0x01, - 0x00, - 0x00, - 0x7a, - 0x01, - 0x00, - 0x00, - 0x7d, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x7e, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0x73, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x73, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x80, - 0x01, - 0x00, - 0x00, - 0x6b, - 0x00, - 0x00, - 0x00, - 0x50, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x81, - 0x01, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x2c, - 0x00, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x82, - 0x01, - 0x00, - 0x00, - 0x80, - 0x01, - 0x00, - 0x00, - 0x81, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x7f, - 0x01, - 0x00, - 0x00, - 0x82, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x84, - 0x01, - 0x00, - 0x00, - 0x7f, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x69, - 0x00, - 0x00, - 0x00, - 0x85, - 0x01, - 0x00, - 0x00, - 0x7f, - 0x01, - 0x00, - 0x00, - 0x94, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x86, - 0x01, - 0x00, - 0x00, - 0x84, - 0x01, - 0x00, - 0x00, - 0x85, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x87, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0xc1, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x88, - 0x01, - 0x00, - 0x00, - 0x87, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x89, - 0x01, - 0x00, - 0x00, - 0x86, - 0x01, - 0x00, - 0x00, - 0x88, - 0x01, - 0x00, - 0x00, - 0x83, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x8a, - 0x01, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0x89, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x83, - 0x01, - 0x00, - 0x00, - 0x8a, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x8b, - 0x01, - 0x00, - 0x00, - 0x83, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x08, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x8c, - 0x01, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x2b, - 0x00, - 0x00, - 0x00, - 0x8b, - 0x01, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x8d, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x8e, - 0x00, - 0x05, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0x8e, - 0x01, - 0x00, - 0x00, - 0x8d, - 0x01, - 0x00, - 0x00, - 0x8c, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x8e, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x74, - 0x00, - 0x00, - 0x00, - 0x90, - 0x01, - 0x00, - 0x00, - 0x71, - 0x00, - 0x00, - 0x00, - 0x8f, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x91, - 0x01, - 0x00, - 0x00, - 0x90, - 0x01, - 0x00, - 0x00, - 0xba, - 0x00, - 0x05, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x92, - 0x01, - 0x00, - 0x00, - 0x91, - 0x01, - 0x00, - 0x00, - 0x62, - 0x00, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0x94, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0x92, - 0x01, - 0x00, - 0x00, - 0x93, - 0x01, - 0x00, - 0x00, - 0x94, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0x93, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x98, - 0x01, - 0x00, - 0x00, - 0x99, - 0x01, - 0x00, - 0x00, - 0x97, - 0x01, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9a, - 0x01, - 0x00, - 0x00, - 0x99, - 0x01, - 0x00, - 0x00, - 0x85, - 0x00, - 0x05, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9c, - 0x01, - 0x00, - 0x00, - 0x9a, - 0x01, - 0x00, - 0x00, - 0x9b, - 0x01, - 0x00, - 0x00, - 0x0c, - 0x00, - 0x06, - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x9d, - 0x01, - 0x00, - 0x00, 0x01, 0x00, 0x00, @@ -8294,7 +7622,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0x9c, + 0x64, 0x01, 0x00, 0x00, @@ -8302,23 +7630,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x95, + 0x5e, 0x01, 0x00, 0x00, - 0x9d, - 0x01, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0xa0, + 0x65, 0x01, 0x00, 0x00, @@ -8330,115 +7646,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa1, + 0x67, 0x01, 0x00, 0x00, - 0x95, - 0x01, - 0x00, - 0x00, - 0xb8, - 0x00, - 0x05, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0xa2, - 0x01, - 0x00, - 0x00, - 0xa1, - 0x01, - 0x00, - 0x00, - 0x9b, - 0x01, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0xa4, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0xa2, - 0x01, - 0x00, - 0x00, - 0xa3, - 0x01, - 0x00, - 0x00, - 0xa6, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xa3, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xa5, - 0x01, - 0x00, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0x12, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xa5, - 0x01, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xa4, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xa6, + 0x5e, 0x01, 0x00, 0x00, @@ -8450,227 +7662,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xa7, + 0x68, 0x01, 0x00, 0x00, - 0x95, - 0x01, - 0x00, - 0x00, - 0xb8, - 0x00, - 0x05, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0xa9, - 0x01, - 0x00, - 0x00, - 0xa7, - 0x01, - 0x00, - 0x00, - 0xa8, - 0x01, - 0x00, - 0x00, - 0xf7, - 0x00, - 0x03, - 0x00, - 0xab, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xfa, - 0x00, - 0x04, - 0x00, - 0xa9, - 0x01, - 0x00, - 0x00, - 0xaa, - 0x01, - 0x00, - 0x00, - 0xad, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xaa, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xac, - 0x01, - 0x00, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xac, - 0x01, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xab, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xad, - 0x01, - 0x00, - 0x00, - 0x41, - 0x00, - 0x05, - 0x00, - 0x13, - 0x00, - 0x00, - 0x00, - 0xae, - 0x01, - 0x00, - 0x00, - 0x9e, - 0x01, - 0x00, - 0x00, - 0x1e, - 0x00, - 0x00, - 0x00, - 0x3e, - 0x00, - 0x03, - 0x00, - 0xae, - 0x01, - 0x00, - 0x00, - 0x63, - 0x00, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xab, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xab, - 0x01, - 0x00, - 0x00, - 0xf9, - 0x00, - 0x02, - 0x00, - 0xa4, - 0x01, - 0x00, - 0x00, - 0xf8, - 0x00, - 0x02, - 0x00, - 0xa4, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xaf, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xb0, - 0x01, - 0x00, - 0x00, - 0x10, - 0x01, - 0x00, - 0x00, - 0x3d, - 0x00, - 0x04, - 0x00, - 0x07, - 0x00, - 0x00, - 0x00, - 0xb1, - 0x01, - 0x00, - 0x00, - 0x9e, + 0x58, 0x01, 0x00, 0x00, @@ -8678,39 +7674,55 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x05, 0x00, - 0x07, + 0x06, 0x00, 0x00, 0x00, - 0xb2, + 0x69, 0x01, 0x00, 0x00, - 0xb0, + 0x67, 0x01, 0x00, 0x00, - 0xb1, + 0x68, 0x01, 0x00, 0x00, - 0x41, + 0x0c, 0x00, - 0x05, + 0x06, 0x00, - 0x74, + 0x06, 0x00, 0x00, 0x00, - 0xb3, + 0x6a, 0x01, 0x00, 0x00, - 0x71, + 0x01, 0x00, 0x00, 0x00, - 0x8f, + 0x08, + 0x00, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x6a, 0x01, 0x00, 0x00, @@ -8722,35 +7734,103 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb4, + 0x6c, 0x01, 0x00, 0x00, - 0xb3, + 0x58, 0x01, 0x00, 0x00, - 0x50, + 0x83, + 0x00, + 0x05, 0x00, 0x06, 0x00, + 0x00, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, 0x07, 0x00, + 0x06, 0x00, 0x00, - 0xb5, + 0x00, + 0x6f, 0x01, 0x00, 0x00, - 0xb4, 0x01, 0x00, 0x00, - 0xb4, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x6d, 0x01, 0x00, 0x00, - 0xb4, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x6b, 0x01, 0x00, 0x00, @@ -8758,11 +7838,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x08, 0x00, - 0x07, + 0x06, 0x00, 0x00, 0x00, - 0xb6, + 0x72, 0x01, 0x00, 0x00, @@ -8774,15 +7854,15 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xaf, - 0x01, + 0x63, 0x00, 0x00, - 0xb2, - 0x01, + 0x00, + 0x62, 0x00, 0x00, - 0xb5, + 0x00, + 0x71, 0x01, 0x00, 0x00, @@ -8790,27 +7870,95 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x03, 0x00, - 0x10, + 0x70, 0x01, 0x00, 0x00, - 0xb6, + 0x72, 0x01, 0x00, 0x00, - 0xf9, + 0x3d, 0x00, - 0x02, + 0x04, 0x00, - 0x94, + 0x06, + 0x00, + 0x00, + 0x00, + 0x73, 0x01, 0x00, 0x00, - 0xf8, + 0x70, + 0x01, 0x00, - 0x02, 0x00, - 0x94, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x75, 0x01, 0x00, 0x00, @@ -8822,15 +7970,463 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xb7, + 0x77, 0x01, 0x00, 0x00, - 0x10, + 0x16, 0x01, 0x00, 0x00, - 0x51, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x94, 0x00, 0x05, 0x00, @@ -8838,23 +8434,707 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0xa3, + 0x01, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x01, + 0x00, + 0x00, + 0xa3, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x01, + 0x00, + 0x00, + 0xa4, + 0x01, + 0x00, + 0x00, + 0xa5, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xa7, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0xaa, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xab, + 0x01, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xac, + 0x01, + 0x00, + 0x00, + 0xab, + 0x01, + 0x00, + 0x00, + 0xa5, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xac, + 0x01, + 0x00, + 0x00, + 0xad, + 0x01, + 0x00, + 0x00, + 0xb0, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xad, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x01, + 0x00, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xaf, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb0, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x01, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0xb1, + 0x01, + 0x00, + 0x00, + 0xb2, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0xb7, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb7, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, 0xb8, 0x01, 0x00, 0x00, - 0xb7, + 0xa8, 0x01, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, + 0x3e, 0x00, - 0x51, + 0x03, 0x00, - 0x05, + 0xb8, + 0x01, 0x00, - 0x06, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, 0x00, 0x00, 0x00, @@ -8862,7 +9142,631 @@ static const uint8_t kpostfx_frag_spv[] = { 0x01, 0x00, 0x00, - 0xb7, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xba, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbb, + 0x01, + 0x00, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x01, + 0x00, + 0x00, + 0xba, + 0x01, + 0x00, + 0x00, + 0xbb, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x01, + 0x00, + 0x00, + 0xbc, + 0x01, + 0x00, + 0x00, + 0xbf, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0xc0, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x01, + 0x00, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xc4, + 0x01, + 0x00, + 0x00, + 0xc5, + 0x01, + 0x00, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x01, + 0x00, + 0x00, + 0xc8, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x01, + 0x00, + 0x00, + 0xc9, + 0x01, + 0x00, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x01, + 0x00, + 0x00, + 0xcc, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0xcd, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x01, + 0x00, + 0x00, + 0xcf, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0xd0, + 0x01, + 0x00, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x01, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xda, + 0x01, + 0x00, + 0x00, + 0xd8, 0x01, 0x00, 0x00, @@ -8878,11 +9782,11 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xba, + 0xdb, 0x01, 0x00, 0x00, - 0xb7, + 0xd8, 0x01, 0x00, 0x00, @@ -8898,19 +9802,19 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xbb, + 0xdc, 0x01, 0x00, 0x00, - 0xb8, + 0xd9, 0x01, 0x00, 0x00, - 0xb9, + 0xda, 0x01, 0x00, 0x00, - 0xba, + 0xdb, 0x01, 0x00, 0x00, @@ -8926,7 +9830,7 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x00, 0x00, - 0xbb, + 0xdc, 0x01, 0x00, 0x00, @@ -10338,4 +11242,4 @@ static const uint8_t kpostfx_frag_spv[] = { 0x00, 0x01, 0x00}; -static const size_t kpostfx_frag_spv_size = 10336; +static const size_t kpostfx_frag_spv_size = 11240; diff --git a/source/rendering/sdl3gpu/sdl3gpu_shader.cpp b/source/rendering/sdl3gpu/sdl3gpu_shader.cpp index 9ed8b5c..dbff34f 100644 --- a/source/rendering/sdl3gpu/sdl3gpu_shader.cpp +++ b/source/rendering/sdl3gpu/sdl3gpu_shader.cpp @@ -3,12 +3,15 @@ #include #include // std::min, std::max, std::floor -#include // std::floor +#include // std::floor, std::ceil #include // memcpy, strlen #ifndef __APPLE__ +#include "rendering/sdl3gpu/crtpi_frag_spv.h" +#include "rendering/sdl3gpu/downscale_frag_spv.h" #include "rendering/sdl3gpu/postfx_frag_spv.h" #include "rendering/sdl3gpu/postfx_vert_spv.h" +#include "rendering/sdl3gpu/upscale_frag_spv.h" #endif #ifdef __APPLE__ @@ -56,11 +59,10 @@ struct PostFXUniforms { float bleeding; float pixel_scale; float time; - float oversample; // 1.0 = sin SS, 3.0 = 3× supersampling - float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz + float oversample; + float flicker; }; -// YCbCr helpers for NTSC bleeding static float3 rgb_to_ycc(float3 rgb) { return float3( 0.299f*rgb.r + 0.587f*rgb.g + 0.114f*rgb.b, @@ -85,7 +87,6 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], constant PostFXUniforms& u [[buffer(0)]]) { float2 uv = in.uv; - // Curvatura barrel CRT if (u.curvature > 0.0f) { float2 c = uv - 0.5f; float rsq = dot(c, c); @@ -99,15 +100,12 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], uv = c + 0.5f; } - // Muestra base float3 base = scene.sample(samp, uv).rgb; - // Sangrado NTSC — difuminado horizontal de crominancia. - // step = 1 pixel de juego en espacio UV (corrige SS: scene.get_width() = game_w * oversample). float3 colour; if (u.bleeding > 0.0f) { float tw = float(scene.get_width()); - float step = u.oversample / tw; // 1 pixel lógico en UV + float step = u.oversample / tw; float3 ycc = rgb_to_ycc(base); float3 ycc_l2 = rgb_to_ycc(scene.sample(samp, uv - float2(2.0f*step, 0.0f)).rgb); float3 ycc_l1 = rgb_to_ycc(scene.sample(samp, uv - float2(1.0f*step, 0.0f)).rgb); @@ -119,26 +117,24 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], colour = base; } - // Aberración cromática (drift animado con time para efecto NTSC real) float ca = u.chroma_strength * 0.005f * (1.0f + 0.15f * sin(u.time * 7.3f)); colour.r = scene.sample(samp, uv + float2(ca, 0.0f)).r; colour.b = scene.sample(samp, uv - float2(ca, 0.0f)).b; - // Corrección gamma (linealizar antes de scanlines, codificar después) if (u.gamma_strength > 0.0f) { float3 lin = pow(colour, float3(2.4f)); colour = mix(colour, lin, u.gamma_strength); } - // Scanlines — 1 pixel físico oscuro por fila lógica. - // Modelo sustractivo: las filas de scanline se oscurecen, las demás no cambian. - // Esto evita el efecto de sobrebrillo en contenido con colores vivos. + const float SCAN_DARK_RATIO = 0.333f; + const float SCAN_DARK_FLOOR = 0.42f; if (u.scanline_strength > 0.0f) { float ps = max(1.0f, round(u.pixel_scale)); float frac_in_row = fract(uv.y * u.screen_height); float row_pos = floor(frac_in_row * ps); - float is_dark = step(ps - 1.0f, row_pos); - float scan = mix(1.0f, 0.0f, is_dark); + float bright_rows = (ps < 2.0f) ? ps : ((ps < 3.0f) ? 1.0f : floor(ps * (1.0f - SCAN_DARK_RATIO))); + float is_dark = step(bright_rows, row_pos); + float scan = mix(1.0f, SCAN_DARK_FLOOR, is_dark); colour *= mix(1.0f, scan, u.scanline_strength); } @@ -147,13 +143,10 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], colour = mix(colour, enc, u.gamma_strength); } - // Viñeta float2 d = uv - 0.5f; float vignette = 1.0f - dot(d, d) * u.vignette_strength; colour *= clamp(vignette, 0.0f, 1.0f); - // Máscara de fósforo RGB — después de scanlines (orden original): - // filas brillantes saturadas → máscara invisible, filas oscuras → RGB visible. if (u.mask_strength > 0.0f) { float whichMask = fract(in.pos.x * 0.3333333f); float3 mask = float3(0.80f); @@ -163,7 +156,6 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], colour = mix(colour, colour * mask, u.mask_strength); } - // Parpadeo de fósforo CRT (~50 Hz) if (u.flicker > 0.0f) { float flicker_wave = sin(u.time * 100.0f) * 0.5f + 0.5f; colour *= 1.0f - u.flicker * 0.04f * flicker_wave; @@ -172,6 +164,183 @@ fragment float4 postfx_fs(PostVOut in [[stage_in]], return float4(colour, 1.0f); } )"; +static const char* UPSCALE_FRAG_MSL = R"( +#include +using namespace metal; +struct VertOut { float4 pos [[position]]; float2 uv; }; +fragment float4 upscale_fs(VertOut in [[stage_in]], + texture2d scene [[texture(0)]], + sampler smp [[sampler(0)]]) +{ + return scene.sample(smp, in.uv); +} +)"; + +static const char* DOWNSCALE_FRAG_MSL = R"( +#include +using namespace metal; +struct VertOut { float4 pos [[position]]; float2 uv; }; +struct DownscaleUniforms { int algorithm; float pad0; float pad1; float pad2; }; + +static float lanczos_w(float t, float a) { + t = abs(t); + if (t < 0.0001f) { return 1.0f; } + if (t >= a) { return 0.0f; } + const float PI = 3.14159265358979f; + float pt = PI * t; + return (a * sin(pt) * sin(pt / a)) / (pt * pt); +} + +fragment float4 downscale_fs(VertOut in [[stage_in]], + texture2d source [[texture(0)]], + sampler smp [[sampler(0)]], + constant DownscaleUniforms& u [[buffer(0)]]) +{ + float2 src_size = float2(source.get_width(), source.get_height()); + float2 p = in.uv * src_size; + float2 p_floor = floor(p); + float a = (u.algorithm == 0) ? 2.0f : 3.0f; + int win = int(a); + float4 color = float4(0.0f); + float weight_sum = 0.0f; + for (int j = -win; j <= win; j++) { + for (int i = -win; i <= win; i++) { + float2 tap_center = p_floor + float2(float(i), float(j)) + 0.5f; + float2 offset = tap_center - p; + float w = lanczos_w(offset.x, a) * lanczos_w(offset.y, a); + color += source.sample(smp, tap_center / src_size) * w; + weight_sum += w; + } + } + return (weight_sum > 0.0f) ? (color / weight_sum) : float4(0.0f, 0.0f, 0.0f, 1.0f); +} +)"; +static const char* CRTPI_FRAG_MSL = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +struct CrtPiUniforms { + float scanline_weight; + float scanline_gap_brightness; + float bloom_factor; + float input_gamma; + float output_gamma; + float mask_brightness; + float curvature_x; + float curvature_y; + int mask_type; + int enable_scanlines; + int enable_multisample; + int enable_gamma; + int enable_curvature; + int enable_sharper; + float texture_width; + float texture_height; +}; + +static float2 crtpi_distort(float2 coord, float2 screen_scale, float cx, float cy) { + float2 curvature = float2(cx, cy); + float2 barrel_scale = 1.0f - (0.23f * curvature); + coord *= screen_scale; + coord -= 0.5f; + float rsq = coord.x * coord.x + coord.y * coord.y; + coord += coord * (curvature * rsq); + coord *= barrel_scale; + if (abs(coord.x) >= 0.5f || abs(coord.y) >= 0.5f) { return float2(-1.0f); } + coord += 0.5f; + coord /= screen_scale; + return coord; +} + +static float crtpi_scan_weight(float dist, float sw, float gap) { + return max(1.0f - dist * dist * sw, gap); +} + +static float crtpi_scan_line(float dy, float filter_w, float sw, float gap, bool ms) { + float w = crtpi_scan_weight(dy, sw, gap); + if (ms) { + w += crtpi_scan_weight(dy - filter_w, sw, gap); + w += crtpi_scan_weight(dy + filter_w, sw, gap); + w *= 0.3333333f; + } + return w; +} + +fragment float4 crtpi_fs(PostVOut in [[stage_in]], + texture2d tex [[texture(0)]], + sampler samp [[sampler(0)]], + constant CrtPiUniforms& u [[buffer(0)]]) { + float2 tex_size = float2(u.texture_width, u.texture_height); + float filter_width = (768.0f / u.texture_height) / 3.0f; + float2 texcoord = in.uv; + + if (u.enable_curvature != 0) { + texcoord = crtpi_distort(texcoord, float2(1.0f, 1.0f), u.curvature_x, u.curvature_y); + if (texcoord.x < 0.0f) { return float4(0.0f, 0.0f, 0.0f, 1.0f); } + } + + float2 coord_in_pixels = texcoord * tex_size; + float2 tc; + float scan_weight; + + if (u.enable_sharper != 0) { + float2 temp = floor(coord_in_pixels) + 0.5f; + tc = temp / tex_size; + float2 deltas = coord_in_pixels - temp; + scan_weight = crtpi_scan_line(deltas.y, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float2 signs = sign(deltas); + deltas.x *= 2.0f; + deltas = deltas * deltas; + deltas.y = deltas.y * deltas.y; + deltas.x *= 0.5f; + deltas.y *= 8.0f; + deltas /= tex_size; + deltas *= signs; + tc = tc + deltas; + } else { + float temp_y = floor(coord_in_pixels.y) + 0.5f; + float y_coord = temp_y / tex_size.y; + float dy = coord_in_pixels.y - temp_y; + scan_weight = crtpi_scan_line(dy, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float sign_y = sign(dy); + dy = dy * dy; + dy = dy * dy; + dy *= 8.0f; + dy /= tex_size.y; + dy *= sign_y; + tc = float2(texcoord.x, y_coord + dy); + } + + float3 colour = tex.sample(samp, tc).rgb; + + if (u.enable_scanlines != 0) { + if (u.enable_gamma != 0) { colour = pow(colour, float3(u.input_gamma)); } + colour *= scan_weight * u.bloom_factor; + if (u.enable_gamma != 0) { colour = pow(colour, float3(1.0f / u.output_gamma)); } + } + + if (u.mask_type == 1) { + float wm = fract(in.pos.x * 0.5f); + float3 mask = (wm < 0.5f) ? float3(u.mask_brightness, 1.0f, u.mask_brightness) + : float3(1.0f, u.mask_brightness, 1.0f); + colour *= mask; + } else if (u.mask_type == 2) { + float wm = fract(in.pos.x * 0.3333333f); + float3 mask = float3(u.mask_brightness); + if (wm < 0.3333333f) mask.x = 1.0f; + else if (wm < 0.6666666f) mask.y = 1.0f; + else mask.z = 1.0f; + colour *= mask; + } + + return float4(colour, 1.0f); +} +)"; // NOLINTEND(readability-identifier-naming) #endif // __APPLE__ @@ -192,64 +361,63 @@ namespace Rendering { SDL_Texture* texture, const std::string& /*vertex_source*/, const std::string& /*fragment_source*/) -> bool { - // Si ya estaba inicializado (p.ej. al cambiar borde), liberar recursos - // de textura/pipeline pero mantener el device vivo para evitar conflictos - // con SDL_Renderer en Windows/Vulkan. if (is_initialized_) { cleanup(); } window_ = window; - // Dimensions from the SDL_Texture placeholder float fw = 0.0F; float fh = 0.0F; SDL_GetTextureSize(texture, &fw, &fh); game_width_ = static_cast(fw); game_height_ = static_cast(fh); - tex_width_ = game_width_ * oversample_; - tex_height_ = game_height_ * oversample_; - uniforms_.screen_height = static_cast(tex_height_); // Altura de la textura GPU + uniforms_.screen_height = static_cast(game_height_); uniforms_.oversample = static_cast(oversample_); - // ---------------------------------------------------------------- - // 1. Create GPU device (solo si no existe ya) - // ---------------------------------------------------------------- + // 1. GPU disabled by config + if (preferred_driver_ == "none") { + SDL_Log("SDL3GPUShader: GPU disabled by config, using SDL_Renderer fallback"); + driver_name_ = ""; + return false; + } + + // 2. Create GPU device (solo si no existe ya) if (device_ == nullptr) { #ifdef __APPLE__ const SDL_GPUShaderFormat PREFERRED = SDL_GPU_SHADERFORMAT_MSL | SDL_GPU_SHADERFORMAT_METALLIB; #else const SDL_GPUShaderFormat PREFERRED = SDL_GPU_SHADERFORMAT_SPIRV; #endif - device_ = SDL_CreateGPUDevice(PREFERRED, false, nullptr); + const char* preferred = preferred_driver_.empty() ? nullptr : preferred_driver_.c_str(); + device_ = SDL_CreateGPUDevice(PREFERRED, false, preferred); + if (device_ == nullptr && preferred != nullptr) { + SDL_Log("SDL3GPUShader: driver '%s' not available, falling back to auto", preferred); + device_ = SDL_CreateGPUDevice(PREFERRED, false, nullptr); + } if (device_ == nullptr) { SDL_Log("SDL3GPUShader: SDL_CreateGPUDevice failed: %s", SDL_GetError()); return false; } - SDL_Log("SDL3GPUShader: driver = %s", SDL_GetGPUDeviceDriver(device_)); + driver_name_ = SDL_GetGPUDeviceDriver(device_); + SDL_Log("SDL3GPUShader: driver = %s", driver_name_.c_str()); - // ---------------------------------------------------------------- - // 2. Claim window (una sola vez — no liberar hasta destroy()) - // ---------------------------------------------------------------- if (!SDL_ClaimWindowForGPUDevice(device_, window_)) { SDL_Log("SDL3GPUShader: SDL_ClaimWindowForGPUDevice failed: %s", SDL_GetError()); SDL_DestroyGPUDevice(device_); device_ = nullptr; return false; } - SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, vsync_ ? SDL_GPU_PRESENTMODE_VSYNC : SDL_GPU_PRESENTMODE_IMMEDIATE); + SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, bestPresentMode(vsync_)); } - // ---------------------------------------------------------------- - // 3. Create scene texture (upload target + sampler source) - // Format: B8G8R8A8_UNORM matches SDL ARGB8888 byte layout on LE - // ---------------------------------------------------------------- + // 3. Create scene texture (always game resolution) SDL_GPUTextureCreateInfo tex_info = {}; tex_info.type = SDL_GPU_TEXTURETYPE_2D; tex_info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; tex_info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER; - tex_info.width = static_cast(tex_width_); - tex_info.height = static_cast(tex_height_); + tex_info.width = static_cast(game_width_); + tex_info.height = static_cast(game_height_); tex_info.layer_count_or_depth = 1; tex_info.num_levels = 1; scene_texture_ = SDL_CreateGPUTexture(device_, &tex_info); @@ -259,12 +427,12 @@ namespace Rendering { return false; } - // ---------------------------------------------------------------- - // 4. Create upload transfer buffer (CPU → GPU, size = w*h*4 bytes) - // ---------------------------------------------------------------- + ss_factor_ = 0; + + // 4. Create upload transfer buffer (always game resolution) SDL_GPUTransferBufferCreateInfo tb_info = {}; tb_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; - tb_info.size = static_cast(tex_width_ * tex_height_ * 4); + tb_info.size = static_cast(game_width_ * game_height_ * 4); upload_buffer_ = SDL_CreateGPUTransferBuffer(device_, &tb_info); if (upload_buffer_ == nullptr) { SDL_Log("SDL3GPUShader: failed to create upload buffer: %s", SDL_GetError()); @@ -272,9 +440,7 @@ namespace Rendering { return false; } - // ---------------------------------------------------------------- - // 5. Create samplers: NEAREST (pixel art) + LINEAR (supersampling) - // ---------------------------------------------------------------- + // 5. Create samplers SDL_GPUSamplerCreateInfo samp_info = {}; samp_info.min_filter = SDL_GPU_FILTER_NEAREST; samp_info.mag_filter = SDL_GPU_FILTER_NEAREST; @@ -303,25 +469,28 @@ namespace Rendering { return false; } - // ---------------------------------------------------------------- - // 6. Create PostFX graphics pipeline - // ---------------------------------------------------------------- + // 6. Create pipelines if (!createPipeline()) { cleanup(); return false; } + if (!createCrtPiPipeline()) { + cleanup(); + return false; + } is_initialized_ = true; - SDL_Log("SDL3GPUShader: initialized OK (%dx%d)", tex_width_, tex_height_); + SDL_Log("SDL3GPUShader: initialized OK (%dx%d)", game_width_, game_height_); return true; } // --------------------------------------------------------------------------- - // createPipeline + // createPipeline — PostFX + Upscale + PostFX offscreen + Downscale pipelines // --------------------------------------------------------------------------- - auto SDL3GPUShader::createPipeline() -> bool { + auto SDL3GPUShader::createPipeline() -> bool { // NOLINT(readability-function-cognitive-complexity) const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); + // ---- PostFX pipeline (→ swapchain) ---- #ifdef __APPLE__ SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); SDL_GPUShader* frag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); @@ -356,21 +525,172 @@ namespace Rendering { pipe_info.target_info.color_target_descriptions = &color_target; pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &pipe_info); - SDL_ReleaseGPUShader(device_, vert); SDL_ReleaseGPUShader(device_, frag); if (pipeline_ == nullptr) { - SDL_Log("SDL3GPUShader: pipeline creation failed: %s", SDL_GetError()); + SDL_Log("SDL3GPUShader: PostFX pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- Upscale pipeline (scene → scaled_texture_) ---- +#ifdef __APPLE__ + SDL_GPUShader* uvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* ufrag = createShaderMSL(device_, UPSCALE_FRAG_MSL, "upscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); +#else + SDL_GPUShader* uvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* ufrag = createShaderSPIRV(device_, kupscale_frag_spv, kupscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); +#endif + + if ((uvert == nullptr) || (ufrag == nullptr)) { + if (uvert != nullptr) { SDL_ReleaseGPUShader(device_, uvert); } + if (ufrag != nullptr) { SDL_ReleaseGPUShader(device_, ufrag); } + return false; + } + + SDL_GPUColorTargetDescription upscale_ct = {}; + upscale_ct.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + upscale_ct.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo upscale_pi = {}; + upscale_pi.vertex_shader = uvert; + upscale_pi.fragment_shader = ufrag; + upscale_pi.vertex_input_state = no_input; + upscale_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + upscale_pi.target_info.num_color_targets = 1; + upscale_pi.target_info.color_target_descriptions = &upscale_ct; + + upscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &upscale_pi); + SDL_ReleaseGPUShader(device_, uvert); + SDL_ReleaseGPUShader(device_, ufrag); + + if (upscale_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: upscale pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- PostFX offscreen pipeline (→ B8G8R8A8 texture, for Lanczos path) ---- +#ifdef __APPLE__ + SDL_GPUShader* ofvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* offrag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* ofvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* offrag = createShaderSPIRV(device_, kpostfx_frag_spv, kpostfx_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((ofvert == nullptr) || (offrag == nullptr)) { + if (ofvert != nullptr) { SDL_ReleaseGPUShader(device_, ofvert); } + if (offrag != nullptr) { SDL_ReleaseGPUShader(device_, offrag); } + return false; + } + + SDL_GPUColorTargetDescription offscreen_ct = {}; + offscreen_ct.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + offscreen_ct.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo offscreen_pi = {}; + offscreen_pi.vertex_shader = ofvert; + offscreen_pi.fragment_shader = offrag; + offscreen_pi.vertex_input_state = no_input; + offscreen_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + offscreen_pi.target_info.num_color_targets = 1; + offscreen_pi.target_info.color_target_descriptions = &offscreen_ct; + + postfx_offscreen_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &offscreen_pi); + SDL_ReleaseGPUShader(device_, ofvert); + SDL_ReleaseGPUShader(device_, offrag); + + if (postfx_offscreen_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: PostFX offscreen pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- Downscale pipeline (Lanczos → swapchain) ---- +#ifdef __APPLE__ + SDL_GPUShader* dvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* dfrag = createShaderMSL(device_, DOWNSCALE_FRAG_MSL, "downscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* dvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* dfrag = createShaderSPIRV(device_, kdownscale_frag_spv, kdownscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((dvert == nullptr) || (dfrag == nullptr)) { + if (dvert != nullptr) { SDL_ReleaseGPUShader(device_, dvert); } + if (dfrag != nullptr) { SDL_ReleaseGPUShader(device_, dfrag); } + return false; + } + + SDL_GPUColorTargetDescription downscale_ct = {}; + downscale_ct.format = SWAPCHAIN_FMT; + downscale_ct.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo downscale_pi = {}; + downscale_pi.vertex_shader = dvert; + downscale_pi.fragment_shader = dfrag; + downscale_pi.vertex_input_state = no_input; + downscale_pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + downscale_pi.target_info.num_color_targets = 1; + downscale_pi.target_info.color_target_descriptions = &downscale_ct; + + downscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &downscale_pi); + SDL_ReleaseGPUShader(device_, dvert); + SDL_ReleaseGPUShader(device_, dfrag); + + if (downscale_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: downscale pipeline creation failed: %s", SDL_GetError()); + return false; + } + + return true; + } + + // --------------------------------------------------------------------------- + // createCrtPiPipeline + // --------------------------------------------------------------------------- + auto SDL3GPUShader::createCrtPiPipeline() -> bool { + const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); + +#ifdef __APPLE__ + SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderMSL(device_, CRTPI_FRAG_MSL, "crtpi_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* vert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderSPIRV(device_, kcrtpi_frag_spv, kcrtpi_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((vert == nullptr) || (frag == nullptr)) { + if (vert != nullptr) { SDL_ReleaseGPUShader(device_, vert); } + if (frag != nullptr) { SDL_ReleaseGPUShader(device_, frag); } + return false; + } + + SDL_GPUColorTargetBlendState no_blend = {}; + SDL_GPUColorTargetDescription ct = {}; + ct.format = SWAPCHAIN_FMT; + ct.blend_state = no_blend; + + SDL_GPUVertexInputState no_input = {}; + SDL_GPUGraphicsPipelineCreateInfo pi = {}; + pi.vertex_shader = vert; + pi.fragment_shader = frag; + pi.vertex_input_state = no_input; + pi.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + pi.target_info.num_color_targets = 1; + pi.target_info.color_target_descriptions = &ct; + + crtpi_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &pi); + SDL_ReleaseGPUShader(device_, vert); + SDL_ReleaseGPUShader(device_, frag); + + if (crtpi_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: CrtPi pipeline creation failed: %s", SDL_GetError()); return false; } return true; } // --------------------------------------------------------------------------- - // uploadPixels — copies ARGB8888 CPU pixels into the GPU transfer buffer. - // Con supersampling (oversample_ > 1) expande cada pixel del juego a un bloque - // oversample × oversample y hornea la scanline oscura en la última fila del bloque. + // uploadPixels — direct memcpy, GPU handles upscale // --------------------------------------------------------------------------- void SDL3GPUShader::uploadPixels(const Uint32* pixels, int width, int height) { if (!is_initialized_ || (upload_buffer_ == nullptr)) { return; } @@ -381,53 +701,29 @@ namespace Rendering { return; } - if (oversample_ <= 1) { - // Path sin supersampling: copia directa - std::memcpy(mapped, pixels, static_cast(width * height * 4)); - } else { - // Path con supersampling: expande cada pixel a OS×OS, oscurece última fila. - // Modelo sustractivo: filas normales sin cambio, fila de scanline oscurecida a 0. - auto* out = static_cast(mapped); - const int OS = oversample_; - const float BRIGHT_MUL = 1.0F; // rows 0..OS-2: sin cambio - const float DARK_MUL = 1.0F - baked_scanline_strength_; // row OS-1: hasta negro - - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - const Uint32 SRC = pixels[(y * width) + x]; - const Uint32 ALPHA = (SRC >> 24) & 0xFFU; - const auto FR = static_cast((SRC >> 16) & 0xFFU); - const auto FG = static_cast((SRC >> 8) & 0xFFU); - const auto FB = static_cast(SRC & 0xFFU); - - auto make_px = [ALPHA](float rv, float gv, float bv) -> Uint32 { - auto cl = [](float v) -> Uint32 { return static_cast(std::min(255.0F, v)); }; - return (ALPHA << 24) | (cl(rv) << 16) | (cl(gv) << 8) | cl(bv); - }; - - const Uint32 BRIGHT = make_px(FR * BRIGHT_MUL, FG * BRIGHT_MUL, FB * BRIGHT_MUL); - const Uint32 DARK = make_px(FR * DARK_MUL, FG * DARK_MUL, FB * DARK_MUL); - - for (int dy = 0; dy < OS; ++dy) { - const Uint32 OUT_PX = (dy == OS - 1) ? DARK : BRIGHT; - const int DST_Y = (y * OS) + dy; - for (int dx = 0; dx < OS; ++dx) { - out[(DST_Y * (width * OS)) + ((x * OS) + dx)] = OUT_PX; - } - } - } - } - } - + std::memcpy(mapped, pixels, static_cast(width * height * 4)); SDL_UnmapGPUTransferBuffer(device_, upload_buffer_); } // --------------------------------------------------------------------------- - // render — upload scene texture + PostFX pass → swapchain + // render — 3-path: CrtPi direct, PostFX+Lanczos, PostFX direct // --------------------------------------------------------------------------- - void SDL3GPUShader::render() { + void SDL3GPUShader::render() { // NOLINT(readability-function-cognitive-complexity) if (!is_initialized_) { return; } + // SS factor calculation + if (oversample_ > 1 && game_height_ > 0) { + int win_w = 0; + int win_h = 0; + SDL_GetWindowSizeInPixels(window_, &win_w, &win_h); + const float ZOOM = static_cast(win_h) / static_cast(game_height_); + const int NEED_FACTOR = calcSsFactor(ZOOM); + if (NEED_FACTOR != ss_factor_) { + SDL_WaitForGPUIdle(device_); + recreateScaledTexture(NEED_FACTOR); + } + } + SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(device_); if (cmd == nullptr) { SDL_Log("SDL3GPUShader: SDL_AcquireGPUCommandBuffer failed: %s", SDL_GetError()); @@ -440,19 +736,38 @@ namespace Rendering { SDL_GPUTextureTransferInfo src = {}; src.transfer_buffer = upload_buffer_; src.offset = 0; - src.pixels_per_row = static_cast(tex_width_); - src.rows_per_layer = static_cast(tex_height_); + src.pixels_per_row = static_cast(game_width_); + src.rows_per_layer = static_cast(game_height_); SDL_GPUTextureRegion dst = {}; dst.texture = scene_texture_; - dst.w = static_cast(tex_width_); - dst.h = static_cast(tex_height_); + dst.w = static_cast(game_width_); + dst.h = static_cast(game_height_); dst.d = 1; SDL_UploadToGPUTexture(copy, &src, &dst, false); SDL_EndGPUCopyPass(copy); } + // ---- Upscale pass: scene → scaled_texture_ ---- + if (oversample_ > 1 && scaled_texture_ != nullptr && upscale_pipeline_ != nullptr) { + SDL_GPUColorTargetInfo upscale_target = {}; + upscale_target.texture = scaled_texture_; + upscale_target.load_op = SDL_GPU_LOADOP_DONT_CARE; + upscale_target.store_op = SDL_GPU_STOREOP_STORE; + + SDL_GPURenderPass* upass = SDL_BeginGPURenderPass(cmd, &upscale_target, 1, nullptr); + if (upass != nullptr) { + SDL_BindGPUGraphicsPipeline(upass, upscale_pipeline_); + SDL_GPUTextureSamplerBinding ubinding = {}; + ubinding.texture = scene_texture_; + ubinding.sampler = (linear_upscale_ && linear_sampler_ != nullptr) ? linear_sampler_ : sampler_; + SDL_BindGPUFragmentSamplers(upass, 0, &ubinding, 1); + SDL_DrawGPUPrimitives(upass, 3, 1, 0, 0); + SDL_EndGPURenderPass(upass); + } + } + // ---- Acquire swapchain texture ---- SDL_GPUTexture* swapchain = nullptr; Uint32 sw = 0; @@ -463,75 +778,147 @@ namespace Rendering { return; } if (swapchain == nullptr) { - // Window minimized — skip frame SDL_SubmitGPUCommandBuffer(cmd); return; } - // ---- Render pass: PostFX → swapchain ---- - SDL_GPUColorTargetInfo color_target = {}; - color_target.texture = swapchain; - color_target.load_op = SDL_GPU_LOADOP_CLEAR; - color_target.store_op = SDL_GPU_STOREOP_STORE; - color_target.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + // ---- Viewport calculation ---- + float vx = 0.0F; + float vy = 0.0F; + float vw = 0.0F; + float vh = 0.0F; + if (integer_scale_) { + const int SCALE = std::max(1, std::min(static_cast(sw) / game_width_, static_cast(sh) / game_height_)); + vw = static_cast(game_width_ * SCALE); + vh = static_cast(game_height_ * SCALE); + } else { + const float SCALE = std::min( + static_cast(sw) / static_cast(game_width_), + static_cast(sh) / static_cast(game_height_)); + vw = static_cast(game_width_) * SCALE; + vh = static_cast(game_height_) * SCALE; + } + vx = std::floor((static_cast(sw) - vw) * 0.5F); + vy = std::floor((static_cast(sh) - vh) * 0.5F); - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &color_target, 1, nullptr); - if (pass != nullptr) { - SDL_BindGPUGraphicsPipeline(pass, pipeline_); + if (oversample_ > 1 && ss_factor_ > 0) { + uniforms_.pixel_scale = static_cast(ss_factor_); + } else { + uniforms_.pixel_scale = (game_height_ > 0) ? (vh / static_cast(game_height_)) : 1.0F; + } + uniforms_.time = static_cast(SDL_GetTicks()) / 1000.0F; + uniforms_.oversample = (oversample_ > 1 && ss_factor_ > 0) + ? static_cast(ss_factor_) + : 1.0F; - // Calcular viewport usando las dimensiones lógicas del canvas (game_width_/height_), - // no las de la textura GPU (que pueden ser game×3 con supersampling). - // El GPU escala la textura para cubrir el viewport independientemente de su resolución. - float vx = 0.0F; - float vy = 0.0F; - float vw = 0.0F; - float vh = 0.0F; - if (integer_scale_) { - const int SCALE = std::max(1, std::min(static_cast(sw) / game_width_, static_cast(sh) / game_height_)); - vw = static_cast(game_width_ * SCALE); - vh = static_cast(game_height_ * SCALE); - } else { - const float SCALE = std::min( - static_cast(sw) / static_cast(game_width_), - static_cast(sh) / static_cast(game_height_)); - vw = static_cast(game_width_) * SCALE; - vh = static_cast(game_height_) * SCALE; + // ---- Path A: CrtPi direct ---- + if (active_shader_ == ShaderType::CRTPI && crtpi_pipeline_ != nullptr) { + SDL_GPUColorTargetInfo ct = {}; + ct.texture = swapchain; + ct.load_op = SDL_GPU_LOADOP_CLEAR; + ct.store_op = SDL_GPU_STOREOP_STORE; + ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &ct, 1, nullptr); + if (pass != nullptr) { + SDL_BindGPUGraphicsPipeline(pass, crtpi_pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(pass, &vp); + + SDL_GPUTextureSamplerBinding binding = {}; + binding.texture = scene_texture_; + binding.sampler = sampler_; + SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + + crtpi_uniforms_.texture_width = static_cast(game_width_); + crtpi_uniforms_.texture_height = static_cast(game_height_); + SDL_PushGPUFragmentUniformData(cmd, 0, &crtpi_uniforms_, sizeof(CrtPiUniforms)); + + SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); + SDL_EndGPURenderPass(pass); } - vx = std::floor((static_cast(sw) - vw) * 0.5F); - vy = std::floor((static_cast(sh) - vh) * 0.5F); - SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; - SDL_SetGPUViewport(pass, &vp); - // pixel_scale: pixels físicos por pixel lógico de juego (para scanlines sin SS). - // Con SS las scanlines están horneadas en CPU → scanline_strength=0 → no se usa. - uniforms_.pixel_scale = (game_height_ > 0) - ? (vh / static_cast(game_height_)) - : 1.0F; - uniforms_.time = static_cast(SDL_GetTicks()) / 1000.0F; - uniforms_.oversample = static_cast(oversample_); + SDL_SubmitGPUCommandBuffer(cmd); + return; + } - // Con supersampling usamos LINEAR para que el escalado a zooms no-múltiplo-de-3 - // promedia correctamente las filas de scanline horneadas en CPU. - SDL_GPUSampler* active_sampler = (oversample_ > 1 && linear_sampler_ != nullptr) - ? linear_sampler_ - : sampler_; + // ---- Path B: PostFX + Lanczos (SS active + algo selected) ---- + const bool USE_LANCZOS = (oversample_ > 1 && downscale_algo_ > 0 && scaled_texture_ != nullptr && postfx_texture_ != nullptr && postfx_offscreen_pipeline_ != nullptr && downscale_pipeline_ != nullptr); - SDL_GPUTextureSamplerBinding binding = {}; - binding.texture = scene_texture_; - binding.sampler = active_sampler; - SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + if (USE_LANCZOS) { + // Pass B1: PostFX → postfx_texture_ + SDL_GPUColorTargetInfo postfx_ct = {}; + postfx_ct.texture = postfx_texture_; + postfx_ct.load_op = SDL_GPU_LOADOP_CLEAR; + postfx_ct.store_op = SDL_GPU_STOREOP_STORE; + postfx_ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; - SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); + SDL_GPURenderPass* ppass = SDL_BeginGPURenderPass(cmd, &postfx_ct, 1, nullptr); + if (ppass != nullptr) { + SDL_BindGPUGraphicsPipeline(ppass, postfx_offscreen_pipeline_); + SDL_GPUTextureSamplerBinding pbinding = {}; + pbinding.texture = scaled_texture_; + pbinding.sampler = sampler_; + SDL_BindGPUFragmentSamplers(ppass, 0, &pbinding, 1); + SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); + SDL_DrawGPUPrimitives(ppass, 3, 1, 0, 0); + SDL_EndGPURenderPass(ppass); + } - SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); - SDL_EndGPURenderPass(pass); + // Pass B2: Lanczos downscale → swapchain + SDL_GPUColorTargetInfo ds_ct = {}; + ds_ct.texture = swapchain; + ds_ct.load_op = SDL_GPU_LOADOP_CLEAR; + ds_ct.store_op = SDL_GPU_STOREOP_STORE; + ds_ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* dpass = SDL_BeginGPURenderPass(cmd, &ds_ct, 1, nullptr); + if (dpass != nullptr) { + SDL_BindGPUGraphicsPipeline(dpass, downscale_pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(dpass, &vp); + SDL_GPUTextureSamplerBinding dbinding = {}; + dbinding.texture = postfx_texture_; + dbinding.sampler = sampler_; + SDL_BindGPUFragmentSamplers(dpass, 0, &dbinding, 1); + DownscaleUniforms du = {.algorithm = downscale_algo_ - 1, .pad0 = 0.0F, .pad1 = 0.0F, .pad2 = 0.0F}; + SDL_PushGPUFragmentUniformData(cmd, 0, &du, sizeof(DownscaleUniforms)); + SDL_DrawGPUPrimitives(dpass, 3, 1, 0, 0); + SDL_EndGPURenderPass(dpass); + } + } else { + // ---- Path C: PostFX direct → swapchain ---- + SDL_GPUColorTargetInfo ct = {}; + ct.texture = swapchain; + ct.load_op = SDL_GPU_LOADOP_CLEAR; + ct.store_op = SDL_GPU_STOREOP_STORE; + ct.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &ct, 1, nullptr); + if (pass != nullptr) { + SDL_BindGPUGraphicsPipeline(pass, pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(pass, &vp); + + SDL_GPUTexture* input_texture = (oversample_ > 1 && scaled_texture_ != nullptr) ? scaled_texture_ : scene_texture_; + SDL_GPUSampler* active_sampler = (oversample_ > 1 && linear_sampler_ != nullptr) ? linear_sampler_ : sampler_; + + SDL_GPUTextureSamplerBinding binding = {}; + binding.texture = input_texture; + binding.sampler = active_sampler; + SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + + SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); + SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); + SDL_EndGPURenderPass(pass); + } } SDL_SubmitGPUCommandBuffer(cmd); } // --------------------------------------------------------------------------- - // cleanup — libera pipeline/texturas/buffer pero mantiene device + swapchain + // cleanup // --------------------------------------------------------------------------- void SDL3GPUShader::cleanup() { is_initialized_ = false; @@ -539,14 +926,28 @@ namespace Rendering { if (device_ != nullptr) { SDL_WaitForGPUIdle(device_); - if (pipeline_ != nullptr) { - SDL_ReleaseGPUGraphicsPipeline(device_, pipeline_); - pipeline_ = nullptr; - } - if (scene_texture_ != nullptr) { - SDL_ReleaseGPUTexture(device_, scene_texture_); - scene_texture_ = nullptr; - } + auto release_pipeline = [this](SDL_GPUGraphicsPipeline*& p) { + if (p != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, p); + p = nullptr; + } + }; + auto release_texture = [this](SDL_GPUTexture*& t) { + if (t != nullptr) { + SDL_ReleaseGPUTexture(device_, t); + t = nullptr; + } + }; + + release_pipeline(pipeline_); + release_pipeline(crtpi_pipeline_); + release_pipeline(postfx_offscreen_pipeline_); + release_pipeline(upscale_pipeline_); + release_pipeline(downscale_pipeline_); + release_texture(scene_texture_); + release_texture(scaled_texture_); + release_texture(postfx_texture_); + ss_factor_ = 0; if (upload_buffer_ != nullptr) { SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); upload_buffer_ = nullptr; @@ -559,12 +960,11 @@ namespace Rendering { SDL_ReleaseGPUSampler(device_, linear_sampler_); linear_sampler_ = nullptr; } - // device_ y el claim de la ventana se mantienen vivos } } // --------------------------------------------------------------------------- - // destroy — limpieza completa incluyendo device y swapchain (solo al cerrar) + // destroy // --------------------------------------------------------------------------- void SDL3GPUShader::destroy() { cleanup(); @@ -628,22 +1028,50 @@ namespace Rendering { void SDL3GPUShader::setPostFXParams(const PostFXParams& p) { uniforms_.vignette_strength = p.vignette; uniforms_.chroma_strength = p.chroma; + uniforms_.scanline_strength = p.scanlines; uniforms_.mask_strength = p.mask; uniforms_.gamma_strength = p.gamma; uniforms_.curvature = p.curvature; uniforms_.bleeding = p.bleeding; uniforms_.flicker = p.flicker; + } - // Con supersampling las scanlines se hornean en CPU (uploadPixels). - // El shader recibe strength=0 para no aplicarlas de nuevo en GPU. - baked_scanline_strength_ = p.scanlines; - uniforms_.scanline_strength = (oversample_ > 1) ? 0.0F : p.scanlines; + void SDL3GPUShader::setCrtPiParams(const CrtPiParams& p) { + crtpi_uniforms_.scanline_weight = p.scanline_weight; + crtpi_uniforms_.scanline_gap_brightness = p.scanline_gap_brightness; + crtpi_uniforms_.bloom_factor = p.bloom_factor; + crtpi_uniforms_.input_gamma = p.input_gamma; + crtpi_uniforms_.output_gamma = p.output_gamma; + crtpi_uniforms_.mask_brightness = p.mask_brightness; + crtpi_uniforms_.curvature_x = p.curvature_x; + crtpi_uniforms_.curvature_y = p.curvature_y; + crtpi_uniforms_.mask_type = p.mask_type; + crtpi_uniforms_.enable_scanlines = p.enable_scanlines ? 1 : 0; + crtpi_uniforms_.enable_multisample = p.enable_multisample ? 1 : 0; + crtpi_uniforms_.enable_gamma = p.enable_gamma ? 1 : 0; + crtpi_uniforms_.enable_curvature = p.enable_curvature ? 1 : 0; + crtpi_uniforms_.enable_sharper = p.enable_sharper ? 1 : 0; + } + + void SDL3GPUShader::setActiveShader(ShaderType type) { + active_shader_ = type; + } + + auto SDL3GPUShader::bestPresentMode(bool vsync) const -> SDL_GPUPresentMode { + if (vsync) { return SDL_GPU_PRESENTMODE_VSYNC; } + if (SDL_WindowSupportsGPUPresentMode(device_, window_, SDL_GPU_PRESENTMODE_IMMEDIATE)) { + return SDL_GPU_PRESENTMODE_IMMEDIATE; + } + if (SDL_WindowSupportsGPUPresentMode(device_, window_, SDL_GPU_PRESENTMODE_MAILBOX)) { + return SDL_GPU_PRESENTMODE_MAILBOX; + } + return SDL_GPU_PRESENTMODE_VSYNC; } void SDL3GPUShader::setVSync(bool vsync) { vsync_ = vsync; if (device_ != nullptr && window_ != nullptr) { - SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, vsync_ ? SDL_GPU_PRESENTMODE_VSYNC : SDL_GPU_PRESENTMODE_IMMEDIATE); + SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, bestPresentMode(vsync_)); } } @@ -651,22 +1079,30 @@ namespace Rendering { integer_scale_ = integer_scale; } - // --------------------------------------------------------------------------- - // setOversample — cambia el factor SS; recrea texturas si ya está inicializado - // --------------------------------------------------------------------------- void SDL3GPUShader::setOversample(int factor) { const int NEW_FACTOR = std::max(1, factor); if (NEW_FACTOR == oversample_) { return; } oversample_ = NEW_FACTOR; if (is_initialized_) { reinitTexturesAndBuffer(); - // scanline_strength se actualizará en el próximo setPostFXParams } } + void SDL3GPUShader::setLinearUpscale(bool linear) { + linear_upscale_ = linear; + } + + void SDL3GPUShader::setDownscaleAlgo(int algo) { + downscale_algo_ = std::max(0, std::min(algo, 2)); + } + + auto SDL3GPUShader::getSsTextureSize() const -> std::pair { + if (ss_factor_ <= 1) { return {0, 0}; } + return {game_width_ * ss_factor_, game_height_ * ss_factor_}; + } + // --------------------------------------------------------------------------- - // reinitTexturesAndBuffer — recrea scene_texture_ y upload_buffer_ con el - // tamaño actual (game × oversample_). No toca pipeline ni samplers. + // reinitTexturesAndBuffer // --------------------------------------------------------------------------- auto SDL3GPUShader::reinitTexturesAndBuffer() -> bool { if (device_ == nullptr) { return false; } @@ -676,22 +1112,25 @@ namespace Rendering { SDL_ReleaseGPUTexture(device_, scene_texture_); scene_texture_ = nullptr; } + if (scaled_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + } + ss_factor_ = 0; if (upload_buffer_ != nullptr) { SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); upload_buffer_ = nullptr; } - tex_width_ = game_width_ * oversample_; - tex_height_ = game_height_ * oversample_; - uniforms_.screen_height = static_cast(tex_height_); + uniforms_.screen_height = static_cast(game_height_); uniforms_.oversample = static_cast(oversample_); SDL_GPUTextureCreateInfo tex_info = {}; tex_info.type = SDL_GPU_TEXTURETYPE_2D; tex_info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; tex_info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER; - tex_info.width = static_cast(tex_width_); - tex_info.height = static_cast(tex_height_); + tex_info.width = static_cast(game_width_); + tex_info.height = static_cast(game_height_); tex_info.layer_count_or_depth = 1; tex_info.num_levels = 1; scene_texture_ = SDL_CreateGPUTexture(device_, &tex_info); @@ -702,7 +1141,7 @@ namespace Rendering { SDL_GPUTransferBufferCreateInfo tb_info = {}; tb_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; - tb_info.size = static_cast(tex_width_ * tex_height_ * 4); + tb_info.size = static_cast(game_width_ * game_height_ * 4); upload_buffer_ = SDL_CreateGPUTransferBuffer(device_, &tb_info); if (upload_buffer_ == nullptr) { SDL_Log("SDL3GPUShader: reinit — failed to create upload buffer: %s", SDL_GetError()); @@ -711,7 +1150,55 @@ namespace Rendering { return false; } - SDL_Log("SDL3GPUShader: oversample %d → texture %dx%d", oversample_, tex_width_, tex_height_); + SDL_Log("SDL3GPUShader: reinit — scene %dx%d, SS %s", game_width_, game_height_, oversample_ > 1 ? "on" : "off"); + return true; + } + + auto SDL3GPUShader::calcSsFactor(float zoom) -> int { + const int MULTIPLE = 3; + const int N = static_cast(std::ceil(zoom / static_cast(MULTIPLE))); + return std::max(1, N) * MULTIPLE; + } + + auto SDL3GPUShader::recreateScaledTexture(int factor) -> bool { + if (scaled_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + } + if (postfx_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, postfx_texture_); + postfx_texture_ = nullptr; + } + ss_factor_ = 0; + + const int W = game_width_ * factor; + const int H = game_height_ * factor; + + SDL_GPUTextureCreateInfo info = {}; + info.type = SDL_GPU_TEXTURETYPE_2D; + info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; + info.width = static_cast(W); + info.height = static_cast(H); + info.layer_count_or_depth = 1; + info.num_levels = 1; + + scaled_texture_ = SDL_CreateGPUTexture(device_, &info); + if (scaled_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create scaled texture %dx%d: %s", W, H, SDL_GetError()); + return false; + } + + postfx_texture_ = SDL_CreateGPUTexture(device_, &info); + if (postfx_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create postfx texture %dx%d: %s", W, H, SDL_GetError()); + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + return false; + } + + ss_factor_ = factor; + SDL_Log("SDL3GPUShader: scaled+postfx textures %dx%d (factor %dx)", W, H, factor); return true; } diff --git a/source/rendering/sdl3gpu/sdl3gpu_shader.hpp b/source/rendering/sdl3gpu/sdl3gpu_shader.hpp index c126bc1..d6355bd 100644 --- a/source/rendering/sdl3gpu/sdl3gpu_shader.hpp +++ b/source/rendering/sdl3gpu/sdl3gpu_shader.hpp @@ -3,24 +3,56 @@ #include #include +#include +#include + #include "rendering/shader_backend.hpp" // PostFX uniforms pushed to fragment stage each frame. -// Must match the MSL struct and GLSL uniform block layout. // 12 floats = 48 bytes — meets Metal/Vulkan 16-byte alignment requirement. struct PostFXUniforms { - float vignette_strength; // 0 = none, ~0.8 = subtle - float chroma_strength; // 0 = off, ~0.2 = subtle chromatic aberration - float scanline_strength; // 0 = off, 1 = full - float screen_height; // logical height in pixels (used by bleeding effect) - float mask_strength; // 0 = off, 1 = full phosphor dot mask - float gamma_strength; // 0 = off, 1 = full gamma 2.4/2.2 correction - float curvature; // 0 = flat, 1 = max barrel distortion - float bleeding; // 0 = off, 1 = max NTSC chrominance bleeding - float pixel_scale; // physical pixels per logical pixel (vh / tex_height_) - float time; // seconds since SDL init (SDL_GetTicks() / 1000.0f) - float oversample; // supersampling factor (1.0 = off, 3.0 = 3×SS) - float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz — keep struct at 48 bytes (3 × 16) + float vignette_strength; + float chroma_strength; + float scanline_strength; + float screen_height; + float mask_strength; + float gamma_strength; + float curvature; + float bleeding; + float pixel_scale; + float time; + float oversample; + float flicker; +}; + +// CrtPi uniforms pushed to fragment stage each frame. +// 16 fields = 64 bytes — 4 × 16-byte alignment. +struct CrtPiUniforms { + float scanline_weight; + float scanline_gap_brightness; + float bloom_factor; + float input_gamma; + float output_gamma; + float mask_brightness; + float curvature_x; + float curvature_y; + int mask_type; + int enable_scanlines; + int enable_multisample; + int enable_gamma; + int enable_curvature; + int enable_sharper; + float texture_width; + float texture_height; +}; + +// Downscale uniforms for Lanczos downscale fragment stage. +// 1 int + 3 floats = 16 bytes. +struct DownscaleUniforms { + int algorithm; + float pad0; + float pad1; + float pad2; }; namespace Rendering { @@ -28,9 +60,8 @@ namespace Rendering { /** * @brief Backend de shaders usando SDL3 GPU API (Metal en macOS, Vulkan/SPIR-V en Win/Linux) * - * Backend de shaders PostFX para macOS (Metal) y Win/Linux (Vulkan/SPIR-V). * Pipeline: Surface pixels (CPU) → SDL_GPUTransferBuffer → SDL_GPUTexture (scene) - * → PostFX render pass → swapchain → present + * → [Upscale →] PostFX/CrtPi render pass → [Lanczos downscale →] swapchain → present */ class SDL3GPUShader : public ShaderBackend { public: @@ -44,25 +75,28 @@ namespace Rendering { void render() override; void setTextureSize(float width, float height) override {} - void cleanup() final; // Libera pipeline/texturas pero mantiene el device vivo - void destroy(); // Limpieza completa (device + swapchain); llamar solo al cerrar + void cleanup() final; + void destroy(); [[nodiscard]] auto isHardwareAccelerated() const -> bool override { return is_initialized_; } + [[nodiscard]] auto getDriverName() const -> std::string override { return driver_name_; } - // Sube píxeles ARGB8888 desde CPU; llamado antes de render() + void setPreferredDriver(const std::string& driver) override { preferred_driver_ = driver; } void uploadPixels(const Uint32* pixels, int width, int height) override; - - // Actualiza los parámetros de intensidad de los efectos PostFX void setPostFXParams(const PostFXParams& p) override; - - // Activa/desactiva VSync en el swapchain void setVSync(bool vsync) override; - - // Activa/desactiva escalado entero (integer scale) void setScaleMode(bool integer_scale) override; - - // Establece factor de supersampling (1 = off, 3 = 3×SS) void setOversample(int factor) override; + void setLinearUpscale(bool linear) override; + [[nodiscard]] auto isLinearUpscale() const -> bool override { return linear_upscale_; } + void setDownscaleAlgo(int algo) override; + [[nodiscard]] auto getDownscaleAlgo() const -> int override { return downscale_algo_; } + [[nodiscard]] auto getSsTextureSize() const -> std::pair override; + + void setActiveShader(ShaderType type) override; + void setCrtPiParams(const CrtPiParams& p) override; + [[nodiscard]] auto getActiveShader() const -> ShaderType override { return active_shader_; } + private: static auto createShaderMSL(SDL_GPUDevice* device, const char* msl_source, @@ -80,27 +114,41 @@ namespace Rendering { Uint32 num_uniform_buffers) -> SDL_GPUShader*; auto createPipeline() -> bool; - auto reinitTexturesAndBuffer() -> bool; // Recrea textura y buffer con oversample actual + auto createCrtPiPipeline() -> bool; + auto reinitTexturesAndBuffer() -> bool; + auto recreateScaledTexture(int factor) -> bool; + static auto calcSsFactor(float zoom) -> int; + [[nodiscard]] auto bestPresentMode(bool vsync) const -> SDL_GPUPresentMode; SDL_Window* window_ = nullptr; SDL_GPUDevice* device_ = nullptr; SDL_GPUGraphicsPipeline* pipeline_ = nullptr; + SDL_GPUGraphicsPipeline* crtpi_pipeline_ = nullptr; + SDL_GPUGraphicsPipeline* postfx_offscreen_pipeline_ = nullptr; + SDL_GPUGraphicsPipeline* upscale_pipeline_ = nullptr; + SDL_GPUGraphicsPipeline* downscale_pipeline_ = nullptr; SDL_GPUTexture* scene_texture_ = nullptr; + SDL_GPUTexture* scaled_texture_ = nullptr; + SDL_GPUTexture* postfx_texture_ = nullptr; SDL_GPUTransferBuffer* upload_buffer_ = nullptr; - SDL_GPUSampler* sampler_ = nullptr; // NEAREST — para path sin supersampling - SDL_GPUSampler* linear_sampler_ = nullptr; // LINEAR — para path con supersampling + SDL_GPUSampler* sampler_ = nullptr; + SDL_GPUSampler* linear_sampler_ = nullptr; PostFXUniforms uniforms_{.vignette_strength = 0.6F, .chroma_strength = 0.15F, .scanline_strength = 0.7F, .screen_height = 192.0F, .pixel_scale = 1.0F, .oversample = 1.0F}; + CrtPiUniforms crtpi_uniforms_{.scanline_weight = 6.0F, .scanline_gap_brightness = 0.12F, .bloom_factor = 3.5F, .input_gamma = 2.4F, .output_gamma = 2.2F, .mask_brightness = 0.80F, .curvature_x = 0.05F, .curvature_y = 0.10F, .mask_type = 2, .enable_scanlines = 1, .enable_multisample = 1, .enable_gamma = 1}; + ShaderType active_shader_ = ShaderType::POSTFX; - int game_width_ = 0; // Dimensiones originales del canvas (sin SS) + int game_width_ = 0; int game_height_ = 0; - int tex_width_ = 0; // Dimensiones de la textura GPU (game × oversample_) - int tex_height_ = 0; - int oversample_ = 1; // Factor SS actual (1 o 3) - float baked_scanline_strength_ = 0.0F; // Guardado para hornear en CPU + int ss_factor_ = 0; + int oversample_ = 1; + int downscale_algo_ = 1; + std::string driver_name_; + std::string preferred_driver_; bool is_initialized_ = false; bool vsync_ = true; bool integer_scale_ = false; + bool linear_upscale_ = false; }; } // namespace Rendering diff --git a/source/rendering/sdl3gpu/upscale_frag_spv.h b/source/rendering/sdl3gpu/upscale_frag_spv.h new file mode 100644 index 0000000..af2b2da --- /dev/null +++ b/source/rendering/sdl3gpu/upscale_frag_spv.h @@ -0,0 +1,633 @@ +#pragma once +#include +#include +static const uint8_t kupscale_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x07, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x65, + 0x6e, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kupscale_frag_spv_size = 628; diff --git a/source/rendering/shader_backend.hpp b/source/rendering/shader_backend.hpp index 2bcfa2c..e3dcd97 100644 --- a/source/rendering/shader_backend.hpp +++ b/source/rendering/shader_backend.hpp @@ -3,9 +3,14 @@ #include #include +#include namespace Rendering { + /** @brief Identificador del shader de post-procesado activo */ + enum class ShaderType { POSTFX, + CRTPI }; + /** * @brief Parámetros de intensidad de los efectos PostFX */ @@ -20,57 +25,64 @@ namespace Rendering { float flicker = 0.0F; }; + /** + * @brief Parámetros del shader CRT-Pi (algoritmo de scanlines continuas) + */ + struct CrtPiParams { + float scanline_weight{6.0F}; + float scanline_gap_brightness{0.12F}; + float bloom_factor{3.5F}; + float input_gamma{2.4F}; + float output_gamma{2.2F}; + float mask_brightness{0.80F}; + float curvature_x{0.05F}; + float curvature_y{0.10F}; + int mask_type{2}; + bool enable_scanlines{true}; + bool enable_multisample{true}; + bool enable_gamma{true}; + bool enable_curvature{false}; + bool enable_sharper{false}; + }; + /** * @brief Interfaz abstracta para backends de renderizado con shaders - * - * Esta interfaz define el contrato que todos los backends de shaders - * deben cumplir (Metal, Vulkan, etc.) */ class ShaderBackend { public: virtual ~ShaderBackend() = default; - /** - * @brief Inicializa el backend de shaders - * @param window Ventana SDL - * @param texture Textura de backbuffer a la que aplicar shaders - * @param vertex_source Código fuente del vertex shader - * @param fragment_source Código fuente del fragment shader - * @return true si la inicialización fue exitosa - */ virtual auto init(SDL_Window* window, SDL_Texture* texture, const std::string& vertex_source, const std::string& fragment_source) -> bool = 0; - /** - * @brief Renderiza la textura con los shaders aplicados - */ virtual void render() = 0; - - /** - * @brief Establece el tamaño de la textura como parámetro del shader - * @param width Ancho de la textura - * @param height Alto de la textura - */ virtual void setTextureSize(float width, float height) = 0; - - /** - * @brief Limpia y libera recursos del backend - */ virtual void cleanup() = 0; - /** - * @brief Verifica si el backend está usando aceleración por hardware - * @return true si usa aceleración por hardware - */ - [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0; - virtual void uploadPixels(const Uint32* /*pixels*/, int /*width*/, int /*height*/) {} virtual void setPostFXParams(const PostFXParams& /*p*/) {} virtual void setVSync(bool /*vsync*/) {} virtual void setScaleMode(bool /*integer_scale*/) {} virtual void setOversample(int /*factor*/) {} + + virtual void setLinearUpscale(bool /*linear*/) {} + [[nodiscard]] virtual auto isLinearUpscale() const -> bool { return false; } + + virtual void setDownscaleAlgo(int /*algo*/) {} + [[nodiscard]] virtual auto getDownscaleAlgo() const -> int { return 0; } + + [[nodiscard]] virtual auto getSsTextureSize() const -> std::pair { return {0, 0}; } + + [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0; + + [[nodiscard]] virtual auto getDriverName() const -> std::string { return {}; } + virtual void setPreferredDriver(const std::string& /*driver*/) {} + + virtual void setActiveShader(ShaderType /*type*/) {} + virtual void setCrtPiParams(const CrtPiParams& /*p*/) {} + [[nodiscard]] virtual auto getActiveShader() const -> ShaderType { return ShaderType::POSTFX; } }; } // namespace Rendering diff --git a/source/screen.cpp b/source/screen.cpp index 059c47e..2053d08 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -8,16 +8,16 @@ #include // Para basic_string, operator+, char_traits, to_string, string #include // Para vector -#include "asset.hpp" // Para Asset -#include "mouse.hpp" // Para updateCursorVisibility -#include "options.hpp" // Para Video, video, Window, window -#include "param.hpp" // Para Param, param, ParamGame, ParamDebug +#include "asset.hpp" // Para Asset +#include "mouse.hpp" // Para updateCursorVisibility +#include "options.hpp" // Para Video, video, Window, window +#include "param.hpp" // Para Param, param, ParamGame, ParamDebug #include "rendering/sdl3gpu/sdl3gpu_shader.hpp" // Para SDL3GPUShader -#include "text.hpp" // Para Text -#include "texture.hpp" // Para Texture -#include "ui/logger.hpp" // Para info -#include "ui/notifier.hpp" // Para Notifier -#include "ui/service_menu.hpp" // Para ServiceMenu +#include "text.hpp" // Para Text +#include "texture.hpp" // Para Texture +#include "ui/logger.hpp" // Para info +#include "ui/notifier.hpp" // Para Notifier +#include "ui/service_menu.hpp" // Para ServiceMenu // Singleton Screen* Screen::instance = nullptr; @@ -25,7 +25,7 @@ Screen* Screen::instance = nullptr; // Inicializa la instancia única del singleton void Screen::init() { Screen::instance = new Screen(); - Screen::initPostFX(); // Llamar aquí para que Screen::get() ya devuelva la instancia + Screen::initShaders(); // Llamar aquí para que Screen::get() ya devuelva la instancia } // Libera la instancia @@ -68,7 +68,6 @@ Screen::Screen() SDL_SetRenderDrawColor(renderer_, 0, 0, 0, 255); SDL_RenderClear(renderer_); SDL_RenderPresent(renderer_); - } // Destructor @@ -112,13 +111,11 @@ void Screen::renderPresent() { SDL_Surface* surface = SDL_RenderReadPixels(renderer_, nullptr); if (surface != nullptr) { if (surface->format == SDL_PIXELFORMAT_ARGB8888) { - std::memcpy(pixel_buffer_.data(), surface->pixels, - pixel_buffer_.size() * sizeof(Uint32)); + std::memcpy(pixel_buffer_.data(), surface->pixels, pixel_buffer_.size() * sizeof(Uint32)); } else { SDL_Surface* converted = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_ARGB8888); if (converted != nullptr) { - std::memcpy(pixel_buffer_.data(), converted->pixels, - pixel_buffer_.size() * sizeof(Uint32)); + std::memcpy(pixel_buffer_.data(), converted->pixels, pixel_buffer_.size() * sizeof(Uint32)); SDL_DestroySurface(converted); } } @@ -256,26 +253,35 @@ void Screen::renderInfo() const { } } #endif -// Inicializa PostFX (SDL3GPU) -void Screen::initPostFX() { +// Inicializa shaders (SDL3GPU) +void Screen::initShaders() { #ifndef NO_SHADERS auto* self = Screen::get(); if (self == nullptr) { - SDL_Log("Screen::initPostFX: instance is null, skipping"); + SDL_Log("Screen::initShaders: instance is null, skipping"); return; } if (!self->shader_backend_) { self->shader_backend_ = std::make_unique(); + const std::string FALLBACK_DRIVER = "none"; + self->shader_backend_->setPreferredDriver( + Options::video.gpu.acceleration ? Options::video.gpu.preferred_driver : FALLBACK_DRIVER); } if (!self->shader_backend_->isHardwareAccelerated()) { const bool ok = self->shader_backend_->init(self->window_, self->game_canvas_, "", ""); - SDL_Log("Screen::initPostFX: SDL3GPUShader::init() = %s", ok ? "OK" : "FAILED"); + SDL_Log("Screen::initShaders: SDL3GPUShader::init() = %s", ok ? "OK" : "FAILED"); + } + if (self->shader_backend_ && self->shader_backend_->isHardwareAccelerated()) { + self->shader_backend_->setLinearUpscale(Options::video.supersampling.linear_upscale); + self->shader_backend_->setDownscaleAlgo(Options::video.supersampling.downscale_algo); + self->shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); + self->shader_backend_->setActiveShader(Options::video.shader.current_shader); + } + if (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) { + self->applyCurrentCrtPiPreset(); + } else { + self->applyCurrentPostFXPreset(); } - SDL_Log("Screen::initPostFX: presets=%d current=%d postfx=%s", - static_cast(Options::postfx_presets.size()), - Options::current_postfx_preset, - Options::video.postfx ? "ON" : "OFF"); - self->applyCurrentPostFXPreset(); #endif } @@ -438,11 +444,34 @@ void Screen::getDisplayInfo() { } } -// Alterna entre activar y desactivar los efectos PostFX -void Screen::togglePostFX() { - Options::video.postfx = !Options::video.postfx; +// Alterna activar/desactivar shaders +void Screen::toggleShaders() { + Options::video.shader.enabled = !Options::video.shader.enabled; auto* self = Screen::get(); if (self != nullptr) { + if (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) { + self->applyCurrentCrtPiPreset(); + } else { + self->applyCurrentPostFXPreset(); + } + } +} + +// Cambia entre PostFX y CrtPi +void Screen::nextShader() { + auto* self = Screen::get(); + if (self == nullptr || !self->shader_backend_ || !self->shader_backend_->isHardwareAccelerated()) { return; } + + const auto NEXT = (Options::video.shader.current_shader == Rendering::ShaderType::POSTFX) + ? Rendering::ShaderType::CRTPI + : Rendering::ShaderType::POSTFX; + + Options::video.shader.current_shader = NEXT; + self->shader_backend_->setActiveShader(NEXT); + + if (NEXT == Rendering::ShaderType::CRTPI) { + self->applyCurrentCrtPiPreset(); + } else { self->applyCurrentPostFXPreset(); } } @@ -450,49 +479,87 @@ void Screen::togglePostFX() { // Avanza al siguiente preset PostFX void Screen::nextPostFXPreset() { if (Options::postfx_presets.empty()) { return; } - Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast(Options::postfx_presets.size()); + Options::video.shader.current_postfx_preset = (Options::video.shader.current_postfx_preset + 1) % static_cast(Options::postfx_presets.size()); auto* self = Screen::get(); if (self != nullptr) { self->applyCurrentPostFXPreset(); } } -// Alterna entre activar y desactivar el supersampling 3x +// Avanza al siguiente preset CrtPi +void Screen::nextCrtPiPreset() { + if (Options::crtpi_presets.empty()) { return; } + Options::video.shader.current_crtpi_preset = (Options::video.shader.current_crtpi_preset + 1) % static_cast(Options::crtpi_presets.size()); + auto* self = Screen::get(); + if (self != nullptr) { + self->applyCurrentCrtPiPreset(); + } +} + +// Alterna supersampling void Screen::toggleSupersampling() { - Options::video.supersampling = (Options::video.supersampling % 3) + 1; + Options::video.supersampling.enabled = !Options::video.supersampling.enabled; auto* self = Screen::get(); if (self != nullptr && self->shader_backend_ && self->shader_backend_->isHardwareAccelerated()) { - self->applyCurrentPostFXPreset(); + self->shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); + if (Options::video.shader.current_shader == Rendering::ShaderType::CRTPI) { + self->applyCurrentCrtPiPreset(); + } else { + self->applyCurrentPostFXPreset(); + } } } // Aplica el preset PostFX activo al backend void Screen::applyCurrentPostFXPreset() { if (!shader_backend_) { return; } - // setOversample PRIMERO: puede recrear texturas antes de que setPostFXParams - // decida si hornear scanlines en CPU o aplicarlas en GPU. - shader_backend_->setOversample(Options::video.supersampling); + shader_backend_->setOversample(Options::video.supersampling.enabled ? 3 : 1); Rendering::PostFXParams p{}; - if (Options::video.postfx && !Options::postfx_presets.empty()) { - const auto& preset = Options::postfx_presets.at(static_cast(Options::current_postfx_preset)); - p.vignette = preset.vignette; + if (Options::video.shader.enabled && !Options::postfx_presets.empty()) { + const auto& preset = Options::postfx_presets.at(static_cast(Options::video.shader.current_postfx_preset)); + p.vignette = preset.vignette; p.scanlines = preset.scanlines; - p.chroma = preset.chroma; - p.mask = preset.mask; - p.gamma = preset.gamma; + p.chroma = preset.chroma; + p.mask = preset.mask; + p.gamma = preset.gamma; p.curvature = preset.curvature; - p.bleeding = preset.bleeding; - p.flicker = preset.flicker; - SDL_Log("Screen::applyCurrentPostFXPreset: preset='%s' scan=%.2f vign=%.2f chroma=%.2f ss=%d×", - preset.name.c_str(), p.scanlines, p.vignette, p.chroma, Options::video.supersampling); - } else { - SDL_Log("Screen::applyCurrentPostFXPreset: PostFX=%s presets=%d → passthrough", - Options::video.postfx ? "ON" : "OFF", - static_cast(Options::postfx_presets.size())); + p.bleeding = preset.bleeding; + p.flicker = preset.flicker; + SDL_Log("Screen::applyCurrentPostFXPreset: preset='%s' scan=%.2f vign=%.2f chroma=%.2f", + preset.name.c_str(), + p.scanlines, + p.vignette, + p.chroma); } shader_backend_->setPostFXParams(p); } +// Aplica el preset CrtPi activo al backend +void Screen::applyCurrentCrtPiPreset() { + if (!shader_backend_) { return; } + if (Options::video.shader.enabled && !Options::crtpi_presets.empty()) { + const auto& preset = Options::crtpi_presets.at(static_cast(Options::video.shader.current_crtpi_preset)); + Rendering::CrtPiParams p{ + .scanline_weight = preset.scanline_weight, + .scanline_gap_brightness = preset.scanline_gap_brightness, + .bloom_factor = preset.bloom_factor, + .input_gamma = preset.input_gamma, + .output_gamma = preset.output_gamma, + .mask_brightness = preset.mask_brightness, + .curvature_x = preset.curvature_x, + .curvature_y = preset.curvature_y, + .mask_type = preset.mask_type, + .enable_scanlines = preset.enable_scanlines, + .enable_multisample = preset.enable_multisample, + .enable_gamma = preset.enable_gamma, + .enable_curvature = preset.enable_curvature, + .enable_sharper = preset.enable_sharper, + }; + shader_backend_->setCrtPiParams(p); + SDL_Log("Screen::applyCurrentCrtPiPreset: preset='%s'", preset.name.c_str()); + } +} + // Alterna entre activar y desactivar el escalado entero void Screen::toggleIntegerScale() { Options::video.integer_scale = !Options::video.integer_scale; diff --git a/source/screen.hpp b/source/screen.hpp index eb333c9..87154f8 100644 --- a/source/screen.hpp +++ b/source/screen.hpp @@ -6,18 +6,15 @@ #include // Para string #include // Para vector -#include "color.hpp" // Para Color -#include "options.hpp" // Para VideoOptions, video +#include "color.hpp" // Para Color +#include "options.hpp" // Para VideoOptions, video +#include "rendering/shader_backend.hpp" // Para Rendering::ShaderType // Forward declarations class Notifier; class ServiceMenu; class Text; -namespace Rendering { - class ShaderBackend; -} - // --- Clase Screen: gestiona la ventana, el renderizador y los efectos visuales globales (singleton) --- class Screen { public: @@ -41,18 +38,20 @@ class Screen { auto decWindowSize() -> bool; // Reduce el tamaño de la ventana auto incWindowSize() -> bool; // Aumenta el tamaño de la ventana void applySettings(); // Aplica los valores de las opciones - static void initPostFX(); // Inicializa PostFX (SDL3GPU) + static void initShaders(); // Inicializa shaders (SDL3GPU) // --- Efectos visuales --- - void shake(int desp = 2, float delay_s = 0.05F, float duration_s = 0.133F) { shake_effect_.enable(src_rect_, dst_rect_, desp, delay_s, duration_s); } // Agita la pantalla (tiempo en segundos) - void flash(Color color, float duration_s = 0.167F, float delay_s = 0.0F) { flash_effect_ = FlashEffect(true, duration_s, delay_s, color); } // Pone la pantalla de color (tiempo en segundos) - static void togglePostFX(); // Alterna entre activar y desactivar los efectos PostFX - static void nextPostFXPreset(); // Avanza al siguiente preset PostFX - static void toggleSupersampling(); // Alterna entre activar y desactivar el supersampling 3x - void toggleIntegerScale(); // Alterna entre activar y desactivar el escalado entero - void toggleVSync(); // Alterna entre activar y desactivar el V-Sync - void setVSync(bool enabled); // Establece el estado del V-Sync - void attenuate(bool value) { attenuate_effect_ = value; } // Atenúa la pantalla + void shake(int desp = 2, float delay_s = 0.05F, float duration_s = 0.133F) { shake_effect_.enable(src_rect_, dst_rect_, desp, delay_s, duration_s); } + void flash(Color color, float duration_s = 0.167F, float delay_s = 0.0F) { flash_effect_ = FlashEffect(true, duration_s, delay_s, color); } + static void toggleShaders(); // Alterna activar/desactivar shaders + static void nextShader(); // Cambia entre PostFX y CrtPi + static void nextPostFXPreset(); // Avanza al siguiente preset PostFX + static void nextCrtPiPreset(); // Avanza al siguiente preset CrtPi + static void toggleSupersampling(); // Alterna supersampling + void toggleIntegerScale(); + void toggleVSync(); // Alterna entre activar y desactivar el V-Sync + void setVSync(bool enabled); // Establece el estado del V-Sync + void attenuate(bool value) { attenuate_effect_ = value; } // Atenúa la pantalla // --- Getters --- auto getRenderer() -> SDL_Renderer* { return renderer_; } // Obtiene el renderizador @@ -220,30 +219,31 @@ class Screen { std::unique_ptr shader_backend_; // Backend de shaders (SDL3GPU) // --- Variables de estado --- - SDL_FRect src_rect_; // Coordenadas de origen para dibujar la textura del juego - SDL_FRect dst_rect_; // Coordenadas destino para dibujar la textura del juego + SDL_FRect src_rect_; // Coordenadas de origen para dibujar la textura del juego + SDL_FRect dst_rect_; // Coordenadas destino para dibujar la textura del juego std::vector pixel_buffer_; // Buffer de píxeles para SDL_RenderReadPixels - FPS fps_; // Gestión de frames por segundo - FlashEffect flash_effect_; // Efecto de flash en pantalla - ShakeEffect shake_effect_; // Efecto de agitar la pantalla - bool attenuate_effect_ = false; // Indica si la pantalla ha de estar atenuada - DisplayMonitor display_monitor_; // Información del monitor actual + FPS fps_; // Gestión de frames por segundo + FlashEffect flash_effect_; // Efecto de flash en pantalla + ShakeEffect shake_effect_; // Efecto de agitar la pantalla + bool attenuate_effect_ = false; // Indica si la pantalla ha de estar atenuada + DisplayMonitor display_monitor_; // Información del monitor actual #ifdef _DEBUG Debug debug_info_; // Información de debug #endif // --- Métodos internos --- - auto initSDLVideo() -> bool; // Arranca SDL VIDEO y crea la ventana - void renderFlash(); // Dibuja el efecto de flash en la pantalla - void renderShake(); // Aplica el efecto de agitar la pantalla - void renderInfo() const; // Muestra información por pantalla - void renderPresent(); // Selecciona y ejecuta el método de renderizado adecuado - void applyCurrentPostFXPreset(); // Aplica el preset PostFX activo al backend - void adjustWindowSize(); // Calcula el tamaño de la ventana - void getDisplayInfo(); // Obtiene información sobre la pantalla - void renderOverlays(); // Renderiza todos los overlays y efectos - void renderAttenuate(); // Atenúa la pantalla - void createText(); // Crea el objeto de texto + auto initSDLVideo() -> bool; // Arranca SDL VIDEO y crea la ventana + void renderFlash(); // Dibuja el efecto de flash en la pantalla + void renderShake(); // Aplica el efecto de agitar la pantalla + void renderInfo() const; // Muestra información por pantalla + void renderPresent(); // Selecciona y ejecuta el método de renderizado adecuado + void applyCurrentPostFXPreset(); // Aplica el preset PostFX activo al backend + void applyCurrentCrtPiPreset(); // Aplica el preset CrtPi activo al backend + void adjustWindowSize(); // Calcula el tamaño de la ventana + void getDisplayInfo(); // Obtiene información sobre la pantalla + void renderOverlays(); // Renderiza todos los overlays y efectos + void renderAttenuate(); // Atenúa la pantalla + void createText(); // Crea el objeto de texto // --- Constructores y destructor privados (singleton) --- Screen(); // Constructor privado diff --git a/source/sections/game.hpp b/source/sections/game.hpp index d8afac5..20d9b51 100644 --- a/source/sections/game.hpp +++ b/source/sections/game.hpp @@ -93,15 +93,15 @@ class Game { // --- Estructuras --- struct Helper { - bool need_coffee{false}; // Indica si se necesitan cafes - bool need_coffee_machine{false}; // Indica si se necesita PowerUp - bool need_power_ball{false}; // Indica si se necesita una PowerBall - float counter{HELP_COUNTER_S * 1000}; // Contador para no dar ayudas consecutivas - int item_disk_odds{ITEM_POINTS_1_DISK_ODDS}; // Probabilidad de aparición del objeto - int item_gavina_odds{ITEM_POINTS_2_GAVINA_ODDS}; // Probabilidad de aparición del objeto - int item_pacmar_odds{ITEM_POINTS_3_PACMAR_ODDS}; // Probabilidad de aparición del objeto - int item_clock_odds{ITEM_CLOCK_ODDS}; // Probabilidad de aparición del objeto - int item_coffee_odds{ITEM_COFFEE_ODDS}; // Probabilidad de aparición del objeto + bool need_coffee{false}; // Indica si se necesitan cafes + bool need_coffee_machine{false}; // Indica si se necesita PowerUp + bool need_power_ball{false}; // Indica si se necesita una PowerBall + float counter{HELP_COUNTER_S * 1000}; // Contador para no dar ayudas consecutivas + int item_disk_odds{ITEM_POINTS_1_DISK_ODDS}; // Probabilidad de aparición del objeto + int item_gavina_odds{ITEM_POINTS_2_GAVINA_ODDS}; // Probabilidad de aparición del objeto + int item_pacmar_odds{ITEM_POINTS_3_PACMAR_ODDS}; // Probabilidad de aparición del objeto + int item_clock_odds{ITEM_CLOCK_ODDS}; // Probabilidad de aparición del objeto + int item_coffee_odds{ITEM_COFFEE_ODDS}; // Probabilidad de aparición del objeto int item_coffee_machine_odds{ITEM_COFFEE_MACHINE_ODDS}; // Probabilidad de aparición del objeto }; diff --git a/source/sections/instructions.hpp b/source/sections/instructions.hpp index 749d14a..7684b8b 100644 --- a/source/sections/instructions.hpp +++ b/source/sections/instructions.hpp @@ -71,15 +71,15 @@ class Instructions { std::unique_ptr fade_; // Objeto para renderizar fades // --- Variables --- - float elapsed_time_ = 0.0F; // Tiempo transcurrido (segundos) - Uint64 last_time_ = 0; // Último timestamp para calcular delta-time - SDL_FRect view_; // Vista del backbuffer que se va a mostrar por pantalla + float elapsed_time_ = 0.0F; // Tiempo transcurrido (segundos) + Uint64 last_time_ = 0; // Último timestamp para calcular delta-time + SDL_FRect view_; // Vista del backbuffer que se va a mostrar por pantalla SDL_FPoint sprite_pos_ = {.x = 0, .y = 0}; // Posición del primer sprite en la lista - float item_space_ = 2.0; // Espacio entre los items en pantalla - std::vector lines_; // Vector que contiene las líneas animadas en la pantalla - bool all_lines_off_screen_ = false; // Indica si todas las líneas han salido de la pantalla - float start_delay_timer_ = 0.0F; // Timer para retraso antes de mover líneas (segundos) - bool start_delay_triggered_ = false; // Bandera para determinar si el retraso ha comenzado + float item_space_ = 2.0; // Espacio entre los items en pantalla + std::vector lines_; // Vector que contiene las líneas animadas en la pantalla + bool all_lines_off_screen_ = false; // Indica si todas las líneas han salido de la pantalla + float start_delay_timer_ = 0.0F; // Timer para retraso antes de mover líneas (segundos) + bool start_delay_triggered_ = false; // Bandera para determinar si el retraso ha comenzado // --- Métodos internos --- void update(float delta_time); // Actualiza las variables diff --git a/source/text.cpp b/source/text.cpp index 5a1109f..ce06e75 100644 --- a/source/text.cpp +++ b/source/text.cpp @@ -2,12 +2,12 @@ #include // Para SDL_FRect, Uint8, SDL_GetRenderTarget, SDL_RenderClear, SDL_SetRenderDrawColor, SDL_SetRenderTarget, SDL_BLENDMODE_BLEND, SDL_PixelFormat, SDL_TextureAccess, SDL_GetTextureAlphaMod -#include // Para basic_ifstream, basic_istream, basic_ostream, operator<<, istream, ifstream, istringstream -#include // Para std::cmp_less_equal +#include // Para basic_ifstream, basic_istream, basic_ostream, operator<<, istream, ifstream, istringstream #include // Para cerr #include // Para basic_istringstream #include // Para runtime_error #include // Para string_view +#include // Para std::cmp_less_equal #include // Para vector #include "color.hpp" // Para Color diff --git a/source/ui/service_menu.cpp b/source/ui/service_menu.cpp index ee51c08..706eb04 100644 --- a/source/ui/service_menu.cpp +++ b/source/ui/service_menu.cpp @@ -366,19 +366,20 @@ void ServiceMenu::initializeOptions() { options_.push_back(std::make_unique( Lang::getText("[SERVICE_MENU] POSTFX"), SettingsGroup::VIDEO, - &Options::video.postfx)); + &Options::video.shader.enabled)); options_.push_back(std::make_unique( Lang::getText("[SERVICE_MENU] POSTFX_PRESET"), SettingsGroup::VIDEO, - &Options::current_postfx_preset, - 0, static_cast(Options::postfx_presets.size()) - 1, 1)); + &Options::video.shader.current_postfx_preset, + 0, + static_cast(Options::postfx_presets.size()) - 1, + 1)); - options_.push_back(std::make_unique( + options_.push_back(std::make_unique( Lang::getText("[SERVICE_MENU] SUPERSAMPLING"), SettingsGroup::VIDEO, - &Options::video.supersampling, - 1, 3, 1)); + &Options::video.supersampling.enabled)); options_.push_back(std::make_unique( Lang::getText("[SERVICE_MENU] VSYNC"), diff --git a/tools/shaders/compile_spirv.sh b/tools/shaders/compile_spirv.sh index e834f1a..d44234b 100755 --- a/tools/shaders/compile_spirv.sh +++ b/tools/shaders/compile_spirv.sh @@ -20,6 +20,9 @@ echo "Compiling SPIR-V shaders..." glslc "${SHADERS_DIR}/postfx.vert" -o /tmp/postfx.vert.spv glslc "${SHADERS_DIR}/postfx.frag" -o /tmp/postfx.frag.spv +glslc -fshader-stage=fragment "${SHADERS_DIR}/crtpi_frag.glsl" -o /tmp/crtpi_frag.spv +glslc "${SHADERS_DIR}/upscale.frag" -o /tmp/upscale.frag.spv +glslc "${SHADERS_DIR}/downscale.frag" -o /tmp/downscale.frag.spv echo "Generating C++ headers..." @@ -33,12 +36,30 @@ xxd -i /tmp/postfx.frag.spv | \ sed 's/unsigned int .*postfx_frag_spv_len/static const size_t kpostfx_frag_spv_size/' \ > "${HEADERS_DIR}/postfx_frag_spv.h" +xxd -i /tmp/crtpi_frag.spv | \ + sed 's/unsigned char .*crtpi_frag_spv\[\]/static const uint8_t kcrtpi_frag_spv[]/' | \ + sed 's/unsigned int .*crtpi_frag_spv_len/static const size_t kcrtpi_frag_spv_size/' \ + > "${HEADERS_DIR}/crtpi_frag_spv.h" + +xxd -i /tmp/upscale.frag.spv | \ + sed 's/unsigned char .*upscale_frag_spv\[\]/static const uint8_t kupscale_frag_spv[]/' | \ + sed 's/unsigned int .*upscale_frag_spv_len/static const size_t kupscale_frag_spv_size/' \ + > "${HEADERS_DIR}/upscale_frag_spv.h" + +xxd -i /tmp/downscale.frag.spv | \ + sed 's/unsigned char .*downscale_frag_spv\[\]/static const uint8_t kdownscale_frag_spv[]/' | \ + sed 's/unsigned int .*downscale_frag_spv_len/static const size_t kdownscale_frag_spv_size/' \ + > "${HEADERS_DIR}/downscale_frag_spv.h" + # Prepend required includes to the headers -for f in "${HEADERS_DIR}/postfx_vert_spv.h" "${HEADERS_DIR}/postfx_frag_spv.h"; do +for f in "${HEADERS_DIR}/postfx_vert_spv.h" "${HEADERS_DIR}/postfx_frag_spv.h" "${HEADERS_DIR}/crtpi_frag_spv.h" "${HEADERS_DIR}/upscale_frag_spv.h" "${HEADERS_DIR}/downscale_frag_spv.h"; do echo -e "#pragma once\n#include \n#include \n$(cat "$f")" > "$f" done echo "Done. Headers updated in ${HEADERS_DIR}/" echo " postfx_vert_spv.h" echo " postfx_frag_spv.h" +echo " crtpi_frag_spv.h" +echo " upscale_frag_spv.h" +echo " downscale_frag_spv.h" echo "Rebuild the project to use the new shaders."