Added support for linear and pixel art scaling for palettized textures

This commit is contained in:
Sam Lantinga
2025-10-04 14:16:02 -07:00
parent e1fde46a6a
commit 134b47730b
43 changed files with 11348 additions and 7598 deletions

View File

@@ -1234,7 +1234,6 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, S
* The default texture scale mode is SDL_SCALEMODE_LINEAR.
*
* If the scale mode is not supported, the closest supported mode is chosen.
* Palettized textures will always use SDL_SCALEMODE_NEAREST.
*
* \param texture the texture to update.
* \param scaleMode the SDL_ScaleMode to use for texture scaling.

View File

@@ -1525,11 +1525,7 @@ SDL_Texture *SDL_CreateTextureWithProperties(SDL_Renderer *renderer, SDL_Propert
texture->color.b = 1.0f;
texture->color.a = 1.0f;
texture->blendMode = SDL_ISPIXELFORMAT_ALPHA(format) ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE;
if (SDL_ISPIXELFORMAT_INDEXED(format)) {
texture->scaleMode = SDL_SCALEMODE_NEAREST;
} else {
texture->scaleMode = renderer->scale_mode;
}
texture->view.pixel_w = w;
texture->view.pixel_h = h;
texture->view.viewport.w = -1;
@@ -2162,12 +2158,8 @@ bool SDL_SetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode scaleMode)
switch (scaleMode) {
case SDL_SCALEMODE_NEAREST:
break;
case SDL_SCALEMODE_PIXELART:
case SDL_SCALEMODE_LINEAR:
if (SDL_ISPIXELFORMAT_INDEXED(texture->format)) {
scaleMode = SDL_SCALEMODE_NEAREST;
}
break;
default:
return SDL_InvalidParamError("scaleMode");

View File

@@ -6,83 +6,263 @@
//
// sampler2D image;
// sampler1D palette;
// float4 texel_size;
// float texture_type;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// texture_type c0 1
// texel_size c1 1
// image s0 1
// palette s1 1
//
ps_2_0
def c0, 0.99609375, 0.001953125, 0, 0
dcl t0.xy
def c2, -1, 255, 0.5, 0.00390625
def c3, -2, 0, 0, 0
def c4, 1, 0, 0, 1
dcl v0
dcl t0.xy
dcl_2d s0
dcl_2d s1
texld r0, t0, s0
mad r0.xy, r0.x, c0.x, c0.y
texld r0, r0, s1
mov r0.xz, c2
mad r1.x, t0.x, c1.z, r0.z
mad r1.y, t0.y, c1.w, r0.z
frc r0.yz, r1.zxyw
add r1.xy, -r0.yzxw, r1
add r1.zw, r1.wzyx, -c2.z
add r1.xy, r1, c2.z
mul r1.xy, r1, c1
mul r2.xy, r1.wzyx, c1
mov r3.x, r2.x
mov r3.y, r1.y
mov r4.y, r2.y
mov r4.x, r1.x
texld r3, r3, s0
texld r2, r2, s0
texld r1, r1, s0
texld r4, r4, s0
texld r5, t0, s0
mad r0.w, r3.x, c2.y, c2.z
mul r3.xy, r0.w, c2.w
mad r0.w, r2.x, c2.y, c2.z
mul r2.xy, r0.w, c2.w
mad r0.w, r1.x, c2.y, c2.z
mul r1.xy, r0.w, c2.w
mad r0.w, r4.x, c2.y, c2.z
mul r4.xy, r0.w, c2.w
mad r0.w, r5.x, c2.y, c2.z
mul r5.xy, r0.w, c2.w
texld r3, r3, s1
texld r2, r2, s1
texld r1, r1, s1
texld r4, r4, s1
texld r5, r5, s1
lrp r6, r0.z, r3, r2
lrp r2, r0.z, r1, r4
lrp r1, r0.y, r2, r6
mov r2.x, c0.x
add r0.y, r2.x, c3.x
mul r0.y, r0.y, r0.y
cmp r1, -r0.y, r1, c4
add r0.x, r0.x, c0.x
mul r0.x, r0.x, r0.x
cmp r0, -r0.x, r5, r1
mul r0, r0, v0
mov oC0, r0
// approximately 5 instruction slots used (2 texture, 3 arithmetic)
// approximately 45 instruction slots used (10 texture, 35 arithmetic)
#endif
const BYTE g_ps20_main[] =
{
0, 2, 255, 255, 254, 255,
42, 0, 67, 84, 65, 66,
28, 0, 0, 0, 123, 0,
67, 0, 67, 84, 65, 66,
28, 0, 0, 0, 223, 0,
0, 0, 0, 2, 255, 255,
2, 0, 0, 0, 28, 0,
4, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
116, 0, 0, 0, 68, 0,
216, 0, 0, 0, 108, 0,
0, 0, 3, 0, 0, 0,
1, 0, 0, 0, 76, 0,
1, 0, 0, 0, 116, 0,
0, 0, 0, 0, 0, 0,
92, 0, 0, 0, 3, 0,
132, 0, 0, 0, 3, 0,
1, 0, 1, 0, 0, 0,
100, 0, 0, 0, 0, 0,
0, 0, 105, 109, 97, 103,
101, 0, 171, 171, 4, 0,
12, 0, 1, 0, 1, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 97, 108, 101,
116, 116, 101, 0, 4, 0,
11, 0, 1, 0, 1, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 115, 95, 50,
95, 48, 0, 77, 105, 99,
114, 111, 115, 111, 102, 116,
32, 40, 82, 41, 32, 72,
76, 83, 76, 32, 83, 104,
97, 100, 101, 114, 32, 67,
111, 109, 112, 105, 108, 101,
114, 32, 49, 48, 46, 49,
0, 171, 81, 0, 0, 5,
0, 0, 15, 160, 0, 0,
127, 63, 0, 0, 0, 59,
140, 0, 0, 0, 0, 0,
0, 0, 156, 0, 0, 0,
2, 0, 1, 0, 1, 0,
0, 0, 168, 0, 0, 0,
0, 0, 0, 0, 184, 0,
0, 0, 2, 0, 0, 0,
1, 0, 0, 0, 200, 0,
0, 0, 0, 0, 0, 0,
0, 0, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
3, 176, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
15, 144, 31, 0, 0, 2,
0, 0, 0, 144, 0, 8,
15, 160, 31, 0, 0, 2,
0, 0, 0, 144, 1, 8,
15, 160, 66, 0, 0, 3,
0, 0, 15, 128, 0, 0,
228, 176, 0, 8, 228, 160,
4, 0, 0, 4, 0, 0,
3, 128, 0, 0, 0, 128,
0, 0, 0, 160, 0, 0,
85, 160, 66, 0, 0, 3,
0, 0, 15, 128, 0, 0,
105, 109, 97, 103, 101, 0,
171, 171, 4, 0, 12, 0,
1, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0,
112, 97, 108, 101, 116, 116,
101, 0, 4, 0, 11, 0,
1, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0,
116, 101, 120, 101, 108, 95,
115, 105, 122, 101, 0, 171,
1, 0, 3, 0, 1, 0,
4, 0, 1, 0, 0, 0,
0, 0, 0, 0, 116, 101,
120, 116, 117, 114, 101, 95,
116, 121, 112, 101, 0, 171,
171, 171, 0, 0, 3, 0,
1, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0,
112, 115, 95, 50, 95, 48,
0, 77, 105, 99, 114, 111,
115, 111, 102, 116, 32, 40,
82, 41, 32, 72, 76, 83,
76, 32, 83, 104, 97, 100,
101, 114, 32, 67, 111, 109,
112, 105, 108, 101, 114, 32,
49, 48, 46, 49, 0, 171,
81, 0, 0, 5, 2, 0,
15, 160, 0, 0, 128, 191,
0, 0, 127, 67, 0, 0,
0, 63, 0, 0, 128, 59,
81, 0, 0, 5, 3, 0,
15, 160, 0, 0, 0, 192,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
81, 0, 0, 5, 4, 0,
15, 160, 0, 0, 128, 63,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 128, 63,
31, 0, 0, 2, 0, 0,
0, 128, 0, 0, 15, 144,
31, 0, 0, 2, 0, 0,
0, 128, 0, 0, 3, 176,
31, 0, 0, 2, 0, 0,
0, 144, 0, 8, 15, 160,
31, 0, 0, 2, 0, 0,
0, 144, 1, 8, 15, 160,
1, 0, 0, 2, 0, 0,
5, 128, 2, 0, 228, 160,
4, 0, 0, 4, 1, 0,
1, 128, 0, 0, 0, 176,
1, 0, 170, 160, 0, 0,
170, 128, 4, 0, 0, 4,
1, 0, 2, 128, 0, 0,
85, 176, 1, 0, 255, 160,
0, 0, 170, 128, 19, 0,
0, 2, 0, 0, 6, 128,
1, 0, 210, 128, 2, 0,
0, 3, 1, 0, 3, 128,
0, 0, 201, 129, 1, 0,
228, 128, 2, 0, 0, 3,
1, 0, 12, 128, 1, 0,
27, 128, 2, 0, 170, 161,
2, 0, 0, 3, 1, 0,
3, 128, 1, 0, 228, 128,
2, 0, 170, 160, 5, 0,
0, 3, 1, 0, 3, 128,
1, 0, 228, 128, 1, 0,
228, 160, 5, 0, 0, 3,
2, 0, 3, 128, 1, 0,
27, 128, 1, 0, 228, 160,
1, 0, 0, 2, 3, 0,
1, 128, 2, 0, 0, 128,
1, 0, 0, 2, 3, 0,
2, 128, 1, 0, 85, 128,
1, 0, 0, 2, 4, 0,
2, 128, 2, 0, 85, 128,
1, 0, 0, 2, 4, 0,
1, 128, 1, 0, 0, 128,
66, 0, 0, 3, 3, 0,
15, 128, 3, 0, 228, 128,
0, 8, 228, 160, 66, 0,
0, 3, 2, 0, 15, 128,
2, 0, 228, 128, 0, 8,
228, 160, 66, 0, 0, 3,
1, 0, 15, 128, 1, 0,
228, 128, 0, 8, 228, 160,
66, 0, 0, 3, 4, 0,
15, 128, 4, 0, 228, 128,
0, 8, 228, 160, 66, 0,
0, 3, 5, 0, 15, 128,
0, 0, 228, 176, 0, 8,
228, 160, 4, 0, 0, 4,
0, 0, 8, 128, 3, 0,
0, 128, 2, 0, 85, 160,
2, 0, 170, 160, 5, 0,
0, 3, 3, 0, 3, 128,
0, 0, 255, 128, 2, 0,
255, 160, 4, 0, 0, 4,
0, 0, 8, 128, 2, 0,
0, 128, 2, 0, 85, 160,
2, 0, 170, 160, 5, 0,
0, 3, 2, 0, 3, 128,
0, 0, 255, 128, 2, 0,
255, 160, 4, 0, 0, 4,
0, 0, 8, 128, 1, 0,
0, 128, 2, 0, 85, 160,
2, 0, 170, 160, 5, 0,
0, 3, 1, 0, 3, 128,
0, 0, 255, 128, 2, 0,
255, 160, 4, 0, 0, 4,
0, 0, 8, 128, 4, 0,
0, 128, 2, 0, 85, 160,
2, 0, 170, 160, 5, 0,
0, 3, 4, 0, 3, 128,
0, 0, 255, 128, 2, 0,
255, 160, 4, 0, 0, 4,
0, 0, 8, 128, 5, 0,
0, 128, 2, 0, 85, 160,
2, 0, 170, 160, 5, 0,
0, 3, 5, 0, 3, 128,
0, 0, 255, 128, 2, 0,
255, 160, 66, 0, 0, 3,
3, 0, 15, 128, 3, 0,
228, 128, 1, 8, 228, 160,
66, 0, 0, 3, 2, 0,
15, 128, 2, 0, 228, 128,
1, 8, 228, 160, 66, 0,
0, 3, 1, 0, 15, 128,
1, 0, 228, 128, 1, 8,
228, 160, 66, 0, 0, 3,
4, 0, 15, 128, 4, 0,
228, 128, 1, 8, 228, 160,
66, 0, 0, 3, 5, 0,
15, 128, 5, 0, 228, 128,
1, 8, 228, 160, 18, 0,
0, 4, 6, 0, 15, 128,
0, 0, 170, 128, 3, 0,
228, 128, 2, 0, 228, 128,
18, 0, 0, 4, 2, 0,
15, 128, 0, 0, 170, 128,
1, 0, 228, 128, 4, 0,
228, 128, 18, 0, 0, 4,
1, 0, 15, 128, 0, 0,
85, 128, 2, 0, 228, 128,
6, 0, 228, 128, 1, 0,
0, 2, 2, 0, 1, 128,
0, 0, 0, 160, 2, 0,
0, 3, 0, 0, 2, 128,
2, 0, 0, 128, 3, 0,
0, 160, 5, 0, 0, 3,
0, 0, 2, 128, 0, 0,
85, 128, 0, 0, 85, 128,
88, 0, 0, 4, 1, 0,
15, 128, 0, 0, 85, 129,
1, 0, 228, 128, 4, 0,
228, 160, 2, 0, 0, 3,
0, 0, 1, 128, 0, 0,
0, 128, 0, 0, 0, 160,
5, 0, 0, 3, 0, 0,
1, 128, 0, 0, 0, 128,
0, 0, 0, 128, 88, 0,
0, 4, 0, 0, 15, 128,
0, 0, 0, 129, 5, 0,
228, 128, 1, 0, 228, 128,
5, 0, 0, 3, 0, 0,
15, 128, 0, 0, 228, 128,
0, 0, 228, 144, 1, 0,

View File

@@ -1,19 +0,0 @@
uniform sampler2D image;
uniform sampler1D palette;
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
float4 color : COLOR0;
};
float4 main(PixelShaderInput input) : SV_TARGET
{
float4 Output;
float index;
index = tex2D(image, input.tex).r;
Output = tex1D(palette, index * (255. / 256) + (0.5 / 256));
return Output * input.color;
}

View File

@@ -0,0 +1,49 @@
cbuffer Constants
{
float4 texel_size;
};
uniform sampler2D image;
uniform sampler1D palette;
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
float4 color : COLOR0;
};
static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_PALETTE_NEAREST = 1;
static const float TEXTURETYPE_PALETTE_LINEAR = 2;
float4 SamplePaletteNearest(float2 uv)
{
float index = tex2D(image, uv).r * 255;
return tex1D(palette, (index + 0.5) / 256);
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(float2 uv)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = frac(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(uv_min_max.xy);
float4 texelB = SamplePaletteNearest(uv_min_max.xw);
float4 texelC = SamplePaletteNearest(uv_min_max.zy);
float4 texelD = SamplePaletteNearest(uv_min_max.zw);
// bilinear interpolation
return lerp(lerp(texelA, texelB, uv_frac.y), lerp(texelC, texelD, uv_frac.y), uv_frac.x);
}

View File

@@ -0,0 +1,209 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 10.1
//
// Parameters:
//
// sampler2D image;
// sampler1D palette;
// float4 texel_size;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// texel_size c0 1
// image s0 1
// palette s1 1
//
ps_2_0
def c1, 0.5, -0.5, 255, 0.00390625
dcl t0.xy
dcl v0
dcl_2d s0
dcl_2d s1
mov r0.w, c1.x
mad r0.x, t0.x, c0.z, r0.w
mad r0.y, t0.y, c0.w, r0.w
frc r0.zw, r0.wzyx
add r0.xy, -r0.wzyx, r0
add r1.xy, r0, c1.y
add r0.xy, r0, c1.x
mul r0.xy, r0, c0
mul r1.xy, r1, c0
mov r2.x, r1.x
mov r2.y, r0.y
mov r3.y, r1.y
mov r3.x, r0.x
texld r2, r2, s0
texld r1, r1, s0
texld r4, r0, s0
texld r3, r3, s0
mad r0.x, r2.x, c1.z, c1.x
mul r0.xy, r0.x, c1.w
mad r1.x, r1.x, c1.z, c1.x
mul r1.xy, r1.x, c1.w
mad r1.z, r4.x, c1.z, c1.x
mul r2.xy, r1.z, c1.w
mad r1.z, r3.x, c1.z, c1.x
mul r3.xy, r1.z, c1.w
texld r4, r0, s1
texld r1, r1, s1
texld r2, r2, s1
texld r3, r3, s1
lrp r5, r0.z, r4, r1
lrp r1, r0.z, r2, r3
lrp r2, r0.w, r1, r5
mul r0, r2, v0
mov oC0, r0
// approximately 34 instruction slots used (8 texture, 26 arithmetic)
#endif
const BYTE g_ps20_main[] =
{
0, 2, 255, 255, 254, 255,
54, 0, 67, 84, 65, 66,
28, 0, 0, 0, 171, 0,
0, 0, 0, 2, 255, 255,
3, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
164, 0, 0, 0, 88, 0,
0, 0, 3, 0, 0, 0,
1, 0, 0, 0, 96, 0,
0, 0, 0, 0, 0, 0,
112, 0, 0, 0, 3, 0,
1, 0, 1, 0, 0, 0,
120, 0, 0, 0, 0, 0,
0, 0, 136, 0, 0, 0,
2, 0, 0, 0, 1, 0,
0, 0, 148, 0, 0, 0,
0, 0, 0, 0, 105, 109,
97, 103, 101, 0, 171, 171,
4, 0, 12, 0, 1, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 112, 97,
108, 101, 116, 116, 101, 0,
4, 0, 11, 0, 1, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 116, 101,
120, 101, 108, 95, 115, 105,
122, 101, 0, 171, 1, 0,
3, 0, 1, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 115, 95, 50,
95, 48, 0, 77, 105, 99,
114, 111, 115, 111, 102, 116,
32, 40, 82, 41, 32, 72,
76, 83, 76, 32, 83, 104,
97, 100, 101, 114, 32, 67,
111, 109, 112, 105, 108, 101,
114, 32, 49, 48, 46, 49,
0, 171, 81, 0, 0, 5,
1, 0, 15, 160, 0, 0,
0, 63, 0, 0, 0, 191,
0, 0, 127, 67, 0, 0,
128, 59, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
3, 176, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
15, 144, 31, 0, 0, 2,
0, 0, 0, 144, 0, 8,
15, 160, 31, 0, 0, 2,
0, 0, 0, 144, 1, 8,
15, 160, 1, 0, 0, 2,
0, 0, 8, 128, 1, 0,
0, 160, 4, 0, 0, 4,
0, 0, 1, 128, 0, 0,
0, 176, 0, 0, 170, 160,
0, 0, 255, 128, 4, 0,
0, 4, 0, 0, 2, 128,
0, 0, 85, 176, 0, 0,
255, 160, 0, 0, 255, 128,
19, 0, 0, 2, 0, 0,
12, 128, 0, 0, 27, 128,
2, 0, 0, 3, 0, 0,
3, 128, 0, 0, 27, 129,
0, 0, 228, 128, 2, 0,
0, 3, 1, 0, 3, 128,
0, 0, 228, 128, 1, 0,
85, 160, 2, 0, 0, 3,
0, 0, 3, 128, 0, 0,
228, 128, 1, 0, 0, 160,
5, 0, 0, 3, 0, 0,
3, 128, 0, 0, 228, 128,
0, 0, 228, 160, 5, 0,
0, 3, 1, 0, 3, 128,
1, 0, 228, 128, 0, 0,
228, 160, 1, 0, 0, 2,
2, 0, 1, 128, 1, 0,
0, 128, 1, 0, 0, 2,
2, 0, 2, 128, 0, 0,
85, 128, 1, 0, 0, 2,
3, 0, 2, 128, 1, 0,
85, 128, 1, 0, 0, 2,
3, 0, 1, 128, 0, 0,
0, 128, 66, 0, 0, 3,
2, 0, 15, 128, 2, 0,
228, 128, 0, 8, 228, 160,
66, 0, 0, 3, 1, 0,
15, 128, 1, 0, 228, 128,
0, 8, 228, 160, 66, 0,
0, 3, 4, 0, 15, 128,
0, 0, 228, 128, 0, 8,
228, 160, 66, 0, 0, 3,
3, 0, 15, 128, 3, 0,
228, 128, 0, 8, 228, 160,
4, 0, 0, 4, 0, 0,
1, 128, 2, 0, 0, 128,
1, 0, 170, 160, 1, 0,
0, 160, 5, 0, 0, 3,
0, 0, 3, 128, 0, 0,
0, 128, 1, 0, 255, 160,
4, 0, 0, 4, 1, 0,
1, 128, 1, 0, 0, 128,
1, 0, 170, 160, 1, 0,
0, 160, 5, 0, 0, 3,
1, 0, 3, 128, 1, 0,
0, 128, 1, 0, 255, 160,
4, 0, 0, 4, 1, 0,
4, 128, 4, 0, 0, 128,
1, 0, 170, 160, 1, 0,
0, 160, 5, 0, 0, 3,
2, 0, 3, 128, 1, 0,
170, 128, 1, 0, 255, 160,
4, 0, 0, 4, 1, 0,
4, 128, 3, 0, 0, 128,
1, 0, 170, 160, 1, 0,
0, 160, 5, 0, 0, 3,
3, 0, 3, 128, 1, 0,
170, 128, 1, 0, 255, 160,
66, 0, 0, 3, 4, 0,
15, 128, 0, 0, 228, 128,
1, 8, 228, 160, 66, 0,
0, 3, 1, 0, 15, 128,
1, 0, 228, 128, 1, 8,
228, 160, 66, 0, 0, 3,
2, 0, 15, 128, 2, 0,
228, 128, 1, 8, 228, 160,
66, 0, 0, 3, 3, 0,
15, 128, 3, 0, 228, 128,
1, 8, 228, 160, 18, 0,
0, 4, 5, 0, 15, 128,
0, 0, 170, 128, 4, 0,
228, 128, 1, 0, 228, 128,
18, 0, 0, 4, 1, 0,
15, 128, 0, 0, 170, 128,
2, 0, 228, 128, 3, 0,
228, 128, 18, 0, 0, 4,
2, 0, 15, 128, 0, 0,
255, 128, 1, 0, 228, 128,
5, 0, 228, 128, 5, 0,
0, 3, 0, 0, 15, 128,
2, 0, 228, 128, 0, 0,
228, 144, 1, 0, 0, 2,
0, 8, 15, 128, 0, 0,
228, 128, 255, 255, 0, 0
};

View File

@@ -0,0 +1,7 @@
#include "D3D9_PixelShader_Palette.hlsli"
float4 main(PixelShaderInput input) : SV_TARGET
{
return SamplePaletteLinear(input.tex) * input.color;
}

View File

@@ -0,0 +1,95 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 10.1
//
// Parameters:
//
// sampler2D image;
// sampler1D palette;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// image s0 1
// palette s1 1
//
ps_2_0
def c0, 255, 0.5, 0.00390625, 0
dcl t0.xy
dcl v0
dcl_2d s0
dcl_2d s1
texld r0, t0, s0
mad r0.x, r0.x, c0.x, c0.y
mul r0.xy, r0.x, c0.z
texld r0, r0, s1
mul r0, r0, v0
mov oC0, r0
// approximately 6 instruction slots used (2 texture, 4 arithmetic)
#endif
const BYTE g_ps20_main[] =
{
0, 2, 255, 255, 254, 255,
42, 0, 67, 84, 65, 66,
28, 0, 0, 0, 123, 0,
0, 0, 0, 2, 255, 255,
2, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
116, 0, 0, 0, 68, 0,
0, 0, 3, 0, 0, 0,
1, 0, 0, 0, 76, 0,
0, 0, 0, 0, 0, 0,
92, 0, 0, 0, 3, 0,
1, 0, 1, 0, 0, 0,
100, 0, 0, 0, 0, 0,
0, 0, 105, 109, 97, 103,
101, 0, 171, 171, 4, 0,
12, 0, 1, 0, 1, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 97, 108, 101,
116, 116, 101, 0, 4, 0,
11, 0, 1, 0, 1, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 115, 95, 50,
95, 48, 0, 77, 105, 99,
114, 111, 115, 111, 102, 116,
32, 40, 82, 41, 32, 72,
76, 83, 76, 32, 83, 104,
97, 100, 101, 114, 32, 67,
111, 109, 112, 105, 108, 101,
114, 32, 49, 48, 46, 49,
0, 171, 81, 0, 0, 5,
0, 0, 15, 160, 0, 0,
127, 67, 0, 0, 0, 63,
0, 0, 128, 59, 0, 0,
0, 0, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
3, 176, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
15, 144, 31, 0, 0, 2,
0, 0, 0, 144, 0, 8,
15, 160, 31, 0, 0, 2,
0, 0, 0, 144, 1, 8,
15, 160, 66, 0, 0, 3,
0, 0, 15, 128, 0, 0,
228, 176, 0, 8, 228, 160,
4, 0, 0, 4, 0, 0,
1, 128, 0, 0, 0, 128,
0, 0, 0, 160, 0, 0,
85, 160, 5, 0, 0, 3,
0, 0, 3, 128, 0, 0,
0, 128, 0, 0, 170, 160,
66, 0, 0, 3, 0, 0,
15, 128, 0, 0, 228, 128,
1, 8, 228, 160, 5, 0,
0, 3, 0, 0, 15, 128,
0, 0, 228, 128, 0, 0,
228, 144, 1, 0, 0, 2,
0, 8, 15, 128, 0, 0,
228, 128, 255, 255, 0, 0
};

View File

@@ -0,0 +1,7 @@
#include "D3D9_PixelShader_Palette.hlsli"
float4 main(PixelShaderInput input) : SV_TARGET
{
return SamplePaletteNearest(input.tex) * input.color;
}

View File

@@ -86,9 +86,7 @@ typedef struct
IDirect3DSurface9 *defaultRenderTarget;
IDirect3DSurface9 *currentRenderTarget;
void *d3dxDLL;
#ifdef SDL_HAVE_YUV
LPDIRECT3DPIXELSHADER9 shaders[NUM_SHADERS];
#endif
LPDIRECT3DVERTEXBUFFER9 vertexBuffers[8];
size_t vertexBufferSize[8];
int currentVertexBuffer;
@@ -100,8 +98,9 @@ typedef struct
typedef struct
{
D3D_TextureRep texture;
D3D9_Shader shader;
UINT shader_params_length;
const float *shader_params;
float palette_shader_params[4];
#ifdef SDL_HAVE_YUV
// YV12 texture support
@@ -657,7 +656,12 @@ static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
return false;
}
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
texturedata->shader = SHADER_PALETTE;
texturedata->shader_params_length = 1; // The palette shader takes 1 float4 parameters
texturedata->shader_params = texturedata->palette_shader_params;
texturedata->palette_shader_params[0] = 1.0f / texture->w;
texturedata->palette_shader_params[1] = 1.0f / texture->h;
texturedata->palette_shader_params[2] = texture->w;
texturedata->palette_shader_params[3] = texture->h;
}
#ifdef SDL_HAVE_YUV
if (texture->format == SDL_PIXELFORMAT_YV12 ||
@@ -672,7 +676,7 @@ static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
return false;
}
texturedata->shader = SHADER_YUV;
texturedata->shader_params_length = 4; // The YUV shader takes 4 float4 parameters
texturedata->shader_params = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
if (texturedata->shader_params == NULL) {
return SDL_SetError("Unsupported YUV colorspace");
@@ -1041,7 +1045,7 @@ static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMod
}
}
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, D3D9_Shader *shader, const float **shader_params)
static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_ScaleMode scale_mode, D3D9_Shader *shader, const float **shader_params)
{
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
@@ -1049,7 +1053,15 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, D3D9_S
return SDL_SetError("Texture is not currently available");
}
*shader = texturedata->shader;
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
if (scale_mode == SDL_SCALEMODE_LINEAR) {
*shader = SHADER_PALETTE_LINEAR;
} else {
*shader = SHADER_PALETTE_NEAREST;
}
} else if (texturedata->yuv) {
*shader = SHADER_YUV;
}
*shader_params = texturedata->shader_params;
if (!BindTextureRep(data->device, &texturedata->texture, 0)) {
@@ -1099,11 +1111,10 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
IDirect3DDevice9_SetTexture(data->device, 2, NULL);
}
#endif
if (texture && !SetupTextureState(data, texture, &shader, &shader_params)) {
if (texture && !SetupTextureState(data, texture, cmd->data.draw.texture_scale_mode, &shader, &shader_params)) {
return false;
}
#ifdef SDL_HAVE_YUV
if (shader != data->drawstate.shader) {
const HRESULT result = IDirect3DDevice9_SetPixelShader(data->device, data->shaders[shader]);
if (FAILED(result)) {
@@ -1122,7 +1133,6 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
}
data->drawstate.shader_params = shader_params;
}
#endif // SDL_HAVE_YUV
data->drawstate.texture = texture;
} else if (texture) {
@@ -1877,7 +1887,9 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
D3D_SetError("CreatePixelShader()", result);
}
}
if (caps.MaxSimultaneousTextures >= 2 && data->shaders[SHADER_PALETTE]) {
if (caps.MaxSimultaneousTextures >= 2 &&
data->shaders[SHADER_PALETTE_NEAREST] &&
data->shaders[SHADER_PALETTE_LINEAR]) {
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
}
#ifdef SDL_HAVE_YUV

View File

@@ -30,8 +30,12 @@
// The shaders here were compiled with compile_shaders.bat
#define g_ps20_main D3D9_PixelShader_Palette
#include "D3D9_PixelShader_Palette.h"
#define g_ps20_main D3D9_PixelShader_Palette_Nearest
#include "D3D9_PixelShader_Palette_Nearest.h"
#undef g_ps20_main
#define g_ps20_main D3D9_PixelShader_Palette_Linear
#include "D3D9_PixelShader_Palette_Linear.h"
#undef g_ps20_main
#define g_ps20_main D3D9_PixelShader_YUV
@@ -40,7 +44,8 @@
static const BYTE *D3D9_shaders[] = {
NULL,
D3D9_PixelShader_Palette,
D3D9_PixelShader_Palette_Nearest,
D3D9_PixelShader_Palette_Linear,
D3D9_PixelShader_YUV
};
SDL_COMPILE_TIME_ASSERT(D3D9_shaders, SDL_arraysize(D3D9_shaders) == NUM_SHADERS);

View File

@@ -25,7 +25,8 @@
typedef enum
{
SHADER_NONE,
SHADER_PALETTE,
SHADER_PALETTE_NEAREST,
SHADER_PALETTE_LINEAR,
SHADER_YUV,
NUM_SHADERS
} D3D9_Shader;

View File

@@ -1,2 +1,3 @@
fxc /T ps_2_0 /Fh D3D9_PixelShader_Palette.h D3D9_PixelShader_Palette.hlsl
fxc /T ps_2_0 /Fh D3D9_PixelShader_Palette_Nearest.h D3D9_PixelShader_Palette_Nearest.hlsl
fxc /T ps_2_0 /Fh D3D9_PixelShader_Palette_Linear.h D3D9_PixelShader_Palette_Linear.hlsl
fxc /T ps_2_0 /Fh D3D9_PixelShader_YUV.h D3D9_PixelShader_YUV.hlsl

View File

@@ -64,7 +64,7 @@ dcl_resource_texture2d (float,float,float,float) t2
dcl_input_ps linear v1.xy
dcl_input_ps linear v2.xyzw
dcl_output o0.xyzw
dcl_temps 7
dcl_temps 8
eq r0.xyzw, cb0[0].yzzz, l(0.000000, 3.000000, 2.000000, 1.000000)
if_nz r0.x
mov r1.xyzw, l(1.000000,1.000000,1.000000,1.000000)
@@ -106,6 +106,90 @@ else
sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r2.xyxx, t1.xyzw, s1
else
eq r0.x, cb0[0].y, l(4.000000)
if_nz r0.x
mad r2.xy, v1.xyxx, cb0[1].zwzz, l(0.500000, 0.500000, 0.000000, 0.000000)
round_ni r3.xyzw, r2.xyxy
add r3.xyzw, r3.xyzw, l(-0.500000, -0.500000, 0.500000, 0.500000)
mul r3.xyzw, r3.xyzw, cb0[1].xyxy
frc r2.xy, r2.xyxx
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.xyxx, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r4.x, r0.x, l(0.003906)
mov r4.yw, l(0,0.500000,0,0.500000)
sample_indexable(texture2d)(float,float,float,float) r5.xyzw, r4.xyxx, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.xwxx, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r4.z, r0.x, l(0.003906)
sample_indexable(texture2d)(float,float,float,float) r4.xyzw, r4.zwzz, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.zyzz, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r6.x, r0.x, l(0.003906)
mov r6.yw, l(0,0.500000,0,0.500000)
sample_indexable(texture2d)(float,float,float,float) r7.xyzw, r6.xyxx, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.zwzz, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r6.z, r0.x, l(0.003906)
sample_indexable(texture2d)(float,float,float,float) r3.xyzw, r6.zwzz, t1.xyzw, s1
add r4.xyzw, -r5.xyzw, r4.xyzw
mad r4.xyzw, r2.yyyy, r4.xyzw, r5.xyzw
add r3.xyzw, -r7.xyzw, r3.xyzw
mad r3.xyzw, r2.yyyy, r3.xyzw, r7.xyzw
add r3.xyzw, -r4.xyzw, r3.xyzw
mad r1.xyzw, r2.xxxx, r3.xyzw, r4.xyzw
else
eq r0.x, cb0[0].y, l(5.000000)
if_nz r0.x
deriv_rtx_coarse r2.xy, v1.xyxx
deriv_rty_coarse r2.zw, v1.xxxy
add r2.xy, |r2.zwzz|, |r2.xyxx|
mul r2.xy, r2.xyxx, cb0[1].zwzz
max r2.xy, r2.xyxx, l(0.000010, 0.000010, 0.000000, 0.000000)
min r2.xy, r2.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)
mul r2.zw, r2.xxxy, l(0.000000, 0.000000, 0.500000, 0.500000)
mad r2.zw, v1.xxxy, cb0[1].zzzw, -r2.zzzw
add r2.xy, -r2.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)
frc r3.xy, r2.zwzz
add r3.zw, -r2.xxxy, l(0.000000, 0.000000, 1.000000, 1.000000)
add r2.xy, -r2.xyxx, r3.xyxx
div r3.xy, l(1.000000, 1.000000, 1.000000, 1.000000), r3.zwzz
mul_sat r2.xy, r2.xyxx, r3.xyxx
mad r3.xy, r2.xyxx, l(-2.000000, -2.000000, 0.000000, 0.000000), l(3.000000, 3.000000, 0.000000, 0.000000)
mul r2.xy, r2.xyxx, r2.xyxx
round_ni r2.zw, r2.zzzw
mad r2.xy, r3.xyxx, r2.xyxx, r2.zwzz
add r2.xy, r2.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000)
mul r2.xy, r2.xyxx, cb0[1].xyxx
mad r2.xy, r2.xyxx, cb0[1].zwzz, l(0.500000, 0.500000, 0.000000, 0.000000)
round_ni r3.xyzw, r2.xyxy
add r3.xyzw, r3.xyzw, l(-0.500000, -0.500000, 0.500000, 0.500000)
mul r3.xyzw, r3.xyzw, cb0[1].xyxy
frc r2.xy, r2.xyxx
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.xyxx, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r4.x, r0.x, l(0.003906)
mov r4.yw, l(0,0.500000,0,0.500000)
sample_indexable(texture2d)(float,float,float,float) r5.xyzw, r4.xyxx, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.xwxx, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r4.z, r0.x, l(0.003906)
sample_indexable(texture2d)(float,float,float,float) r4.xyzw, r4.zwzz, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.zyzz, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r6.x, r0.x, l(0.003906)
mov r6.yw, l(0,0.500000,0,0.500000)
sample_indexable(texture2d)(float,float,float,float) r7.xyzw, r6.xyxx, t1.xyzw, s1
sample_indexable(texture2d)(float,float,float,float) r0.x, r3.zwzz, t0.xyzw, s0
mad r0.x, r0.x, l(255.000000), l(0.500000)
mul r6.z, r0.x, l(0.003906)
sample_indexable(texture2d)(float,float,float,float) r3.xyzw, r6.zwzz, t1.xyzw, s1
add r4.xyzw, -r5.xyzw, r4.xyzw
mad r4.xyzw, r2.yyyy, r4.xyzw, r5.xyzw
add r3.xyzw, -r7.xyzw, r3.xyzw
mad r3.xyzw, r2.yyyy, r3.xyzw, r7.xyzw
add r3.xyzw, -r4.xyzw, r3.xyzw
mad r1.xyzw, r2.xxxx, r3.xyzw, r4.xyzw
else
eq r0.x, cb0[0].y, l(6.000000)
if_nz r0.x
sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
sample_indexable(texture2d)(float,float,float,float) r2.yz, v1.xyxx, t1.zxyw, s0
@@ -114,7 +198,7 @@ else
dp3 r1.y, r2.xyzx, cb0[5].xyzx
dp3 r1.z, r2.xyzx, cb0[6].xyzx
else
eq r0.x, cb0[0].y, l(5.000000)
eq r0.x, cb0[0].y, l(7.000000)
if_nz r0.x
sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
sample_indexable(texture2d)(float,float,float,float) r2.yz, v1.xyxx, t1.zyxw, s0
@@ -123,7 +207,7 @@ else
dp3 r1.y, r2.xyzx, cb0[5].xyzx
dp3 r1.z, r2.xyzx, cb0[6].xyzx
else
eq r0.x, cb0[0].y, l(6.000000)
eq r0.x, cb0[0].y, l(8.000000)
if_nz r0.x
sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
sample_indexable(texture2d)(float,float,float,float) r2.y, v1.xyxx, t1.yxzw, s0
@@ -133,7 +217,7 @@ else
dp3 r1.y, r2.xyzx, cb0[5].xyzx
dp3 r1.z, r2.xyzx, cb0[6].xyzx
else
mov r1.xyz, l(1.000000,0,0,0)
mov r1.xyz, l(1.000000,0,1.000000,0)
endif
endif
endif
@@ -142,6 +226,8 @@ else
endif
endif
endif
endif
endif
log r2.xyz, |r1.xyzx|
mul r2.xyz, r2.xyzx, l(0.012683, 0.012683, 0.012683, 0.000000)
exp r2.xyz, r2.xyzx
@@ -225,20 +311,20 @@ else
endif
mul o0.xyzw, r1.xyzw, v2.xyzw
ret
// Approximately 160 instruction slots used
// Approximately 246 instruction slots used
#endif
const BYTE g_main[] =
{
68, 88, 66, 67, 189, 249,
3, 160, 168, 14, 177, 240,
224, 229, 45, 241, 216, 176,
187, 190, 1, 0, 0, 0,
172, 24, 0, 0, 5, 0,
68, 88, 66, 67, 218, 34,
85, 97, 34, 23, 186, 108,
107, 10, 84, 63, 204, 132,
47, 109, 1, 0, 0, 0,
236, 35, 0, 0, 5, 0,
0, 0, 52, 0, 0, 0,
168, 4, 0, 0, 28, 5,
0, 0, 80, 5, 0, 0,
16, 24, 0, 0, 82, 68,
80, 35, 0, 0, 82, 68,
69, 70, 108, 4, 0, 0,
1, 0, 0, 0, 52, 1,
0, 0, 6, 0, 0, 0,
@@ -457,8 +543,8 @@ const BYTE g_main[] =
15, 0, 0, 0, 83, 86,
95, 84, 65, 82, 71, 69,
84, 0, 171, 171, 83, 72,
69, 88, 184, 18, 0, 0,
80, 0, 0, 0, 174, 4,
69, 88, 248, 29, 0, 0,
80, 0, 0, 0, 126, 7,
0, 0, 106, 8, 0, 1,
89, 0, 0, 4, 70, 142,
32, 0, 0, 0, 0, 0,
@@ -481,7 +567,7 @@ const BYTE g_main[] =
2, 0, 0, 0, 101, 0,
0, 3, 242, 32, 16, 0,
0, 0, 0, 0, 104, 0,
0, 2, 7, 0, 0, 0,
0, 2, 8, 0, 0, 0,
24, 0, 0, 11, 242, 0,
16, 0, 0, 0, 0, 0,
150, 138, 32, 0, 0, 0,
@@ -690,150 +776,630 @@ const BYTE g_main[] =
0, 0, 1, 64, 0, 0,
0, 0, 128, 64, 31, 0,
4, 3, 10, 0, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 18, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 70, 126, 16, 0,
0, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
98, 0, 16, 0, 2, 0,
0, 0, 70, 16, 16, 0,
1, 0, 0, 0, 38, 125,
16, 0, 1, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 0, 0, 0, 8,
114, 0, 16, 0, 2, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
3, 0, 0, 0, 16, 0,
0, 8, 18, 0, 16, 0,
1, 0, 0, 0, 70, 2,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 4, 0, 0, 0,
16, 0, 0, 8, 34, 0,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 16, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 18, 0,
0, 1, 24, 0, 0, 8,
18, 0, 16, 0, 0, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 160, 64, 31, 0,
4, 3, 10, 0, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 18, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 70, 126, 16, 0,
0, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
98, 0, 16, 0, 2, 0,
0, 0, 70, 16, 16, 0,
1, 0, 0, 0, 102, 124,
16, 0, 1, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 0, 0, 0, 8,
114, 0, 16, 0, 2, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
3, 0, 0, 0, 16, 0,
0, 8, 18, 0, 16, 0,
1, 0, 0, 0, 70, 2,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 4, 0, 0, 0,
16, 0, 0, 8, 34, 0,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 16, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 18, 0,
0, 1, 24, 0, 0, 8,
18, 0, 16, 0, 0, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 192, 64, 31, 0,
4, 3, 10, 0, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 18, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 70, 126, 16, 0,
0, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
34, 0, 16, 0, 2, 0,
0, 0, 70, 16, 16, 0,
1, 0, 0, 0, 22, 126,
16, 0, 1, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 66, 0, 16, 0,
0, 0, 0, 0, 50, 0,
0, 13, 50, 0, 16, 0,
2, 0, 0, 0, 70, 16,
16, 0, 1, 0, 0, 0,
150, 124, 16, 0, 2, 0,
0, 0, 0, 96, 16, 0,
230, 138, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 63, 0, 0, 0, 63,
0, 0, 0, 0, 0, 0,
0, 8, 114, 0, 16, 0,
2, 0, 0, 0, 70, 2,
0, 0, 65, 0, 0, 5,
242, 0, 16, 0, 3, 0,
0, 0, 70, 4, 16, 0,
2, 0, 0, 0, 0, 0,
0, 10, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 191, 0, 0, 0, 191,
0, 0, 0, 63, 0, 0,
0, 63, 56, 0, 0, 8,
242, 0, 16, 0, 3, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 70, 132,
32, 0, 0, 0, 0, 0,
1, 0, 0, 0, 26, 0,
0, 5, 50, 0, 16, 0,
2, 0, 0, 0, 70, 0,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 3, 0, 0, 0,
16, 0, 0, 8, 18, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
18, 0, 16, 0, 0, 0,
0, 0, 70, 0, 16, 0,
3, 0, 0, 0, 70, 126,
16, 0, 0, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 50, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 127, 67,
1, 64, 0, 0, 0, 0,
0, 63, 56, 0, 0, 7,
18, 0, 16, 0, 4, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 128, 59,
54, 0, 0, 8, 162, 0,
16, 0, 4, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 63,
0, 0, 0, 0, 0, 0,
0, 63, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 242, 0, 16, 0,
5, 0, 0, 0, 70, 0,
16, 0, 4, 0, 0, 0,
70, 126, 16, 0, 1, 0,
0, 0, 0, 96, 16, 0,
1, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 18, 0,
16, 0, 0, 0, 0, 0,
198, 0, 16, 0, 3, 0,
0, 0, 70, 126, 16, 0,
0, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
50, 0, 0, 9, 18, 0,
16, 0, 0, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 127, 67, 1, 64,
0, 0, 0, 0, 0, 63,
56, 0, 0, 7, 66, 0,
16, 0, 4, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 128, 59, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 242, 0,
16, 0, 4, 0, 0, 0,
230, 10, 16, 0, 4, 0,
0, 0, 70, 126, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 1, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
18, 0, 16, 0, 0, 0,
0, 0, 102, 10, 16, 0,
3, 0, 0, 0, 70, 126,
16, 0, 0, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 50, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 127, 67,
1, 64, 0, 0, 0, 0,
0, 63, 56, 0, 0, 7,
18, 0, 16, 0, 6, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 128, 59,
54, 0, 0, 8, 162, 0,
16, 0, 6, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 63,
0, 0, 0, 0, 0, 0,
0, 63, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 242, 0, 16, 0,
7, 0, 0, 0, 70, 0,
16, 0, 6, 0, 0, 0,
70, 126, 16, 0, 1, 0,
0, 0, 0, 96, 16, 0,
1, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 18, 0,
16, 0, 0, 0, 0, 0,
230, 10, 16, 0, 3, 0,
0, 0, 70, 126, 16, 0,
0, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
50, 0, 0, 9, 18, 0,
16, 0, 0, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 127, 67, 1, 64,
0, 0, 0, 0, 0, 63,
56, 0, 0, 7, 66, 0,
16, 0, 6, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
0, 0, 128, 59, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 242, 0,
16, 0, 3, 0, 0, 0,
230, 10, 16, 0, 6, 0,
0, 0, 70, 126, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 1, 0, 0, 0,
0, 0, 0, 8, 242, 0,
16, 0, 4, 0, 0, 0,
70, 14, 16, 128, 65, 0,
0, 0, 5, 0, 0, 0,
70, 14, 16, 0, 4, 0,
0, 0, 50, 0, 0, 9,
242, 0, 16, 0, 4, 0,
0, 0, 86, 5, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 4, 0, 0, 0,
70, 14, 16, 0, 5, 0,
0, 0, 0, 0, 0, 8,
242, 0, 16, 0, 3, 0,
0, 0, 70, 14, 16, 128,
65, 0, 0, 0, 7, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 50, 0,
0, 9, 242, 0, 16, 0,
3, 0, 0, 0, 86, 5,
16, 0, 2, 0, 0, 0,
70, 14, 16, 0, 3, 0,
0, 0, 70, 14, 16, 0,
7, 0, 0, 0, 0, 0,
0, 8, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 128, 65, 0, 0, 0,
4, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
50, 0, 0, 9, 242, 0,
16, 0, 1, 0, 0, 0,
6, 0, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 4, 0, 0, 0,
18, 0, 0, 1, 24, 0,
0, 8, 18, 0, 16, 0,
0, 0, 0, 0, 26, 128,
32, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 160, 64,
31, 0, 4, 3, 10, 0,
16, 0, 0, 0, 0, 0,
122, 0, 0, 5, 50, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 124, 0, 0, 5,
194, 0, 16, 0, 2, 0,
0, 0, 6, 20, 16, 0,
1, 0, 0, 0, 0, 0,
0, 9, 50, 0, 16, 0,
2, 0, 0, 0, 230, 10,
16, 128, 129, 0, 0, 0,
2, 0, 0, 0, 70, 0,
16, 128, 129, 0, 0, 0,
2, 0, 0, 0, 56, 0,
0, 8, 50, 0, 16, 0,
2, 0, 0, 0, 70, 0,
16, 0, 2, 0, 0, 0,
230, 138, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
52, 0, 0, 10, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
172, 197, 39, 55, 172, 197,
39, 55, 0, 0, 0, 0,
0, 0, 0, 0, 51, 0,
0, 10, 50, 0, 16, 0,
2, 0, 0, 0, 70, 0,
16, 0, 2, 0, 0, 0,
2, 64, 0, 0, 0, 0,
128, 63, 0, 0, 128, 63,
0, 0, 0, 0, 0, 0,
0, 0, 56, 0, 0, 10,
194, 0, 16, 0, 2, 0,
0, 0, 6, 4, 16, 0,
2, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 63, 0, 0, 0, 63,
50, 0, 0, 11, 194, 0,
16, 0, 2, 0, 0, 0,
6, 20, 16, 0, 1, 0,
0, 0, 166, 142, 32, 0,
0, 0, 0, 0, 1, 0,
0, 0, 166, 14, 16, 128,
65, 0, 0, 0, 2, 0,
0, 0, 0, 0, 0, 11,
50, 0, 16, 0, 2, 0,
0, 0, 70, 0, 16, 128,
65, 0, 0, 0, 2, 0,
0, 0, 2, 64, 0, 0,
0, 0, 128, 63, 0, 0,
128, 63, 0, 0, 0, 0,
0, 0, 0, 0, 26, 0,
0, 5, 50, 0, 16, 0,
3, 0, 0, 0, 230, 10,
16, 0, 2, 0, 0, 0,
0, 0, 0, 11, 194, 0,
16, 0, 3, 0, 0, 0,
6, 4, 16, 128, 65, 0,
0, 0, 2, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 128, 63, 0, 0,
128, 63, 0, 0, 0, 8,
50, 0, 16, 0, 2, 0,
0, 0, 70, 0, 16, 128,
65, 0, 0, 0, 2, 0,
0, 0, 70, 0, 16, 0,
3, 0, 0, 0, 14, 0,
0, 10, 50, 0, 16, 0,
3, 0, 0, 0, 2, 64,
0, 0, 0, 0, 128, 63,
0, 0, 128, 63, 0, 0,
128, 63, 0, 0, 128, 63,
230, 10, 16, 0, 3, 0,
0, 0, 56, 32, 0, 7,
50, 0, 16, 0, 2, 0,
0, 0, 70, 0, 16, 0,
2, 0, 0, 0, 70, 0,
16, 0, 3, 0, 0, 0,
50, 0, 0, 15, 50, 0,
16, 0, 3, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 192, 0, 0,
0, 192, 0, 0, 0, 0,
0, 0, 0, 0, 2, 64,
0, 0, 0, 0, 64, 64,
0, 0, 64, 64, 0, 0,
0, 0, 0, 0, 0, 0,
56, 0, 0, 7, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 70, 0, 16, 0,
2, 0, 0, 0, 65, 0,
0, 5, 194, 0, 16, 0,
2, 0, 0, 0, 166, 14,
16, 0, 2, 0, 0, 0,
50, 0, 0, 9, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 3, 0,
0, 0, 70, 0, 16, 0,
2, 0, 0, 0, 230, 10,
16, 0, 2, 0, 0, 0,
0, 0, 0, 10, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 63, 0, 0,
0, 63, 0, 0, 0, 0,
0, 0, 0, 0, 56, 0,
0, 8, 50, 0, 16, 0,
2, 0, 0, 0, 70, 0,
16, 0, 2, 0, 0, 0,
70, 128, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
50, 0, 0, 13, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 230, 138, 32, 0,
0, 0, 0, 0, 1, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 63, 0, 0,
0, 63, 0, 0, 0, 0,
0, 0, 0, 0, 65, 0,
0, 5, 242, 0, 16, 0,
3, 0, 0, 0, 70, 4,
16, 0, 2, 0, 0, 0,
0, 0, 0, 10, 242, 0,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 3, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 191, 0, 0,
0, 191, 0, 0, 0, 63,
0, 0, 0, 63, 56, 0,
0, 8, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
70, 132, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
26, 0, 0, 5, 50, 0,
16, 0, 2, 0, 0, 0,
70, 0, 16, 0, 2, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 18, 0, 16, 0,
0, 0, 0, 0, 70, 0,
16, 0, 3, 0, 0, 0,
70, 126, 16, 0, 0, 0,
0, 0, 0, 96, 16, 0,
0, 0, 0, 0, 50, 0,
0, 9, 18, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
127, 67, 1, 64, 0, 0,
0, 0, 0, 63, 56, 0,
0, 7, 18, 0, 16, 0,
4, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
128, 59, 54, 0, 0, 8,
162, 0, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 0, 0, 0,
0, 63, 0, 0, 0, 0,
0, 0, 0, 63, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 242, 0,
16, 0, 5, 0, 0, 0,
70, 0, 16, 0, 4, 0,
0, 0, 70, 126, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 1, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
18, 0, 16, 0, 0, 0,
0, 0, 198, 0, 16, 0,
3, 0, 0, 0, 70, 126,
16, 0, 0, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 50, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 127, 67,
1, 64, 0, 0, 0, 0,
0, 63, 56, 0, 0, 7,
66, 0, 16, 0, 4, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 128, 59,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
242, 0, 16, 0, 4, 0,
0, 0, 230, 10, 16, 0,
4, 0, 0, 0, 70, 126,
16, 0, 1, 0, 0, 0,
0, 96, 16, 0, 1, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 18, 0, 16, 0,
0, 0, 0, 0, 102, 10,
16, 0, 3, 0, 0, 0,
70, 126, 16, 0, 0, 0,
0, 0, 0, 96, 16, 0,
0, 0, 0, 0, 50, 0,
0, 9, 18, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
127, 67, 1, 64, 0, 0,
0, 0, 0, 63, 56, 0,
0, 7, 18, 0, 16, 0,
6, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
128, 59, 54, 0, 0, 8,
162, 0, 16, 0, 6, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 0, 0, 0,
0, 63, 0, 0, 0, 0,
0, 0, 0, 63, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 242, 0,
16, 0, 7, 0, 0, 0,
70, 0, 16, 0, 6, 0,
0, 0, 70, 126, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 1, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
18, 0, 16, 0, 0, 0,
0, 0, 230, 10, 16, 0,
3, 0, 0, 0, 70, 126,
16, 0, 0, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 50, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 127, 67,
1, 64, 0, 0, 0, 0,
0, 63, 56, 0, 0, 7,
66, 0, 16, 0, 6, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 128, 59,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
242, 0, 16, 0, 3, 0,
0, 0, 230, 10, 16, 0,
6, 0, 0, 0, 70, 126,
16, 0, 1, 0, 0, 0,
0, 96, 16, 0, 1, 0,
0, 0, 0, 0, 0, 8,
242, 0, 16, 0, 4, 0,
0, 0, 70, 14, 16, 128,
65, 0, 0, 0, 5, 0,
0, 0, 70, 14, 16, 0,
4, 0, 0, 0, 50, 0,
0, 9, 242, 0, 16, 0,
4, 0, 0, 0, 86, 5,
16, 0, 2, 0, 0, 0,
70, 14, 16, 0, 4, 0,
0, 0, 70, 14, 16, 0,
5, 0, 0, 0, 0, 0,
0, 8, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 128, 65, 0, 0, 0,
7, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
50, 0, 0, 9, 242, 0,
16, 0, 3, 0, 0, 0,
86, 5, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 7, 0, 0, 0,
0, 0, 0, 8, 242, 0,
16, 0, 3, 0, 0, 0,
70, 14, 16, 128, 65, 0,
0, 0, 4, 0, 0, 0,
70, 14, 16, 0, 3, 0,
0, 0, 50, 0, 0, 9,
242, 0, 16, 0, 1, 0,
0, 0, 6, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 4, 0,
0, 0, 18, 0, 0, 1,
24, 0, 0, 8, 18, 0,
16, 0, 0, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
192, 64, 31, 0, 4, 3,
10, 0, 16, 0, 0, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 18, 0, 16, 0,
2, 0, 0, 0, 70, 16,
16, 0, 1, 0, 0, 0,
70, 126, 16, 0, 0, 0,
0, 0, 0, 96, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 98, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 38, 125, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
0, 0, 0, 8, 114, 0,
16, 0, 2, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 3, 0,
0, 0, 16, 0, 0, 8,
34, 0, 16, 0, 1, 0,
18, 0, 16, 0, 1, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
5, 0, 0, 0, 16, 0,
0, 8, 66, 0, 16, 0,
4, 0, 0, 0, 16, 0,
0, 8, 34, 0, 16, 0,
1, 0, 0, 0, 70, 2,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 6, 0, 0, 0,
18, 0, 0, 1, 54, 0,
0, 8, 114, 0, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 5, 0, 0, 0,
16, 0, 0, 8, 66, 0,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 18, 0, 0, 1,
24, 0, 0, 8, 18, 0,
16, 0, 0, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
224, 64, 31, 0, 4, 3,
10, 0, 16, 0, 0, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 18, 0, 16, 0,
2, 0, 0, 0, 70, 16,
16, 0, 1, 0, 0, 0,
70, 126, 16, 0, 0, 0,
0, 0, 0, 96, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 98, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 102, 124, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
0, 0, 0, 8, 114, 0,
16, 0, 2, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 3, 0,
0, 0, 16, 0, 0, 8,
18, 0, 16, 0, 1, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
4, 0, 0, 0, 16, 0,
0, 8, 34, 0, 16, 0,
1, 0, 0, 0, 70, 2,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 5, 0, 0, 0,
16, 0, 0, 8, 66, 0,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 18, 0, 0, 1,
24, 0, 0, 8, 18, 0,
16, 0, 0, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 65, 31, 0, 4, 3,
10, 0, 16, 0, 0, 0,
0, 0, 69, 0, 0, 139,
194, 0, 0, 128, 67, 85,
21, 0, 18, 0, 16, 0,
2, 0, 0, 0, 70, 16,
16, 0, 1, 0, 0, 0,
70, 126, 16, 0, 0, 0,
0, 0, 0, 96, 16, 0,
0, 0, 0, 0, 69, 0,
0, 139, 194, 0, 0, 128,
67, 85, 21, 0, 34, 0,
16, 0, 2, 0, 0, 0,
70, 16, 16, 0, 1, 0,
0, 0, 22, 126, 16, 0,
1, 0, 0, 0, 0, 96,
16, 0, 0, 0, 0, 0,
69, 0, 0, 139, 194, 0,
0, 128, 67, 85, 21, 0,
66, 0, 16, 0, 2, 0,
0, 0, 70, 16, 16, 0,
1, 0, 0, 0, 150, 124,
16, 0, 2, 0, 0, 0,
0, 96, 16, 0, 0, 0,
0, 0, 0, 0, 0, 8,
114, 0, 16, 0, 2, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
3, 0, 0, 0, 16, 0,
0, 8, 18, 0, 16, 0,
1, 0, 0, 0, 70, 2,
16, 0, 2, 0, 0, 0,
70, 130, 32, 0, 0, 0,
0, 0, 4, 0, 0, 0,
16, 0, 0, 8, 34, 0,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 70, 130, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 16, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 70, 2, 16, 0,
2, 0, 0, 0, 70, 130,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 18, 0,
0, 1, 54, 0, 0, 8,
114, 0, 16, 0, 1, 0,
0, 0, 2, 64, 0, 0,
0, 0, 128, 63, 0, 0,
0, 0, 0, 0, 128, 63,
0, 0, 0, 0, 21, 0,
0, 1, 21, 0, 0, 1,
21, 0, 0, 1, 54, 0,
0, 5, 130, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 128, 63,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 21, 0,
0, 1, 21, 0, 0, 1,
54, 0, 0, 5, 130, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0,
128, 63, 21, 0, 0, 1,
21, 0, 0, 1, 21, 0,
0, 1, 21, 0, 0, 1,
47, 0, 0, 6, 114, 0,
@@ -1258,21 +1824,21 @@ const BYTE g_main[] =
16, 0, 2, 0, 0, 0,
62, 0, 0, 1, 83, 84,
65, 84, 148, 0, 0, 0,
160, 0, 0, 0, 7, 0,
246, 0, 0, 0, 8, 0,
0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 95, 0,
3, 0, 0, 0, 155, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 11, 0,
0, 0, 13, 0, 0, 0,
0, 0, 0, 0, 13, 0,
0, 0, 15, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 8, 0,
0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 4, 0,
0, 0, 10, 0, 0, 0,
5, 0, 0, 0, 0, 0,
11, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,

View File

@@ -20,10 +20,12 @@ static const float TONEMAP_CHROME = 2;
static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_NV12 = 4;
static const float TEXTURETYPE_NV21 = 5;
static const float TEXTURETYPE_YUV = 6;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -118,21 +120,48 @@ float3 ApplyTonemap(float3 v)
return v;
}
float2 GetPixelArtUV(PixelShaderInput input)
float4 SamplePaletteNearest(float2 uv)
{
float index = texture0.Sample(sampler0, uv).r * 255;
return texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(float2 uv)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = frac(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(uv_min_max.xy);
float4 texelB = SamplePaletteNearest(uv_min_max.xw);
float4 texelC = SamplePaletteNearest(uv_min_max.zy);
float4 texelD = SamplePaletteNearest(uv_min_max.zw);
// bilinear interpolation
return lerp(lerp(texelA, texelB, uv_frac.y), lerp(texelC, texelD, uv_frac.y), uv_frac.x);
}
float2 GetPixelArtUV(float2 uv)
{
// box filter size in texel units
float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
float2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1);
// scale uv by texture size to get texel coordinate
float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
float2 tx = uv * texel_size.zw - 0.5 * boxSize;
// compute offset for pixel-sized box filter
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
// compute bilinear sample uv coordinates
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
return uv;
return (floor(tx) + 0.5 + txOffset) * texel_size.xy;
}
float4 GetInputColor(PixelShaderInput input)
@@ -144,11 +173,15 @@ float4 GetInputColor(PixelShaderInput input)
} else if (texture_type == TEXTURETYPE_RGB) {
rgba = texture0.Sample(sampler0, input.tex);
} else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
float2 uv = GetPixelArtUV(input);
float2 uv = GetPixelArtUV(input.tex);
rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
} else if (texture_type == TEXTURETYPE_PALETTE) {
float index = texture0.Sample(sampler0, input.tex).r * 255;
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
} else if (texture_type == TEXTURETYPE_PALETTE_NEAREST) {
rgba = SamplePaletteNearest(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_LINEAR) {
rgba = SamplePaletteLinear(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
float2 uv = GetPixelArtUV(input.tex);
rgba = SamplePaletteLinear(uv);
} else if (texture_type == TEXTURETYPE_NV12) {
float3 yuv;
yuv.x = texture0.Sample(sampler0, input.tex).r;
@@ -184,7 +217,7 @@ float4 GetInputColor(PixelShaderInput input)
// Error!
rgba.r = 1.0;
rgba.g = 0.0;
rgba.b = 0.0;
rgba.b = 1.0;
rgba.a = 1.0;
}
return rgba;

View File

@@ -69,10 +69,12 @@ static const float TONEMAP_CHROME = 2;
//static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_NV12 = 4;
static const float TEXTURETYPE_NV21 = 5;
static const float TEXTURETYPE_YUV = 6;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -2189,8 +2191,20 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX8:
constants->texture_type = TEXTURETYPE_PALETTE;
constants->input_type = INPUTTYPE_UNSPECIFIED;
switch (cmd->data.draw.texture_scale_mode) {
case SDL_SCALEMODE_NEAREST:
constants->texture_type = TEXTURETYPE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
constants->texture_type = TEXTURETYPE_PALETTE_LINEAR;
break;
case SDL_SCALEMODE_PIXELART:
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
break;
default:
SDL_assert(!"Unknown scale mode");
break;
}
break;
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
@@ -2212,10 +2226,6 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
default:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
constants->texture_type = TEXTURETYPE_RGB_PIXELART;
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
} else {
constants->texture_type = TEXTURETYPE_RGB;
}
@@ -2230,6 +2240,15 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
break;
}
if (constants->texture_type == TEXTURETYPE_PALETTE_LINEAR ||
constants->texture_type == TEXTURETYPE_PALETTE_PIXELART ||
constants->texture_type == TEXTURETYPE_RGB_PIXELART) {
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
}
constants->sdr_white_point = texture->SDR_white_point;
if (renderer->target) {
@@ -2429,7 +2448,7 @@ static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
return true;
}
static ID3D11SamplerState *D3D11_GetSamplerState(D3D11_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
static ID3D11SamplerState *D3D11_GetSamplerState(D3D11_RenderData *data, SDL_PixelFormat format, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
{
Uint32 key = RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v);
SDL_assert(key < SDL_arraysize(data->samplers));
@@ -2448,7 +2467,12 @@ static ID3D11SamplerState *D3D11_GetSamplerState(D3D11_RenderData *data, SDL_Sca
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
} else {
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
}
break;
default:
SDL_SetError("Unknown scale mode: %d", scale_mode);
@@ -2506,7 +2530,7 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
shaderResources[numShaderResources++] = textureData->mainTextureResourceView;
shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, texture->format, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
if (!shaderSamplers[numShaderSamplers]) {
return false;
}
@@ -2517,7 +2541,7 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
shaderResources[numShaderResources++] = palette->resourceView;
shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
if (!shaderSamplers[numShaderSamplers]) {
return false;
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,10 +21,12 @@ static const float TONEMAP_CHROME = 2;
static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_NV12 = 4;
static const float TEXTURETYPE_NV21 = 5;
static const float TEXTURETYPE_YUV = 6;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -119,21 +121,48 @@ float3 ApplyTonemap(float3 v)
return v;
}
float2 GetPixelArtUV(PixelShaderInput input)
float4 SamplePaletteNearest(float2 uv)
{
float index = texture0.Sample(sampler0, uv).r * 255;
return texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(float2 uv)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = frac(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(uv_min_max.xy);
float4 texelB = SamplePaletteNearest(uv_min_max.xw);
float4 texelC = SamplePaletteNearest(uv_min_max.zy);
float4 texelD = SamplePaletteNearest(uv_min_max.zw);
// bilinear interpolation
return lerp(lerp(texelA, texelB, uv_frac.y), lerp(texelC, texelD, uv_frac.y), uv_frac.x);
}
float2 GetPixelArtUV(float2 uv)
{
// box filter size in texel units
float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
float2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1);
// scale uv by texture size to get texel coordinate
float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
float2 tx = uv * texel_size.zw - 0.5 * boxSize;
// compute offset for pixel-sized box filter
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
// compute bilinear sample uv coordinates
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
return uv;
return (floor(tx) + 0.5 + txOffset) * texel_size.xy;
}
float4 GetInputColor(PixelShaderInput input)
@@ -145,11 +174,15 @@ float4 GetInputColor(PixelShaderInput input)
} else if (texture_type == TEXTURETYPE_RGB) {
rgba = texture0.Sample(sampler0, input.tex);
} else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
float2 uv = GetPixelArtUV(input);
float2 uv = GetPixelArtUV(input.tex);
rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
} else if (texture_type == TEXTURETYPE_PALETTE) {
float index = texture0.Sample(sampler0, input.tex).r * 255;
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
} else if (texture_type == TEXTURETYPE_PALETTE_NEAREST) {
rgba = SamplePaletteNearest(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_LINEAR) {
rgba = SamplePaletteLinear(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
float2 uv = GetPixelArtUV(input.tex);
rgba = SamplePaletteLinear(uv);
} else if (texture_type == TEXTURETYPE_NV12) {
float3 yuv;
yuv.x = texture0.Sample(sampler0, input.tex).r;
@@ -185,7 +218,7 @@ float4 GetInputColor(PixelShaderInput input)
// Error!
rgba.r = 1.0;
rgba.g = 0.0;
rgba.b = 0.0;
rgba.b = 1.0;
rgba.a = 1.0;
}
return rgba;

View File

@@ -70,10 +70,12 @@ static const float TONEMAP_CHROME = 2;
//static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_NV12 = 4;
static const float TEXTURETYPE_NV21 = 5;
static const float TEXTURETYPE_YUV = 6;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -2599,8 +2601,20 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX8:
constants->texture_type = TEXTURETYPE_PALETTE;
constants->input_type = INPUTTYPE_UNSPECIFIED;
switch (cmd->data.draw.texture_scale_mode) {
case SDL_SCALEMODE_NEAREST:
constants->texture_type = TEXTURETYPE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
constants->texture_type = TEXTURETYPE_PALETTE_LINEAR;
break;
case SDL_SCALEMODE_PIXELART:
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
break;
default:
SDL_assert(!"Unknown scale mode");
break;
}
break;
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
@@ -2622,10 +2636,6 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
default:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
constants->texture_type = TEXTURETYPE_RGB_PIXELART;
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
} else {
constants->texture_type = TEXTURETYPE_RGB;
}
@@ -2640,6 +2650,15 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
break;
}
if (constants->texture_type == TEXTURETYPE_PALETTE_LINEAR ||
constants->texture_type == TEXTURETYPE_PALETTE_PIXELART ||
constants->texture_type == TEXTURETYPE_RGB_PIXELART) {
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
}
constants->sdr_white_point = texture->SDR_white_point;
if (renderer->target) {
@@ -2848,7 +2867,7 @@ static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
return true;
}
static D3D12_CPU_DESCRIPTOR_HANDLE *D3D12_GetSamplerState(D3D12_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
static D3D12_CPU_DESCRIPTOR_HANDLE *D3D12_GetSamplerState(D3D12_RenderData *data, SDL_PixelFormat format, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
{
Uint32 key = RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v);
SDL_assert(key < SDL_arraysize(data->samplers));
@@ -2867,7 +2886,12 @@ static D3D12_CPU_DESCRIPTOR_HANDLE *D3D12_GetSamplerState(D3D12_RenderData *data
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
} else {
samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
}
break;
default:
SDL_SetError("Unknown scale mode: %d", scale_mode);
@@ -2923,7 +2947,7 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
shaderResources[numShaderResources++] = textureData->mainTextureResourceView;
textureSampler = D3D12_GetSamplerState(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
textureSampler = D3D12_GetSamplerState(rendererData, texture->format, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
if (!textureSampler) {
return false;
}
@@ -2936,7 +2960,7 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
palette->resourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
shaderResources[numShaderResources++] = palette->resourceView;
textureSampler = D3D12_GetSamplerState(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
textureSampler = D3D12_GetSamplerState(rendererData, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
if (!textureSampler) {
return false;
}

View File

@@ -70,10 +70,12 @@ static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_RGBA = 3;
static const float TEXTURETYPE_RGBA_PIXELART = 4;
static const float TEXTURETYPE_PALETTE = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float TEXTURETYPE_PALETTE_NEAREST = 5;
static const float TEXTURETYPE_PALETTE_LINEAR = 6;
static const float TEXTURETYPE_PALETTE_PIXELART = 7;
static const float TEXTURETYPE_NV12 = 8;
static const float TEXTURETYPE_NV21 = 9;
static const float TEXTURETYPE_YUV = 10;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -748,7 +750,7 @@ static void SetViewportAndScissor(GPU_RenderData *data)
}
}
static SDL_GPUSampler *GetSampler(GPU_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
static SDL_GPUSampler *GetSampler(GPU_RenderData *data, SDL_PixelFormat format, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
{
Uint32 key = RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v);
SDL_assert(key < SDL_arraysize(data->samplers));
@@ -763,9 +765,16 @@ static SDL_GPUSampler *GetSampler(GPU_RenderData *data, SDL_ScaleMode scale_mode
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
sci.min_filter = SDL_GPU_FILTER_NEAREST;
sci.mag_filter = SDL_GPU_FILTER_NEAREST;
sci.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST;
} else {
sci.min_filter = SDL_GPU_FILTER_LINEAR;
sci.mag_filter = SDL_GPU_FILTER_LINEAR;
sci.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_LINEAR;
}
break;
default:
SDL_SetError("Unknown scale mode: %d", scale_mode);
@@ -810,6 +819,22 @@ static void CalculateAdvancedShaderConstants(SDL_Renderer *renderer, const SDL_R
constants->color_scale = cmd->data.draw.color_scale;
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX8:
switch (cmd->data.draw.texture_scale_mode) {
case SDL_SCALEMODE_NEAREST:
constants->texture_type = TEXTURETYPE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
constants->texture_type = TEXTURETYPE_PALETTE_LINEAR;
break;
case SDL_SCALEMODE_PIXELART:
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
break;
default:
SDL_assert(!"Unknown scale mode");
break;
}
break;
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
constants->texture_type = TEXTURETYPE_YUV;
@@ -829,9 +854,6 @@ static void CalculateAdvancedShaderConstants(SDL_Renderer *renderer, const SDL_R
break;
default:
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX8:
constants->texture_type = TEXTURETYPE_PALETTE;
break;
case SDL_PIXELFORMAT_BGRX32:
case SDL_PIXELFORMAT_RGBX32:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
@@ -840,23 +862,13 @@ static void CalculateAdvancedShaderConstants(SDL_Renderer *renderer, const SDL_R
constants->texture_type = TEXTURETYPE_RGB;
}
break;
case SDL_PIXELFORMAT_BGRA32:
case SDL_PIXELFORMAT_RGBA32:
case SDL_PIXELFORMAT_ABGR2101010:
case SDL_PIXELFORMAT_RGBA64_FLOAT:
default:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
constants->texture_type = TEXTURETYPE_RGBA_PIXELART;
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
} else {
constants->texture_type = TEXTURETYPE_RGBA;
}
break;
default:
SDL_assert(!"Unhandled pixel format");
break;
}
if (texture->colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
constants->input_type = INPUTTYPE_SCRGB;
@@ -869,6 +881,16 @@ static void CalculateAdvancedShaderConstants(SDL_Renderer *renderer, const SDL_R
break;
}
if (constants->texture_type == TEXTURETYPE_PALETTE_LINEAR ||
constants->texture_type == TEXTURETYPE_PALETTE_PIXELART ||
constants->texture_type == TEXTURETYPE_RGB_PIXELART ||
constants->texture_type == TEXTURETYPE_RGBA_PIXELART) {
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
}
constants->sdr_white_point = texture->SDR_white_point;
if (renderer->target) {
@@ -968,7 +990,7 @@ static void Draw(
GPU_TextureData *tdata = (GPU_TextureData *)texture->internal;
SDL_GPUTextureSamplerBinding sampler_bind;
SDL_zero(sampler_bind);
sampler_bind.sampler = GetSampler(data, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
sampler_bind.sampler = GetSampler(data, texture->format, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
sampler_bind.texture = tdata->texture;
SDL_BindGPUFragmentSamplers(pass, sampler_slot++, &sampler_bind, 1);
@@ -976,7 +998,7 @@ static void Draw(
if (texture->palette) {
GPU_PaletteData *palette = (GPU_PaletteData *)texture->palette->internal;
sampler_bind.sampler = GetSampler(data, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
sampler_bind.sampler = GetSampler(data, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
sampler_bind.texture = palette->texture;
SDL_BindGPUFragmentSamplers(pass, sampler_slot++, &sampler_bind, 1);
#ifdef SDL_HAVE_YUV

View File

@@ -1,7 +1,7 @@
static const unsigned char texture_advanced_frag_dxil[] = {
0x44, 0x58, 0x42, 0x43, 0x87, 0xd1, 0x2b, 0xae, 0x43, 0x0c, 0x5c, 0x59,
0xbd, 0x26, 0xab, 0xe9, 0x83, 0xa8, 0xa0, 0x6c, 0x01, 0x00, 0x00, 0x00,
0x20, 0x25, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
0x44, 0x58, 0x42, 0x43, 0xd4, 0xfc, 0x30, 0x59, 0xc7, 0xf8, 0xb0, 0x68,
0x13, 0xf8, 0xe2, 0x91, 0x10, 0x66, 0x8d, 0xcf, 0x01, 0x00, 0x00, 0x00,
0xf0, 0x2a, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
0x38, 0x02, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00,
0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -122,8 +122,8 @@ static const unsigned char texture_advanced_frag_dxil[] = {
0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, 0x18, 0x8a, 0xa0, 0x24,
0xca, 0xa0, 0xc0, 0x03, 0xca, 0xa1, 0x10, 0x0a, 0xa2, 0x30, 0x0a, 0xa4,
0x34, 0x0a, 0xa8, 0x90, 0x0a, 0xaa, 0xb0, 0x0a, 0xac, 0x00, 0x03, 0x0a,
0x34, 0xa0, 0x80, 0x03, 0xca, 0xa3, 0x7c, 0xca, 0x99, 0xa0, 0x90, 0x11,
0xca, 0x82, 0x8a, 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xe2,
0x34, 0xa0, 0x80, 0x03, 0xca, 0xa3, 0x84, 0x4a, 0xf3, 0xa0, 0x50, 0x19,
0xca, 0x86, 0x8a, 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xe2,
0x6a, 0x80, 0xc6, 0x19, 0x00, 0x22, 0x67, 0x00, 0xa8, 0x9c, 0x01, 0xa0,
0x73, 0x06, 0x80, 0xd0, 0xb1, 0x10, 0x83, 0x08, 0x04, 0x02, 0x79, 0x1e,
0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
@@ -266,12 +266,12 @@ static const unsigned char texture_advanced_frag_dxil[] = {
0x4d, 0x08, 0x10, 0x61, 0x7e, 0x71, 0xdb, 0x46, 0xf0, 0x0c, 0x97, 0xef,
0x3c, 0x3e, 0xd5, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48,
0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41, 0x54, 0x3c,
0x83, 0x93, 0xd5, 0x7c, 0x6b, 0x35, 0x4a, 0x0a, 0x1f, 0xeb, 0xd1, 0x6d,
0x44, 0x58, 0x49, 0x4c, 0x7c, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x1f, 0x06, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x64, 0x18, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
0x21, 0x0c, 0x00, 0x00, 0x16, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x9d, 0xc5, 0xbc,
0x54, 0xca, 0x8e, 0x09, 0xf3, 0x58, 0x6e, 0x8b, 0x04, 0x4d, 0xdb, 0xb2,
0x44, 0x58, 0x49, 0x4c, 0x4c, 0x1e, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x93, 0x07, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x34, 0x1e, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
0x21, 0x0c, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02,
@@ -422,374 +422,498 @@ static const unsigned char texture_advanced_frag_dxil[] = {
0xf3, 0xf8, 0x13, 0x11, 0x4d, 0x08, 0x10, 0x61, 0x7e, 0x71, 0xdb, 0x46,
0xf0, 0x0c, 0x97, 0xef, 0x3c, 0x3e, 0xd5, 0x00, 0x11, 0xe6, 0x17, 0xb7,
0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
0x51, 0x04, 0x00, 0x00, 0x13, 0x04, 0xa3, 0x10, 0x0b, 0x04, 0x00, 0x00,
0x5c, 0x00, 0x00, 0x00, 0xc4, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x65, 0x40,
0x44, 0xf9, 0x95, 0x43, 0xb1, 0x94, 0x4d, 0xa1, 0x06, 0x94, 0x69, 0x40,
0xc9, 0x95, 0x42, 0xb9, 0x15, 0x42, 0x21, 0x15, 0x5e, 0xa9, 0x94, 0x4b,
0x19, 0x95, 0x5d, 0x71, 0xcd, 0x00, 0xd0, 0x30, 0x46, 0xe0, 0xf6, 0xb1,
0x68, 0x7b, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3,
0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x81, 0x98, 0x8b, 0x69, 0xff, 0x8d, 0x11,
0x80, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0x46, 0x30, 0xa6, 0xab, 0x9a, 0xfb,
0xc2, 0x18, 0xc1, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x63, 0x04, 0x74, 0x0d,
0x8a, 0xf9, 0x37, 0x46, 0xd0, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x18, 0xc1,
0xdc, 0xb7, 0x69, 0xea, 0x0b, 0x63, 0x04, 0xad, 0x1b, 0xf2, 0xbc, 0x2f,
0x8c, 0x11, 0xf0, 0x39, 0xeb, 0xe3, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20,
0x0a, 0x06, 0x63, 0x04, 0x20, 0x08, 0x82, 0x2a, 0x18, 0x8c, 0x11, 0x80,
0x20, 0xe8, 0xdf, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0xdc, 0x8d, 0x11,
0x80, 0x20, 0x08, 0xb2, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0xe8, 0x82,
0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x0c, 0x06, 0x63, 0x04, 0x2c, 0x7b,
0x86, 0xf2, 0x37, 0x46, 0x80, 0xfa, 0x65, 0xac, 0x7e, 0x63, 0x04, 0xf9,
0xa9, 0x8b, 0xb3, 0x37, 0x46, 0xa0, 0xd7, 0xe0, 0x8e, 0x7b, 0x63, 0x04,
0x2a, 0x9e, 0xdb, 0xf6, 0x37, 0x46, 0xf0, 0xf6, 0x29, 0x3d, 0x7a, 0x63,
0x04, 0xeb, 0x1c, 0xb3, 0xa8, 0x37, 0x46, 0x90, 0x86, 0x30, 0xba, 0x7b,
0x63, 0x04, 0x77, 0x1b, 0xab, 0xf6, 0x37, 0x46, 0x10, 0xf3, 0x60, 0x9f,
0x7b, 0x63, 0x04, 0xe6, 0xbd, 0xae, 0xb2, 0x37, 0x46, 0x00, 0x82, 0x30,
0x1e, 0x8e, 0xc1, 0x18, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x04,
0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x11, 0x80, 0x20, 0xb8, 0xe6, 0x60,
0x30, 0x46, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x18, 0x01, 0xdb, 0xce,
0x3f, 0xe9, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xbf, 0x30, 0x46, 0xc0,
0xb6, 0xf1, 0x2b, 0x6f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c,
0x11, 0xf4, 0xb1, 0xe8, 0xe2, 0xdf, 0x18, 0x41, 0xad, 0xd6, 0x6a, 0xfb,
0x8d, 0x11, 0xc8, 0xa2, 0xdb, 0xd3, 0x60, 0x30, 0x46, 0xc0, 0xc3, 0xab,
0x4e, 0x77, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80,
0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x08, 0x7f, 0x23,
0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x37, 0x03, 0x00, 0x00, 0x00,
0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0xd0, 0xe1, 0x42, 0x1f, 0xb8, 0xc2,
0x2c, 0xcc, 0x82, 0x29, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x41, 0x97,
0x0b, 0x7e, 0xf0, 0x0a, 0xb8, 0x80, 0x0b, 0xa7, 0x30, 0x62, 0x90, 0x00,
0x20, 0x08, 0x06, 0x9d, 0x2e, 0xfc, 0x01, 0x2c, 0xe0, 0x02, 0x2e, 0xa0,
0xc2, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x74, 0xbb, 0x00, 0x0a, 0xa7,
0xa0, 0x0b, 0xba, 0x90, 0x0a, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0xd0,
0xf1, 0x42, 0x28, 0xa0, 0x82, 0x2e, 0xe8, 0x82, 0x2a, 0x8c, 0x18, 0x24,
0x00, 0x08, 0x82, 0x41, 0xd7, 0x0b, 0xa2, 0x20, 0x0b, 0xbb, 0xb0, 0x0b,
0xab, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x39, 0x80, 0x42,
0x2f, 0xf0, 0x02, 0x2d, 0xe0, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18,
0x18, 0xe8, 0x10, 0x0a, 0xbe, 0xd0, 0x0b, 0xac, 0x90, 0x07, 0x23, 0x06,
0x09, 0x00, 0x82, 0x60, 0x60, 0xa4, 0x83, 0x28, 0xf8, 0x82, 0x2f, 0xd8,
0x82, 0x1e, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xa1, 0x0e, 0xa3,
0xf0, 0x0b, 0xbf, 0xe0, 0x0a, 0x7b, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08,
0x06, 0xc6, 0x3a, 0x90, 0x02, 0x38, 0x80, 0xc3, 0x2d, 0xf0, 0xc1, 0x88,
0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0xec, 0x50, 0x0a, 0xe1, 0x10, 0x0e,
0xaf, 0xd0, 0x07, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x80, 0x99, 0x03,
0x28, 0x1c, 0xe2, 0x30, 0x9a, 0x10, 0x04, 0xc3, 0x11, 0x41, 0x14, 0x7c,
0xb3, 0x0c, 0x51, 0x10, 0x0c, 0x47, 0x08, 0x55, 0xf0, 0xcd, 0x32, 0x08,
0x43, 0x30, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0xcd, 0x3b, 0xa0, 0x82,
0xc3, 0x28, 0x49, 0x14, 0x99, 0x83, 0x39, 0x88, 0x42, 0x34, 0x9a, 0x10,
0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30,
0x4b, 0x10, 0x0d, 0x47, 0x20, 0x7a, 0x10, 0x7c, 0xb3, 0x0c, 0x44, 0x11,
0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0x43, 0x0f, 0xb4, 0x00, 0x8d,
0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0x53, 0x0f, 0xb5, 0x00, 0x8d, 0x18,
0x18, 0x00, 0x08, 0x82, 0xc1, 0x63, 0x0f, 0xec, 0x20, 0x8c, 0x18, 0x18,
0x00, 0x08, 0x82, 0xc1, 0x73, 0x0f, 0xed, 0x20, 0x8c, 0x18, 0x18, 0x00,
0x08, 0x82, 0xc1, 0x83, 0x0f, 0xb9, 0x40, 0x8d, 0x18, 0x18, 0x00, 0x08,
0x82, 0xc1, 0x93, 0x0f, 0xba, 0x40, 0x8d, 0x18, 0x18, 0x00, 0x08, 0x82,
0xc1, 0xa3, 0x0f, 0xf0, 0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1,
0xb3, 0x0f, 0xf1, 0x20, 0x98, 0x60, 0xc0, 0xc7, 0x04, 0x03, 0x3e, 0x23,
0x06, 0x07, 0x00, 0x82, 0x60, 0x80, 0xe9, 0x03, 0x2d, 0x6c, 0xf7, 0x30,
0x9a, 0x10, 0x08, 0xa3, 0x09, 0xc2, 0x60, 0x42, 0x21, 0x1f, 0x13, 0x0a,
0xf9, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x24, 0x12, 0xba, 0x20,
0xc4, 0xc1, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x23, 0xb1, 0x0b,
0x82, 0x1c, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x44, 0x12, 0xe0,
0x20, 0xa4, 0xc1, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x25, 0x11,
0x0e, 0x82, 0x1a, 0x18, 0x32, 0x06, 0xf2, 0x31, 0x64, 0x0c, 0xe4, 0x63,
0xc4, 0x1b, 0xc8, 0xc7, 0x08, 0x38, 0x90, 0x8f, 0x11, 0x42, 0x7c, 0x8c,
0x10, 0xe2, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f, 0x4b, 0xbc,
0x83, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, 0x4b, 0xc0, 0x83,
0x60, 0x42, 0x1d, 0xc0, 0xc7, 0x04, 0x3b, 0x80, 0xcf, 0x88, 0x81, 0x01,
0x80, 0x20, 0x18, 0x3c, 0x31, 0x41, 0x0f, 0xc6, 0x88, 0x81, 0x01, 0x80,
0x20, 0x18, 0x3c, 0x32, 0x51, 0x0f, 0x86, 0x39, 0xa2, 0x00, 0x1f, 0x0b,
0x06, 0xf8, 0xd8, 0x43, 0x0a, 0xf0, 0xb1, 0x80, 0x80, 0x8f, 0x0d, 0x12,
0x7d, 0x4c, 0x90, 0xe8, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f,
0x4e, 0xf4, 0x83, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, 0x4e,
0xf8, 0x83, 0x60, 0x82, 0x28, 0xc8, 0xc7, 0x84, 0x51, 0x90, 0x8f, 0x95,
0x82, 0x10, 0x1f, 0x33, 0x05, 0x21, 0x3e, 0x66, 0x18, 0xf2, 0xb1, 0x60,
0x90, 0x8f, 0x1d, 0x87, 0x7c, 0x2c, 0x20, 0xe4, 0x63, 0xd4, 0x00, 0x1f,
0xa3, 0x04, 0xf8, 0x8c, 0x26, 0x9c, 0x01, 0x30, 0x9a, 0x80, 0x06, 0x81,
0x11, 0x82, 0x7c, 0x8c, 0x10, 0xe4, 0x33, 0x62, 0x50, 0x01, 0x20, 0x08,
0x06, 0xd3, 0x59, 0xb8, 0x44, 0x2a, 0x9c, 0x82, 0x10, 0xb0, 0x02, 0x2b,
0x84, 0x45, 0x58, 0xf4, 0x43, 0x1d, 0xd0, 0x01, 0x2b, 0xc4, 0x01, 0x1c,
0xb0, 0x02, 0x2b, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26,
0x0c, 0xc2, 0x68, 0x02, 0x31, 0xcc, 0x12, 0x44, 0xc3, 0x11, 0xa3, 0x20,
0x0b, 0xc1, 0x37, 0xcb, 0x60, 0x1c, 0xc1, 0x88, 0xc1, 0x03, 0x80, 0x20,
0x18, 0x34, 0x70, 0x91, 0x12, 0xaf, 0xd0, 0x0a, 0xab, 0xa0, 0x0a, 0xb2,
0x20, 0x0b, 0x67, 0x71, 0x16, 0x23, 0x21, 0x0b, 0xa3, 0x09, 0x01, 0x30,
0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x4b, 0x10, 0x0d, 0x47, 0xa0,
0x82, 0x2e, 0x04, 0xdf, 0x2c, 0x03, 0x92, 0x04, 0x23, 0x06, 0x06, 0x00,
0x82, 0x60, 0xf0, 0xd0, 0x05, 0x4d, 0xc0, 0xc2, 0x88, 0x81, 0x01, 0x80,
0x20, 0x18, 0x3c, 0x75, 0x51, 0x13, 0xb0, 0x30, 0x62, 0x60, 0x00, 0x20,
0x08, 0x06, 0x8f, 0x5d, 0xb0, 0x85, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08,
0x06, 0xcf, 0x5d, 0xb4, 0x85, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06,
0x0f, 0x5e, 0xe4, 0x04, 0x2d, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1,
0x93, 0x17, 0x3a, 0x41, 0x0b, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0,
0xe8, 0x05, 0x5c, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xec,
0x45, 0x5c, 0x08, 0x26, 0x18, 0xf0, 0x31, 0xc1, 0x80, 0xcf, 0x88, 0xc1,
0x01, 0x80, 0x20, 0x18, 0x60, 0x7a, 0x41, 0x13, 0xbb, 0x70, 0x17, 0xa3,
0x09, 0x81, 0x30, 0x9a, 0x20, 0x0c, 0x26, 0x14, 0xf2, 0x31, 0xa1, 0x90,
0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0xa2, 0xa1, 0x13, 0x42,
0x3c, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x34, 0x1a, 0x3b, 0x21,
0xc8, 0xc3, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0xa4, 0x01, 0x16,
0x42, 0x3a, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x54, 0x1a, 0x61,
0x21, 0xa8, 0x83, 0x21, 0xe3, 0x20, 0x1f, 0x43, 0xc6, 0x41, 0x3e, 0x46,
0xbc, 0x83, 0x7c, 0x8c, 0x80, 0x07, 0xf9, 0x18, 0x21, 0xc4, 0xc7, 0x08,
0x21, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xb4, 0xc6, 0x5b,
0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xb8, 0x06, 0x5c, 0x08,
0x26, 0xd4, 0x03, 0x7c, 0x4c, 0xb0, 0x07, 0xf8, 0x8c, 0x18, 0x18, 0x00,
0x08, 0x82, 0xc1, 0x13, 0x1b, 0x74, 0x61, 0x8c, 0x18, 0x18, 0x00, 0x08,
0x82, 0xc1, 0x23, 0x1b, 0x75, 0x61, 0x98, 0x23, 0x12, 0xf0, 0xb1, 0x60,
0x80, 0x8f, 0x3d, 0x24, 0x01, 0x1f, 0x0b, 0x08, 0xf8, 0xd8, 0x20, 0xd1,
0xc7, 0x04, 0x89, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xe4,
0x46, 0x5f, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xe8, 0x86,
0x5f, 0x08, 0x26, 0x88, 0x84, 0x7c, 0x4c, 0x18, 0x09, 0xf9, 0x58, 0x49,
0x08, 0xf1, 0x31, 0x93, 0x10, 0xe2, 0x63, 0x86, 0x21, 0x1f, 0x0b, 0x06,
0xf9, 0xd8, 0x71, 0xc8, 0xc7, 0x02, 0x42, 0x3e, 0x46, 0x0d, 0xf0, 0x31,
0x4a, 0x80, 0xcf, 0x68, 0xc2, 0x19, 0x00, 0xa3, 0x09, 0x68, 0x10, 0x18,
0x21, 0xc8, 0xc7, 0x08, 0x41, 0x3e, 0x23, 0x06, 0x15, 0x00, 0x82, 0x60,
0x30, 0x9d, 0x87, 0x6b, 0xa4, 0xc4, 0x49, 0x08, 0x01, 0x4b, 0xb0, 0x44,
0x78, 0x84, 0x47, 0x5f, 0xd4, 0x01, 0x1d, 0xb0, 0x44, 0x1c, 0xc0, 0x01,
0x4b, 0xb0, 0xc4, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2,
0x20, 0xcc, 0x12, 0x44, 0xc3, 0x11, 0x22, 0x31, 0x17, 0xc1, 0x37, 0xcb,
0xa0, 0x2c, 0xc1, 0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x34, 0xef, 0x81,
0x1a, 0x2e, 0xc1, 0x12, 0x2a, 0x91, 0x12, 0x31, 0x11, 0x13, 0xe6, 0x61,
0x1e, 0xa2, 0x11, 0x13, 0xa3, 0x09, 0x01, 0x60, 0x41, 0x5d, 0xc8, 0xc7,
0x82, 0xba, 0x80, 0xcf, 0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x34, 0xf3,
0xc1, 0x1a, 0x33, 0x11, 0x13, 0x01, 0x4e, 0xd4, 0x44, 0x4d, 0xa8, 0x87,
0x7a, 0x98, 0x46, 0x4d, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0xcc, 0x12, 0x44, 0xc3, 0x11, 0x2c,
0xa1, 0x17, 0xc1, 0x37, 0xcb, 0xc0, 0x34, 0xc1, 0x88, 0xc1, 0x03, 0x80,
0x20, 0x18, 0x34, 0xf9, 0x21, 0x1b, 0x38, 0x61, 0x13, 0x34, 0x31, 0x13,
0x3b, 0xb1, 0x13, 0xf0, 0x01, 0x1f, 0xac, 0xb1, 0x13, 0xa3, 0x09, 0x01,
0x30, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0xcd, 0x7e, 0xd0, 0xc6, 0x4e,
0xe0, 0x84, 0x4d, 0xd4, 0x44, 0x4f, 0xf4, 0x84, 0x7c, 0xc8, 0x87, 0x6b,
0xf4, 0xc4, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x88, 0xc1, 0x01,
0x80, 0x20, 0x18, 0x60, 0xf9, 0x31, 0x1b, 0x3a, 0x11, 0x1f, 0xa3, 0x09,
0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x60, 0x03, 0x02, 0x1f,
0x1b, 0x0e, 0xf8, 0xd8, 0x70, 0xc0, 0x67, 0xc4, 0xe0, 0x00, 0x40, 0x10,
0x0c, 0x30, 0x10, 0xd1, 0x8d, 0xb0, 0x00, 0x8f, 0xd1, 0x84, 0x00, 0x18,
0x4d, 0x10, 0x82, 0xd1, 0x84, 0x41, 0x18, 0x31, 0x58, 0x00, 0x10, 0x04,
0x83, 0xaa, 0x44, 0xca, 0xe3, 0x30, 0x8a, 0x41, 0x08, 0x46, 0x0c, 0x0e,
0x00, 0x04, 0xc1, 0x00, 0x2b, 0x91, 0xdf, 0x30, 0x8b, 0xf3, 0x18, 0x4d,
0x08, 0x80, 0xd1, 0x04, 0x21, 0x18, 0x4d, 0x18, 0x84, 0x11, 0x83, 0x05,
0x00, 0x41, 0x30, 0xa8, 0x54, 0x44, 0x3d, 0x98, 0x45, 0x19, 0x84, 0x60,
0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0x30, 0x15, 0x21, 0x8f, 0xb5, 0x20,
0x91, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10, 0x82, 0xd1, 0x84, 0x41, 0x18,
0x31, 0x58, 0x00, 0x10, 0x04, 0x83, 0xea, 0x45, 0xde, 0x23, 0x82, 0x9e,
0x41, 0x08, 0x66, 0x09, 0xa2, 0xe1, 0x08, 0xb4, 0xa8, 0x8d, 0xe0, 0x9b,
0x65, 0x70, 0x9e, 0x60, 0xc4, 0xe0, 0x01, 0x40, 0x10, 0x0c, 0x9a, 0x1a,
0x71, 0x0f, 0xba, 0x90, 0x0b, 0xb8, 0x78, 0x8b, 0xbb, 0xb8, 0x0b, 0x16,
0x61, 0x11, 0xf4, 0xb8, 0x8b, 0xd1, 0x84, 0x00, 0x18, 0x31, 0x78, 0x00,
0x10, 0x04, 0x83, 0xe6, 0x46, 0xe0, 0xe3, 0x2e, 0xe8, 0x42, 0x2e, 0xe2,
0x22, 0x2f, 0xf2, 0xc2, 0x45, 0x5c, 0x44, 0x3d, 0xf2, 0x62, 0x34, 0x21,
0x00, 0x46, 0x13, 0x84, 0x60, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xb0,
0x1a, 0x79, 0x0f, 0xbb, 0x68, 0x91, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10,
0x82, 0xd1, 0x84, 0x41, 0xb0, 0x01, 0x81, 0x8f, 0x0d, 0x06, 0x7c, 0x6c,
0x40, 0xe0, 0x33, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x18, 0x8f, 0xd8,
0x47, 0x5f, 0xf0, 0xc7, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68,
0xc2, 0x20, 0x8c, 0x18, 0x2c, 0x00, 0x08, 0x82, 0x41, 0x15, 0x26, 0x21,
0x72, 0x18, 0xc5, 0x20, 0x04, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x80,
0x85, 0xc9, 0x7e, 0x88, 0xc6, 0x88, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82,
0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x88, 0xc1, 0x02, 0x80, 0x20, 0x18, 0x54,
0x66, 0x62, 0x22, 0xcc, 0xa2, 0x0c, 0x42, 0x30, 0x62, 0x70, 0x00, 0x20,
0x08, 0x06, 0x98, 0x99, 0x80, 0xc8, 0x69, 0x80, 0xc9, 0x68, 0x42, 0x00,
0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x18, 0x2c, 0x00, 0x08,
0x82, 0x41, 0xb5, 0x26, 0x2b, 0x12, 0x41, 0xcf, 0x20, 0x04, 0xb3, 0x04,
0xd1, 0x70, 0x04, 0x69, 0xc0, 0x47, 0xf0, 0xcd, 0x32, 0x40, 0x51, 0x30,
0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x4d, 0x9c, 0xa8, 0x08, 0x6c, 0xb8,
0x06, 0x6b, 0xac, 0xc6, 0x6c, 0xcc, 0x06, 0x9a, 0xa0, 0x09, 0x89, 0xcc,
0xc6, 0x68, 0x42, 0x00, 0x8c, 0x18, 0x3c, 0x00, 0x08, 0x82, 0x41, 0x33,
0x27, 0x2c, 0x32, 0x1b, 0xb0, 0xe1, 0x1a, 0xad, 0x51, 0x1b, 0xb5, 0xa1,
0x26, 0x6a, 0x62, 0x22, 0xb5, 0x31, 0x9a, 0x10, 0x00, 0x23, 0x06, 0x0f,
0x00, 0x82, 0x60, 0xd0, 0xd4, 0x89, 0x8b, 0xd8, 0x86, 0x6c, 0xc0, 0xc6,
0x6b, 0xdc, 0xc6, 0x6d, 0xb0, 0x09, 0x9b, 0xa0, 0xc8, 0x6d, 0x8c, 0x26,
0x04, 0xc0, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x60, 0x72, 0xc2, 0x22,
0xb3, 0xa1, 0x26, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09,
0x83, 0x60, 0x43, 0x02, 0x1f, 0x1b, 0x10, 0xf8, 0xd8, 0x70, 0xc0, 0x67,
0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xb0, 0x3c, 0x99, 0x11, 0xdd, 0xc8,
0x91, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10, 0x82, 0xd1, 0x84, 0x41, 0x18,
0x31, 0x58, 0x00, 0x10, 0x04, 0x83, 0xca, 0x4f, 0x7c, 0xe4, 0x30, 0x8a,
0x41, 0x08, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0x00, 0xf3, 0x13, 0x1c,
0xf9, 0x0d, 0x30, 0x19, 0x4d, 0x08, 0x80, 0xd1, 0x04, 0x21, 0x18, 0x4d,
0x18, 0x84, 0x11, 0x83, 0x05, 0x00, 0x41, 0x30, 0xa8, 0x46, 0x65, 0x4c,
0x98, 0x45, 0x19, 0x84, 0x60, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xb0,
0x51, 0xe9, 0x11, 0xf2, 0xe8, 0x93, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10,
0x82, 0xd1, 0x84, 0x41, 0x18, 0x31, 0x58, 0x00, 0x10, 0x04, 0x83, 0x0a,
0x55, 0xd0, 0x24, 0x82, 0x9e, 0x41, 0x08, 0x66, 0x09, 0xa2, 0x81, 0xaa,
0x01, 0x7c, 0x00, 0xbd, 0x11, 0x48, 0x85, 0xc0, 0x13, 0x83, 0x34, 0x10,
0xb9, 0x50, 0x50, 0x82, 0x81, 0x05, 0xc7, 0x82, 0xc0, 0xe7, 0x19, 0xa8,
0x1a, 0xc4, 0x07, 0xd0, 0x1b, 0x81, 0x54, 0x08, 0x3c, 0x31, 0x48, 0x03,
0x91, 0x0b, 0x05, 0x24, 0x18, 0x54, 0x70, 0x1c, 0x88, 0x7c, 0x9e, 0x81,
0xaa, 0x81, 0x7c, 0x00, 0xbd, 0x11, 0x48, 0x85, 0xc0, 0x13, 0x83, 0x34,
0x10, 0xb9, 0x50, 0xf0, 0x81, 0x01, 0x05, 0xc7, 0x80, 0xcc, 0xe7, 0x19,
0xa8, 0x1a, 0xcc, 0x07, 0xd0, 0x1b, 0x81, 0x54, 0x08, 0xf3, 0x31, 0xcc,
0x07, 0x91, 0x0b, 0xc5, 0x7c, 0x18, 0xf3, 0x71, 0xcc, 0x07, 0x32, 0x9f,
0x67, 0x34, 0xc1, 0x3c, 0x84, 0xe1, 0x88, 0x20, 0x3f, 0x82, 0x6f, 0x96,
0x41, 0x9a, 0x82, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x64, 0x05,
0x55, 0x8c, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x66, 0x25, 0x55,
0x8c, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x68, 0x45, 0x55, 0x8c,
0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x6a, 0xa5, 0x4d, 0x86, 0x11,
0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x6c, 0xc5, 0x4d, 0x86, 0x11, 0x03,
0x03, 0x00, 0x41, 0x30, 0x78, 0x6e, 0xe5, 0x4d, 0x06, 0x1b, 0x50, 0x44,
0x3e, 0x36, 0xa4, 0x88, 0x7c, 0x6c, 0x50, 0x11, 0xf9, 0x8c, 0x18, 0x18,
0x00, 0x08, 0x82, 0xc1, 0xb3, 0x2b, 0x74, 0x32, 0x8c, 0x18, 0x18, 0x00,
0x08, 0x82, 0xc1, 0xc3, 0x2b, 0x75, 0x32, 0x8c, 0x18, 0x18, 0x00, 0x08,
0x82, 0xc1, 0xd3, 0x2b, 0x76, 0x32, 0xd8, 0xf0, 0x22, 0xf0, 0xb1, 0x01,
0x46, 0xe0, 0x63, 0x43, 0x8c, 0xc0, 0x67, 0xc4, 0xe0, 0x00, 0x40, 0x10,
0x0c, 0x22, 0x70, 0xc1, 0x93, 0xc1, 0x44, 0x46, 0x0c, 0x0e, 0x00, 0x04,
0xc1, 0x20, 0x0a, 0x97, 0x3c, 0x19, 0x4e, 0x64, 0xc4, 0xe0, 0x00, 0x40,
0x10, 0x0c, 0x22, 0x71, 0xd1, 0x93, 0x01, 0x45, 0x2c, 0xb1, 0x11, 0xf9,
0x58, 0x72, 0x23, 0xf2, 0xb1, 0x04, 0x47, 0xe4, 0x63, 0x3a, 0x32, 0xc4,
0xc7, 0x76, 0x64, 0x88, 0x8f, 0xf1, 0xc8, 0x10, 0x1f, 0x4b, 0x06, 0xfa,
0x58, 0x32, 0xd0, 0xc7, 0x92, 0x81, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82,
0x60, 0xf0, 0xb4, 0xcb, 0xb8, 0x0c, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60,
0xf0, 0xb8, 0x0b, 0xb9, 0x0c, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0,
0xbc, 0x4b, 0xb9, 0x0c, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xc0,
0x0b, 0xaa, 0x0c, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xc4, 0x4b,
0xaa, 0x0c, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xc8, 0x8b, 0xaa,
0x0c, 0x36, 0x9c, 0x89, 0x7c, 0x6c, 0x40, 0x13, 0xf9, 0xd8, 0x90, 0x26,
0xf2, 0x19, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xc7, 0x5e, 0x5e, 0x65,
0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xe7, 0x5e, 0x60, 0x65, 0x18,
0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x07, 0x5f, 0x62, 0x65, 0xb0, 0xc1,
0x4d, 0xe4, 0x63, 0xc3, 0x9b, 0xc8, 0xc7, 0x06, 0x38, 0x91, 0xcf, 0x88,
0xc1, 0x01, 0x80, 0x20, 0x18, 0x60, 0xf8, 0x22, 0x2b, 0x39, 0x12, 0x2f,
0xa3, 0x09, 0xc1, 0x60, 0x45, 0x40, 0x1f, 0x2b, 0x04, 0xfa, 0x58, 0x31,
0xd0, 0x67, 0x96, 0x60, 0x1a, 0xa8, 0x18, 0x0c, 0x49, 0x1d, 0xa2, 0x81,
0x8a, 0xc1, 0x90, 0xd4, 0x21, 0x1a, 0xa8, 0x18, 0x0c, 0x49, 0x1d, 0xa2,
0x11, 0x83, 0x03, 0x00, 0x41, 0x30, 0xc0, 0x40, 0x46, 0x57, 0xc2, 0x24,
0x5f, 0x46, 0x13, 0x02, 0x60, 0x38, 0x22, 0x58, 0x13, 0xe7, 0x9b, 0x65,
0xa0, 0xba, 0x60, 0x38, 0x42, 0x58, 0x93, 0xe0, 0x9b, 0x65, 0xa8, 0xac,
0x60, 0x34, 0x81, 0x08, 0x2c, 0x40, 0xe4, 0x63, 0x02, 0x22, 0x1f, 0x1b,
0x10, 0xf9, 0xcc, 0x12, 0x74, 0xc3, 0x11, 0xc7, 0x9c, 0x04, 0xdf, 0x2c,
0xc3, 0xd5, 0x05, 0xc3, 0x11, 0x7d, 0x40, 0x27, 0xc1, 0x37, 0xcb, 0x80,
0x65, 0x81, 0x35, 0xae, 0x22, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30,
0xd0, 0x54, 0x86, 0x5c, 0x5c, 0xa5, 0x09, 0x46, 0x0c, 0x10, 0x00, 0x04,
0xc1, 0x40, 0x5b, 0x99, 0x72, 0x71, 0x95, 0x26, 0x30, 0xc8, 0x55, 0xe4,
0x33, 0x62, 0x80, 0x00, 0x20, 0x08, 0x06, 0x5a, 0xcb, 0x9c, 0x8b, 0xab,
0x40, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18, 0x68, 0x2e, 0x83, 0x2e,
0xae, 0x02, 0x05, 0x36, 0xb9, 0x8a, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04,
0xc1, 0x40, 0x83, 0x19, 0x75, 0x71, 0x95, 0x29, 0x18, 0x31, 0x40, 0x00,
0x10, 0x04, 0x03, 0x2d, 0x66, 0xd6, 0xc5, 0x55, 0xa6, 0x60, 0x96, 0x20,
0x1b, 0xa8, 0x18, 0x1c, 0x8c, 0x0d, 0xae, 0x81, 0x8a, 0x41, 0xc1, 0xd8,
0xe0, 0x1a, 0xa8, 0x18, 0x0c, 0x8c, 0x0d, 0xae, 0x11, 0x83, 0x03, 0x00,
0x41, 0x30, 0x88, 0x72, 0x26, 0x5e, 0x84, 0x60, 0xc4, 0xe0, 0x00, 0x40,
0x10, 0x0c, 0x22, 0x9d, 0x91, 0x17, 0x22, 0x18, 0x8e, 0x08, 0x42, 0x45,
0xf8, 0x66, 0x19, 0xb4, 0x2d, 0x18, 0x4d, 0xc8, 0x02, 0x1b, 0x02, 0xf9,
0x58, 0x30, 0x2a, 0xf0, 0x19, 0x4d, 0xe0, 0x04, 0x33, 0x02, 0xf9, 0x58,
0x60, 0x2a, 0xf0, 0x31, 0x22, 0xa0, 0x8f, 0x05, 0x8d, 0x7c, 0x4c, 0x68,
0xe4, 0x63, 0x43, 0x23, 0x9f, 0x59, 0x82, 0x6d, 0xa0, 0x62, 0x30, 0x34,
0x30, 0xc8, 0x06, 0x2a, 0x06, 0x43, 0x03, 0x83, 0x6c, 0xa0, 0x62, 0x30,
0x34, 0x30, 0xc8, 0x66, 0x19, 0xb8, 0xae, 0xb3, 0x41, 0x5f, 0xe4, 0x33,
0x62, 0x80, 0x00, 0x20, 0x08, 0x06, 0x9a, 0xd9, 0x80, 0x8c, 0xbe, 0x0c,
0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18, 0x68, 0x67, 0x13, 0x32, 0xfa,
0x32, 0x04, 0x66, 0xe8, 0x8b, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1,
0x40, 0x4b, 0x9b, 0x91, 0xd1, 0x17, 0x23, 0x18, 0x31, 0x40, 0x00, 0x10,
0x04, 0x03, 0x4d, 0x6d, 0x48, 0x46, 0x5f, 0x8c, 0xc0, 0x12, 0x7d, 0x91,
0xcf, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18, 0x68, 0x6c, 0x63, 0x32, 0xfa,
0x92, 0x04, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0xa0, 0xb5, 0xcd, 0xc9,
0xe8, 0x4b, 0x12, 0xcc, 0x12, 0x74, 0x03, 0x2d, 0x03, 0x39, 0x4c, 0xb4,
0x50, 0x39, 0x1c, 0xb6, 0x91, 0x83, 0x35, 0xd0, 0x32, 0x90, 0xc3, 0x44,
0x0b, 0x95, 0xc2, 0x61, 0x1b, 0x39, 0x58, 0x03, 0x2d, 0x03, 0x39, 0x4c,
0xb4, 0x50, 0x19, 0x1c, 0xb6, 0x91, 0x83, 0x35, 0x1c, 0x61, 0x0e, 0xba,
0x12, 0x7c, 0xb3, 0x0c, 0x5e, 0x1a, 0x04, 0xa3, 0x09, 0xad, 0x02, 0x0c,
0x47, 0x04, 0xbd, 0xe2, 0x7c, 0xb3, 0x0c, 0x1f, 0x1a, 0x04, 0xc3, 0x11,
0xc6, 0xbb, 0x28, 0xdf, 0x2c, 0x43, 0x18, 0x80, 0x41, 0x60, 0x47, 0xbc,
0xc8, 0x67, 0x96, 0x40, 0x0c, 0x0c, 0x71, 0x19, 0xf8, 0x8c, 0x18, 0x18,
0x00, 0x08, 0x82, 0xc1, 0xc3, 0x37, 0x72, 0x13, 0x58, 0xf0, 0x32, 0xf2,
0x19, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xc7, 0x6f, 0x6c, 0x26, 0xb0,
0x00, 0x66, 0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0f, 0xe8,
0xe4, 0x4c, 0x30, 0x4b, 0x20, 0x06, 0x03, 0x15, 0x83, 0x03, 0x06, 0x42,
0x18, 0x0c, 0x47, 0x38, 0xf8, 0xa2, 0x7c, 0xb3, 0x0c, 0x64, 0x30, 0x06,
0x81, 0x3d, 0xfa, 0x22, 0x9f, 0x59, 0x82, 0x32, 0x30, 0xe8, 0x66, 0xe0,
0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f, 0xe9, 0xec, 0x4d, 0x60,
0x01, 0xce, 0xc8, 0x67, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x9e, 0xd3,
0xf9, 0x99, 0xc0, 0x82, 0x9c, 0x91, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20,
0x18, 0x3c, 0xa9, 0x23, 0x36, 0xc1, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x0c,
0xce, 0x18, 0x08, 0x64, 0x30, 0x1c, 0x61, 0x85, 0x8c, 0xf2, 0xcd, 0x32,
0x9c, 0x81, 0x19, 0x04, 0x76, 0x8d, 0x8c, 0x7c, 0x66, 0x09, 0xd0, 0xc0,
0x30, 0xb0, 0x81, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0xae,
0x43, 0x3a, 0x81, 0x05, 0x61, 0x23, 0x9f, 0x11, 0x03, 0x03, 0x00, 0x41,
0x30, 0x78, 0x60, 0x07, 0x6d, 0x02, 0x0b, 0xc4, 0x46, 0x3e, 0x23, 0x06,
0x06, 0x00, 0x82, 0x60, 0xf0, 0xc8, 0xce, 0xda, 0x04, 0xb3, 0x04, 0x68,
0x30, 0xd0, 0x31, 0x90, 0xc1, 0x19, 0x90, 0x81, 0x19, 0x80, 0x82, 0x37,
0xd0, 0x31, 0x50, 0x67, 0x40, 0x99, 0x01, 0x28, 0x78, 0x03, 0x1d, 0x83,
0x71, 0x06, 0x92, 0x19, 0x80, 0x82, 0x37, 0x9a, 0xc0, 0x2e, 0x83, 0x11,
0x81, 0x7c, 0x8c, 0x10, 0xe4, 0x63, 0xc4, 0x20, 0x9f, 0x59, 0x02, 0x51,
0x18, 0x8e, 0x50, 0x89, 0x90, 0x09, 0xbe, 0xd1, 0x84, 0x78, 0x19, 0x66,
0x19, 0xd4, 0xa0, 0x0e, 0x04, 0x4b, 0x83, 0x40, 0x3e, 0x96, 0x06, 0x82,
0x7c, 0x2c, 0x0d, 0x06, 0xf9, 0x8c, 0x26, 0xd4, 0x0b, 0x30, 0x1c, 0x11,
0x94, 0x8c, 0xf3, 0xcd, 0x32, 0x88, 0xc2, 0x1a, 0x04, 0xc3, 0x11, 0x85,
0xca, 0x28, 0xdf, 0x2c, 0x43, 0x1b, 0xb0, 0x41, 0x60, 0x06, 0xcb, 0xc8,
0x67, 0x96, 0xc0, 0x0d, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x19,
0x9f, 0xdc, 0x39, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x21, 0x1f,
0xbe, 0x09, 0x2c, 0x80, 0x19, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
0xc1, 0x63, 0x3e, 0x7f, 0x13, 0x58, 0x30, 0x33, 0xf2, 0xb1, 0xa0, 0x66,
0xe0, 0x33, 0x4b, 0xe0, 0x06, 0x03, 0x15, 0x83, 0xc3, 0x06, 0x42, 0x1b,
0x0c, 0x47, 0x34, 0x33, 0xa3, 0x7c, 0xb3, 0x0c, 0x70, 0xf0, 0x06, 0x81,
0x39, 0x35, 0x23, 0x9f, 0x59, 0x82, 0x38, 0x18, 0x31, 0x30, 0x00, 0x10,
0x04, 0x83, 0x87, 0x7d, 0xc4, 0xe7, 0x19, 0x31, 0x30, 0x00, 0x10, 0x04,
0x83, 0xa7, 0x7d, 0x4a, 0x27, 0xb0, 0x20, 0x67, 0xe4, 0x33, 0x62, 0x60,
0x00, 0x20, 0x08, 0x06, 0xcf, 0xfb, 0xa0, 0x4e, 0x60, 0x01, 0xcf, 0xc8,
0xc7, 0x02, 0x9f, 0x81, 0xcf, 0x2c, 0x41, 0x1c, 0x0c, 0x54, 0x0c, 0xce,
0x1b, 0x08, 0x70, 0x30, 0x1c, 0x51, 0xf1, 0x8c, 0xf2, 0xcd, 0x32, 0xcc,
0x81, 0x1c, 0x04, 0x66, 0xf9, 0x8c, 0x7c, 0x66, 0x09, 0xe8, 0x60, 0xc4,
0xc0, 0x00, 0x40, 0x10, 0x0c, 0x9e, 0xfa, 0x59, 0x9f, 0x6b, 0xc4, 0xc0,
0x00, 0x40, 0x10, 0x0c, 0x1e, 0xfb, 0x71, 0x9d, 0xc0, 0x02, 0xb1, 0x91,
0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0xf8, 0x13, 0x3b, 0x81,
0x05, 0x65, 0x23, 0x1f, 0x0b, 0xce, 0x06, 0x3e, 0xb3, 0x04, 0x74, 0x30,
0x50, 0x31, 0x38, 0x72, 0x20, 0xcc, 0xc1, 0x88, 0xc1, 0x01, 0x80, 0x20,
0x18, 0x44, 0xfb, 0x33, 0x3b, 0x53, 0xd8, 0x8c, 0x18, 0x1c, 0x00, 0x08,
0x82, 0x41, 0xc4, 0x3f, 0xb4, 0xb3, 0x88, 0xcd, 0x88, 0xc1, 0x01, 0x80,
0x20, 0x18, 0x44, 0xfd, 0x53, 0x3b, 0xc3, 0xd8, 0x8c, 0x18, 0x1c, 0x00,
0x08, 0x82, 0x41, 0xe4, 0x3f, 0xba, 0x33, 0x8c, 0xcd, 0x88, 0xc1, 0x01,
0x80, 0x20, 0x18, 0x44, 0xff, 0xb3, 0x3b, 0x03, 0xd9, 0x8c, 0x18, 0x1c,
0x00, 0x08, 0x82, 0x41, 0x04, 0x42, 0xbc, 0x33, 0x94, 0xcd, 0x2c, 0x81,
0x28, 0xcc, 0x32, 0xd8, 0x41, 0x28, 0xc4, 0x85, 0xbd, 0x82, 0xec, 0xc8,
0x67, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x34, 0xff, 0xc1, 0x1d, 0xd9,
0x79, 0x85, 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0xb4, 0xff, 0xc9,
0x1d, 0xd9, 0x79, 0x85, 0xc0, 0x64, 0x41, 0x76, 0xe4, 0x33, 0x62, 0x80,
0x00, 0x20, 0x08, 0x06, 0x5a, 0x08, 0xed, 0x8e, 0xec, 0xc8, 0x42, 0x30,
0x62, 0x80, 0x00, 0x20, 0x08, 0x06, 0x9a, 0x08, 0xf1, 0x8e, 0xec, 0xc8,
0x42, 0x60, 0xb5, 0x20, 0x3b, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
0x03, 0x8d, 0x84, 0x7c, 0x47, 0x76, 0x6a, 0x21, 0x18, 0x31, 0x40, 0x00,
0x10, 0x04, 0x03, 0xad, 0x84, 0x7e, 0x47, 0x76, 0x6a, 0x21, 0xb0, 0x03,
0x0e, 0xe4, 0x63, 0x45, 0x1c, 0xc8, 0xc7, 0x06, 0x39, 0x90, 0xcf, 0x68,
0x02, 0xd9, 0x00, 0xc3, 0x11, 0x01, 0xdd, 0x38, 0xdf, 0x2c, 0x83, 0x28,
0xdc, 0x41, 0x30, 0x1c, 0x51, 0xe4, 0x8d, 0xf2, 0xcd, 0x32, 0xe4, 0x01,
0x1e, 0x04, 0x66, 0xec, 0x8d, 0x7c, 0x66, 0x09, 0xf4, 0x60, 0xc4, 0xc0,
0x00, 0x40, 0x10, 0x0c, 0x1e, 0x19, 0x42, 0xa1, 0x63, 0xc4, 0xc0, 0x00,
0x40, 0x10, 0x0c, 0x9e, 0x19, 0x5a, 0x9f, 0xc0, 0x82, 0xbf, 0x91, 0xcf,
0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0x35, 0xe4, 0x3e, 0x81, 0x05,
0xa2, 0x23, 0x1f, 0x0b, 0x48, 0x07, 0x3e, 0xb3, 0x04, 0x7a, 0x30, 0x50,
0x31, 0x38, 0x78, 0x20, 0xe4, 0xc1, 0x70, 0x44, 0x23, 0x3a, 0xca, 0x37,
0xcb, 0xc0, 0x07, 0x7b, 0x10, 0x98, 0x43, 0x3a, 0xf2, 0x99, 0x25, 0xe8,
0x83, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x76, 0x28, 0x86, 0x9e,
0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x78, 0x88, 0x7e, 0x02, 0x0b,
0x50, 0x47, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf8, 0xd0,
0xfd, 0x04, 0x16, 0xac, 0x8e, 0x7c, 0x2c, 0x68, 0x1d, 0xf8, 0xcc, 0x12,
0xf4, 0xc1, 0x40, 0xc5, 0xe0, 0xec, 0x81, 0xc0, 0x07, 0xc3, 0x11, 0xd5,
0xea, 0x28, 0xdf, 0x2c, 0xc3, 0x1f, 0xf8, 0x41, 0x60, 0x56, 0xeb, 0xc8,
0x67, 0x96, 0x00, 0x14, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x21,
0x23, 0x1d, 0xba, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x29, 0xa3,
0xfe, 0x09, 0x2c, 0x88, 0x1d, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
0xc1, 0x73, 0x46, 0x20, 0x14, 0x58, 0x40, 0x3b, 0xf2, 0xb1, 0xc0, 0x76,
0xe0, 0x33, 0x4b, 0x00, 0x0a, 0x03, 0x15, 0x83, 0xe3, 0x07, 0xc2, 0x1f,
0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xa4, 0x46, 0x22, 0x34, 0xc1,
0xce, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x6b, 0x34, 0x42, 0x4b,
0xec, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xc4, 0x46, 0x24, 0x34,
0xc8, 0xce, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x6d, 0x94, 0x42,
0x83, 0xec, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xe4, 0x46, 0x2a,
0x34, 0xcc, 0xce, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x6f, 0xb4,
0x42, 0x03, 0xed, 0xcc, 0x12, 0x88, 0x82, 0xf9, 0x83, 0x2d, 0xc8, 0xc7,
0xfc, 0xe1, 0x16, 0xe4, 0x63, 0xfe, 0x80, 0x0b, 0xf2, 0x99, 0x25, 0x10,
0x85, 0x81, 0x9a, 0x41, 0x2f, 0xd0, 0xc0, 0x08, 0x05, 0x75, 0xa0, 0x03,
0xb8, 0x50, 0x03, 0x06, 0x14, 0x64, 0xc1, 0x0e, 0x06, 0x6a, 0x06, 0xbd,
0x40, 0x03, 0x23, 0x14, 0xd4, 0x81, 0x0e, 0xe0, 0x42, 0x0d, 0x18, 0x50,
0x90, 0x05, 0x3b, 0x18, 0xa8, 0x19, 0xf4, 0x02, 0x0d, 0x8c, 0x50, 0x50,
0x07, 0x3a, 0x80, 0x0b, 0x35, 0x60, 0x40, 0x41, 0x16, 0xec, 0xc0, 0x86,
0xd8, 0x91, 0x8f, 0x0d, 0xb1, 0x23, 0x1f, 0x1b, 0x62, 0x47, 0x3e, 0xb6,
0x1e, 0xb1, 0x23, 0x9f, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xfa,
0x28, 0x87, 0xe6, 0x68, 0x8e, 0xd6, 0x88, 0x18, 0x31, 0x48, 0x00, 0x10,
0x04, 0x03, 0xa4, 0x8f, 0x72, 0x68, 0x8e, 0xe6, 0x48, 0x8c, 0x86, 0x11,
0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xfa, 0x28, 0x87, 0xe6, 0x68, 0x8e,
0xd4, 0x48, 0x18, 0x31, 0x48, 0x00, 0x10, 0x04, 0x03, 0xa4, 0x8f, 0x72,
0x68, 0x8e, 0xe6, 0x28, 0x8c, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
0xc5, 0x05, 0x00, 0x00, 0x13, 0x04, 0xa7, 0x10, 0x0b, 0x04, 0x00, 0x00,
0x61, 0x00, 0x00, 0x00, 0xc4, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x65, 0x40,
0x44, 0xf9, 0x95, 0x43, 0xa1, 0x06, 0x94, 0x69, 0x40, 0xc9, 0x95, 0x42,
0xb9, 0x15, 0x42, 0xb1, 0x94, 0x4d, 0x21, 0x95, 0x4a, 0xb9, 0x94, 0x51,
0x71, 0x95, 0x5d, 0xe1, 0xcd, 0x00, 0xd0, 0x30, 0x46, 0x00, 0x82, 0x30,
0x1e, 0x8e, 0xc1, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4,
0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11,
0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06,
0x63, 0x04, 0x62, 0x2e, 0xa6, 0xfd, 0x37, 0x46, 0x00, 0x96, 0x3c, 0x1b,
0xff, 0xc2, 0x18, 0xc1, 0x98, 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x04, 0xff,
0x4c, 0xfa, 0xbf, 0x2f, 0x8c, 0x11, 0xd0, 0x35, 0x28, 0xe6, 0xdf, 0x18,
0x41, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x04, 0x73, 0xdf, 0xa6, 0xa9,
0x2f, 0x8c, 0x11, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0x30, 0x46, 0xc0, 0xe7,
0xac, 0x8f, 0x7f, 0x63, 0x04, 0x20, 0x08, 0x82, 0x28, 0x18, 0x8c, 0x11,
0x80, 0x20, 0x08, 0xaa, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0xc8, 0x82,
0xc1, 0x18, 0x01, 0x08, 0x82, 0xa0, 0x0b, 0x06, 0x63, 0x04, 0x20, 0x08,
0x82, 0x30, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xc6, 0x60, 0x30, 0x46,
0x00, 0x82, 0x20, 0x28, 0x83, 0xc1, 0x18, 0x01, 0xcb, 0x9e, 0xa1, 0xfc,
0x8d, 0x11, 0xa0, 0x7e, 0x19, 0xab, 0xdf, 0x18, 0x41, 0x7e, 0xea, 0xe2,
0xec, 0x8d, 0x11, 0xe8, 0x35, 0xb8, 0xe3, 0xde, 0x18, 0x81, 0x8a, 0xe7,
0xb6, 0xfd, 0x8d, 0x11, 0xbc, 0x7d, 0x4a, 0x8f, 0xde, 0x18, 0xc1, 0x3a,
0xc7, 0x2c, 0xea, 0x8d, 0x11, 0xa4, 0x21, 0x8c, 0xee, 0xde, 0x18, 0xc1,
0xdd, 0xc6, 0xaa, 0xfd, 0x8d, 0x11, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30,
0x46, 0x00, 0x82, 0x74, 0x9b, 0x83, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x6b,
0x0e, 0x06, 0x63, 0x04, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x8c, 0x11, 0xb0,
0xed, 0xfc, 0x93, 0xde, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfc, 0x0b, 0x63,
0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0xf4, 0xb1, 0xe8, 0xe2,
0xdf, 0x18, 0x41, 0xad, 0xd6, 0x6a, 0xfb, 0x8d, 0x11, 0xc8, 0xa2, 0xdb,
0xd3, 0x60, 0x30, 0x46, 0xc0, 0xc3, 0xab, 0x4e, 0x77, 0x63, 0x04, 0x20,
0x08, 0x82, 0xf8, 0x2f, 0x8c, 0x11, 0xb0, 0x6d, 0xfc, 0xca, 0xdb, 0x18,
0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20, 0x08, 0x82, 0x70,
0x37, 0x46, 0x00, 0x82, 0xa0, 0x7f, 0x7f, 0x63, 0x04, 0x20, 0x08, 0x82,
0x20, 0x18, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xc2, 0xdf, 0x18,
0x01, 0x08, 0x82, 0x20, 0xfe, 0xcd, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00,
0x82, 0x60, 0xd0, 0xed, 0x82, 0x28, 0xc4, 0x82, 0x2d, 0xd8, 0x42, 0x2a,
0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x41, 0xc7, 0x0b, 0xa3, 0x20, 0x0b,
0xbb, 0xb0, 0x0b, 0xaa, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x5d,
0x2f, 0x90, 0xc2, 0x2c, 0xec, 0xc2, 0x2e, 0xac, 0xc2, 0x88, 0x41, 0x02,
0x80, 0x20, 0x18, 0x74, 0xbe, 0x50, 0x0a, 0xaa, 0xd0, 0x0b, 0xbd, 0xc0,
0x0a, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0xd0, 0xfd, 0x82, 0x29, 0xac,
0x42, 0x2f, 0xf4, 0x42, 0x2b, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x41,
0x07, 0x0e, 0xa7, 0x50, 0x0b, 0xbe, 0xe0, 0x0b, 0xae, 0x30, 0x62, 0x90,
0x00, 0x20, 0x08, 0x06, 0x86, 0x3a, 0x94, 0x02, 0x38, 0xfc, 0xc2, 0x2d,
0xec, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0xeb, 0x60, 0x0a,
0xe1, 0x00, 0x0e, 0xaf, 0xc0, 0x07, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
0x60, 0xb0, 0xc3, 0x29, 0x84, 0x43, 0x38, 0xe4, 0x42, 0x1f, 0x8c, 0x18,
0x24, 0x00, 0x08, 0x82, 0x81, 0xd1, 0x0e, 0xa8, 0x20, 0x0e, 0xe2, 0x10,
0x0b, 0x7e, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x3b, 0xa4,
0xc2, 0x38, 0x8c, 0x83, 0x2e, 0xfc, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20,
0x18, 0x18, 0xef, 0xa0, 0x0a, 0xe4, 0x40, 0x0e, 0xb2, 0x00, 0x0a, 0x23,
0x06, 0x07, 0x00, 0x82, 0x60, 0x80, 0xa5, 0xc3, 0x28, 0x1c, 0xe5, 0x30,
0x9a, 0x10, 0x04, 0xc3, 0x11, 0x81, 0x14, 0x7c, 0xb3, 0x0c, 0x55, 0x10,
0x0c, 0x47, 0x08, 0x57, 0xf0, 0xcd, 0x32, 0x08, 0x43, 0x30, 0x62, 0xf0,
0x00, 0x20, 0x08, 0x06, 0x8d, 0x3c, 0x98, 0x82, 0xc3, 0x28, 0x49, 0x14,
0xa5, 0x43, 0x3a, 0x94, 0x42, 0x34, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42,
0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x4b, 0x50, 0x0d, 0x47,
0x20, 0x7a, 0x10, 0x7c, 0xb3, 0x0c, 0x44, 0x11, 0x8c, 0x18, 0x18, 0x00,
0x08, 0x82, 0xc1, 0x73, 0x0f, 0xb9, 0x00, 0x8d, 0x18, 0x18, 0x00, 0x08,
0x82, 0xc1, 0x83, 0x0f, 0xba, 0x00, 0x8d, 0x18, 0x18, 0x00, 0x08, 0x82,
0xc1, 0x93, 0x0f, 0xef, 0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1,
0xa3, 0x0f, 0xf0, 0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xb3,
0x0f, 0xbe, 0x40, 0x8d, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xc3, 0x0f,
0xbf, 0x40, 0x8d, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xd3, 0x0f, 0xf3,
0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xe3, 0x0f, 0xf4, 0x20,
0x98, 0x60, 0xc0, 0xc7, 0x04, 0x03, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82,
0x60, 0x80, 0xf5, 0xc3, 0x2d, 0x6c, 0xfa, 0x30, 0x9a, 0x10, 0x08, 0xa3,
0x09, 0xc2, 0x60, 0x42, 0x21, 0x1f, 0x13, 0x0a, 0xf9, 0x8c, 0x18, 0x1c,
0x00, 0x08, 0x82, 0x41, 0x54, 0x12, 0xbe, 0x20, 0xb8, 0xc1, 0x88, 0xc1,
0x01, 0x80, 0x20, 0x18, 0x44, 0x26, 0xf1, 0x0b, 0xc2, 0x1b, 0x8c, 0x18,
0x1c, 0x00, 0x08, 0x82, 0x41, 0x74, 0x12, 0xe3, 0x20, 0xa4, 0xc1, 0x88,
0xc1, 0x01, 0x80, 0x20, 0x18, 0x44, 0x28, 0x41, 0x0e, 0x82, 0x1a, 0x18,
0x32, 0x06, 0xf2, 0x31, 0x64, 0x0c, 0xe4, 0x63, 0x84, 0x1b, 0xc8, 0xc7,
0x88, 0x37, 0x90, 0x8f, 0x11, 0x42, 0x7c, 0x8c, 0x10, 0xe2, 0x33, 0x62,
0x60, 0x00, 0x20, 0x08, 0x06, 0x0f, 0x4c, 0xb0, 0x83, 0x30, 0x62, 0x60,
0x00, 0x20, 0x08, 0x06, 0x4f, 0x4c, 0xb4, 0x83, 0x60, 0x02, 0x1d, 0xc0,
0xc7, 0x84, 0x3a, 0x80, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c,
0x34, 0x11, 0x0f, 0xc6, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0x35,
0x21, 0x0f, 0x86, 0x39, 0x7f, 0x00, 0x1f, 0x0b, 0x06, 0xf8, 0xd8, 0x13,
0x0a, 0xf0, 0xb1, 0x80, 0x80, 0x8f, 0x0d, 0x12, 0x7d, 0x4c, 0x90, 0xe8,
0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0f, 0x4f, 0x80, 0x84, 0x30,
0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f, 0x4f, 0x84, 0x84, 0x60, 0x82,
0x28, 0xc8, 0xc7, 0x84, 0x51, 0x90, 0x8f, 0x9d, 0x82, 0x10, 0x1f, 0x43,
0x05, 0x21, 0x3e, 0x66, 0x18, 0xf2, 0xb1, 0x60, 0x90, 0x8f, 0x1d, 0x87,
0x7c, 0x2c, 0x20, 0xe4, 0x63, 0xd4, 0x00, 0x1f, 0xa3, 0x04, 0xf8, 0x8c,
0x26, 0x9c, 0x01, 0x30, 0x9a, 0x80, 0x06, 0x81, 0x11, 0x82, 0x7c, 0x8c,
0x10, 0xe4, 0x33, 0x62, 0x50, 0x01, 0x20, 0x08, 0x06, 0x93, 0x5a, 0xc4,
0x44, 0x2a, 0x9c, 0x82, 0x10, 0xb0, 0x02, 0x2b, 0x90, 0x05, 0x59, 0x80,
0x44, 0x1d, 0xd0, 0x01, 0x2b, 0xc4, 0x01, 0x1c, 0xb0, 0x02, 0x2b, 0x8c,
0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68, 0x02,
0x31, 0xcc, 0x12, 0x54, 0xc3, 0x11, 0xa3, 0x20, 0x0b, 0xc1, 0x37, 0xcb,
0x60, 0x1c, 0xc1, 0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x34, 0x73, 0x71,
0x12, 0xaf, 0xd0, 0x0a, 0xab, 0xa0, 0x0a, 0xb2, 0x20, 0x0b, 0x6a, 0xa1,
0x16, 0x26, 0x21, 0x0b, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3,
0x09, 0x83, 0x30, 0x4b, 0x50, 0x0d, 0x47, 0xa0, 0x82, 0x2e, 0x04, 0xdf,
0x2c, 0x03, 0x92, 0x04, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xdc,
0x45, 0x4e, 0xc0, 0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0x78,
0xa1, 0x13, 0xb0, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f, 0x5e,
0xbc, 0x85, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, 0x5e, 0xc0,
0x85, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xcf, 0x5e, 0xf8, 0x04,
0x2d, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xc3, 0x17, 0x3f, 0x41,
0x0b, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf4, 0xc5, 0x5c, 0x08,
0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf8, 0x05, 0x5d, 0x08, 0x26,
0x18, 0xf0, 0x31, 0xc1, 0x80, 0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18,
0x60, 0x7d, 0x71, 0x13, 0xbb, 0xa0, 0x17, 0xa3, 0x09, 0x81, 0x30, 0x9a,
0x20, 0x0c, 0x26, 0x14, 0xf2, 0x31, 0xa1, 0x90, 0xcf, 0x88, 0xc1, 0x01,
0x80, 0x20, 0x18, 0x44, 0xa5, 0xe1, 0x13, 0x82, 0x3b, 0x8c, 0x18, 0x1c,
0x00, 0x08, 0x82, 0x41, 0x64, 0x1a, 0x3f, 0x21, 0xbc, 0xc3, 0x88, 0xc1,
0x01, 0x80, 0x20, 0x18, 0x44, 0xa7, 0x31, 0x16, 0x42, 0x3a, 0x8c, 0x18,
0x1c, 0x00, 0x08, 0x82, 0x41, 0x84, 0x1a, 0x64, 0x21, 0xa8, 0x83, 0x21,
0xe3, 0x20, 0x1f, 0x43, 0xc6, 0x41, 0x3e, 0x46, 0xb8, 0x83, 0x7c, 0x8c,
0x78, 0x07, 0xf9, 0x18, 0x21, 0xc4, 0xc7, 0x08, 0x21, 0x3e, 0x23, 0x06,
0x06, 0x00, 0x82, 0x60, 0xf0, 0xc0, 0x06, 0x5b, 0x08, 0x23, 0x06, 0x06,
0x00, 0x82, 0x60, 0xf0, 0xc4, 0x46, 0x5b, 0x08, 0x26, 0xd0, 0x03, 0x7c,
0x4c, 0xa8, 0x07, 0xf8, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0x43,
0x1b, 0x71, 0x61, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0x53, 0x1b,
0x72, 0x61, 0x98, 0xf3, 0x0f, 0xf0, 0xb1, 0x60, 0x80, 0x8f, 0x3d, 0x21,
0x01, 0x1f, 0x0b, 0x08, 0xf8, 0xd8, 0x20, 0xd1, 0xc7, 0x04, 0x89, 0x3e,
0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf0, 0x06, 0x68, 0x08, 0x23,
0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf4, 0x46, 0x68, 0x08, 0x26, 0x88,
0x84, 0x7c, 0x4c, 0x18, 0x09, 0xf9, 0xd8, 0x49, 0x08, 0xf1, 0x31, 0x94,
0x10, 0xe2, 0x63, 0x86, 0x21, 0x1f, 0x0b, 0x06, 0xf9, 0xd8, 0x71, 0xc8,
0xc7, 0x02, 0x42, 0x3e, 0x46, 0x0d, 0xf0, 0x31, 0x4a, 0x80, 0xcf, 0x68,
0xc2, 0x19, 0x00, 0xa3, 0x09, 0x68, 0x10, 0x18, 0x21, 0xc8, 0xc7, 0x08,
0x41, 0x3e, 0x23, 0x06, 0x15, 0x00, 0x82, 0x60, 0x30, 0xa9, 0x47, 0x6c,
0xa4, 0xc4, 0x49, 0x08, 0x01, 0x4b, 0xb0, 0x04, 0x79, 0x90, 0x07, 0x68,
0xd4, 0x01, 0x1d, 0xb0, 0x44, 0x1c, 0xc0, 0x01, 0x4b, 0xb0, 0xc4, 0x68,
0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0xcc, 0x12, 0x54,
0xc3, 0x11, 0x22, 0x31, 0x17, 0xc1, 0x37, 0xcb, 0xa0, 0x2c, 0xc1, 0x88,
0xc1, 0x03, 0x80, 0x20, 0x18, 0x34, 0xf2, 0x61, 0x1a, 0x2e, 0xc1, 0x12,
0x2a, 0x91, 0x12, 0x31, 0x11, 0x13, 0xe9, 0x91, 0x1e, 0xa5, 0x11, 0x13,
0xa3, 0x09, 0x01, 0x60, 0x01, 0x4e, 0xc8, 0xc7, 0x02, 0x9d, 0x80, 0xcf,
0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x34, 0xf6, 0xa1, 0x1a, 0x33, 0x11,
0x13, 0xc1, 0x4d, 0xd4, 0x44, 0x4d, 0xb4, 0x47, 0x7b, 0xa4, 0x46, 0x4d,
0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68,
0x02, 0x31, 0xcc, 0x12, 0x54, 0xc3, 0x11, 0x2c, 0xc1, 0x17, 0xc1, 0x37,
0xcb, 0xc0, 0x34, 0xc1, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x60, 0xf7,
0x11, 0x1b, 0x35, 0x41, 0x1f, 0xa3, 0x09, 0x81, 0x30, 0x9a, 0x20, 0x0c,
0x26, 0xdc, 0x84, 0x7c, 0x4c, 0xb8, 0x09, 0xf9, 0x98, 0x20, 0x16, 0xf0,
0x31, 0x61, 0x2c, 0xe0, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f,
0x88, 0xf8, 0x86, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xcf, 0x88,
0xfc, 0x86, 0x60, 0xc2, 0x5c, 0xc0, 0xc7, 0x04, 0xba, 0x80, 0xcf, 0x68,
0xc2, 0x02, 0x8c, 0x26, 0x30, 0x81, 0x11, 0x82, 0x7c, 0x8c, 0x10, 0xe4,
0x63, 0x08, 0x5b, 0xc0, 0xc7, 0x90, 0xb6, 0x80, 0x8f, 0x09, 0x86, 0x7c,
0x4c, 0x30, 0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, 0x8b,
0xac, 0x87, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xcf, 0x8b, 0xb0,
0x87, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x4d, 0x8c, 0x94, 0x47,
0x5b, 0xac, 0x05, 0x31, 0xc0, 0x05, 0x5c, 0xa0, 0x08, 0x8a, 0x90, 0x07,
0x5c, 0x8c, 0x26, 0x04, 0x80, 0x05, 0x77, 0x21, 0x1f, 0x0b, 0xf2, 0x02,
0x3e, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xd4, 0x48, 0x7a, 0xc8,
0x05, 0x5c, 0x04, 0x76, 0x41, 0x17, 0x74, 0xc1, 0x22, 0x2c, 0x82, 0x1e,
0x74, 0x31, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08,
0xa3, 0x09, 0xc4, 0x30, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x8e,
0xb8, 0x87, 0x5d, 0xd0, 0x45, 0x03, 0xe5, 0x45, 0x5e, 0xc4, 0x48, 0x8c,
0xb4, 0x47, 0x5e, 0x8c, 0x26, 0x04, 0x80, 0x05, 0xa0, 0x21, 0x1f, 0x0b,
0x44, 0x03, 0x3e, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xf8, 0x88,
0x7c, 0xec, 0x45, 0x5e, 0x04, 0x7f, 0xd1, 0x17, 0x7d, 0x51, 0x23, 0x35,
0x12, 0x1f, 0x7d, 0x31, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a,
0x30, 0x08, 0xa3, 0x09, 0xc4, 0x60, 0x0d, 0x11, 0x1f, 0x6b, 0x88, 0xf8,
0x58, 0x43, 0xc4, 0xc7, 0x1a, 0x22, 0x3e, 0x46, 0x5c, 0xf2, 0x31, 0x02,
0x93, 0x8f, 0x11, 0x99, 0x7c, 0x8c, 0xd0, 0xe4, 0x63, 0x04, 0x03, 0x1f,
0x23, 0x18, 0xf8, 0x18, 0xc1, 0xc0, 0xc7, 0x08, 0x06, 0x3e, 0x23, 0x06,
0x0f, 0x00, 0x82, 0x60, 0xd0, 0xbc, 0xc9, 0x88, 0xac, 0x46, 0x6a, 0x98,
0x41, 0x18, 0xb8, 0x86, 0x6b, 0x98, 0x89, 0x99, 0x88, 0x88, 0x6b, 0x8c,
0x26, 0x04, 0x80, 0x05, 0xb5, 0x21, 0x1f, 0x0b, 0x6e, 0x03, 0x3e, 0x23,
0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xcc, 0xc9, 0x89, 0xc0, 0x86, 0x6b,
0x04, 0xb4, 0x21, 0x1b, 0xb2, 0xa1, 0x26, 0x6a, 0x62, 0x22, 0xb2, 0x31,
0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09,
0xc4, 0x30, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x0d, 0x9e, 0xb0, 0x08,
0x6d, 0xc8, 0xc6, 0x1b, 0xb8, 0xc1, 0x6d, 0xdc, 0xc6, 0x9b, 0xbc, 0xc9,
0x8a, 0xdc, 0xc6, 0x68, 0x42, 0x00, 0x58, 0xe0, 0x1b, 0xf2, 0xb1, 0x00,
0x3c, 0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x0d, 0x9f, 0xc0,
0x48, 0x6e, 0xdc, 0x46, 0xd0, 0x1b, 0xbb, 0xb1, 0x1b, 0x73, 0x32, 0x27,
0x2f, 0xb2, 0x1b, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09,
0x83, 0x30, 0x9a, 0x40, 0x0c, 0xd6, 0x10, 0xf1, 0xb1, 0x86, 0x88, 0x8f,
0x35, 0x44, 0x7c, 0xac, 0x21, 0xe2, 0x63, 0x44, 0x1d, 0xc8, 0xc7, 0x08,
0x3b, 0x90, 0x8f, 0x11, 0x77, 0x20, 0x1f, 0x23, 0xf0, 0x40, 0x3e, 0x46,
0x30, 0xf0, 0x31, 0x82, 0x81, 0x8f, 0x11, 0x0c, 0x7c, 0x8c, 0x60, 0xe0,
0x63, 0x62, 0x40, 0xc4, 0xc7, 0xc4, 0x80, 0x88, 0x8f, 0x89, 0x01, 0x11,
0x1f, 0x13, 0x03, 0x22, 0x3e, 0x46, 0x88, 0x82, 0x7c, 0x8c, 0x18, 0x05,
0xf9, 0x18, 0x41, 0x0a, 0xf2, 0x31, 0xa2, 0x14, 0xe4, 0x63, 0x04, 0x03,
0x1f, 0x23, 0x18, 0xf8, 0x18, 0xc1, 0xc0, 0xc7, 0x08, 0x06, 0x3e, 0xb3,
0x04, 0xd5, 0x70, 0x84, 0x7a, 0xe4, 0x48, 0xf0, 0xcd, 0x32, 0x38, 0x4f,
0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4f, 0xae, 0xec, 0x89, 0x7c,
0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xa3, 0x2b, 0x7c, 0x22, 0x1f,
0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xec, 0x4a, 0xac, 0x08, 0x23,
0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xf0, 0x8a, 0xac, 0x08, 0x23, 0x06,
0x06, 0x00, 0x82, 0x60, 0xf0, 0xf4, 0x0a, 0xa8, 0xd8, 0xc7, 0x88, 0x81,
0x01, 0x80, 0x20, 0x18, 0x3c, 0xbe, 0x12, 0x2a, 0xf6, 0x31, 0x62, 0x60,
0x00, 0x20, 0x08, 0x06, 0xcf, 0xaf, 0xd4, 0x8a, 0x30, 0x62, 0x60, 0x00,
0x20, 0x08, 0x06, 0x0f, 0xb8, 0xd8, 0x8a, 0x60, 0x82, 0x01, 0x1f, 0x13,
0x0c, 0xf8, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0xf6, 0x2b, 0x79,
0xd2, 0x1f, 0xbc, 0x32, 0x9a, 0x10, 0x08, 0xa3, 0x09, 0xc2, 0x60, 0x42,
0x21, 0x1f, 0x13, 0x0a, 0xf9, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41,
0x74, 0x2e, 0xa0, 0x22, 0xc0, 0xc8, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18,
0x44, 0xe8, 0x12, 0x2a, 0x42, 0x8c, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82,
0x41, 0x94, 0x2e, 0xa5, 0x22, 0xac, 0xc8, 0x88, 0xc1, 0x01, 0x80, 0x20,
0x18, 0x44, 0xea, 0x62, 0x2a, 0x02, 0x8b, 0x18, 0x52, 0x22, 0xf2, 0x31,
0xa4, 0x44, 0xe4, 0x63, 0x04, 0x8c, 0xc8, 0xc7, 0x88, 0x18, 0x91, 0x8f,
0x11, 0x42, 0x7c, 0x8c, 0x10, 0xe2, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08,
0x06, 0x8f, 0xbc, 0xb8, 0x8a, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06,
0xcf, 0xbc, 0xbc, 0x8a, 0x60, 0x82, 0x8d, 0xc0, 0xc7, 0x84, 0x1b, 0x81,
0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0xf6, 0x32, 0x2b, 0xc6,
0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0xf7, 0x42, 0x2b, 0x86, 0x39,
0x61, 0x02, 0x1f, 0x0b, 0x06, 0xf8, 0xd8, 0x33, 0x26, 0xf0, 0xb1, 0x80,
0x80, 0x8f, 0x0d, 0x12, 0x7d, 0x4c, 0x90, 0xe8, 0x33, 0x62, 0x60, 0x00,
0x20, 0x08, 0x06, 0x8f, 0xbf, 0x88, 0x8b, 0x30, 0x62, 0x60, 0x00, 0x20,
0x08, 0x06, 0xcf, 0xbf, 0x8c, 0x8b, 0x60, 0x02, 0x99, 0xc8, 0xc7, 0x84,
0x32, 0x91, 0x8f, 0xa5, 0x89, 0x10, 0x1f, 0x53, 0x13, 0x21, 0x3e, 0x66,
0x18, 0xf2, 0xb1, 0x60, 0x90, 0x8f, 0x1d, 0x87, 0x7c, 0x2c, 0x20, 0xe4,
0x63, 0xd4, 0x00, 0x1f, 0xa3, 0x04, 0xf8, 0x8c, 0x26, 0x9c, 0x01, 0x30,
0x9a, 0x80, 0x06, 0x81, 0xa1, 0x81, 0x20, 0x1f, 0x0b, 0x0a, 0xf9, 0x58,
0x1a, 0x0c, 0xf2, 0xb1, 0xc0, 0x90, 0x8f, 0x0d, 0x72, 0x02, 0x1f, 0x13,
0xe6, 0x04, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xc8, 0x8c,
0xbb, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xcc, 0xcc, 0xbb,
0x08, 0x26, 0x8c, 0x0a, 0x7c, 0x4c, 0x20, 0x15, 0xf8, 0x98, 0xc0, 0xc8,
0xc7, 0x04, 0x46, 0x3e, 0x66, 0xe8, 0x09, 0x7c, 0xcc, 0xd8, 0x13, 0xf8,
0x98, 0x00, 0xc9, 0xc7, 0x04, 0x48, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82,
0x60, 0xf0, 0xf0, 0x4c, 0xbe, 0x30, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60,
0xf0, 0xf4, 0x8c, 0xbe, 0x30, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0,
0xfc, 0xcc, 0xbc, 0xec, 0x49, 0x9e, 0x10, 0x83, 0x9f, 0xf8, 0x89, 0xcd,
0xd8, 0x8c, 0xbc, 0xf8, 0xc9, 0x68, 0x42, 0x00, 0x58, 0x50, 0x2a, 0xf2,
0xb1, 0xe0, 0x54, 0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0xcd,
0xd8, 0xdc, 0x0b, 0xa8, 0xf8, 0x49, 0x40, 0x2a, 0xa2, 0x22, 0x2a, 0x3a,
0xa3, 0x33, 0xf6, 0x22, 0x2a, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04,
0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x23, 0x06, 0x0f, 0x00, 0x82,
0x60, 0xd0, 0xa0, 0x0d, 0xbf, 0x90, 0x8a, 0xa8, 0x34, 0xd0, 0xa9, 0x9c,
0xca, 0xcf, 0xfc, 0xcc, 0xbe, 0x9c, 0xca, 0x68, 0x42, 0x00, 0x58, 0xe0,
0x2a, 0xf2, 0xb1, 0x00, 0x56, 0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08,
0x06, 0x0d, 0xdb, 0x80, 0x4c, 0xaa, 0x9c, 0x4a, 0xd0, 0x2a, 0xab, 0xb2,
0x2a, 0x63, 0x33, 0x36, 0xff, 0xb2, 0x2a, 0xa3, 0x09, 0x01, 0x30, 0x9a,
0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0xd6, 0x10, 0xf1,
0xb1, 0x86, 0x88, 0x8f, 0x35, 0x44, 0x7c, 0xac, 0x21, 0xe2, 0x63, 0xc4,
0x25, 0x1f, 0x23, 0x30, 0xf9, 0x18, 0x91, 0xc9, 0xc7, 0x08, 0x4d, 0x3e,
0x46, 0x30, 0xf0, 0x31, 0x82, 0x81, 0x8f, 0x11, 0x0c, 0x7c, 0x8c, 0x60,
0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x4d, 0xdf, 0xc4, 0x4c,
0xae, 0xdc, 0x8a, 0x19, 0x84, 0x01, 0xaf, 0xf0, 0x0a, 0xdd, 0xd0, 0x0d,
0xcc, 0xf0, 0xca, 0x68, 0x42, 0x00, 0x58, 0x30, 0x2e, 0xf2, 0xb1, 0xa0,
0x5c, 0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x4d, 0xe8, 0xd4,
0x8c, 0xaf, 0xf0, 0x4a, 0x20, 0x2e, 0xe0, 0x02, 0x2e, 0x78, 0x83, 0x37,
0x34, 0x03, 0x2e, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09,
0x83, 0x30, 0x9a, 0x40, 0x0c, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0,
0x98, 0x8e, 0xce, 0x88, 0x0b, 0xb8, 0xbc, 0x81, 0x1b, 0x94, 0x4b, 0xb9,
0xf4, 0x4d, 0xdf, 0xe4, 0x4c, 0xb9, 0x8c, 0x26, 0x04, 0x80, 0x05, 0xec,
0x22, 0x1f, 0x0b, 0xdc, 0x05, 0x3e, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60,
0xd0, 0xa8, 0x8e, 0xcf, 0x9c, 0x4b, 0xb9, 0x04, 0xeb, 0x92, 0x2e, 0xe9,
0x12, 0x3a, 0xa1, 0xd3, 0x33, 0xe9, 0x32, 0x9a, 0x10, 0x00, 0xa3, 0x09,
0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x60, 0x0d, 0x11, 0x1f,
0x6b, 0x88, 0xf8, 0x58, 0x43, 0xc4, 0xc7, 0x1a, 0x22, 0x3e, 0x46, 0xd4,
0x81, 0x7c, 0x8c, 0xb0, 0x03, 0xf9, 0x18, 0x71, 0x07, 0xf2, 0x31, 0x02,
0x0f, 0xe4, 0x63, 0x04, 0x03, 0x1f, 0x23, 0x18, 0xf8, 0x18, 0xc1, 0xc0,
0xc7, 0x08, 0x06, 0x3e, 0x26, 0x06, 0x44, 0x7c, 0x4c, 0x0c, 0x88, 0xf8,
0x98, 0x18, 0x10, 0xf1, 0x31, 0x31, 0x20, 0xe2, 0x63, 0x84, 0x28, 0xc8,
0xc7, 0x88, 0x51, 0x90, 0x8f, 0x11, 0xa4, 0x20, 0x1f, 0x23, 0x4a, 0x41,
0x3e, 0x46, 0x30, 0xf0, 0x31, 0x82, 0x81, 0x8f, 0x11, 0x0c, 0x7c, 0x8c,
0x60, 0xe0, 0x33, 0x4b, 0x50, 0x0d, 0x47, 0xe0, 0x8b, 0xd9, 0x04, 0xdf,
0x2c, 0x03, 0x14, 0x05, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xa0,
0x0f, 0xdf, 0x90, 0x8c, 0xc8, 0x80, 0xcc, 0xbf, 0x9c, 0xcc, 0xc9, 0xfc,
0xce, 0xef, 0xec, 0xcd, 0xc9, 0x8c, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x03,
0x80, 0x20, 0x18, 0x34, 0xea, 0xe3, 0x37, 0x27, 0x43, 0x32, 0x22, 0x13,
0x32, 0x29, 0x93, 0x32, 0xe1, 0x13, 0x3e, 0x7d, 0x93, 0x32, 0xa3, 0x09,
0x01, 0x30, 0x9a, 0x20, 0x04, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x80,
0xa1, 0x8f, 0xe8, 0x98, 0x0c, 0xf8, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82,
0x10, 0x8c, 0x26, 0x0c, 0x82, 0x0d, 0x08, 0x7c, 0x6c, 0x38, 0xe0, 0x63,
0xc3, 0x01, 0x9f, 0x11, 0x83, 0x03, 0x00, 0x41, 0x30, 0xc0, 0xde, 0x27,
0x75, 0x5a, 0x26, 0x76, 0x46, 0x13, 0x02, 0x60, 0x34, 0x41, 0x08, 0x46,
0x13, 0x06, 0x61, 0xc4, 0x60, 0x01, 0x40, 0x10, 0x0c, 0x2a, 0xfa, 0xb1,
0x9d, 0xc3, 0x28, 0x06, 0x21, 0x18, 0x31, 0x38, 0x00, 0x10, 0x04, 0x03,
0x8c, 0x7e, 0x5c, 0x47, 0x66, 0x70, 0x67, 0x34, 0x21, 0x00, 0x46, 0x13,
0x84, 0x60, 0x34, 0x61, 0x10, 0x46, 0x0c, 0x16, 0x00, 0x04, 0xc1, 0xa0,
0xca, 0x9f, 0xdd, 0x61, 0x16, 0x65, 0x10, 0x82, 0x11, 0x83, 0x03, 0x00,
0x41, 0x30, 0xc0, 0xf2, 0x67, 0x76, 0x6e, 0x66, 0x7e, 0x46, 0x13, 0x02,
0x60, 0x34, 0x41, 0x08, 0x46, 0x13, 0x06, 0x61, 0xc4, 0x60, 0x01, 0x40,
0x10, 0x0c, 0x2a, 0xff, 0x01, 0x9f, 0x08, 0x7a, 0x06, 0x21, 0x98, 0x25,
0xa8, 0x86, 0x23, 0x68, 0x26, 0x74, 0x82, 0x6f, 0x96, 0x41, 0x9a, 0x82,
0x11, 0x83, 0x07, 0x00, 0x41, 0x30, 0x68, 0x48, 0x08, 0x77, 0xc0, 0xc6,
0x67, 0x78, 0x66, 0x67, 0xc6, 0x66, 0x6c, 0xf6, 0x67, 0x7f, 0x6e, 0x67,
0x6c, 0x46, 0x13, 0x02, 0x60, 0xc4, 0xe0, 0x01, 0x40, 0x10, 0x0c, 0x1a,
0x13, 0xd2, 0x9d, 0xb1, 0x01, 0x1b, 0x9f, 0xe9, 0x99, 0xb2, 0x29, 0x9b,
0xfe, 0xe9, 0x9f, 0xdc, 0x29, 0x9b, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10,
0x82, 0x11, 0x83, 0x03, 0x00, 0x41, 0x30, 0xc0, 0x48, 0xc8, 0x77, 0xc4,
0x86, 0x7f, 0x46, 0x13, 0x02, 0x60, 0x34, 0x41, 0x08, 0x46, 0x13, 0x06,
0xc1, 0x06, 0x04, 0x3e, 0x36, 0x18, 0xf0, 0xb1, 0x01, 0x81, 0xcf, 0x88,
0xc1, 0x01, 0x80, 0x20, 0x18, 0x60, 0x2b, 0x54, 0x3e, 0x69, 0xd3, 0x3e,
0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x62,
0xb0, 0x00, 0x20, 0x08, 0x06, 0x15, 0x0c, 0xc9, 0xcf, 0x61, 0x14, 0x83,
0x10, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0x06, 0x43, 0xea, 0xe3,
0x36, 0xf4, 0x33, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30,
0x08, 0x23, 0x06, 0x0b, 0x00, 0x82, 0x60, 0x50, 0xd5, 0xd0, 0xfd, 0x30,
0x8b, 0x32, 0x08, 0xc1, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x60, 0x35,
0xf4, 0x3e, 0x73, 0xf3, 0x42, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04,
0xa3, 0x09, 0x83, 0x30, 0x62, 0xb0, 0x00, 0x20, 0x08, 0x06, 0x95, 0x0e,
0xf1, 0x4f, 0x04, 0x3d, 0x83, 0x10, 0xcc, 0x12, 0x54, 0xc3, 0x11, 0x70,
0xc3, 0x3b, 0xc1, 0x37, 0xcb, 0x40, 0x55, 0xc1, 0x88, 0xc1, 0x03, 0x80,
0x20, 0x18, 0x34, 0x60, 0x44, 0x3f, 0x7c, 0xa3, 0x37, 0x78, 0x73, 0x37,
0x7f, 0xf3, 0x37, 0x37, 0x74, 0x43, 0xf3, 0xf3, 0x37, 0xa3, 0x09, 0x01,
0x30, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x18, 0xd9, 0xcf, 0xdf,
0xf0, 0x8d, 0xde, 0xe4, 0x4d, 0xe8, 0x84, 0x4e, 0x0e, 0xe5, 0x50, 0xfd,
0x84, 0xce, 0x68, 0x42, 0x00, 0x8c, 0x18, 0x3c, 0x00, 0x08, 0x82, 0x41,
0x43, 0x46, 0xf8, 0x23, 0x3a, 0x7e, 0xc3, 0x37, 0x7b, 0x33, 0x3a, 0xa3,
0xb3, 0x43, 0x3b, 0x74, 0x3f, 0xa3, 0x33, 0x9a, 0x10, 0x00, 0x23, 0x06,
0x07, 0x00, 0x82, 0x60, 0x80, 0x85, 0xd1, 0xfe, 0xfc, 0x4d, 0x0e, 0x8d,
0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0x82, 0x0d, 0x09,
0x7c, 0x6c, 0x40, 0xe0, 0x63, 0xc3, 0x01, 0x9f, 0x11, 0x83, 0x03, 0x00,
0x41, 0x30, 0xc0, 0xd0, 0x48, 0x84, 0x4c, 0x47, 0x85, 0x46, 0x13, 0x02,
0x60, 0x34, 0x41, 0x08, 0x46, 0x13, 0x06, 0x61, 0xc4, 0x60, 0x01, 0x40,
0x10, 0x0c, 0xaa, 0x36, 0x7a, 0xa1, 0xc3, 0x28, 0x06, 0x21, 0x18, 0x31,
0x38, 0x00, 0x10, 0x04, 0x03, 0xac, 0x8d, 0x4e, 0x68, 0x75, 0x62, 0x68,
0x34, 0x21, 0x00, 0x46, 0x13, 0x84, 0x60, 0x34, 0x61, 0x10, 0x46, 0x0c,
0x16, 0x00, 0x04, 0xc1, 0xa0, 0x92, 0x23, 0x1a, 0x62, 0x16, 0x65, 0x10,
0x82, 0x11, 0x83, 0x03, 0x00, 0x41, 0x30, 0xc0, 0xe4, 0x88, 0x85, 0x60,
0x87, 0x8d, 0x46, 0x13, 0x02, 0x60, 0x34, 0x41, 0x08, 0x46, 0x13, 0x06,
0x61, 0xc4, 0x60, 0x01, 0x40, 0x10, 0x0c, 0xaa, 0x3b, 0xca, 0xa1, 0x08,
0x7a, 0x06, 0x21, 0x98, 0x25, 0xa8, 0x06, 0xca, 0x06, 0xbc, 0x03, 0x64,
0x4e, 0xe0, 0x31, 0x02, 0xc6, 0x0c, 0x9e, 0x42, 0x54, 0x4a, 0x71, 0x1d,
0x46, 0x2e, 0x1c, 0x94, 0x80, 0x60, 0x41, 0xb2, 0x28, 0xbc, 0x9b, 0x06,
0xca, 0x06, 0xbd, 0x03, 0x64, 0x4e, 0xe0, 0x31, 0x02, 0xc6, 0x0c, 0x9e,
0x42, 0x54, 0x4a, 0x71, 0x1d, 0x46, 0x2e, 0x1c, 0x90, 0x80, 0x50, 0x41,
0x72, 0x28, 0xbf, 0x9b, 0x06, 0xca, 0x06, 0xbe, 0x03, 0x64, 0x4e, 0xe0,
0x31, 0x02, 0xc6, 0x0c, 0x9e, 0x42, 0x54, 0x4a, 0x71, 0x1d, 0x46, 0x2e,
0x1c, 0x7c, 0x80, 0x40, 0x41, 0x32, 0x28, 0xbe, 0x9b, 0x06, 0xca, 0x06,
0xbf, 0x03, 0x64, 0x4e, 0xe0, 0x31, 0xc2, 0xef, 0x0c, 0xbf, 0x43, 0x54,
0x4a, 0x71, 0x1d, 0x46, 0x2e, 0x1c, 0xbf, 0x83, 0xfc, 0x4e, 0xf2, 0x3b,
0xca, 0xef, 0xa6, 0xd1, 0x04, 0xd9, 0x11, 0x86, 0x23, 0x82, 0xf3, 0x09,
0xbe, 0x59, 0x06, 0xeb, 0x0a, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0,
0x09, 0xa5, 0x3b, 0x32, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x11,
0x25, 0x3c, 0x32, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x19, 0xa5,
0x3c, 0x32, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x21, 0xa5, 0x1e,
0x1a, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x29, 0x25, 0x1f, 0x1a,
0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x31, 0xa5, 0x1f, 0x1a, 0x6c,
0xb8, 0x1f, 0xf9, 0xd8, 0x80, 0x3f, 0xf2, 0xb1, 0x21, 0x7f, 0xe4, 0x33,
0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, 0x2a, 0x91, 0xd1, 0x30, 0x62,
0x60, 0x00, 0x20, 0x08, 0x06, 0xcf, 0x2a, 0x95, 0xd1, 0x30, 0x62, 0x60,
0x00, 0x20, 0x08, 0x06, 0x0f, 0x2b, 0x99, 0xd1, 0x60, 0x83, 0xff, 0xc0,
0xc7, 0x86, 0xff, 0x81, 0x8f, 0x0d, 0x20, 0x04, 0x9f, 0x11, 0x83, 0x03,
0x00, 0x41, 0x30, 0x88, 0x5e, 0x09, 0x8d, 0x86, 0xf9, 0x19, 0x31, 0x38,
0x00, 0x10, 0x04, 0x83, 0x08, 0x96, 0xd2, 0x68, 0xa0, 0x9f, 0x11, 0x83,
0x03, 0x00, 0x41, 0x30, 0x88, 0x62, 0x49, 0x8d, 0x86, 0xfa, 0xb1, 0xa4,
0x84, 0xe4, 0x63, 0x89, 0x09, 0xc9, 0xc7, 0x92, 0x13, 0x92, 0x8f, 0xa5,
0xd0, 0x10, 0x1f, 0x53, 0xa1, 0x21, 0x3e, 0xb6, 0x42, 0x43, 0x7c, 0x2c,
0x19, 0xe8, 0x63, 0xc9, 0x40, 0x1f, 0x4b, 0x06, 0xfa, 0x8c, 0x18, 0x18,
0x00, 0x08, 0x82, 0xc1, 0xc3, 0x4b, 0xb2, 0x34, 0x8c, 0x18, 0x18, 0x00,
0x08, 0x82, 0xc1, 0xd3, 0x4b, 0xb3, 0x34, 0x8c, 0x18, 0x18, 0x00, 0x08,
0x82, 0xc1, 0xe3, 0x4b, 0xb4, 0x34, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
0xc1, 0xf3, 0x4b, 0x78, 0x34, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1,
0x03, 0x4e, 0x79, 0x34, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0x13,
0x4e, 0x7a, 0x34, 0xd8, 0x60, 0x43, 0xf2, 0xb1, 0xe1, 0x86, 0xe4, 0x63,
0x03, 0x0e, 0xc9, 0x67, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x9e, 0x72,
0xfa, 0xa3, 0x61, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x1e, 0x73, 0x02,
0xa5, 0x61, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x9e, 0x73, 0x0a, 0xa5,
0xc1, 0x86, 0x3d, 0x92, 0x8f, 0x0d, 0x7c, 0x24, 0x1f, 0x1b, 0xfa, 0x48,
0x3e, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x80, 0x9d, 0x53, 0x28, 0x95,
0x10, 0x38, 0x8d, 0x26, 0x04, 0x83, 0x15, 0x01, 0x7d, 0xac, 0x10, 0xe8,
0x63, 0xc5, 0x40, 0x9f, 0x59, 0x82, 0x6b, 0xa0, 0x62, 0x30, 0x2c, 0x75,
0xa8, 0x06, 0x2a, 0x06, 0xc3, 0x52, 0x87, 0x6a, 0xa0, 0x62, 0x30, 0x2c,
0x75, 0xa8, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0x00, 0x7b, 0xa7, 0x54,
0x6a, 0x21, 0x74, 0x1a, 0x4d, 0x08, 0x80, 0xe1, 0x88, 0x00, 0x87, 0x9c,
0x6f, 0x96, 0x01, 0x0b, 0x83, 0x60, 0x38, 0x42, 0xb8, 0xa1, 0xe0, 0x9b,
0x65, 0xc8, 0xb4, 0x60, 0x34, 0x81, 0x08, 0x2c, 0x40, 0xe4, 0x63, 0x02,
0x22, 0x1f, 0x1b, 0x10, 0xf9, 0xcc, 0x12, 0x84, 0xc1, 0x70, 0xc4, 0xf1,
0x43, 0xc1, 0x37, 0xcb, 0xb0, 0x85, 0x41, 0x30, 0x1c, 0xd1, 0x07, 0x60,
0x14, 0x7c, 0xb3, 0x0c, 0x5c, 0x17, 0x58, 0xa3, 0x47, 0xf2, 0x19, 0x31,
0x40, 0x00, 0x10, 0x04, 0x03, 0x2d, 0x9f, 0x6a, 0x49, 0x8f, 0x9a, 0x60,
0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x34, 0x7d, 0xb2, 0x25, 0x3d, 0x6a,
0x02, 0x83, 0xf4, 0x48, 0x3e, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0xa0,
0xf1, 0x13, 0x2e, 0xe9, 0x11, 0x14, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82,
0x81, 0xd6, 0x4f, 0xb9, 0xa4, 0x47, 0x50, 0x60, 0x93, 0x1e, 0xc9, 0x67,
0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0xb4, 0x7f, 0xda, 0x25, 0x3d, 0x9a,
0x82, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0xd0, 0x40, 0x8a, 0x97, 0xf4,
0x68, 0x0a, 0x66, 0x09, 0xba, 0x81, 0x8a, 0xc1, 0xe1, 0xd8, 0x60, 0x1b,
0xa8, 0x18, 0x14, 0x8e, 0x0d, 0xb6, 0x81, 0x8a, 0xc1, 0xe0, 0xd8, 0x60,
0x1b, 0x31, 0x38, 0x00, 0x10, 0x04, 0x83, 0x08, 0xa5, 0xc2, 0x49, 0x08,
0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0x20, 0x4a, 0x29, 0x71, 0x22, 0x82,
0xe1, 0x88, 0xc0, 0x8d, 0x84, 0x6f, 0x96, 0xc1, 0xfb, 0x82, 0xd1, 0x84,
0x2c, 0xb0, 0x21, 0x90, 0x8f, 0x05, 0x6f, 0x04, 0x9f, 0xd1, 0x04, 0x4e,
0x30, 0x23, 0x90, 0x8f, 0x05, 0x72, 0x04, 0x1f, 0x23, 0x02, 0xfa, 0x58,
0xd0, 0xc8, 0xc7, 0x84, 0x46, 0x3e, 0x36, 0x34, 0xf2, 0x99, 0x25, 0xf8,
0x06, 0x2a, 0x06, 0xc3, 0x03, 0x83, 0x6e, 0xa0, 0x62, 0x30, 0x3c, 0x30,
0xe8, 0x06, 0x2a, 0x06, 0xc3, 0x03, 0x83, 0x6e, 0x96, 0x01, 0x0c, 0xc2,
0xa0, 0xb3, 0xc1, 0x9c, 0xe4, 0x33, 0x62, 0x80, 0x00, 0x20, 0x08, 0x06,
0x5a, 0x4d, 0xc5, 0x93, 0x39, 0x0d, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20,
0x18, 0x68, 0x36, 0x25, 0x4f, 0xe6, 0x34, 0x04, 0x66, 0x98, 0x93, 0x7c,
0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0x40, 0xc3, 0x29, 0x7a, 0x32, 0x27,
0x23, 0x18, 0x31, 0x40, 0x00, 0x10, 0x04, 0x03, 0x2d, 0xa7, 0xea, 0xc9,
0x9c, 0x8c, 0xc0, 0x12, 0x73, 0x92, 0xcf, 0x88, 0x01, 0x02, 0x80, 0x20,
0x18, 0x68, 0x3b, 0x75, 0x4f, 0xe6, 0x94, 0x04, 0x23, 0x06, 0x08, 0x00,
0x82, 0x60, 0xa0, 0xf1, 0x14, 0x3e, 0x99, 0x53, 0x12, 0xcc, 0x12, 0x84,
0xc1, 0x40, 0xcb, 0x40, 0x0e, 0x17, 0x2d, 0x64, 0x0e, 0x18, 0x60, 0x1f,
0x39, 0x68, 0x03, 0x2d, 0x03, 0x39, 0x5c, 0xb4, 0x90, 0x29, 0x60, 0x80,
0x7d, 0xe4, 0xa0, 0x0d, 0xb4, 0x0c, 0xe4, 0x70, 0xd1, 0x42, 0x66, 0x80,
0x01, 0xf6, 0x91, 0x83, 0x36, 0x1c, 0x61, 0x0e, 0xa6, 0x14, 0x7c, 0xb3,
0x0c, 0x62, 0xd0, 0x06, 0xc1, 0x68, 0x42, 0x1e, 0x01, 0xc3, 0x11, 0x81,
0x2a, 0x39, 0xdf, 0x2c, 0xc3, 0x18, 0xb0, 0x41, 0x30, 0x1c, 0x61, 0xe8,
0x93, 0xf2, 0xcd, 0x32, 0x94, 0x01, 0x19, 0x04, 0x76, 0xe8, 0x93, 0x7c,
0x66, 0x09, 0xcc, 0xc0, 0x10, 0x7d, 0x82, 0xcf, 0x88, 0x81, 0x01, 0x80,
0x20, 0x18, 0x3c, 0x6b, 0x15, 0x56, 0x81, 0x05, 0xfb, 0x24, 0x9f, 0x11,
0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0xda, 0xca, 0xa4, 0x02, 0x0b, 0xf8,
0x49, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xbc, 0x55, 0x4a,
0x05, 0xb3, 0x04, 0x66, 0x30, 0x50, 0x31, 0x38, 0x64, 0x20, 0x94, 0xc1,
0x70, 0x84, 0x33, 0x52, 0xca, 0x37, 0xcb, 0x80, 0x06, 0x67, 0x10, 0xd8,
0x33, 0x52, 0xf2, 0x99, 0x25, 0x48, 0x03, 0x83, 0x46, 0x0a, 0x3e, 0x23,
0x06, 0x06, 0x00, 0x82, 0x60, 0xf0, 0xd0, 0x95, 0x5a, 0x05, 0x16, 0x90,
0x94, 0x7c, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0xb1, 0xab, 0x97,
0x0a, 0x2c, 0x28, 0x29, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1,
0x83, 0x57, 0x32, 0x15, 0xcc, 0x12, 0xa4, 0xc1, 0x40, 0xc5, 0xe0, 0x9c,
0x81, 0x80, 0x06, 0xc3, 0x11, 0x16, 0x4b, 0x29, 0xdf, 0x2c, 0xc3, 0x1a,
0xa8, 0x41, 0x60, 0x17, 0x4b, 0xc9, 0x67, 0x96, 0x80, 0x0d, 0x0c, 0x63,
0x29, 0xf8, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xd3, 0x57, 0x73,
0x15, 0x58, 0xd0, 0x52, 0xf2, 0x19, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83,
0xe7, 0xaf, 0x70, 0x2a, 0xb0, 0xc0, 0xa5, 0xe4, 0x33, 0x62, 0x60, 0x00,
0x20, 0x08, 0x06, 0x4f, 0x68, 0xed, 0x54, 0x30, 0x4b, 0xc0, 0x06, 0x03,
0x1d, 0x03, 0x19, 0xac, 0x01, 0x19, 0xa8, 0x01, 0x28, 0x88, 0xc1, 0x40,
0xc7, 0x40, 0xad, 0x01, 0xa5, 0x06, 0xa0, 0x20, 0x06, 0x03, 0x1d, 0x83,
0xb1, 0x06, 0x92, 0x1a, 0x80, 0x82, 0x18, 0x8c, 0x26, 0xe0, 0xd2, 0x60,
0x44, 0x20, 0x1f, 0x23, 0x04, 0xf9, 0x18, 0x31, 0xc8, 0x67, 0x96, 0xc0,
0x14, 0x86, 0x23, 0x54, 0xa2, 0x9d, 0x82, 0x6f, 0x34, 0xa1, 0x97, 0x86,
0x59, 0x06, 0x37, 0xc8, 0x03, 0xc1, 0xd2, 0x20, 0x90, 0x8f, 0xa5, 0x81,
0x20, 0x1f, 0x4b, 0x83, 0x41, 0x3e, 0xa3, 0x09, 0xe1, 0x04, 0x0c, 0x47,
0x04, 0xf2, 0xe4, 0x7c, 0xb3, 0x0c, 0xa6, 0xf0, 0x06, 0xc1, 0x70, 0x44,
0xa1, 0x4f, 0xca, 0x37, 0xcb, 0x10, 0x07, 0x70, 0x10, 0x98, 0xc1, 0x4f,
0xf2, 0x99, 0x25, 0x90, 0x83, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78,
0x64, 0x0b, 0xb5, 0x8e, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x66,
0x8b, 0xad, 0x02, 0x0b, 0x40, 0x4a, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82,
0x60, 0xf0, 0xd4, 0xd6, 0x5b, 0x05, 0x16, 0x8c, 0x94, 0x7c, 0x2c, 0x28,
0x29, 0xf8, 0xcc, 0x12, 0xc8, 0xc1, 0x40, 0xc5, 0xe0, 0xc0, 0x81, 0x10,
0x07, 0xc3, 0x11, 0xcd, 0x48, 0x29, 0xdf, 0x2c, 0x03, 0x1d, 0xcc, 0x41,
0x60, 0x4e, 0x49, 0xc9, 0x67, 0x96, 0xa0, 0x0e, 0x46, 0x0c, 0x0c, 0x00,
0x04, 0xc1, 0xe0, 0xd9, 0xad, 0xd8, 0x7a, 0x46, 0x0c, 0x0c, 0x00, 0x04,
0xc1, 0xe0, 0xe1, 0xad, 0xba, 0x0a, 0x2c, 0x48, 0x29, 0xf9, 0x8c, 0x18,
0x18, 0x00, 0x08, 0x82, 0xc1, 0xe3, 0x5b, 0x78, 0x15, 0x58, 0xc0, 0x52,
0xf2, 0xb1, 0xc0, 0xa5, 0xe0, 0x33, 0x4b, 0x50, 0x07, 0x03, 0x15, 0x83,
0x33, 0x07, 0x02, 0x1d, 0x0c, 0x47, 0x54, 0x2c, 0xa5, 0x7c, 0xb3, 0x0c,
0x77, 0x60, 0x07, 0x81, 0x59, 0x2e, 0x25, 0x9f, 0x59, 0x02, 0x3c, 0x18,
0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x87, 0xbc, 0x74, 0xeb, 0x1a, 0x31,
0x30, 0x00, 0x10, 0x04, 0x83, 0xa7, 0xbc, 0xfc, 0x2a, 0xb0, 0x40, 0xa6,
0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xcf, 0x79, 0x85, 0x56,
0x60, 0x41, 0x4d, 0xc9, 0xc7, 0x82, 0x9b, 0x82, 0xcf, 0x2c, 0x01, 0x1e,
0x0c, 0x54, 0x0c, 0x8e, 0x1d, 0x08, 0x77, 0x30, 0x62, 0x70, 0x00, 0x20,
0x08, 0x06, 0x91, 0x7a, 0x8d, 0xd6, 0xe4, 0x52, 0x23, 0x06, 0x07, 0x00,
0x82, 0x60, 0x10, 0xad, 0x17, 0x69, 0x2d, 0x2f, 0x35, 0x62, 0x70, 0x00,
0x20, 0x08, 0x06, 0x11, 0x7b, 0x95, 0xd6, 0x00, 0x53, 0x23, 0x06, 0x07,
0x00, 0x82, 0x60, 0x10, 0xb5, 0x57, 0x6a, 0x0d, 0x2f, 0x35, 0x62, 0x70,
0x00, 0x20, 0x08, 0x06, 0x91, 0x7b, 0xa9, 0xd6, 0x00, 0x53, 0x23, 0x06,
0x07, 0x00, 0x82, 0x60, 0x10, 0xbd, 0xd7, 0x6a, 0x0d, 0x31, 0x35, 0x4b,
0x60, 0x0a, 0xb3, 0x0c, 0x7a, 0x50, 0x0a, 0x71, 0x61, 0xaf, 0xe0, 0x57,
0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04, 0x03, 0xad, 0xbd, 0x52, 0xcb,
0xaf, 0x5e, 0x21, 0x18, 0x31, 0x40, 0x00, 0x10, 0x04, 0x03, 0xcd, 0xbd,
0x54, 0xcb, 0xaf, 0x5e, 0x21, 0x30, 0x59, 0xf0, 0x2b, 0xf9, 0x8c, 0x18,
0x20, 0x00, 0x08, 0x82, 0x81, 0x06, 0x5f, 0xac, 0xe5, 0x57, 0xb2, 0x10,
0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0x81, 0x16, 0x5f, 0xad, 0xe5, 0x57,
0xb2, 0x10, 0x58, 0x2d, 0xf8, 0x95, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04,
0xc1, 0x40, 0x9b, 0xaf, 0xd7, 0xf2, 0xab, 0x5a, 0x08, 0x46, 0x0c, 0x10,
0x00, 0x04, 0xc1, 0x40, 0xa3, 0x2f, 0xd8, 0xf2, 0xab, 0x5a, 0x08, 0xec,
0x80, 0x03, 0xf9, 0x58, 0x11, 0x07, 0xf2, 0xb1, 0x41, 0x0e, 0xe4, 0x33,
0x9a, 0x00, 0x53, 0xc0, 0x70, 0x44, 0x10, 0x56, 0xce, 0x37, 0xcb, 0x60,
0x0a, 0x7b, 0x10, 0x0c, 0x47, 0x14, 0x69, 0xa5, 0x7c, 0xb3, 0x0c, 0x7d,
0xc0, 0x07, 0x81, 0x19, 0x6b, 0x25, 0x9f, 0x59, 0x02, 0x3f, 0x18, 0x31,
0x30, 0x00, 0x10, 0x04, 0x83, 0x27, 0xc4, 0xee, 0xeb, 0x18, 0x31, 0x30,
0x00, 0x10, 0x04, 0x83, 0x47, 0xc4, 0x76, 0x2b, 0xb0, 0xe0, 0xad, 0xe4,
0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0f, 0x89, 0xf9, 0x56, 0x60,
0x81, 0x5c, 0xc9, 0xc7, 0x02, 0xba, 0x82, 0xcf, 0x2c, 0x81, 0x1f, 0x0c,
0x54, 0x0c, 0x0e, 0x1f, 0x08, 0x7d, 0x30, 0x1c, 0xd1, 0xc8, 0x95, 0xf2,
0xcd, 0x32, 0x80, 0xc2, 0x1f, 0x04, 0xe6, 0xd0, 0x95, 0x7c, 0x66, 0x09,
0x42, 0x61, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x1e, 0x15, 0x03, 0xb1,
0x67, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x9e, 0x15, 0x23, 0xaf, 0xc0,
0x02, 0xbc, 0x92, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x3c, 0x2d,
0x76, 0x5e, 0x81, 0x05, 0x7b, 0x25, 0x1f, 0x0b, 0xfa, 0x0a, 0x3e, 0xb3,
0x04, 0xa1, 0x30, 0x50, 0x31, 0x38, 0x7f, 0x20, 0x80, 0xc2, 0x70, 0x44,
0xb5, 0x57, 0xca, 0x37, 0xcb, 0x30, 0x0a, 0xa2, 0x10, 0x98, 0xd5, 0x57,
0xf2, 0x99, 0x25, 0x20, 0x85, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78,
0x66, 0x2c, 0xc5, 0xae, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x78, 0x68,
0xac, 0xbd, 0x02, 0x0b, 0x42, 0x4b, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82,
0x60, 0xf0, 0xd8, 0x18, 0x7c, 0x05, 0x16, 0x90, 0x96, 0x7c, 0x2c, 0x30,
0x2d, 0xf8, 0xcc, 0x12, 0x90, 0xc2, 0x40, 0xc5, 0xe0, 0x88, 0x82, 0x30,
0x0a, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x10, 0xe5, 0x98, 0x7c, 0x4d,
0x7d, 0x35, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x91, 0x8e, 0xcd, 0xd7,
0xe2, 0x57, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x10, 0xed, 0x18, 0x7d,
0x0d, 0x7f, 0x35, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x11, 0x8f, 0xe1,
0xd7, 0xe0, 0x57, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x10, 0xf5, 0x58,
0x7e, 0x0d, 0x7f, 0x35, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x91, 0x8f,
0xe9, 0xd7, 0x00, 0x5a, 0xb3, 0x04, 0xa6, 0x60, 0xfe, 0x60, 0x0b, 0xf2,
0x31, 0x7f, 0xb8, 0x05, 0xf9, 0x98, 0x3f, 0xe0, 0x82, 0x7c, 0x66, 0x09,
0x4c, 0x61, 0xa0, 0x66, 0xd0, 0x0b, 0x36, 0x30, 0x4a, 0x41, 0x1d, 0xf0,
0x00, 0x2e, 0xdc, 0x80, 0x21, 0x05, 0x59, 0xd0, 0x83, 0x81, 0x9a, 0x41,
0x2f, 0xd8, 0xc0, 0x28, 0x05, 0x75, 0xc0, 0x03, 0xb8, 0x70, 0x03, 0x86,
0x14, 0x64, 0x41, 0x0f, 0x06, 0x6a, 0x06, 0xbd, 0x60, 0x03, 0xa3, 0x14,
0xd4, 0x01, 0x0f, 0xe0, 0xc2, 0x0d, 0x18, 0x52, 0x90, 0x05, 0x3d, 0xb0,
0xa1, 0xaf, 0xe4, 0x63, 0x43, 0x5f, 0xc9, 0xc7, 0x86, 0xbe, 0x92, 0x8f,
0xad, 0x47, 0x5f, 0xc9, 0x67, 0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x10,
0x36, 0x53, 0x31, 0x31, 0x13, 0x33, 0x1d, 0x23, 0x46, 0x0c, 0x12, 0x00,
0x04, 0xc1, 0x00, 0x61, 0x33, 0x15, 0x13, 0x33, 0x31, 0x8b, 0xb1, 0x61,
0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x10, 0x36, 0x53, 0x31, 0x31, 0x13,
0xb3, 0x1c, 0x13, 0x46, 0x0c, 0x12, 0x00, 0x04, 0xc1, 0x00, 0x61, 0x33,
0x15, 0x13, 0x33, 0x31, 0x83, 0xb1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int texture_advanced_frag_dxil_len = 9504;
static const unsigned int texture_advanced_frag_dxil_len = 10992;

View File

@@ -43,10 +43,12 @@ static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_RGBA = 3;
static const float TEXTURETYPE_RGBA_PIXELART = 4;
static const float TEXTURETYPE_PALETTE = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
static const float TEXTURETYPE_PALETTE_NEAREST = 5;
static const float TEXTURETYPE_PALETTE_LINEAR = 6;
static const float TEXTURETYPE_PALETTE_PIXELART = 7;
static const float TEXTURETYPE_NV12 = 8;
static const float TEXTURETYPE_NV21 = 9;
static const float TEXTURETYPE_YUV = 10;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -122,21 +124,48 @@ float3 ApplyTonemap(float3 v)
return v;
}
float2 GetPixelArtUV(PSInput input)
float4 SamplePaletteNearest(float2 uv)
{
float index = texture0.Sample(sampler0, uv).r * 255;
return texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(float2 uv)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = frac(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(uv_min_max.xy);
float4 texelB = SamplePaletteNearest(uv_min_max.xw);
float4 texelC = SamplePaletteNearest(uv_min_max.zy);
float4 texelD = SamplePaletteNearest(uv_min_max.zw);
// bilinear interpolation
return lerp(lerp(texelA, texelB, uv_frac.y), lerp(texelC, texelD, uv_frac.y), uv_frac.x);
}
float2 GetPixelArtUV(float2 uv)
{
// box filter size in texel units
float2 boxSize = clamp(fwidth(input.v_uv) * texel_size.zw, 1e-5, 1);
float2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1);
// scale uv by texture size to get texel coordinate
float2 tx = input.v_uv * texel_size.zw - 0.5 * boxSize;
float2 tx = uv * texel_size.zw - 0.5 * boxSize;
// compute offset for pixel-sized box filter
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
// compute bilinear sample uv coordinates
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
return uv;
return (floor(tx) + 0.5 + txOffset) * texel_size.xy;
}
float4 GetInputColor(PSInput input)
@@ -148,16 +177,20 @@ float4 GetInputColor(PSInput input)
} else if (texture_type == TEXTURETYPE_RGBA) {
rgba = texture0.Sample(sampler0, input.v_uv);
} else if (texture_type == TEXTURETYPE_RGBA_PIXELART) {
float2 uv = GetPixelArtUV(input);
float2 uv = GetPixelArtUV(input.v_uv);
rgba = texture0.SampleGrad(sampler0, uv, ddx(input.v_uv), ddy(input.v_uv));
} else if (texture_type == TEXTURETYPE_RGB) {
rgba = float4(texture0.Sample(sampler0, input.v_uv).rgb, 1.0);
} else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
float2 uv = GetPixelArtUV(input);
float2 uv = GetPixelArtUV(input.v_uv);
rgba = float4(texture0.SampleGrad(sampler0, uv, ddx(input.v_uv), ddy(input.v_uv)).rgb, 1.0);
} else if (texture_type == TEXTURETYPE_PALETTE) {
float index = texture0.Sample(sampler0, input.v_uv).r * 255;
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
} else if (texture_type == TEXTURETYPE_PALETTE_NEAREST) {
rgba = SamplePaletteNearest(input.v_uv);
} else if (texture_type == TEXTURETYPE_PALETTE_LINEAR) {
rgba = SamplePaletteLinear(input.v_uv);
} else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
float2 uv = GetPixelArtUV(input.v_uv);
rgba = SamplePaletteLinear(uv);
} else if (texture_type == TEXTURETYPE_NV12) {
float3 yuv;
yuv.x = texture0.Sample(sampler0, input.v_uv).r;
@@ -193,7 +226,7 @@ float4 GetInputColor(PSInput input)
// Error!
rgba.r = 1.0;
rgba.g = 0.0;
rgba.b = 0.0;
rgba.b = 1.0;
rgba.a = 1.0;
}
return rgba;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1333,10 +1333,12 @@ static const float TONEMAP_CHROME = 2;
//static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_NV12 = 4;
static const float TEXTURETYPE_NV21 = 5;
static const float TEXTURETYPE_YUV = 6;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float TEXTURETYPE_NV12 = 6;
static const float TEXTURETYPE_NV21 = 7;
static const float TEXTURETYPE_YUV = 8;
//static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -1393,7 +1395,20 @@ static void SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand
if (texture) {
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX8:
constants->texture_type = TEXTURETYPE_PALETTE;
switch (cmd->data.draw.texture_scale_mode) {
case SDL_SCALEMODE_NEAREST:
constants->texture_type = TEXTURETYPE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
constants->texture_type = TEXTURETYPE_PALETTE_LINEAR;
break;
case SDL_SCALEMODE_PIXELART:
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
break;
default:
SDL_assert(!"Unknown scale mode");
break;
}
break;
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
@@ -1411,10 +1426,6 @@ static void SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand
default:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
constants->texture_type = TEXTURETYPE_RGB_PIXELART;
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
} else {
constants->texture_type = TEXTURETYPE_RGB;
}
@@ -1432,6 +1443,15 @@ static void SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand
break;
}
if (constants->texture_type == TEXTURETYPE_PALETTE_LINEAR ||
constants->texture_type == TEXTURETYPE_PALETTE_PIXELART ||
constants->texture_type == TEXTURETYPE_RGB_PIXELART) {
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
}
constants->sdr_white_point = texture->SDR_white_point;
if (renderer->target) {
@@ -1539,7 +1559,7 @@ static bool SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
return true;
}
static id<MTLSamplerState> GetSampler(SDL3METAL_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
static id<MTLSamplerState> GetSampler(SDL3METAL_RenderData *data, SDL_PixelFormat format, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
{
NSNumber *key = [NSNumber numberWithInteger:RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v)];
id<MTLSamplerState> mtlsampler = data.mtlsamplers[key];
@@ -1553,8 +1573,14 @@ static id<MTLSamplerState> GetSampler(SDL3METAL_RenderData *data, SDL_ScaleMode
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
samplerdesc.minFilter = MTLSamplerMinMagFilterNearest;
samplerdesc.magFilter = MTLSamplerMinMagFilterNearest;
} else {
samplerdesc.minFilter = MTLSamplerMinMagFilterLinear;
samplerdesc.magFilter = MTLSamplerMinMagFilterLinear;
}
break;
default:
SDL_SetError("Unknown scale mode: %d", scale_mode);
@@ -1624,7 +1650,7 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
if (cmd->data.draw.texture_scale_mode != statecache->texture_scale_mode ||
cmd->data.draw.texture_address_mode_u != statecache->texture_address_mode_u ||
cmd->data.draw.texture_address_mode_v != statecache->texture_address_mode_v) {
id<MTLSamplerState> mtlsampler = GetSampler(data, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
id<MTLSamplerState> mtlsampler = GetSampler(data, texture->format, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
if (mtlsampler == nil) {
return false;
}
@@ -1636,7 +1662,7 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
}
if (texture->palette) {
if (!statecache->texture_palette) {
id<MTLSamplerState> mtlsampler = GetSampler(data, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
id<MTLSamplerState> mtlsampler = GetSampler(data, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
if (mtlsampler == nil) {
return false;
}

View File

@@ -13,10 +13,12 @@ using namespace metal;
#define TEXTURETYPE_NONE 0
#define TEXTURETYPE_RGB 1
#define TEXTURETYPE_RGB_PIXELART 2
#define TEXTURETYPE_PALETTE 3
#define TEXTURETYPE_NV12 4
#define TEXTURETYPE_NV21 5
#define TEXTURETYPE_YUV 6
#define TEXTURETYPE_PALETTE_NEAREST 3
#define TEXTURETYPE_PALETTE_LINEAR 4
#define TEXTURETYPE_PALETTE_PIXELART 5
#define TEXTURETYPE_NV12 6
#define TEXTURETYPE_NV21 7
#define TEXTURETYPE_YUV 8
#define INPUTTYPE_UNSPECIFIED 0
#define INPUTTYPE_SRGB 1
@@ -111,13 +113,42 @@ float3 ApplyTonemap(float3 v, float input_type, float tonemap_method, float tone
return v;
}
float2 GetPixelArtUV(float2 texcoord, float4 texel_size)
float4 SamplePaletteNearest(texture2d<float> tex0, texture2d<float> tex1, sampler s0, sampler s1, float2 uv)
{
float index = tex0.sample(s0, uv).r * 255;
return tex1.sample(s1, float2((index + 0.5) / 256, 0.5));
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(texture2d<float> tex0, texture2d<float> tex1, sampler s0, sampler s1, float2 uv, float4 texel_size)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = fract(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(tex0, tex1, s0, s1, uv_min_max.xy);
float4 texelB = SamplePaletteNearest(tex0, tex1, s0, s1, uv_min_max.xw);
float4 texelC = SamplePaletteNearest(tex0, tex1, s0, s1, uv_min_max.zy);
float4 texelD = SamplePaletteNearest(tex0, tex1, s0, s1, uv_min_max.zw);
// bilinear interpolation
return mix(mix(texelA, texelB, uv_frac.y), mix(texelC, texelD, uv_frac.y), uv_frac.x);
}
float2 GetPixelArtUV(float2 uv, float4 texel_size)
{
// box filter size in texel units
float2 boxSize = clamp(fwidth(texcoord) * texel_size.zw, 1e-5, 1);
float2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1);
// scale uv by texture size to get texel coordinate
float2 tx = texcoord * texel_size.zw - 0.5 * boxSize;
float2 tx = uv * texel_size.zw - 0.5 * boxSize;
// compute offset for pixel-sized box filter
float2 txOffset = smoothstep(1 - boxSize, 1, fract(tx));
@@ -269,9 +300,13 @@ fragment float4 SDL_Palette_fragment(CopyVertexOutput vert [[stage_in]],
{
float4 rgba;
if (c.texture_type == TEXTURETYPE_PALETTE) {
float index = tex0.sample(s0, vert.texcoord).r * 255;
rgba = tex1.sample(s1, float2((index + 0.5) / 256, 0.5));
if (c.texture_type == TEXTURETYPE_PALETTE_NEAREST) {
rgba = SamplePaletteNearest(tex0, tex1, s0, s1, vert.texcoord);
} else if (c.texture_type == TEXTURETYPE_PALETTE_LINEAR) {
rgba = SamplePaletteLinear(tex0, tex1, s0, s1, vert.texcoord, c.texel_size);
} else if (c.texture_type == TEXTURETYPE_PALETTE_PIXELART) {
float2 uv = GetPixelArtUV(vert.texcoord, c.texel_size);
rgba = SamplePaletteLinear(tex0, tex1, s0, s1, uv, c.texel_size);
} else {
// Unexpected texture type, use magenta error color
rgba = float4(1.0, 0.0, 1.0, 1.0);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -448,7 +448,7 @@ static bool convert_format(Uint32 pixel_format, GLint *internalFormat, GLenum *f
return true;
}
static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_PixelFormat format, SDL_ScaleMode scaleMode)
{
switch (scaleMode) {
case SDL_SCALEMODE_NEAREST:
@@ -457,8 +457,14 @@ static bool SetTextureScaleMode(GL_RenderData *data, GLenum textype, SDL_ScaleMo
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
} else {
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
break;
default:
return SDL_SetError("Unknown texture scale mode: %d", scaleMode);
@@ -503,7 +509,7 @@ static bool GL_CreatePalette(SDL_Renderer *renderer, SDL_TexturePalette *palette
if (!GL_CheckError("glTexImage2D()", renderer)) {
return false;
}
SetTextureScaleMode(data, textype, SDL_SCALEMODE_NEAREST);
SetTextureScaleMode(data, textype, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST);
SetTextureAddressMode(data, textype, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
return true;
}
@@ -638,7 +644,7 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
data->texture_address_mode_v = SDL_TEXTURE_ADDRESS_CLAMP;
renderdata->glEnable(textype);
renderdata->glBindTexture(textype, data->texture);
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
SetTextureScaleMode(renderdata, format, textype, data->texture_scale_mode);
SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
#ifdef SDL_PLATFORM_MACOS
#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
@@ -674,7 +680,7 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
if (!GL_CheckError("glTexImage2D()", renderer)) {
return false;
}
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
SetTextureScaleMode(renderdata, textype, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
#ifdef SDL_HAVE_YUV
@@ -698,14 +704,14 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
renderdata->glBindTexture(textype, data->utexture);
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
(texture_h + 1) / 2, 0, format, type, NULL);
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
SetTextureScaleMode(renderdata, textype, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER, data->utexture);
renderdata->glBindTexture(textype, data->vtexture);
renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
(texture_h + 1) / 2, 0, format, type, NULL);
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
SetTextureScaleMode(renderdata, textype, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER, data->vtexture);
}
@@ -723,24 +729,24 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
renderdata->glBindTexture(textype, data->utexture);
renderdata->glTexImage2D(textype, 0, GL_LUMINANCE_ALPHA, (texture_w + 1) / 2,
(texture_h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
SetTextureScaleMode(renderdata, textype, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER, data->utexture);
}
#endif
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
data->shader = SHADER_PALETTE;
data->shader = SHADER_PALETTE_NEAREST;
} else if (texture->format == SDL_PIXELFORMAT_ABGR8888 || texture->format == SDL_PIXELFORMAT_ARGB8888) {
data->shader = SHADER_RGBA;
} else {
data->shader = SHADER_RGB;
}
data->texel_size[0] = 1.0f / texture->w;
data->texel_size[1] = 1.0f / texture->h;
data->texel_size[2] = texture->w;
data->texel_size[3] = texture->h;
data->texel_size[0] = 1.0f / data->texel_size[2];
data->texel_size[1] = 1.0f / data->texel_size[3];
#ifdef SDL_HAVE_YUV
if (data->yuv || data->nv12) {
@@ -1199,20 +1205,31 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
GL_Shader shader = texturedata->shader;
const float *shader_params = texturedata->shader_params;
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
switch (shader) {
case SHADER_PALETTE_NEAREST:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_LINEAR) {
shader = SHADER_PALETTE_LINEAR;
shader_params = texturedata->texel_size;
} else if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
shader = SHADER_PALETTE_PIXELART;
shader_params = texturedata->texel_size;
}
break;
case SHADER_RGB:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
shader = SHADER_RGB_PIXELART;
shader_params = texturedata->texel_size;
}
break;
case SHADER_RGBA:
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
shader = SHADER_RGBA_PIXELART;
shader_params = texturedata->texel_size;
}
break;
default:
break;
}
}
SetDrawState(data, cmd, shader, shader_params);
if (texture != data->drawstate.texture) {
@@ -1246,19 +1263,19 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
#ifdef SDL_HAVE_YUV
if (texturedata->yuv) {
data->glActiveTextureARB(GL_TEXTURE2);
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, textype, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
data->glActiveTextureARB(GL_TEXTURE1);
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, textype, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
data->glActiveTextureARB(GL_TEXTURE0);
} else if (texturedata->nv12) {
data->glActiveTextureARB(GL_TEXTURE1);
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, textype, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
@@ -1267,13 +1284,13 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
#endif
if (texture->palette) {
data->glActiveTextureARB(GL_TEXTURE1);
if (!SetTextureScaleMode(data, textype, SDL_SCALEMODE_NEAREST)) {
if (!SetTextureScaleMode(data, textype, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST)) {
return false;
}
data->glActiveTextureARB(GL_TEXTURE0);
}
if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, textype, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}

View File

@@ -84,6 +84,73 @@ struct GL_ShaderContext
" v_texCoord = vec2(gl_MultiTexCoord0);\n" \
"}" \
#define RGB_SHADER_PROLOGUE \
"varying vec4 v_color;\n" \
"varying vec2 v_texCoord;\n" \
"uniform sampler2D tex0;\n" \
"\n"
#define RGB_PIXELART_SHADER_PROLOGUE \
"varying vec4 v_color;\n" \
"varying vec2 v_texCoord;\n" \
"uniform sampler2D tex0;\n" \
"uniform vec4 texel_size; // texel size (xy: texel size, zw: texture dimensions)\n" \
"\n"
#define PALETTE_SHADER_PROLOGUE \
"varying vec4 v_color;\n" \
"varying vec2 v_texCoord;\n" \
"uniform sampler2D tex0;\n" \
"uniform sampler2D tex1;\n" \
"uniform vec4 texel_size; // texel size (xy: texel size, zw: texture dimensions)\n" \
"\n"
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
#define PALETTE_SHADER_FUNCTIONS \
"vec4 SamplePaletteNearest(vec2 uv)\n" \
"{\n" \
" float index = texture2D(tex0, uv).r * 255.0;\n" \
" return texture2D(tex1, vec2((index + 0.5) / 256.0, 0.5));\n" \
"}\n" \
"\n" \
"vec4 SamplePaletteLinear(vec2 uv)\n" \
"{\n" \
" // scale & offset uvs to integer values at texel centers\n" \
" vec2 uv_texels = uv * texel_size.zw + 0.5;\n" \
"\n" \
" // get uvs for the center of the 4 surrounding texels by flooring\n" \
" vec4 uv_min_max = vec4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);\n" \
"\n" \
" // blend factor\n" \
" vec2 uv_frac = fract(uv_texels);\n" \
"\n" \
" // sample all 4 texels\n" \
" vec4 texelA = SamplePaletteNearest(uv_min_max.xy);\n" \
" vec4 texelB = SamplePaletteNearest(uv_min_max.xw);\n" \
" vec4 texelC = SamplePaletteNearest(uv_min_max.zy);\n" \
" vec4 texelD = SamplePaletteNearest(uv_min_max.zw);\n" \
"\n" \
" // bilinear interpolation\n" \
" return mix(mix(texelA, texelB, uv_frac.y), mix(texelC, texelD, uv_frac.y), uv_frac.x);\n" \
"}\n" \
"\n"
#define PIXELART_SHADER_FUNCTIONS \
"vec2 GetPixelArtUV(vec2 uv)\n" \
"{\n" \
" vec2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1.0);\n" \
" vec2 tx = uv * texel_size.zw - 0.5 * boxSize;\n" \
" vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n" \
" return (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n" \
"}\n" \
"\n" \
"vec4 GetPixelArtSample(vec2 uv)\n" \
"{\n" \
" return textureGrad(tex0, GetPixelArtUV(uv), dFdx(v_texCoord), dFdy(v_texCoord));\n" \
"}\n" \
"\n" \
#define YUV_SHADER_PROLOGUE \
"varying vec4 v_color;\n" \
"varying vec2 v_texCoord;\n" \
@@ -260,21 +327,50 @@ static struct {
NULL
},
// SHADER_PALETTE
// SHADER_PALETTE_NEAREST
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
"varying vec4 v_color;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex0;\n"
"uniform sampler2D tex1;\n"
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" float index = texture2D(tex0, v_texCoord).r * 255.0;\n"
" gl_FragColor = texture2D(tex1, vec2((index + 0.5) / 256.0, 0.5));\n"
" gl_FragColor *= v_color;\n"
" gl_FragColor = SamplePaletteNearest(v_texCoord) * v_color;\n"
"}",
// fragment version
NULL
},
// SHADER_PALETTE_LINEAR
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" gl_FragColor = SamplePaletteLinear(v_texCoord) * v_color;\n"
"}",
// fragment version
NULL
},
// SHADER_PALETTE_PIXELART
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" gl_FragColor = SamplePaletteLinear(GetPixelArtUV(v_texCoord)) * v_color;\n"
"}",
// fragment version
"#version 130\n"
@@ -285,10 +381,7 @@ static struct {
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
"varying vec4 v_color;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex0;\n"
"uniform vec4 texel_size; // texel size (xy: texel size, zw: texture dimensions)\n"
RGB_SHADER_PROLOGUE
"\n"
"void main()\n"
"{\n"
@@ -300,14 +393,30 @@ static struct {
NULL
},
// SHADER_RGB_PIXELART
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" gl_FragColor = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}",
// fragment version
"#version 130\n"
},
// SHADER_RGBA
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
"varying vec4 v_color;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex0;\n"
RGB_SHADER_PROLOGUE
"\n"
"void main()\n"
"{\n"
@@ -317,47 +426,17 @@ static struct {
NULL
},
// SHADER_RGB_PIXELART
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
"varying vec4 v_color;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex0;\n"
"uniform vec4 texel_size;\n"
"\n"
"void main()\n"
"{\n"
" vec2 boxSize = clamp(fwidth(v_texCoord) * texel_size.zw, 1e-5, 1.0);\n"
" vec2 tx = v_texCoord * texel_size.zw - 0.5 * boxSize;\n"
" vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n"
" vec2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n"
" gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}",
// fragment version
"#version 130\n"
},
// SHADER_RGBA_PIXELART
{
// vertex shader
TEXTURE_VERTEX_SHADER,
// fragment shader
"varying vec4 v_color;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex0;\n"
"uniform vec4 texel_size;\n"
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" vec2 boxSize = clamp(fwidth(v_texCoord) * texel_size.zw, 1e-5, 1.0);\n"
" vec2 tx = v_texCoord * texel_size.zw - 0.5 * boxSize;\n"
" vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n"
" vec2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n"
" gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
" gl_FragColor = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor *= v_color;\n"
"}",
// fragment version
@@ -607,7 +686,9 @@ void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shade
ctx->glUseProgramObjectARB(program);
if (shader_params && shader_params != ctx->shader_params[shader]) {
if (shader == SHADER_RGB_PIXELART ||
if (shader == SHADER_PALETTE_LINEAR ||
shader == SHADER_PALETTE_PIXELART ||
shader == SHADER_RGB_PIXELART ||
shader == SHADER_RGBA_PIXELART) {
location = ctx->glGetUniformLocationARB(program, "texel_size");
if (location >= 0) {

View File

@@ -31,10 +31,12 @@ typedef enum
SHADER_INVALID = -1,
SHADER_NONE,
SHADER_SOLID,
SHADER_PALETTE,
SHADER_PALETTE_NEAREST,
SHADER_PALETTE_LINEAR,
SHADER_PALETTE_PIXELART,
SHADER_RGB,
SHADER_RGBA,
SHADER_RGB_PIXELART,
SHADER_RGBA,
SHADER_RGBA_PIXELART,
#ifdef SDL_HAVE_YUV
SHADER_YUV,

View File

@@ -521,7 +521,7 @@ static bool GLES2_CacheShader(GLES2_RenderData *data, GLES2_ShaderType type, GLe
GLuint id = 0;
GLint compileSuccessful = GL_FALSE;
int attempt, num_src;
const GLchar *shader_src_list[3];
const GLchar *shader_src_list[4];
const GLchar *shader_body = GLES2_GetShader(type);
if (!shader_body) {
@@ -531,6 +531,9 @@ static bool GLES2_CacheShader(GLES2_RenderData *data, GLES2_ShaderType type, GLe
for (attempt = 0; attempt < 2 && !compileSuccessful; ++attempt) {
num_src = 0;
#ifdef OPENGLES_300
shader_src_list[num_src++] = "#version 300 es\n";
#endif
shader_src_list[num_src++] = GLES2_GetShaderPrologue(type);
if (shader_type == GL_FRAGMENT_SHADER) {
@@ -634,7 +637,22 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
ftype = GLES2_SHADER_FRAGMENT_SOLID;
break;
case GLES2_IMAGESOURCE_TEXTURE_INDEX8:
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE;
switch (scale_mode) {
case SDL_SCALEMODE_NEAREST:
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR;
shader_params = tdata->texel_size;
break;
case SDL_SCALEMODE_PIXELART:
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART;
shader_params = tdata->texel_size;
break;
default:
SDL_assert(!"Unknown scale mode");
goto fault;
}
break;
case GLES2_IMAGESOURCE_TEXTURE_ABGR:
if (scale_mode == SDL_SCALEMODE_PIXELART) {
@@ -706,6 +724,7 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
ftype = GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES;
break;
default:
SDL_assert(!"Unknown image source");
goto fault;
}
@@ -767,7 +786,7 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
}
else
#endif
if (ftype >= GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART) {
if (shader_params) {
data->glUniform4f(program->uniform_locations[GLES2_UNIFORM_TEXEL_SIZE], shader_params[0], shader_params[1], shader_params[2], shader_params[3]);
}
program->shader_params = shader_params;
@@ -1081,7 +1100,7 @@ static bool SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, c
return true;
}
static bool SetTextureScaleMode(GLES2_RenderData *data, GLenum textype, SDL_ScaleMode scaleMode)
static bool SetTextureScaleMode(GLES2_RenderData *data, GLenum textype, SDL_PixelFormat format, SDL_ScaleMode scaleMode)
{
switch (scaleMode) {
case SDL_SCALEMODE_NEAREST:
@@ -1089,14 +1108,26 @@ static bool SetTextureScaleMode(GLES2_RenderData *data, GLenum textype, SDL_Scal
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
break;
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
} else {
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
break;
case SDL_SCALEMODE_PIXELART:
#ifdef OPENGLES_300 // Required for the pixel art shader
#ifdef OPENGLES_300
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
} else {
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
#else
}
#else // We don't have the functions we need, fall back to nearest sampling
data->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
data->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
#endif
@@ -1291,19 +1322,19 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
#ifdef SDL_HAVE_YUV
if (tdata->yuv) {
data->glActiveTexture(GL_TEXTURE2);
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, tdata->texture_type, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
data->glActiveTexture(GL_TEXTURE1);
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, tdata->texture_type, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
data->glActiveTexture(GL_TEXTURE0);
} else if (tdata->nv12) {
data->glActiveTexture(GL_TEXTURE1);
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, tdata->texture_type, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
@@ -1312,13 +1343,13 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
#endif
if (texture->palette) {
data->glActiveTexture(GL_TEXTURE1);
if (!SetTextureScaleMode(data, tdata->texture_type, SDL_SCALEMODE_NEAREST)) {
if (!SetTextureScaleMode(data, tdata->texture_type, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST)) {
return false;
}
data->glActiveTexture(GL_TEXTURE0);
}
if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
if (!SetTextureScaleMode(data, tdata->texture_type, texture->format, cmd->data.draw.texture_scale_mode)) {
return false;
}
@@ -1654,7 +1685,7 @@ static bool GLES2_CreatePalette(SDL_Renderer *renderer, SDL_TexturePalette *pale
if (!GL_CheckError("glTexImage2D()", renderer)) {
return false;
}
SetTextureScaleMode(data, GL_TEXTURE_2D, SDL_SCALEMODE_NEAREST);
SetTextureScaleMode(data, GL_TEXTURE_2D, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST);
SetTextureAddressMode(data, GL_TEXTURE_2D, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
return true;
}
@@ -1778,10 +1809,10 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
// Allocate the texture
GL_CheckError("", renderer);
data->texel_size[0] = 1.0f / texture->w;
data->texel_size[1] = 1.0f / texture->h;
data->texel_size[2] = texture->w;
data->texel_size[3] = texture->h;
data->texel_size[0] = 1.0f / data->texel_size[2];
data->texel_size[1] = 1.0f / data->texel_size[3];
#ifdef SDL_HAVE_YUV
if (data->yuv) {
@@ -1804,7 +1835,7 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
SDL_free(data);
return false;
}
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
SetTextureScaleMode(renderdata, data->texture_type, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER, data->texture_v);
@@ -1827,7 +1858,7 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
SDL_free(data);
return false;
}
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
SetTextureScaleMode(renderdata, data->texture_type, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
@@ -1856,7 +1887,7 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
SDL_free(data);
return false;
}
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
SetTextureScaleMode(renderdata, data->texture_type, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
@@ -1888,7 +1919,7 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
return false;
}
}
SetTextureScaleMode(renderdata, data->texture_type, data->texture_scale_mode);
SetTextureScaleMode(renderdata, data->texture_type, texture->format, data->texture_scale_mode);
SetTextureAddressMode(renderdata, data->texture_type, data->texture_address_mode_u, data->texture_address_mode_v);
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, data->texture);
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER, data->texture_type);

View File

@@ -88,12 +88,6 @@ static const char GLES2_Fragment_Solid[] =
"}\n"
;
#define PALETTE_SHADER_PROLOGUE \
"uniform sampler2D u_texture;\n" \
"uniform sampler2D u_palette;\n" \
"varying mediump vec4 v_color;\n" \
"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
#define RGB_SHADER_PROLOGUE \
"uniform sampler2D u_texture;\n" \
"varying mediump vec4 v_color;\n" \
@@ -105,52 +99,102 @@ static const char GLES2_Fragment_Solid[] =
"varying mediump vec4 v_color;\n" \
"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
#define PALETTE_SHADER_PROLOGUE \
"uniform sampler2D u_texture;\n" \
"uniform sampler2D u_palette;\n" \
"uniform mediump vec4 u_texel_size;\n" \
"varying mediump vec4 v_color;\n" \
"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
#define PALETTE_SHADER_FUNCTIONS \
"mediump vec4 SamplePaletteNearest(SDL_TEXCOORD_PRECISION vec2 uv)\n" \
"{\n" \
" mediump float index = texture2D(u_texture, uv).r * 255.0;\n" \
" return texture2D(u_palette, vec2((index + 0.5) / 256.0, 0.5));\n" \
"}\n" \
"\n" \
"mediump vec4 SamplePaletteLinear(SDL_TEXCOORD_PRECISION vec2 uv)\n" \
"{\n" \
" // scale & offset uvs to integer values at texel centers\n" \
" SDL_TEXCOORD_PRECISION vec2 uv_texels = uv * u_texel_size.zw + 0.5;\n" \
"\n" \
" // get uvs for the center of the 4 surrounding texels by flooring\n" \
" SDL_TEXCOORD_PRECISION vec4 uv_min_max = vec4((floor(uv_texels) - 0.5) * u_texel_size.xy, (floor(uv_texels) + 0.5) * u_texel_size.xy);\n" \
"\n" \
" // blend factor\n" \
" SDL_TEXCOORD_PRECISION vec2 uv_frac = fract(uv_texels);\n" \
"\n" \
" // sample all 4 texels\n" \
" mediump vec4 texelA = SamplePaletteNearest(uv_min_max.xy);\n" \
" mediump vec4 texelB = SamplePaletteNearest(uv_min_max.xw);\n" \
" mediump vec4 texelC = SamplePaletteNearest(uv_min_max.zy);\n" \
" mediump vec4 texelD = SamplePaletteNearest(uv_min_max.zw);\n" \
"\n" \
" // bilinear interpolation\n" \
" return mix(mix(texelA, texelB, uv_frac.y), mix(texelC, texelD, uv_frac.y), uv_frac.x);\n" \
"}\n" \
"\n"
#ifdef OPENGLES_300 // This is required for fwidth() and textureGrad()
#define RGB_PIXELART_GETCOLOR \
" mediump vec2 boxSize = clamp(fwidth(v_texCoord) * u_texel_size.zw, 1e-5, 1.0);\n" \
" mediump vec2 tx = v_texCoord * u_texel_size.zw - 0.5 * boxSize;\n" \
" mediump vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n" \
" mediump vec2 uv = (floor(tx) + 0.5 + txOffset) * u_texel_size.xy;\n" \
" mediump vec4 color = textureGrad(u_texture, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
#define PIXELART_SHADER_FUNCTIONS \
"SDL_TEXCOORD_PRECISION vec2 GetPixelArtUV(SDL_TEXCOORD_PRECISION vec2 uv)\n" \
"{\n" \
" SDL_TEXCOORD_PRECISION vec2 boxSize = clamp(fwidth(uv) * u_texel_size.zw, 1e-5, 1.0);\n" \
" SDL_TEXCOORD_PRECISION vec2 tx = uv * u_texel_size.zw - 0.5 * boxSize;\n" \
" SDL_TEXCOORD_PRECISION vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n" \
" return (floor(tx) + 0.5 + txOffset) * u_texel_size.xy;\n" \
"}\n" \
"\n" \
"mediump vec4 GetPixelArtSample(vec2 uv)\n" \
"{\n" \
" return textureGrad(u_texture, GetPixelArtUV(uv), dFdx(v_texCoord), dFdy(v_texCoord));\n" \
"}\n" \
"\n"
#else
#define RGB_PIXELART_GETCOLOR \
" mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
#define PIXELART_SHADER_FUNCTIONS \
"mediump vec4 GetPixelArtSample(vec2 uv)\n" \
"{\n" \
" return texture2D(u_texture, uv);\n" \
"}\n" \
"\n"
#endif
static const char GLES2_Fragment_TexturePalette[] =
static const char GLES2_Fragment_TexturePalette_Nearest[] =
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" mediump float index = texture2D(u_texture, v_texCoord).r * 255.0;\n"
" SDL_TEXCOORD_PRECISION vec2 paletteCoords = vec2((index + 0.5) / 256.0, 0.5);\n"
" mediump vec4 color = texture2D(u_palette, paletteCoords);\n"
" gl_FragColor = color;\n"
" gl_FragColor = SamplePaletteNearest(v_texCoord);\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
static const char GLES2_Fragment_TextureABGR[] =
RGB_SHADER_PROLOGUE
static const char GLES2_Fragment_TexturePalette_Linear[] =
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor = SamplePaletteLinear(v_texCoord);\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
// ARGB to ABGR conversion
static const char GLES2_Fragment_TextureARGB[] =
RGB_SHADER_PROLOGUE
static const char GLES2_Fragment_TexturePalette_PixelArt[] =
PALETTE_SHADER_PROLOGUE
PALETTE_SHADER_FUNCTIONS
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.r = color.b;\n"
" gl_FragColor.b = color.r;\n"
#ifdef OPENGLES_300
" gl_FragColor = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n"
#else
" gl_FragColor = SamplePaletteNearest(v_texCoord);\n"
#endif
" gl_FragColor *= v_color;\n"
"}\n"
;
@@ -170,6 +214,22 @@ static const char GLES2_Fragment_TextureRGB[] =
"}\n"
;
// RGB to ABGR conversion
static const char GLES2_Fragment_TextureRGB_PixelArt[] =
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
" mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.r = color.b;\n"
" gl_FragColor.b = color.r;\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
// BGR to ABGR conversion
static const char GLES2_Fragment_TextureBGR[] =
RGB_SHADER_PROLOGUE
@@ -183,13 +243,30 @@ static const char GLES2_Fragment_TextureBGR[] =
"}\n"
;
static const char GLES2_Fragment_TextureABGR_PixelArt[] =
// BGR to ABGR conversion
static const char GLES2_Fragment_TextureBGR_PixelArt[] =
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
RGB_PIXELART_GETCOLOR
" mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
// ARGB to ABGR conversion
static const char GLES2_Fragment_TextureARGB[] =
RGB_SHADER_PROLOGUE
"\n"
"void main()\n"
"{\n"
" mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.r = color.b;\n"
" gl_FragColor.b = color.r;\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
@@ -197,10 +274,11 @@ static const char GLES2_Fragment_TextureABGR_PixelArt[] =
// ARGB to ABGR conversion
static const char GLES2_Fragment_TextureARGB_PixelArt[] =
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
RGB_PIXELART_GETCOLOR
" mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.r = color.b;\n"
" gl_FragColor.b = color.r;\n"
@@ -208,30 +286,25 @@ static const char GLES2_Fragment_TextureARGB_PixelArt[] =
"}\n"
;
// RGB to ABGR conversion
static const char GLES2_Fragment_TextureRGB_PixelArt[] =
RGB_PIXELART_SHADER_PROLOGUE
static const char GLES2_Fragment_TextureABGR[] =
RGB_SHADER_PROLOGUE
"\n"
"void main()\n"
"{\n"
RGB_PIXELART_GETCOLOR
" mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.r = color.b;\n"
" gl_FragColor.b = color.r;\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
// BGR to ABGR conversion
static const char GLES2_Fragment_TextureBGR_PixelArt[] =
static const char GLES2_Fragment_TextureABGR_PixelArt[] =
RGB_PIXELART_SHADER_PROLOGUE
PIXELART_SHADER_FUNCTIONS
"\n"
"void main()\n"
"{\n"
RGB_PIXELART_GETCOLOR
" mediump vec4 color = GetPixelArtSample(v_texCoord);\n"
" gl_FragColor = color;\n"
" gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n"
"}\n"
;
@@ -445,24 +518,28 @@ const char *GLES2_GetShader(GLES2_ShaderType type)
return GLES2_Vertex_Default;
case GLES2_SHADER_FRAGMENT_SOLID:
return GLES2_Fragment_Solid;
case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE:
return GLES2_Fragment_TexturePalette;
case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR:
return GLES2_Fragment_TextureABGR;
case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB:
return GLES2_Fragment_TextureARGB;
case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST:
return GLES2_Fragment_TexturePalette_Nearest;
case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR:
return GLES2_Fragment_TexturePalette_Linear;
case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART:
return GLES2_Fragment_TexturePalette_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_RGB:
return GLES2_Fragment_TextureRGB;
case GLES2_SHADER_FRAGMENT_TEXTURE_BGR:
return GLES2_Fragment_TextureBGR;
case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART:
return GLES2_Fragment_TextureABGR_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART:
return GLES2_Fragment_TextureARGB_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART:
return GLES2_Fragment_TextureRGB_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_BGR:
return GLES2_Fragment_TextureBGR;
case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_PIXELART:
return GLES2_Fragment_TextureBGR_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB:
return GLES2_Fragment_TextureARGB;
case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART:
return GLES2_Fragment_TextureARGB_PixelArt;
case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR:
return GLES2_Fragment_TextureABGR;
case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART:
return GLES2_Fragment_TextureABGR_PixelArt;
#ifdef SDL_HAVE_YUV
case GLES2_SHADER_FRAGMENT_TEXTURE_YUV:
return GLES2_Fragment_TextureYUV;

View File

@@ -39,15 +39,17 @@ typedef enum
{
GLES2_SHADER_VERTEX_DEFAULT = 0,
GLES2_SHADER_FRAGMENT_SOLID,
GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE,
GLES2_SHADER_FRAGMENT_TEXTURE_ABGR,
GLES2_SHADER_FRAGMENT_TEXTURE_ARGB,
GLES2_SHADER_FRAGMENT_TEXTURE_BGR,
GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST,
GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR,
GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_RGB,
GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_BGR_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_BGR,
GLES2_SHADER_FRAGMENT_TEXTURE_BGR_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_ARGB,
GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART,
GLES2_SHADER_FRAGMENT_TEXTURE_ABGR,
GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART,
#ifdef SDL_HAVE_YUV
GLES2_SHADER_FRAGMENT_TEXTURE_YUV,
GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RA,

View File

@@ -184,7 +184,9 @@ static const float TONEMAP_CHROME = 2;
//static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -3423,17 +3425,35 @@ static void VULKAN_SetupShaderConstants(SDL_Renderer *renderer, const SDL_Render
}
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
constants->texture_type = TEXTURETYPE_PALETTE;
switch (cmd->data.draw.texture_scale_mode) {
case SDL_SCALEMODE_NEAREST:
constants->texture_type = TEXTURETYPE_PALETTE_NEAREST;
break;
case SDL_SCALEMODE_LINEAR:
constants->texture_type = TEXTURETYPE_PALETTE_LINEAR;
break;
case SDL_SCALEMODE_PIXELART:
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
break;
default:
SDL_assert(!"Unknown scale mode");
break;
}
} else {
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
constants->texture_type = TEXTURETYPE_RGB_PIXELART;
} else {
constants->texture_type = TEXTURETYPE_RGB;
}
}
if (constants->texture_type == TEXTURETYPE_PALETTE_LINEAR ||
constants->texture_type == TEXTURETYPE_PALETTE_PIXELART ||
constants->texture_type == TEXTURETYPE_RGB_PIXELART) {
constants->texture_width = texture->w;
constants->texture_height = texture->h;
constants->texel_width = 1.0f / constants->texture_width;
constants->texel_height = 1.0f / constants->texture_height;
} else {
constants->texture_type = TEXTURETYPE_RGB;
}
}
constants->sdr_white_point = texture->SDR_white_point;
@@ -3802,7 +3822,7 @@ static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand
return true;
}
static VkSampler VULKAN_GetSampler(VULKAN_RenderData *data, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
static VkSampler VULKAN_GetSampler(VULKAN_RenderData *data, SDL_PixelFormat format, SDL_ScaleMode scale_mode, SDL_TextureAddressMode address_u, SDL_TextureAddressMode address_v)
{
Uint32 key = RENDER_SAMPLER_HASHKEY(scale_mode, address_u, address_v);
SDL_assert(key < SDL_arraysize(data->samplers));
@@ -3823,8 +3843,14 @@ static VkSampler VULKAN_GetSampler(VULKAN_RenderData *data, SDL_ScaleMode scale_
break;
case SDL_SCALEMODE_PIXELART: // Uses linear sampling
case SDL_SCALEMODE_LINEAR:
if (format == SDL_PIXELFORMAT_INDEX8) {
// We'll do linear sampling in the shader
samplerCreateInfo.magFilter = VK_FILTER_NEAREST;
samplerCreateInfo.minFilter = VK_FILTER_NEAREST;
} else {
samplerCreateInfo.magFilter = VK_FILTER_LINEAR;
samplerCreateInfo.minFilter = VK_FILTER_LINEAR;
}
break;
default:
SDL_SetError("Unknown scale mode: %d", scale_mode);
@@ -3899,7 +3925,7 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
}
imageViews[numImageViews++] = textureData->mainImage.imageView;
samplers[numSamplers] = VULKAN_GetSampler(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
samplers[numSamplers] = VULKAN_GetSampler(rendererData, texture->format, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
if (samplers[numSamplers] == VK_NULL_HANDLE) {
return false;
}
@@ -3930,7 +3956,7 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
}
imageViews[numImageViews++] = palette->image.imageView;
samplers[numSamplers] = VULKAN_GetSampler(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
samplers[numSamplers] = VULKAN_GetSampler(rendererData, SDL_PIXELFORMAT_UNKNOWN, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
if (samplers[numSamplers] == VK_NULL_HANDLE) {
return false;
}

View File

@@ -1,318 +1,437 @@
// 1113.1.1
#pragma once
const uint32_t VULKAN_PixelShader_Advanced[] = {
0x07230203,0x00010000,0x0008000b,0x00000510,0x00000000,0x00020011,0x00000001,0x0006000b,
0x07230203,0x00010000,0x0008000b,0x000006bb,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000221,0x00000224,0x00000228,
0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000028b,0x0000028e,0x00000292,
0x00030010,0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,
0x6e69616d,0x00000000,0x00050005,0x00000079,0x736e6f43,0x746e6174,0x00000073,0x00070006,
0x00000079,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00070006,0x00000079,
0x00000001,0x74786574,0x5f657275,0x65707974,0x00000000,0x00060006,0x00000079,0x00000002,
0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000079,0x00000003,0x6f6c6f63,0x63735f72,
0x00656c61,0x00060006,0x00000079,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,
0x00000079,0x00000005,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000079,
0x00000006,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000079,0x00000007,
0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000079,0x00000008,0x5f726473,
0x74696877,0x6f705f65,0x00746e69,0x00030005,0x0000007b,0x00000000,0x00050005,0x0000011f,
0x74786574,0x30657275,0x00000000,0x00050005,0x00000146,0x74786574,0x31657275,0x00000000,
0x00050005,0x00000221,0x75706e69,0x65742e74,0x00000078,0x00050005,0x00000224,0x75706e69,
0x6f632e74,0x00726f6c,0x00070005,0x00000228,0x746e6540,0x6f507972,0x4f746e69,0x75707475,
0x00000074,0x00050048,0x00000079,0x00000000,0x00000023,0x00000000,0x00050048,0x00000079,
0x00000001,0x00000023,0x00000004,0x00050048,0x00000079,0x00000002,0x00000023,0x00000008,
0x00050048,0x00000079,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000079,0x00000004,
0x00000023,0x00000010,0x00050048,0x00000079,0x00000005,0x00000023,0x00000020,0x00050048,
0x00000079,0x00000006,0x00000023,0x00000024,0x00050048,0x00000079,0x00000007,0x00000023,
0x00000028,0x00050048,0x00000079,0x00000008,0x00000023,0x0000002c,0x00030047,0x00000079,
0x00000002,0x00040047,0x0000007b,0x00000022,0x00000000,0x00040047,0x0000007b,0x00000021,
0x00000000,0x00040047,0x0000011f,0x00000022,0x00000000,0x00040047,0x0000011f,0x00000021,
0x00000001,0x00040047,0x00000146,0x00000022,0x00000000,0x00040047,0x00000146,0x00000021,
0x00000002,0x00040047,0x00000221,0x0000001e,0x00000000,0x00040047,0x00000224,0x0000001e,
0x00000001,0x00040047,0x00000228,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,
0x6e69616d,0x00000000,0x00050005,0x00000081,0x736e6f43,0x746e6174,0x00000073,0x00070006,
0x00000081,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00070006,0x00000081,
0x00000001,0x74786574,0x5f657275,0x65707974,0x00000000,0x00060006,0x00000081,0x00000002,
0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000081,0x00000003,0x6f6c6f63,0x63735f72,
0x00656c61,0x00060006,0x00000081,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,
0x00000081,0x00000005,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000081,
0x00000006,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000081,0x00000007,
0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000081,0x00000008,0x5f726473,
0x74696877,0x6f705f65,0x00746e69,0x00030005,0x00000083,0x00000000,0x00050005,0x000000f2,
0x74786574,0x30657275,0x00000000,0x00050005,0x000000f9,0x74786574,0x31657275,0x00000000,
0x00050005,0x0000028b,0x75706e69,0x65742e74,0x00000078,0x00050005,0x0000028e,0x75706e69,
0x6f632e74,0x00726f6c,0x00070005,0x00000292,0x746e6540,0x6f507972,0x4f746e69,0x75707475,
0x00000074,0x00050048,0x00000081,0x00000000,0x00000023,0x00000000,0x00050048,0x00000081,
0x00000001,0x00000023,0x00000004,0x00050048,0x00000081,0x00000002,0x00000023,0x00000008,
0x00050048,0x00000081,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000081,0x00000004,
0x00000023,0x00000010,0x00050048,0x00000081,0x00000005,0x00000023,0x00000020,0x00050048,
0x00000081,0x00000006,0x00000023,0x00000024,0x00050048,0x00000081,0x00000007,0x00000023,
0x00000028,0x00050048,0x00000081,0x00000008,0x00000023,0x0000002c,0x00030047,0x00000081,
0x00000002,0x00040047,0x00000083,0x00000022,0x00000000,0x00040047,0x00000083,0x00000021,
0x00000000,0x00040047,0x000000f2,0x00000022,0x00000000,0x00040047,0x000000f2,0x00000021,
0x00000001,0x00040047,0x000000f9,0x00000022,0x00000000,0x00040047,0x000000f9,0x00000021,
0x00000002,0x00040047,0x0000028b,0x0000001e,0x00000000,0x00040047,0x0000028e,0x0000001e,
0x00000001,0x00040047,0x00000292,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,
0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x0000000f,0x00000006,
0x00000003,0x00040017,0x00000018,0x00000006,0x00000004,0x00040017,0x00000019,0x00000006,
0x00000002,0x0004002b,0x00000006,0x00000036,0x3d25aee6,0x00020014,0x00000037,0x0004002b,
0x00000006,0x0000003c,0x414eb852,0x0004002b,0x00000006,0x00000040,0x3d6147ae,0x0004002b,
0x00000006,0x00000043,0x3f870a3d,0x0004002b,0x00000006,0x00000045,0x4019999a,0x0004002b,
0x00000006,0x0000004b,0x3b4d2e1c,0x0004002b,0x00000006,0x00000054,0x3ed55555,0x0004002b,
0x00000006,0x0000005e,0x3c4fcdac,0x0006002c,0x0000000f,0x0000005f,0x0000005e,0x0000005e,
0x0000005e,0x0004002b,0x00000006,0x00000061,0x3f560000,0x0004002b,0x00000006,0x00000064,
0x00000000,0x0006002c,0x0000000f,0x00000065,0x00000064,0x00000064,0x00000064,0x0004002b,
0x00000006,0x00000068,0x4196d000,0x0004002b,0x00000006,0x00000069,0x41958000,0x0004002b,
0x00000006,0x00000070,0x461c4000,0x0004002b,0x00000006,0x00000075,0x40c8e06b,0x0006002c,
0x0000000f,0x00000076,0x00000075,0x00000075,0x00000075,0x000b001e,0x00000079,0x00000006,
0x00000006,0x00000006,0x00000006,0x00000018,0x00000006,0x00000006,0x00000006,0x00000006,
0x00040020,0x0000007a,0x00000002,0x00000079,0x0004003b,0x0000007a,0x0000007b,0x00000002,
0x00040015,0x0000007c,0x00000020,0x00000001,0x0004002b,0x0000007c,0x0000007d,0x00000008,
0x00040020,0x0000007e,0x00000002,0x00000006,0x0004002b,0x0000007c,0x00000085,0x00000005,
0x0004002b,0x00000006,0x00000088,0x3f800000,0x0004002b,0x0000007c,0x0000008c,0x00000006,
0x0004002b,0x00000006,0x00000094,0x40000000,0x0004002b,0x0000007c,0x00000098,0x00000002,
0x00040018,0x0000009f,0x0000000f,0x00000003,0x0004002b,0x00000006,0x000000a0,0x3f209d8c,
0x0004002b,0x00000006,0x000000a1,0x3ea897c8,0x0004002b,0x00000006,0x000000a2,0x3d3168f9,
0x0006002c,0x0000000f,0x000000a3,0x000000a0,0x000000a1,0x000000a2,0x0004002b,0x00000006,
0x000000a4,0x3d8d82ba,0x0004002b,0x00000006,0x000000a5,0x3f6b670a,0x0004002b,0x00000006,
0x000000a6,0x3c3a27af,0x0006002c,0x0000000f,0x000000a7,0x000000a4,0x000000a5,0x000000a6,
0x0004002b,0x00000006,0x000000a8,0x3c86466b,0x0004002b,0x00000006,0x000000a9,0x3db44029,
0x0004002b,0x00000006,0x000000aa,0x3f6545b7,0x0006002c,0x0000000f,0x000000ab,0x000000a8,
0x000000a9,0x000000aa,0x0006002c,0x0000009f,0x000000ac,0x000000a3,0x000000a7,0x000000ab,
0x0004002b,0x0000007c,0x000000c5,0x00000007,0x0004002b,0x00000006,0x000000d5,0x3fd48b22,
0x0004002b,0x00000006,0x000000d6,0xbf1670a0,0x0004002b,0x00000006,0x000000d7,0xbd952d23,
0x0006002c,0x0000000f,0x000000d8,0x000000d5,0x000000d6,0x000000d7,0x0004002b,0x00000006,
0x000000d9,0xbdff127f,0x0004002b,0x00000006,0x000000da,0x3f9102b4,0x0004002b,0x00000006,
0x000000db,0xbc08c60d,0x0006002c,0x0000000f,0x000000dc,0x000000d9,0x000000da,0x000000db,
0x0004002b,0x00000006,0x000000dd,0xbc94b7b3,0x0004002b,0x00000006,0x000000de,0xbdce05cd,
0x0004002b,0x00000006,0x000000df,0x3f8f333c,0x0006002c,0x0000000f,0x000000e0,0x000000dd,
0x000000de,0x000000df,0x0006002c,0x0000009f,0x000000e1,0x000000d8,0x000000dc,0x000000e0,
0x0004002b,0x0000007c,0x000000e8,0x00000001,0x0004002b,0x0000007c,0x000000ec,0x00000004,
0x00040020,0x000000ed,0x00000002,0x00000018,0x0004002b,0x00000006,0x000000f2,0x3727c5ac,
0x0005002c,0x00000019,0x000000f3,0x000000f2,0x000000f2,0x0005002c,0x00000019,0x000000f4,
0x00000088,0x00000088,0x0004002b,0x00000006,0x000000fd,0x3f000000,0x00090019,0x0000011c,
0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,
0x0000011d,0x0000011c,0x00040020,0x0000011e,0x00000000,0x0000011d,0x0004003b,0x0000011e,
0x0000011f,0x00000000,0x0004002b,0x00000006,0x0000013a,0x40400000,0x0004002b,0x00000006,
0x00000144,0x437f0000,0x0004003b,0x0000011e,0x00000146,0x00000000,0x0004002b,0x0000007c,
0x0000015a,0x00000003,0x0004002b,0x0000007c,0x0000016a,0x00000000,0x00040020,0x0000021c,
0x00000001,0x00000018,0x00040020,0x00000220,0x00000001,0x00000019,0x0004003b,0x00000220,
0x00000221,0x00000001,0x0004003b,0x0000021c,0x00000224,0x00000001,0x00040020,0x00000227,
0x00000003,0x00000018,0x0004003b,0x00000227,0x00000228,0x00000003,0x0004002b,0x00000006,
0x000004c5,0x3b800000,0x0005002c,0x00000019,0x000004c7,0x000000fd,0x000000fd,0x0006002c,
0x0000000f,0x000004c8,0x00000061,0x00000061,0x00000061,0x0006002c,0x0000000f,0x000004c9,
0x00000068,0x00000068,0x00000068,0x0006002c,0x0000000f,0x000004ce,0x00000088,0x00000088,
0x00000088,0x0004002b,0x00000006,0x000004d4,0x3f72a76f,0x0004002b,0x00000006,0x000004d5,
0x3d9e8391,0x0007002c,0x00000018,0x000004d7,0x00000088,0x00000064,0x00000064,0x00000088,
0x0004002b,0x00000006,0x000004d8,0xbd6147ae,0x00030001,0x00000018,0x0000050f,0x00050036,
0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x00000019,
0x00000222,0x00000221,0x0004003d,0x00000018,0x00000225,0x00000224,0x00050041,0x0000007e,
0x000002a5,0x0000007b,0x000000e8,0x0004003d,0x00000006,0x000002a6,0x000002a5,0x000500b4,
0x00000037,0x000002a7,0x000002a6,0x00000088,0x000300f7,0x000002d5,0x00000000,0x000400fa,
0x000002a7,0x000002a8,0x000002ad,0x000200f8,0x000002a8,0x0004003d,0x0000011d,0x000002a9,
0x0000011f,0x00050057,0x00000018,0x000002ac,0x000002a9,0x00000222,0x000200f9,0x000002d5,
0x000200f8,0x000002ad,0x00050041,0x0000007e,0x000002ae,0x0000007b,0x000000e8,0x0004003d,
0x00000006,0x000002af,0x000002ae,0x000500b4,0x00000037,0x000002b0,0x000002af,0x00000094,
0x000300f7,0x000002d4,0x00000000,0x000400fa,0x000002b0,0x000002b1,0x000002bd,0x000200f8,
0x000002b1,0x000400d1,0x00000019,0x000002df,0x00000222,0x00050041,0x000000ed,0x000002e0,
0x0000007b,0x000000ec,0x0004003d,0x00000018,0x000002e1,0x000002e0,0x0007004f,0x00000019,
0x000002e2,0x000002e1,0x000002e1,0x00000002,0x00000003,0x00050085,0x00000019,0x000002e3,
0x000002df,0x000002e2,0x0008000c,0x00000019,0x000002e4,0x00000001,0x0000002b,0x000002e3,
0x000000f3,0x000000f4,0x00050041,0x000000ed,0x000002e7,0x0000007b,0x000000ec,0x0004003d,
0x00000018,0x000002e8,0x000002e7,0x0007004f,0x00000019,0x000002e9,0x000002e8,0x000002e8,
0x00000002,0x00000003,0x0005008e,0x00000019,0x000002ec,0x000002e4,0x000000fd,0x0004007f,
0x00000019,0x000004c6,0x000002ec,0x0008000c,0x00000019,0x000002ed,0x00000001,0x00000032,
0x00000222,0x000002e9,0x000004c6,0x00050083,0x00000019,0x000002f0,0x000000f4,0x000002e4,
0x0006000c,0x00000019,0x000002f2,0x00000001,0x0000000a,0x000002ed,0x0008000c,0x00000019,
0x000002f3,0x00000001,0x00000031,0x000002f0,0x000000f4,0x000002f2,0x0006000c,0x00000019,
0x000002f5,0x00000001,0x00000008,0x000002ed,0x00050081,0x00000019,0x000002f7,0x000002f5,
0x000004c7,0x00050081,0x00000019,0x000002f9,0x000002f7,0x000002f3,0x00050041,0x000000ed,
0x000002fa,0x0000007b,0x000000ec,0x0004003d,0x00000018,0x000002fb,0x000002fa,0x0007004f,
0x00000019,0x000002fc,0x000002fb,0x000002fb,0x00000000,0x00000001,0x00050085,0x00000019,
0x000002fd,0x000002f9,0x000002fc,0x0004003d,0x0000011d,0x000002b4,0x0000011f,0x000400cf,
0x00000019,0x000002b8,0x00000222,0x000400d0,0x00000019,0x000002bb,0x00000222,0x00080058,
0x00000018,0x000002bc,0x000002b4,0x000002fd,0x00000004,0x000002b8,0x000002bb,0x000200f9,
0x000002d4,0x000200f8,0x000002bd,0x00050041,0x0000007e,0x000002be,0x0000007b,0x000000e8,
0x0004003d,0x00000006,0x000002bf,0x000002be,0x000500b4,0x00000037,0x000002c0,0x000002bf,
0x0000013a,0x000300f7,0x000002d3,0x00000000,0x000400fa,0x000002c0,0x000002c1,0x000002ce,
0x000200f8,0x000002c1,0x0004003d,0x0000011d,0x000002c2,0x0000011f,0x00050057,0x00000018,
0x000002c5,0x000002c2,0x00000222,0x00050051,0x00000006,0x000002c6,0x000002c5,0x00000000,
0x0004003d,0x0000011d,0x000002c8,0x00000146,0x0008000c,0x00000006,0x000002ca,0x00000001,
0x00000032,0x000002c6,0x00000144,0x000000fd,0x00050085,0x00000006,0x000002cb,0x000002ca,
0x000004c5,0x00050050,0x00000019,0x000002cc,0x000002cb,0x000000fd,0x00050057,0x00000018,
0x000002cd,0x000002c8,0x000002cc,0x000200f9,0x000002d3,0x000200f8,0x000002ce,0x000200f9,
0x000002d3,0x000200f8,0x000002d3,0x000700f5,0x00000018,0x000004db,0x000002cd,0x000002c1,
0x000004d7,0x000002ce,0x000200f9,0x000002d4,0x000200f8,0x000002d4,0x000700f5,0x00000018,
0x000004da,0x000002bc,0x000002b1,0x000004db,0x000002d3,0x000200f9,0x000002d5,0x000200f8,
0x000002d5,0x000700f5,0x00000018,0x000004d9,0x000002ac,0x000002a8,0x000004da,0x000002d4,
0x00050041,0x0000007e,0x0000023e,0x0000007b,0x00000098,0x0004003d,0x00000006,0x0000023f,
0x0000023e,0x000500b4,0x00000037,0x00000240,0x0000023f,0x0000013a,0x000300f7,0x0000024b,
0x00000000,0x000400fa,0x00000240,0x00000241,0x0000024b,0x000200f8,0x00000241,0x0008004f,
0x0000000f,0x00000243,0x000004d9,0x000004d9,0x00000000,0x00000001,0x00000002,0x0006000c,
0x0000000f,0x00000304,0x00000001,0x00000004,0x00000243,0x0007000c,0x0000000f,0x00000305,
0x00000001,0x0000001a,0x00000304,0x0000005f,0x00050083,0x0000000f,0x00000307,0x00000305,
0x000004c8,0x0007000c,0x0000000f,0x00000308,0x00000001,0x00000028,0x00000307,0x00000065,
0x0006000c,0x0000000f,0x0000030a,0x00000001,0x00000004,0x00000243,0x0007000c,0x0000000f,
0x0000030b,0x00000001,0x0000001a,0x0000030a,0x0000005f,0x0005008e,0x0000000f,0x0000030c,
0x0000030b,0x00000069,0x00050083,0x0000000f,0x0000030e,0x000004c9,0x0000030c,0x00050088,
0x0000000f,0x00000311,0x00000308,0x0000030e,0x0006000c,0x0000000f,0x00000312,0x00000001,
0x00000004,0x00000311,0x0007000c,0x0000000f,0x00000313,0x00000001,0x0000001a,0x00000312,
0x00000076,0x0005008e,0x0000000f,0x00000314,0x00000313,0x00000070,0x00050041,0x0000007e,
0x00000315,0x0000007b,0x0000007d,0x0004003d,0x00000006,0x00000316,0x00000315,0x00060050,
0x0000000f,0x00000317,0x00000316,0x00000316,0x00000316,0x00050088,0x0000000f,0x00000318,
0x00000314,0x00000317,0x00050051,0x00000006,0x00000246,0x00000318,0x00000000,0x00060052,
0x00000018,0x00000471,0x00000246,0x000004d9,0x00000000,0x00050051,0x00000006,0x00000248,
0x00000318,0x00000001,0x00060052,0x00000018,0x00000473,0x00000248,0x00000471,0x00000001,
0x00050051,0x00000006,0x0000024a,0x00000318,0x00000002,0x00060052,0x00000018,0x00000475,
0x0000024a,0x00000473,0x00000002,0x000200f9,0x0000024b,0x000200f8,0x0000024b,0x000700f5,
0x00000018,0x000004dc,0x000004d9,0x000002d5,0x00000475,0x00000241,0x00050041,0x0000007e,
0x0000024c,0x0000007b,0x00000085,0x0004003d,0x00000006,0x0000024d,0x0000024c,0x000500b7,
0x00000037,0x0000024e,0x0000024d,0x00000064,0x000300f7,0x00000259,0x00000000,0x000400fa,
0x0000024e,0x0000024f,0x00000259,0x000200f8,0x0000024f,0x0008004f,0x0000000f,0x00000251,
0x000004dc,0x000004dc,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007e,0x0000031d,
0x0000007b,0x00000085,0x0004003d,0x00000006,0x0000031e,0x0000031d,0x000500b4,0x00000037,
0x0000031f,0x0000031e,0x00000088,0x000300f7,0x00000353,0x00000000,0x000400fa,0x0000031f,
0x00000320,0x00000325,0x000200f8,0x00000320,0x00050041,0x0000007e,0x00000321,0x0000007b,
0x0000008c,0x0004003d,0x00000006,0x00000322,0x00000321,0x0005008e,0x0000000f,0x00000324,
0x00000251,0x00000322,0x000200f9,0x00000353,0x000200f8,0x00000325,0x00050041,0x0000007e,
0x00000326,0x0000007b,0x00000085,0x0004003d,0x00000006,0x00000327,0x00000326,0x000500b4,
0x00000037,0x00000328,0x00000327,0x00000094,0x000300f7,0x00000352,0x00000000,0x000400fa,
0x00000328,0x00000329,0x00000352,0x000200f8,0x00000329,0x00050041,0x0000007e,0x0000032a,
0x0000007b,0x00000098,0x0004003d,0x00000006,0x0000032b,0x0000032a,0x000500b4,0x00000037,
0x0000032c,0x0000032b,0x00000094,0x000300f7,0x00000330,0x00000000,0x000400fa,0x0000032c,
0x0000032d,0x00000330,0x000200f8,0x0000032d,0x00050090,0x0000000f,0x0000032f,0x00000251,
0x000000ac,0x000200f9,0x00000330,0x000200f8,0x00000330,0x000700f5,0x0000000f,0x000004dd,
0x00000251,0x00000329,0x0000032f,0x0000032d,0x00050051,0x00000006,0x00000332,0x000004dd,
0x00000000,0x00050051,0x00000006,0x00000334,0x000004dd,0x00000001,0x00050051,0x00000006,
0x00000336,0x000004dd,0x00000002,0x0007000c,0x00000006,0x00000337,0x00000001,0x00000028,
0x00000334,0x00000336,0x0007000c,0x00000006,0x00000338,0x00000001,0x00000028,0x00000332,
0x00000337,0x000500ba,0x00000037,0x0000033a,0x00000338,0x00000064,0x000300f7,0x0000034a,
0x00000000,0x000400fa,0x0000033a,0x0000033b,0x0000034a,0x000200f8,0x0000033b,0x00050041,
0x0000007e,0x0000033c,0x0000007b,0x0000008c,0x0004003d,0x00000006,0x0000033d,0x0000033c,
0x0008000c,0x00000006,0x00000340,0x00000001,0x00000032,0x0000033d,0x00000338,0x00000088,
0x00050041,0x0000007e,0x00000341,0x0000007b,0x000000c5,0x0004003d,0x00000006,0x00000342,
0x00000341,0x0008000c,0x00000006,0x00000345,0x00000001,0x00000032,0x00000342,0x00000338,
0x00000088,0x00050088,0x00000006,0x00000346,0x00000340,0x00000345,0x0005008e,0x0000000f,
0x00000349,0x000004dd,0x00000346,0x000200f9,0x0000034a,0x000200f8,0x0000034a,0x000700f5,
0x0000000f,0x000004de,0x000004dd,0x00000330,0x00000349,0x0000033b,0x00050041,0x0000007e,
0x0000034b,0x0000007b,0x00000098,0x0004003d,0x00000006,0x0000034c,0x0000034b,0x000500b4,
0x00000037,0x0000034d,0x0000034c,0x00000094,0x000300f7,0x00000351,0x00000000,0x000400fa,
0x0000034d,0x0000034e,0x00000351,0x000200f8,0x0000034e,0x00050090,0x0000000f,0x00000350,
0x000004de,0x000000e1,0x000200f9,0x00000351,0x000200f8,0x00000351,0x000700f5,0x0000000f,
0x000004e1,0x000004de,0x0000034a,0x00000350,0x0000034e,0x000200f9,0x00000352,0x000200f8,
0x00000352,0x000700f5,0x0000000f,0x000004e0,0x00000251,0x00000325,0x000004e1,0x00000351,
0x000200f9,0x00000353,0x000200f8,0x00000353,0x000700f5,0x0000000f,0x000004df,0x00000324,
0x00000320,0x000004e0,0x00000352,0x00050051,0x00000006,0x00000254,0x000004df,0x00000000,
0x00060052,0x00000018,0x0000047a,0x00000254,0x000004dc,0x00000000,0x00050051,0x00000006,
0x00000256,0x000004df,0x00000001,0x00060052,0x00000018,0x0000047c,0x00000256,0x0000047a,
0x00000001,0x00050051,0x00000006,0x00000258,0x000004df,0x00000002,0x00060052,0x00000018,
0x0000047e,0x00000258,0x0000047c,0x00000002,0x000200f9,0x00000259,0x000200f8,0x00000259,
0x000700f5,0x00000018,0x000004e7,0x000004dc,0x0000024b,0x0000047e,0x00000353,0x00050041,
0x0000007e,0x0000025a,0x0000007b,0x00000098,0x0004003d,0x00000006,0x0000025b,0x0000025a,
0x000500b4,0x00000037,0x0000025c,0x0000025b,0x00000088,0x000300f7,0x0000029a,0x00000000,
0x000400fa,0x0000025c,0x0000025d,0x0000026a,0x000200f8,0x0000025d,0x0008004f,0x0000000f,
0x0000025f,0x000004e7,0x000004e7,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007e,
0x0000035b,0x0000007b,0x0000016a,0x0004003d,0x00000006,0x0000035c,0x0000035b,0x000500b7,
0x00000037,0x0000035d,0x0000035c,0x00000064,0x000300f7,0x0000036b,0x00000000,0x000400fa,
0x0000035d,0x0000035e,0x0000036b,0x000200f8,0x0000035e,0x00050051,0x00000006,0x00000360,
0x000004e7,0x00000000,0x000500bc,0x00000037,0x00000374,0x00000360,0x00000036,0x000300f7,
0x0000037e,0x00000000,0x000400fa,0x00000374,0x00000375,0x00000378,0x000200f8,0x00000375,
0x00050085,0x00000006,0x00000377,0x00000360,0x000004d5,0x000200f9,0x0000037e,0x000200f8,
0x00000378,0x00050081,0x00000006,0x0000037a,0x00000360,0x00000040,0x0006000c,0x00000006,
0x0000037b,0x00000001,0x00000004,0x0000037a,0x00050085,0x00000006,0x0000037c,0x0000037b,
0x000004d4,0x0007000c,0x00000006,0x0000037d,0x00000001,0x0000001a,0x0000037c,0x00000045,
0x000200f9,0x0000037e,0x000200f8,0x0000037e,0x000700f5,0x00000006,0x000004fe,0x00000377,
0x00000375,0x0000037d,0x00000378,0x00050051,0x00000006,0x00000364,0x000004e7,0x00000001,
0x000500bc,0x00000037,0x00000383,0x00000364,0x00000036,0x000300f7,0x0000038d,0x00000000,
0x000400fa,0x00000383,0x00000384,0x00000387,0x000200f8,0x00000384,0x00050085,0x00000006,
0x00000386,0x00000364,0x000004d5,0x000200f9,0x0000038d,0x000200f8,0x00000387,0x00050081,
0x00000006,0x00000389,0x00000364,0x00000040,0x0006000c,0x00000006,0x0000038a,0x00000001,
0x00000004,0x00000389,0x00050085,0x00000006,0x0000038b,0x0000038a,0x000004d4,0x0007000c,
0x00000006,0x0000038c,0x00000001,0x0000001a,0x0000038b,0x00000045,0x000200f9,0x0000038d,
0x000200f8,0x0000038d,0x000700f5,0x00000006,0x00000500,0x00000386,0x00000384,0x0000038c,
0x00000387,0x00050051,0x00000006,0x00000368,0x000004e7,0x00000002,0x000500bc,0x00000037,
0x00000392,0x00000368,0x00000036,0x000300f7,0x0000039c,0x00000000,0x000400fa,0x00000392,
0x00000393,0x00000396,0x000200f8,0x00000393,0x00050085,0x00000006,0x00000395,0x00000368,
0x000004d5,0x000200f9,0x0000039c,0x000200f8,0x00000396,0x00050081,0x00000006,0x00000398,
0x00000368,0x00000040,0x0006000c,0x00000006,0x00000399,0x00000001,0x00000004,0x00000398,
0x00050085,0x00000006,0x0000039a,0x00000399,0x000004d4,0x0007000c,0x00000006,0x0000039b,
0x00000001,0x0000001a,0x0000039a,0x00000045,0x000200f9,0x0000039c,0x000200f8,0x0000039c,
0x000700f5,0x00000006,0x00000502,0x00000395,0x00000393,0x0000039b,0x00000396,0x00060050,
0x0000000f,0x0000050e,0x000004fe,0x00000500,0x00000502,0x000200f9,0x0000036b,0x000200f8,
0x0000036b,0x000700f5,0x0000000f,0x00000504,0x0000025f,0x0000025d,0x0000050e,0x0000039c,
0x00050041,0x0000007e,0x0000036d,0x0000007b,0x0000015a,0x0004003d,0x00000006,0x0000036e,
0x0000036d,0x0005008e,0x0000000f,0x0000036f,0x00000504,0x0000036e,0x00050051,0x00000006,
0x00000262,0x0000036f,0x00000000,0x00050051,0x00000006,0x00000264,0x0000036f,0x00000001,
0x00050051,0x00000006,0x00000266,0x0000036f,0x00000002,0x00050051,0x00000006,0x00000268,
0x000004e7,0x00000003,0x00070050,0x00000018,0x000004d6,0x00000262,0x00000264,0x00000266,
0x00000268,0x000200f9,0x0000029a,0x000200f8,0x0000026a,0x00050041,0x0000007e,0x0000026b,
0x0000007b,0x00000098,0x0004003d,0x00000006,0x0000026c,0x0000026b,0x000500b4,0x00000037,
0x0000026d,0x0000026c,0x00000094,0x000300f7,0x00000299,0x00000000,0x000400fa,0x0000026d,
0x0000026e,0x0000027b,0x000200f8,0x0000026e,0x0008004f,0x0000000f,0x00000270,0x000004e7,
0x000004e7,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007e,0x000003a5,0x0000007b,
0x0000015a,0x0004003d,0x00000006,0x000003a6,0x000003a5,0x0005008e,0x0000000f,0x000003a7,
0x00000270,0x000003a6,0x00050041,0x0000007e,0x000003a8,0x0000007b,0x0000016a,0x0004003d,
0x00000006,0x000003a9,0x000003a8,0x000500b7,0x00000037,0x000003aa,0x000003a9,0x00000064,
0x000400a8,0x00000037,0x000003ab,0x000003aa,0x000300f7,0x000003bd,0x00000000,0x000400fa,
0x000003ab,0x000003ac,0x000003bd,0x000200f8,0x000003ac,0x00050051,0x00000006,0x000003ae,
0x000003a7,0x00000000,0x000500bc,0x00000037,0x000003c2,0x000003ae,0x0000004b,0x000300f7,
0x000003cc,0x00000000,0x000400fa,0x000003c2,0x000003c3,0x000003c6,0x000200f8,0x000003c3,
0x00050085,0x00000006,0x000003c5,0x000003ae,0x0000003c,0x000200f9,0x000003cc,0x000200f8,
0x000003c6,0x0006000c,0x00000006,0x000003c8,0x00000001,0x00000004,0x000003ae,0x0007000c,
0x00000006,0x000003c9,0x00000001,0x0000001a,0x000003c8,0x00000054,0x0008000c,0x00000006,
0x000003cb,0x00000001,0x00000032,0x000003c9,0x00000043,0x000004d8,0x000200f9,0x000003cc,
0x000200f8,0x000003cc,0x000700f5,0x00000006,0x000004f3,0x000003c5,0x000003c3,0x000003cb,
0x000003c6,0x00050051,0x00000006,0x000003b2,0x000003a7,0x00000001,0x000500bc,0x00000037,
0x000003d1,0x000003b2,0x0000004b,0x000300f7,0x000003db,0x00000000,0x000400fa,0x000003d1,
0x000003d2,0x000003d5,0x000200f8,0x000003d2,0x00050085,0x00000006,0x000003d4,0x000003b2,
0x0000003c,0x000200f9,0x000003db,0x000200f8,0x000003d5,0x0006000c,0x00000006,0x000003d7,
0x00000001,0x00000004,0x000003b2,0x0007000c,0x00000006,0x000003d8,0x00000001,0x0000001a,
0x000003d7,0x00000054,0x0008000c,0x00000006,0x000003da,0x00000001,0x00000032,0x000003d8,
0x00000043,0x000004d8,0x000200f9,0x000003db,0x000200f8,0x000003db,0x000700f5,0x00000006,
0x000004f5,0x000003d4,0x000003d2,0x000003da,0x000003d5,0x00050051,0x00000006,0x000003b6,
0x000003a7,0x00000002,0x000500bc,0x00000037,0x000003e0,0x000003b6,0x0000004b,0x000300f7,
0x000003ea,0x00000000,0x000400fa,0x000003e0,0x000003e1,0x000003e4,0x000200f8,0x000003e1,
0x00050085,0x00000006,0x000003e3,0x000003b6,0x0000003c,0x000200f9,0x000003ea,0x000200f8,
0x000003e4,0x0006000c,0x00000006,0x000003e6,0x00000001,0x00000004,0x000003b6,0x0007000c,
0x00000006,0x000003e7,0x00000001,0x0000001a,0x000003e6,0x00000054,0x0008000c,0x00000006,
0x000003e9,0x00000001,0x00000032,0x000003e7,0x00000043,0x000004d8,0x000200f9,0x000003ea,
0x000200f8,0x000003ea,0x000700f5,0x00000006,0x000004f7,0x000003e3,0x000003e1,0x000003e9,
0x000003e4,0x00060050,0x0000000f,0x0000050d,0x000004f3,0x000004f5,0x000004f7,0x0008000c,
0x0000000f,0x000003bc,0x00000001,0x0000002b,0x0000050d,0x00000065,0x000004ce,0x000200f9,
0x000003bd,0x000200f8,0x000003bd,0x000700f5,0x0000000f,0x000004f9,0x000003a7,0x0000026e,
0x000003bc,0x000003ea,0x00050051,0x00000006,0x00000273,0x000004f9,0x00000000,0x00050051,
0x00000006,0x00000275,0x000004f9,0x00000001,0x00050051,0x00000006,0x00000277,0x000004f9,
0x00000002,0x00050051,0x00000006,0x00000279,0x000004e7,0x00000003,0x00070050,0x00000018,
0x000004d3,0x00000273,0x00000275,0x00000277,0x00000279,0x000200f9,0x00000299,0x000200f8,
0x0000027b,0x00050041,0x0000007e,0x0000027c,0x0000007b,0x00000098,0x0004003d,0x00000006,
0x0000027d,0x0000027c,0x000500b4,0x00000037,0x0000027e,0x0000027d,0x0000013a,0x000300f7,
0x00000298,0x00000000,0x000400fa,0x0000027e,0x0000027f,0x00000295,0x000200f8,0x0000027f,
0x0008004f,0x0000000f,0x00000281,0x000004e7,0x000004e7,0x00000000,0x00000001,0x00000002,
0x00050090,0x0000000f,0x00000282,0x00000281,0x000000e1,0x00050051,0x00000006,0x00000284,
0x00000282,0x00000000,0x00060052,0x00000018,0x000004a4,0x00000284,0x0000050f,0x00000000,
0x00050051,0x00000006,0x00000286,0x00000282,0x00000001,0x00060052,0x00000018,0x000004a6,
0x00000286,0x000004a4,0x00000001,0x00050051,0x00000006,0x00000288,0x00000282,0x00000002,
0x00060052,0x00000018,0x000004a8,0x00000288,0x000004a6,0x00000002,0x0008004f,0x0000000f,
0x0000028a,0x000004a8,0x000004a8,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007e,
0x000003f3,0x0000007b,0x0000015a,0x0004003d,0x00000006,0x000003f4,0x000003f3,0x0005008e,
0x0000000f,0x000003f5,0x0000028a,0x000003f4,0x00050041,0x0000007e,0x000003f6,0x0000007b,
0x0000016a,0x0004003d,0x00000006,0x000003f7,0x000003f6,0x000500b7,0x00000037,0x000003f8,
0x000003f7,0x00000064,0x000400a8,0x00000037,0x000003f9,0x000003f8,0x000300f7,0x0000040b,
0x00000000,0x000400fa,0x000003f9,0x000003fa,0x0000040b,0x000200f8,0x000003fa,0x00050051,
0x00000006,0x000003fc,0x000003f5,0x00000000,0x000500bc,0x00000037,0x00000410,0x000003fc,
0x0000004b,0x000300f7,0x0000041a,0x00000000,0x000400fa,0x00000410,0x00000411,0x00000414,
0x000200f8,0x00000411,0x00050085,0x00000006,0x00000413,0x000003fc,0x0000003c,0x000200f9,
0x0000041a,0x000200f8,0x00000414,0x0006000c,0x00000006,0x00000416,0x00000001,0x00000004,
0x000003fc,0x0007000c,0x00000006,0x00000417,0x00000001,0x0000001a,0x00000416,0x00000054,
0x0008000c,0x00000006,0x00000419,0x00000001,0x00000032,0x00000417,0x00000043,0x000004d8,
0x000200f9,0x0000041a,0x000200f8,0x0000041a,0x000700f5,0x00000006,0x000004e8,0x00000413,
0x00000411,0x00000419,0x00000414,0x00050051,0x00000006,0x00000400,0x000003f5,0x00000001,
0x000500bc,0x00000037,0x0000041f,0x00000400,0x0000004b,0x000300f7,0x00000429,0x00000000,
0x000400fa,0x0000041f,0x00000420,0x00000423,0x000200f8,0x00000420,0x00050085,0x00000006,
0x00000422,0x00000400,0x0000003c,0x000200f9,0x00000429,0x000200f8,0x00000423,0x0006000c,
0x00000006,0x00000425,0x00000001,0x00000004,0x00000400,0x0007000c,0x00000006,0x00000426,
0x00000001,0x0000001a,0x00000425,0x00000054,0x0008000c,0x00000006,0x00000428,0x00000001,
0x00000032,0x00000426,0x00000043,0x000004d8,0x000200f9,0x00000429,0x000200f8,0x00000429,
0x000700f5,0x00000006,0x000004ea,0x00000422,0x00000420,0x00000428,0x00000423,0x00050051,
0x00000006,0x00000404,0x000003f5,0x00000002,0x000500bc,0x00000037,0x0000042e,0x00000404,
0x0000004b,0x000300f7,0x00000438,0x00000000,0x000400fa,0x0000042e,0x0000042f,0x00000432,
0x000200f8,0x0000042f,0x00050085,0x00000006,0x00000431,0x00000404,0x0000003c,0x000200f9,
0x00000438,0x000200f8,0x00000432,0x0006000c,0x00000006,0x00000434,0x00000001,0x00000004,
0x00000404,0x0007000c,0x00000006,0x00000435,0x00000001,0x0000001a,0x00000434,0x00000054,
0x0008000c,0x00000006,0x00000437,0x00000001,0x00000032,0x00000435,0x00000043,0x000004d8,
0x000200f9,0x00000438,0x000200f8,0x00000438,0x000700f5,0x00000006,0x000004ec,0x00000431,
0x0000042f,0x00000437,0x00000432,0x00060050,0x0000000f,0x0000050c,0x000004e8,0x000004ea,
0x000004ec,0x0008000c,0x0000000f,0x0000040a,0x00000001,0x0000002b,0x0000050c,0x00000065,
0x000004ce,0x000200f9,0x0000040b,0x000200f8,0x0000040b,0x000700f5,0x0000000f,0x000004ee,
0x000003f5,0x0000027f,0x0000040a,0x00000438,0x00050051,0x00000006,0x0000028d,0x000004ee,
0x00000000,0x00050051,0x00000006,0x0000028f,0x000004ee,0x00000001,0x00050051,0x00000006,
0x00000291,0x000004ee,0x00000002,0x00050051,0x00000006,0x00000293,0x000004e7,0x00000003,
0x00070050,0x00000018,0x000004cf,0x0000028d,0x0000028f,0x00000291,0x00000293,0x000200f9,
0x00000298,0x000200f8,0x00000295,0x0008004f,0x0000000f,0x0000043e,0x000004e7,0x000004e7,
0x00000000,0x00000001,0x00000002,0x00050041,0x0000007e,0x0000043f,0x0000007b,0x0000015a,
0x0004003d,0x00000006,0x00000440,0x0000043f,0x0005008e,0x0000000f,0x00000441,0x0000043e,
0x00000440,0x00050051,0x00000006,0x00000443,0x00000441,0x00000000,0x00050051,0x00000006,
0x00000445,0x00000441,0x00000001,0x00050051,0x00000006,0x00000447,0x00000441,0x00000002,
0x00050051,0x00000006,0x00000449,0x000004e7,0x00000003,0x00070050,0x00000018,0x000004ca,
0x00000443,0x00000445,0x00000447,0x00000449,0x000200f9,0x00000298,0x000200f8,0x00000298,
0x000700f5,0x00000018,0x0000050b,0x000004cf,0x0000040b,0x000004ca,0x00000295,0x000200f9,
0x00000299,0x000200f8,0x00000299,0x000700f5,0x00000018,0x0000050a,0x000004d3,0x000003bd,
0x0000050b,0x00000298,0x000200f9,0x0000029a,0x000200f8,0x0000029a,0x000700f5,0x00000018,
0x00000509,0x000004d6,0x0000036b,0x0000050a,0x00000299,0x00050085,0x00000018,0x0000029e,
0x00000509,0x00000225,0x0003003e,0x00000228,0x0000029e,0x000100fd,0x00010038
0x00000003,0x00040017,0x00000018,0x00000006,0x00000002,0x00040017,0x0000001a,0x00000006,
0x00000004,0x0004002b,0x00000006,0x0000003e,0x3d25aee6,0x00020014,0x0000003f,0x0004002b,
0x00000006,0x00000044,0x414eb852,0x0004002b,0x00000006,0x00000048,0x3d6147ae,0x0004002b,
0x00000006,0x0000004b,0x3f870a3d,0x0004002b,0x00000006,0x0000004d,0x4019999a,0x0004002b,
0x00000006,0x00000053,0x3b4d2e1c,0x0004002b,0x00000006,0x0000005c,0x3ed55555,0x0004002b,
0x00000006,0x00000066,0x3c4fcdac,0x0006002c,0x0000000f,0x00000067,0x00000066,0x00000066,
0x00000066,0x0004002b,0x00000006,0x00000069,0x3f560000,0x0004002b,0x00000006,0x0000006c,
0x00000000,0x0006002c,0x0000000f,0x0000006d,0x0000006c,0x0000006c,0x0000006c,0x0004002b,
0x00000006,0x00000070,0x4196d000,0x0004002b,0x00000006,0x00000071,0x41958000,0x0004002b,
0x00000006,0x00000078,0x461c4000,0x0004002b,0x00000006,0x0000007d,0x40c8e06b,0x0006002c,
0x0000000f,0x0000007e,0x0000007d,0x0000007d,0x0000007d,0x000b001e,0x00000081,0x00000006,
0x00000006,0x00000006,0x00000006,0x0000001a,0x00000006,0x00000006,0x00000006,0x00000006,
0x00040020,0x00000082,0x00000002,0x00000081,0x0004003b,0x00000082,0x00000083,0x00000002,
0x00040015,0x00000084,0x00000020,0x00000001,0x0004002b,0x00000084,0x00000085,0x00000008,
0x00040020,0x00000086,0x00000002,0x00000006,0x0004002b,0x00000084,0x0000008d,0x00000005,
0x0004002b,0x00000006,0x00000090,0x3f800000,0x0004002b,0x00000084,0x00000094,0x00000006,
0x0004002b,0x00000006,0x0000009c,0x40000000,0x0004002b,0x00000084,0x000000a0,0x00000002,
0x00040018,0x000000a7,0x0000000f,0x00000003,0x0004002b,0x00000006,0x000000a8,0x3f209d8c,
0x0004002b,0x00000006,0x000000a9,0x3ea897c8,0x0004002b,0x00000006,0x000000aa,0x3d3168f9,
0x0006002c,0x0000000f,0x000000ab,0x000000a8,0x000000a9,0x000000aa,0x0004002b,0x00000006,
0x000000ac,0x3d8d82ba,0x0004002b,0x00000006,0x000000ad,0x3f6b670a,0x0004002b,0x00000006,
0x000000ae,0x3c3a27af,0x0006002c,0x0000000f,0x000000af,0x000000ac,0x000000ad,0x000000ae,
0x0004002b,0x00000006,0x000000b0,0x3c86466b,0x0004002b,0x00000006,0x000000b1,0x3db44029,
0x0004002b,0x00000006,0x000000b2,0x3f6545b7,0x0006002c,0x0000000f,0x000000b3,0x000000b0,
0x000000b1,0x000000b2,0x0006002c,0x000000a7,0x000000b4,0x000000ab,0x000000af,0x000000b3,
0x0004002b,0x00000084,0x000000cd,0x00000007,0x0004002b,0x00000006,0x000000dd,0x3fd48b22,
0x0004002b,0x00000006,0x000000de,0xbf1670a0,0x0004002b,0x00000006,0x000000df,0xbd952d23,
0x0006002c,0x0000000f,0x000000e0,0x000000dd,0x000000de,0x000000df,0x0004002b,0x00000006,
0x000000e1,0xbdff127f,0x0004002b,0x00000006,0x000000e2,0x3f9102b4,0x0004002b,0x00000006,
0x000000e3,0xbc08c60d,0x0006002c,0x0000000f,0x000000e4,0x000000e1,0x000000e2,0x000000e3,
0x0004002b,0x00000006,0x000000e5,0xbc94b7b3,0x0004002b,0x00000006,0x000000e6,0xbdce05cd,
0x0004002b,0x00000006,0x000000e7,0x3f8f333c,0x0006002c,0x0000000f,0x000000e8,0x000000e5,
0x000000e6,0x000000e7,0x0006002c,0x000000a7,0x000000e9,0x000000e0,0x000000e4,0x000000e8,
0x00090019,0x000000ef,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,0x00000001,
0x00000000,0x0003001b,0x000000f0,0x000000ef,0x00040020,0x000000f1,0x00000000,0x000000f0,
0x0004003b,0x000000f1,0x000000f2,0x00000000,0x0004002b,0x00000006,0x000000f7,0x437f0000,
0x0004003b,0x000000f1,0x000000f9,0x00000000,0x0004002b,0x00000006,0x000000fc,0x3f000000,
0x0004002b,0x00000084,0x00000106,0x00000004,0x00040020,0x00000107,0x00000002,0x0000001a,
0x0004002b,0x00000006,0x00000154,0x3727c5ac,0x0005002c,0x00000018,0x00000155,0x00000154,
0x00000154,0x0005002c,0x00000018,0x00000156,0x00000090,0x00000090,0x0004002b,0x00000084,
0x00000174,0x00000001,0x0004002b,0x00000006,0x00000196,0x40400000,0x0004002b,0x00000006,
0x000001a1,0x40800000,0x0004002b,0x00000006,0x000001ac,0x40a00000,0x0004002b,0x00000084,
0x000001c4,0x00000003,0x0004002b,0x00000084,0x000001d4,0x00000000,0x00040020,0x00000286,
0x00000001,0x0000001a,0x00040020,0x0000028a,0x00000001,0x00000018,0x0004003b,0x0000028a,
0x0000028b,0x00000001,0x0004003b,0x00000286,0x0000028e,0x00000001,0x00040020,0x00000291,
0x00000003,0x0000001a,0x0004003b,0x00000291,0x00000292,0x00000003,0x0005002c,0x00000018,
0x0000066e,0x000000fc,0x000000fc,0x0004002b,0x00000006,0x0000066f,0x3b800000,0x0006002c,
0x0000000f,0x00000671,0x00000069,0x00000069,0x00000069,0x0006002c,0x0000000f,0x00000672,
0x00000070,0x00000070,0x00000070,0x0006002c,0x0000000f,0x00000677,0x00000090,0x00000090,
0x00000090,0x0004002b,0x00000006,0x0000067d,0x3f72a76f,0x0004002b,0x00000006,0x0000067e,
0x3d9e8391,0x0007002c,0x0000001a,0x00000680,0x00000090,0x0000006c,0x00000090,0x00000090,
0x0004002b,0x00000006,0x00000681,0xbd6147ae,0x00030001,0x0000001a,0x000006ba,0x00050036,
0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x00000018,
0x0000028c,0x0000028b,0x0004003d,0x0000001a,0x0000028f,0x0000028e,0x00050041,0x00000086,
0x00000313,0x00000083,0x00000174,0x0004003d,0x00000006,0x00000314,0x00000313,0x000500b4,
0x0000003f,0x00000315,0x00000314,0x00000090,0x000300f7,0x0000034f,0x00000000,0x000400fa,
0x00000315,0x00000316,0x0000031b,0x000200f8,0x00000316,0x0004003d,0x000000f0,0x00000317,
0x000000f2,0x00050057,0x0000001a,0x0000031a,0x00000317,0x0000028c,0x000200f9,0x0000034f,
0x000200f8,0x0000031b,0x00050041,0x00000086,0x0000031c,0x00000083,0x00000174,0x0004003d,
0x00000006,0x0000031d,0x0000031c,0x000500b4,0x0000003f,0x0000031e,0x0000031d,0x0000009c,
0x000300f7,0x0000034e,0x00000000,0x000400fa,0x0000031e,0x0000031f,0x0000032c,0x000200f8,
0x0000031f,0x000400d1,0x00000018,0x00000357,0x0000028c,0x00050041,0x00000107,0x00000358,
0x00000083,0x00000106,0x0004003d,0x0000001a,0x00000359,0x00000358,0x0007004f,0x00000018,
0x0000035a,0x00000359,0x00000359,0x00000002,0x00000003,0x00050085,0x00000018,0x0000035b,
0x00000357,0x0000035a,0x0008000c,0x00000018,0x0000035c,0x00000001,0x0000002b,0x0000035b,
0x00000155,0x00000156,0x00050041,0x00000107,0x0000035e,0x00000083,0x00000106,0x0004003d,
0x0000001a,0x0000035f,0x0000035e,0x0007004f,0x00000018,0x00000360,0x0000035f,0x0000035f,
0x00000002,0x00000003,0x0005008e,0x00000018,0x00000363,0x0000035c,0x000000fc,0x0004007f,
0x00000018,0x00000670,0x00000363,0x0008000c,0x00000018,0x00000364,0x00000001,0x00000032,
0x0000028c,0x00000360,0x00000670,0x00050083,0x00000018,0x00000367,0x00000156,0x0000035c,
0x0006000c,0x00000018,0x00000369,0x00000001,0x0000000a,0x00000364,0x0008000c,0x00000018,
0x0000036a,0x00000001,0x00000031,0x00000367,0x00000156,0x00000369,0x0006000c,0x00000018,
0x0000036c,0x00000001,0x00000008,0x00000364,0x00050081,0x00000018,0x0000036e,0x0000036c,
0x0000066e,0x00050081,0x00000018,0x00000370,0x0000036e,0x0000036a,0x00050041,0x00000107,
0x00000371,0x00000083,0x00000106,0x0004003d,0x0000001a,0x00000372,0x00000371,0x0007004f,
0x00000018,0x00000373,0x00000372,0x00000372,0x00000000,0x00000001,0x00050085,0x00000018,
0x00000374,0x00000370,0x00000373,0x0004003d,0x000000f0,0x00000323,0x000000f2,0x000400cf,
0x00000018,0x00000327,0x0000028c,0x000400d0,0x00000018,0x0000032a,0x0000028c,0x00080058,
0x0000001a,0x0000032b,0x00000323,0x00000374,0x00000004,0x00000327,0x0000032a,0x000200f9,
0x0000034e,0x000200f8,0x0000032c,0x00050041,0x00000086,0x0000032d,0x00000083,0x00000174,
0x0004003d,0x00000006,0x0000032e,0x0000032d,0x000500b4,0x0000003f,0x0000032f,0x0000032e,
0x00000196,0x000300f7,0x0000034d,0x00000000,0x000400fa,0x0000032f,0x00000330,0x00000334,
0x000200f8,0x00000330,0x0004003d,0x000000f0,0x00000378,0x000000f2,0x00050057,0x0000001a,
0x0000037a,0x00000378,0x0000028c,0x00050051,0x00000006,0x0000037b,0x0000037a,0x00000000,
0x0004003d,0x000000f0,0x0000037d,0x000000f9,0x0008000c,0x00000006,0x0000037f,0x00000001,
0x00000032,0x0000037b,0x000000f7,0x000000fc,0x00050085,0x00000006,0x00000380,0x0000037f,
0x0000066f,0x00050050,0x00000018,0x00000381,0x00000380,0x000000fc,0x00050057,0x0000001a,
0x00000382,0x0000037d,0x00000381,0x000200f9,0x0000034d,0x000200f8,0x00000334,0x00050041,
0x00000086,0x00000335,0x00000083,0x00000174,0x0004003d,0x00000006,0x00000336,0x00000335,
0x000500b4,0x0000003f,0x00000337,0x00000336,0x000001a1,0x000300f7,0x0000034c,0x00000000,
0x000400fa,0x00000337,0x00000338,0x0000033c,0x000200f8,0x00000338,0x00050041,0x00000107,
0x00000391,0x00000083,0x00000106,0x0004003d,0x0000001a,0x00000392,0x00000391,0x0007004f,
0x00000018,0x00000393,0x00000392,0x00000392,0x00000002,0x00000003,0x0008000c,0x00000018,
0x00000396,0x00000001,0x00000032,0x0000028c,0x00000393,0x0000066e,0x0006000c,0x00000018,
0x00000398,0x00000001,0x00000008,0x00000396,0x00050083,0x00000018,0x0000039a,0x00000398,
0x0000066e,0x00050041,0x00000107,0x0000039b,0x00000083,0x00000106,0x0004003d,0x0000001a,
0x0000039c,0x0000039b,0x0007004f,0x00000018,0x0000039d,0x0000039c,0x0000039c,0x00000000,
0x00000001,0x00050085,0x00000018,0x0000039e,0x0000039a,0x0000039d,0x0006000c,0x00000018,
0x000003a0,0x00000001,0x00000008,0x00000396,0x00050081,0x00000018,0x000003a2,0x000003a0,
0x0000066e,0x00050041,0x00000107,0x000003a3,0x00000083,0x00000106,0x0004003d,0x0000001a,
0x000003a4,0x000003a3,0x0007004f,0x00000018,0x000003a5,0x000003a4,0x000003a4,0x00000000,
0x00000001,0x00050085,0x00000018,0x000003a6,0x000003a2,0x000003a5,0x00050051,0x00000006,
0x000003a7,0x0000039e,0x00000000,0x00050051,0x00000006,0x000003a8,0x0000039e,0x00000001,
0x00050051,0x00000006,0x000003a9,0x000003a6,0x00000000,0x00050051,0x00000006,0x000003aa,
0x000003a6,0x00000001,0x00070050,0x0000001a,0x000003ab,0x000003a7,0x000003a8,0x000003a9,
0x000003aa,0x0006000c,0x00000018,0x000003ad,0x00000001,0x0000000a,0x00000396,0x0007004f,
0x00000018,0x000003af,0x000003ab,0x000003ab,0x00000000,0x00000001,0x0004003d,0x000000f0,
0x000003cd,0x000000f2,0x00050057,0x0000001a,0x000003cf,0x000003cd,0x000003af,0x00050051,
0x00000006,0x000003d0,0x000003cf,0x00000000,0x0004003d,0x000000f0,0x000003d2,0x000000f9,
0x0008000c,0x00000006,0x000003d4,0x00000001,0x00000032,0x000003d0,0x000000f7,0x000000fc,
0x00050085,0x00000006,0x000003d5,0x000003d4,0x0000066f,0x00050050,0x00000018,0x000003d6,
0x000003d5,0x000000fc,0x00050057,0x0000001a,0x000003d7,0x000003d2,0x000003d6,0x0007004f,
0x00000018,0x000003b2,0x000003ab,0x000003ab,0x00000000,0x00000003,0x0004003d,0x000000f0,
0x000003db,0x000000f2,0x00050057,0x0000001a,0x000003dd,0x000003db,0x000003b2,0x00050051,
0x00000006,0x000003de,0x000003dd,0x00000000,0x0004003d,0x000000f0,0x000003e0,0x000000f9,
0x0008000c,0x00000006,0x000003e2,0x00000001,0x00000032,0x000003de,0x000000f7,0x000000fc,
0x00050085,0x00000006,0x000003e3,0x000003e2,0x0000066f,0x00050050,0x00000018,0x000003e4,
0x000003e3,0x000000fc,0x00050057,0x0000001a,0x000003e5,0x000003e0,0x000003e4,0x0007004f,
0x00000018,0x000003b5,0x000003ab,0x000003ab,0x00000002,0x00000001,0x0004003d,0x000000f0,
0x000003e9,0x000000f2,0x00050057,0x0000001a,0x000003eb,0x000003e9,0x000003b5,0x00050051,
0x00000006,0x000003ec,0x000003eb,0x00000000,0x0004003d,0x000000f0,0x000003ee,0x000000f9,
0x0008000c,0x00000006,0x000003f0,0x00000001,0x00000032,0x000003ec,0x000000f7,0x000000fc,
0x00050085,0x00000006,0x000003f1,0x000003f0,0x0000066f,0x00050050,0x00000018,0x000003f2,
0x000003f1,0x000000fc,0x00050057,0x0000001a,0x000003f3,0x000003ee,0x000003f2,0x0007004f,
0x00000018,0x000003b8,0x000003ab,0x000003ab,0x00000002,0x00000003,0x0004003d,0x000000f0,
0x000003f7,0x000000f2,0x00050057,0x0000001a,0x000003f9,0x000003f7,0x000003b8,0x00050051,
0x00000006,0x000003fa,0x000003f9,0x00000000,0x0004003d,0x000000f0,0x000003fc,0x000000f9,
0x0008000c,0x00000006,0x000003fe,0x00000001,0x00000032,0x000003fa,0x000000f7,0x000000fc,
0x00050085,0x00000006,0x000003ff,0x000003fe,0x0000066f,0x00050050,0x00000018,0x00000400,
0x000003ff,0x000000fc,0x00050057,0x0000001a,0x00000401,0x000003fc,0x00000400,0x00050051,
0x00000006,0x000003bd,0x000003ad,0x00000001,0x00070050,0x0000001a,0x000003be,0x000003bd,
0x000003bd,0x000003bd,0x000003bd,0x0008000c,0x0000001a,0x000003bf,0x00000001,0x0000002e,
0x000003d7,0x000003e5,0x000003be,0x00050051,0x00000006,0x000003c3,0x000003ad,0x00000001,
0x00070050,0x0000001a,0x000003c4,0x000003c3,0x000003c3,0x000003c3,0x000003c3,0x0008000c,
0x0000001a,0x000003c5,0x00000001,0x0000002e,0x000003f3,0x00000401,0x000003c4,0x00050051,
0x00000006,0x000003c7,0x000003ad,0x00000000,0x00070050,0x0000001a,0x000003c8,0x000003c7,
0x000003c7,0x000003c7,0x000003c7,0x0008000c,0x0000001a,0x000003c9,0x00000001,0x0000002e,
0x000003bf,0x000003c5,0x000003c8,0x000200f9,0x0000034c,0x000200f8,0x0000033c,0x00050041,
0x00000086,0x0000033d,0x00000083,0x00000174,0x0004003d,0x00000006,0x0000033e,0x0000033d,
0x000500b4,0x0000003f,0x0000033f,0x0000033e,0x000001ac,0x000300f7,0x0000034b,0x00000000,
0x000400fa,0x0000033f,0x00000340,0x00000346,0x000200f8,0x00000340,0x000400d1,0x00000018,
0x00000408,0x0000028c,0x00050041,0x00000107,0x00000409,0x00000083,0x00000106,0x0004003d,
0x0000001a,0x0000040a,0x00000409,0x0007004f,0x00000018,0x0000040b,0x0000040a,0x0000040a,
0x00000002,0x00000003,0x00050085,0x00000018,0x0000040c,0x00000408,0x0000040b,0x0008000c,
0x00000018,0x0000040d,0x00000001,0x0000002b,0x0000040c,0x00000155,0x00000156,0x00050041,
0x00000107,0x0000040f,0x00000083,0x00000106,0x0004003d,0x0000001a,0x00000410,0x0000040f,
0x0007004f,0x00000018,0x00000411,0x00000410,0x00000410,0x00000002,0x00000003,0x0005008e,
0x00000018,0x00000414,0x0000040d,0x000000fc,0x0004007f,0x00000018,0x0000066d,0x00000414,
0x0008000c,0x00000018,0x00000415,0x00000001,0x00000032,0x0000028c,0x00000411,0x0000066d,
0x00050083,0x00000018,0x00000418,0x00000156,0x0000040d,0x0006000c,0x00000018,0x0000041a,
0x00000001,0x0000000a,0x00000415,0x0008000c,0x00000018,0x0000041b,0x00000001,0x00000031,
0x00000418,0x00000156,0x0000041a,0x0006000c,0x00000018,0x0000041d,0x00000001,0x00000008,
0x00000415,0x00050081,0x00000018,0x0000041f,0x0000041d,0x0000066e,0x00050081,0x00000018,
0x00000421,0x0000041f,0x0000041b,0x00050041,0x00000107,0x00000422,0x00000083,0x00000106,
0x0004003d,0x0000001a,0x00000423,0x00000422,0x0007004f,0x00000018,0x00000424,0x00000423,
0x00000423,0x00000000,0x00000001,0x00050085,0x00000018,0x00000425,0x00000421,0x00000424,
0x00050041,0x00000107,0x00000434,0x00000083,0x00000106,0x0004003d,0x0000001a,0x00000435,
0x00000434,0x0007004f,0x00000018,0x00000436,0x00000435,0x00000435,0x00000002,0x00000003,
0x0008000c,0x00000018,0x00000439,0x00000001,0x00000032,0x00000425,0x00000436,0x0000066e,
0x0006000c,0x00000018,0x0000043b,0x00000001,0x00000008,0x00000439,0x00050083,0x00000018,
0x0000043d,0x0000043b,0x0000066e,0x00050041,0x00000107,0x0000043e,0x00000083,0x00000106,
0x0004003d,0x0000001a,0x0000043f,0x0000043e,0x0007004f,0x00000018,0x00000440,0x0000043f,
0x0000043f,0x00000000,0x00000001,0x00050085,0x00000018,0x00000441,0x0000043d,0x00000440,
0x0006000c,0x00000018,0x00000443,0x00000001,0x00000008,0x00000439,0x00050081,0x00000018,
0x00000445,0x00000443,0x0000066e,0x00050041,0x00000107,0x00000446,0x00000083,0x00000106,
0x0004003d,0x0000001a,0x00000447,0x00000446,0x0007004f,0x00000018,0x00000448,0x00000447,
0x00000447,0x00000000,0x00000001,0x00050085,0x00000018,0x00000449,0x00000445,0x00000448,
0x00050051,0x00000006,0x0000044a,0x00000441,0x00000000,0x00050051,0x00000006,0x0000044b,
0x00000441,0x00000001,0x00050051,0x00000006,0x0000044c,0x00000449,0x00000000,0x00050051,
0x00000006,0x0000044d,0x00000449,0x00000001,0x00070050,0x0000001a,0x0000044e,0x0000044a,
0x0000044b,0x0000044c,0x0000044d,0x0006000c,0x00000018,0x00000450,0x00000001,0x0000000a,
0x00000439,0x0007004f,0x00000018,0x00000452,0x0000044e,0x0000044e,0x00000000,0x00000001,
0x0004003d,0x000000f0,0x00000470,0x000000f2,0x00050057,0x0000001a,0x00000472,0x00000470,
0x00000452,0x00050051,0x00000006,0x00000473,0x00000472,0x00000000,0x0004003d,0x000000f0,
0x00000475,0x000000f9,0x0008000c,0x00000006,0x00000477,0x00000001,0x00000032,0x00000473,
0x000000f7,0x000000fc,0x00050085,0x00000006,0x00000478,0x00000477,0x0000066f,0x00050050,
0x00000018,0x00000479,0x00000478,0x000000fc,0x00050057,0x0000001a,0x0000047a,0x00000475,
0x00000479,0x0007004f,0x00000018,0x00000455,0x0000044e,0x0000044e,0x00000000,0x00000003,
0x0004003d,0x000000f0,0x0000047e,0x000000f2,0x00050057,0x0000001a,0x00000480,0x0000047e,
0x00000455,0x00050051,0x00000006,0x00000481,0x00000480,0x00000000,0x0004003d,0x000000f0,
0x00000483,0x000000f9,0x0008000c,0x00000006,0x00000485,0x00000001,0x00000032,0x00000481,
0x000000f7,0x000000fc,0x00050085,0x00000006,0x00000486,0x00000485,0x0000066f,0x00050050,
0x00000018,0x00000487,0x00000486,0x000000fc,0x00050057,0x0000001a,0x00000488,0x00000483,
0x00000487,0x0007004f,0x00000018,0x00000458,0x0000044e,0x0000044e,0x00000002,0x00000001,
0x0004003d,0x000000f0,0x0000048c,0x000000f2,0x00050057,0x0000001a,0x0000048e,0x0000048c,
0x00000458,0x00050051,0x00000006,0x0000048f,0x0000048e,0x00000000,0x0004003d,0x000000f0,
0x00000491,0x000000f9,0x0008000c,0x00000006,0x00000493,0x00000001,0x00000032,0x0000048f,
0x000000f7,0x000000fc,0x00050085,0x00000006,0x00000494,0x00000493,0x0000066f,0x00050050,
0x00000018,0x00000495,0x00000494,0x000000fc,0x00050057,0x0000001a,0x00000496,0x00000491,
0x00000495,0x0007004f,0x00000018,0x0000045b,0x0000044e,0x0000044e,0x00000002,0x00000003,
0x0004003d,0x000000f0,0x0000049a,0x000000f2,0x00050057,0x0000001a,0x0000049c,0x0000049a,
0x0000045b,0x00050051,0x00000006,0x0000049d,0x0000049c,0x00000000,0x0004003d,0x000000f0,
0x0000049f,0x000000f9,0x0008000c,0x00000006,0x000004a1,0x00000001,0x00000032,0x0000049d,
0x000000f7,0x000000fc,0x00050085,0x00000006,0x000004a2,0x000004a1,0x0000066f,0x00050050,
0x00000018,0x000004a3,0x000004a2,0x000000fc,0x00050057,0x0000001a,0x000004a4,0x0000049f,
0x000004a3,0x00050051,0x00000006,0x00000460,0x00000450,0x00000001,0x00070050,0x0000001a,
0x00000461,0x00000460,0x00000460,0x00000460,0x00000460,0x0008000c,0x0000001a,0x00000462,
0x00000001,0x0000002e,0x0000047a,0x00000488,0x00000461,0x00050051,0x00000006,0x00000466,
0x00000450,0x00000001,0x00070050,0x0000001a,0x00000467,0x00000466,0x00000466,0x00000466,
0x00000466,0x0008000c,0x0000001a,0x00000468,0x00000001,0x0000002e,0x00000496,0x000004a4,
0x00000467,0x00050051,0x00000006,0x0000046a,0x00000450,0x00000000,0x00070050,0x0000001a,
0x0000046b,0x0000046a,0x0000046a,0x0000046a,0x0000046a,0x0008000c,0x0000001a,0x0000046c,
0x00000001,0x0000002e,0x00000462,0x00000468,0x0000046b,0x000200f9,0x0000034b,0x000200f8,
0x00000346,0x000200f9,0x0000034b,0x000200f8,0x0000034b,0x000700f5,0x0000001a,0x00000686,
0x0000046c,0x00000340,0x00000680,0x00000346,0x000200f9,0x0000034c,0x000200f8,0x0000034c,
0x000700f5,0x0000001a,0x00000685,0x000003c9,0x00000338,0x00000686,0x0000034b,0x000200f9,
0x0000034d,0x000200f8,0x0000034d,0x000700f5,0x0000001a,0x00000684,0x00000382,0x00000330,
0x00000685,0x0000034c,0x000200f9,0x0000034e,0x000200f8,0x0000034e,0x000700f5,0x0000001a,
0x00000683,0x0000032b,0x0000031f,0x00000684,0x0000034d,0x000200f9,0x0000034f,0x000200f8,
0x0000034f,0x000700f5,0x0000001a,0x00000682,0x0000031a,0x00000316,0x00000683,0x0000034e,
0x00050041,0x00000086,0x000002a8,0x00000083,0x000000a0,0x0004003d,0x00000006,0x000002a9,
0x000002a8,0x000500b4,0x0000003f,0x000002aa,0x000002a9,0x00000196,0x000300f7,0x000002b5,
0x00000000,0x000400fa,0x000002aa,0x000002ab,0x000002b5,0x000200f8,0x000002ab,0x0008004f,
0x0000000f,0x000002ad,0x00000682,0x00000682,0x00000000,0x00000001,0x00000002,0x0006000c,
0x0000000f,0x000004aa,0x00000001,0x00000004,0x000002ad,0x0007000c,0x0000000f,0x000004ab,
0x00000001,0x0000001a,0x000004aa,0x00000067,0x00050083,0x0000000f,0x000004ad,0x000004ab,
0x00000671,0x0007000c,0x0000000f,0x000004ae,0x00000001,0x00000028,0x000004ad,0x0000006d,
0x0006000c,0x0000000f,0x000004b0,0x00000001,0x00000004,0x000002ad,0x0007000c,0x0000000f,
0x000004b1,0x00000001,0x0000001a,0x000004b0,0x00000067,0x0005008e,0x0000000f,0x000004b2,
0x000004b1,0x00000071,0x00050083,0x0000000f,0x000004b4,0x00000672,0x000004b2,0x00050088,
0x0000000f,0x000004b7,0x000004ae,0x000004b4,0x0006000c,0x0000000f,0x000004b8,0x00000001,
0x00000004,0x000004b7,0x0007000c,0x0000000f,0x000004b9,0x00000001,0x0000001a,0x000004b8,
0x0000007e,0x0005008e,0x0000000f,0x000004ba,0x000004b9,0x00000078,0x00050041,0x00000086,
0x000004bb,0x00000083,0x00000085,0x0004003d,0x00000006,0x000004bc,0x000004bb,0x00060050,
0x0000000f,0x000004bd,0x000004bc,0x000004bc,0x000004bc,0x00050088,0x0000000f,0x000004be,
0x000004ba,0x000004bd,0x00050051,0x00000006,0x000002b0,0x000004be,0x00000000,0x00060052,
0x0000001a,0x00000619,0x000002b0,0x00000682,0x00000000,0x00050051,0x00000006,0x000002b2,
0x000004be,0x00000001,0x00060052,0x0000001a,0x0000061b,0x000002b2,0x00000619,0x00000001,
0x00050051,0x00000006,0x000002b4,0x000004be,0x00000002,0x00060052,0x0000001a,0x0000061d,
0x000002b4,0x0000061b,0x00000002,0x000200f9,0x000002b5,0x000200f8,0x000002b5,0x000700f5,
0x0000001a,0x00000687,0x00000682,0x0000034f,0x0000061d,0x000002ab,0x00050041,0x00000086,
0x000002b6,0x00000083,0x0000008d,0x0004003d,0x00000006,0x000002b7,0x000002b6,0x000500b7,
0x0000003f,0x000002b8,0x000002b7,0x0000006c,0x000300f7,0x000002c3,0x00000000,0x000400fa,
0x000002b8,0x000002b9,0x000002c3,0x000200f8,0x000002b9,0x0008004f,0x0000000f,0x000002bb,
0x00000687,0x00000687,0x00000000,0x00000001,0x00000002,0x00050041,0x00000086,0x000004c3,
0x00000083,0x0000008d,0x0004003d,0x00000006,0x000004c4,0x000004c3,0x000500b4,0x0000003f,
0x000004c5,0x000004c4,0x00000090,0x000300f7,0x000004f9,0x00000000,0x000400fa,0x000004c5,
0x000004c6,0x000004cb,0x000200f8,0x000004c6,0x00050041,0x00000086,0x000004c7,0x00000083,
0x00000094,0x0004003d,0x00000006,0x000004c8,0x000004c7,0x0005008e,0x0000000f,0x000004ca,
0x000002bb,0x000004c8,0x000200f9,0x000004f9,0x000200f8,0x000004cb,0x00050041,0x00000086,
0x000004cc,0x00000083,0x0000008d,0x0004003d,0x00000006,0x000004cd,0x000004cc,0x000500b4,
0x0000003f,0x000004ce,0x000004cd,0x0000009c,0x000300f7,0x000004f8,0x00000000,0x000400fa,
0x000004ce,0x000004cf,0x000004f8,0x000200f8,0x000004cf,0x00050041,0x00000086,0x000004d0,
0x00000083,0x000000a0,0x0004003d,0x00000006,0x000004d1,0x000004d0,0x000500b4,0x0000003f,
0x000004d2,0x000004d1,0x0000009c,0x000300f7,0x000004d6,0x00000000,0x000400fa,0x000004d2,
0x000004d3,0x000004d6,0x000200f8,0x000004d3,0x00050090,0x0000000f,0x000004d5,0x000002bb,
0x000000b4,0x000200f9,0x000004d6,0x000200f8,0x000004d6,0x000700f5,0x0000000f,0x00000688,
0x000002bb,0x000004cf,0x000004d5,0x000004d3,0x00050051,0x00000006,0x000004d8,0x00000688,
0x00000000,0x00050051,0x00000006,0x000004da,0x00000688,0x00000001,0x00050051,0x00000006,
0x000004dc,0x00000688,0x00000002,0x0007000c,0x00000006,0x000004dd,0x00000001,0x00000028,
0x000004da,0x000004dc,0x0007000c,0x00000006,0x000004de,0x00000001,0x00000028,0x000004d8,
0x000004dd,0x000500ba,0x0000003f,0x000004e0,0x000004de,0x0000006c,0x000300f7,0x000004f0,
0x00000000,0x000400fa,0x000004e0,0x000004e1,0x000004f0,0x000200f8,0x000004e1,0x00050041,
0x00000086,0x000004e2,0x00000083,0x00000094,0x0004003d,0x00000006,0x000004e3,0x000004e2,
0x0008000c,0x00000006,0x000004e6,0x00000001,0x00000032,0x000004e3,0x000004de,0x00000090,
0x00050041,0x00000086,0x000004e7,0x00000083,0x000000cd,0x0004003d,0x00000006,0x000004e8,
0x000004e7,0x0008000c,0x00000006,0x000004eb,0x00000001,0x00000032,0x000004e8,0x000004de,
0x00000090,0x00050088,0x00000006,0x000004ec,0x000004e6,0x000004eb,0x0005008e,0x0000000f,
0x000004ef,0x00000688,0x000004ec,0x000200f9,0x000004f0,0x000200f8,0x000004f0,0x000700f5,
0x0000000f,0x00000689,0x00000688,0x000004d6,0x000004ef,0x000004e1,0x00050041,0x00000086,
0x000004f1,0x00000083,0x000000a0,0x0004003d,0x00000006,0x000004f2,0x000004f1,0x000500b4,
0x0000003f,0x000004f3,0x000004f2,0x0000009c,0x000300f7,0x000004f7,0x00000000,0x000400fa,
0x000004f3,0x000004f4,0x000004f7,0x000200f8,0x000004f4,0x00050090,0x0000000f,0x000004f6,
0x00000689,0x000000e9,0x000200f9,0x000004f7,0x000200f8,0x000004f7,0x000700f5,0x0000000f,
0x0000068c,0x00000689,0x000004f0,0x000004f6,0x000004f4,0x000200f9,0x000004f8,0x000200f8,
0x000004f8,0x000700f5,0x0000000f,0x0000068b,0x000002bb,0x000004cb,0x0000068c,0x000004f7,
0x000200f9,0x000004f9,0x000200f8,0x000004f9,0x000700f5,0x0000000f,0x0000068a,0x000004ca,
0x000004c6,0x0000068b,0x000004f8,0x00050051,0x00000006,0x000002be,0x0000068a,0x00000000,
0x00060052,0x0000001a,0x00000622,0x000002be,0x00000687,0x00000000,0x00050051,0x00000006,
0x000002c0,0x0000068a,0x00000001,0x00060052,0x0000001a,0x00000624,0x000002c0,0x00000622,
0x00000001,0x00050051,0x00000006,0x000002c2,0x0000068a,0x00000002,0x00060052,0x0000001a,
0x00000626,0x000002c2,0x00000624,0x00000002,0x000200f9,0x000002c3,0x000200f8,0x000002c3,
0x000700f5,0x0000001a,0x00000692,0x00000687,0x000002b5,0x00000626,0x000004f9,0x00050041,
0x00000086,0x000002c4,0x00000083,0x000000a0,0x0004003d,0x00000006,0x000002c5,0x000002c4,
0x000500b4,0x0000003f,0x000002c6,0x000002c5,0x00000090,0x000300f7,0x00000304,0x00000000,
0x000400fa,0x000002c6,0x000002c7,0x000002d4,0x000200f8,0x000002c7,0x0008004f,0x0000000f,
0x000002c9,0x00000692,0x00000692,0x00000000,0x00000001,0x00000002,0x00050041,0x00000086,
0x00000501,0x00000083,0x000001d4,0x0004003d,0x00000006,0x00000502,0x00000501,0x000500b7,
0x0000003f,0x00000503,0x00000502,0x0000006c,0x000300f7,0x00000511,0x00000000,0x000400fa,
0x00000503,0x00000504,0x00000511,0x000200f8,0x00000504,0x00050051,0x00000006,0x00000506,
0x00000692,0x00000000,0x000500bc,0x0000003f,0x0000051a,0x00000506,0x0000003e,0x000300f7,
0x00000524,0x00000000,0x000400fa,0x0000051a,0x0000051b,0x0000051e,0x000200f8,0x0000051b,
0x00050085,0x00000006,0x0000051d,0x00000506,0x0000067e,0x000200f9,0x00000524,0x000200f8,
0x0000051e,0x00050081,0x00000006,0x00000520,0x00000506,0x00000048,0x0006000c,0x00000006,
0x00000521,0x00000001,0x00000004,0x00000520,0x00050085,0x00000006,0x00000522,0x00000521,
0x0000067d,0x0007000c,0x00000006,0x00000523,0x00000001,0x0000001a,0x00000522,0x0000004d,
0x000200f9,0x00000524,0x000200f8,0x00000524,0x000700f5,0x00000006,0x000006a9,0x0000051d,
0x0000051b,0x00000523,0x0000051e,0x00050051,0x00000006,0x0000050a,0x00000692,0x00000001,
0x000500bc,0x0000003f,0x00000529,0x0000050a,0x0000003e,0x000300f7,0x00000533,0x00000000,
0x000400fa,0x00000529,0x0000052a,0x0000052d,0x000200f8,0x0000052a,0x00050085,0x00000006,
0x0000052c,0x0000050a,0x0000067e,0x000200f9,0x00000533,0x000200f8,0x0000052d,0x00050081,
0x00000006,0x0000052f,0x0000050a,0x00000048,0x0006000c,0x00000006,0x00000530,0x00000001,
0x00000004,0x0000052f,0x00050085,0x00000006,0x00000531,0x00000530,0x0000067d,0x0007000c,
0x00000006,0x00000532,0x00000001,0x0000001a,0x00000531,0x0000004d,0x000200f9,0x00000533,
0x000200f8,0x00000533,0x000700f5,0x00000006,0x000006ab,0x0000052c,0x0000052a,0x00000532,
0x0000052d,0x00050051,0x00000006,0x0000050e,0x00000692,0x00000002,0x000500bc,0x0000003f,
0x00000538,0x0000050e,0x0000003e,0x000300f7,0x00000542,0x00000000,0x000400fa,0x00000538,
0x00000539,0x0000053c,0x000200f8,0x00000539,0x00050085,0x00000006,0x0000053b,0x0000050e,
0x0000067e,0x000200f9,0x00000542,0x000200f8,0x0000053c,0x00050081,0x00000006,0x0000053e,
0x0000050e,0x00000048,0x0006000c,0x00000006,0x0000053f,0x00000001,0x00000004,0x0000053e,
0x00050085,0x00000006,0x00000540,0x0000053f,0x0000067d,0x0007000c,0x00000006,0x00000541,
0x00000001,0x0000001a,0x00000540,0x0000004d,0x000200f9,0x00000542,0x000200f8,0x00000542,
0x000700f5,0x00000006,0x000006ad,0x0000053b,0x00000539,0x00000541,0x0000053c,0x00060050,
0x0000000f,0x000006b9,0x000006a9,0x000006ab,0x000006ad,0x000200f9,0x00000511,0x000200f8,
0x00000511,0x000700f5,0x0000000f,0x000006af,0x000002c9,0x000002c7,0x000006b9,0x00000542,
0x00050041,0x00000086,0x00000513,0x00000083,0x000001c4,0x0004003d,0x00000006,0x00000514,
0x00000513,0x0005008e,0x0000000f,0x00000515,0x000006af,0x00000514,0x00050051,0x00000006,
0x000002cc,0x00000515,0x00000000,0x00050051,0x00000006,0x000002ce,0x00000515,0x00000001,
0x00050051,0x00000006,0x000002d0,0x00000515,0x00000002,0x00050051,0x00000006,0x000002d2,
0x00000692,0x00000003,0x00070050,0x0000001a,0x0000067f,0x000002cc,0x000002ce,0x000002d0,
0x000002d2,0x000200f9,0x00000304,0x000200f8,0x000002d4,0x00050041,0x00000086,0x000002d5,
0x00000083,0x000000a0,0x0004003d,0x00000006,0x000002d6,0x000002d5,0x000500b4,0x0000003f,
0x000002d7,0x000002d6,0x0000009c,0x000300f7,0x00000303,0x00000000,0x000400fa,0x000002d7,
0x000002d8,0x000002e5,0x000200f8,0x000002d8,0x0008004f,0x0000000f,0x000002da,0x00000692,
0x00000692,0x00000000,0x00000001,0x00000002,0x00050041,0x00000086,0x0000054b,0x00000083,
0x000001c4,0x0004003d,0x00000006,0x0000054c,0x0000054b,0x0005008e,0x0000000f,0x0000054d,
0x000002da,0x0000054c,0x00050041,0x00000086,0x0000054e,0x00000083,0x000001d4,0x0004003d,
0x00000006,0x0000054f,0x0000054e,0x000500b7,0x0000003f,0x00000550,0x0000054f,0x0000006c,
0x000400a8,0x0000003f,0x00000551,0x00000550,0x000300f7,0x00000563,0x00000000,0x000400fa,
0x00000551,0x00000552,0x00000563,0x000200f8,0x00000552,0x00050051,0x00000006,0x00000554,
0x0000054d,0x00000000,0x000500bc,0x0000003f,0x00000568,0x00000554,0x00000053,0x000300f7,
0x00000572,0x00000000,0x000400fa,0x00000568,0x00000569,0x0000056c,0x000200f8,0x00000569,
0x00050085,0x00000006,0x0000056b,0x00000554,0x00000044,0x000200f9,0x00000572,0x000200f8,
0x0000056c,0x0006000c,0x00000006,0x0000056e,0x00000001,0x00000004,0x00000554,0x0007000c,
0x00000006,0x0000056f,0x00000001,0x0000001a,0x0000056e,0x0000005c,0x0008000c,0x00000006,
0x00000571,0x00000001,0x00000032,0x0000056f,0x0000004b,0x00000681,0x000200f9,0x00000572,
0x000200f8,0x00000572,0x000700f5,0x00000006,0x0000069e,0x0000056b,0x00000569,0x00000571,
0x0000056c,0x00050051,0x00000006,0x00000558,0x0000054d,0x00000001,0x000500bc,0x0000003f,
0x00000577,0x00000558,0x00000053,0x000300f7,0x00000581,0x00000000,0x000400fa,0x00000577,
0x00000578,0x0000057b,0x000200f8,0x00000578,0x00050085,0x00000006,0x0000057a,0x00000558,
0x00000044,0x000200f9,0x00000581,0x000200f8,0x0000057b,0x0006000c,0x00000006,0x0000057d,
0x00000001,0x00000004,0x00000558,0x0007000c,0x00000006,0x0000057e,0x00000001,0x0000001a,
0x0000057d,0x0000005c,0x0008000c,0x00000006,0x00000580,0x00000001,0x00000032,0x0000057e,
0x0000004b,0x00000681,0x000200f9,0x00000581,0x000200f8,0x00000581,0x000700f5,0x00000006,
0x000006a0,0x0000057a,0x00000578,0x00000580,0x0000057b,0x00050051,0x00000006,0x0000055c,
0x0000054d,0x00000002,0x000500bc,0x0000003f,0x00000586,0x0000055c,0x00000053,0x000300f7,
0x00000590,0x00000000,0x000400fa,0x00000586,0x00000587,0x0000058a,0x000200f8,0x00000587,
0x00050085,0x00000006,0x00000589,0x0000055c,0x00000044,0x000200f9,0x00000590,0x000200f8,
0x0000058a,0x0006000c,0x00000006,0x0000058c,0x00000001,0x00000004,0x0000055c,0x0007000c,
0x00000006,0x0000058d,0x00000001,0x0000001a,0x0000058c,0x0000005c,0x0008000c,0x00000006,
0x0000058f,0x00000001,0x00000032,0x0000058d,0x0000004b,0x00000681,0x000200f9,0x00000590,
0x000200f8,0x00000590,0x000700f5,0x00000006,0x000006a2,0x00000589,0x00000587,0x0000058f,
0x0000058a,0x00060050,0x0000000f,0x000006b8,0x0000069e,0x000006a0,0x000006a2,0x0008000c,
0x0000000f,0x00000562,0x00000001,0x0000002b,0x000006b8,0x0000006d,0x00000677,0x000200f9,
0x00000563,0x000200f8,0x00000563,0x000700f5,0x0000000f,0x000006a4,0x0000054d,0x000002d8,
0x00000562,0x00000590,0x00050051,0x00000006,0x000002dd,0x000006a4,0x00000000,0x00050051,
0x00000006,0x000002df,0x000006a4,0x00000001,0x00050051,0x00000006,0x000002e1,0x000006a4,
0x00000002,0x00050051,0x00000006,0x000002e3,0x00000692,0x00000003,0x00070050,0x0000001a,
0x0000067c,0x000002dd,0x000002df,0x000002e1,0x000002e3,0x000200f9,0x00000303,0x000200f8,
0x000002e5,0x00050041,0x00000086,0x000002e6,0x00000083,0x000000a0,0x0004003d,0x00000006,
0x000002e7,0x000002e6,0x000500b4,0x0000003f,0x000002e8,0x000002e7,0x00000196,0x000300f7,
0x00000302,0x00000000,0x000400fa,0x000002e8,0x000002e9,0x000002ff,0x000200f8,0x000002e9,
0x0008004f,0x0000000f,0x000002eb,0x00000692,0x00000692,0x00000000,0x00000001,0x00000002,
0x00050090,0x0000000f,0x000002ec,0x000002eb,0x000000e9,0x00050051,0x00000006,0x000002ee,
0x000002ec,0x00000000,0x00060052,0x0000001a,0x0000064c,0x000002ee,0x000006ba,0x00000000,
0x00050051,0x00000006,0x000002f0,0x000002ec,0x00000001,0x00060052,0x0000001a,0x0000064e,
0x000002f0,0x0000064c,0x00000001,0x00050051,0x00000006,0x000002f2,0x000002ec,0x00000002,
0x00060052,0x0000001a,0x00000650,0x000002f2,0x0000064e,0x00000002,0x0008004f,0x0000000f,
0x000002f4,0x00000650,0x00000650,0x00000000,0x00000001,0x00000002,0x00050041,0x00000086,
0x00000599,0x00000083,0x000001c4,0x0004003d,0x00000006,0x0000059a,0x00000599,0x0005008e,
0x0000000f,0x0000059b,0x000002f4,0x0000059a,0x00050041,0x00000086,0x0000059c,0x00000083,
0x000001d4,0x0004003d,0x00000006,0x0000059d,0x0000059c,0x000500b7,0x0000003f,0x0000059e,
0x0000059d,0x0000006c,0x000400a8,0x0000003f,0x0000059f,0x0000059e,0x000300f7,0x000005b1,
0x00000000,0x000400fa,0x0000059f,0x000005a0,0x000005b1,0x000200f8,0x000005a0,0x00050051,
0x00000006,0x000005a2,0x0000059b,0x00000000,0x000500bc,0x0000003f,0x000005b6,0x000005a2,
0x00000053,0x000300f7,0x000005c0,0x00000000,0x000400fa,0x000005b6,0x000005b7,0x000005ba,
0x000200f8,0x000005b7,0x00050085,0x00000006,0x000005b9,0x000005a2,0x00000044,0x000200f9,
0x000005c0,0x000200f8,0x000005ba,0x0006000c,0x00000006,0x000005bc,0x00000001,0x00000004,
0x000005a2,0x0007000c,0x00000006,0x000005bd,0x00000001,0x0000001a,0x000005bc,0x0000005c,
0x0008000c,0x00000006,0x000005bf,0x00000001,0x00000032,0x000005bd,0x0000004b,0x00000681,
0x000200f9,0x000005c0,0x000200f8,0x000005c0,0x000700f5,0x00000006,0x00000693,0x000005b9,
0x000005b7,0x000005bf,0x000005ba,0x00050051,0x00000006,0x000005a6,0x0000059b,0x00000001,
0x000500bc,0x0000003f,0x000005c5,0x000005a6,0x00000053,0x000300f7,0x000005cf,0x00000000,
0x000400fa,0x000005c5,0x000005c6,0x000005c9,0x000200f8,0x000005c6,0x00050085,0x00000006,
0x000005c8,0x000005a6,0x00000044,0x000200f9,0x000005cf,0x000200f8,0x000005c9,0x0006000c,
0x00000006,0x000005cb,0x00000001,0x00000004,0x000005a6,0x0007000c,0x00000006,0x000005cc,
0x00000001,0x0000001a,0x000005cb,0x0000005c,0x0008000c,0x00000006,0x000005ce,0x00000001,
0x00000032,0x000005cc,0x0000004b,0x00000681,0x000200f9,0x000005cf,0x000200f8,0x000005cf,
0x000700f5,0x00000006,0x00000695,0x000005c8,0x000005c6,0x000005ce,0x000005c9,0x00050051,
0x00000006,0x000005aa,0x0000059b,0x00000002,0x000500bc,0x0000003f,0x000005d4,0x000005aa,
0x00000053,0x000300f7,0x000005de,0x00000000,0x000400fa,0x000005d4,0x000005d5,0x000005d8,
0x000200f8,0x000005d5,0x00050085,0x00000006,0x000005d7,0x000005aa,0x00000044,0x000200f9,
0x000005de,0x000200f8,0x000005d8,0x0006000c,0x00000006,0x000005da,0x00000001,0x00000004,
0x000005aa,0x0007000c,0x00000006,0x000005db,0x00000001,0x0000001a,0x000005da,0x0000005c,
0x0008000c,0x00000006,0x000005dd,0x00000001,0x00000032,0x000005db,0x0000004b,0x00000681,
0x000200f9,0x000005de,0x000200f8,0x000005de,0x000700f5,0x00000006,0x00000697,0x000005d7,
0x000005d5,0x000005dd,0x000005d8,0x00060050,0x0000000f,0x000006b7,0x00000693,0x00000695,
0x00000697,0x0008000c,0x0000000f,0x000005b0,0x00000001,0x0000002b,0x000006b7,0x0000006d,
0x00000677,0x000200f9,0x000005b1,0x000200f8,0x000005b1,0x000700f5,0x0000000f,0x00000699,
0x0000059b,0x000002e9,0x000005b0,0x000005de,0x00050051,0x00000006,0x000002f7,0x00000699,
0x00000000,0x00050051,0x00000006,0x000002f9,0x00000699,0x00000001,0x00050051,0x00000006,
0x000002fb,0x00000699,0x00000002,0x00050051,0x00000006,0x000002fd,0x00000692,0x00000003,
0x00070050,0x0000001a,0x00000678,0x000002f7,0x000002f9,0x000002fb,0x000002fd,0x000200f9,
0x00000302,0x000200f8,0x000002ff,0x0008004f,0x0000000f,0x000005e4,0x00000692,0x00000692,
0x00000000,0x00000001,0x00000002,0x00050041,0x00000086,0x000005e5,0x00000083,0x000001c4,
0x0004003d,0x00000006,0x000005e6,0x000005e5,0x0005008e,0x0000000f,0x000005e7,0x000005e4,
0x000005e6,0x00050051,0x00000006,0x000005e9,0x000005e7,0x00000000,0x00050051,0x00000006,
0x000005eb,0x000005e7,0x00000001,0x00050051,0x00000006,0x000005ed,0x000005e7,0x00000002,
0x00050051,0x00000006,0x000005ef,0x00000692,0x00000003,0x00070050,0x0000001a,0x00000673,
0x000005e9,0x000005eb,0x000005ed,0x000005ef,0x000200f9,0x00000302,0x000200f8,0x00000302,
0x000700f5,0x0000001a,0x000006b6,0x00000678,0x000005b1,0x00000673,0x000002ff,0x000200f9,
0x00000303,0x000200f8,0x00000303,0x000700f5,0x0000001a,0x000006b5,0x0000067c,0x00000563,
0x000006b6,0x00000302,0x000200f9,0x00000304,0x000200f8,0x00000304,0x000700f5,0x0000001a,
0x000006b4,0x0000067f,0x00000511,0x000006b5,0x00000303,0x00050085,0x0000001a,0x00000308,
0x000006b4,0x0000028f,0x0003003e,0x00000292,0x00000308,0x000100fd,0x00010038
};

View File

@@ -1,7 +1,7 @@
// 1113.1.1
#pragma once
const uint32_t VULKAN_PixelShader_Colors[] = {
0x07230203,0x00010000,0x0008000b,0x000000a3,0x00000000,0x00020011,0x00000001,0x0006000b,
0x07230203,0x00010000,0x0008000b,0x000000a5,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000049,0x0000004d,0x00030010,
0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,0x6e69616d,
@@ -31,13 +31,13 @@ const uint32_t VULKAN_PixelShader_Colors[] = {
0x0004002b,0x0000001b,0x0000001c,0x00000003,0x00040020,0x0000001d,0x00000002,0x00000006,
0x0004002b,0x00000006,0x00000033,0x3f800000,0x00040020,0x0000003f,0x00000001,0x00000007,
0x0004003b,0x0000003f,0x00000049,0x00000001,0x00040020,0x0000004c,0x00000003,0x00000007,
0x0004003b,0x0000004c,0x0000004d,0x00000003,0x0006002c,0x00000015,0x000000a1,0x00000033,
0x0004003b,0x0000004c,0x0000004d,0x00000003,0x0006002c,0x00000015,0x000000a3,0x00000033,
0x00000033,0x00000033,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
0x00000005,0x0004003d,0x00000007,0x0000004a,0x00000049,0x00050041,0x0000001d,0x00000080,
0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000081,0x00000080,0x0005008e,0x00000015,
0x00000082,0x000000a1,0x00000081,0x00050051,0x00000006,0x00000084,0x00000082,0x00000000,
0x00050051,0x00000006,0x00000086,0x00000082,0x00000001,0x00050051,0x00000006,0x00000088,
0x00000082,0x00000002,0x00070050,0x00000007,0x000000a2,0x00000084,0x00000086,0x00000088,
0x00000033,0x00050085,0x00000007,0x0000007a,0x000000a2,0x0000004a,0x0003003e,0x0000004d,
0x0000007a,0x000100fd,0x00010038
0x00000005,0x0004003d,0x00000007,0x0000004a,0x00000049,0x00050041,0x0000001d,0x00000082,
0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000083,0x00000082,0x0005008e,0x00000015,
0x00000084,0x000000a3,0x00000083,0x00050051,0x00000006,0x00000086,0x00000084,0x00000000,
0x00050051,0x00000006,0x00000088,0x00000084,0x00000001,0x00050051,0x00000006,0x0000008a,
0x00000084,0x00000002,0x00070050,0x00000007,0x000000a4,0x00000086,0x00000088,0x0000008a,
0x00000033,0x00050085,0x00000007,0x0000007c,0x000000a4,0x0000004a,0x0003003e,0x0000004d,
0x0000007c,0x000100fd,0x00010038
};

View File

@@ -19,7 +19,9 @@ static const float TONEMAP_CHROME = 2;
static const float TEXTURETYPE_NONE = 0;
static const float TEXTURETYPE_RGB = 1;
static const float TEXTURETYPE_RGB_PIXELART = 2;
static const float TEXTURETYPE_PALETTE = 3;
static const float TEXTURETYPE_PALETTE_NEAREST = 3;
static const float TEXTURETYPE_PALETTE_LINEAR = 4;
static const float TEXTURETYPE_PALETTE_PIXELART = 5;
static const float INPUTTYPE_UNSPECIFIED = 0;
static const float INPUTTYPE_SRGB = 1;
@@ -109,21 +111,48 @@ float3 ApplyTonemap(float3 v)
return v;
}
float2 GetPixelArtUV(PixelShaderInput input)
float4 SamplePaletteNearest(float2 uv)
{
float index = texture0.Sample(sampler0, uv).r * 255;
return texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
}
// Implementation with thanks from bgolus:
// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8
float4 SamplePaletteLinear(float2 uv)
{
// scale & offset uvs to integer values at texel centers
float2 uv_texels = uv * texel_size.zw + 0.5;
// get uvs for the center of the 4 surrounding texels by flooring
float4 uv_min_max = float4((floor(uv_texels) - 0.5) * texel_size.xy, (floor(uv_texels) + 0.5) * texel_size.xy);
// blend factor
float2 uv_frac = frac(uv_texels);
// sample all 4 texels
float4 texelA = SamplePaletteNearest(uv_min_max.xy);
float4 texelB = SamplePaletteNearest(uv_min_max.xw);
float4 texelC = SamplePaletteNearest(uv_min_max.zy);
float4 texelD = SamplePaletteNearest(uv_min_max.zw);
// bilinear interpolation
return lerp(lerp(texelA, texelB, uv_frac.y), lerp(texelC, texelD, uv_frac.y), uv_frac.x);
}
float2 GetPixelArtUV(float2 uv)
{
// box filter size in texel units
float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
float2 boxSize = clamp(fwidth(uv) * texel_size.zw, 1e-5, 1);
// scale uv by texture size to get texel coordinate
float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
float2 tx = uv * texel_size.zw - 0.5 * boxSize;
// compute offset for pixel-sized box filter
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
// compute bilinear sample uv coordinates
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
return uv;
return (floor(tx) + 0.5 + txOffset) * texel_size.xy;
}
float4 GetInputColor(PixelShaderInput input)
@@ -133,16 +162,20 @@ float4 GetInputColor(PixelShaderInput input)
if (texture_type == TEXTURETYPE_RGB) {
rgba = texture0.Sample(sampler0, input.tex);
} else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
float2 uv = GetPixelArtUV(input);
float2 uv = GetPixelArtUV(input.tex);
rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
} else if (texture_type == TEXTURETYPE_PALETTE) {
float index = texture0.Sample(sampler0, input.tex).r * 255;
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
} else if (texture_type == TEXTURETYPE_PALETTE_NEAREST) {
rgba = SamplePaletteNearest(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_LINEAR) {
rgba = SamplePaletteLinear(input.tex);
} else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
float2 uv = GetPixelArtUV(input.tex);
rgba = SamplePaletteLinear(uv);
} else {
// Error!
rgba.r = 1.0;
rgba.g = 0.0;
rgba.b = 0.0;
rgba.b = 1.0;
rgba.a = 1.0;
}
return rgba;

View File

@@ -1,7 +1,7 @@
// 1113.1.1
#pragma once
const uint32_t VULKAN_PixelShader_Textures[] = {
0x07230203,0x00010000,0x0008000b,0x000000aa,0x00000000,0x00020011,0x00000001,0x0006000b,
0x07230203,0x00010000,0x0008000b,0x000000ac,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000004c,0x0000004f,0x00000053,
0x00030010,0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,
@@ -40,13 +40,13 @@ const uint32_t VULKAN_PixelShader_Textures[] = {
0x00000052,0x00000003,0x00000007,0x0004003b,0x00000052,0x00000053,0x00000003,0x00050036,
0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x0000000d,
0x0000004d,0x0000004c,0x0004003d,0x00000007,0x00000050,0x0000004f,0x0004003d,0x00000034,
0x0000007a,0x00000036,0x00050057,0x00000007,0x0000007d,0x0000007a,0x0000004d,0x0008004f,
0x00000015,0x00000086,0x0000007d,0x0000007d,0x00000000,0x00000001,0x00000002,0x00050041,
0x0000001d,0x00000087,0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000088,0x00000087,
0x0005008e,0x00000015,0x00000089,0x00000086,0x00000088,0x00050051,0x00000006,0x0000008b,
0x00000089,0x00000000,0x00050051,0x00000006,0x0000008d,0x00000089,0x00000001,0x00050051,
0x00000006,0x0000008f,0x00000089,0x00000002,0x00050051,0x00000006,0x00000091,0x0000007d,
0x00000003,0x00070050,0x00000007,0x000000a9,0x0000008b,0x0000008d,0x0000008f,0x00000091,
0x00050085,0x00000007,0x00000081,0x000000a9,0x00000050,0x0003003e,0x00000053,0x00000081,
0x0000007c,0x00000036,0x00050057,0x00000007,0x0000007f,0x0000007c,0x0000004d,0x0008004f,
0x00000015,0x00000088,0x0000007f,0x0000007f,0x00000000,0x00000001,0x00000002,0x00050041,
0x0000001d,0x00000089,0x0000001a,0x0000001c,0x0004003d,0x00000006,0x0000008a,0x00000089,
0x0005008e,0x00000015,0x0000008b,0x00000088,0x0000008a,0x00050051,0x00000006,0x0000008d,
0x0000008b,0x00000000,0x00050051,0x00000006,0x0000008f,0x0000008b,0x00000001,0x00050051,
0x00000006,0x00000091,0x0000008b,0x00000002,0x00050051,0x00000006,0x00000093,0x0000007f,
0x00000003,0x00070050,0x00000007,0x000000ab,0x0000008d,0x0000008f,0x00000091,0x00000093,
0x00050085,0x00000007,0x00000083,0x000000ab,0x00000050,0x0003003e,0x00000053,0x00000083,
0x000100fd,0x00010038
};

View File

@@ -104,6 +104,7 @@ int main(int argc, char *argv[])
int i;
int frames;
Uint64 then, now;
SDL_ScaleMode scale_mode = SDL_SCALEMODE_PIXELART;
/* Initialize test framework */
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
@@ -112,9 +113,35 @@ int main(int argc, char *argv[])
}
/* Parse commandline */
if (!SDLTest_CommonDefaultArgs(state, argc, argv)) {
for (i = 1; i < argc;) {
int consumed;
consumed = SDLTest_CommonArg(state, i);
if (consumed == 0) {
consumed = -1;
if (SDL_strcasecmp(argv[i], "--nearest") == 0) {
scale_mode = SDL_SCALEMODE_NEAREST;
consumed = 1;
} else if (SDL_strcasecmp(argv[i], "--linear") == 0) {
scale_mode = SDL_SCALEMODE_LINEAR;
consumed = 1;
} else if (SDL_strcasecmp(argv[i], "--pixelart") == 0) {
scale_mode = SDL_SCALEMODE_PIXELART;
consumed = 1;
}
}
if (consumed < 0) {
static const char *options[] = {
"[--nearest]",
"[--linear]",
"[--pixelart]",
NULL
};
SDLTest_CommonLogUsage(state, argv[0], options);
return 1;
}
i += consumed;
}
if (!SDLTest_CommonInit(state)) {
quit(1);
@@ -132,7 +159,8 @@ int main(int argc, char *argv[])
quit(2);
}
SDL_GetTextureSize(drawstate->sprite, &drawstate->sprite_rect.w, &drawstate->sprite_rect.h);
SDL_SetTextureScaleMode(drawstate->sprite, SDL_SCALEMODE_PIXELART);
SDL_SetTextureScaleMode(drawstate->background, scale_mode);
SDL_SetTextureScaleMode(drawstate->sprite, scale_mode);
drawstate->scale_direction = 1;
}