diff --git a/Src/Editor/CMakeLists.txt b/Src/Editor/CMakeLists.txt
index 4e9cfe2..2c1fae4 100644
--- a/Src/Editor/CMakeLists.txt
+++ b/Src/Editor/CMakeLists.txt
@@ -14,4 +14,4 @@ add_executable(IAE_Editor ${SRC_FILES})
target_include_directories(IAE_Editor PRIVATE imp/hpp)
-target_link_libraries(IAE_Editor PRIVATE RenderCore)
+target_link_libraries(IAE_Editor PRIVATE IAEngine)
diff --git a/Src/Editor/imp/cpp/Main.cpp b/Src/Editor/imp/cpp/Main.cpp
index 0cdf87e..2a9e50e 100644
--- a/Src/Editor/imp/cpp/Main.cpp
+++ b/Src/Editor/imp/cpp/Main.cpp
@@ -14,9 +14,11 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+#include
#include
#include
+
#include
#include
#include
@@ -25,11 +27,14 @@ namespace ia::iae
{
ImDrawData *g_imDrawData{};
- SDL_Window *g_windowHandle{};
+ EXTERN Vec2 g_designViewport;
+ EXTERN SDL_Window *g_windowHandle;
INT32 Run(IN INT32 argc, IN PCCHAR argv[])
{
+ INT32 frameCounter{0};
IVec2 windowExtent{800, 600};
+ g_designViewport = windowExtent;
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMEPAD))
THROW_UNKNOWN("Failed to intialize SDL: ", SDL_GetError());
@@ -40,15 +45,15 @@ namespace ia::iae
SDL_MaximizeWindow(g_windowHandle);
SDL_GetWindowSizeInPixels(g_windowHandle, &windowExtent.x, &windowExtent.y);
- RDC::Initialize(windowExtent, g_windowHandle, true);
-
- const auto mainScale = SDL_GetDisplayContentScale(SDL_GetPrimaryDisplay());
+ IAEngine::__Initialize();
auto gamePreviewTexture = new RDC_Texture(RDC_Texture::EType::SAMPLED, 800, 600);
+ const auto mainScale = SDL_GetDisplayContentScale(SDL_GetPrimaryDisplay());
+
IMGUI_CHECKVERSION();
ImGui::CreateContext();
- auto& imGUIIO = ImGui::GetIO();
+ auto &imGUIIO = ImGui::GetIO();
imGUIIO.IniFilename = nullptr;
imGUIIO.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
imGUIIO.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
@@ -71,9 +76,18 @@ namespace ia::iae
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT)
break;
+ IAEngine::__ProcessEvent(&event);
+ IAEngine::__Update();
ImGui_ImplSDL3_ProcessEvent(&event);
- RDC::RenderToTexture(gamePreviewTexture->GetHandle());
+ frameCounter++;
+ if (frameCounter >= 60)
+ {
+ frameCounter = 0;
+ IAEngine::__FixedUpdate();
+ }
+
+ IAEngine::__RenderToTexture(gamePreviewTexture->GetHandle());
ImGui_ImplSDLGPU3_NewFrame();
ImGui_ImplSDL3_NewFrame();
@@ -122,7 +136,7 @@ namespace ia::iae
delete gamePreviewTexture;
- RDC::Terminate();
+ IAEngine::__Terminate();
SDL_DestroyWindow(g_windowHandle);
@@ -133,4 +147,36 @@ namespace ia::iae
int main(int argc, char *argv[])
{
return ia::iae::Run(argc, (const char **) argv);
+}
+
+#include
+
+C_DECL(GameRequestedConfig *Game_GetConfigRequest())
+{
+ return nullptr;
+}
+
+C_DECL(VOID Game_OnInitialize())
+{
+}
+
+C_DECL(VOID Game_OnTerminate())
+{
+}
+
+C_DECL(VOID Game_OnDebugDraw())
+{
+ RDC::DrawRect({10, 10}, {700, 500}, {1.0f, 0.0f, 0.0f, 1.0f});
+}
+
+C_DECL(VOID Game_OnFixedUpdate())
+{
+}
+
+C_DECL(VOID Game_OnUpdate(IN FLOAT32 deltaTime))
+{
+}
+
+C_DECL(VOID Game_OnResize(IN INT32 newWidth, IN INT32 newHeight))
+{
}
\ No newline at end of file
diff --git a/Src/IAEngine/imp/cpp/IAEngine.cpp b/Src/IAEngine/imp/cpp/IAEngine.cpp
index 12d5c12..80010e3 100644
--- a/Src/IAEngine/imp/cpp/IAEngine.cpp
+++ b/Src/IAEngine/imp/cpp/IAEngine.cpp
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-//#include
+// #include
#include
#include
@@ -77,6 +77,8 @@ namespace ia::iae
BOOL g_isDebugMode = false;
#endif
+ BOOL g_isHeadlessMode = false;
+
INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName,
IN CONST String &publisherName, IN IA_VERSION_TYPE version)
{
@@ -111,9 +113,9 @@ namespace ia::iae
const auto gameVersion = g_gameVersion;
SDL_SetAppMetadata(g_gameName.c_str(), IA_STRINGIFY_VERSION(gameVersion).c_str(), g_gamePackageName.c_str());
- //EmbeddedResources::Initialize();
+ // EmbeddedResources::Initialize();
- IAEngine::Initialize();
+ IAEngine::__Initialize();
SDL_Event event{};
while (true)
@@ -121,23 +123,22 @@ namespace ia::iae
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT)
break;
- IAEngine::ProcessEvent(&event);
- IAEngine::Update();
+ IAEngine::__ProcessEvent(&event);
+ IAEngine::__Update();
frameCounter++;
if (frameCounter >= 60)
{
frameCounter = 0;
- IAEngine::FixedUpdate();
+ IAEngine::__FixedUpdate();
}
- IAEngine::Draw();
- IAEngine::DebugDraw();
+ IAEngine::__RenderToWindow();
}
- IAEngine::Terminate();
+ IAEngine::__Terminate();
- //EmbeddedResources::Terminate();
+ // EmbeddedResources::Terminate();
SDL_DestroyWindow(g_windowHandle);
@@ -149,8 +150,10 @@ namespace ia::iae
namespace ia::iae
{
- VOID IAEngine::Initialize()
+ VOID IAEngine::__Initialize()
{
+ g_isHeadlessMode = false;
+
RDC::Initialize(IVec2{g_designViewport.x, g_designViewport.y}, g_windowHandle, g_isDebugMode);
GameData::Initialize();
@@ -161,7 +164,22 @@ namespace ia::iae
Game_OnInitialize();
}
- VOID IAEngine::Terminate()
+ VOID IAEngine::__InitializeHeadless()
+ {
+ g_isHeadlessMode = true;
+
+ if(!g_designViewport.x || !g_designViewport.y)
+ g_designViewport = {800, 600};
+
+ GameData::Initialize();
+
+ ChangeActiveScene(GameData::GetEntryScene() ? GameData::GetEntryScene()
+ : CreateScene({g_designViewport.x, g_designViewport.y}));
+
+ Game_OnInitialize();
+ }
+
+ VOID IAEngine::__Terminate()
{
Game_OnTerminate();
@@ -173,13 +191,25 @@ namespace ia::iae
DestroyResource(i);
}
- VOID IAEngine::Draw()
+ VOID IAEngine::__RenderToWindow()
{
g_activeScene->OnDraw();
RDC::RenderToWindow();
+
+ g_activeScene->OnDebugDraw();
+ Game_OnDebugDraw();
}
- VOID IAEngine::Update()
+ VOID IAEngine::__RenderToTexture(IN PVOID textureHandle)
+ {
+ g_activeScene->OnDraw();
+ RDC::RenderToTexture((SDL_GPUTexture *) textureHandle);
+
+ g_activeScene->OnDebugDraw();
+ Game_OnDebugDraw();
+ }
+
+ VOID IAEngine::__Update()
{
FLOAT32 deltaTime = 0;
@@ -187,19 +217,13 @@ namespace ia::iae
Game_OnUpdate(deltaTime);
}
- VOID IAEngine::FixedUpdate()
+ VOID IAEngine::__FixedUpdate()
{
g_activeScene->OnFixedUpdate();
Game_OnFixedUpdate();
}
- VOID IAEngine::DebugDraw()
- {
- g_activeScene->OnDebugDraw();
- Game_OnDebugDraw();
- }
-
- VOID IAEngine::ProcessEvent(IN PVOID _event)
+ VOID IAEngine::__ProcessEvent(IN PVOID _event)
{
const auto event = (SDL_Event *) _event;
}
@@ -213,8 +237,8 @@ namespace ia::iae
auto pixels = stbi_load(path, &w, &h, &n, STBI_rgb_alpha);
if (!pixels)
THROW_INVALID_DATA(path);
- const auto t = RDC::CreateImage(pixels, w, h, tileWidth == -1 ? 1 : w / tileWidth,
- tileHeight == -1 ? 1 : h / tileHeight);
+ const auto t =
+ RDC::CreateImage(pixels, w, h, tileWidth == -1 ? 1 : w / tileWidth, tileHeight == -1 ? 1 : h / tileHeight);
stbi_image_free(pixels);
return t;
}
@@ -345,8 +369,7 @@ namespace ia::iae
IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset)
{
const auto t = static_cast(g_resources[tileSheet]);
- RDC::DrawSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV,
- uvOffset);
+ RDC::DrawSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV, uvOffset);
}
VOID IAEngine::DrawSprite(IN Handle sprite, IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH,
@@ -360,8 +383,8 @@ namespace ia::iae
IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset)
{
const auto t = static_cast(g_resources[spriteSheet]);
- RDC::DrawSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH,
- flipV, uvOffset);
+ RDC::DrawSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH, flipV,
+ uvOffset);
}
} // namespace ia::iae
diff --git a/Src/IAEngine/inc/IAEngine/IAEngine.hpp b/Src/IAEngine/inc/IAEngine/IAEngine.hpp
index 7f68b02..4c41e95 100644
--- a/Src/IAEngine/inc/IAEngine/IAEngine.hpp
+++ b/Src/IAEngine/inc/IAEngine/IAEngine.hpp
@@ -62,18 +62,14 @@ namespace ia::iae
IN Vec2 scale = {1.0f, 1.0f}, IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false,
IN BOOL flipV = false, IN Vec2 uvOffset = {});
- private:
- STATIC VOID Initialize();
- STATIC VOID Terminate();
- STATIC VOID Draw();
- STATIC VOID Update();
- STATIC VOID FixedUpdate();
- STATIC VOID DebugDraw();
- STATIC VOID ProcessEvent(IN PVOID event);
-
- friend INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName,
- IN CONST String &publisherName, IN IA_VERSION_TYPE version);
-
- friend class Scene;
+ public:
+ STATIC VOID __Initialize();
+ STATIC VOID __InitializeHeadless();
+ STATIC VOID __Terminate();
+ STATIC VOID __RenderToWindow();
+ STATIC VOID __RenderToTexture(IN PVOID textureHandle);
+ STATIC VOID __Update();
+ STATIC VOID __FixedUpdate();
+ STATIC VOID __ProcessEvent(IN PVOID event);
};
} // namespace ia::iae
diff --git a/Src/RenderCore/Resources/Shaders/DynamicSprite.vert b/Src/RenderCore/Resources/Shaders/DynamicSprite.vert
index 623ee70..c80c75b 100644
--- a/Src/RenderCore/Resources/Shaders/DynamicSprite.vert
+++ b/Src/RenderCore/Resources/Shaders/DynamicSprite.vert
@@ -9,7 +9,7 @@ struct SpriteInstanceData
};
layout (location = 0) in vec2 inPosition;
-layout (location = 1) in vec2 inTexCoord;
+layout (location = 1) in vec4 inTexCoord;
layout(location = 0) out vec2 outTexCoord;
layout(location = 1) out vec4 outVertexColor;
@@ -29,6 +29,7 @@ void main()
{
SpriteInstanceData spriteData = sboSpriteData.data[gl_InstanceIndex];
gl_Position = uboPerScene.projection * uboPerFrame.view * spriteData.Transform * vec4(inPosition, 0.0f, 1.0f);
- outTexCoord = vec2(spriteData.TexCoords) + vec2(spriteData.TexCoords.z, spriteData.TexCoords.w) * inTexCoord;
+ vec4 t = spriteData.TexCoords * inTexCoord;
+ outTexCoord = vec2(t.x + t.z, t.y + t.w);
outVertexColor = spriteData.Color;
}
\ No newline at end of file
diff --git a/Src/RenderCore/Resources/Shaders/PrimitiveDraw.frag b/Src/RenderCore/Resources/Shaders/PrimitiveDraw.frag
new file mode 100644
index 0000000..de284dd
--- /dev/null
+++ b/Src/RenderCore/Resources/Shaders/PrimitiveDraw.frag
@@ -0,0 +1,13 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(location = 0) in vec4 inVertexColor;
+
+layout(location = 0) out vec4 outColor;
+
+void main()
+{
+ outColor = inVertexColor;
+ if(outColor.w < 0.1)
+ discard;
+}
\ No newline at end of file
diff --git a/Src/RenderCore/Resources/Shaders/PrimitiveDraw.vert b/Src/RenderCore/Resources/Shaders/PrimitiveDraw.vert
new file mode 100644
index 0000000..2f6a0b6
--- /dev/null
+++ b/Src/RenderCore/Resources/Shaders/PrimitiveDraw.vert
@@ -0,0 +1,20 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout (location = 0) in vec2 inPosition;
+layout (location = 1) in vec4 inVertexColor;
+
+layout(location = 0) out vec4 outVertexColor;
+
+layout(set = 1, binding = 0) uniform UBO_Vertex_PerScene {
+ mat4 projection;
+} uboPerScene;
+layout(set = 1, binding = 1) uniform UBO_Vertex_PerFrame {
+ mat4 view;
+} uboPerFrame;
+
+void main()
+{
+ gl_Position = uboPerScene.projection * uboPerFrame.view * vec4(inPosition, 0.0f, 1.0f);
+ outVertexColor = inVertexColor;
+}
\ No newline at end of file
diff --git a/Src/RenderCore/imp/cpp/EmbeddedResources.cpp b/Src/RenderCore/imp/cpp/EmbeddedResources.cpp
index e2f5fd9..bcc01e1 100644
--- a/Src/RenderCore/imp/cpp/EmbeddedResources.cpp
+++ b/Src/RenderCore/imp/cpp/EmbeddedResources.cpp
@@ -23,7 +23,15 @@ namespace ia::iae
};
CONST Vector DATA_DYNAMICSPRITE_VERT = {
- 0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x5a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x45,0x0,0x0,0x0,0x53,0x0,0x0,0x0,0x57,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,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,0x0,0x0,0x4,0x0,0x8,0x0,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,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x9,0x0,0x0,0x0,0x53,0x70,0x72,0x69,0x74,0x65,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x6,0x0,0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x54,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x9,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x73,0x0,0x0,0x0,0x6,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x73,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x5,0x0,0x7,0x0,0xc,0x0,0x0,0x0,0x53,0x70,0x72,0x69,0x74,0x65,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x6,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x54,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0xc,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x73,0x0,0x0,0x0,0x6,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0xe,0x0,0x0,0x0,0x53,0x42,0x4f,0x5f,0x53,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x5,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x61,0x74,0x61,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0x10,0x0,0x0,0x0,0x73,0x62,0x6f,0x53,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x14,0x0,0x0,0x0,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x6e,0x64,0x65,0x78,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x65,0x72,0x56,0x65,0x72,0x74,0x65,0x78,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x0,0x0,0x0,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x6c,0x69,0x70,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x75,0x6c,0x6c,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x5,0x0,0x3,0x0,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x29,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x6,0x0,0x6,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x5,0x0,0x2b,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x5,0x0,0x7,0x0,0x2f,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x6,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x76,0x69,0x65,0x77,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x31,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x5,0x0,0x5,0x0,0x3a,0x0,0x0,0x0,0x69,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x5,0x0,0x45,0x0,0x0,0x0,0x6f,0x75,0x74,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x5,0x0,0x5,0x0,0x53,0x0,0x0,0x0,0x69,0x6e,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x0,0x5,0x0,0x6,0x0,0x57,0x0,0x0,0x0,0x6f,0x75,0x74,0x56,0x65,0x72,0x74,0x65,0x78,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x48,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0xd,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0xe,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x10,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x14,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x29,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x2b,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x2b,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x2f,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x31,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x31,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x3a,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x45,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x53,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x57,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x18,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1e,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x1d,0x0,0x3,0x0,0xd,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0xe,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x16,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1a,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1e,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1c,0x0,0x4,0x0,0x25,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x1e,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x29,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x29,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x2c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x2f,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2f,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x30,0x0,0x0,0x0,0x31,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x38,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x39,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x39,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x3d,0x0,0x0,0x0,0x0,0x0,0x80,0x3f,0x20,0x0,0x4,0x0,0x42,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x44,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x44,0x0,0x0,0x0,0x45,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x4b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x4c,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x4f,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x39,0x0,0x0,0x0,0x53,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x42,0x0,0x0,0x0,0x57,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x41,0x0,0x6,0x0,0x16,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1a,0x0,0x0,0x0,0x1b,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x1b,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x1f,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x22,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x2c,0x0,0x0,0x0,0x2d,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x2e,0x0,0x0,0x0,0x2d,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x2c,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x31,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x33,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x92,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x2e,0x0,0x0,0x0,0x33,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1a,0x0,0x0,0x0,0x35,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x36,0x0,0x0,0x0,0x35,0x0,0x0,0x0,0x92,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x37,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x36,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x3f,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x50,0x0,0x7,0x0,0x7,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x3f,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x3d,0x0,0x0,0x0,0x91,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x41,0x0,0x0,0x0,0x37,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x42,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x43,0x0,0x0,0x0,0x41,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x46,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x47,0x0,0x0,0x0,0x46,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x47,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x49,0x0,0x0,0x0,0x47,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x50,0x0,0x5,0x0,0x38,0x0,0x0,0x0,0x4a,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x49,0x0,0x0,0x0,0x41,0x0,0x6,0x0,0x4c,0x0,0x0,0x0,0x4d,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x4b,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x4e,0x0,0x0,0x0,0x4d,0x0,0x0,0x0,0x41,0x0,0x6,0x0,0x4c,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x4f,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x51,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0x50,0x0,0x5,0x0,0x38,0x0,0x0,0x0,0x52,0x0,0x0,0x0,0x4e,0x0,0x0,0x0,0x51,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x38,0x0,0x0,0x0,0x54,0x0,0x0,0x0,0x53,0x0,0x0,0x0,0x85,0x0,0x5,0x0,0x38,0x0,0x0,0x0,0x55,0x0,0x0,0x0,0x52,0x0,0x0,0x0,0x54,0x0,0x0,0x0,0x81,0x0,0x5,0x0,0x38,0x0,0x0,0x0,0x56,0x0,0x0,0x0,0x4a,0x0,0x0,0x0,0x55,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x45,0x0,0x0,0x0,0x56,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x58,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x59,0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x57,0x0,0x0,0x0,0x59,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,
+ 0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x5f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x4c,0x0,0x0,0x0,0x5c,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,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,0x0,0x0,0x4,0x0,0x8,0x0,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,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x9,0x0,0x0,0x0,0x53,0x70,0x72,0x69,0x74,0x65,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x6,0x0,0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x54,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x9,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x73,0x0,0x0,0x0,0x6,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x73,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x5,0x0,0x7,0x0,0xc,0x0,0x0,0x0,0x53,0x70,0x72,0x69,0x74,0x65,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x6,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x54,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0xc,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x73,0x0,0x0,0x0,0x6,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0xe,0x0,0x0,0x0,0x53,0x42,0x4f,0x5f,0x53,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x6,0x0,0x5,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x61,0x74,0x61,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0x10,0x0,0x0,0x0,0x73,0x62,0x6f,0x53,0x70,0x72,0x69,0x74,0x65,0x44,0x61,0x74,0x61,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x14,0x0,0x0,0x0,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x6e,0x64,0x65,0x78,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x65,0x72,0x56,0x65,0x72,0x74,0x65,0x78,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x0,0x0,0x0,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x6c,0x69,0x70,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x6,0x0,0x7,0x0,0x26,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x75,0x6c,0x6c,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x5,0x0,0x3,0x0,0x28,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x29,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x6,0x0,0x6,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x5,0x0,0x2b,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x5,0x0,0x7,0x0,0x2f,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x6,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x76,0x69,0x65,0x77,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x31,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x5,0x0,0x5,0x0,0x3a,0x0,0x0,0x0,0x69,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x3,0x0,0x44,0x0,0x0,0x0,0x74,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x48,0x0,0x0,0x0,0x69,0x6e,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x0,0x5,0x0,0x5,0x0,0x4c,0x0,0x0,0x0,0x6f,0x75,0x74,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x5,0x0,0x6,0x0,0x5c,0x0,0x0,0x0,0x6f,0x75,0x74,0x56,0x65,0x72,0x74,0x65,0x78,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x48,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0xd,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0xe,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x10,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x14,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x26,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x29,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x2b,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x2b,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x2f,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x2f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x31,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x31,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x3a,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x48,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x4c,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x5c,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x18,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1e,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x5,0x0,0xc,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x1d,0x0,0x3,0x0,0xd,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0xe,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x16,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1a,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1e,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1c,0x0,0x4,0x0,0x25,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x1e,0x0,0x6,0x0,0x26,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x29,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x29,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x2c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x2f,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2f,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x30,0x0,0x0,0x0,0x31,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x38,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x39,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x39,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x3d,0x0,0x0,0x0,0x0,0x0,0x80,0x3f,0x20,0x0,0x4,0x0,0x42,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x47,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x47,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x4b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x4b,0x0,0x0,0x0,0x4c,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x4d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x4e,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x51,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x23,0x0,0x0,0x0,0x57,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x42,0x0,0x0,0x0,0x5c,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x1e,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x41,0x0,0x6,0x0,0x16,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1a,0x0,0x0,0x0,0x1b,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x1b,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x1f,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x22,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x2c,0x0,0x0,0x0,0x2d,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x2e,0x0,0x0,0x0,0x2d,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x2c,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x31,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x33,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x92,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x2e,0x0,0x0,0x0,0x33,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1a,0x0,0x0,0x0,0x35,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x36,0x0,0x0,0x0,0x35,0x0,0x0,0x0,0x92,0x0,0x5,0x0,0x8,0x0,0x0,0x0,0x37,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x36,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x38,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x3a,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x3f,0x0,0x0,0x0,0x3b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x50,0x0,0x7,0x0,0x7,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x3f,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x3d,0x0,0x0,0x0,0x91,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x41,0x0,0x0,0x0,0x37,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x42,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x43,0x0,0x0,0x0,0x41,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x45,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x46,0x0,0x0,0x0,0x45,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x49,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x85,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x4a,0x0,0x0,0x0,0x46,0x0,0x0,0x0,0x49,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x44,0x0,0x0,0x0,0x4a,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x4e,0x0,0x0,0x0,0x4f,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x4d,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0x4f,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x4e,0x0,0x0,0x0,0x52,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x51,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x53,0x0,0x0,0x0,0x52,0x0,0x0,0x0,0x81,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x54,0x0,0x0,0x0,0x50,0x0,0x0,0x0,0x53,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x4e,0x0,0x0,0x0,0x55,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x56,0x0,0x0,0x0,0x55,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x4e,0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x57,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x59,0x0,0x0,0x0,0x58,0x0,0x0,0x0,0x81,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x5a,0x0,0x0,0x0,0x56,0x0,0x0,0x0,0x59,0x0,0x0,0x0,0x50,0x0,0x5,0x0,0x38,0x0,0x0,0x0,0x5b,0x0,0x0,0x0,0x54,0x0,0x0,0x0,0x5a,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x4c,0x0,0x0,0x0,0x5b,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x1e,0x0,0x0,0x0,0x5d,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x5e,0x0,0x0,0x0,0x5d,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x5c,0x0,0x0,0x0,0x5e,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,
+ };
+
+ CONST Vector DATA_PRIMITIVEDRAW_FRAG = {
+ 0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0x7,0x0,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x10,0x0,0x3,0x0,0x4,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,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,0x0,0x0,0x4,0x0,0x8,0x0,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,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x6f,0x75,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0xb,0x0,0x0,0x0,0x69,0x6e,0x56,0x65,0x72,0x74,0x65,0x78,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0xb,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0xd,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0xd,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0xcd,0xcc,0xcc,0x3d,0x14,0x0,0x2,0x0,0x13,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x9,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0xf,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xb8,0x0,0x5,0x0,0x13,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0xf7,0x0,0x3,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfa,0x0,0x4,0x0,0x14,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x16,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x15,0x0,0x0,0x0,0xfc,0x0,0x1,0x0,0xf8,0x0,0x2,0x0,0x16,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,
+ };
+
+ CONST Vector DATA_PRIMITIVEDRAW_VERT = {
+ 0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x2d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0x9,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x29,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,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,0x0,0x0,0x4,0x0,0x8,0x0,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,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x6,0x0,0xb,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x65,0x72,0x56,0x65,0x72,0x74,0x65,0x78,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x6,0x0,0x7,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x0,0x0,0x0,0x0,0x6,0x0,0x7,0x0,0xb,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x6c,0x69,0x70,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x6,0x0,0x7,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x75,0x6c,0x6c,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x5,0x0,0x3,0x0,0xd,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x7,0x0,0x11,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x6,0x0,0x6,0x0,0x11,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x5,0x0,0x13,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x53,0x63,0x65,0x6e,0x65,0x0,0x5,0x0,0x7,0x0,0x17,0x0,0x0,0x0,0x55,0x42,0x4f,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x5f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x6,0x0,0x5,0x0,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x76,0x69,0x65,0x77,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x19,0x0,0x0,0x0,0x75,0x62,0x6f,0x50,0x65,0x72,0x46,0x72,0x61,0x6d,0x65,0x0,0x5,0x0,0x5,0x0,0x1f,0x0,0x0,0x0,0x69,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x0,0x5,0x0,0x6,0x0,0x29,0x0,0x0,0x0,0x6f,0x75,0x74,0x56,0x65,0x72,0x74,0x65,0x78,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x5,0x0,0x6,0x0,0x2b,0x0,0x0,0x0,0x69,0x6e,0x56,0x65,0x72,0x74,0x65,0x78,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0xb,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x11,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x11,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x11,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x11,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x13,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x17,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x4,0x0,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x19,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x19,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x1f,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x29,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x2b,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1c,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x6,0x0,0xb,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x11,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x12,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x12,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x14,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x1e,0x0,0x3,0x0,0x17,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x18,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x18,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x1d,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1e,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x1e,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x0,0x0,0x80,0x3f,0x20,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x27,0x0,0x0,0x0,0x29,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x2a,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x14,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x16,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x14,0x0,0x0,0x0,0x1a,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x10,0x0,0x0,0x0,0x1b,0x0,0x0,0x0,0x1a,0x0,0x0,0x0,0x92,0x0,0x5,0x0,0x10,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x16,0x0,0x0,0x0,0x1b,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x1d,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x50,0x0,0x7,0x0,0x7,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x91,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x27,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x28,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x2b,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x29,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,
};
}
@@ -35,7 +43,9 @@ namespace ia::iae
VOID EmbeddedResources::Initialize()
{
s_resources["Shaders/DynamicSprite.frag"] = DATA_DYNAMICSPRITE_FRAG;
- s_resources["Shaders/DynamicSprite.vert"] = DATA_DYNAMICSPRITE_VERT;
+ s_resources["Shaders/DynamicSprite.vert"] = DATA_DYNAMICSPRITE_VERT;
+ s_resources["Shaders/PrimitiveDraw.frag"] = DATA_PRIMITIVEDRAW_FRAG;
+ s_resources["Shaders/PrimitiveDraw.vert"] = DATA_PRIMITIVEDRAW_VERT;
}
VOID EmbeddedResources::Terminate()
diff --git a/Src/RenderCore/imp/cpp/Pipeline.cpp b/Src/RenderCore/imp/cpp/Pipeline.cpp
index c07bd50..194475d 100644
--- a/Src/RenderCore/imp/cpp/Pipeline.cpp
+++ b/Src/RenderCore/imp/cpp/Pipeline.cpp
@@ -19,7 +19,7 @@
namespace ia::iae
{
RDC_Pipeline::RDC_Pipeline(IN SDL_GPUTextureFormat renderTargetFormat, IN CONST StageDesc &vertexStageDesc,
- IN CONST StageDesc &pixelStageDesc, IN BOOL enableVertexBuffer)
+ IN CONST StageDesc &pixelStageDesc, IN SDL_GPUPrimitiveType primitiveType, IN BOOL enableVertexBuffer)
{
SDL_GPUShader *vertexShader{};
SDL_GPUShader *pixelShader{};
@@ -69,7 +69,7 @@ namespace ia::iae
SDL_GPUVertexAttribute vertexAttributes[] = {
{.location = 0, .buffer_slot = 0, .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2, .offset = 0},
- {.location = 1, .buffer_slot = 0, .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2, .offset = sizeof(Vec2)}};
+ {.location = 1, .buffer_slot = 0, .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4, .offset = sizeof(Vec2)}};
SDL_GPUGraphicsPipelineCreateInfo createInfo = {
.vertex_shader = vertexShader,
@@ -77,8 +77,8 @@ namespace ia::iae
.vertex_input_state = SDL_GPUVertexInputState{.vertex_buffer_descriptions = &vertexBufferDesc,
.num_vertex_buffers = enableVertexBuffer ? (UINT32) 1 : 0,
.vertex_attributes = vertexAttributes,
- .num_vertex_attributes = enableVertexBuffer ? (UINT32) 2 : 0},
- .primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
+ .num_vertex_attributes = enableVertexBuffer ? (UINT32)2 : 0},
+ .primitive_type = primitiveType,
.rasterizer_state = SDL_GPURasterizerState{.fill_mode = SDL_GPU_FILLMODE_FILL,
.cull_mode = SDL_GPU_CULLMODE_NONE,
.front_face = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
diff --git a/Src/RenderCore/imp/cpp/RenderCore.cpp b/Src/RenderCore/imp/cpp/RenderCore.cpp
index ed94ab9..1fb53c4 100644
--- a/Src/RenderCore/imp/cpp/RenderCore.cpp
+++ b/Src/RenderCore/imp/cpp/RenderCore.cpp
@@ -26,19 +26,30 @@ namespace ia::iae
Mat4 RDC::s_projectionMatrix;
SDL_Window *RDC::s_windowHandle;
Handle RDC::s_quadGeometry;
+
+ RDC_Pipeline *RDC::s_primitiveDrawPipeline;
RDC_Pipeline *RDC::s_dynamicSpritePipeline;
+
SDL_GPUSampler *RDC::s_linearClampSampler;
SDL_GPUSampler *RDC::s_linearRepeatSampler;
Vec2 RDC::s_cameraPosition{};
IVec2 RDC::s_viewportExtent;
+
+ RDC_Texture *RDC::s_defaultTexture{};
+
RDC_TextureAtlas *RDC::s_staticSpriteAtlas{};
RDC_TextureAtlas *RDC::s_dynamicSpriteAtlas{};
- INT32 RDC::s_spriteInstanceCount{};
+
+ RDC_HostVisibleBuffer *RDC::s_primitiveInstanceBuffer{};
RDC_HostVisibleBuffer *RDC::s_staticSpriteInstanceBuffer{};
RDC_HostVisibleBuffer *RDC::s_dynamicSpriteInstanceBuffer{};
- RDC_Texture *RDC::s_defaultTexture{};
+
+ INT32 RDC::s_spriteInstanceCount{};
RDC_SpriteInstanceData RDC::s_spriteInstances[RDC::MAX_SPRITE_COUNT];
+ INT32 RDC::s_primitiveInstanceCount{};
+ GeometryVertex RDC::s_primitiveInstances[RDC::MAX_PRIMITIVE_COUNT];
+
VOID RDC::Initialize(IN IVec2 viewportExtent, IN SDL_Window *windowHandle, IN BOOL isDebugMode)
{
EmbeddedResources::Initialize();
@@ -69,7 +80,11 @@ namespace ia::iae
delete s_defaultTexture;
delete s_staticSpriteAtlas;
delete s_dynamicSpriteAtlas;
+
+ delete s_primitiveDrawPipeline;
delete s_dynamicSpritePipeline;
+
+ delete s_primitiveInstanceBuffer;
delete s_staticSpriteInstanceBuffer;
delete s_dynamicSpriteInstanceBuffer;
@@ -85,11 +100,12 @@ namespace ia::iae
glm::orthoLH(0.0f, (FLOAT32) s_viewportExtent.x, (FLOAT32) s_viewportExtent.y, 0.0f, -1.0f, 1.0f);
}
- VOID RDC::Render(IN SDL_GPURenderPass* renderPass, IN SDL_GPUCommandBuffer* commandBuffer)
+ VOID RDC::Render(IN SDL_GPURenderPass *renderPass, IN SDL_GPUCommandBuffer *commandBuffer)
{
s_dynamicSpritePipeline->Bind(renderPass);
SDL_PushGPUVertexUniformData(commandBuffer, 0, &s_projectionMatrix, sizeof(Mat4));
SDL_PushGPUVertexUniformData(commandBuffer, 1, &s_viewMatrix, sizeof(Mat4));
+
SDL_GPUTextureSamplerBinding textureBinding{.texture = s_dynamicSpriteAtlas
? s_dynamicSpriteAtlas->GetTexture()->GetHandle()
: s_defaultTexture->GetHandle(),
@@ -98,13 +114,27 @@ namespace ia::iae
RDC_Device::BindGeometry(renderPass, s_quadGeometry);
if (s_spriteInstanceCount)
{
- const auto spriteInstanceBuffer = s_dynamicSpriteInstanceBuffer->GetHandle();
+ const auto buffer = s_dynamicSpriteInstanceBuffer->GetHandle();
s_dynamicSpriteInstanceBuffer->CopyFrom(s_spriteInstances,
sizeof(RDC_SpriteInstanceData) * s_spriteInstanceCount);
- SDL_BindGPUVertexStorageBuffers(renderPass, 0, &spriteInstanceBuffer, 1);
+ SDL_BindGPUVertexStorageBuffers(renderPass, 0, &buffer, 1);
SDL_DrawGPUIndexedPrimitives(renderPass, 6, s_spriteInstanceCount, 0, 0, 0);
}
s_spriteInstanceCount = 0;
+
+ s_primitiveDrawPipeline->Bind(renderPass);
+ SDL_PushGPUVertexUniformData(commandBuffer, 0, &s_projectionMatrix, sizeof(Mat4));
+ SDL_PushGPUVertexUniformData(commandBuffer, 1, &s_viewMatrix, sizeof(Mat4));
+
+ if (s_primitiveInstanceCount)
+ {
+ s_primitiveInstanceBuffer->CopyFrom(s_primitiveInstances,
+ sizeof(GeometryVertex) * s_primitiveInstanceCount);
+ SDL_GPUBufferBinding bufferBindings[] = {{.buffer = s_primitiveInstanceBuffer->GetHandle(), .offset = 0}};
+ SDL_BindGPUVertexBuffers(renderPass, 0, &bufferBindings[0], 1);
+ SDL_DrawGPUPrimitives(renderPass, s_primitiveInstanceCount << 1, 1, 0, 0);
+ }
+ s_primitiveInstanceCount = 0;
}
VOID RDC::RenderToWindow()
@@ -192,6 +222,27 @@ namespace ia::iae
.Color = {1.0f, 1.0f, 1.0f, 1.0f}};
return _s;
}
+
+ VOID RDC::DrawLine(IN Vec2 start, IN Vec2 end, IN Vec4 color)
+ {
+ s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
+ s_primitiveInstances[s_primitiveInstanceCount++] = { end, color };
+ }
+
+ VOID RDC::DrawRect(IN Vec2 start, IN Vec2 end, IN Vec4 color)
+ {
+ s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
+ s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{end.x, start.y}, color};
+
+ s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{end.x, start.y}, color};
+ s_primitiveInstances[s_primitiveInstanceCount++] = {end, color};
+
+ s_primitiveInstances[s_primitiveInstanceCount++] = {end, color};
+ s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{start.x, end.y}, color};
+
+ s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{start.x, end.y}, color};
+ s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
+ }
} // namespace ia::iae
namespace ia::iae
@@ -271,6 +322,7 @@ namespace ia::iae
{
s_dynamicSpriteInstanceBuffer =
new RDC_HostVisibleBuffer(RDC_Buffer::EType::STORAGE, sizeof(s_spriteInstances));
+ s_primitiveInstanceBuffer = new RDC_HostVisibleBuffer(RDC_Buffer::EType::VERTEX, sizeof(s_primitiveInstances));
}
VOID RDC::InitializeTextures()
@@ -286,6 +338,22 @@ namespace ia::iae
VOID RDC::InitializePipelines()
{
+ s_primitiveDrawPipeline =
+ new RDC_Pipeline(RDC_Device::GetSwapchainTextureFormat(),
+ RDC_Pipeline::StageDesc{
+ .SourceData = EmbeddedResources::GetResource("Shaders/PrimitiveDraw.vert"),
+ .SamplerCount = 0,
+ .UniformBufferCount = 2,
+ .StorageBufferCount = 0,
+ },
+ RDC_Pipeline::StageDesc{
+ .SourceData = EmbeddedResources::GetResource("Shaders/PrimitiveDraw.frag"),
+ .SamplerCount = 0,
+ .UniformBufferCount = 0,
+ .StorageBufferCount = 0,
+ },
+ SDL_GPU_PRIMITIVETYPE_LINELIST, true);
+
s_dynamicSpritePipeline =
new RDC_Pipeline(RDC_Device::GetSwapchainTextureFormat(),
RDC_Pipeline::StageDesc{
@@ -300,17 +368,17 @@ namespace ia::iae
.UniformBufferCount = 0,
.StorageBufferCount = 0,
},
- true);
+ SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, true);
}
VOID RDC::InitializeGeometries()
{
s_quadGeometry = RDC_Device::CreateGeometry(
{
- {glm::vec2{0, 1}, glm::vec2{0, 1}},
- {glm::vec2{1, 1}, glm::vec2{1, 1}},
- {glm::vec2{1, 0}, glm::vec2{1, 0}},
- {glm::vec2{0, 0}, glm::vec2{0, 0}},
+ {glm::vec2{0.0f, 1.0f}, glm::vec4{1.0f, 1.0f, 0.0f, 1.0f}},
+ {glm::vec2{1.0f, 1.0f}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
+ {glm::vec2{1.0f, 0.0f}, glm::vec4{1.0f, 1.0f, 1.0f, 0.0f}},
+ {glm::vec2{0.0f, 0.0f}, glm::vec4{1.0f, 1.0f, 0.0f, 0.0f}},
},
{0, 1, 2, 2, 3, 0});
}
diff --git a/Src/RenderCore/imp/cpp/Texture.cpp b/Src/RenderCore/imp/cpp/Texture.cpp
index 8f6332f..45e59a5 100644
--- a/Src/RenderCore/imp/cpp/Texture.cpp
+++ b/Src/RenderCore/imp/cpp/Texture.cpp
@@ -24,7 +24,7 @@ namespace ia::iae
: (UINT32) 1)
{
SDL_GPUTextureCreateInfo createInfo{.type = SDL_GPU_TEXTURETYPE_2D,
- .format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM,
+ .format = RDC_Device::GetSwapchainTextureFormat(),
.width = (UINT32) width,
.height = (UINT32) height,
.layer_count_or_depth = 1,
@@ -54,6 +54,10 @@ namespace ia::iae
TMP_COLOR_BUFFER.resize(m_width * m_height * 4);
+ const auto swapchainFormat = RDC_Device::GetSwapchainTextureFormat();
+ const auto swapRB = (swapchainFormat == SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM) ||
+ (swapchainFormat == SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB);
+
if (stride == -1)
{
for (SIZE_T i = 0; i < TMP_COLOR_BUFFER.size() >> 2; i++)
@@ -63,6 +67,9 @@ namespace ia::iae
TMP_COLOR_BUFFER[i * 4 + 1] = static_cast(rgbaData[i * 4 + 1] * a);
TMP_COLOR_BUFFER[i * 4 + 2] = static_cast(rgbaData[i * 4 + 2] * a);
TMP_COLOR_BUFFER[i * 4 + 3] = rgbaData[i * 4 + 3];
+
+ if (swapRB)
+ std::swap(TMP_COLOR_BUFFER[i * 4 + 0], TMP_COLOR_BUFFER[i * 4 + 2]);
}
}
else
@@ -77,6 +84,9 @@ namespace ia::iae
TMP_COLOR_BUFFER[(x + y * m_width) * 4 + 1] = static_cast(p[1] * a);
TMP_COLOR_BUFFER[(x + y * m_width) * 4 + 2] = static_cast(p[2] * a);
TMP_COLOR_BUFFER[(x + y * m_width) * 4 + 3] = p[3];
+ if (swapRB)
+ std::swap(TMP_COLOR_BUFFER[(x + y * m_width) * 4 + 0],
+ TMP_COLOR_BUFFER[(x + y * m_width) * 4 + 0]);
}
}
}
diff --git a/Src/RenderCore/inc/RenderCore/Device.hpp b/Src/RenderCore/inc/RenderCore/Device.hpp
index 524e323..8c8eb54 100644
--- a/Src/RenderCore/inc/RenderCore/Device.hpp
+++ b/Src/RenderCore/inc/RenderCore/Device.hpp
@@ -24,7 +24,7 @@ namespace ia::iae
struct GeometryVertex
{
Vec2 Position;
- Vec2 TexCoords;
+ Vec4 TexCoords_Color;
};
class RDC_Device
diff --git a/Src/RenderCore/inc/RenderCore/Pipeline.hpp b/Src/RenderCore/inc/RenderCore/Pipeline.hpp
index dce8222..523ac86 100644
--- a/Src/RenderCore/inc/RenderCore/Pipeline.hpp
+++ b/Src/RenderCore/inc/RenderCore/Pipeline.hpp
@@ -32,11 +32,12 @@ namespace ia::iae
};
public:
- RDC_Pipeline(IN SDL_GPUTextureFormat renderTargetFormat, IN CONST StageDesc &vertexStageDesc, IN CONST StageDesc &pixelStageDesc,
+ RDC_Pipeline(IN SDL_GPUTextureFormat renderTargetFormat, IN CONST StageDesc &vertexStageDesc,
+ IN CONST StageDesc &pixelStageDesc, IN SDL_GPUPrimitiveType primitiveType,
IN BOOL enableVertexBuffer);
~RDC_Pipeline();
- VOID Bind(IN SDL_GPURenderPass* renderPass);
+ VOID Bind(IN SDL_GPURenderPass *renderPass);
public:
SDL_GPUGraphicsPipeline *GetHandle() CONST
diff --git a/Src/RenderCore/inc/RenderCore/RenderCore.hpp b/Src/RenderCore/inc/RenderCore/RenderCore.hpp
index 0ec7b21..3f9798a 100644
--- a/Src/RenderCore/inc/RenderCore/RenderCore.hpp
+++ b/Src/RenderCore/inc/RenderCore/RenderCore.hpp
@@ -38,6 +38,7 @@ namespace ia::iae
{
public:
STATIC CONSTEXPR INT32 MAX_SPRITE_COUNT = 100000;
+ STATIC CONSTEXPR INT32 MAX_PRIMITIVE_COUNT = 100000;
public:
STATIC VOID Initialize(IN IVec2 viewportExtent, IN SDL_Window *windowHandle, IN BOOL isDebugMode);
@@ -57,6 +58,9 @@ namespace ia::iae
STATIC Vec2 DrawSpriteCentered(IN Handle image, IN INT32 tileIndexX, IN INT32 tileIndexY,
IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH = false, IN BOOL flipV = false, IN Vec2 uvOffset = {});
+ STATIC VOID DrawLine(IN Vec2 start, IN Vec2 end, IN Vec4 color);
+ STATIC VOID DrawRect(IN Vec2 start, IN Vec2 end, IN Vec4 color);
+
STATIC Handle CreateImage(IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height, IN INT32 tileCountX = 1,
IN INT32 tileCountY = 1);
STATIC VOID DestroyImage(IN Handle image);
@@ -74,20 +78,29 @@ namespace ia::iae
private:
STATIC Mat4 s_viewMatrix;
- STATIC IVec2 s_viewportExtent;
- STATIC Mat4 s_projectionMatrix;
STATIC Vec2 s_cameraPosition;
STATIC Handle s_quadGeometry;
+ STATIC IVec2 s_viewportExtent;
+ STATIC Mat4 s_projectionMatrix;
STATIC SDL_Window *s_windowHandle;
+ STATIC RDC_Texture* s_defaultTexture;
+
+ STATIC RDC_Pipeline *s_primitiveDrawPipeline;
STATIC RDC_Pipeline *s_dynamicSpritePipeline;
+
STATIC SDL_GPUSampler *s_linearClampSampler;
STATIC SDL_GPUSampler *s_linearRepeatSampler;
STATIC RDC_TextureAtlas *s_staticSpriteAtlas;
STATIC RDC_TextureAtlas *s_dynamicSpriteAtlas;
+
+ STATIC RDC_HostVisibleBuffer* s_primitiveInstanceBuffer;
STATIC RDC_HostVisibleBuffer* s_staticSpriteInstanceBuffer;
STATIC RDC_HostVisibleBuffer* s_dynamicSpriteInstanceBuffer;
+
STATIC INT32 s_spriteInstanceCount;
- STATIC RDC_Texture* s_defaultTexture;
STATIC RDC_SpriteInstanceData s_spriteInstances[MAX_SPRITE_COUNT];
+
+ STATIC INT32 s_primitiveInstanceCount;
+ STATIC GeometryVertex s_primitiveInstances[MAX_PRIMITIVE_COUNT];
};
} // namespace ia::iae
\ No newline at end of file