From 84d7baff550cc2f5961bea1a29292206c22a519b Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 9 Nov 2026 13:21:00 +0100 Subject: [PATCH] feat(vk): FXAA in the gameplay TAAU stand-in (edges on cards without the network) Where the TAAU network does not run (software matrix multiplies: AMD, Intel), its stand-in upscaled the scene colour linearly, and every edge stayed stair-stepped: hair, the cap, leaves and thin branches shimmer as they move. The network reads the scene colour alone (no motion vectors, no depth), so a one-frame filter stands in: FXAA 3.11's quality variant on the input, in its perceptual encoding, at FXAA's high-quality thresholds and half its sub-pixel blend (at the default ones it also took moss, cloth and leaf textures for edges). RX_VK_TAAU_FXAA=0: the plain linear upscale as before; =2: the pixels it moves drawn red (along an edge) or blue (sub-pixel blend). tests/test_taau_fxaa.py keeps the history bound on its own bit, FXAA to the gameplay stand-in, and the SPIR-V header compiled from its source. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013mj4MdWTJo5ht4ShZX8Vpp --- gpu/vk/shaders/taau_upscale.comp | 66 ++- gpu/vk/shaders/taau_upscale_comp_spv.h | 609 ++++++++++++++++++++----- gpu/vk/vk_draw.cpp | 4 + tests/test_taau_fxaa.py | 53 +++ 4 files changed, 625 insertions(+), 107 deletions(-) create mode 100644 tests/test_taau_fxaa.py diff --git a/gpu/vk/shaders/taau_upscale.comp b/gpu/vk/shaders/taau_upscale.comp index cdb71875a..025391180 100644 --- a/gpu/vk/shaders/taau_upscale.comp +++ b/gpu/vk/shaders/taau_upscale.comp @@ -7,22 +7,82 @@ // Against one-frame flashes: the picture before (`hist`, this pass's own last output) bounds each pixel, which may // rise to 1.5x and fall to 0.6x of it in a frame (a light change or a camera cut settles over a few frames). Some // frames' scene colour blows up to white across the picture (or a light term drops out for a frame); those frames -// came out as full-screen flashes. A NaN or infinite pixel takes the one before. pc.valid = 0 (the first frame, a +// came out as full-screen flashes. A NaN or infinite pixel takes the one before. pc.valid bit 0 = 0 (the first frame, a // new size): no bound. +// +// Edges (pc.valid bit 1, the gameplay stand-in): FXAA (3.11, quality) on the input, in its perceptual encoding. The +// network smoothed them; a plain linear upscale left every edge stair-stepped, and hair, foliage and thin edges shimmer +// as they move. The network reads the scene colour alone (no motion, no depth), so a filter of one frame stands in for +// it: temporal accumulation without motion vectors smears everything that moves (see the clamp above). layout(local_size_x = 8, local_size_y = 8) in; layout(binding = 0) uniform sampler2D src; layout(binding = 1, r11f_g11f_b10f) uniform writeonly image2D dst; layout(binding = 2, r11f_g11f_b10f) uniform image2D hist; layout(push_constant) uniform P { ivec2 size; int valid; } pc; +float luma(vec3 c) { return dot(c, vec3(0.299, 0.587, 0.114)); } +// (FXAA 3.11's quality variant: the edge's orientation from the 3x3 neighbourhood, a search along it for its +// ends (12 steps at most), the pixel moved across the edge by its place on that span; and the sub-pixel blend, which +// softens the features thinner than a pixel (hair, twigs) that no span describes. On the input, at its texel size) +float L(vec2 uv) { return luma(textureLod(src, uv, 0.0).rgb); } +vec3 fxaa(vec2 uv, vec3 rgbM, out int moved) { + moved = 0; + const vec2 px = 1.0 / vec2(textureSize(src, 0)); + const float m = luma(rgbM); + float n = L(uv + vec2(0.0, -px.y)), s = L(uv + vec2(0.0, px.y)); + const float e = L(uv + vec2(px.x, 0.0)), w = L(uv + vec2(-px.x, 0.0)); + const float hi = max(max(max(n, s), max(e, w)), m), lo = min(min(min(n, s), min(e, w)), m); + const float range = hi - lo; + // (FXAA's high-quality thresholds: with 0.125 / 0.0312 it also took the moss, cloth and leaf textures for edges and + // softened them) + if (range < max(0.0833, hi * 0.166)) return rgbM; // (no edge: flat areas and fine textures keep their plain sample) + const float nw = L(uv - px), se = L(uv + px), ne = L(uv + vec2(px.x, -px.y)), sw = L(uv + vec2(-px.x, px.y)); + const float ns = n + s, we = w + e, nesw = ne + sw + nw + se; + const float edge_h = abs(-2.0 * w + nw + sw) + abs(-2.0 * m + ns) * 2.0 + abs(-2.0 * e + ne + se); + const float edge_v = abs(-2.0 * s + sw + se) + abs(-2.0 * m + we) * 2.0 + abs(-2.0 * n + nw + ne); + const bool horz = edge_h >= edge_v; + if (!horz) n = w, s = e; + float step = horz ? px.y : px.x; + const float grad_n = n - m, grad_s = s - m; + const bool pair_n = abs(grad_n) >= abs(grad_s); + const float grad = max(abs(grad_n), abs(grad_s)) * 0.25; + if (pair_n) step = -step; + const float edge_luma = (pair_n ? n + m : s + m) * 0.5; + vec2 pos = uv; + if (horz) pos.y += step * 0.5; else pos.x += step * 0.5; + const vec2 along = horz ? vec2(px.x, 0.0) : vec2(0.0, px.y); + vec2 pn = pos - along, pp = pos + along; + float end_n = L(pn) - edge_luma, end_p = L(pp) - edge_luma; + bool done_n = abs(end_n) >= grad, done_p = abs(end_p) >= grad; + const float q[11] = float[](1.5, 2.0, 2.0, 2.0, 2.0, 4.0, 8.0, 8.0, 8.0, 8.0, 8.0); + for (int i = 0; i < 11 && !(done_n && done_p); i++) { + if (!done_n) { pn -= along * q[i]; end_n = L(pn) - edge_luma; done_n = abs(end_n) >= grad; } + if (!done_p) { pp += along * q[i]; end_p = L(pp) - edge_luma; done_p = abs(end_p) >= grad; } + } + const float dn = horz ? uv.x - pn.x : uv.y - pn.y, dp = horz ? pp.x - uv.x : pp.y - uv.y; + const bool below = m - edge_luma < 0.0; + const bool good = dn < dp ? (end_n < 0.0) != below : (end_p < 0.0) != below; + const float span_off = good ? 0.5 - min(dn, dp) / (dn + dp) : 0.0; + const float sub = clamp(abs((ns * 2.0 + we * 2.0 + nesw) / 12.0 - m) / range, 0.0, 1.0); + const float sub_f = (-2.0 * sub + 3.0) * sub * sub; + const float sub_off = sub_f * sub_f * 0.5; // (half the blend of FXAA's default 0.75: textures stay sharper) + const float off = max(span_off, sub_off); + if (horz) uv.y += off * step; else uv.x += off * step; + moved = span_off >= 0.1 && span_off >= sub_off ? 1 : sub_off >= 0.1 ? 2 : 0; // (1: along an edge, 2: sub-pixel) + return textureLod(src, uv, 0.0).rgb; +} void main() { const ivec2 g = ivec2(gl_GlobalInvocationID.xy); if (any(greaterThanEqual(g, pc.size))) return; const vec2 uv = (vec2(g) + 0.5) / vec2(pc.size); // (the input is the square root of the scene colour, the network's perceptual encoding, which its output undoes: // 6637ac1d's means 0.58 0.50 0.27 -> 0.77 0.69 0.49) - const vec3 s = textureLod(src, uv, 0.0).rgb; + vec3 s = textureLod(src, uv, 0.0).rgb; + int moved = 0; + if ((pc.valid & 2) != 0) s = fxaa(uv, s, moved); + // (RX_VK_TAAU_FXAA=2: the pixels it moved by a tenth of a texel or more: red along an edge, blue the sub-pixel blend) + if ((pc.valid & 4) != 0 && moved != 0) s = moved == 1 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 0.3, 1.0); vec3 c = s * s; - if (pc.valid != 0) { + if ((pc.valid & 1) != 0) { const vec3 p = imageLoad(hist, g).rgb; c = mix(c, p, bvec3(isnan(c.r) || isinf(c.r), isnan(c.g) || isinf(c.g), isnan(c.b) || isinf(c.b))); c = clamp(c, p * 0.6, p * 1.5 + 0.01); diff --git a/gpu/vk/shaders/taau_upscale_comp_spv.h b/gpu/vk/shaders/taau_upscale_comp_spv.h index 7c1365d71..cbdbe761a 100644 --- a/gpu/vk/shaders/taau_upscale_comp_spv.h +++ b/gpu/vk/shaders/taau_upscale_comp_spv.h @@ -1,108 +1,509 @@ // 1116.6.0 #pragma once const uint32_t TAAU_UPSCALE_COMP_SPV[] = { - 0x07230203,0x00010600,0x0008000b,0x00000092,0x00000000,0x00020011,0x00000001,0x00020011, - 0x00000031,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e, - 0x00000000,0x00000001,0x000a000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d, - 0x00000015,0x00000034,0x00000049,0x00000080,0x00060010,0x00000004,0x00000011,0x00000008, - 0x00000008,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, - 0x00000000,0x00030005,0x00000009,0x00000067,0x00080005,0x0000000d,0x475f6c67,0x61626f6c, - 0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005,0x00000013,0x00000050,0x00050006, - 0x00000013,0x00000000,0x657a6973,0x00000000,0x00050006,0x00000013,0x00000001,0x696c6176, - 0x00000064,0x00030005,0x00000015,0x00006370,0x00030005,0x00000024,0x00007675,0x00030005, - 0x00000030,0x00000073,0x00030005,0x00000034,0x00637273,0x00030005,0x0000003b,0x00000063, - 0x00030005,0x00000046,0x00000070,0x00040005,0x00000049,0x74736968,0x00000000,0x00030005, - 0x00000080,0x00747364,0x00040047,0x0000000d,0x0000000b,0x0000001c,0x00030047,0x00000013, - 0x00000002,0x00050048,0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013, - 0x00000001,0x00000023,0x00000008,0x00040047,0x00000034,0x00000021,0x00000000,0x00040047, - 0x00000034,0x00000022,0x00000000,0x00040047,0x00000049,0x00000021,0x00000002,0x00040047, - 0x00000049,0x00000022,0x00000000,0x00030047,0x00000080,0x00000019,0x00040047,0x00000080, - 0x00000021,0x00000001,0x00040047,0x00000080,0x00000022,0x00000000,0x00020013,0x00000002, - 0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040017, - 0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,0x00000007,0x00000007,0x00040015, - 0x0000000a,0x00000020,0x00000000,0x00040017,0x0000000b,0x0000000a,0x00000003,0x00040020, - 0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017, - 0x0000000e,0x0000000a,0x00000002,0x0004001e,0x00000013,0x00000007,0x00000006,0x00040020, - 0x00000014,0x00000009,0x00000013,0x0004003b,0x00000014,0x00000015,0x00000009,0x0004002b, - 0x00000006,0x00000016,0x00000000,0x00040020,0x00000017,0x00000009,0x00000007,0x00020014, - 0x0000001a,0x00040017,0x0000001b,0x0000001a,0x00000002,0x00030016,0x00000021,0x00000020, - 0x00040017,0x00000022,0x00000021,0x00000002,0x00040020,0x00000023,0x00000007,0x00000022, - 0x0004002b,0x00000021,0x00000027,0x3f000000,0x00040017,0x0000002e,0x00000021,0x00000003, - 0x00040020,0x0000002f,0x00000007,0x0000002e,0x00090019,0x00000031,0x00000021,0x00000001, - 0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x00000032,0x00000031, - 0x00040020,0x00000033,0x00000000,0x00000032,0x0004003b,0x00000033,0x00000034,0x00000000, - 0x0004002b,0x00000021,0x00000037,0x00000000,0x00040017,0x00000038,0x00000021,0x00000004, - 0x0004002b,0x00000006,0x0000003f,0x00000001,0x00040020,0x00000040,0x00000009,0x00000006, - 0x00090019,0x00000047,0x00000021,0x00000001,0x00000000,0x00000000,0x00000000,0x00000002, - 0x00000008,0x00040020,0x00000048,0x00000000,0x00000047,0x0004003b,0x00000048,0x00000049, - 0x00000000,0x0004002b,0x0000000a,0x00000050,0x00000000,0x00040020,0x00000051,0x00000007, - 0x00000021,0x0004002b,0x0000000a,0x0000005c,0x00000001,0x0004002b,0x0000000a,0x00000067, - 0x00000002,0x00040017,0x00000072,0x0000001a,0x00000003,0x0004002b,0x00000021,0x00000077, - 0x3f19999a,0x0004002b,0x00000021,0x0000007a,0x3fc00000,0x0004002b,0x00000021,0x0000007c, - 0x3c23d70a,0x0004003b,0x00000048,0x00000080,0x00000000,0x0004002b,0x00000021,0x00000084, - 0x3f800000,0x0004002b,0x0000000a,0x00000090,0x00000008,0x0006002c,0x0000000b,0x00000091, - 0x00000090,0x00000090,0x0000005c,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003, - 0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003b,0x00000023, - 0x00000024,0x00000007,0x0004003b,0x0000002f,0x00000030,0x00000007,0x0004003b,0x0000002f, - 0x0000003b,0x00000007,0x0004003b,0x0000002f,0x00000046,0x00000007,0x0004003d,0x0000000b, - 0x0000000f,0x0000000d,0x0007004f,0x0000000e,0x00000010,0x0000000f,0x0000000f,0x00000000, - 0x00000001,0x0004007c,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011, - 0x0004003d,0x00000007,0x00000012,0x00000009,0x00050041,0x00000017,0x00000018,0x00000015, - 0x00000016,0x0004003d,0x00000007,0x00000019,0x00000018,0x000500af,0x0000001b,0x0000001c, - 0x00000012,0x00000019,0x0004009a,0x0000001a,0x0000001d,0x0000001c,0x000300f7,0x0000001f, - 0x00000000,0x000400fa,0x0000001d,0x0000001e,0x0000001f,0x000200f8,0x0000001e,0x000100fd, - 0x000200f8,0x0000001f,0x0004003d,0x00000007,0x00000025,0x00000009,0x0004006f,0x00000022, - 0x00000026,0x00000025,0x00050050,0x00000022,0x00000028,0x00000027,0x00000027,0x00050081, - 0x00000022,0x00000029,0x00000026,0x00000028,0x00050041,0x00000017,0x0000002a,0x00000015, - 0x00000016,0x0004003d,0x00000007,0x0000002b,0x0000002a,0x0004006f,0x00000022,0x0000002c, - 0x0000002b,0x00050088,0x00000022,0x0000002d,0x00000029,0x0000002c,0x0003003e,0x00000024, - 0x0000002d,0x0004003d,0x00000032,0x00000035,0x00000034,0x0004003d,0x00000022,0x00000036, - 0x00000024,0x00070058,0x00000038,0x00000039,0x00000035,0x00000036,0x00000002,0x00000037, - 0x0008004f,0x0000002e,0x0000003a,0x00000039,0x00000039,0x00000000,0x00000001,0x00000002, - 0x0003003e,0x00000030,0x0000003a,0x0004003d,0x0000002e,0x0000003c,0x00000030,0x0004003d, - 0x0000002e,0x0000003d,0x00000030,0x00050085,0x0000002e,0x0000003e,0x0000003c,0x0000003d, - 0x0003003e,0x0000003b,0x0000003e,0x00050041,0x00000040,0x00000041,0x00000015,0x0000003f, - 0x0004003d,0x00000006,0x00000042,0x00000041,0x000500ab,0x0000001a,0x00000043,0x00000042, - 0x00000016,0x000300f7,0x00000045,0x00000000,0x000400fa,0x00000043,0x00000044,0x00000045, - 0x000200f8,0x00000044,0x0004003d,0x00000047,0x0000004a,0x00000049,0x0004003d,0x00000007, - 0x0000004b,0x00000009,0x00050062,0x00000038,0x0000004c,0x0000004a,0x0000004b,0x0008004f, - 0x0000002e,0x0000004d,0x0000004c,0x0000004c,0x00000000,0x00000001,0x00000002,0x0003003e, - 0x00000046,0x0000004d,0x0004003d,0x0000002e,0x0000004e,0x0000003b,0x0004003d,0x0000002e, - 0x0000004f,0x00000046,0x00050041,0x00000051,0x00000052,0x0000003b,0x00000050,0x0004003d, - 0x00000021,0x00000053,0x00000052,0x0004009c,0x0000001a,0x00000054,0x00000053,0x000400a8, - 0x0000001a,0x00000055,0x00000054,0x000300f7,0x00000057,0x00000000,0x000400fa,0x00000055, - 0x00000056,0x00000057,0x000200f8,0x00000056,0x00050041,0x00000051,0x00000058,0x0000003b, - 0x00000050,0x0004003d,0x00000021,0x00000059,0x00000058,0x0004009d,0x0000001a,0x0000005a, - 0x00000059,0x000200f9,0x00000057,0x000200f8,0x00000057,0x000700f5,0x0000001a,0x0000005b, - 0x00000054,0x00000044,0x0000005a,0x00000056,0x00050041,0x00000051,0x0000005d,0x0000003b, - 0x0000005c,0x0004003d,0x00000021,0x0000005e,0x0000005d,0x0004009c,0x0000001a,0x0000005f, - 0x0000005e,0x000400a8,0x0000001a,0x00000060,0x0000005f,0x000300f7,0x00000062,0x00000000, - 0x000400fa,0x00000060,0x00000061,0x00000062,0x000200f8,0x00000061,0x00050041,0x00000051, - 0x00000063,0x0000003b,0x0000005c,0x0004003d,0x00000021,0x00000064,0x00000063,0x0004009d, - 0x0000001a,0x00000065,0x00000064,0x000200f9,0x00000062,0x000200f8,0x00000062,0x000700f5, - 0x0000001a,0x00000066,0x0000005f,0x00000057,0x00000065,0x00000061,0x00050041,0x00000051, - 0x00000068,0x0000003b,0x00000067,0x0004003d,0x00000021,0x00000069,0x00000068,0x0004009c, - 0x0000001a,0x0000006a,0x00000069,0x000400a8,0x0000001a,0x0000006b,0x0000006a,0x000300f7, - 0x0000006d,0x00000000,0x000400fa,0x0000006b,0x0000006c,0x0000006d,0x000200f8,0x0000006c, - 0x00050041,0x00000051,0x0000006e,0x0000003b,0x00000067,0x0004003d,0x00000021,0x0000006f, - 0x0000006e,0x0004009d,0x0000001a,0x00000070,0x0000006f,0x000200f9,0x0000006d,0x000200f8, - 0x0000006d,0x000700f5,0x0000001a,0x00000071,0x0000006a,0x00000062,0x00000070,0x0000006c, - 0x00060050,0x00000072,0x00000073,0x0000005b,0x00000066,0x00000071,0x000600a9,0x0000002e, - 0x00000074,0x00000073,0x0000004f,0x0000004e,0x0003003e,0x0000003b,0x00000074,0x0004003d, - 0x0000002e,0x00000075,0x0000003b,0x0004003d,0x0000002e,0x00000076,0x00000046,0x0005008e, - 0x0000002e,0x00000078,0x00000076,0x00000077,0x0004003d,0x0000002e,0x00000079,0x00000046, - 0x0005008e,0x0000002e,0x0000007b,0x00000079,0x0000007a,0x00060050,0x0000002e,0x0000007d, - 0x0000007c,0x0000007c,0x0000007c,0x00050081,0x0000002e,0x0000007e,0x0000007b,0x0000007d, - 0x0008000c,0x0000002e,0x0000007f,0x00000001,0x0000002b,0x00000075,0x00000078,0x0000007e, - 0x0003003e,0x0000003b,0x0000007f,0x000200f9,0x00000045,0x000200f8,0x00000045,0x0004003d, - 0x00000047,0x00000081,0x00000080,0x0004003d,0x00000007,0x00000082,0x00000009,0x0004003d, - 0x0000002e,0x00000083,0x0000003b,0x00050051,0x00000021,0x00000085,0x00000083,0x00000000, - 0x00050051,0x00000021,0x00000086,0x00000083,0x00000001,0x00050051,0x00000021,0x00000087, - 0x00000083,0x00000002,0x00070050,0x00000038,0x00000088,0x00000085,0x00000086,0x00000087, - 0x00000084,0x00040063,0x00000081,0x00000082,0x00000088,0x0004003d,0x00000047,0x00000089, - 0x00000049,0x0004003d,0x00000007,0x0000008a,0x00000009,0x0004003d,0x0000002e,0x0000008b, - 0x0000003b,0x00050051,0x00000021,0x0000008c,0x0000008b,0x00000000,0x00050051,0x00000021, - 0x0000008d,0x0000008b,0x00000001,0x00050051,0x00000021,0x0000008e,0x0000008b,0x00000002, - 0x00070050,0x00000038,0x0000008f,0x0000008c,0x0000008d,0x0000008e,0x00000084,0x00040063, - 0x00000089,0x0000008a,0x0000008f,0x000100fd,0x00010038 + 0x07230203,0x00010600,0x0008000b,0x000002d1,0x00000000,0x00020011,0x00000001,0x00020011, + 0x00000031,0x00020011,0x00000032,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e, + 0x00000000,0x0003000e,0x00000000,0x00000001,0x000a000f,0x00000005,0x00000004,0x6e69616d, + 0x00000000,0x00000026,0x00000241,0x00000249,0x0000028d,0x000002c0,0x00060010,0x00000004, + 0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00050005,0x0000000b,0x616d756c,0x33667628,0x0000003b, + 0x00030005,0x0000000a,0x00000063,0x00040005,0x00000011,0x6676284c,0x00003b32,0x00030005, + 0x00000010,0x00007675,0x00070005,0x00000019,0x61617866,0x32667628,0x3366763b,0x3b31693b, + 0x00000000,0x00030005,0x00000016,0x00007675,0x00040005,0x00000017,0x4d626772,0x00000000, + 0x00040005,0x00000018,0x65766f6d,0x00000064,0x00030005,0x00000026,0x00637273,0x00040005, + 0x0000002c,0x61726170,0x0000006d,0x00030005,0x00000032,0x00007870,0x00030005,0x0000003c, + 0x0000006d,0x00040005,0x0000003d,0x61726170,0x0000006d,0x00030005,0x00000040,0x0000006e, + 0x00040005,0x00000049,0x61726170,0x0000006d,0x00030005,0x0000004b,0x00000073,0x00040005, + 0x00000051,0x61726170,0x0000006d,0x00030005,0x00000053,0x00000065,0x00040005,0x0000005a, + 0x61726170,0x0000006d,0x00030005,0x0000005c,0x00000077,0x00040005,0x00000063,0x61726170, + 0x0000006d,0x00030005,0x00000065,0x00006968,0x00030005,0x0000006f,0x00006f6c,0x00040005, + 0x00000079,0x676e6172,0x00000065,0x00030005,0x00000089,0x0000776e,0x00040005,0x0000008d, + 0x61726170,0x0000006d,0x00030005,0x0000008f,0x00006573,0x00040005,0x00000093,0x61726170, + 0x0000006d,0x00030005,0x00000095,0x0000656e,0x00040005,0x0000009e,0x61726170,0x0000006d, + 0x00030005,0x000000a0,0x00007773,0x00040005,0x000000a9,0x61726170,0x0000006d,0x00030005, + 0x000000ab,0x0000736e,0x00030005,0x000000af,0x00006577,0x00040005,0x000000b3,0x7773656e, + 0x00000000,0x00040005,0x000000bb,0x65676465,0x0000685f,0x00040005,0x000000d4,0x65676465, + 0x0000765f,0x00040005,0x000000ec,0x7a726f68,0x00000000,0x00040005,0x000000f6,0x70657473, + 0x00000000,0x00040005,0x00000101,0x64617267,0x00006e5f,0x00040005,0x00000105,0x64617267, + 0x0000735f,0x00040005,0x00000109,0x72696170,0x00006e5f,0x00040005,0x0000010f,0x64617267, + 0x00000000,0x00050005,0x0000011c,0x65676465,0x6d756c5f,0x00000061,0x00030005,0x0000012b, + 0x00736f70,0x00040005,0x0000013d,0x6e6f6c61,0x00000067,0x00030005,0x0000014a,0x00006e70, + 0x00030005,0x0000014e,0x00007070,0x00040005,0x00000152,0x5f646e65,0x0000006e,0x00040005, + 0x00000153,0x61726170,0x0000006d,0x00040005,0x00000158,0x5f646e65,0x00000070,0x00040005, + 0x00000159,0x61726170,0x0000006d,0x00040005,0x0000015e,0x656e6f64,0x00006e5f,0x00040005, + 0x00000163,0x656e6f64,0x0000705f,0x00030005,0x00000168,0x00000069,0x00050005,0x00000185, + 0x65646e69,0x6c626178,0x00000065,0x00040005,0x0000018b,0x61726170,0x0000006d,0x00050005, + 0x0000019a,0x65646e69,0x6c626178,0x00000065,0x00040005,0x000001a0,0x61726170,0x0000006d, + 0x00030005,0x000001ac,0x00006e64,0x00030005,0x000001bd,0x00007064,0x00040005,0x000001ce, + 0x6f6c6562,0x00000077,0x00040005,0x000001d3,0x646f6f67,0x00000000,0x00050005,0x000001e4, + 0x6e617073,0x66666f5f,0x00000000,0x00030005,0x000001f3,0x00627573,0x00040005,0x00000203, + 0x5f627573,0x00000066,0x00040005,0x0000020c,0x5f627573,0x0066666f,0x00030005,0x00000211, + 0x0066666f,0x00030005,0x0000023e,0x00000067,0x00080005,0x00000241,0x475f6c67,0x61626f6c, + 0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005,0x00000247,0x00000050,0x00050006, + 0x00000247,0x00000000,0x657a6973,0x00000000,0x00050006,0x00000247,0x00000001,0x696c6176, + 0x00000064,0x00030005,0x00000249,0x00006370,0x00030005,0x00000253,0x00007675,0x00030005, + 0x0000025c,0x00000073,0x00040005,0x00000261,0x65766f6d,0x00000064,0x00040005,0x00000269, + 0x61726170,0x0000006d,0x00040005,0x0000026b,0x61726170,0x0000006d,0x00040005,0x0000026d, + 0x61726170,0x0000006d,0x00030005,0x00000280,0x00000063,0x00030005,0x0000028a,0x00000070, + 0x00040005,0x0000028d,0x74736968,0x00000000,0x00030005,0x000002c0,0x00747364,0x00040047, + 0x00000026,0x00000021,0x00000000,0x00040047,0x00000026,0x00000022,0x00000000,0x00030047, + 0x00000185,0x00000018,0x00030047,0x0000019a,0x00000018,0x00040047,0x00000241,0x0000000b, + 0x0000001c,0x00030047,0x00000247,0x00000002,0x00050048,0x00000247,0x00000000,0x00000023, + 0x00000000,0x00050048,0x00000247,0x00000001,0x00000023,0x00000008,0x00040047,0x0000028d, + 0x00000021,0x00000002,0x00040047,0x0000028d,0x00000022,0x00000000,0x00030047,0x000002c0, + 0x00000019,0x00040047,0x000002c0,0x00000021,0x00000001,0x00040047,0x000002c0,0x00000022, + 0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006, + 0x00000020,0x00040017,0x00000007,0x00000006,0x00000003,0x00040020,0x00000008,0x00000007, + 0x00000007,0x00040021,0x00000009,0x00000006,0x00000008,0x00040017,0x0000000d,0x00000006, + 0x00000002,0x00040020,0x0000000e,0x00000007,0x0000000d,0x00040021,0x0000000f,0x00000006, + 0x0000000e,0x00040015,0x00000013,0x00000020,0x00000001,0x00040020,0x00000014,0x00000007, + 0x00000013,0x00060021,0x00000015,0x00000007,0x0000000e,0x00000008,0x00000014,0x0004002b, + 0x00000006,0x0000001c,0x3e991687,0x0004002b,0x00000006,0x0000001d,0x3f1645a2,0x0004002b, + 0x00000006,0x0000001e,0x3de978d5,0x0006002c,0x00000007,0x0000001f,0x0000001c,0x0000001d, + 0x0000001e,0x00090019,0x00000023,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000, + 0x00000001,0x00000000,0x0003001b,0x00000024,0x00000023,0x00040020,0x00000025,0x00000000, + 0x00000024,0x0004003b,0x00000025,0x00000026,0x00000000,0x0004002b,0x00000006,0x00000029, + 0x00000000,0x00040017,0x0000002a,0x00000006,0x00000004,0x0004002b,0x00000013,0x00000031, + 0x00000000,0x0004002b,0x00000006,0x00000033,0x3f800000,0x00040017,0x00000036,0x00000013, + 0x00000002,0x00040020,0x0000003b,0x00000007,0x00000006,0x00040015,0x00000042,0x00000020, + 0x00000000,0x0004002b,0x00000042,0x00000043,0x00000001,0x0004002b,0x00000042,0x00000055, + 0x00000000,0x0004002b,0x00000006,0x0000007e,0x3daa9931,0x0004002b,0x00000006,0x00000080, + 0x3e29fbe7,0x00020014,0x00000083,0x0004002b,0x00000006,0x000000bc,0xc0000000,0x0004002b, + 0x00000006,0x000000c9,0x40000000,0x00040020,0x000000eb,0x00000007,0x00000083,0x0004002b, + 0x00000006,0x00000115,0x3e800000,0x0004002b,0x00000006,0x00000129,0x3f000000,0x0004002b, + 0x00000013,0x0000016f,0x0000000b,0x0004002b,0x00000042,0x0000017d,0x0000000b,0x0004001c, + 0x0000017e,0x00000006,0x0000017d,0x0004002b,0x00000006,0x0000017f,0x3fc00000,0x0004002b, + 0x00000006,0x00000180,0x40800000,0x0004002b,0x00000006,0x00000181,0x41000000,0x000e002c, + 0x0000017e,0x00000182,0x0000017f,0x000000c9,0x000000c9,0x000000c9,0x000000c9,0x00000180, + 0x00000181,0x00000181,0x00000181,0x00000181,0x00000181,0x00040020,0x00000184,0x00000007, + 0x0000017e,0x0004002b,0x00000013,0x000001aa,0x00000001,0x0004002b,0x00000006,0x000001fb, + 0x41400000,0x0004002b,0x00000006,0x00000206,0x40400000,0x0004002b,0x00000006,0x00000228, + 0x3dcccccd,0x0004002b,0x00000013,0x00000234,0x00000002,0x00040020,0x0000023d,0x00000007, + 0x00000036,0x00040017,0x0000023f,0x00000042,0x00000003,0x00040020,0x00000240,0x00000001, + 0x0000023f,0x0004003b,0x00000240,0x00000241,0x00000001,0x00040017,0x00000242,0x00000042, + 0x00000002,0x0004001e,0x00000247,0x00000036,0x00000013,0x00040020,0x00000248,0x00000009, + 0x00000247,0x0004003b,0x00000248,0x00000249,0x00000009,0x00040020,0x0000024a,0x00000009, + 0x00000036,0x00040017,0x0000024d,0x00000083,0x00000002,0x00040020,0x00000262,0x00000009, + 0x00000013,0x0004002b,0x00000013,0x00000272,0x00000004,0x0006002c,0x00000007,0x0000027c, + 0x00000033,0x00000029,0x00000029,0x0004002b,0x00000006,0x0000027d,0x3e99999a,0x0006002c, + 0x00000007,0x0000027e,0x00000029,0x0000027d,0x00000033,0x00090019,0x0000028b,0x00000006, + 0x00000001,0x00000000,0x00000000,0x00000000,0x00000002,0x00000008,0x00040020,0x0000028c, + 0x00000000,0x0000028b,0x0004003b,0x0000028c,0x0000028d,0x00000000,0x0004002b,0x00000042, + 0x000002a8,0x00000002,0x00040017,0x000002b3,0x00000083,0x00000003,0x0004002b,0x00000006, + 0x000002b8,0x3f19999a,0x0004002b,0x00000006,0x000002bc,0x3c23d70a,0x0004003b,0x0000028c, + 0x000002c0,0x00000000,0x0004002b,0x00000042,0x000002cf,0x00000008,0x0006002c,0x0000023f, + 0x000002d0,0x000002cf,0x000002cf,0x00000043,0x00050036,0x00000002,0x00000004,0x00000000, + 0x00000003,0x000200f8,0x00000005,0x0004003b,0x0000023d,0x0000023e,0x00000007,0x0004003b, + 0x0000000e,0x00000253,0x00000007,0x0004003b,0x00000008,0x0000025c,0x00000007,0x0004003b, + 0x00000014,0x00000261,0x00000007,0x0004003b,0x0000000e,0x00000269,0x00000007,0x0004003b, + 0x00000008,0x0000026b,0x00000007,0x0004003b,0x00000014,0x0000026d,0x00000007,0x0004003b, + 0x00000008,0x00000280,0x00000007,0x0004003b,0x00000008,0x0000028a,0x00000007,0x0004003d, + 0x0000023f,0x00000243,0x00000241,0x0007004f,0x00000242,0x00000244,0x00000243,0x00000243, + 0x00000000,0x00000001,0x0004007c,0x00000036,0x00000245,0x00000244,0x0003003e,0x0000023e, + 0x00000245,0x0004003d,0x00000036,0x00000246,0x0000023e,0x00050041,0x0000024a,0x0000024b, + 0x00000249,0x00000031,0x0004003d,0x00000036,0x0000024c,0x0000024b,0x000500af,0x0000024d, + 0x0000024e,0x00000246,0x0000024c,0x0004009a,0x00000083,0x0000024f,0x0000024e,0x000300f7, + 0x00000251,0x00000000,0x000400fa,0x0000024f,0x00000250,0x00000251,0x000200f8,0x00000250, + 0x000100fd,0x000200f8,0x00000251,0x0004003d,0x00000036,0x00000254,0x0000023e,0x0004006f, + 0x0000000d,0x00000255,0x00000254,0x00050050,0x0000000d,0x00000256,0x00000129,0x00000129, + 0x00050081,0x0000000d,0x00000257,0x00000255,0x00000256,0x00050041,0x0000024a,0x00000258, + 0x00000249,0x00000031,0x0004003d,0x00000036,0x00000259,0x00000258,0x0004006f,0x0000000d, + 0x0000025a,0x00000259,0x00050088,0x0000000d,0x0000025b,0x00000257,0x0000025a,0x0003003e, + 0x00000253,0x0000025b,0x0004003d,0x00000024,0x0000025d,0x00000026,0x0004003d,0x0000000d, + 0x0000025e,0x00000253,0x00070058,0x0000002a,0x0000025f,0x0000025d,0x0000025e,0x00000002, + 0x00000029,0x0008004f,0x00000007,0x00000260,0x0000025f,0x0000025f,0x00000000,0x00000001, + 0x00000002,0x0003003e,0x0000025c,0x00000260,0x0003003e,0x00000261,0x00000031,0x00050041, + 0x00000262,0x00000263,0x00000249,0x000001aa,0x0004003d,0x00000013,0x00000264,0x00000263, + 0x000500c7,0x00000013,0x00000265,0x00000264,0x00000234,0x000500ab,0x00000083,0x00000266, + 0x00000265,0x00000031,0x000300f7,0x00000268,0x00000000,0x000400fa,0x00000266,0x00000267, + 0x00000268,0x000200f8,0x00000267,0x0004003d,0x0000000d,0x0000026a,0x00000253,0x0003003e, + 0x00000269,0x0000026a,0x0004003d,0x00000007,0x0000026c,0x0000025c,0x0003003e,0x0000026b, + 0x0000026c,0x00070039,0x00000007,0x0000026e,0x00000019,0x00000269,0x0000026b,0x0000026d, + 0x0004003d,0x00000013,0x0000026f,0x0000026d,0x0003003e,0x00000261,0x0000026f,0x0003003e, + 0x0000025c,0x0000026e,0x000200f9,0x00000268,0x000200f8,0x00000268,0x00050041,0x00000262, + 0x00000270,0x00000249,0x000001aa,0x0004003d,0x00000013,0x00000271,0x00000270,0x000500c7, + 0x00000013,0x00000273,0x00000271,0x00000272,0x000500ab,0x00000083,0x00000274,0x00000273, + 0x00000031,0x0004003d,0x00000013,0x00000275,0x00000261,0x000500ab,0x00000083,0x00000276, + 0x00000275,0x00000031,0x000500a7,0x00000083,0x00000277,0x00000274,0x00000276,0x000300f7, + 0x00000279,0x00000000,0x000400fa,0x00000277,0x00000278,0x00000279,0x000200f8,0x00000278, + 0x0004003d,0x00000013,0x0000027a,0x00000261,0x000500aa,0x00000083,0x0000027b,0x0000027a, + 0x000001aa,0x000600a9,0x00000007,0x0000027f,0x0000027b,0x0000027c,0x0000027e,0x0003003e, + 0x0000025c,0x0000027f,0x000200f9,0x00000279,0x000200f8,0x00000279,0x0004003d,0x00000007, + 0x00000281,0x0000025c,0x0004003d,0x00000007,0x00000282,0x0000025c,0x00050085,0x00000007, + 0x00000283,0x00000281,0x00000282,0x0003003e,0x00000280,0x00000283,0x00050041,0x00000262, + 0x00000284,0x00000249,0x000001aa,0x0004003d,0x00000013,0x00000285,0x00000284,0x000500c7, + 0x00000013,0x00000286,0x00000285,0x000001aa,0x000500ab,0x00000083,0x00000287,0x00000286, + 0x00000031,0x000300f7,0x00000289,0x00000000,0x000400fa,0x00000287,0x00000288,0x00000289, + 0x000200f8,0x00000288,0x0004003d,0x0000028b,0x0000028e,0x0000028d,0x0004003d,0x00000036, + 0x0000028f,0x0000023e,0x00050062,0x0000002a,0x00000290,0x0000028e,0x0000028f,0x0008004f, + 0x00000007,0x00000291,0x00000290,0x00000290,0x00000000,0x00000001,0x00000002,0x0003003e, + 0x0000028a,0x00000291,0x0004003d,0x00000007,0x00000292,0x00000280,0x0004003d,0x00000007, + 0x00000293,0x0000028a,0x00050041,0x0000003b,0x00000294,0x00000280,0x00000055,0x0004003d, + 0x00000006,0x00000295,0x00000294,0x0004009c,0x00000083,0x00000296,0x00000295,0x000400a8, + 0x00000083,0x00000297,0x00000296,0x000300f7,0x00000299,0x00000000,0x000400fa,0x00000297, + 0x00000298,0x00000299,0x000200f8,0x00000298,0x00050041,0x0000003b,0x0000029a,0x00000280, + 0x00000055,0x0004003d,0x00000006,0x0000029b,0x0000029a,0x0004009d,0x00000083,0x0000029c, + 0x0000029b,0x000200f9,0x00000299,0x000200f8,0x00000299,0x000700f5,0x00000083,0x0000029d, + 0x00000296,0x00000288,0x0000029c,0x00000298,0x00050041,0x0000003b,0x0000029e,0x00000280, + 0x00000043,0x0004003d,0x00000006,0x0000029f,0x0000029e,0x0004009c,0x00000083,0x000002a0, + 0x0000029f,0x000400a8,0x00000083,0x000002a1,0x000002a0,0x000300f7,0x000002a3,0x00000000, + 0x000400fa,0x000002a1,0x000002a2,0x000002a3,0x000200f8,0x000002a2,0x00050041,0x0000003b, + 0x000002a4,0x00000280,0x00000043,0x0004003d,0x00000006,0x000002a5,0x000002a4,0x0004009d, + 0x00000083,0x000002a6,0x000002a5,0x000200f9,0x000002a3,0x000200f8,0x000002a3,0x000700f5, + 0x00000083,0x000002a7,0x000002a0,0x00000299,0x000002a6,0x000002a2,0x00050041,0x0000003b, + 0x000002a9,0x00000280,0x000002a8,0x0004003d,0x00000006,0x000002aa,0x000002a9,0x0004009c, + 0x00000083,0x000002ab,0x000002aa,0x000400a8,0x00000083,0x000002ac,0x000002ab,0x000300f7, + 0x000002ae,0x00000000,0x000400fa,0x000002ac,0x000002ad,0x000002ae,0x000200f8,0x000002ad, + 0x00050041,0x0000003b,0x000002af,0x00000280,0x000002a8,0x0004003d,0x00000006,0x000002b0, + 0x000002af,0x0004009d,0x00000083,0x000002b1,0x000002b0,0x000200f9,0x000002ae,0x000200f8, + 0x000002ae,0x000700f5,0x00000083,0x000002b2,0x000002ab,0x000002a3,0x000002b1,0x000002ad, + 0x00060050,0x000002b3,0x000002b4,0x0000029d,0x000002a7,0x000002b2,0x000600a9,0x00000007, + 0x000002b5,0x000002b4,0x00000293,0x00000292,0x0003003e,0x00000280,0x000002b5,0x0004003d, + 0x00000007,0x000002b6,0x00000280,0x0004003d,0x00000007,0x000002b7,0x0000028a,0x0005008e, + 0x00000007,0x000002b9,0x000002b7,0x000002b8,0x0004003d,0x00000007,0x000002ba,0x0000028a, + 0x0005008e,0x00000007,0x000002bb,0x000002ba,0x0000017f,0x00060050,0x00000007,0x000002bd, + 0x000002bc,0x000002bc,0x000002bc,0x00050081,0x00000007,0x000002be,0x000002bb,0x000002bd, + 0x0008000c,0x00000007,0x000002bf,0x00000001,0x0000002b,0x000002b6,0x000002b9,0x000002be, + 0x0003003e,0x00000280,0x000002bf,0x000200f9,0x00000289,0x000200f8,0x00000289,0x0004003d, + 0x0000028b,0x000002c1,0x000002c0,0x0004003d,0x00000036,0x000002c2,0x0000023e,0x0004003d, + 0x00000007,0x000002c3,0x00000280,0x00050051,0x00000006,0x000002c4,0x000002c3,0x00000000, + 0x00050051,0x00000006,0x000002c5,0x000002c3,0x00000001,0x00050051,0x00000006,0x000002c6, + 0x000002c3,0x00000002,0x00070050,0x0000002a,0x000002c7,0x000002c4,0x000002c5,0x000002c6, + 0x00000033,0x00040063,0x000002c1,0x000002c2,0x000002c7,0x0004003d,0x0000028b,0x000002c8, + 0x0000028d,0x0004003d,0x00000036,0x000002c9,0x0000023e,0x0004003d,0x00000007,0x000002ca, + 0x00000280,0x00050051,0x00000006,0x000002cb,0x000002ca,0x00000000,0x00050051,0x00000006, + 0x000002cc,0x000002ca,0x00000001,0x00050051,0x00000006,0x000002cd,0x000002ca,0x00000002, + 0x00070050,0x0000002a,0x000002ce,0x000002cb,0x000002cc,0x000002cd,0x00000033,0x00040063, + 0x000002c8,0x000002c9,0x000002ce,0x000100fd,0x00010038,0x00050036,0x00000006,0x0000000b, + 0x00000000,0x00000009,0x00030037,0x00000008,0x0000000a,0x000200f8,0x0000000c,0x0004003d, + 0x00000007,0x0000001b,0x0000000a,0x00050094,0x00000006,0x00000020,0x0000001b,0x0000001f, + 0x000200fe,0x00000020,0x00010038,0x00050036,0x00000006,0x00000011,0x00000000,0x0000000f, + 0x00030037,0x0000000e,0x00000010,0x000200f8,0x00000012,0x0004003b,0x00000008,0x0000002c, + 0x00000007,0x0004003d,0x00000024,0x00000027,0x00000026,0x0004003d,0x0000000d,0x00000028, + 0x00000010,0x00070058,0x0000002a,0x0000002b,0x00000027,0x00000028,0x00000002,0x00000029, + 0x0008004f,0x00000007,0x0000002d,0x0000002b,0x0000002b,0x00000000,0x00000001,0x00000002, + 0x0003003e,0x0000002c,0x0000002d,0x00050039,0x00000006,0x0000002e,0x0000000b,0x0000002c, + 0x000200fe,0x0000002e,0x00010038,0x00050036,0x00000007,0x00000019,0x00000000,0x00000015, + 0x00030037,0x0000000e,0x00000016,0x00030037,0x00000008,0x00000017,0x00030037,0x00000014, + 0x00000018,0x000200f8,0x0000001a,0x0004003b,0x0000000e,0x00000032,0x00000007,0x0004003b, + 0x0000003b,0x0000003c,0x00000007,0x0004003b,0x00000008,0x0000003d,0x00000007,0x0004003b, + 0x0000003b,0x00000040,0x00000007,0x0004003b,0x0000000e,0x00000049,0x00000007,0x0004003b, + 0x0000003b,0x0000004b,0x00000007,0x0004003b,0x0000000e,0x00000051,0x00000007,0x0004003b, + 0x0000003b,0x00000053,0x00000007,0x0004003b,0x0000000e,0x0000005a,0x00000007,0x0004003b, + 0x0000003b,0x0000005c,0x00000007,0x0004003b,0x0000000e,0x00000063,0x00000007,0x0004003b, + 0x0000003b,0x00000065,0x00000007,0x0004003b,0x0000003b,0x0000006f,0x00000007,0x0004003b, + 0x0000003b,0x00000079,0x00000007,0x0004003b,0x0000003b,0x00000089,0x00000007,0x0004003b, + 0x0000000e,0x0000008d,0x00000007,0x0004003b,0x0000003b,0x0000008f,0x00000007,0x0004003b, + 0x0000000e,0x00000093,0x00000007,0x0004003b,0x0000003b,0x00000095,0x00000007,0x0004003b, + 0x0000000e,0x0000009e,0x00000007,0x0004003b,0x0000003b,0x000000a0,0x00000007,0x0004003b, + 0x0000000e,0x000000a9,0x00000007,0x0004003b,0x0000003b,0x000000ab,0x00000007,0x0004003b, + 0x0000003b,0x000000af,0x00000007,0x0004003b,0x0000003b,0x000000b3,0x00000007,0x0004003b, + 0x0000003b,0x000000bb,0x00000007,0x0004003b,0x0000003b,0x000000d4,0x00000007,0x0004003b, + 0x000000eb,0x000000ec,0x00000007,0x0004003b,0x0000003b,0x000000f6,0x00000007,0x0004003b, + 0x0000003b,0x000000f8,0x00000007,0x0004003b,0x0000003b,0x00000101,0x00000007,0x0004003b, + 0x0000003b,0x00000105,0x00000007,0x0004003b,0x000000eb,0x00000109,0x00000007,0x0004003b, + 0x0000003b,0x0000010f,0x00000007,0x0004003b,0x0000003b,0x0000011c,0x00000007,0x0004003b, + 0x0000003b,0x0000011e,0x00000007,0x0004003b,0x0000000e,0x0000012b,0x00000007,0x0004003b, + 0x0000000e,0x0000013d,0x00000007,0x0004003b,0x0000000e,0x0000013f,0x00000007,0x0004003b, + 0x0000000e,0x0000014a,0x00000007,0x0004003b,0x0000000e,0x0000014e,0x00000007,0x0004003b, + 0x0000003b,0x00000152,0x00000007,0x0004003b,0x0000000e,0x00000153,0x00000007,0x0004003b, + 0x0000003b,0x00000158,0x00000007,0x0004003b,0x0000000e,0x00000159,0x00000007,0x0004003b, + 0x000000eb,0x0000015e,0x00000007,0x0004003b,0x000000eb,0x00000163,0x00000007,0x0004003b, + 0x00000014,0x00000168,0x00000007,0x0005003b,0x00000184,0x00000185,0x00000007,0x00000182, + 0x0004003b,0x0000000e,0x0000018b,0x00000007,0x0005003b,0x00000184,0x0000019a,0x00000007, + 0x00000182,0x0004003b,0x0000000e,0x000001a0,0x00000007,0x0004003b,0x0000003b,0x000001ac, + 0x00000007,0x0004003b,0x0000003b,0x000001ae,0x00000007,0x0004003b,0x0000003b,0x000001bd, + 0x00000007,0x0004003b,0x0000003b,0x000001bf,0x00000007,0x0004003b,0x000000eb,0x000001ce, + 0x00000007,0x0004003b,0x000000eb,0x000001d3,0x00000007,0x0004003b,0x000000eb,0x000001d7, + 0x00000007,0x0004003b,0x0000003b,0x000001e4,0x00000007,0x0004003b,0x0000003b,0x000001e6, + 0x00000007,0x0004003b,0x0000003b,0x000001f3,0x00000007,0x0004003b,0x0000003b,0x00000203, + 0x00000007,0x0004003b,0x0000003b,0x0000020c,0x00000007,0x0004003b,0x0000003b,0x00000211, + 0x00000007,0x0004003b,0x00000014,0x0000022e,0x00000007,0x0003003e,0x00000018,0x00000031, + 0x0004003d,0x00000024,0x00000034,0x00000026,0x00040064,0x00000023,0x00000035,0x00000034, + 0x00050067,0x00000036,0x00000037,0x00000035,0x00000031,0x0004006f,0x0000000d,0x00000038, + 0x00000037,0x00050050,0x0000000d,0x00000039,0x00000033,0x00000033,0x00050088,0x0000000d, + 0x0000003a,0x00000039,0x00000038,0x0003003e,0x00000032,0x0000003a,0x0004003d,0x00000007, + 0x0000003e,0x00000017,0x0003003e,0x0000003d,0x0000003e,0x00050039,0x00000006,0x0000003f, + 0x0000000b,0x0000003d,0x0003003e,0x0000003c,0x0000003f,0x0004003d,0x0000000d,0x00000041, + 0x00000016,0x00050041,0x0000003b,0x00000044,0x00000032,0x00000043,0x0004003d,0x00000006, + 0x00000045,0x00000044,0x0004007f,0x00000006,0x00000046,0x00000045,0x00050050,0x0000000d, + 0x00000047,0x00000029,0x00000046,0x00050081,0x0000000d,0x00000048,0x00000041,0x00000047, + 0x0003003e,0x00000049,0x00000048,0x00050039,0x00000006,0x0000004a,0x00000011,0x00000049, + 0x0003003e,0x00000040,0x0000004a,0x0004003d,0x0000000d,0x0000004c,0x00000016,0x00050041, + 0x0000003b,0x0000004d,0x00000032,0x00000043,0x0004003d,0x00000006,0x0000004e,0x0000004d, + 0x00050050,0x0000000d,0x0000004f,0x00000029,0x0000004e,0x00050081,0x0000000d,0x00000050, + 0x0000004c,0x0000004f,0x0003003e,0x00000051,0x00000050,0x00050039,0x00000006,0x00000052, + 0x00000011,0x00000051,0x0003003e,0x0000004b,0x00000052,0x0004003d,0x0000000d,0x00000054, + 0x00000016,0x00050041,0x0000003b,0x00000056,0x00000032,0x00000055,0x0004003d,0x00000006, + 0x00000057,0x00000056,0x00050050,0x0000000d,0x00000058,0x00000057,0x00000029,0x00050081, + 0x0000000d,0x00000059,0x00000054,0x00000058,0x0003003e,0x0000005a,0x00000059,0x00050039, + 0x00000006,0x0000005b,0x00000011,0x0000005a,0x0003003e,0x00000053,0x0000005b,0x0004003d, + 0x0000000d,0x0000005d,0x00000016,0x00050041,0x0000003b,0x0000005e,0x00000032,0x00000055, + 0x0004003d,0x00000006,0x0000005f,0x0000005e,0x0004007f,0x00000006,0x00000060,0x0000005f, + 0x00050050,0x0000000d,0x00000061,0x00000060,0x00000029,0x00050081,0x0000000d,0x00000062, + 0x0000005d,0x00000061,0x0003003e,0x00000063,0x00000062,0x00050039,0x00000006,0x00000064, + 0x00000011,0x00000063,0x0003003e,0x0000005c,0x00000064,0x0004003d,0x00000006,0x00000066, + 0x00000040,0x0004003d,0x00000006,0x00000067,0x0000004b,0x0007000c,0x00000006,0x00000068, + 0x00000001,0x00000028,0x00000066,0x00000067,0x0004003d,0x00000006,0x00000069,0x00000053, + 0x0004003d,0x00000006,0x0000006a,0x0000005c,0x0007000c,0x00000006,0x0000006b,0x00000001, + 0x00000028,0x00000069,0x0000006a,0x0007000c,0x00000006,0x0000006c,0x00000001,0x00000028, + 0x00000068,0x0000006b,0x0004003d,0x00000006,0x0000006d,0x0000003c,0x0007000c,0x00000006, + 0x0000006e,0x00000001,0x00000028,0x0000006c,0x0000006d,0x0003003e,0x00000065,0x0000006e, + 0x0004003d,0x00000006,0x00000070,0x00000040,0x0004003d,0x00000006,0x00000071,0x0000004b, + 0x0007000c,0x00000006,0x00000072,0x00000001,0x00000025,0x00000070,0x00000071,0x0004003d, + 0x00000006,0x00000073,0x00000053,0x0004003d,0x00000006,0x00000074,0x0000005c,0x0007000c, + 0x00000006,0x00000075,0x00000001,0x00000025,0x00000073,0x00000074,0x0007000c,0x00000006, + 0x00000076,0x00000001,0x00000025,0x00000072,0x00000075,0x0004003d,0x00000006,0x00000077, + 0x0000003c,0x0007000c,0x00000006,0x00000078,0x00000001,0x00000025,0x00000076,0x00000077, + 0x0003003e,0x0000006f,0x00000078,0x0004003d,0x00000006,0x0000007a,0x00000065,0x0004003d, + 0x00000006,0x0000007b,0x0000006f,0x00050083,0x00000006,0x0000007c,0x0000007a,0x0000007b, + 0x0003003e,0x00000079,0x0000007c,0x0004003d,0x00000006,0x0000007d,0x00000079,0x0004003d, + 0x00000006,0x0000007f,0x00000065,0x00050085,0x00000006,0x00000081,0x0000007f,0x00000080, + 0x0007000c,0x00000006,0x00000082,0x00000001,0x00000028,0x0000007e,0x00000081,0x000500b8, + 0x00000083,0x00000084,0x0000007d,0x00000082,0x000300f7,0x00000086,0x00000000,0x000400fa, + 0x00000084,0x00000085,0x00000086,0x000200f8,0x00000085,0x0004003d,0x00000007,0x00000087, + 0x00000017,0x000200fe,0x00000087,0x000200f8,0x00000086,0x0004003d,0x0000000d,0x0000008a, + 0x00000016,0x0004003d,0x0000000d,0x0000008b,0x00000032,0x00050083,0x0000000d,0x0000008c, + 0x0000008a,0x0000008b,0x0003003e,0x0000008d,0x0000008c,0x00050039,0x00000006,0x0000008e, + 0x00000011,0x0000008d,0x0003003e,0x00000089,0x0000008e,0x0004003d,0x0000000d,0x00000090, + 0x00000016,0x0004003d,0x0000000d,0x00000091,0x00000032,0x00050081,0x0000000d,0x00000092, + 0x00000090,0x00000091,0x0003003e,0x00000093,0x00000092,0x00050039,0x00000006,0x00000094, + 0x00000011,0x00000093,0x0003003e,0x0000008f,0x00000094,0x0004003d,0x0000000d,0x00000096, + 0x00000016,0x00050041,0x0000003b,0x00000097,0x00000032,0x00000055,0x0004003d,0x00000006, + 0x00000098,0x00000097,0x00050041,0x0000003b,0x00000099,0x00000032,0x00000043,0x0004003d, + 0x00000006,0x0000009a,0x00000099,0x0004007f,0x00000006,0x0000009b,0x0000009a,0x00050050, + 0x0000000d,0x0000009c,0x00000098,0x0000009b,0x00050081,0x0000000d,0x0000009d,0x00000096, + 0x0000009c,0x0003003e,0x0000009e,0x0000009d,0x00050039,0x00000006,0x0000009f,0x00000011, + 0x0000009e,0x0003003e,0x00000095,0x0000009f,0x0004003d,0x0000000d,0x000000a1,0x00000016, + 0x00050041,0x0000003b,0x000000a2,0x00000032,0x00000055,0x0004003d,0x00000006,0x000000a3, + 0x000000a2,0x0004007f,0x00000006,0x000000a4,0x000000a3,0x00050041,0x0000003b,0x000000a5, + 0x00000032,0x00000043,0x0004003d,0x00000006,0x000000a6,0x000000a5,0x00050050,0x0000000d, + 0x000000a7,0x000000a4,0x000000a6,0x00050081,0x0000000d,0x000000a8,0x000000a1,0x000000a7, + 0x0003003e,0x000000a9,0x000000a8,0x00050039,0x00000006,0x000000aa,0x00000011,0x000000a9, + 0x0003003e,0x000000a0,0x000000aa,0x0004003d,0x00000006,0x000000ac,0x00000040,0x0004003d, + 0x00000006,0x000000ad,0x0000004b,0x00050081,0x00000006,0x000000ae,0x000000ac,0x000000ad, + 0x0003003e,0x000000ab,0x000000ae,0x0004003d,0x00000006,0x000000b0,0x0000005c,0x0004003d, + 0x00000006,0x000000b1,0x00000053,0x00050081,0x00000006,0x000000b2,0x000000b0,0x000000b1, + 0x0003003e,0x000000af,0x000000b2,0x0004003d,0x00000006,0x000000b4,0x00000095,0x0004003d, + 0x00000006,0x000000b5,0x000000a0,0x00050081,0x00000006,0x000000b6,0x000000b4,0x000000b5, + 0x0004003d,0x00000006,0x000000b7,0x00000089,0x00050081,0x00000006,0x000000b8,0x000000b6, + 0x000000b7,0x0004003d,0x00000006,0x000000b9,0x0000008f,0x00050081,0x00000006,0x000000ba, + 0x000000b8,0x000000b9,0x0003003e,0x000000b3,0x000000ba,0x0004003d,0x00000006,0x000000bd, + 0x0000005c,0x00050085,0x00000006,0x000000be,0x000000bc,0x000000bd,0x0004003d,0x00000006, + 0x000000bf,0x00000089,0x00050081,0x00000006,0x000000c0,0x000000be,0x000000bf,0x0004003d, + 0x00000006,0x000000c1,0x000000a0,0x00050081,0x00000006,0x000000c2,0x000000c0,0x000000c1, + 0x0006000c,0x00000006,0x000000c3,0x00000001,0x00000004,0x000000c2,0x0004003d,0x00000006, + 0x000000c4,0x0000003c,0x00050085,0x00000006,0x000000c5,0x000000bc,0x000000c4,0x0004003d, + 0x00000006,0x000000c6,0x000000ab,0x00050081,0x00000006,0x000000c7,0x000000c5,0x000000c6, + 0x0006000c,0x00000006,0x000000c8,0x00000001,0x00000004,0x000000c7,0x00050085,0x00000006, + 0x000000ca,0x000000c8,0x000000c9,0x00050081,0x00000006,0x000000cb,0x000000c3,0x000000ca, + 0x0004003d,0x00000006,0x000000cc,0x00000053,0x00050085,0x00000006,0x000000cd,0x000000bc, + 0x000000cc,0x0004003d,0x00000006,0x000000ce,0x00000095,0x00050081,0x00000006,0x000000cf, + 0x000000cd,0x000000ce,0x0004003d,0x00000006,0x000000d0,0x0000008f,0x00050081,0x00000006, + 0x000000d1,0x000000cf,0x000000d0,0x0006000c,0x00000006,0x000000d2,0x00000001,0x00000004, + 0x000000d1,0x00050081,0x00000006,0x000000d3,0x000000cb,0x000000d2,0x0003003e,0x000000bb, + 0x000000d3,0x0004003d,0x00000006,0x000000d5,0x0000004b,0x00050085,0x00000006,0x000000d6, + 0x000000bc,0x000000d5,0x0004003d,0x00000006,0x000000d7,0x000000a0,0x00050081,0x00000006, + 0x000000d8,0x000000d6,0x000000d7,0x0004003d,0x00000006,0x000000d9,0x0000008f,0x00050081, + 0x00000006,0x000000da,0x000000d8,0x000000d9,0x0006000c,0x00000006,0x000000db,0x00000001, + 0x00000004,0x000000da,0x0004003d,0x00000006,0x000000dc,0x0000003c,0x00050085,0x00000006, + 0x000000dd,0x000000bc,0x000000dc,0x0004003d,0x00000006,0x000000de,0x000000af,0x00050081, + 0x00000006,0x000000df,0x000000dd,0x000000de,0x0006000c,0x00000006,0x000000e0,0x00000001, + 0x00000004,0x000000df,0x00050085,0x00000006,0x000000e1,0x000000e0,0x000000c9,0x00050081, + 0x00000006,0x000000e2,0x000000db,0x000000e1,0x0004003d,0x00000006,0x000000e3,0x00000040, + 0x00050085,0x00000006,0x000000e4,0x000000bc,0x000000e3,0x0004003d,0x00000006,0x000000e5, + 0x00000089,0x00050081,0x00000006,0x000000e6,0x000000e4,0x000000e5,0x0004003d,0x00000006, + 0x000000e7,0x00000095,0x00050081,0x00000006,0x000000e8,0x000000e6,0x000000e7,0x0006000c, + 0x00000006,0x000000e9,0x00000001,0x00000004,0x000000e8,0x00050081,0x00000006,0x000000ea, + 0x000000e2,0x000000e9,0x0003003e,0x000000d4,0x000000ea,0x0004003d,0x00000006,0x000000ed, + 0x000000bb,0x0004003d,0x00000006,0x000000ee,0x000000d4,0x000500be,0x00000083,0x000000ef, + 0x000000ed,0x000000ee,0x0003003e,0x000000ec,0x000000ef,0x0004003d,0x00000083,0x000000f0, + 0x000000ec,0x000400a8,0x00000083,0x000000f1,0x000000f0,0x000300f7,0x000000f3,0x00000000, + 0x000400fa,0x000000f1,0x000000f2,0x000000f3,0x000200f8,0x000000f2,0x0004003d,0x00000006, + 0x000000f4,0x0000005c,0x0003003e,0x00000040,0x000000f4,0x0004003d,0x00000006,0x000000f5, + 0x00000053,0x0003003e,0x0000004b,0x000000f5,0x000200f9,0x000000f3,0x000200f8,0x000000f3, + 0x0004003d,0x00000083,0x000000f7,0x000000ec,0x000300f7,0x000000fa,0x00000000,0x000400fa, + 0x000000f7,0x000000f9,0x000000fd,0x000200f8,0x000000f9,0x00050041,0x0000003b,0x000000fb, + 0x00000032,0x00000043,0x0004003d,0x00000006,0x000000fc,0x000000fb,0x0003003e,0x000000f8, + 0x000000fc,0x000200f9,0x000000fa,0x000200f8,0x000000fd,0x00050041,0x0000003b,0x000000fe, + 0x00000032,0x00000055,0x0004003d,0x00000006,0x000000ff,0x000000fe,0x0003003e,0x000000f8, + 0x000000ff,0x000200f9,0x000000fa,0x000200f8,0x000000fa,0x0004003d,0x00000006,0x00000100, + 0x000000f8,0x0003003e,0x000000f6,0x00000100,0x0004003d,0x00000006,0x00000102,0x00000040, + 0x0004003d,0x00000006,0x00000103,0x0000003c,0x00050083,0x00000006,0x00000104,0x00000102, + 0x00000103,0x0003003e,0x00000101,0x00000104,0x0004003d,0x00000006,0x00000106,0x0000004b, + 0x0004003d,0x00000006,0x00000107,0x0000003c,0x00050083,0x00000006,0x00000108,0x00000106, + 0x00000107,0x0003003e,0x00000105,0x00000108,0x0004003d,0x00000006,0x0000010a,0x00000101, + 0x0006000c,0x00000006,0x0000010b,0x00000001,0x00000004,0x0000010a,0x0004003d,0x00000006, + 0x0000010c,0x00000105,0x0006000c,0x00000006,0x0000010d,0x00000001,0x00000004,0x0000010c, + 0x000500be,0x00000083,0x0000010e,0x0000010b,0x0000010d,0x0003003e,0x00000109,0x0000010e, + 0x0004003d,0x00000006,0x00000110,0x00000101,0x0006000c,0x00000006,0x00000111,0x00000001, + 0x00000004,0x00000110,0x0004003d,0x00000006,0x00000112,0x00000105,0x0006000c,0x00000006, + 0x00000113,0x00000001,0x00000004,0x00000112,0x0007000c,0x00000006,0x00000114,0x00000001, + 0x00000028,0x00000111,0x00000113,0x00050085,0x00000006,0x00000116,0x00000114,0x00000115, + 0x0003003e,0x0000010f,0x00000116,0x0004003d,0x00000083,0x00000117,0x00000109,0x000300f7, + 0x00000119,0x00000000,0x000400fa,0x00000117,0x00000118,0x00000119,0x000200f8,0x00000118, + 0x0004003d,0x00000006,0x0000011a,0x000000f6,0x0004007f,0x00000006,0x0000011b,0x0000011a, + 0x0003003e,0x000000f6,0x0000011b,0x000200f9,0x00000119,0x000200f8,0x00000119,0x0004003d, + 0x00000083,0x0000011d,0x00000109,0x000300f7,0x00000120,0x00000000,0x000400fa,0x0000011d, + 0x0000011f,0x00000124,0x000200f8,0x0000011f,0x0004003d,0x00000006,0x00000121,0x00000040, + 0x0004003d,0x00000006,0x00000122,0x0000003c,0x00050081,0x00000006,0x00000123,0x00000121, + 0x00000122,0x0003003e,0x0000011e,0x00000123,0x000200f9,0x00000120,0x000200f8,0x00000124, + 0x0004003d,0x00000006,0x00000125,0x0000004b,0x0004003d,0x00000006,0x00000126,0x0000003c, + 0x00050081,0x00000006,0x00000127,0x00000125,0x00000126,0x0003003e,0x0000011e,0x00000127, + 0x000200f9,0x00000120,0x000200f8,0x00000120,0x0004003d,0x00000006,0x00000128,0x0000011e, + 0x00050085,0x00000006,0x0000012a,0x00000128,0x00000129,0x0003003e,0x0000011c,0x0000012a, + 0x0004003d,0x0000000d,0x0000012c,0x00000016,0x0003003e,0x0000012b,0x0000012c,0x0004003d, + 0x00000083,0x0000012d,0x000000ec,0x000300f7,0x0000012f,0x00000000,0x000400fa,0x0000012d, + 0x0000012e,0x00000136,0x000200f8,0x0000012e,0x0004003d,0x00000006,0x00000130,0x000000f6, + 0x00050085,0x00000006,0x00000131,0x00000130,0x00000129,0x00050041,0x0000003b,0x00000132, + 0x0000012b,0x00000043,0x0004003d,0x00000006,0x00000133,0x00000132,0x00050081,0x00000006, + 0x00000134,0x00000133,0x00000131,0x00050041,0x0000003b,0x00000135,0x0000012b,0x00000043, + 0x0003003e,0x00000135,0x00000134,0x000200f9,0x0000012f,0x000200f8,0x00000136,0x0004003d, + 0x00000006,0x00000137,0x000000f6,0x00050085,0x00000006,0x00000138,0x00000137,0x00000129, + 0x00050041,0x0000003b,0x00000139,0x0000012b,0x00000055,0x0004003d,0x00000006,0x0000013a, + 0x00000139,0x00050081,0x00000006,0x0000013b,0x0000013a,0x00000138,0x00050041,0x0000003b, + 0x0000013c,0x0000012b,0x00000055,0x0003003e,0x0000013c,0x0000013b,0x000200f9,0x0000012f, + 0x000200f8,0x0000012f,0x0004003d,0x00000083,0x0000013e,0x000000ec,0x000300f7,0x00000141, + 0x00000000,0x000400fa,0x0000013e,0x00000140,0x00000145,0x000200f8,0x00000140,0x00050041, + 0x0000003b,0x00000142,0x00000032,0x00000055,0x0004003d,0x00000006,0x00000143,0x00000142, + 0x00050050,0x0000000d,0x00000144,0x00000143,0x00000029,0x0003003e,0x0000013f,0x00000144, + 0x000200f9,0x00000141,0x000200f8,0x00000145,0x00050041,0x0000003b,0x00000146,0x00000032, + 0x00000043,0x0004003d,0x00000006,0x00000147,0x00000146,0x00050050,0x0000000d,0x00000148, + 0x00000029,0x00000147,0x0003003e,0x0000013f,0x00000148,0x000200f9,0x00000141,0x000200f8, + 0x00000141,0x0004003d,0x0000000d,0x00000149,0x0000013f,0x0003003e,0x0000013d,0x00000149, + 0x0004003d,0x0000000d,0x0000014b,0x0000012b,0x0004003d,0x0000000d,0x0000014c,0x0000013d, + 0x00050083,0x0000000d,0x0000014d,0x0000014b,0x0000014c,0x0003003e,0x0000014a,0x0000014d, + 0x0004003d,0x0000000d,0x0000014f,0x0000012b,0x0004003d,0x0000000d,0x00000150,0x0000013d, + 0x00050081,0x0000000d,0x00000151,0x0000014f,0x00000150,0x0003003e,0x0000014e,0x00000151, + 0x0004003d,0x0000000d,0x00000154,0x0000014a,0x0003003e,0x00000153,0x00000154,0x00050039, + 0x00000006,0x00000155,0x00000011,0x00000153,0x0004003d,0x00000006,0x00000156,0x0000011c, + 0x00050083,0x00000006,0x00000157,0x00000155,0x00000156,0x0003003e,0x00000152,0x00000157, + 0x0004003d,0x0000000d,0x0000015a,0x0000014e,0x0003003e,0x00000159,0x0000015a,0x00050039, + 0x00000006,0x0000015b,0x00000011,0x00000159,0x0004003d,0x00000006,0x0000015c,0x0000011c, + 0x00050083,0x00000006,0x0000015d,0x0000015b,0x0000015c,0x0003003e,0x00000158,0x0000015d, + 0x0004003d,0x00000006,0x0000015f,0x00000152,0x0006000c,0x00000006,0x00000160,0x00000001, + 0x00000004,0x0000015f,0x0004003d,0x00000006,0x00000161,0x0000010f,0x000500be,0x00000083, + 0x00000162,0x00000160,0x00000161,0x0003003e,0x0000015e,0x00000162,0x0004003d,0x00000006, + 0x00000164,0x00000158,0x0006000c,0x00000006,0x00000165,0x00000001,0x00000004,0x00000164, + 0x0004003d,0x00000006,0x00000166,0x0000010f,0x000500be,0x00000083,0x00000167,0x00000165, + 0x00000166,0x0003003e,0x00000163,0x00000167,0x0003003e,0x00000168,0x00000031,0x000200f9, + 0x00000169,0x000200f8,0x00000169,0x000400f6,0x0000016b,0x0000016c,0x00000000,0x000200f9, + 0x0000016d,0x000200f8,0x0000016d,0x0004003d,0x00000013,0x0000016e,0x00000168,0x000500b1, + 0x00000083,0x00000170,0x0000016e,0x0000016f,0x000300f7,0x00000172,0x00000000,0x000400fa, + 0x00000170,0x00000171,0x00000172,0x000200f8,0x00000171,0x0004003d,0x00000083,0x00000173, + 0x0000015e,0x0004003d,0x00000083,0x00000174,0x00000163,0x000500a7,0x00000083,0x00000175, + 0x00000173,0x00000174,0x000400a8,0x00000083,0x00000176,0x00000175,0x000200f9,0x00000172, + 0x000200f8,0x00000172,0x000700f5,0x00000083,0x00000177,0x00000170,0x0000016d,0x00000176, + 0x00000171,0x000400fa,0x00000177,0x0000016a,0x0000016b,0x000200f8,0x0000016a,0x0004003d, + 0x00000083,0x00000178,0x0000015e,0x000400a8,0x00000083,0x00000179,0x00000178,0x000300f7, + 0x0000017b,0x00000000,0x000400fa,0x00000179,0x0000017a,0x0000017b,0x000200f8,0x0000017a, + 0x0004003d,0x0000000d,0x0000017c,0x0000013d,0x0004003d,0x00000013,0x00000183,0x00000168, + 0x00050041,0x0000003b,0x00000186,0x00000185,0x00000183,0x0004003d,0x00000006,0x00000187, + 0x00000186,0x0005008e,0x0000000d,0x00000188,0x0000017c,0x00000187,0x0004003d,0x0000000d, + 0x00000189,0x0000014a,0x00050083,0x0000000d,0x0000018a,0x00000189,0x00000188,0x0003003e, + 0x0000014a,0x0000018a,0x0004003d,0x0000000d,0x0000018c,0x0000014a,0x0003003e,0x0000018b, + 0x0000018c,0x00050039,0x00000006,0x0000018d,0x00000011,0x0000018b,0x0004003d,0x00000006, + 0x0000018e,0x0000011c,0x00050083,0x00000006,0x0000018f,0x0000018d,0x0000018e,0x0003003e, + 0x00000152,0x0000018f,0x0004003d,0x00000006,0x00000190,0x00000152,0x0006000c,0x00000006, + 0x00000191,0x00000001,0x00000004,0x00000190,0x0004003d,0x00000006,0x00000192,0x0000010f, + 0x000500be,0x00000083,0x00000193,0x00000191,0x00000192,0x0003003e,0x0000015e,0x00000193, + 0x000200f9,0x0000017b,0x000200f8,0x0000017b,0x0004003d,0x00000083,0x00000194,0x00000163, + 0x000400a8,0x00000083,0x00000195,0x00000194,0x000300f7,0x00000197,0x00000000,0x000400fa, + 0x00000195,0x00000196,0x00000197,0x000200f8,0x00000196,0x0004003d,0x0000000d,0x00000198, + 0x0000013d,0x0004003d,0x00000013,0x00000199,0x00000168,0x00050041,0x0000003b,0x0000019b, + 0x0000019a,0x00000199,0x0004003d,0x00000006,0x0000019c,0x0000019b,0x0005008e,0x0000000d, + 0x0000019d,0x00000198,0x0000019c,0x0004003d,0x0000000d,0x0000019e,0x0000014e,0x00050081, + 0x0000000d,0x0000019f,0x0000019e,0x0000019d,0x0003003e,0x0000014e,0x0000019f,0x0004003d, + 0x0000000d,0x000001a1,0x0000014e,0x0003003e,0x000001a0,0x000001a1,0x00050039,0x00000006, + 0x000001a2,0x00000011,0x000001a0,0x0004003d,0x00000006,0x000001a3,0x0000011c,0x00050083, + 0x00000006,0x000001a4,0x000001a2,0x000001a3,0x0003003e,0x00000158,0x000001a4,0x0004003d, + 0x00000006,0x000001a5,0x00000158,0x0006000c,0x00000006,0x000001a6,0x00000001,0x00000004, + 0x000001a5,0x0004003d,0x00000006,0x000001a7,0x0000010f,0x000500be,0x00000083,0x000001a8, + 0x000001a6,0x000001a7,0x0003003e,0x00000163,0x000001a8,0x000200f9,0x00000197,0x000200f8, + 0x00000197,0x000200f9,0x0000016c,0x000200f8,0x0000016c,0x0004003d,0x00000013,0x000001a9, + 0x00000168,0x00050080,0x00000013,0x000001ab,0x000001a9,0x000001aa,0x0003003e,0x00000168, + 0x000001ab,0x000200f9,0x00000169,0x000200f8,0x0000016b,0x0004003d,0x00000083,0x000001ad, + 0x000000ec,0x000300f7,0x000001b0,0x00000000,0x000400fa,0x000001ad,0x000001af,0x000001b6, + 0x000200f8,0x000001af,0x00050041,0x0000003b,0x000001b1,0x00000016,0x00000055,0x0004003d, + 0x00000006,0x000001b2,0x000001b1,0x00050041,0x0000003b,0x000001b3,0x0000014a,0x00000055, + 0x0004003d,0x00000006,0x000001b4,0x000001b3,0x00050083,0x00000006,0x000001b5,0x000001b2, + 0x000001b4,0x0003003e,0x000001ae,0x000001b5,0x000200f9,0x000001b0,0x000200f8,0x000001b6, + 0x00050041,0x0000003b,0x000001b7,0x00000016,0x00000043,0x0004003d,0x00000006,0x000001b8, + 0x000001b7,0x00050041,0x0000003b,0x000001b9,0x0000014a,0x00000043,0x0004003d,0x00000006, + 0x000001ba,0x000001b9,0x00050083,0x00000006,0x000001bb,0x000001b8,0x000001ba,0x0003003e, + 0x000001ae,0x000001bb,0x000200f9,0x000001b0,0x000200f8,0x000001b0,0x0004003d,0x00000006, + 0x000001bc,0x000001ae,0x0003003e,0x000001ac,0x000001bc,0x0004003d,0x00000083,0x000001be, + 0x000000ec,0x000300f7,0x000001c1,0x00000000,0x000400fa,0x000001be,0x000001c0,0x000001c7, + 0x000200f8,0x000001c0,0x00050041,0x0000003b,0x000001c2,0x0000014e,0x00000055,0x0004003d, + 0x00000006,0x000001c3,0x000001c2,0x00050041,0x0000003b,0x000001c4,0x00000016,0x00000055, + 0x0004003d,0x00000006,0x000001c5,0x000001c4,0x00050083,0x00000006,0x000001c6,0x000001c3, + 0x000001c5,0x0003003e,0x000001bf,0x000001c6,0x000200f9,0x000001c1,0x000200f8,0x000001c7, + 0x00050041,0x0000003b,0x000001c8,0x0000014e,0x00000043,0x0004003d,0x00000006,0x000001c9, + 0x000001c8,0x00050041,0x0000003b,0x000001ca,0x00000016,0x00000043,0x0004003d,0x00000006, + 0x000001cb,0x000001ca,0x00050083,0x00000006,0x000001cc,0x000001c9,0x000001cb,0x0003003e, + 0x000001bf,0x000001cc,0x000200f9,0x000001c1,0x000200f8,0x000001c1,0x0004003d,0x00000006, + 0x000001cd,0x000001bf,0x0003003e,0x000001bd,0x000001cd,0x0004003d,0x00000006,0x000001cf, + 0x0000003c,0x0004003d,0x00000006,0x000001d0,0x0000011c,0x00050083,0x00000006,0x000001d1, + 0x000001cf,0x000001d0,0x000500b8,0x00000083,0x000001d2,0x000001d1,0x00000029,0x0003003e, + 0x000001ce,0x000001d2,0x0004003d,0x00000006,0x000001d4,0x000001ac,0x0004003d,0x00000006, + 0x000001d5,0x000001bd,0x000500b8,0x00000083,0x000001d6,0x000001d4,0x000001d5,0x000300f7, + 0x000001d9,0x00000000,0x000400fa,0x000001d6,0x000001d8,0x000001de,0x000200f8,0x000001d8, + 0x0004003d,0x00000006,0x000001da,0x00000152,0x000500b8,0x00000083,0x000001db,0x000001da, + 0x00000029,0x0004003d,0x00000083,0x000001dc,0x000001ce,0x000500a5,0x00000083,0x000001dd, + 0x000001db,0x000001dc,0x0003003e,0x000001d7,0x000001dd,0x000200f9,0x000001d9,0x000200f8, + 0x000001de,0x0004003d,0x00000006,0x000001df,0x00000158,0x000500b8,0x00000083,0x000001e0, + 0x000001df,0x00000029,0x0004003d,0x00000083,0x000001e1,0x000001ce,0x000500a5,0x00000083, + 0x000001e2,0x000001e0,0x000001e1,0x0003003e,0x000001d7,0x000001e2,0x000200f9,0x000001d9, + 0x000200f8,0x000001d9,0x0004003d,0x00000083,0x000001e3,0x000001d7,0x0003003e,0x000001d3, + 0x000001e3,0x0004003d,0x00000083,0x000001e5,0x000001d3,0x000300f7,0x000001e8,0x00000000, + 0x000400fa,0x000001e5,0x000001e7,0x000001f1,0x000200f8,0x000001e7,0x0004003d,0x00000006, + 0x000001e9,0x000001ac,0x0004003d,0x00000006,0x000001ea,0x000001bd,0x0007000c,0x00000006, + 0x000001eb,0x00000001,0x00000025,0x000001e9,0x000001ea,0x0004003d,0x00000006,0x000001ec, + 0x000001ac,0x0004003d,0x00000006,0x000001ed,0x000001bd,0x00050081,0x00000006,0x000001ee, + 0x000001ec,0x000001ed,0x00050088,0x00000006,0x000001ef,0x000001eb,0x000001ee,0x00050083, + 0x00000006,0x000001f0,0x00000129,0x000001ef,0x0003003e,0x000001e6,0x000001f0,0x000200f9, + 0x000001e8,0x000200f8,0x000001f1,0x0003003e,0x000001e6,0x00000029,0x000200f9,0x000001e8, + 0x000200f8,0x000001e8,0x0004003d,0x00000006,0x000001f2,0x000001e6,0x0003003e,0x000001e4, + 0x000001f2,0x0004003d,0x00000006,0x000001f4,0x000000ab,0x00050085,0x00000006,0x000001f5, + 0x000001f4,0x000000c9,0x0004003d,0x00000006,0x000001f6,0x000000af,0x00050085,0x00000006, + 0x000001f7,0x000001f6,0x000000c9,0x00050081,0x00000006,0x000001f8,0x000001f5,0x000001f7, + 0x0004003d,0x00000006,0x000001f9,0x000000b3,0x00050081,0x00000006,0x000001fa,0x000001f8, + 0x000001f9,0x00050088,0x00000006,0x000001fc,0x000001fa,0x000001fb,0x0004003d,0x00000006, + 0x000001fd,0x0000003c,0x00050083,0x00000006,0x000001fe,0x000001fc,0x000001fd,0x0006000c, + 0x00000006,0x000001ff,0x00000001,0x00000004,0x000001fe,0x0004003d,0x00000006,0x00000200, + 0x00000079,0x00050088,0x00000006,0x00000201,0x000001ff,0x00000200,0x0008000c,0x00000006, + 0x00000202,0x00000001,0x0000002b,0x00000201,0x00000029,0x00000033,0x0003003e,0x000001f3, + 0x00000202,0x0004003d,0x00000006,0x00000204,0x000001f3,0x00050085,0x00000006,0x00000205, + 0x000000bc,0x00000204,0x00050081,0x00000006,0x00000207,0x00000205,0x00000206,0x0004003d, + 0x00000006,0x00000208,0x000001f3,0x00050085,0x00000006,0x00000209,0x00000207,0x00000208, + 0x0004003d,0x00000006,0x0000020a,0x000001f3,0x00050085,0x00000006,0x0000020b,0x00000209, + 0x0000020a,0x0003003e,0x00000203,0x0000020b,0x0004003d,0x00000006,0x0000020d,0x00000203, + 0x0004003d,0x00000006,0x0000020e,0x00000203,0x00050085,0x00000006,0x0000020f,0x0000020d, + 0x0000020e,0x00050085,0x00000006,0x00000210,0x0000020f,0x00000129,0x0003003e,0x0000020c, + 0x00000210,0x0004003d,0x00000006,0x00000212,0x000001e4,0x0004003d,0x00000006,0x00000213, + 0x0000020c,0x0007000c,0x00000006,0x00000214,0x00000001,0x00000028,0x00000212,0x00000213, + 0x0003003e,0x00000211,0x00000214,0x0004003d,0x00000083,0x00000215,0x000000ec,0x000300f7, + 0x00000217,0x00000000,0x000400fa,0x00000215,0x00000216,0x0000021f,0x000200f8,0x00000216, + 0x0004003d,0x00000006,0x00000218,0x00000211,0x0004003d,0x00000006,0x00000219,0x000000f6, + 0x00050085,0x00000006,0x0000021a,0x00000218,0x00000219,0x00050041,0x0000003b,0x0000021b, + 0x00000016,0x00000043,0x0004003d,0x00000006,0x0000021c,0x0000021b,0x00050081,0x00000006, + 0x0000021d,0x0000021c,0x0000021a,0x00050041,0x0000003b,0x0000021e,0x00000016,0x00000043, + 0x0003003e,0x0000021e,0x0000021d,0x000200f9,0x00000217,0x000200f8,0x0000021f,0x0004003d, + 0x00000006,0x00000220,0x00000211,0x0004003d,0x00000006,0x00000221,0x000000f6,0x00050085, + 0x00000006,0x00000222,0x00000220,0x00000221,0x00050041,0x0000003b,0x00000223,0x00000016, + 0x00000055,0x0004003d,0x00000006,0x00000224,0x00000223,0x00050081,0x00000006,0x00000225, + 0x00000224,0x00000222,0x00050041,0x0000003b,0x00000226,0x00000016,0x00000055,0x0003003e, + 0x00000226,0x00000225,0x000200f9,0x00000217,0x000200f8,0x00000217,0x0004003d,0x00000006, + 0x00000227,0x000001e4,0x000500be,0x00000083,0x00000229,0x00000227,0x00000228,0x0004003d, + 0x00000006,0x0000022a,0x000001e4,0x0004003d,0x00000006,0x0000022b,0x0000020c,0x000500be, + 0x00000083,0x0000022c,0x0000022a,0x0000022b,0x000500a7,0x00000083,0x0000022d,0x00000229, + 0x0000022c,0x000300f7,0x00000230,0x00000000,0x000400fa,0x0000022d,0x0000022f,0x00000231, + 0x000200f8,0x0000022f,0x0003003e,0x0000022e,0x000001aa,0x000200f9,0x00000230,0x000200f8, + 0x00000231,0x0004003d,0x00000006,0x00000232,0x0000020c,0x000500be,0x00000083,0x00000233, + 0x00000232,0x00000228,0x000600a9,0x00000013,0x00000235,0x00000233,0x00000234,0x00000031, + 0x0003003e,0x0000022e,0x00000235,0x000200f9,0x00000230,0x000200f8,0x00000230,0x0004003d, + 0x00000013,0x00000236,0x0000022e,0x0003003e,0x00000018,0x00000236,0x0004003d,0x00000024, + 0x00000237,0x00000026,0x0004003d,0x0000000d,0x00000238,0x00000016,0x00070058,0x0000002a, + 0x00000239,0x00000237,0x00000238,0x00000002,0x00000029,0x0008004f,0x00000007,0x0000023a, + 0x00000239,0x00000239,0x00000000,0x00000001,0x00000002,0x000200fe,0x0000023a,0x00010038 }; diff --git a/gpu/vk/vk_draw.cpp b/gpu/vk/vk_draw.cpp index 57a65a9d7..0e7b32850 100644 --- a/gpu/vk/vk_draw.cpp +++ b/gpu/vk/vk_draw.cpp @@ -5848,6 +5848,10 @@ static bool typed_upscale(VkCommandBuffer cmd, VkImageView input_view, VkImageVi // (bounded when the history is last frame's or so: a pause of the TAAU, a menu, starts again unbounded) const uint64_t now_frame = texture_frame_no(); size[2] = temporal && !no_clamp && hist_frame && now_frame - hist_frame <= 3 ? 1u : 0u; + // (the gameplay stand-in's edges: FXAA in the shader. RX_VK_TAAU_FXAA=0: the plain linear upscale as before; 2: the + // pixels it changed drawn red) + static const int fxaa = getenv("RX_VK_TAAU_FXAA") ? atoi(getenv("RX_VK_TAAU_FXAA")) : 1; + if (temporal && fxaa) size[2] |= fxaa == 2 ? 6u : 2u; hist_frame = now_frame; const VkDescriptorImageInfo in_info{linear, input_view, VK_IMAGE_LAYOUT_GENERAL}; const VkDescriptorImageInfo out_info{VK_NULL_HANDLE, output_view, VK_IMAGE_LAYOUT_GENERAL}; diff --git a/tests/test_taau_fxaa.py b/tests/test_taau_fxaa.py new file mode 100644 index 000000000..891c418e2 --- /dev/null +++ b/tests/test_taau_fxaa.py @@ -0,0 +1,53 @@ +"""The gameplay TAAU stand-in's FXAA: on for the stand-in only, its push-constant bits kept apart, the SPIR-V current. + +shaders/taau_upscale.comp reads pc.valid as bits: 1 the history bound, 2 FXAA, 4 its diagnostic colours. The bound must +test bit 1 alone (FXAA's bit would otherwise turn the bound on, which smears what moves), and only the gameplay stand-in +(typed_upscale's temporal call) sets FXAA's bits. When glslangValidator of the header's version is found, the header is +compiled again from the source and compared, so the two cannot drift apart. +python -I -B tests/test_taau_fxaa.py +""" +from pathlib import Path +import re +import shutil +import subprocess +import tempfile + +ROOT = Path(__file__).resolve().parents[1] +SHADERS = ROOT / "gpu" / "vk" / "shaders" + + +def main(): + comp = (SHADERS / "taau_upscale.comp").read_text(encoding="utf-8") + if "(pc.valid & 1) != 0" not in comp or re.search(r"pc\.valid\s*!=\s*0", comp): + raise SystemExit("the history bound does not test its own bit: FXAA's bit would turn it on") + if "(pc.valid & 2) != 0" not in comp or "fxaa(" not in comp: + raise SystemExit("the stand-in has no FXAA behind its bit") + draw = (ROOT / "gpu" / "vk" / "vk_draw.cpp").read_text(encoding="utf-8") + sets = re.findall(r"if \(([^)]*)\) size\[2\] \|= [^;]*;", draw) + if not sets or any("temporal" not in c or "fxaa" not in c for c in sets): + raise SystemExit("FXAA's bits are set outside the gameplay stand-in (typed_upscale's temporal call)") + if 'getenv("RX_VK_TAAU_FXAA")' not in draw: + raise SystemExit("RX_VK_TAAU_FXAA does not switch it") + + header = (SHADERS / "taau_upscale_comp_spv.h").read_text(encoding="utf-8") + glslang = shutil.which("glslangValidator") + version = header.split("\n", 1)[0].strip().lstrip("/ ").strip() + if glslang: + got = subprocess.run([glslang, "--version"], capture_output=True, text=True).stdout + m = re.search(r"Glslang Version: \d+:(\d+)\.(\d+)\.(\d+)", got) + same = m and version == "11%02d.%s.%s" % (int(m.group(1)), m.group(2), m.group(3)) + if same: + with tempfile.TemporaryDirectory() as d: + out = Path(d) / "h.h" + subprocess.run([glslang, "-V", "--target-env", "vulkan1.3", "--vn", "TAAU_UPSCALE_COMP_SPV", "-o", str(out), + str(SHADERS / "taau_upscale.comp")], check=True, capture_output=True) + if out.read_text(encoding="utf-8") != header: + raise SystemExit("taau_upscale_comp_spv.h is not taau_upscale.comp compiled: run glslangValidator again") + print("(the SPIR-V header matches its source)") + else: + print("(glslangValidator is not version %s: the header was not compiled again)" % version) + print("PASS: the TAAU stand-in's FXAA is the gameplay stand-in's alone, behind its own bits") + + +if __name__ == "__main__": + main()