From b45554afaafe4ff65237230f9f677833fc938ed9 Mon Sep 17 00:00:00 2001 From: Katajisto Date: Sun, 25 Oct 2026 00:55:00 +0300 Subject: [PATCH] work --- first.jai | 2 +- modules/stb_vorbis/bindings.jai | 2 + modules/stb_vorbis/generate.jai | 2 + modules/stb_vorbis/wasm/stb_vorbis.a | Bin 0 -> 70868 bytes settings.cfg | 4 +- src/audio/mixer.jai | 11 + src/renderer_sokol/gpu.jai | 18 + src/renderer_sokol/shaders/jai/shaders.jai | 908 +++++++++++---------- src/renderer_sokol/shaders/trile.glsl | 15 +- src/renderer_sokol/triles.jai | 147 +++- src/rendering/scene.jai | 118 ++- 11 files changed, 746 insertions(+), 481 deletions(-) create mode 100644 modules/stb_vorbis/wasm/stb_vorbis.a diff --git a/first.jai b/first.jai index 38d1e6d..cb51c8a 100644 --- a/first.jai +++ b/first.jai @@ -228,7 +228,7 @@ wasm_build :: (opts: Build_Options, trueno_opts: Trueno_Build_Options) { "emcc", "src/platform_specific/main.c", "dist/main.o", "modules/sokol-jai/sokol/gfx/sokol_gfx_wasm_gl_release.a", "modules/sokol-jai/sokol/log/sokol_log_wasm_gl_release.a", "modules/sokol-jai/sokol/audio/sokol_audio_wasm_gl_release.a", "modules/sokol-jai/sokol/time/sokol_time_wasm_gl_release.a", "modules/sokol-jai/sokol/app/sokol_app_wasm_gl_release.a", "modules/sokol-jai/sokol/glue/sokol_glue_wasm_gl_release.a", "modules/sokol-jai/sokol/fetch/sokol_fetch_wasm_gl_release.a", "modules/Fontstash/wasm/fontstash.a", "modules/sokol-jai/sokol/stbi/stb_image.a", - "modules/sokol-jai/sokol/stbv/stb_vorbis.a", + "modules/stb_vorbis/wasm/stb_vorbis.a", "-o", "dist/index.html", "-sSTACK_SIZE=10MB", "-sALLOW_MEMORY_GROWTH", diff --git a/modules/stb_vorbis/bindings.jai b/modules/stb_vorbis/bindings.jai index 4c64a55..bd1dcb2 100644 --- a/modules/stb_vorbis/bindings.jai +++ b/modules/stb_vorbis/bindings.jai @@ -265,6 +265,8 @@ STBVorbisError :: enum u32 { } else #if CPU == .ARM64 { lib_stb_vorbis :: #library "switch2/stb_vorbis"; } +} else #if OS == .WASM { + lib_stb_vorbis :: #library,no_dll "wasm/stb_vorbis"; } else { #assert false; } diff --git a/modules/stb_vorbis/generate.jai b/modules/stb_vorbis/generate.jai index 3557070..0a6c2f4 100644 --- a/modules/stb_vorbis/generate.jai +++ b/modules/stb_vorbis/generate.jai @@ -149,6 +149,8 @@ FOOTER_TEMPLATE :: #string END } else #if CPU == .ARM64 { %2 :: #library "switch2/%1"; } +} else #if OS == .WASM { + %2 :: #library,no_dll "wasm/%1"; } else { #assert false; } diff --git a/modules/stb_vorbis/wasm/stb_vorbis.a b/modules/stb_vorbis/wasm/stb_vorbis.a new file mode 100644 index 0000000000000000000000000000000000000000..a6e01a3df3f33b6f444af5d0083e345861f4fa2e GIT binary patch literal 70868 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 E2hMVbaR2}S literal 0 HcmV?d00001 diff --git a/settings.cfg b/settings.cfg index a66236c..47c64bb 100644 --- a/settings.cfg +++ b/settings.cfg @@ -1,4 +1,4 @@ -master_volume 0.205032 +master_volume 0.05216 music_volume 1 sfx_volume 1 -fullscreen 0 +fullscreen 1 diff --git a/src/audio/mixer.jai b/src/audio/mixer.jai index 68e3dd4..a28befc 100644 --- a/src/audio/mixer.jai +++ b/src/audio/mixer.jai @@ -92,6 +92,17 @@ mixer_queue_next :: (current_audio: *Audio_Data, next_task: Mixer_Play_Task) { array_add(*g_mixer.tasks, next_task); } +mixer_stop :: (audio: *Audio_Data) { + mixer_lock(*g_mixer); + defer mixer_unlock(*g_mixer); + for g_mixer.tasks { + if it.audio != audio continue; + if it.queued_next then free(it.queued_next); + free(it.audio_state); + remove it; + } +} + mixer_get_samples :: (buffer: *float, frame_count: s32, channel_count: s32) { mixer_lock(*g_mixer); defer mixer_unlock(*g_mixer); diff --git a/src/renderer_sokol/gpu.jai b/src/renderer_sokol/gpu.jai index 7428431..32f8077 100644 --- a/src/renderer_sokol/gpu.jai +++ b/src/renderer_sokol/gpu.jai @@ -90,6 +90,7 @@ Pass :: struct { kind : Pass_Kind; params : View_Params; shadow : Shadow_Params; + frustum : [6]Vector4; } make_pass :: (scene: *Scene, view_index: int, kind: Pass_Kind) -> Pass { @@ -110,6 +111,7 @@ make_pass :: (scene: *Scene, view_index: int, kind: Pass_Kind) -> Pass { camera = pass.view.camera.target + env.sun_direction * 1000; view_proj = scene.shadow_view_proj[view_index]; } + pass.frustum = frustum_planes(view_proj); _, inv_view_proj := inverse(view_proj); pass.params.view_proj = view_proj.floats; pass.params.inv_view_proj = inv_view_proj.floats; @@ -131,6 +133,22 @@ make_pass :: (scene: *Scene, view_index: int, kind: Pass_Kind) -> Pass { return pass; } +frustum_planes :: (m: Matrix4) -> [6]Vector4 { + column :: (m: Matrix4, j: int) -> Vector4 { return .{m.coef[0][j], m.coef[1][j], m.coef[2][j], m.coef[3][j]}; } + x, y, z, w := column(m, 0), column(m, 1), column(m, 2), column(m, 3); + return .[w + x, w - x, w + y, w - y, w + z, w - z]; +} + +box_in_frustum :: (planes: [6]Vector4, lo: Vector3, hi: Vector3) -> bool { + for planes { + x := ifx it.x > 0 then hi.x else lo.x; + y := ifx it.y > 0 then hi.y else lo.y; + z := ifx it.z > 0 then hi.z else lo.z; + if it.x * x + it.y * y + it.z * z + it.w < 0 return false; + } + return true; +} + apply_uniforms :: (slot: s32, params: *$T) { sg_apply_uniforms(slot, *(sg_range.{ params, size_of(T) })); } diff --git a/src/renderer_sokol/shaders/jai/shaders.jai b/src/renderer_sokol/shaders/jai/shaders.jai index 3299d33..7fbfe28 100644 --- a/src/renderer_sokol/shaders/jai/shaders.jai +++ b/src/renderer_sokol/shaders/jai/shaders.jai @@ -1561,8 +1561,8 @@ vs_trile_source_glsl430 := u8.[ layout(location = 5) in float v_facing; layout(location = 2) in vec3 v_world; layout(location = 3) in vec3 v_normal; - layout(location = 6) in float v_ao; layout(location = 7) in vec3 v_shade; + layout(location = 6) in float v_ao; layout(location = 8) in vec3 v_sun; layout(location = 1) in vec3 v_to_camera; layout(location = 0) out vec4 frag_color; @@ -1745,74 +1745,77 @@ vs_trile_source_glsl430 := u8.[ vec3 param_2 = v_normal; vec3 _590 = sun_shadow(param_1, param_2); vec3 _591 = _590 * v_facing; - vec4 _605; + vec4 _598; if (trile_fs_params[1].w > 0.5) { vec3 param_3 = v_world; vec3 param_4 = v_normal; - _605 = probe_light(param_3, param_4); + _598 = probe_light(param_3, param_4); } else { - _605 = vec4(0.0); + _598 = vec4(0.0); } - vec3 color = albedo * mix((v_shade + _605.xyz) * mix(0.60000002384185791015625, 1.0, v_ao), v_sun, _591 * mix(0.25, 1.0, v_ao)); + vec3 _623 = v_sun * _591; + vec3 _627 = _623 * mix(0.25, 1.0, v_ao); + vec3 color = albedo * (((v_shade + _598.xyz) * mix(0.60000002384185791015625, 1.0, v_ao)) + _627); vec3 param_5 = _591; - float _638 = brightest(param_5); - if (_638 > 0.001000000047497451305389404296875) + float _637 = brightest(param_5); + if (_637 > 0.001000000047497451305389404296875) { - color = mix(color, _591 * v_sun, vec3(min(1.0, ((_638 - min(_591.x, min(_591.y, _591.z))) / _638) * 2.0))); + color += ((_627 * (vec3(1.0) - albedo)) * ((_637 - min(_591.x, min(_591.y, _591.z))) / _637)); } - float _668 = _548.w; - float glow = _668 * 8.0; - float _671 = _556.z; - if (_671 > 0.0) + float _667 = _548.w; + vec3 param_6 = _627; + float glow = (_667 * 8.0) + (brightest(param_6) * 1.5); + float _675 = _556.z; + if (_675 > 0.0) { - float _696 = pow(max(dot(v_normal, normalize(normalize(v_to_camera) + trile_fs_params[0].xyz)), 0.0), mix(4.0, 96.0, _671)) * _671; - color += ((v_sun * _591) * _696); - vec3 param_6 = _591; - glow += ((_696 * brightest(param_6)) * 4.0); + float _700 = pow(max(dot(v_normal, normalize(normalize(v_to_camera) + trile_fs_params[0].xyz)), 0.0), mix(4.0, 96.0, _675)) * _675; + color += (_623 * _700); + vec3 param_7 = _591; + glow += ((_700 * brightest(param_7)) * 4.0); } - bool _714 = trile_fs_params[3].x > 0.5; - bool _720; - if (_714) + bool _718 = trile_fs_params[3].x > 0.5; + bool _724; + if (_718) { - _720 = _556.y > 0.0; + _724 = _556.y > 0.0; } else { - _720 = _714; + _724 = _718; } - bool _726; - if (_720) + bool _730; + if (_724) { - _726 = v_normal.y > 0.5; + _730 = v_normal.y > 0.5; } else { - _726 = _720; + _730 = _724; } - bool _736; - if (_726) + bool _740; + if (_730) { - _736 = abs(v_world.y - trile_fs_params[3].y) < 0.0199999995529651641845703125; + _740 = abs(v_world.y - trile_fs_params[3].y) < 0.0199999995529651641845703125; } else { - _736 = _726; + _740 = _730; } - if (_736) + if (_740) { - vec2 _750 = gl_FragCoord.xy / vec2(textureSize(trile_reflection_trile_reflection_smp, 0)); - vec2 _757 = vec2(_750.x, 1.0 - _750.y); - float _766 = _556.y; - color = mix(color, texture(trile_reflection_trile_reflection_smp, _757).xyz, vec3(_766)); - glow = max(glow, texture(trile_reflection_glow_trile_reflection_smp, _757).x * pow(_766, 0.4000000059604644775390625)); + vec2 _754 = gl_FragCoord.xy / vec2(textureSize(trile_reflection_trile_reflection_smp, 0)); + vec2 _761 = vec2(_754.x, 1.0 - _754.y); + float _770 = _556.y; + color = mix(color, texture(trile_reflection_trile_reflection_smp, _761).xyz, vec3(_770)); + glow = max(glow, texture(trile_reflection_glow_trile_reflection_smp, _761).x * pow(_770, 0.4000000059604644775390625)); } - frag_color = vec4(mix(color, albedo, vec3(_668)), 1.0); - vec3 param_7 = v_to_camera; - float param_8 = glow; - write_scene(param_7, param_8); + frag_color = vec4(mix(color, albedo, vec3(_667)), 1.0); + vec3 param_8 = v_to_camera; + float param_9 = glow; + write_scene(param_8, param_9); } */ @@ -1882,11 +1885,11 @@ fs_trile_source_glsl430 := u8.[ 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f, 0x6e,0x20,0x3d,0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20,0x76, 0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28, - 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x36,0x29,0x20,0x69,0x6e, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x76,0x5f,0x61,0x6f,0x3b,0x0a,0x6c,0x61,0x79, - 0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x37, - 0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x73,0x68,0x61,0x64, - 0x65,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, + 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x37,0x29,0x20,0x69,0x6e, + 0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x73,0x68,0x61,0x64,0x65,0x3b,0x0a,0x6c, + 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d, + 0x20,0x36,0x29,0x20,0x69,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x76,0x5f,0x61, + 0x6f,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, 0x6f,0x6e,0x20,0x3d,0x20,0x38,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20, 0x76,0x5f,0x73,0x75,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f, 0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76, @@ -2191,132 +2194,137 @@ fs_trile_source_glsl430 := u8.[ 0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, 0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x35,0x39, 0x31,0x20,0x3d,0x20,0x5f,0x35,0x39,0x30,0x20,0x2a,0x20,0x76,0x5f,0x66,0x61,0x63, - 0x69,0x6e,0x67,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x36, - 0x30,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x72,0x69,0x6c, + 0x69,0x6e,0x67,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x35, + 0x39,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x72,0x69,0x6c, 0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2e,0x77, 0x20,0x3e,0x20,0x30,0x2e,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d, 0x5f,0x33,0x20,0x3d,0x20,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d, 0x5f,0x34,0x20,0x3d,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d,0x20,0x70,0x72, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d,0x20,0x70,0x72, 0x6f,0x62,0x65,0x5f,0x6c,0x69,0x67,0x68,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f, 0x33,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x29,0x3b,0x0a,0x20,0x20,0x20, 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d, 0x20,0x76,0x65,0x63,0x34,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x6f,0x6c,0x6f,0x72, - 0x20,0x3d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28, - 0x28,0x76,0x5f,0x73,0x68,0x61,0x64,0x65,0x20,0x2b,0x20,0x5f,0x36,0x30,0x35,0x2e, - 0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x36,0x30,0x30, - 0x30,0x30,0x30,0x30,0x32,0x33,0x38,0x34,0x31,0x38,0x35,0x37,0x39,0x31,0x30,0x31, - 0x35,0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x76,0x5f,0x61,0x6f,0x29, - 0x2c,0x20,0x76,0x5f,0x73,0x75,0x6e,0x2c,0x20,0x5f,0x35,0x39,0x31,0x20,0x2a,0x20, - 0x6d,0x69,0x78,0x28,0x30,0x2e,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x76, - 0x5f,0x61,0x6f,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x33,0x38,0x20,0x3d, - 0x20,0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d, - 0x5f,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x33, - 0x38,0x20,0x3e,0x20,0x30,0x2e,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x34,0x37,0x34,0x39,0x37,0x34,0x35,0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34,0x30, - 0x34,0x32,0x39,0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d, - 0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x5f,0x35,0x39,0x31,0x20,0x2a, - 0x20,0x76,0x5f,0x73,0x75,0x6e,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x6d,0x69,0x6e, - 0x28,0x31,0x2e,0x30,0x2c,0x20,0x28,0x28,0x5f,0x36,0x33,0x38,0x20,0x2d,0x20,0x6d, - 0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x78,0x2c,0x20,0x6d,0x69,0x6e,0x28,0x5f, - 0x35,0x39,0x31,0x2e,0x79,0x2c,0x20,0x5f,0x35,0x39,0x31,0x2e,0x7a,0x29,0x29,0x29, - 0x20,0x2f,0x20,0x5f,0x36,0x33,0x38,0x29,0x20,0x2a,0x20,0x32,0x2e,0x30,0x29,0x29, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x36,0x32,0x33,0x20, + 0x3d,0x20,0x76,0x5f,0x73,0x75,0x6e,0x20,0x2a,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x36,0x32,0x37,0x20,0x3d,0x20, + 0x5f,0x36,0x32,0x33,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x32,0x35,0x2c, + 0x20,0x31,0x2e,0x30,0x2c,0x20,0x76,0x5f,0x61,0x6f,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x61,0x6c, + 0x62,0x65,0x64,0x6f,0x20,0x2a,0x20,0x28,0x28,0x28,0x76,0x5f,0x73,0x68,0x61,0x64, + 0x65,0x20,0x2b,0x20,0x5f,0x35,0x39,0x38,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20, + 0x6d,0x69,0x78,0x28,0x30,0x2e,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x33,0x38, + 0x34,0x31,0x38,0x35,0x37,0x39,0x31,0x30,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x31, + 0x2e,0x30,0x2c,0x20,0x76,0x5f,0x61,0x6f,0x29,0x29,0x20,0x2b,0x20,0x5f,0x36,0x32, + 0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x33,0x37,0x20,0x3d,0x20,0x62,0x72, + 0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x33,0x37,0x20,0x3e, + 0x20,0x30,0x2e,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x37,0x34, + 0x39,0x37,0x34,0x35,0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34,0x30,0x34,0x32,0x39, + 0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x28,0x5f, + 0x36,0x32,0x37,0x20,0x2a,0x20,0x28,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x29, + 0x20,0x2d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x29,0x29,0x20,0x2a,0x20,0x28,0x28, + 0x5f,0x36,0x33,0x37,0x20,0x2d,0x20,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e, + 0x78,0x2c,0x20,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x79,0x2c,0x20,0x5f, + 0x35,0x39,0x31,0x2e,0x7a,0x29,0x29,0x29,0x20,0x2f,0x20,0x5f,0x36,0x33,0x37,0x29, 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x36,0x36,0x38,0x20,0x3d,0x20,0x5f,0x35,0x34,0x38,0x2e,0x77, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x6c,0x6f,0x77, - 0x20,0x3d,0x20,0x5f,0x36,0x36,0x38,0x20,0x2a,0x20,0x38,0x2e,0x30,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x37,0x31,0x20,0x3d,0x20, - 0x5f,0x35,0x35,0x36,0x2e,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, - 0x5f,0x36,0x37,0x31,0x20,0x3e,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x36,0x39,0x36,0x20,0x3d,0x20,0x70,0x6f,0x77,0x28,0x6d,0x61,0x78,0x28,0x64, - 0x6f,0x74,0x28,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65, - 0x28,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x29,0x20,0x2b,0x20, - 0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x30,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20, - 0x6d,0x69,0x78,0x28,0x34,0x2e,0x30,0x2c,0x20,0x39,0x36,0x2e,0x30,0x2c,0x20,0x5f, - 0x36,0x37,0x31,0x29,0x29,0x20,0x2a,0x20,0x5f,0x36,0x37,0x31,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28, - 0x28,0x76,0x5f,0x73,0x75,0x6e,0x20,0x2a,0x20,0x5f,0x35,0x39,0x31,0x29,0x20,0x2a, - 0x20,0x5f,0x36,0x39,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f, - 0x35,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f, - 0x77,0x20,0x2b,0x3d,0x20,0x28,0x28,0x5f,0x36,0x39,0x36,0x20,0x2a,0x20,0x62,0x72, - 0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29, - 0x29,0x20,0x2a,0x20,0x34,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x31,0x34,0x20,0x3d,0x20, - 0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x33,0x5d,0x2e,0x78,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69, - 0x66,0x20,0x28,0x5f,0x37,0x31,0x34,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20,0x5f,0x35, - 0x35,0x36,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20, - 0x5f,0x37,0x31,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, - 0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69, - 0x66,0x20,0x28,0x5f,0x37,0x32,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x36,0x20,0x3d,0x20,0x76,0x5f, - 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32, - 0x36,0x20,0x3d,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x33,0x36,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x32,0x36,0x29,0x0a,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x20, - 0x3d,0x20,0x61,0x62,0x73,0x28,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x2e,0x79,0x20, - 0x2d,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, - 0x73,0x5b,0x33,0x5d,0x2e,0x79,0x29,0x20,0x3c,0x20,0x30,0x2e,0x30,0x31,0x39,0x39, - 0x39,0x39,0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34,0x31,0x38, - 0x34,0x35,0x37,0x30,0x33,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x20,0x3d,0x20,0x5f,0x37, - 0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x69,0x66, - 0x20,0x28,0x5f,0x37,0x33,0x36,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x35,0x30,0x20, - 0x3d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78, - 0x79,0x20,0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65, - 0x53,0x69,0x7a,0x65,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65, - 0x63,0x74,0x69,0x6f,0x6e,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c, - 0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37, - 0x35,0x37,0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x5f,0x37,0x35,0x30,0x2e,0x78, - 0x2c,0x20,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x37,0x35,0x30,0x2e,0x79,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x37,0x36,0x36,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69, - 0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65, - 0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f, - 0x6e,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69, - 0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x35,0x37,0x29,0x2e,0x78,0x79, - 0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x37,0x36,0x36,0x29,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x6d, - 0x61,0x78,0x28,0x67,0x6c,0x6f,0x77,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65, - 0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f, - 0x6e,0x5f,0x67,0x6c,0x6f,0x77,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66, - 0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x35, - 0x37,0x29,0x2e,0x78,0x20,0x2a,0x20,0x70,0x6f,0x77,0x28,0x5f,0x37,0x36,0x36,0x2c, - 0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34, - 0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x29,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, - 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28, - 0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x2c,0x20,0x76, - 0x65,0x63,0x33,0x28,0x5f,0x36,0x36,0x38,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29, + 0x61,0x74,0x20,0x5f,0x36,0x36,0x37,0x20,0x3d,0x20,0x5f,0x35,0x34,0x38,0x2e,0x77, 0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d, - 0x5f,0x37,0x20,0x3d,0x20,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x38,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x77,0x72,0x69,0x74,0x65,0x5f,0x73,0x63,0x65,0x6e,0x65,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x37,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x3b,0x0a,0x7d, - 0x0a,0x0a,0x00, + 0x5f,0x36,0x20,0x3d,0x20,0x5f,0x36,0x32,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x28,0x5f,0x36,0x36, + 0x37,0x20,0x2a,0x20,0x38,0x2e,0x30,0x29,0x20,0x2b,0x20,0x28,0x62,0x72,0x69,0x67, + 0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x20,0x2a, + 0x20,0x31,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x5f,0x36,0x37,0x35,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x7a,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x37,0x35,0x20,0x3e,0x20,0x30, + 0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x30,0x30,0x20,0x3d,0x20,0x70, + 0x6f,0x77,0x28,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x76,0x5f,0x6e,0x6f,0x72, + 0x6d,0x61,0x6c,0x2c,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61, + 0x6d,0x65,0x72,0x61,0x29,0x20,0x2b,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73, + 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x29, + 0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x6d,0x69,0x78,0x28,0x34,0x2e,0x30,0x2c, + 0x20,0x39,0x36,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x37,0x35,0x29,0x29,0x20,0x2a,0x20, + 0x5f,0x36,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f, + 0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x5f,0x36,0x32,0x33,0x20,0x2a,0x20,0x5f, + 0x37,0x30,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65, + 0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x35,0x39, + 0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20, + 0x2b,0x3d,0x20,0x28,0x28,0x5f,0x37,0x30,0x30,0x20,0x2a,0x20,0x62,0x72,0x69,0x67, + 0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x29,0x29,0x20, + 0x2a,0x20,0x34,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x31,0x38,0x20,0x3d,0x20,0x74,0x72, + 0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d, + 0x2e,0x78,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, + 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x37,0x31,0x38,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x34,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, + 0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, + 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x34,0x20,0x3d,0x20,0x5f,0x37, + 0x31,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, + 0x6f,0x6c,0x20,0x5f,0x37,0x33,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x37,0x32,0x34,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x30,0x20,0x3d,0x20,0x76,0x5f,0x6e,0x6f, + 0x72,0x6d,0x61,0x6c,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20, + 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x30,0x20, + 0x3d,0x20,0x5f,0x37,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x34,0x30,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x33,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20, + 0x61,0x62,0x73,0x28,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x2e,0x79,0x20,0x2d,0x20, + 0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, + 0x33,0x5d,0x2e,0x79,0x29,0x20,0x3c,0x20,0x30,0x2e,0x30,0x31,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34,0x31,0x38,0x34,0x35, + 0x37,0x30,0x33,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20,0x5f,0x37,0x33,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, + 0x5f,0x37,0x34,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x35,0x34,0x20,0x3d,0x20, + 0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x79,0x20, + 0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x53,0x69, + 0x7a,0x65,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74, + 0x69,0x6f,0x6e,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63, + 0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x30,0x29,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x36,0x31, + 0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x5f,0x37,0x35,0x34,0x2e,0x78,0x2c,0x20, + 0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x37,0x35,0x34,0x2e,0x79,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x37, + 0x30,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28, + 0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74, + 0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f, + 0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e, + 0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36,0x31,0x29,0x2e,0x78,0x79,0x7a,0x2c, + 0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x37,0x37,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x6d,0x61,0x78, + 0x28,0x67,0x6c,0x6f,0x77,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x74, + 0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f, + 0x67,0x6c,0x6f,0x77,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65, + 0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36,0x31,0x29, + 0x2e,0x78,0x20,0x2a,0x20,0x70,0x6f,0x77,0x28,0x5f,0x37,0x37,0x30,0x2c,0x20,0x30, + 0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34, + 0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28,0x63,0x6f, + 0x6c,0x6f,0x72,0x2c,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x2c,0x20,0x76,0x65,0x63, + 0x33,0x28,0x5f,0x36,0x36,0x37,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38, + 0x20,0x3d,0x20,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x39,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x77,0x72, + 0x69,0x74,0x65,0x5f,0x73,0x63,0x65,0x6e,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x38,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x3b,0x0a,0x7d,0x0a,0x0a, + 0x00, ]; /* #version 430 @@ -5061,8 +5069,8 @@ vs_trile_source_glsl300es := u8.[ in highp float v_facing; in highp vec3 v_world; in highp vec3 v_normal; - in highp float v_ao; in highp vec3 v_shade; + in highp float v_ao; in highp vec3 v_sun; in highp vec3 v_to_camera; layout(location = 0) out highp vec4 frag_color; @@ -5245,74 +5253,77 @@ vs_trile_source_glsl300es := u8.[ highp vec3 param_2 = v_normal; highp vec3 _590 = sun_shadow(param_1, param_2); highp vec3 _591 = _590 * v_facing; - highp vec4 _605; + highp vec4 _598; if (trile_fs_params[1].w > 0.5) { highp vec3 param_3 = v_world; highp vec3 param_4 = v_normal; - _605 = probe_light(param_3, param_4); + _598 = probe_light(param_3, param_4); } else { - _605 = vec4(0.0); + _598 = vec4(0.0); } - highp vec3 color = albedo * mix((v_shade + _605.xyz) * mix(0.60000002384185791015625, 1.0, v_ao), v_sun, _591 * mix(0.25, 1.0, v_ao)); + highp vec3 _623 = v_sun * _591; + highp vec3 _627 = _623 * mix(0.25, 1.0, v_ao); + highp vec3 color = albedo * (((v_shade + _598.xyz) * mix(0.60000002384185791015625, 1.0, v_ao)) + _627); highp vec3 param_5 = _591; - highp float _638 = brightest(param_5); - if (_638 > 0.001000000047497451305389404296875) + highp float _637 = brightest(param_5); + if (_637 > 0.001000000047497451305389404296875) { - color = mix(color, _591 * v_sun, vec3(min(1.0, ((_638 - min(_591.x, min(_591.y, _591.z))) / _638) * 2.0))); + color += ((_627 * (vec3(1.0) - albedo)) * ((_637 - min(_591.x, min(_591.y, _591.z))) / _637)); } - highp float _668 = _548.w; - highp float glow = _668 * 8.0; - highp float _671 = _556.z; - if (_671 > 0.0) + highp float _667 = _548.w; + highp vec3 param_6 = _627; + highp float glow = (_667 * 8.0) + (brightest(param_6) * 1.5); + highp float _675 = _556.z; + if (_675 > 0.0) { - highp float _696 = pow(max(dot(v_normal, normalize(normalize(v_to_camera) + trile_fs_params[0].xyz)), 0.0), mix(4.0, 96.0, _671)) * _671; - color += ((v_sun * _591) * _696); - highp vec3 param_6 = _591; - glow += ((_696 * brightest(param_6)) * 4.0); + highp float _700 = pow(max(dot(v_normal, normalize(normalize(v_to_camera) + trile_fs_params[0].xyz)), 0.0), mix(4.0, 96.0, _675)) * _675; + color += (_623 * _700); + highp vec3 param_7 = _591; + glow += ((_700 * brightest(param_7)) * 4.0); } - bool _714 = trile_fs_params[3].x > 0.5; - bool _720; - if (_714) + bool _718 = trile_fs_params[3].x > 0.5; + bool _724; + if (_718) { - _720 = _556.y > 0.0; + _724 = _556.y > 0.0; } else { - _720 = _714; + _724 = _718; } - bool _726; - if (_720) + bool _730; + if (_724) { - _726 = v_normal.y > 0.5; + _730 = v_normal.y > 0.5; } else { - _726 = _720; + _730 = _724; } - bool _736; - if (_726) + bool _740; + if (_730) { - _736 = abs(v_world.y - trile_fs_params[3].y) < 0.0199999995529651641845703125; + _740 = abs(v_world.y - trile_fs_params[3].y) < 0.0199999995529651641845703125; } else { - _736 = _726; + _740 = _730; } - if (_736) + if (_740) { - highp vec2 _750 = gl_FragCoord.xy / vec2(textureSize(trile_reflection_trile_reflection_smp, 0)); - highp vec2 _757 = vec2(_750.x, 1.0 - _750.y); - highp float _766 = _556.y; - color = mix(color, texture(trile_reflection_trile_reflection_smp, _757).xyz, vec3(_766)); - glow = max(glow, texture(trile_reflection_glow_trile_reflection_smp, _757).x * pow(_766, 0.4000000059604644775390625)); + highp vec2 _754 = gl_FragCoord.xy / vec2(textureSize(trile_reflection_trile_reflection_smp, 0)); + highp vec2 _761 = vec2(_754.x, 1.0 - _754.y); + highp float _770 = _556.y; + color = mix(color, texture(trile_reflection_trile_reflection_smp, _761).xyz, vec3(_770)); + glow = max(glow, texture(trile_reflection_glow_trile_reflection_smp, _761).x * pow(_770, 0.4000000059604644775390625)); } - frag_color = vec4(mix(color, albedo, vec3(_668)), 1.0); - highp vec3 param_7 = v_to_camera; - highp float param_8 = glow; - write_scene(param_7, param_8); + frag_color = vec4(mix(color, albedo, vec3(_667)), 1.0); + highp vec3 param_8 = v_to_camera; + highp float param_9 = glow; + write_scene(param_8, param_9); } */ @@ -5373,9 +5384,9 @@ fs_trile_source_glsl300es := u8.[ 0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f, 0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20, 0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x69, - 0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x76,0x5f, - 0x61,0x6f,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x33,0x20,0x76,0x5f,0x73,0x68,0x61,0x64,0x65,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69, + 0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x73, + 0x68,0x61,0x64,0x65,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x76,0x5f,0x61,0x6f,0x3b,0x0a,0x69,0x6e,0x20,0x68,0x69, 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x73,0x75,0x6e,0x3b,0x0a, 0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f, 0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75, @@ -5696,7 +5707,7 @@ fs_trile_source_glsl300es := u8.[ 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x35,0x39,0x31,0x20,0x3d,0x20, 0x5f,0x35,0x39,0x30,0x20,0x2a,0x20,0x76,0x5f,0x66,0x61,0x63,0x69,0x6e,0x67,0x3b, 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20, - 0x5f,0x36,0x30,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x72, + 0x5f,0x35,0x39,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x72, 0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d, 0x2e,0x77,0x20,0x3e,0x20,0x30,0x2e,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, @@ -5704,128 +5715,134 @@ fs_trile_source_glsl300es := u8.[ 0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69, 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34, 0x20,0x3d,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d,0x20,0x70,0x72,0x6f,0x62, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d,0x20,0x70,0x72,0x6f,0x62, 0x65,0x5f,0x6c,0x69,0x67,0x68,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x2c, 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d, 0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d,0x20,0x76, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d,0x20,0x76, 0x65,0x63,0x34,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x63, - 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x20,0x2a,0x20, - 0x6d,0x69,0x78,0x28,0x28,0x76,0x5f,0x73,0x68,0x61,0x64,0x65,0x20,0x2b,0x20,0x5f, - 0x36,0x30,0x35,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30, - 0x2e,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x33,0x38,0x34,0x31,0x38,0x35,0x37, - 0x39,0x31,0x30,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x76, - 0x5f,0x61,0x6f,0x29,0x2c,0x20,0x76,0x5f,0x73,0x75,0x6e,0x2c,0x20,0x5f,0x35,0x39, - 0x31,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x32,0x35,0x2c,0x20,0x31,0x2e, - 0x30,0x2c,0x20,0x76,0x5f,0x61,0x6f,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, - 0x35,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x33,0x38,0x20,0x3d, - 0x20,0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d, - 0x5f,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x33, - 0x38,0x20,0x3e,0x20,0x30,0x2e,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x34,0x37,0x34,0x39,0x37,0x34,0x35,0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34,0x30, - 0x34,0x32,0x39,0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d, - 0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x5f,0x35,0x39,0x31,0x20,0x2a, - 0x20,0x76,0x5f,0x73,0x75,0x6e,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x6d,0x69,0x6e, - 0x28,0x31,0x2e,0x30,0x2c,0x20,0x28,0x28,0x5f,0x36,0x33,0x38,0x20,0x2d,0x20,0x6d, - 0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x78,0x2c,0x20,0x6d,0x69,0x6e,0x28,0x5f, - 0x35,0x39,0x31,0x2e,0x79,0x2c,0x20,0x5f,0x35,0x39,0x31,0x2e,0x7a,0x29,0x29,0x29, - 0x20,0x2f,0x20,0x5f,0x36,0x33,0x38,0x29,0x20,0x2a,0x20,0x32,0x2e,0x30,0x29,0x29, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67, - 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x36,0x38,0x20,0x3d,0x20, - 0x5f,0x35,0x34,0x38,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x5f, - 0x36,0x36,0x38,0x20,0x2a,0x20,0x38,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x37,0x31,0x20, - 0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66, - 0x20,0x28,0x5f,0x36,0x37,0x31,0x20,0x3e,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x39,0x36,0x20,0x3d,0x20,0x70, - 0x6f,0x77,0x28,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x76,0x5f,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x2c,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x6e, - 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61, - 0x6d,0x65,0x72,0x61,0x29,0x20,0x2b,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73, - 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x29, - 0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x6d,0x69,0x78,0x28,0x34,0x2e,0x30,0x2c, - 0x20,0x39,0x36,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x37,0x31,0x29,0x29,0x20,0x2a,0x20, - 0x5f,0x36,0x37,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f, - 0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x28,0x76,0x5f,0x73,0x75,0x6e,0x20,0x2a, - 0x20,0x5f,0x35,0x39,0x31,0x29,0x20,0x2a,0x20,0x5f,0x36,0x39,0x36,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f, + 0x36,0x32,0x33,0x20,0x3d,0x20,0x76,0x5f,0x73,0x75,0x6e,0x20,0x2a,0x20,0x5f,0x35, + 0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, + 0x63,0x33,0x20,0x5f,0x36,0x32,0x37,0x20,0x3d,0x20,0x5f,0x36,0x32,0x33,0x20,0x2a, + 0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20, + 0x76,0x5f,0x61,0x6f,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x33,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x61,0x6c, + 0x62,0x65,0x64,0x6f,0x20,0x2a,0x20,0x28,0x28,0x28,0x76,0x5f,0x73,0x68,0x61,0x64, + 0x65,0x20,0x2b,0x20,0x5f,0x35,0x39,0x38,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20, + 0x6d,0x69,0x78,0x28,0x30,0x2e,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x33,0x38, + 0x34,0x31,0x38,0x35,0x37,0x39,0x31,0x30,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x31, + 0x2e,0x30,0x2c,0x20,0x76,0x5f,0x61,0x6f,0x29,0x29,0x20,0x2b,0x20,0x5f,0x36,0x32, + 0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, + 0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x35,0x39, + 0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x36,0x33,0x37,0x20,0x3d,0x20,0x62,0x72,0x69,0x67,0x68,0x74, + 0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x33,0x37,0x20,0x3e,0x20,0x30,0x2e,0x30, + 0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x37,0x34,0x39,0x37,0x34,0x35, + 0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34,0x30,0x34,0x32,0x39,0x36,0x38,0x37,0x35, + 0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x28,0x5f,0x36,0x32,0x37,0x20, + 0x2a,0x20,0x28,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x29,0x20,0x2d,0x20,0x61, + 0x6c,0x62,0x65,0x64,0x6f,0x29,0x29,0x20,0x2a,0x20,0x28,0x28,0x5f,0x36,0x33,0x37, + 0x20,0x2d,0x20,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x78,0x2c,0x20,0x6d, + 0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x79,0x2c,0x20,0x5f,0x35,0x39,0x31,0x2e, + 0x7a,0x29,0x29,0x29,0x20,0x2f,0x20,0x5f,0x36,0x33,0x37,0x29,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x36,0x37,0x20,0x3d,0x20,0x5f,0x35,0x34,0x38, + 0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, + 0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f,0x36,0x32, + 0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x28,0x5f,0x36,0x36,0x37,0x20, + 0x2a,0x20,0x38,0x2e,0x30,0x29,0x20,0x2b,0x20,0x28,0x62,0x72,0x69,0x67,0x68,0x74, + 0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x20,0x2a,0x20,0x31, + 0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x37,0x35,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, + 0x2e,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x37,0x35, + 0x20,0x3e,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x5f,0x37,0x30,0x30,0x20,0x3d,0x20,0x70,0x6f,0x77,0x28,0x6d,0x61,0x78, + 0x28,0x64,0x6f,0x74,0x28,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, + 0x7a,0x65,0x28,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x29,0x20, + 0x2b,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d, + 0x73,0x5b,0x30,0x5d,0x2e,0x78,0x79,0x7a,0x29,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29, + 0x2c,0x20,0x6d,0x69,0x78,0x28,0x34,0x2e,0x30,0x2c,0x20,0x39,0x36,0x2e,0x30,0x2c, + 0x20,0x5f,0x36,0x37,0x35,0x29,0x29,0x20,0x2a,0x20,0x5f,0x36,0x37,0x35,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d, + 0x20,0x28,0x5f,0x36,0x32,0x33,0x20,0x2a,0x20,0x5f,0x37,0x30,0x30,0x29,0x3b,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, - 0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f,0x35,0x39, + 0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x35,0x39, 0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20, - 0x2b,0x3d,0x20,0x28,0x28,0x5f,0x36,0x39,0x36,0x20,0x2a,0x20,0x62,0x72,0x69,0x67, - 0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x29,0x20, + 0x2b,0x3d,0x20,0x28,0x28,0x5f,0x37,0x30,0x30,0x20,0x2a,0x20,0x62,0x72,0x69,0x67, + 0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x29,0x29,0x20, 0x2a,0x20,0x34,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, - 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x31,0x34,0x20,0x3d,0x20,0x74,0x72, + 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x31,0x38,0x20,0x3d,0x20,0x74,0x72, 0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d, 0x2e,0x78,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, - 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, - 0x28,0x5f,0x37,0x31,0x34,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, + 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x37,0x31,0x38,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x34,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, 0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20,0x5f,0x37, - 0x31,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, - 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, - 0x28,0x5f,0x37,0x32,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x36,0x20,0x3d,0x20,0x76,0x5f,0x6e,0x6f, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x34,0x20,0x3d,0x20,0x5f,0x37, + 0x31,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, + 0x6f,0x6c,0x20,0x5f,0x37,0x33,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, + 0x28,0x5f,0x37,0x32,0x34,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x30,0x20,0x3d,0x20,0x76,0x5f,0x6e,0x6f, 0x72,0x6d,0x61,0x6c,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20, 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x36,0x20, - 0x3d,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, - 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x32,0x36,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x20,0x3d,0x20, + 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x30,0x20, + 0x3d,0x20,0x5f,0x37,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x34,0x30,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x33,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20, 0x61,0x62,0x73,0x28,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x2e,0x79,0x20,0x2d,0x20, 0x74,0x72,0x69,0x6c,0x65,0x5f,0x66,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, 0x33,0x5d,0x2e,0x79,0x29,0x20,0x3c,0x20,0x30,0x2e,0x30,0x31,0x39,0x39,0x39,0x39, 0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34,0x31,0x38,0x34,0x35, 0x37,0x30,0x33,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x20,0x3d,0x20,0x5f,0x37,0x32,0x36, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20,0x5f,0x37,0x33,0x30, 0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, - 0x5f,0x37,0x33,0x36,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x5f,0x37,0x34,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f, - 0x37,0x35,0x30,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f, + 0x37,0x35,0x34,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f, 0x72,0x64,0x2e,0x78,0x79,0x20,0x2f,0x20,0x76,0x65,0x63,0x32,0x28,0x74,0x65,0x78, 0x74,0x75,0x72,0x65,0x53,0x69,0x7a,0x65,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72, 0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f, 0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20, 0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67, - 0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x35,0x37,0x20,0x3d,0x20,0x76, - 0x65,0x63,0x32,0x28,0x5f,0x37,0x35,0x30,0x2e,0x78,0x2c,0x20,0x31,0x2e,0x30,0x20, - 0x2d,0x20,0x5f,0x37,0x35,0x30,0x2e,0x79,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x36,0x31,0x20,0x3d,0x20,0x76, + 0x65,0x63,0x32,0x28,0x5f,0x37,0x35,0x34,0x2e,0x78,0x2c,0x20,0x31,0x2e,0x30,0x20, + 0x2d,0x20,0x5f,0x37,0x35,0x34,0x2e,0x79,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x37,0x36,0x36,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20, + 0x37,0x37,0x30,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69, 0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65, 0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f, 0x6e,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69, - 0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x35,0x37,0x29,0x2e,0x78,0x79, - 0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x37,0x36,0x36,0x29,0x29,0x3b,0x0a, + 0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36,0x31,0x29,0x2e,0x78,0x79, + 0x7a,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x37,0x37,0x30,0x29,0x29,0x3b,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x6d, 0x61,0x78,0x28,0x67,0x6c,0x6f,0x77,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65, 0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f, 0x6e,0x5f,0x67,0x6c,0x6f,0x77,0x5f,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66, - 0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x35, - 0x37,0x29,0x2e,0x78,0x20,0x2a,0x20,0x70,0x6f,0x77,0x28,0x5f,0x37,0x36,0x36,0x2c, + 0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36, + 0x31,0x29,0x2e,0x78,0x20,0x2a,0x20,0x70,0x6f,0x77,0x28,0x5f,0x37,0x37,0x30,0x2c, 0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34, 0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x29,0x29,0x3b,0x0a, 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28, 0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x2c,0x20,0x76, - 0x65,0x63,0x33,0x28,0x5f,0x36,0x36,0x38,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29, + 0x65,0x63,0x33,0x28,0x5f,0x36,0x36,0x37,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29, 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33, - 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x76,0x5f,0x74,0x6f,0x5f, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x76,0x5f,0x74,0x6f,0x5f, 0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x20, + 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20, 0x3d,0x20,0x67,0x6c,0x6f,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x77,0x72,0x69,0x74, - 0x65,0x5f,0x73,0x63,0x65,0x6e,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c, - 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x65,0x5f,0x73,0x63,0x65,0x6e,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es @@ -9222,74 +9239,77 @@ vs_trile_source_metal_macos := u8.[ float3 param_2 = in.v_normal; float3 _590 = sun_shadow(param_1, param_2, _92, shadow_map, shadow_smp, shadow_tint, shadow_tint_smp); float3 _591 = _590 * in.v_facing; - float4 _605; + float4 _598; if (_193.probe_min.w > 0.5) { float3 param_3 = in.v_world; float3 param_4 = in.v_normal; - _605 = probe_light(param_3, param_4, _193, probe_index, probe_smp, probe_atlas); + _598 = probe_light(param_3, param_4, _193, probe_index, probe_smp, probe_atlas); } else { - _605 = float4(0.0); + _598 = float4(0.0); } - float3 color = albedo * mix((in.v_shade + _605.xyz) * mix(0.60000002384185791015625, 1.0, in.v_ao), in.v_sun, _591 * mix(0.25, 1.0, in.v_ao)); + float3 _623 = in.v_sun * _591; + float3 _627 = _623 * mix(0.25, 1.0, in.v_ao); + float3 color = albedo * (((in.v_shade + _598.xyz) * mix(0.60000002384185791015625, 1.0, in.v_ao)) + _627); float3 param_5 = _591; - float _638 = brightest(param_5); - if (_638 > 0.001000000047497451305389404296875) + float _637 = brightest(param_5); + if (_637 > 0.001000000047497451305389404296875) { - color = mix(color, _591 * in.v_sun, float3(fast::min(1.0, ((_638 - fast::min(_591.x, fast::min(_591.y, _591.z))) / _638) * 2.0))); + color += ((_627 * (float3(1.0) - albedo)) * ((_637 - fast::min(_591.x, fast::min(_591.y, _591.z))) / _637)); } - float _668 = _548.w; - float glow = _668 * 8.0; - float _671 = _556.z; - if (_671 > 0.0) + float _667 = _548.w; + float3 param_6 = _627; + float glow = (_667 * 8.0) + (brightest(param_6) * 1.5); + float _675 = _556.z; + if (_675 > 0.0) { - float _696 = powr(fast::max(dot(in.v_normal, fast::normalize(fast::normalize(in.v_to_camera) + _193.sun_dir.xyz)), 0.0), mix(4.0, 96.0, _671)) * _671; - color += ((in.v_sun * _591) * _696); - float3 param_6 = _591; - glow += ((_696 * brightest(param_6)) * 4.0); + float _700 = powr(fast::max(dot(in.v_normal, fast::normalize(fast::normalize(in.v_to_camera) + _193.sun_dir.xyz)), 0.0), mix(4.0, 96.0, _675)) * _675; + color += (_623 * _700); + float3 param_7 = _591; + glow += ((_700 * brightest(param_7)) * 4.0); } - bool _714 = _193.use_reflection > 0.5; - bool _720; - if (_714) + bool _718 = _193.use_reflection > 0.5; + bool _724; + if (_718) { - _720 = _556.y > 0.0; + _724 = _556.y > 0.0; } else { - _720 = _714; + _724 = _718; } - bool _726; - if (_720) + bool _730; + if (_724) { - _726 = in.v_normal.y > 0.5; + _730 = in.v_normal.y > 0.5; } else { - _726 = _720; + _730 = _724; } - bool _736; - if (_726) + bool _740; + if (_730) { - _736 = abs(in.v_world.y - _193.reflection_height) < 0.0199999995529651641845703125; + _740 = abs(in.v_world.y - _193.reflection_height) < 0.0199999995529651641845703125; } else { - _736 = _726; + _740 = _730; } - if (_736) + if (_740) { - float2 _750 = gl_FragCoord.xy / float2(int2(trile_reflection.get_width(), trile_reflection.get_height())); - float2 _757 = float2(_750.x, 1.0 - _750.y); - float _766 = _556.y; - color = mix(color, trile_reflection.sample(trile_reflection_smp, _757).xyz, float3(_766)); - glow = fast::max(glow, trile_reflection_glow.sample(trile_reflection_smp, _757).x * powr(_766, 0.4000000059604644775390625)); + float2 _754 = gl_FragCoord.xy / float2(int2(trile_reflection.get_width(), trile_reflection.get_height())); + float2 _761 = float2(_754.x, 1.0 - _754.y); + float _770 = _556.y; + color = mix(color, trile_reflection.sample(trile_reflection_smp, _761).xyz, float3(_770)); + glow = fast::max(glow, trile_reflection_glow.sample(trile_reflection_smp, _761).x * powr(_770, 0.4000000059604644775390625)); } - out.frag_color = float4(mix(color, albedo, float3(_668)), 1.0); - float3 param_7 = in.v_to_camera; - float param_8 = glow; - write_scene(param_7, param_8, out.frag_glow, out.frag_scene); + out.frag_color = float4(mix(color, albedo, float3(_667)), 1.0); + float3 param_8 = in.v_to_camera; + float param_9 = glow; + write_scene(param_8, param_9, out.frag_glow, out.frag_scene); return out; } @@ -9814,7 +9834,7 @@ fs_trile_source_metal_macos := u8.[ 0x69,0x6e,0x74,0x5f,0x73,0x6d,0x70,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, 0x6f,0x61,0x74,0x33,0x20,0x5f,0x35,0x39,0x31,0x20,0x3d,0x20,0x5f,0x35,0x39,0x30, 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x66,0x61,0x63,0x69,0x6e,0x67,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x36,0x30,0x35,0x3b, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x35,0x39,0x38,0x3b, 0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x39,0x33,0x2e,0x70,0x72, 0x6f,0x62,0x65,0x5f,0x6d,0x69,0x6e,0x2e,0x77,0x20,0x3e,0x20,0x30,0x2e,0x35,0x29, 0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, @@ -9822,137 +9842,141 @@ fs_trile_source_metal_macos := u8.[ 0x69,0x6e,0x2e,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d, 0x5f,0x34,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d, 0x20,0x70,0x72,0x6f,0x62,0x65,0x5f,0x6c,0x69,0x67,0x68,0x74,0x28,0x70,0x61,0x72, 0x61,0x6d,0x5f,0x33,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x2c,0x20,0x5f, 0x31,0x39,0x33,0x2c,0x20,0x70,0x72,0x6f,0x62,0x65,0x5f,0x69,0x6e,0x64,0x65,0x78, 0x2c,0x20,0x70,0x72,0x6f,0x62,0x65,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x70,0x72,0x6f, 0x62,0x65,0x5f,0x61,0x74,0x6c,0x61,0x73,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d, 0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x30,0x35,0x20,0x3d,0x20,0x66, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x39,0x38,0x20,0x3d,0x20,0x66, 0x6c,0x6f,0x61,0x74,0x34,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x63,0x6f,0x6c, - 0x6f,0x72,0x20,0x3d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x20,0x2a,0x20,0x6d,0x69, - 0x78,0x28,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x73,0x68,0x61,0x64,0x65,0x20,0x2b,0x20, - 0x5f,0x36,0x30,0x35,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28, - 0x30,0x2e,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x33,0x38,0x34,0x31,0x38,0x35, - 0x37,0x39,0x31,0x30,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20, - 0x69,0x6e,0x2e,0x76,0x5f,0x61,0x6f,0x29,0x2c,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x73, - 0x75,0x6e,0x2c,0x20,0x5f,0x35,0x39,0x31,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30, - 0x2e,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x61, - 0x6f,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x33,0x38,0x20,0x3d, - 0x20,0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d, - 0x5f,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x33, - 0x38,0x20,0x3e,0x20,0x30,0x2e,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x34,0x37,0x34,0x39,0x37,0x34,0x35,0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34,0x30, - 0x34,0x32,0x39,0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d, - 0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x5f,0x35,0x39,0x31,0x20,0x2a, - 0x20,0x69,0x6e,0x2e,0x76,0x5f,0x73,0x75,0x6e,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x33,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x31,0x2e,0x30,0x2c, - 0x20,0x28,0x28,0x5f,0x36,0x33,0x38,0x20,0x2d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a, - 0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x78,0x2c,0x20,0x66,0x61,0x73,0x74, - 0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x79,0x2c,0x20,0x5f,0x35, - 0x39,0x31,0x2e,0x7a,0x29,0x29,0x29,0x20,0x2f,0x20,0x5f,0x36,0x33,0x38,0x29,0x20, - 0x2a,0x20,0x32,0x2e,0x30,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x36,0x38,0x20,0x3d, - 0x20,0x5f,0x35,0x34,0x38,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x5f,0x36,0x36,0x38,0x20,0x2a, - 0x20,0x38,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x36,0x37,0x31,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x7a,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x37,0x31,0x20,0x3e,0x20,0x30,0x2e, - 0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x39,0x36,0x20,0x3d,0x20,0x70,0x6f, - 0x77,0x72,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74, - 0x28,0x69,0x6e,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x66,0x61, - 0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x61, - 0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x69,0x6e, - 0x2e,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x29,0x20,0x2b,0x20, - 0x5f,0x31,0x39,0x33,0x2e,0x73,0x75,0x6e,0x5f,0x64,0x69,0x72,0x2e,0x78,0x79,0x7a, - 0x29,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x6d,0x69,0x78,0x28,0x34,0x2e, - 0x30,0x2c,0x20,0x39,0x36,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x37,0x31,0x29,0x29,0x20, - 0x2a,0x20,0x5f,0x36,0x37,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x28,0x69,0x6e,0x2e,0x76,0x5f, - 0x73,0x75,0x6e,0x20,0x2a,0x20,0x5f,0x35,0x39,0x31,0x29,0x20,0x2a,0x20,0x5f,0x36, - 0x39,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f,0x35, - 0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77, - 0x20,0x2b,0x3d,0x20,0x28,0x28,0x5f,0x36,0x39,0x36,0x20,0x2a,0x20,0x62,0x72,0x69, - 0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x29, - 0x20,0x2a,0x20,0x34,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x31,0x34,0x20,0x3d,0x20,0x5f, - 0x31,0x39,0x33,0x2e,0x75,0x73,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69, - 0x6f,0x6e,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, - 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, - 0x28,0x5f,0x37,0x31,0x34,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, - 0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x30,0x20,0x3d,0x20,0x5f,0x37, - 0x31,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, - 0x6f,0x6c,0x20,0x5f,0x37,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20, - 0x28,0x5f,0x37,0x32,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32,0x36,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76, - 0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a, - 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37, - 0x32,0x36,0x20,0x3d,0x20,0x5f,0x37,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d, - 0x0a,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x33,0x36,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x32,0x36,0x29,0x0a,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36, - 0x20,0x3d,0x20,0x61,0x62,0x73,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x77,0x6f,0x72,0x6c, - 0x64,0x2e,0x79,0x20,0x2d,0x20,0x5f,0x31,0x39,0x33,0x2e,0x72,0x65,0x66,0x6c,0x65, - 0x63,0x74,0x69,0x6f,0x6e,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x20, - 0x30,0x2e,0x30,0x31,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36, - 0x35,0x31,0x36,0x34,0x31,0x38,0x34,0x35,0x37,0x30,0x33,0x31,0x32,0x35,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x36,0x32, + 0x33,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x73,0x75,0x6e,0x20,0x2a,0x20,0x5f, + 0x35,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x5f,0x36,0x32,0x37,0x20,0x3d,0x20,0x5f,0x36,0x32,0x33,0x20,0x2a,0x20,0x6d,0x69, + 0x78,0x28,0x30,0x2e,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x69,0x6e,0x2e, + 0x76,0x5f,0x61,0x6f,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x33,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f, + 0x20,0x2a,0x20,0x28,0x28,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x73,0x68,0x61,0x64,0x65, + 0x20,0x2b,0x20,0x5f,0x35,0x39,0x38,0x2e,0x78,0x79,0x7a,0x29,0x20,0x2a,0x20,0x6d, + 0x69,0x78,0x28,0x30,0x2e,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x33,0x38,0x34, + 0x31,0x38,0x35,0x37,0x39,0x31,0x30,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x31,0x2e, + 0x30,0x2c,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x61,0x6f,0x29,0x29,0x20,0x2b,0x20,0x5f, + 0x36,0x32,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x33,0x37,0x20, + 0x3d,0x20,0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36, + 0x33,0x37,0x20,0x3e,0x20,0x30,0x2e,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x34,0x37,0x34,0x39,0x37,0x34,0x35,0x31,0x33,0x30,0x35,0x33,0x38,0x39,0x34, + 0x30,0x34,0x32,0x39,0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d, + 0x20,0x28,0x28,0x5f,0x36,0x32,0x37,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74, + 0x33,0x28,0x31,0x2e,0x30,0x29,0x20,0x2d,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x29, + 0x29,0x20,0x2a,0x20,0x28,0x28,0x5f,0x36,0x33,0x37,0x20,0x2d,0x20,0x66,0x61,0x73, + 0x74,0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x78,0x2c,0x20,0x66, + 0x61,0x73,0x74,0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x5f,0x35,0x39,0x31,0x2e,0x79,0x2c, + 0x20,0x5f,0x35,0x39,0x31,0x2e,0x7a,0x29,0x29,0x29,0x20,0x2f,0x20,0x5f,0x36,0x33, + 0x37,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x36,0x37,0x20,0x3d,0x20,0x5f,0x35,0x34,0x38, + 0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x5f,0x36,0x32,0x37,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20, + 0x28,0x5f,0x36,0x36,0x37,0x20,0x2a,0x20,0x38,0x2e,0x30,0x29,0x20,0x2b,0x20,0x28, + 0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x36,0x29,0x20,0x2a,0x20,0x31,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x37,0x35,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36, + 0x2e,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x37,0x35, + 0x20,0x3e,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x30,0x30, + 0x20,0x3d,0x20,0x70,0x6f,0x77,0x72,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61, + 0x78,0x28,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61, + 0x6c,0x2c,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, + 0x7a,0x65,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, + 0x7a,0x65,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72, + 0x61,0x29,0x20,0x2b,0x20,0x5f,0x31,0x39,0x33,0x2e,0x73,0x75,0x6e,0x5f,0x64,0x69, + 0x72,0x2e,0x78,0x79,0x7a,0x29,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x6d, + 0x69,0x78,0x28,0x34,0x2e,0x30,0x2c,0x20,0x39,0x36,0x2e,0x30,0x2c,0x20,0x5f,0x36, + 0x37,0x35,0x29,0x29,0x20,0x2a,0x20,0x5f,0x36,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x2b,0x3d,0x20,0x28,0x5f, + 0x36,0x32,0x33,0x20,0x2a,0x20,0x5f,0x37,0x30,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x35,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20,0x2b,0x3d,0x20,0x28,0x28,0x5f,0x37, + 0x30,0x30,0x20,0x2a,0x20,0x62,0x72,0x69,0x67,0x68,0x74,0x65,0x73,0x74,0x28,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x37,0x29,0x29,0x20,0x2a,0x20,0x34,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20, + 0x5f,0x37,0x31,0x38,0x20,0x3d,0x20,0x5f,0x31,0x39,0x33,0x2e,0x75,0x73,0x65,0x5f, + 0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x3e,0x20,0x30,0x2e,0x35, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x32,0x34,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x31,0x38,0x29,0x0a,0x20, + 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x32, + 0x34,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x20,0x3e,0x20,0x30,0x2e,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65, + 0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f, + 0x37,0x32,0x34,0x20,0x3d,0x20,0x5f,0x37,0x31,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x37,0x33,0x30,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x32,0x34,0x29,0x0a,0x20, 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33, - 0x36,0x20,0x3d,0x20,0x5f,0x37,0x32,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x37,0x33,0x36,0x29,0x0a,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x20,0x5f,0x37,0x35,0x30,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61, - 0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x79,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x28,0x69,0x6e,0x74,0x32,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65, - 0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x67,0x65,0x74,0x5f,0x77,0x69,0x64, - 0x74,0x68,0x28,0x29,0x2c,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c, - 0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x67,0x65,0x74,0x5f,0x68,0x65,0x69,0x67,0x68, - 0x74,0x28,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x37,0x35,0x37,0x20,0x3d,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x28,0x5f,0x37,0x35,0x30,0x2e,0x78,0x2c,0x20,0x31,0x2e,0x30,0x20, - 0x2d,0x20,0x5f,0x37,0x35,0x30,0x2e,0x79,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x36,0x36,0x20,0x3d,0x20, - 0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f, - 0x72,0x2c,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74, - 0x69,0x6f,0x6e,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x74,0x72,0x69,0x6c,0x65, - 0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c, - 0x20,0x5f,0x37,0x35,0x37,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x33,0x28,0x5f,0x37,0x36,0x36,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a, - 0x6d,0x61,0x78,0x28,0x67,0x6c,0x6f,0x77,0x2c,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f, - 0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x67,0x6c,0x6f,0x77,0x2e, - 0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66, - 0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x35, - 0x37,0x29,0x2e,0x78,0x20,0x2a,0x20,0x70,0x6f,0x77,0x72,0x28,0x5f,0x37,0x36,0x36, - 0x2c,0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30, - 0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x29,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x34,0x28,0x6d,0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x61,0x6c, - 0x62,0x65,0x64,0x6f,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x36,0x36, - 0x38,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20, - 0x69,0x6e,0x2e,0x76,0x5f,0x74,0x6f,0x5f,0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, - 0x38,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x77,0x72, - 0x69,0x74,0x65,0x5f,0x73,0x63,0x65,0x6e,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f, - 0x37,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c,0x20,0x6f,0x75,0x74,0x2e, - 0x66,0x72,0x61,0x67,0x5f,0x67,0x6c,0x6f,0x77,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x66, - 0x72,0x61,0x67,0x5f,0x73,0x63,0x65,0x6e,0x65,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, - + 0x30,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2e, + 0x79,0x20,0x3e,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x30,0x20,0x3d,0x20,0x5f,0x37,0x32, + 0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f, + 0x6c,0x20,0x5f,0x37,0x34,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, + 0x5f,0x37,0x33,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20,0x61,0x62,0x73,0x28,0x69, + 0x6e,0x2e,0x76,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x2e,0x79,0x20,0x2d,0x20,0x5f,0x31, + 0x39,0x33,0x2e,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x68,0x65, + 0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x20,0x30,0x2e,0x30,0x31,0x39,0x39,0x39,0x39, + 0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34,0x31,0x38,0x34,0x35, + 0x37,0x30,0x33,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x34,0x30,0x20,0x3d,0x20,0x5f,0x37,0x33,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, + 0x5f,0x37,0x34,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x37,0x35,0x34,0x20, + 0x3d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78, + 0x79,0x20,0x2f,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x32,0x28, + 0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e, + 0x2e,0x67,0x65,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x29,0x2c,0x20,0x74,0x72, + 0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x67, + 0x65,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x29,0x29,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x37, + 0x36,0x31,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x5f,0x37,0x35,0x34, + 0x2e,0x78,0x2c,0x20,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x37,0x35,0x34,0x2e,0x79, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x5f,0x37,0x37,0x30,0x20,0x3d,0x20,0x5f,0x35,0x35,0x36,0x2e,0x79,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20, + 0x6d,0x69,0x78,0x28,0x63,0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x74,0x72,0x69,0x6c,0x65, + 0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x73,0x61,0x6d,0x70, + 0x6c,0x65,0x28,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74, + 0x69,0x6f,0x6e,0x5f,0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36,0x31,0x29,0x2e,0x78, + 0x79,0x7a,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x37,0x37,0x30,0x29, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x6c,0x6f,0x77,0x20, + 0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x67,0x6c,0x6f,0x77, + 0x2c,0x20,0x74,0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69, + 0x6f,0x6e,0x5f,0x67,0x6c,0x6f,0x77,0x2e,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x74, + 0x72,0x69,0x6c,0x65,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f, + 0x73,0x6d,0x70,0x2c,0x20,0x5f,0x37,0x36,0x31,0x29,0x2e,0x78,0x20,0x2a,0x20,0x70, + 0x6f,0x77,0x72,0x28,0x5f,0x37,0x37,0x30,0x2c,0x20,0x30,0x2e,0x34,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33, + 0x39,0x30,0x36,0x32,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f, + 0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6d,0x69,0x78,0x28,0x63, + 0x6f,0x6c,0x6f,0x72,0x2c,0x20,0x61,0x6c,0x62,0x65,0x64,0x6f,0x2c,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x5f,0x36,0x36,0x37,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x76,0x5f,0x74,0x6f,0x5f, + 0x63,0x61,0x6d,0x65,0x72,0x61,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x67,0x6c,0x6f,0x77, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x77,0x72,0x69,0x74,0x65,0x5f,0x73,0x63,0x65,0x6e, + 0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x39,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x67,0x6c,0x6f, + 0x77,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x73,0x63,0x65,0x6e, + 0x65,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f, + 0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #include diff --git a/src/renderer_sokol/shaders/trile.glsl b/src/renderer_sokol/shaders/trile.glsl index ddbded5..6c4f8b1 100644 --- a/src/renderer_sokol/shaders/trile.glsl +++ b/src/renderer_sokol/shaders/trile.glsl @@ -92,8 +92,8 @@ layout(binding=4) uniform texture3D probe_atlas; // per brick 32^3 probes, 3 t layout(binding=2) uniform sampler probe_smp; const float GLOSS_GLOW = 4.0; // how much a full gloss highlight blooms +const float SUN_GLOW = 1.5; const float REFLECTED_GLOW_CURVE = 0.4; // below 1, reflected glow fades slower than reflected colour -const float GLASS_PROJECTION = 2.0; // how strongly coloured sunlight paints its colour on const int PROBE_BRICKS_PER_COLUMN = 16; @@ -160,20 +160,17 @@ void main() { if (v_tint > 1.5) albedo = mix(albedo, vec3(1.0, 0.2, 0.2), 0.5); else if (v_tint > 0.5) albedo = mix(albedo, vec3(0.2, 1.0, 0.2), 0.5); vec3 sun = v_facing * sun_shadow(v_world, v_normal); - vec3 lit = sun * mix(0.25, 1.0, v_ao); vec4 probe = probe_min.w > 0.5 ? probe_light(v_world, v_normal) : vec4(0.0); - vec3 shade = v_shade + probe.rgb; - vec3 light = mix(shade * mix(0.6, 1.0, v_ao), v_sun, lit); - vec3 color = albedo * light; + vec3 shade = (v_shade + probe.rgb) * mix(0.6, 1.0, v_ao); + vec3 incoming = v_sun * sun * mix(0.25, 1.0, v_ao); + vec3 color = albedo * (shade + incoming); - // Light through glass paints the glass colour onto what it hits, so the pattern - // shows on dark surfaces too, not only where the albedo can reflect it. float bright = brightest(sun); if (bright > 0.001) { float tinted = (bright - min(sun.r, min(sun.g, sun.b))) / bright; - color = mix(color, sun * v_sun, min(1.0, tinted * GLASS_PROJECTION)); + color += incoming * (1.0 - albedo) * tinted; } - float glow = swatch.a * EMISSIVE_GLOW; + float glow = swatch.a * EMISSIVE_GLOW + brightest(incoming) * SUN_GLOW; // Glossier is both stronger and sharper. if (material.b > 0.0) { diff --git a/src/renderer_sokol/triles.jai b/src/renderer_sokol/triles.jai index f9190fa..99bff5b 100644 --- a/src/renderer_sokol/triles.jai +++ b/src/renderer_sokol/triles.jai @@ -73,23 +73,36 @@ triles_upload :: (scene: *Scene) { triles.palette_image = sg_make_image(*desc); } + if triles.world_version != scene.world_version world_rebuild(scene); + array_reset_keeping_memory(*triles.instances); array_reset_keeping_memory(*triles.batches); + chunk_count := triles.world_chunks.count; + array_resize(*triles.cut_chunks, scene.views.count * chunk_count, initialize = false); + memset(triles.cut_chunks.data, 0, triles.cut_chunks.count); draws : [..]Keyed(Instance); draws.allocator = temp; for view, view_index: scene.views { array_reset_keeping_memory(*draws); if view.draw_world { - for chunk: scene.chunks for group: chunk.groups for group.instances { - position := chunk.origin + Vector3.{xx it.x, xx it.y, xx it.z}; - cut := trile_cut(.{xx view_index}, group.mesh, position); - array_add(*draws, .{group.mesh.id, .{position, xx it.orientation, 0, cut}}); + cut_chunks := array_view(triles.cut_chunks, view_index * chunk_count, chunk_count); + for view_cut_chunks(.{xx view_index}) { + index := table_find_pointer(*triles.chunk_index, it); + if index cut_chunks[index.*] = true; + } + for batch: triles.world_batches { + if !batch.cuttable || !cut_chunks[batch.chunk] continue; + for batch.first..batch.first + batch.count - 1 { + instance := triles.world_instances[it]; + instance.cut = trile_cut(.{xx view_index}, .{batch.mesh}, instance.position); + array_add(*draws, .{MAIN_ONLY_KEY | cast(s64) batch.mesh, instance}); + } } } for scene.triles { if it.view.index != view_index continue; - preview : s64 = ifx it.tint != .NONE then PREVIEW_KEY else 0; + preview : s64 = ifx it.tint != .NONE then MAIN_ONLY_KEY else 0; cut := ifx preview then 0.0 else trile_cut(it.view, it.mesh, it.position); array_add(*draws, .{preview | it.mesh.id, .{it.position, xx it.orientation, xx it.tint, cut}}); } @@ -104,14 +117,13 @@ triles_draw_glass_shadow :: (pass: *Pass) { apply_uniforms(UB_view_params, *pass.params); triles.params.show_hidden = 1; apply_uniforms(UB_trile_params, *triles.params); - for triles.batches { - if it.view_index != pass.view_index || it.key & PREVIEW_KEY continue; - mesh := slot_get(*triles.meshes, xx it.key); + for pass_draws(pass) { + mesh := slot_get(*triles.meshes, it.mesh); if !mesh || mesh.index_count == 0 continue; bind : sg_bindings; bind.vertex_buffers[0] = mesh.vertices; bind.index_buffer = mesh.indices; - bind.vertex_buffers[1] = triles.stream.buffer; + bind.vertex_buffers[1] = it.buffer; bind.vertex_buffer_offsets[1] = it.first * size_of(Instance); bind.images[IMG_palette] = triles.palette_image; bind.samplers[SMP_palette_smp] = samplers.nearest_clamp; @@ -137,15 +149,14 @@ triles_draw :: (pass: *Pass) { apply_uniforms(UB_trile_fs_params, *fs_params); } - for triles.batches { - if it.view_index != pass.view_index || (pass.kind != .MAIN && it.key & PREVIEW_KEY) continue; - mesh := slot_get(*triles.meshes, xx (it.key & ~PREVIEW_KEY)); + for pass_draws(pass) { + mesh := slot_get(*triles.meshes, it.mesh); if !mesh || mesh.index_count == 0 continue; bind : sg_bindings; bind.vertex_buffers[0] = mesh.vertices; bind.index_buffer = mesh.indices; - bind.vertex_buffers[1] = triles.stream.buffer; + bind.vertex_buffers[1] = it.buffer; bind.vertex_buffer_offsets[1] = it.first * size_of(Instance); bind.images[IMG_palette] = triles.palette_image; bind.samplers[SMP_palette_smp] = samplers.nearest_clamp; @@ -176,7 +187,27 @@ Instance :: struct { cut : float; // 0..1 dissolved away from the camera, still casts shadows } -PREVIEW_KEY :: 1 << 32; +MAIN_ONLY_KEY :: 1 << 32; + +World_Chunk :: struct { + key : Chunk_Key; + origin : Vector3; +} + +World_Batch :: struct { + mesh : u32; + chunk : s32; + cuttable : bool; + first : s32; + count : s32; +} + +Trile_Draw :: struct { + mesh : u32; + buffer : sg_buffer; + first : s32; + count : s32; +} triles : struct { pipeline : sg_pipeline; @@ -192,6 +223,94 @@ triles : struct { instances : [..]Instance; batches : [..]Batch; stream : Stream_Buffer; + + world_version : u64; + world_chunks : [..]World_Chunk; + chunk_index : Table(Chunk_Key, s32, chunk_key_hash, chunk_key_compare); + world_batches : [..]World_Batch; + world_instances : [..]Instance; + world_buffer : sg_buffer; + cut_chunks : [..]bool; +} + +world_rebuild :: (scene: *Scene) { + triles.world_version = scene.world_version; + array_reset_keeping_memory(*triles.world_chunks); + array_reset_keeping_memory(*triles.world_batches); + array_reset_keeping_memory(*triles.world_instances); + table_reset(*triles.chunk_index); + + for scene.chunks array_add(*triles.world_chunks, .{it_index, it.origin}); + quick_sort(triles.world_chunks, (a: World_Chunk, b: World_Chunk) -> s64 { + if a.key.x != b.key.x return a.key.x - b.key.x; + if a.key.z != b.key.z return a.key.z - b.key.z; + return a.key.y - b.key.y; + }); + + Piece :: struct { + key : s64; + chunk : s32; + group : *World_Group; + } + pieces : [..]Piece; + pieces.allocator = temp; + for chunk, index: triles.world_chunks { + table_set(*triles.chunk_index, chunk.key, xx index); + scene_chunk := table_find_pointer(*scene.chunks, chunk.key); + for * scene_chunk.groups array_add(*pieces, .{(cast(s64) it.mesh.id << 32) | index, xx index, it}); + } + quick_sort(pieces, (a: Piece, b: Piece) -> s64 { return a.key - b.key; }); + + occluders := world_occluders(); + for pieces { + chunk := triles.world_chunks[it.chunk]; + batch := World_Batch.{mesh = it.group.mesh.id, chunk = it.chunk, cuttable = trile_mesh_cuttable(it.group.mesh), first = xx triles.world_instances.count}; + for instance: it.group.instances { + if trile_buried(*occluders, chunk.key, instance.x, instance.y, instance.z) continue; + position := chunk.origin + Vector3.{xx instance.x, xx instance.y, xx instance.z}; + array_add(*triles.world_instances, .{position, xx instance.orientation, 0, 0}); + } + batch.count = xx (triles.world_instances.count - batch.first); + if batch.count array_add(*triles.world_batches, batch); + } + + if triles.world_buffer.id sg_destroy_buffer(triles.world_buffer); + triles.world_buffer = .{}; + if triles.world_instances.count { + size := triles.world_instances.count * size_of(Instance); + triles.world_buffer = sg_make_buffer(*(sg_buffer_desc.{ data = .{ triles.world_instances.data, xx size } })); + } +} + +pass_draws :: (pass: *Pass) -> []Trile_Draw { + draws : [..]Trile_Draw; + draws.allocator = temp; + main := pass.kind == .MAIN; + + if pass.view.draw_world && triles.world_batches.count { + chunk_count := triles.world_chunks.count; + visible := NewArray(chunk_count, bool,, temp); + for triles.world_chunks visible[it_index] = box_in_frustum(pass.frustum, it.origin, it.origin + Vector3.{CHUNK_SIZE, CHUNK_SIZE, CHUNK_SIZE}); + cut_chunks := array_view(triles.cut_chunks, pass.view_index * chunk_count, chunk_count); + + run : Trile_Draw; + for triles.world_batches { + if !visible[it.chunk] || (main && it.cuttable && cut_chunks[it.chunk]) continue; + if run.count && run.mesh == it.mesh && run.first + run.count == it.first { + run.count += it.count; + continue; + } + if run.count array_add(*draws, run); + run = .{it.mesh, triles.world_buffer, it.first, it.count}; + } + if run.count array_add(*draws, run); + } + + for triles.batches { + if it.view_index != pass.view_index || (!main && it.key & MAIN_ONLY_KEY) continue; + array_add(*draws, .{xx (it.key & ~MAIN_ONLY_KEY), triles.stream.buffer, it.first, it.count}); + } + return draws; } make_mesh :: (mesh: *Mesh, vertices: []Trile_Vertex, indices: []u16) { diff --git a/src/rendering/scene.jai b/src/rendering/scene.jai index a94ef16..124ca46 100644 --- a/src/rendering/scene.jai +++ b/src/rendering/scene.jai @@ -94,19 +94,19 @@ Ui_Vertex :: struct { trile_mesh_create :: (trile: *Trile) -> Trile_Mesh { vertices, indices := mesh_trile(trile); mesh := Trile_Mesh.{renderer_trile_mesh_create(vertices, indices)}; - set_mesh_cut(mesh, trile.cut); + set_mesh_info(mesh, trile.cut, trile_fills_cell(trile)); return mesh; } trile_mesh_update :: (mesh: Trile_Mesh, trile: *Trile) { vertices, indices := mesh_trile(trile); renderer_trile_mesh_update(mesh.id, vertices, indices); - set_mesh_cut(mesh, trile.cut); + set_mesh_info(mesh, trile.cut, trile_fills_cell(trile)); } trile_mesh_destroy :: (mesh: Trile_Mesh) { renderer_trile_mesh_destroy(mesh.id); - set_mesh_cut(mesh, .NONE); + set_mesh_info(mesh, .NONE, false); } swatch_set :: (id: u8, color: [3]u8, reflectivity: u8, gloss: u8, emittance: u8, glass: bool) { @@ -142,6 +142,7 @@ Probe :: struct { PROBES_PER_CHUNK :: CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE; world_set_chunk :: (key: Chunk_Key, origin: Vector3, groups: []World_Group) { + scene.world_version += 1; chunk := find_or_add(*scene.chunks, key); chunk.origin = origin; for chunk.groups array_free(it.instances); @@ -156,12 +157,14 @@ world_set_chunk :: (key: Chunk_Key, origin: Vector3, groups: []World_Group) { world_remove_chunk :: (key: Chunk_Key) { chunk := table_find_pointer(*scene.chunks, key); if !chunk return; + scene.world_version += 1; for chunk.groups array_free(it.instances); array_free(chunk.groups); table_remove(*scene.chunks, key); } world_clear :: () { + scene.world_version += 1; for chunk: scene.chunks { for chunk.groups array_free(it.instances); array_free(chunk.groups); @@ -221,6 +224,65 @@ trile_cut :: (view: View_Id, mesh: Trile_Mesh, position: Vector3) -> float { return result; } +view_cut_chunks :: (view: View_Id) -> []Chunk_Key { + keys : [..]Chunk_Key; + keys.allocator = temp; + cut := scene.view_cuts[view.index]; + if !cut.enabled return keys; + + for scene.chunks { + if chunk_column_distance(it.origin, cut.focus) <= CUT_RADIUS array_add(*keys, it_index); + } + unpack :: (bits: s64) -> s32 { return xx (((bits & 0xFFFFF) ^ 0x80000) - 0x80000); } + for scene.cut_fades { + if (it_index >> 60) != view.index continue; + array_add_if_unique(*keys, world_to_chunk_coord(unpack(it_index >> 40), unpack(it_index >> 20), unpack(it_index)), chunk_key_compare); + } + return keys; +} + +trile_mesh_cuttable :: (mesh: Trile_Mesh) -> bool { + return mesh_cut(mesh) != .NONE; +} + +OCCLUDER_WORDS :: CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE / 64; +World_Occluders :: Table(Chunk_Key, *[OCCLUDER_WORDS]u64, chunk_key_hash, chunk_key_compare); + +world_occluders :: () -> World_Occluders { + occluders : World_Occluders; + occluders.allocator = temp; + for chunk: scene.chunks { + bits := New([OCCLUDER_WORDS]u64,, temp); + for group: chunk.groups { + if !mesh_occludes(group.mesh) continue; + for group.instances { + cell := cast(s64) it.x + cast(s64) it.y * CHUNK_SIZE + cast(s64) it.z * CHUNK_SIZE * CHUNK_SIZE; + bits.*[cell >> 6] |= (cast(u64) 1) << cast(u64) (cell & 63); + } + } + table_set(*occluders, it_index, bits); + } + return occluders; +} + +trile_buried :: (occluders: *World_Occluders, key: Chunk_Key, x: s32, y: s32, z: s32) -> bool { + occluded :: (occluders: *World_Occluders, key: Chunk_Key, x: s32, y: s32, z: s32) -> bool { + c := s32.[x, y, z]; + k := s32.[key.x, key.y, key.z]; + for 0..2 { + if c[it] < 0 { c[it] += CHUNK_SIZE; k[it] -= 1; } + if c[it] >= CHUNK_SIZE { c[it] -= CHUNK_SIZE; k[it] += 1; } + } + bits := table_find_pointer(occluders, .{k[0], k[1], k[2]}); + if !bits return false; + cell := cast(s64) c[0] + c[1] * CHUNK_SIZE + c[2] * CHUNK_SIZE * CHUNK_SIZE; + return ((bits.*.*[cell >> 6] >> cast(u64) (cell & 63)) & 1) != 0; + } + return occluded(occluders, key, x - 1, y, z) && occluded(occluders, key, x + 1, y, z) + && occluded(occluders, key, x, y - 1, z) && occluded(occluders, key, x, y + 1, z) + && occluded(occluders, key, x, y, z - 1) && occluded(occluders, key, x, y, z + 1); +} + draw_trile :: (view: View_Id, mesh: Trile_Mesh, position: Vector3, orientation: u8, tint := Trile_Tint.NONE) { array_add(*scene.triles, .{view, mesh, position, orientation, tint}); } @@ -309,7 +371,9 @@ Trile_Vertex :: struct { Scene :: struct { chunks : Table(Chunk_Key, Scene_Chunk, chunk_key_hash, chunk_key_compare); - mesh_cuts : [..]Trile_Cut; // by mesh id + world_version : u64; + mesh_cuts : [..]Trile_Cut; // by mesh id + mesh_occluders : [..]bool; views : [..]View; view_proj : [..]Matrix4; @@ -362,9 +426,34 @@ scene_end_frame :: (width: s32, height: s32, time: float) { scene : Scene; -set_mesh_cut :: (mesh: Trile_Mesh, cut: Trile_Cut) { - if scene.mesh_cuts.count <= mesh.id array_resize(*scene.mesh_cuts, mesh.id + 1); +set_mesh_info :: (mesh: Trile_Mesh, cut: Trile_Cut, fills_cell: bool) { + if scene.mesh_cuts.count <= mesh.id { + array_resize(*scene.mesh_cuts, mesh.id + 1); + array_resize(*scene.mesh_occluders, mesh.id + 1); + } scene.mesh_cuts[mesh.id] = cut; + scene.mesh_occluders[mesh.id] = fills_cell && cut == .NONE; + scene.world_version += 1; +} + +mesh_occludes :: (mesh: Trile_Mesh) -> bool { + if mesh.id >= scene.mesh_occluders.count return false; + return scene.mesh_occluders[mesh.id]; +} + +trile_fills_cell :: (trile: *Trile) -> bool { + if !trile.is_opaque return false; + for x: 0..15 for y: 0..15 for z: 0..15 { + id := trile.trixels[x][y][z]; + if !id || g_swatches[id].glass return false; + } + return true; +} + +chunk_column_distance :: (origin: Vector3, point: Vector3) -> float { + dx := max(max(origin.x - point.x, point.x - origin.x - CHUNK_SIZE), 0); + dz := max(max(origin.z - point.z, point.z - origin.z - CHUNK_SIZE), 0); + return sqrt(dx * dx + dz * dz); } mesh_cut :: (mesh: Trile_Mesh) -> Trile_Cut { @@ -382,13 +471,16 @@ make_view_cut :: (view: View) -> View_Cut { to_camera := Vector2.{view.camera.position.x - view.focus.x, view.camera.position.z - view.focus.z}; if length(to_camera) > 0.0001 cut.toward_camera = normalize(to_camera); - for chunk: scene.chunks for group: chunk.groups { - if mesh_cut(group.mesh) != .ROOF continue; - for group.instances { - p := chunk.origin + Vector3.{xx it.x, xx it.y, xx it.z}; - if p.y <= cut.floor continue; - if length(Vector2.{p.x + 0.5 - view.focus.x, p.z + 0.5 - view.focus.z}) > CUT_RADIUS continue; - cut.height = min(cut.height, p.y); + for chunk: scene.chunks { + if chunk.origin.y + CHUNK_SIZE <= cut.floor || chunk_column_distance(chunk.origin, view.focus) > CUT_RADIUS continue; + for group: chunk.groups { + if mesh_cut(group.mesh) != .ROOF continue; + for group.instances { + p := chunk.origin + Vector3.{xx it.x, xx it.y, xx it.z}; + if p.y <= cut.floor continue; + if length(Vector2.{p.x + 0.5 - view.focus.x, p.z + 0.5 - view.focus.z}) > CUT_RADIUS continue; + cut.height = min(cut.height, p.y); + } } } return cut;