From 2653343f56da0dbeccf82a1f7a3dedce3c2450a9 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sun, 28 Jul 2024 12:29:21 -0400 Subject: [PATCH] Added gizmo to Directional&Spotlight lights, also fixed direction calculations for ProceduralSky --- Editor/src/Misc/GizmoDrawer.cpp | 35 +- Nuake/src/Rendering/SceneRenderer.cpp | 2 +- Nuake/src/Resource/StaticResources.cpp | 546 ++++++++++---------- Nuake/src/Scene/Components/LightComponent.h | 2 +- Resources/Shaders/deferred.shader | 5 +- 5 files changed, 308 insertions(+), 282 deletions(-) diff --git a/Editor/src/Misc/GizmoDrawer.cpp b/Editor/src/Misc/GizmoDrawer.cpp index 82476a7d..9251d971 100644 --- a/Editor/src/Misc/GizmoDrawer.cpp +++ b/Editor/src/Misc/GizmoDrawer.cpp @@ -313,6 +313,40 @@ void GizmoDrawer::DrawGizmos(Ref scene, bool occluded) Nuake::RenderCommand::DrawLines(0, 264); } + auto lightView = scene->m_Registry.view(); + for (auto e : lightView) + { + auto [transform, light] = scene->m_Registry.get(e); + if (light.Type == Spot || (light.Type == Directional && !light.SyncDirectionWithSky)) + { + const auto entityId = (uint32_t)e; + if (m_CylinderGizmo.find(entityId) == m_CylinderGizmo.end()) + { + m_CylinderGizmo[entityId] = CreateScope(Color(light.Color.r, light.Color.g, light.Color.b, 0.6f)); + } + + const float cylinderLength = 2.0f; + m_CylinderGizmo[entityId]->UpdateShape(0.1f, cylinderLength, Color(light.Color.r, light.Color.g, light.Color.b, 0.6f)); + + const Quat& rotationOffset = QuatFromEuler(90.0f, 0, 0); + const Quat& globalRotation = glm::normalize(transform.GetGlobalRotation()) * rotationOffset; + const Matrix4& rotationMatrix = glm::mat4_cast(globalRotation); + + Matrix4 gizmoPosition = Matrix4(1.0f); + gizmoPosition = glm::translate(scene->m_EditorCamera->GetTransform(), Vector3(transform.GetGlobalTransform()[3])); + gizmoPosition = gizmoPosition * rotationMatrix; + gizmoPosition = glm::translate(gizmoPosition, { 0, cylinderLength / 2.0, 0 }); + + m_LineShader->Bind(); + m_LineShader->SetUniform1f("u_Opacity", 0.5f); + m_LineShader->SetUniformMat4f("u_View", gizmoPosition); + m_LineShader->SetUniformMat4f("u_Projection", scene->m_EditorCamera->GetPerspective()); + + m_CylinderGizmo[entityId]->Bind(); + Nuake::RenderCommand::DrawLines(0, 264); + } + } + auto particleView = scene->m_Registry.view(); for (auto e : particleView) { @@ -401,7 +435,6 @@ void GizmoDrawer::DrawGizmos(Ref scene, bool occluded) } // Lights - auto lightView = scene->m_Registry.view(); for (auto e : lightView) { gizmoShader->SetUniformTex("gizmo_texture", TextureManager::Get()->GetTexture("Resources/Gizmos/light.png").get()); diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index 76282706..ec92d108 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -700,7 +700,7 @@ namespace Nuake if (light.Type == Directional && light.SyncDirectionWithSky) { - light.Direction = env->ProceduralSkybox->GetSunDirection(); + light.Direction = -env->ProceduralSkybox->GetSunDirection(); } else { diff --git a/Nuake/src/Resource/StaticResources.cpp b/Nuake/src/Resource/StaticResources.cpp index 62f83e41..9af902fd 100644 --- a/Nuake/src/Resource/StaticResources.cpp +++ b/Nuake/src/Resource/StaticResources.cpp @@ -234381,287 +234381,283 @@ const std::string Resources_Shaders_deferred_shader_path = R"(Resources/Shaders/ 0x75, 0x65, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x4c, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x28, 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x3b, 0x0d, 0x0a, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x20, - 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, - 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x75, 0x5f, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x3e, - 0x20, 0x30, 0x2e, 0x31, 0x66, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, - 0x77, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, - 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x77, - 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x2c, 0x20, 0x4e, 0x29, 0x3b, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, - 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x65, 0x63, 0x33, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, - 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x75, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x20, 0x73, 0x68, 0x61, 0x64, - 0x6f, 0x77, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x48, 0x20, 0x3d, 0x20, - 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x56, 0x20, - 0x2b, 0x20, 0x4c, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4e, 0x44, 0x46, - 0x20, 0x3d, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x47, 0x58, 0x28, 0x4e, 0x2c, 0x20, 0x48, 0x2c, - 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, + 0x7a, 0x65, 0x28, 0x2d, 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x47, 0x20, 0x3d, 0x20, 0x47, 0x65, 0x6f, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x53, 0x6d, 0x69, 0x74, 0x68, 0x28, 0x4e, 0x2c, - 0x20, 0x56, 0x2c, 0x20, 0x4c, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, - 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x46, 0x20, 0x3d, - 0x20, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x6c, - 0x69, 0x63, 0x6b, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, - 0x48, 0x2c, 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, - 0x20, 0x46, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6e, 0x6f, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4e, 0x44, - 0x46, 0x20, 0x2a, 0x20, 0x47, 0x20, 0x2a, 0x20, 0x46, 0x3b, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x20, 0x3d, 0x20, 0x34, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, - 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, - 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, - 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x4c, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, - 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x3b, 0x20, 0x2f, - 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x70, - 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, - 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x3d, 0x20, - 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x2f, 0x20, - 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3b, - 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2f, 0x2f, 0x20, 0x6b, 0x53, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, - 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x72, 0x65, 0x73, 0x6e, 0x65, - 0x6c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x65, 0x63, 0x33, 0x20, 0x6b, 0x53, 0x20, 0x3d, 0x20, 0x46, 0x3b, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, - 0x33, 0x20, 0x6b, 0x44, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, - 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x6b, 0x53, 0x3b, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x44, 0x20, 0x2a, - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x6c, 0x69, 0x63, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x62, 0x79, 0x20, 0x4e, - 0x64, 0x6f, 0x74, 0x4c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4e, 0x64, 0x6f, 0x74, - 0x4c, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, - 0x4e, 0x2c, 0x20, 0x4c, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, - 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x6b, 0x44, 0x20, 0x2a, 0x20, 0x61, 0x6c, - 0x62, 0x65, 0x64, 0x6f, 0x20, 0x2f, 0x20, 0x50, 0x49, 0x20, 0x2b, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x29, 0x20, 0x2a, 0x20, - 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x4e, - 0x64, 0x6f, 0x74, 0x4c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, - 0x69, 0x20, 0x3c, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, - 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, - 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x65, 0x63, 0x33, 0x20, 0x4c, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, - 0x5b, 0x69, 0x5d, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x2d, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x29, - 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, - 0x6f, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x74, 0x74, 0x65, - 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2e, - 0x30, 0x20, 0x2f, 0x20, 0x28, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x61, 0x74, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x3b, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, + 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x64, 0x6f, + 0x77, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x31, 0x66, 0x29, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, + 0x61, 0x64, 0x6f, 0x77, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x2c, 0x20, + 0x4e, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, - 0x6e, 0x63, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x28, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, - 0x69, 0x5d, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, - 0x29, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x43, 0x6f, 0x6c, 0x6f, - 0x72, 0x20, 0x2a, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x70, 0x6f, + 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x2e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x20, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x48, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x28, 0x56, 0x20, 0x2b, 0x20, 0x4c, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x4e, 0x44, 0x46, 0x20, 0x3d, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x47, 0x58, 0x28, 0x4e, 0x2c, + 0x20, 0x48, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, + 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x47, 0x20, 0x3d, 0x20, 0x47, + 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x6d, 0x69, 0x74, 0x68, + 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x2c, 0x20, 0x4c, 0x2c, 0x20, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, + 0x46, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x53, + 0x63, 0x68, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, + 0x6f, 0x74, 0x28, 0x48, 0x2c, 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, + 0x30, 0x29, 0x2c, 0x20, 0x46, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, + 0x20, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x4e, 0x44, 0x46, 0x20, 0x2a, 0x20, 0x47, 0x20, 0x2a, 0x20, 0x46, + 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x34, 0x20, 0x2a, 0x20, 0x6d, + 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x29, + 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, + 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x4c, 0x29, 0x2c, 0x20, + 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, + 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, + 0x2e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x65, 0x63, 0x33, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x2f, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6b, 0x53, 0x20, 0x69, 0x73, 0x20, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x72, 0x65, + 0x73, 0x6e, 0x65, 0x6c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x53, 0x20, 0x3d, 0x20, + 0x46, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x44, 0x20, 0x3d, 0x20, 0x76, 0x65, + 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x6b, 0x53, + 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x44, 0x20, 0x2a, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, + 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x63, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x62, + 0x79, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4e, + 0x64, 0x6f, 0x74, 0x4c, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, + 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x4c, 0x29, 0x2c, 0x20, 0x30, 0x2e, + 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x4c, 0x6f, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x6b, 0x44, 0x20, 0x2a, + 0x20, 0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x20, 0x2f, 0x20, 0x50, 0x49, + 0x20, 0x2b, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x29, + 0x20, 0x2a, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x2a, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x4c, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x4c, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, + 0x6f, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x28, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x28, 0x64, 0x69, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x72, 0x61, + 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x4c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x3d, 0x20, 0x31, 0x29, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x74, - 0x61, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x4c, 0x2c, 0x20, 0x6e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x2d, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x44, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, - 0x20, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, - 0x5d, 0x2e, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x67, 0x6c, 0x65, - 0x20, 0x2d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, - 0x2e, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3b, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, - 0x70, 0x28, 0x28, 0x74, 0x68, 0x65, 0x74, 0x61, 0x20, 0x2d, 0x20, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x4f, 0x75, 0x74, - 0x65, 0x72, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x20, 0x2f, 0x20, 0x65, - 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, - 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x74, 0x79, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6f, 0x6b, 0x2d, 0x54, 0x6f, - 0x72, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x42, 0x52, 0x44, 0x46, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, - 0x33, 0x20, 0x48, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x28, 0x56, 0x20, 0x2b, 0x20, 0x4c, 0x29, 0x3b, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x20, 0x4e, 0x44, 0x46, 0x20, 0x3d, 0x20, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x47, 0x58, - 0x28, 0x4e, 0x2c, 0x20, 0x48, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, - 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x47, 0x20, - 0x3d, 0x20, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x6d, - 0x69, 0x74, 0x68, 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x2c, 0x20, 0x4c, 0x2c, - 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, - 0x63, 0x33, 0x20, 0x46, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x65, 0x73, 0x6e, - 0x65, 0x6c, 0x53, 0x63, 0x68, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x6d, 0x61, - 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x48, 0x2c, 0x20, 0x56, 0x29, 0x2c, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x46, 0x30, 0x29, 0x3b, 0x0d, - 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x65, 0x63, 0x33, 0x20, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x20, 0x3d, 0x20, 0x4e, 0x44, 0x46, 0x20, 0x2a, 0x20, 0x47, 0x20, - 0x2a, 0x20, 0x46, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x65, 0x6e, 0x6f, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x34, 0x20, - 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, - 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, - 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x4c, - 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, - 0x30, 0x30, 0x31, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x30, - 0x31, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, - 0x65, 0x72, 0x6f, 0x2e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, - 0x6c, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x20, 0x2f, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6b, 0x53, 0x20, - 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, - 0x46, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x0d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x53, - 0x20, 0x3d, 0x20, 0x46, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x44, 0x20, 0x3d, - 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, - 0x20, 0x6b, 0x53, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6b, 0x44, 0x20, 0x2a, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, - 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x63, 0x3b, 0x0d, - 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, - 0x2f, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x62, 0x79, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x20, 0x3d, 0x20, 0x6d, 0x61, - 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, 0x4c, 0x29, 0x2c, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x6b, - 0x44, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x20, 0x2f, - 0x20, 0x50, 0x49, 0x20, 0x2b, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, - 0x61, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, - 0x63, 0x65, 0x20, 0x2a, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x3b, 0x2f, - 0x2f, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x77, 0x65, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x42, 0x52, 0x44, 0x46, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x46, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x20, 0x28, 0x6b, - 0x53, 0x29, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x77, 0x6f, 0x6e, - 0x27, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, - 0x62, 0x79, 0x20, 0x6b, 0x53, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x2f, 0x2f, 0x2f, 0x20, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, - 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, - 0x77, 0x65, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x75, 0x73, 0x65, 0x20, 0x49, - 0x42, 0x4c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6d, - 0x62, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x29, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x46, 0x20, - 0x3d, 0x20, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x53, 0x63, 0x68, - 0x6c, 0x69, 0x63, 0x6b, 0x52, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, - 0x73, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, - 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x46, - 0x30, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, - 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, - 0x63, 0x33, 0x20, 0x6b, 0x53, 0x20, 0x3d, 0x20, 0x46, 0x3b, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x44, 0x20, - 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6b, 0x53, 0x3b, 0x0d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x44, 0x20, 0x2a, 0x3d, 0x20, 0x31, + 0x20, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x2f, 0x20, + 0x53, 0x70, 0x6f, 0x74, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x4c, + 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, + 0x2d, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x3b, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x70, 0x73, 0x69, 0x6c, + 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x41, 0x6e, + 0x67, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x5b, 0x69, 0x5d, 0x2e, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x67, + 0x6c, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, + 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x74, 0x68, 0x65, 0x74, 0x61, 0x20, + 0x2d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, + 0x4f, 0x75, 0x74, 0x65, 0x72, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x20, + 0x2f, 0x20, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x2c, 0x20, 0x30, + 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x20, 0x20, 0x20, + 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x74, 0x79, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6f, 0x6b, + 0x2d, 0x54, 0x6f, 0x72, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x42, 0x52, + 0x44, 0x46, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x65, 0x63, 0x33, 0x20, 0x48, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x56, 0x20, 0x2b, 0x20, 0x4c, + 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4e, 0x44, 0x46, 0x20, 0x3d, 0x20, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x47, 0x58, 0x28, 0x4e, 0x2c, 0x20, 0x48, 0x2c, 0x20, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x47, 0x20, 0x3d, 0x20, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x6d, 0x69, 0x74, 0x68, 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x2c, + 0x20, 0x4c, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, 0x65, 0x73, + 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x46, 0x20, 0x3d, 0x20, 0x66, 0x72, + 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x6c, 0x69, 0x63, 0x6b, + 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x48, 0x2c, 0x20, + 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x46, 0x30, + 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x4e, 0x44, 0x46, 0x20, 0x2a, + 0x20, 0x47, 0x20, 0x2a, 0x20, 0x46, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, + 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x34, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, + 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, + 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, + 0x2c, 0x20, 0x4c, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x2b, + 0x20, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x30, + 0x2e, 0x30, 0x30, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x2f, 0x20, 0x64, 0x65, 0x6e, + 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, + 0x6b, 0x53, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, + 0x74, 0x6f, 0x20, 0x46, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, + 0x20, 0x6b, 0x53, 0x20, 0x3d, 0x20, 0x46, 0x3b, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, + 0x44, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, + 0x29, 0x20, 0x2d, 0x20, 0x6b, 0x53, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x44, 0x20, 0x2a, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x69, - 0x63, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, - 0x63, 0x33, 0x20, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x3d, - 0x20, 0x28, 0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x29, 0x20, 0x2a, 0x20, - 0x61, 0x6f, 0x20, 0x2a, 0x20, 0x73, 0x73, 0x61, 0x6f, 0x20, 0x2a, 0x20, - 0x75, 0x5f, 0x41, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x72, - 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x6d, - 0x62, 0x69, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x2b, 0x20, 0x4c, 0x6f, 0x3b, - 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x43, 0x53, 0x4d, 0x20, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x73, 0x2e, 0x2e, 0x0d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x2f, 0x2a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x65, 0x70, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, - 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x20, 0x2d, 0x20, 0x75, - 0x5f, 0x45, 0x79, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, - 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x47, 0x65, - 0x74, 0x43, 0x53, 0x4d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x64, 0x65, - 0x70, 0x74, 0x68, 0x2c, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, - 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x20, 0x3d, 0x3d, - 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x3d, 0x20, 0x76, 0x65, - 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, - 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x20, - 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x3d, 0x20, - 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, - 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, - 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, - 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, - 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, - 0x61, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x0d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x20, 0x2a, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, - 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, - 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0d, 0x0a, 0x0d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, - 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x7d + 0x63, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x62, 0x79, 0x20, 0x4e, 0x64, 0x6f, 0x74, + 0x4c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4e, 0x64, 0x6f, 0x74, 0x4c, 0x20, 0x3d, + 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x4e, 0x2c, 0x20, + 0x4c, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x20, 0x2b, 0x3d, + 0x20, 0x28, 0x6b, 0x44, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x62, 0x65, 0x64, + 0x6f, 0x20, 0x2f, 0x20, 0x50, 0x49, 0x20, 0x2b, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x72, 0x61, 0x64, + 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x4e, 0x64, 0x6f, 0x74, + 0x4c, 0x3b, 0x2f, 0x2f, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x52, 0x44, 0x46, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, + 0x20, 0x28, 0x6b, 0x53, 0x29, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, + 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x79, 0x20, 0x62, 0x79, 0x20, 0x6b, 0x53, 0x20, 0x61, 0x67, 0x61, + 0x69, 0x6e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x2f, 0x20, 0x61, 0x6d, 0x62, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x28, 0x77, 0x65, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x75, 0x73, + 0x65, 0x20, 0x49, 0x42, 0x4c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x72, + 0x6d, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, + 0x20, 0x46, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x6c, + 0x53, 0x63, 0x68, 0x6c, 0x69, 0x63, 0x6b, 0x52, 0x6f, 0x75, 0x67, 0x68, + 0x6e, 0x65, 0x73, 0x73, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x6f, 0x74, + 0x28, 0x4e, 0x2c, 0x20, 0x56, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, + 0x2c, 0x20, 0x46, 0x30, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6e, + 0x65, 0x73, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6b, 0x53, 0x20, 0x3d, 0x20, 0x46, + 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, + 0x6b, 0x44, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6b, + 0x53, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x44, 0x20, 0x2a, + 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x6c, 0x69, 0x63, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x29, + 0x20, 0x2a, 0x20, 0x61, 0x6f, 0x20, 0x2a, 0x20, 0x73, 0x73, 0x61, 0x6f, + 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x41, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x65, 0x72, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x65, 0x63, 0x33, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, + 0x28, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x2b, 0x20, + 0x4c, 0x6f, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, + 0x2f, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x43, 0x53, + 0x4d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x73, 0x2e, 0x2e, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x28, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x73, 0x20, + 0x2d, 0x20, 0x75, 0x5f, 0x45, 0x79, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x47, 0x65, 0x74, 0x43, 0x53, 0x4d, 0x44, 0x65, 0x70, 0x74, 0x68, + 0x28, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x20, 0x4c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x3d, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, + 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, 0x63, 0x61, + 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, + 0x2a, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, 0x30, 0x2c, + 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x73, + 0x63, 0x61, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x20, 0x2a, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, 0x30, 0x2e, + 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, + 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, + 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x20, 0x2a, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x33, 0x28, + 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, + 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0d, + 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, + 0x0d, 0x0a, 0x7d }; - unsigned int Resources_Shaders_deferred_shader_len = 10656; + unsigned int Resources_Shaders_deferred_shader_len = 10599; // Data for file: Resources_Shaders_depth_aware_blur_shader_path const std::string Resources_Shaders_depth_aware_blur_shader_path = R"(Resources/Shaders/depth_aware_blur.shader)"; diff --git a/Nuake/src/Scene/Components/LightComponent.h b/Nuake/src/Scene/Components/LightComponent.h index a5e5f79d..876894a2 100644 --- a/Nuake/src/Scene/Components/LightComponent.h +++ b/Nuake/src/Scene/Components/LightComponent.h @@ -128,7 +128,7 @@ namespace Nuake glm::vec3 minExtents = -maxExtents; // Calculate the view and projection matrix - glm::vec3 lightDir = -this->Direction; + glm::vec3 lightDir = this->Direction; glm::mat4 lightViewMatrix = glm::lookAt(frustumCenter - lightDir * -minExtents.z, frustumCenter, glm::vec3(0.0f, 0.0f, 1.0f)); glm::mat4 lightProjectionMatrix = glm::ortho(minExtents.x, maxExtents.x, minExtents.y, maxExtents.y, 0.0f + mCascadeNearPlaneOffset, maxExtents.z - minExtents.z + mCascadeFarPlaneOffset); diff --git a/Resources/Shaders/deferred.shader b/Resources/Shaders/deferred.shader index 24f48672..5905efe3 100644 --- a/Resources/Shaders/deferred.shader +++ b/Resources/Shaders/deferred.shader @@ -276,12 +276,9 @@ void main() if (true) { - vec3 L = normalize(u_DirectionalLight.Direction); + vec3 L = normalize(-u_DirectionalLight.Direction); float attenuation = 1.0f; - - L = normalize(u_DirectionalLight.Direction); - if(u_DirectionalLight.Shadow > 0.1f) { shadow += ShadowCalculation(worldPos, N);