diff options
Diffstat (limited to '')
87 files changed, 9439 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/blank_15000x10000.png b/dom/canvas/test/webgl-mochitest/blank_15000x10000.png Binary files differnew file mode 100644 index 0000000000..2b72ff9180 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/blank_15000x10000.png diff --git a/dom/canvas/test/webgl-mochitest/driver-info.js b/dom/canvas/test/webgl-mochitest/driver-info.js new file mode 100644 index 0000000000..5e68ce50ba --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/driver-info.js @@ -0,0 +1,139 @@ +DriverInfo = (function () { + // --------------------------------------------------------------------------- + // Debug info handling + + function info(str) { + window.console.log("Info: " + str); + } + + // --------------------------------------------------------------------------- + // OS and driver identification + // Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html + function detectDriverInfo() { + var canvas = document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + + var type = ""; + var gl = null; + try { + gl = canvas.getContext("experimental-webgl"); + } catch (e) {} + + if (!gl) { + info("Failed to create WebGL context for querying driver info."); + throw "WebGL failed"; + } + + var ext = gl.getExtension("WEBGL_debug_renderer_info"); + if (!ext) { + throw "WEBGL_debug_renderer_info not available"; + } + + var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + return webglRenderer; + } + + function detectOSInfo() { + var os = null; + var version = null; + if (navigator.platform.indexOf("Win") == 0) { + os = OS.WINDOWS; + + var versionMatch = /Windows NT (\d+.\d+)/.exec(navigator.userAgent); + version = versionMatch ? parseFloat(versionMatch[1]) : null; + // Version 6.0 is Vista, 6.1 is 7. + } else if (navigator.platform.indexOf("Mac") == 0) { + os = OS.MAC; + + var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); + version = versionMatch ? parseFloat(versionMatch[1]) : null; + } else if (navigator.appVersion.includes("Android")) { + os = OS.ANDROID; + + try { + // From layout/tools/reftest/reftest.js: + version = SpecialPowers.Services.sysinfo.getProperty("version"); + } catch (e) { + info("No SpecialPowers: can't query android version"); + } + } else if (navigator.platform.indexOf("Linux") == 0) { + // Must be checked after android, as android also has a 'Linux' platform string. + os = OS.LINUX; + } + + return [os, version]; + } + + var OS = { + WINDOWS: "windows", + MAC: "mac", + LINUX: "linux", + ANDROID: "android", + }; + + var DRIVER = { + INTEL: "intel", + MESA: "mesa", + NVIDIA: "nvidia", + ANDROID_X86_EMULATOR: "android x86 emulator", + ANGLE: "angle", + }; + + var kOS = null; + var kOSVersion = null; + var kRawDriver = null; + var kDriver = null; + + try { + [kOS, kOSVersion] = detectOSInfo(); + } catch (e) { + // Generally just fails when we don't have SpecialPowers. + } + + try { + kRawDriver = detectDriverInfo(); + + if (kRawDriver.includes("llvmpipe")) { + kDriver = DRIVER.MESA; + } else if (kRawDriver.includes("Android Emulator")) { + kDriver = DRIVER.ANDROID_X86_EMULATOR; + } else if (kRawDriver.includes("ANGLE")) { + kDriver = DRIVER.ANGLE; + } else if (kRawDriver.includes("NVIDIA")) { + kDriver = DRIVER.NVIDIA; + } else if (kRawDriver.includes("Intel")) { + kDriver = DRIVER.INTEL; + } + } catch (e) { + // detectDriverInfo is fallible where WebGL fails. + } + + function dump(line_out_func) { + let lines = [ + "[DriverInfo] userAgent: " + navigator.userAgent, + "[DriverInfo] kRawDriver: " + kRawDriver, + "[DriverInfo] kDriver: " + kDriver, + "[DriverInfo] kOS: " + kOS, + "[DriverInfo] kOSVersion: " + kOSVersion, + ]; + lines.forEach(line_out_func); + } + + dump(x => console.log(x)); + + return { + DRIVER, + OS, + dump, + getDriver() { + return kDriver; + }, + getOS() { + return kOS; + }, + getOSVersion() { + return kOSVersion; + }, + }; +})(); diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js new file mode 100644 index 0000000000..850a27caaf --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js @@ -0,0 +1,42 @@ +"use strict"; + +function EnsureExt(extName, shouldHave = true) { + EnsureExtFor("webgl", extName, shouldHave); + EnsureExtFor("webgl2", extName, shouldHave); +} + +function EnsureExtFor(contextType, extName, shouldHave = true) { + var c = document.createElement("canvas"); + var gl = c.getContext(contextType); + + if (!gl) { + todo(false, "Failed to create context: " + contextType); + return; + } + + var ext = gl.getExtension(extName); + var haveText = " have " + contextType + " extension " + extName + "."; + if (shouldHave) { + ok(ext, "Should" + haveText); + } else { + ok(!ext, "Should not" + haveText); + } +} + +function Lastly_WithDraftExtsEnabled(func) { + SimpleTest.waitForExplicitFinish(); + + var fnEnsure = function () { + func(); + SimpleTest.finish(); + }; + + if ("SpecialPowers" in window) { + var prefStateList = [["webgl.enable-draft-extensions", true]]; + var prefEnv = { set: prefStateList }; + SpecialPowers.pushPrefEnv(prefEnv, fnEnsure); + } else { + console.log("Couldn't use SpecialPowers to enable draft extensions."); + fnEnsure(); + } +} diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html new file mode 100644 index 0000000000..5905539a49 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'ANGLE_instanced_arrays'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html new file mode 100644 index 0000000000..46b135b799 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_blend_minmax'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html new file mode 100644 index 0000000000..443c7ab70a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_color_buffer_half_float'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html new file mode 100644 index 0000000000..af94cbc658 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_disjoint_timer_query'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html new file mode 100644 index 0000000000..9da0d761ab --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_float_blend.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; + +EnsureExt('EXT_float_blend'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html new file mode 100644 index 0000000000..9dbac9881b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_frag_depth'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html new file mode 100644 index 0000000000..cbdde000ac --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_sRGB'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html new file mode 100644 index 0000000000..c3a51c0c9d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_shader_texture_lod'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html new file mode 100644 index 0000000000..2323da591d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_bptc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_texture_compression_bptc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html new file mode 100644 index 0000000000..dbba5382ce --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_compression_rgtc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_texture_compression_rgtc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html new file mode 100644 index 0000000000..877c4440bf --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_texture_filter_anisotropic'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html new file mode 100644 index 0000000000..0a636dc674 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_norm16.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_texture_norm16', false); +EnsureExtFor('webgl2', 'EXT_texture_norm16', false); + +Lastly_WithDraftExtsEnabled(() => { + EnsureExtFor('webgl', 'EXT_texture_norm16', false); + EnsureExtFor('webgl2', 'EXT_texture_norm16', true); +}); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html new file mode 100644 index 0000000000..1d5b8b7341 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_draw_buffers_indexed.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'OES_draw_buffers_indexed', false); +EnsureExtFor('webgl2', 'OES_draw_buffers_indexed', true); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html new file mode 100644 index 0000000000..e0439d3fa8 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_fbo_render_mipmap.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; + +EnsureExtFor('webgl', 'OES_fbo_render_mipmap'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html new file mode 100644 index 0000000000..359726256a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'OES_standard_derivatives'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html new file mode 100644 index 0000000000..4a44a20611 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OVR_multiview2.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; + +EnsureExtFor('webgl2', 'OVR_multiview2'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html new file mode 100644 index 0000000000..9a88b27712 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_color_buffer_float'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html new file mode 100644 index 0000000000..6a9d720024 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_astc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_astc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html new file mode 100644 index 0000000000..7adaafbc82 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_etc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html new file mode 100644 index 0000000000..327625c018 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_etc1'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html new file mode 100644 index 0000000000..c954813984 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_pvrtc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html new file mode 100644 index 0000000000..6ad8001106 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_s3tc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html new file mode 100644 index 0000000000..6d8a864c00 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_depth_texture'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html new file mode 100644 index 0000000000..0683516350 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_draw_buffers'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html new file mode 100644 index 0000000000..76af23b87f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_provoking_vertex.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_provoking_vertex'); +EnsureExtFor('webgl2', 'WEBGL_provoking_vertex'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html new file mode 100644 index 0000000000..8620a66f83 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html @@ -0,0 +1,128 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; + +var ENSURE = 'ENSURE'; // Works on all test machines. +var FORBID = 'FORBID'; // Should not work on any test machine. +var MACHINE_SPECIFIC = 'MACHINE_SPECIFIC'; + +var defaultExts = [ + // Ratified + ['ANGLE_instanced_arrays' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_blend_minmax' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_frag_depth' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_shader_texture_lod' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_texture_filter_anisotropic', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['OES_element_index_uint' , [ENSURE , FORBID ]], + ['OES_fbo_render_mipmap' , [MACHINE_SPECIFIC, FORBID ]], + ['OES_standard_derivatives' , [MACHINE_SPECIFIC, FORBID ]], + ['OES_texture_float' , [ENSURE , FORBID ]], + ['OES_texture_float_linear' , [ENSURE , ENSURE ]], + ['OES_texture_half_float' , [ENSURE , FORBID ]], + ['OES_texture_half_float_linear' , [ENSURE , FORBID ]], + ['OES_vertex_array_object' , [ENSURE , FORBID ]], + ['WEBGL_compressed_texture_s3tc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_debug_renderer_info' , [ENSURE , ENSURE ]], + ['WEBGL_debug_shaders' , [ENSURE , ENSURE ]], + ['WEBGL_depth_texture' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_draw_buffers' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_lose_context' , [ENSURE , ENSURE ]], + + // Community Approved + ['EXT_color_buffer_float' , [FORBID , ENSURE ]], + ['EXT_color_buffer_half_float' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_disjoint_timer_query' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['EXT_float_blend' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['EXT_sRGB' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_texture_compression_bptc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['EXT_texture_compression_rgtc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['OES_draw_buffers_indexed' , [FORBID , MACHINE_SPECIFIC]], + ['OVR_multiview2' , [FORBID , MACHINE_SPECIFIC]], + ['WEBGL_color_buffer_float' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_compressed_texture_astc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_atc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_etc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_etc1' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_pvrtc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_s3tc_srgb', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_provoking_vertex' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], +]; + +var draftExts = [ + ['EXT_texture_norm16' , [FORBID , MACHINE_SPECIFIC]], + ['WEBGL_explicit_present' , [ENSURE , ENSURE ]], +]; + +//////////////////// +// Ensure that we never see any extensions that we haven't listed above! + +(function() { + const expectedExts = (defaultExts.concat(draftExts)).map(x => x[0]); + + ['webgl', 'webgl2'].forEach( contextType => { + const c = document.createElement('canvas'); + const gl = c.getContext(contextType); + if (!gl) return; + + const actualExts = gl.getSupportedExtensions(); + actualExts.forEach(actualExt => { + ok(expectedExts.includes(actualExt), 'Unexpected ext: ' + actualExt); + }); + }); +})(); + +//////////////////// + +function TestExtFor(contextType, extName, status) { + switch (status) { + case ENSURE: + EnsureExtFor(contextType, extName); + break; + + case FORBID: + EnsureExtFor(contextType, extName, false); + break; + + case MACHINE_SPECIFIC: + break; + } +} + +function TestExt(extName, statusArr) { + TestExtFor('webgl', extName, statusArr[0]); + TestExtFor('webgl2', extName, statusArr[1]); +} + +//////////////////// + +defaultExts.forEach(function(x) { + var extName = x[0]; + var statusArr = x[1]; + TestExt(extName, statusArr); +}); + +draftExts.forEach(function(x) { + var extName = x[0]; + EnsureExt(extName, false); +}); + +Lastly_WithDraftExtsEnabled(function() { + draftExts.forEach(function(x) { + var extName = x[0]; + var statusArr = x[1]; + TestExt(extName, statusArr); + }); +}); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html new file mode 100644 index 0000000000..e3ce1ad130 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_implicit.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script id='g_vs' type='text/plain'> + +void main() { + gl_PointSize = 1.0; +} + + </script> + <script id='g_fs' type='text/plain'> + +void main() { + gl_FragColor = vec4(0); +} + + </script> + <script> + +'use strict'; + +let gl = null; + +function CheckTexFloatRenderable(rgbaInternal, type) { + const tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, rgbaInternal, 1, 1, 0, gl.RGBA, type, null); + + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + return gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE; +} + +function CheckRbFloatRenderable(format) { + const rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, format, 1, 1); + + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + return gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE; +} + +function CheckBlending() { + function CompileShader(type, elem) { + const text = elem.innerHTML.trim(); + const s = gl.createShader(type); + gl.shaderSource(s, text); + gl.compileShader(s); + return s; + } + + const vs = CompileShader(gl.VERTEX_SHADER, g_vs); + const fs = CompileShader(gl.FRAGMENT_SHADER, g_fs); + const p = gl.createProgram(); + gl.attachShader(p, vs); + gl.attachShader(p, fs); + gl.linkProgram(p); + gl.useProgram(p); + + gl.drawArrays(gl.POINTS, 0, 1); + if (gl.getError()) throw new Error('Unexpected GL error,'); + + gl.enable(gl.BLEND); + gl.drawArrays(gl.POINTS, 0, 1); + return gl.getError() == 0; +} + +function ResetGl(type) { + if (gl) { + const ext = gl.getExtension('WEBGL_lose_context'); + ext.loseContext(); + gl = null; + } + const c = document.createElement('canvas'); + gl = c.getContext(type); + return !!gl; +} + +function HasExt(name) { + return gl.getSupportedExtensions().indexOf(name) != -1; +} + +ResetGl('webgl'); +if (HasExt('EXT_color_buffer_half_float')) { + const ext = gl.getExtension('OES_texture_half_float'); + const implicitEnabled = CheckTexFloatRenderable(gl.RGBA, ext.HALF_FLOAT_OES); + ok(implicitEnabled, 'OES_texture_half_float should implicitly enable EXT_color_buffer_half_float.'); +} + +ResetGl('webgl'); +if (HasExt('WEBGL_color_buffer_float')) { + const ext = gl.getExtension('OES_texture_float'); + const implicitEnabled = CheckTexFloatRenderable(gl.RGBA, gl.FLOAT); + ok(implicitEnabled, 'OES_texture_float should implicitly enable WEBGL_color_buffer_float.'); + + if (HasExt('EXT_float_blend')) { + ok(CheckBlending(), 'OES_texture_float should implicitly enable EXT_float_blend.'); + } +} + +ResetGl('webgl'); +if (HasExt('EXT_float_blend')) { + const ext = gl.getExtension('WEBGL_color_buffer_float'); + CheckRbFloatRenderable(ext.RGBA32F_EXT); + const implicitEnabled = CheckBlending(); + ok(implicitEnabled, 'WEBGL_color_buffer_float should implicitly enable EXT_float_blend.'); +} + +if (ResetGl('webgl2')) { + if (HasExt('EXT_float_blend')) { + const ext = gl.getExtension('EXT_color_buffer_float'); + CheckTexFloatRenderable(gl.RGBA32F, gl.FLOAT); + const implicitEnabled = CheckBlending(); + ok(implicitEnabled, 'EXT_color_buffer_float should implicitly enable EXT_float_blend.'); + } +} + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/es3-data.js b/dom/canvas/test/webgl-mochitest/es3-data.js new file mode 100644 index 0000000000..a2c11c3ae8 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/es3-data.js @@ -0,0 +1,3221 @@ +// The compressed data are created by Mali GPU Texture Compression Tool +// (http://malideveloper.arm.com/resources/tools/mali-gpu-texture-compression-tool/). +// Simply convert image to ktx format then strip the ktx header to +// get compressed data. +// +// The decompressed data are create by Khronos KTX library and tools +// (https://github.com/KhronosGroup/KTX) +// Calling _ktxUnpackETC with previous generated compressed data to +// get decompressed data. + +var img_4x4_r11_eac = { + compressed: new Uint8Array([0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff]), + decompressed: new Uint8Array([ + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, + ]), +}; + +var img_4x4_signed_r11_eac = { + compressed: new Uint8Array([0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff]), + decompressed: new Uint8Array([ + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, + ]), +}; + +var img_4x4_rg11_eac = { + compressed: new Uint8Array([ + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, + ]), +}; + +var img_4x4_signed_rg11_eac = { + compressed: new Uint8Array([ + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, + ]), +}; + +var img_4x4_rgb_etc2 = { + compressed: new Uint8Array([0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, + ]), +}; + +var img_4x4_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([0x04, 0xf0, 0xf0, 0x00, 0xbf, 0x5f, 0x02, 0x05]), + decompressed: new Uint8Array([ + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ]), +}; + +var img_4x4_rgba_etc2 = { + compressed: new Uint8Array([ + 0x44, 0x89, 0x69, 0x24, 0x41, 0x43, 0x04, 0x41, 0x04, 0xf0, 0xf0, 0x02, + 0x07, 0x45, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x04, + 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c, + 0xff, 0x00, 0x00, 0x34, 0x00, 0xff, 0x00, 0x1c, 0xff, 0x00, 0x00, 0x04, + 0xff, 0x00, 0x00, 0x34, 0xff, 0x00, 0x00, 0x7c, 0x00, 0xff, 0x00, 0x34, + 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c, 0x00, 0xff, 0x00, 0x34, + 0x00, 0xff, 0x00, 0x1c, + ]), +}; + +var img_8x8_r11_eac = { + compressed: new Uint8Array([ + 0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, 0x5e, 0xb3, 0xeb, 0xa4, + 0xba, 0xff, 0xa4, 0x92, 0x00, 0xf6, 0xfb, 0xed, 0xbe, 0xff, 0xed, 0xb6, + 0x2c, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, + ]), +}; + +var img_8x8_signed_r11_eac = { + compressed: new Uint8Array([ + 0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, 0xdf, 0xb3, 0xeb, 0xa4, + 0xba, 0xff, 0xa4, 0x92, 0xfb, 0x20, 0xeb, 0xa4, 0xba, 0xff, 0xa4, 0x92, + 0xac, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, + ]), +}; + +var img_8x8_rg11_eac = { + compressed: new Uint8Array([ + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x00, 0x00, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x2e, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, + ]), +}; + +var img_8x8_signed_rg11_eac = { + compressed: new Uint8Array([ + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, 0xae, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x80, 0x00, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0xae, 0xf0, 0x3c, 0xff, + 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, + ]), +}; + +var img_8x8_rgb_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00, 0x04, 0x0f, 0xff, 0x02, + 0x07, 0x45, 0x00, 0x00, 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00, + 0x04, 0x0f, 0x0f, 0xf2, 0xf8, 0xba, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, + ]), +}; + +var img_8x8_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x00, 0x5f, 0xef, 0x01, 0x44, 0xfb, 0xf0, 0x00, 0xf0, + 0xfd, 0xfa, 0x10, 0x80, 0xfb, 0x0f, 0x0f, 0x00, 0x7f, 0x6f, 0x02, 0x40, + 0x04, 0xff, 0x00, 0xf0, 0xf7, 0x6d, 0x05, 0x04, + ]), + decompressed: new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, + ]), +}; + +var img_8x8_rgba_etc2 = { + compressed: new Uint8Array([ + 0x35, 0x83, 0x6d, 0x26, 0x88, 0x46, 0x64, 0x37, 0x04, 0xf0, 0xf0, 0x02, + 0x07, 0x45, 0x00, 0x00, 0x69, 0xa8, 0x66, 0x76, 0x45, 0x68, 0x86, 0xd1, + 0x04, 0x0f, 0xff, 0x02, 0x07, 0x45, 0x00, 0x00, 0x69, 0xa8, 0x6d, 0xb2, + 0x53, 0x80, 0xaf, 0x41, 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00, + 0x8c, 0xca, 0xf4, 0x2b, 0x0a, 0x05, 0x34, 0x9b, 0x04, 0x0f, 0x0f, 0xf2, + 0xf8, 0xba, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x05, + 0x00, 0xff, 0x00, 0x05, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05, + 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x05, 0xff, 0x00, 0x00, 0x15, 0x00, 0xff, 0x00, 0x25, + 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0xff, 0xff, 0x00, 0x19, + 0x00, 0x00, 0xff, 0x05, 0xff, 0x00, 0x00, 0x05, 0xff, 0x00, 0x00, 0x15, + 0xff, 0x00, 0x00, 0x3d, 0x00, 0xff, 0x00, 0x5d, 0xff, 0xff, 0x00, 0x73, + 0xff, 0xff, 0x00, 0x55, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0xff, 0x19, + 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x25, 0x00, 0xff, 0x00, 0x5d, + 0x00, 0xff, 0x00, 0x95, 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff, 0x9b, + 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x2d, 0x00, 0xff, 0x00, 0x05, + 0xff, 0x00, 0xff, 0x2d, 0x00, 0xff, 0x00, 0x73, 0xff, 0x00, 0xff, 0xc3, + 0x00, 0x00, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xb0, 0x00, 0x00, 0xff, 0x74, + 0x00, 0xff, 0xff, 0x2c, 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0x00, 0x55, 0xff, 0x00, 0xff, 0x9b, 0x00, 0xff, 0xff, 0xb0, + 0x00, 0xff, 0xff, 0x98, 0x00, 0x00, 0xff, 0x5c, 0x00, 0xff, 0xff, 0x2c, + 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x19, 0x00, 0xff, 0x00, 0x2d, + 0xff, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x74, 0x00, 0x00, 0xff, 0x5c, + 0x00, 0x00, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x14, 0xff, 0x00, 0xff, 0x05, + 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x19, 0xff, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x14, + 0x00, 0xff, 0xff, 0x14, + ]), +}; + +/* This image exercises every ETC2 block type */ +var img_32x32_r11_eac = { + compressed: new Uint8Array([ + 0x6e, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x21, 0x32, 0xf2, 0x8d, + 0x01, 0xf0, 0x9f, 0x02, 0x2b, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12, + 0x1f, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, 0x20, 0x34, 0xf0, 0x1b, + 0x42, 0xb6, 0x1a, 0x02, 0x1e, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a, + 0x2a, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, 0x47, 0x32, 0x29, 0xb0, + 0x52, 0xb0, 0x1f, 0xac, 0x31, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb, + 0x0a, 0x23, 0xda, 0x1c, 0x08, 0x18, 0x90, 0x21, 0x08, 0x2d, 0x08, 0x0c, + 0x92, 0x91, 0x22, 0x4a, 0x04, 0x00, 0x40, 0x70, 0x87, 0x40, 0x30, 0x9f, + 0x0c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, 0x12, 0x14, 0x81, 0x9c, + 0x8b, 0x50, 0xb4, 0x39, 0x1a, 0x28, 0x66, 0x00, 0x64, 0xa0, 0x51, 0x45, + 0x2e, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, 0x34, 0x31, 0x82, 0x62, + 0x08, 0x48, 0xb6, 0x9b, 0x07, 0x2d, 0xa3, 0x45, 0x60, 0x2b, 0x10, 0x44, + 0x08, 0x18, 0x67, 0x12, 0x86, 0x24, 0x92, 0x5b, 0x02, 0x00, 0xe0, 0x3e, + 0x10, 0xe9, 0x74, 0xd5, 0x08, 0x1c, 0x09, 0x44, 0x88, 0x84, 0xe9, 0xa4, + 0x16, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, 0x20, 0x11, 0x4f, 0xe6, + 0xb6, 0xef, 0x6f, 0xf6, 0x2f, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff, + 0x2c, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, 0x07, 0x13, 0x09, 0x54, + 0xdb, 0x29, 0xb4, 0x9a, 0x01, 0x02, 0x6c, 0xf2, 0xd9, 0xb5, 0xbb, 0x6d, + 0x0e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, 0x14, 0x13, 0x6a, 0x48, + 0xe7, 0x5e, 0x7f, 0xbe, 0x1e, 0x19, 0x92, 0x69, 0xa6, 0x87, 0x4f, 0xff, + 0x36, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, 0x54, 0x2b, 0x6d, 0xa4, + 0x91, 0x00, 0x0b, 0x6d, 0x19, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09, + 0x10, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x04, 0x91, 0x01, 0x23, 0x92, 0x49, + 0x34, 0x9b, 0x69, 0x37, 0x11, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed, + 0x21, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, 0x13, 0x36, 0x9b, 0x6d, + 0x36, 0xdf, 0xff, 0xff, 0x38, 0x17, 0x26, 0x49, 0xb6, 0xda, 0xdf, 0xfe, + 0x60, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, 0x2c, 0x53, 0x9b, 0x62, + 0x44, 0x29, 0x14, 0x89, 0x0b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd, + 0x0f, 0x13, 0x3f, 0xf5, 0xbf, 0x3b, 0x6f, 0xf6, 0x1e, 0x10, 0xb7, 0x27, + 0x74, 0xa4, 0x43, 0x62, 0x21, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f, + 0x36, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x3f, 0x1d, 0x80, 0xab, + 0x01, 0xd6, 0x0d, 0xac, 0x4c, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff, + 0x35, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, 0x1e, 0x19, 0x22, 0xf4, + 0x2f, 0x66, 0x66, 0x66, 0x19, 0x13, 0x3b, 0x69, 0xb7, 0x9f, 0xfd, 0xbf, + 0x2b, 0x16, 0x4e, 0x76, 0x25, 0x02, 0x72, 0xaf, 0x35, 0x10, 0x68, 0x54, + 0x85, 0x03, 0x61, 0x26, 0x39, 0x1d, 0x44, 0x42, 0x25, 0x12, 0xeb, 0x76, + 0x3d, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, 0x65, 0x37, 0x6d, 0xb4, + 0x91, 0x20, 0x49, 0x77, 0x68, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5, + 0x49, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, 0x5a, 0x4c, 0x68, 0x56, + 0x84, 0x68, 0x46, 0x84, 0x4a, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f, + 0x53, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, 0x51, 0x2b, 0x68, 0x66, + 0x86, 0x68, 0x66, 0x86, 0x52, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27, + 0x77, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37, + ]), + decompressed: new Uint8Array([ + 0x7a, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x36, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, + 0x12, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x22, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x5b, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, + 0x68, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, + 0x68, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x22, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x64, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x36, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x56, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x71, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, + 0x22, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff, + 0x6b, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x71, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x98, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff, + 0x56, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x7a, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x98, 0x00, 0x00, 0xff, + 0x98, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, + 0x62, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x5b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, + 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, + 0x9b, 0x00, 0x00, 0xff, + ]), +}; + +var img_32x32_signed_r11_eac = { + compressed: new Uint8Array([ + 0xef, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0xa2, 0x32, 0xf2, 0x8d, + 0x01, 0xf0, 0x9f, 0x02, 0xab, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12, + 0xa0, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, 0xa1, 0x34, 0xf0, 0x1b, + 0x42, 0xb6, 0x1a, 0x02, 0x9f, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a, + 0xaa, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, 0xc8, 0x32, 0x29, 0xb0, + 0x52, 0xb0, 0x1f, 0xac, 0xb2, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb, + 0x8a, 0x16, 0xfe, 0x1e, 0x08, 0x1d, 0x20, 0x22, 0x88, 0x2d, 0x08, 0x0c, + 0x92, 0x91, 0x10, 0x02, 0x85, 0x1d, 0x20, 0x60, 0x46, 0x20, 0x20, 0x56, + 0x8c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, 0x93, 0x11, 0x81, 0x9c, + 0x8b, 0x50, 0xb4, 0x39, 0x94, 0x2f, 0x42, 0xc8, 0x2d, 0xf2, 0x79, 0xe7, + 0xaf, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, 0xb5, 0x31, 0x82, 0x62, + 0x08, 0x48, 0xb6, 0x9b, 0x84, 0x1a, 0xd7, 0x51, 0xac, 0x83, 0x0b, 0x25, + 0x8a, 0x16, 0x66, 0xa4, 0x85, 0x49, 0x22, 0x5b, 0x83, 0x1d, 0xa0, 0x2a, + 0x08, 0xc4, 0xe2, 0x8c, 0x8d, 0x15, 0x2d, 0x86, 0xd1, 0x09, 0x41, 0x00, + 0x96, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, 0xa1, 0x11, 0x4f, 0xe6, + 0xb6, 0xef, 0x6f, 0xf6, 0xb0, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff, + 0xad, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, 0x82, 0x1d, 0xd2, 0x78, + 0x49, 0xa0, 0x90, 0x08, 0x82, 0x00, 0x6c, 0xe2, 0xd9, 0x91, 0xb9, 0x24, + 0x8e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, 0x95, 0x13, 0x6a, 0x48, + 0xe7, 0x5c, 0x7f, 0xbe, 0xa1, 0x18, 0x00, 0x51, 0x45, 0x0a, 0x8d, 0xb6, + 0xb7, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, 0xcf, 0x10, 0x6d, 0xa4, + 0x89, 0x92, 0x4f, 0xff, 0x99, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09, + 0x90, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x02, 0x89, 0x89, 0x2d, 0x49, 0x24, + 0xaa, 0x56, 0xd4, 0xaf, 0x91, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed, + 0xa1, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, 0x93, 0x36, 0x9b, 0x6d, + 0x36, 0xdf, 0xff, 0xff, 0xbc, 0x12, 0x48, 0x01, 0x6d, 0xb6, 0x4d, 0xb5, + 0xe1, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, 0xad, 0x53, 0x9b, 0x62, + 0x44, 0x29, 0x14, 0x89, 0x8b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd, + 0x91, 0x16, 0x1f, 0xf3, 0x3f, 0x12, 0x4f, 0xe4, 0x9e, 0x10, 0xb7, 0x27, + 0x74, 0xa4, 0x43, 0x62, 0xa1, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f, + 0xb6, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0xc0, 0x1d, 0x05, 0x28, + 0x0a, 0xb0, 0x1d, 0x60, 0xcd, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff, + 0xb6, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, 0x9f, 0x19, 0x22, 0xf4, + 0x67, 0x66, 0x66, 0x66, 0x99, 0x13, 0x3b, 0x6b, 0xb7, 0xbf, 0xfd, 0xbf, + 0xab, 0x17, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0xb1, 0x11, 0x42, 0x60, + 0x26, 0x93, 0xf9, 0x6f, 0xba, 0x1d, 0x48, 0x84, 0x44, 0x22, 0x59, 0x2e, + 0xbd, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, 0xe6, 0x37, 0x6d, 0xb4, + 0x91, 0x20, 0x49, 0x77, 0xe8, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5, + 0xc9, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, 0xcc, 0x21, 0x66, 0x76, + 0x67, 0x66, 0x76, 0x67, 0xcb, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f, + 0xd4, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, 0xd2, 0x2b, 0x68, 0x66, + 0x86, 0x68, 0x66, 0x86, 0xd3, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27, + 0xf8, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37, + ]), + decompressed: new Uint8Array([ + 0x7b, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x65, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x57, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x72, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x72, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x97, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x57, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x7b, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x97, 0x00, 0x00, 0xff, + 0x97, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x63, 0x00, 0x00, 0xff, 0x67, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, + 0x9b, 0x00, 0x00, 0xff, + ]), +}; + +var img_32x32_rg11_eac = { + compressed: new Uint8Array([ + 0xa3, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x88, 0x72, 0xdb, 0x5d, + 0x68, 0xb4, 0x49, 0x01, 0x54, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03, + 0x64, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03, 0x5f, 0x47, 0xd1, 0x1d, + 0x42, 0xf0, 0x39, 0x1b, 0x70, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0x57, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, 0x69, 0x67, 0xa0, 0xbc, + 0x13, 0xd1, 0x3b, 0x0b, 0x54, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0x64, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, 0x4a, 0x7b, 0xd4, 0x4d, + 0x41, 0xd6, 0x2f, 0x41, 0x4a, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0x71, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, 0x5e, 0x44, 0xf5, 0x2f, + 0x51, 0xf4, 0xaf, 0x02, 0x9f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7, + 0x85, 0x6b, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, 0x69, 0x69, 0xbb, 0x58, + 0x00, 0x25, 0x20, 0x9a, 0x69, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0x1c, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, 0x33, 0x44, 0xda, 0x2c, + 0x10, 0x19, 0x20, 0x22, 0x17, 0x22, 0x8a, 0x4e, 0x92, 0xb5, 0x90, 0x03, + 0x24, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, 0x13, 0x3d, 0x18, 0xea, + 0x0e, 0x14, 0xbc, 0x1e, 0x0c, 0x20, 0x9b, 0x7b, 0x37, 0x97, 0x0d, 0x07, + 0x01, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, 0x29, 0x3a, 0x54, 0x2a, + 0x80, 0x54, 0x2e, 0x2a, 0x5c, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0, + 0x41, 0x34, 0xb1, 0x9c, 0x0b, 0x14, 0xb1, 0x31, 0x6a, 0x44, 0x6a, 0xc0, + 0xad, 0x82, 0x61, 0x26, 0x45, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6, + 0xb4, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, 0x64, 0x47, 0x64, 0x14, + 0x80, 0x00, 0x0b, 0x6d, 0x5d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0x6d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, 0x17, 0x2a, 0xf7, 0xd5, + 0xe8, 0x0b, 0xaa, 0x05, 0x20, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0x0e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, 0x1f, 0x30, 0x63, 0x82, + 0xaf, 0x24, 0x00, 0x1b, 0x0d, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25, + 0x0f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, 0x3f, 0x42, 0x09, 0x44, + 0x88, 0xa0, 0x6b, 0xad, 0x17, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed, + 0x6f, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, 0x06, 0xb2, 0xb6, 0xdd, + 0x6d, 0xba, 0xd9, 0x6d, 0xa3, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f, + 0x1c, 0x5d, 0x73, 0x88, 0xc0, 0xf0, 0x0f, 0xc0, 0x7a, 0xb5, 0xdb, 0x6d, + 0xb6, 0xdf, 0xff, 0xff, 0x5a, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6, + 0x63, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, 0x71, 0x67, 0xdb, 0xfb, + 0xae, 0x12, 0x46, 0xd4, 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, 0x01, 0x2f, 0x02, 0x78, + 0x04, 0xb4, 0x0b, 0x6d, 0x01, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6, + 0x2e, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, 0x28, 0x2a, 0x56, 0xd5, + 0x7f, 0x0a, 0xfb, 0xff, 0x64, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe, + 0x31, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, 0xab, 0x20, 0x49, 0x04, + 0x10, 0x4c, 0x2d, 0xb6, 0x2e, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb, + 0xd9, 0x2b, 0x6d, 0x12, 0x44, 0x12, 0xeb, 0xbf, 0x0a, 0x19, 0x25, 0x28, + 0x01, 0xb6, 0x4f, 0xb5, 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x4c, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, 0x55, 0x47, 0xff, 0x6f, + 0x24, 0x90, 0x08, 0x52, 0x4d, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49, + 0x2f, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, 0x32, 0x52, 0xfa, 0x19, + 0x24, 0x68, 0x06, 0xda, 0x03, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f, + 0x03, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, 0x5b, 0x20, 0x6c, 0x00, + 0x06, 0xc3, 0xfd, 0xbf, 0x39, 0x20, 0x6c, 0x00, 0x06, 0xc0, 0x0d, 0x80, + 0x89, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, 0x47, 0x42, 0x10, 0xaa, + 0x08, 0xd4, 0x8b, 0xa1, 0xc1, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d, + 0x15, 0x22, 0x9f, 0xff, 0x3f, 0xe9, 0x24, 0x92, 0xe4, 0x11, 0x6c, 0x01, + 0xb6, 0xb6, 0x4f, 0xfd, 0x07, 0x1a, 0x49, 0x24, 0x00, 0xb4, 0x0f, 0xfd, + 0xee, 0x2d, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb6, 0x33, 0xb2, 0x00, 0x09, + 0x24, 0xb6, 0xdd, 0xb6, 0x75, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9, + 0x58, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, 0x4b, 0x3a, 0x02, 0xd4, + 0xad, 0x0b, 0xf1, 0x6f, 0x1b, 0x45, 0xb7, 0xf9, 0x3f, 0xb0, 0x0b, 0xf8, + 0x46, 0x8f, 0x9b, 0x6b, 0xf6, 0x9f, 0xfd, 0xbf, 0x1f, 0x32, 0x9f, 0xf6, + 0x7f, 0x84, 0x9f, 0xc9, 0x85, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34, + 0x2e, 0x4a, 0xda, 0x21, 0xa0, 0xd4, 0x8b, 0x82, 0xa5, 0x20, 0x00, 0x60, + 0x07, 0x1b, 0xfd, 0xb7, 0x1a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8, + 0xdb, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x02, 0xfd, 0x00, 0x0a, + 0x00, 0x00, 0x08, 0x00, 0xeb, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60, + 0x09, 0x1a, 0x69, 0x22, 0x48, 0x92, 0x5d, 0xb6, 0xed, 0x03, 0x6d, 0xb4, + 0x92, 0xb6, 0xdf, 0xff, 0x4d, 0x5c, 0x6d, 0xb0, 0x49, 0xb6, 0xdf, 0xff, + 0x9a, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, 0x65, 0x5f, 0xdb, 0xfd, + 0xed, 0x12, 0x46, 0x00, 0x94, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f, + 0x30, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, 0x94, 0x20, 0x5b, 0x61, + 0xb7, 0x1f, 0xfd, 0xbf, 0x00, 0x46, 0xdb, 0x6f, 0xb7, 0xff, 0xfd, 0xbf, + 0xc3, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0x06, 0x2b, 0xb2, 0xf9, + 0xee, 0xfe, 0xfd, 0x77, 0xd3, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f, + 0x0b, 0x10, 0x6a, 0x74, 0xa7, 0x6e, 0xd6, 0x4d, 0xe1, 0x2d, 0x44, 0x82, + 0x04, 0x12, 0x59, 0x6e, 0x07, 0x19, 0x42, 0x64, 0x2e, 0x32, 0xf3, 0x2f, + 0xe6, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, 0x11, 0x10, 0x6d, 0x14, + 0x44, 0x12, 0xeb, 0xbf, 0xed, 0x2d, 0x05, 0x28, 0x0a, 0xb0, 0x1d, 0x60, + 0x64, 0x51, 0x68, 0x92, 0x04, 0x92, 0xdb, 0xbf, 0xdc, 0x37, 0x17, 0xf4, + 0x2f, 0x66, 0x66, 0xce, 0x87, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c, + 0xc7, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, 0x55, 0x47, 0x02, 0xf0, + 0x2f, 0x42, 0xf4, 0x2f, 0xd8, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e, + 0x51, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, 0xe5, 0x12, 0x68, 0x56, + 0x66, 0x42, 0xf3, 0x37, 0x03, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0x4a, 0x47, 0x62, 0xf6, + 0x67, 0x66, 0x76, 0x66, 0xdf, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x02, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0xe9, 0x1b, 0x64, 0x46, + 0x45, 0x46, 0x54, 0x26, 0x4d, 0x41, 0x66, 0x54, 0x26, 0x42, 0xf3, 0x2f, + 0xea, 0x2d, 0x46, 0x54, 0x26, 0x22, 0xe3, 0x2e, 0x8c, 0x40, 0x68, 0x84, + 0x44, 0x12, 0xe9, 0x77, + ]), + decompressed: new Uint8Array([ + 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x7b, 0x8f, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x7e, 0x8e, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x7b, 0x8c, 0x00, 0xff, + 0x7b, 0x8c, 0x00, 0xff, 0x87, 0x98, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, + 0x6f, 0x81, 0x00, 0xff, 0x81, 0x93, 0x00, 0xff, 0x81, 0x93, 0x00, 0xff, + 0x6f, 0x81, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x74, 0x74, 0x00, 0xff, + 0x74, 0x74, 0x00, 0xff, 0x74, 0x74, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff, + 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff, + 0x87, 0x8a, 0x00, 0xff, 0x7f, 0x79, 0x00, 0xff, 0x8b, 0x8b, 0x00, 0xff, + 0xa3, 0x9d, 0x00, 0xff, 0xaf, 0xa9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, 0x6f, 0x80, 0x00, 0xff, + 0x67, 0x78, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, 0x4b, 0x57, 0x00, 0xff, + 0x4b, 0x57, 0x00, 0xff, 0x5d, 0x75, 0x00, 0xff, 0x5d, 0x75, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x42, 0x52, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, + 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, 0x71, 0x72, 0x00, 0xff, + 0x71, 0x72, 0x00, 0xff, 0x71, 0x72, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, + 0x7f, 0x67, 0x00, 0xff, 0x97, 0x79, 0x00, 0xff, 0xa3, 0x8b, 0x00, 0xff, + 0xbb, 0x9d, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x6b, 0x7a, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3f, 0x50, 0x00, 0xff, 0x53, 0x64, 0x00, 0xff, 0x53, 0x64, 0x00, 0xff, + 0x33, 0x44, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3c, 0x3c, 0x00, 0xff, 0x3c, 0x3c, 0x00, 0xff, 0x51, 0x51, 0x00, 0xff, + 0x3c, 0x3c, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, + 0x5b, 0x46, 0x00, 0xff, 0x66, 0x52, 0x00, 0xff, 0x8b, 0x5b, 0x00, 0xff, + 0x97, 0x67, 0x00, 0xff, 0xaf, 0x79, 0x00, 0xff, 0xbb, 0x8b, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff, + 0x53, 0x65, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x4b, 0x5c, 0x00, 0xff, + 0x3f, 0x50, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff, + 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x27, 0x27, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x51, 0x51, 0x00, 0xff, + 0x27, 0x27, 0x00, 0xff, 0x19, 0x19, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x50, 0x3e, 0x00, 0xff, 0x5b, 0x46, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, + 0x50, 0x3e, 0x00, 0xff, 0x8b, 0x49, 0x00, 0xff, 0xa3, 0x5b, 0x00, 0xff, + 0xaf, 0x67, 0x00, 0xff, 0xc3, 0x79, 0x00, 0xff, 0x81, 0x81, 0x00, 0xff, + 0x6f, 0x6f, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x40, 0x4f, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff, + 0x1f, 0x27, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, 0x2f, 0x40, 0x00, 0xff, + 0x1f, 0x28, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x16, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x19, 0x1c, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x31, 0x44, 0x00, 0xff, 0x48, 0x50, 0x00, 0xff, 0x50, 0x56, 0x00, 0xff, + 0x30, 0x38, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, 0x3a, 0x27, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x8c, 0x38, 0x00, 0xff, 0x98, 0x44, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff, + 0xd8, 0x74, 0x00, 0xff, 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, + 0x16, 0x27, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff, + 0x07, 0x18, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, 0x1f, 0x28, 0x00, 0xff, + 0x13, 0x1e, 0x00, 0xff, 0x19, 0x1c, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x16, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, + 0x3c, 0x47, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, 0x48, 0x50, 0x00, 0xff, + 0x3c, 0x47, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0xa0, 0x50, 0x00, 0xff, + 0x98, 0x44, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, + 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x2d, 0x2d, 0x00, 0xff, 0x28, 0x3b, 0x00, 0xff, 0x04, 0x13, 0x00, 0xff, + 0x0d, 0x13, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, + 0x07, 0x18, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, + 0x0d, 0x1c, 0x00, 0xff, 0x0d, 0x1c, 0x00, 0xff, 0x0d, 0x1c, 0x00, 0xff, + 0x00, 0x06, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, + 0x11, 0x23, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, 0x3c, 0x1d, 0x00, 0xff, + 0x50, 0x2f, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x78, 0x56, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, + 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, 0x81, 0x81, 0x00, 0xff, + 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x04, 0x13, 0x00, 0xff, 0x16, 0x27, 0x00, 0xff, 0x0d, 0x13, 0x00, 0xff, + 0x0d, 0x13, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, + 0x0d, 0x12, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, + 0x19, 0x28, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x3c, 0x1d, 0x00, 0xff, + 0x3c, 0x1d, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x86, 0x55, 0x00, 0xff, 0x86, 0x55, 0x00, 0xff, + 0xa0, 0x50, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, 0xb8, 0x58, 0x00, 0xff, + 0xd8, 0x74, 0x00, 0xff, 0x75, 0x85, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, + 0x11, 0x16, 0x00, 0xff, 0x11, 0x21, 0x00, 0xff, 0x11, 0x21, 0x00, 0xff, + 0x29, 0x21, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, 0x37, 0x1d, 0x00, 0xff, + 0x1f, 0x07, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, + 0x55, 0x32, 0x00, 0xff, 0x75, 0x53, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x67, 0x11, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff, + 0xaf, 0x49, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff, 0xd2, 0x5a, 0x00, 0xff, + 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x5a, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff, + 0x00, 0x04, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff, + 0x05, 0x15, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff, + 0x37, 0x07, 0x00, 0xff, 0x5b, 0x29, 0x00, 0xff, 0x55, 0x32, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x75, 0x53, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x82, 0x1c, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff, + 0xaf, 0x49, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, 0x75, 0x85, 0x00, 0xff, + 0x51, 0x61, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x29, 0x49, 0x00, 0xff, 0x0e, 0x2e, 0x00, 0xff, + 0x00, 0x16, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, + 0x00, 0x0b, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, + 0x1f, 0x07, 0x00, 0xff, 0x2b, 0x13, 0x00, 0xff, 0x37, 0x07, 0x00, 0xff, + 0x4f, 0x1d, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x5a, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, 0xe8, 0x4f, 0x00, 0xff, + 0xe8, 0x70, 0x00, 0xff, 0x87, 0x97, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x16, 0x00, 0xff, 0x29, 0x49, 0x00, 0xff, 0x00, 0x16, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, + 0x29, 0x21, 0x00, 0xff, 0x1d, 0x15, 0x00, 0xff, 0x43, 0x29, 0x00, 0xff, + 0x37, 0x1d, 0x00, 0xff, 0x5b, 0x29, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xd2, 0x39, 0x00, 0xff, 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x7c, 0x9b, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff, 0x54, 0x5f, 0x00, 0xff, + 0x18, 0x2f, 0x00, 0xff, 0x20, 0x20, 0x00, 0xff, 0x0e, 0x0e, 0x00, 0xff, + 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x0e, 0x18, 0x00, 0xff, 0x0e, 0x18, 0x00, 0xff, 0x32, 0x24, 0x00, 0xff, + 0x3e, 0x2e, 0x00, 0xff, 0x44, 0x13, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, + 0x6c, 0x1f, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xc5, 0x05, 0x00, 0xff, 0xcf, 0x0b, 0x00, 0xff, 0xd5, 0x0e, 0x00, 0xff, + 0xe1, 0x13, 0x00, 0xff, 0xe7, 0x24, 0x00, 0xff, 0xe7, 0x40, 0x00, 0xff, + 0xe7, 0x58, 0x00, 0xff, 0xe7, 0x70, 0x00, 0xff, 0x7c, 0x9b, 0x00, 0xff, + 0x6d, 0x9b, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x26, 0x2e, 0x00, 0xff, + 0x26, 0x2e, 0x00, 0xff, 0x26, 0x18, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, + 0x58, 0x25, 0x00, 0xff, 0x44, 0x13, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, + 0x80, 0x35, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff, + 0x8d, 0x28, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, 0xc5, 0x05, 0x00, 0xff, + 0xcf, 0x08, 0x00, 0xff, 0xdb, 0x0e, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, + 0xe9, 0x24, 0x00, 0xff, 0xe9, 0x3c, 0x00, 0xff, 0xe9, 0x58, 0x00, 0xff, + 0xe9, 0x70, 0x00, 0xff, 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, 0x0e, 0x0e, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff, + 0x3e, 0x2e, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, + 0x6c, 0x3b, 0x00, 0xff, 0x74, 0x2b, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff, + 0xbb, 0x10, 0x00, 0xff, 0xcb, 0x02, 0x00, 0xff, 0xd5, 0x08, 0x00, 0xff, + 0xe1, 0x0b, 0x00, 0xff, 0xeb, 0x11, 0x00, 0xff, 0xeb, 0x24, 0x00, 0xff, + 0xeb, 0x3c, 0x00, 0xff, 0xeb, 0x58, 0x00, 0xff, 0xeb, 0x70, 0x00, 0xff, + 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x9b, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x35, 0x35, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, + 0x4a, 0x3a, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, 0x80, 0x4d, 0x00, 0xff, + 0x8c, 0x41, 0x00, 0xff, 0x80, 0x35, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff, + 0xa5, 0x3e, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xcf, 0x02, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, 0xe5, 0x0b, 0x00, 0xff, + 0xeb, 0x0e, 0x00, 0xff, 0xed, 0x24, 0x00, 0xff, 0xed, 0x3c, 0x00, 0xff, + 0xed, 0x54, 0x00, 0xff, 0xed, 0x70, 0x00, 0xff, 0x7d, 0x95, 0x00, 0xff, + 0x7d, 0x95, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5c, 0x6e, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, + 0x69, 0x3f, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, 0x8d, 0x63, 0x00, 0xff, + 0x81, 0x57, 0x00, 0xff, 0xa0, 0x17, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xff, + 0xe1, 0x00, 0x00, 0xff, 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff, + 0xf0, 0x80, 0x00, 0xff, 0x7d, 0x95, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x41, 0x65, 0x00, 0xff, 0x3e, 0x55, 0x00, 0xff, + 0x25, 0x37, 0x00, 0xff, 0x1b, 0x0a, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, 0x75, 0x4b, 0x00, 0xff, + 0x69, 0x3f, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, 0x8d, 0x63, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xa0, 0x17, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xd3, 0x05, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff, + 0xec, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, + 0x35, 0x2f, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, + 0x3e, 0x28, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, + 0x77, 0x33, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff, + 0x8d, 0x33, 0x00, 0xff, 0xa5, 0x4b, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xe1, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, 0xe6, 0x05, 0x00, 0xff, + 0xf0, 0x10, 0x00, 0xff, 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xf0, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, 0x71, 0x65, 0x00, 0xff, + 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x07, 0x19, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, 0x3e, 0x28, 0x00, 0xff, + 0x1b, 0x0a, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, + 0x6b, 0x49, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, + 0x81, 0x27, 0x00, 0xff, 0x99, 0x3f, 0x00, 0xff, 0x99, 0x3f, 0x00, 0xff, + 0x8d, 0x33, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, 0xe1, 0x00, 0x00, 0xff, + 0xed, 0x05, 0x00, 0xff, 0xe6, 0x05, 0x00, 0xff, 0xea, 0x0a, 0x00, 0xff, + 0xea, 0x1d, 0x00, 0xff, 0xee, 0x3e, 0x00, 0xff, 0xf0, 0x5f, 0x00, 0xff, + 0xf2, 0x80, 0x00, 0xff, 0x7b, 0x74, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff, + 0x60, 0x4a, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, 0x56, 0x22, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, 0x65, 0x26, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x79, 0x3a, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc3, 0x00, 0x00, 0xff, 0xe9, 0x11, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xe9, 0x02, 0x00, 0xff, 0xeb, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xed, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff, + 0xec, 0x3e, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, + 0x4e, 0x35, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, 0x79, 0x3a, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, + 0xe9, 0x01, 0x00, 0xff, 0xeb, 0x05, 0x00, 0xff, 0xeb, 0x0a, 0x00, 0xff, + 0xed, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, + 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, + 0x6c, 0x5f, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff, + 0x54, 0x43, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff, + 0x54, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, 0xad, 0x32, 0x00, 0xff, + 0xad, 0x32, 0x00, 0xff, 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, 0xe7, 0x01, 0x00, 0xff, + 0xe9, 0x05, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, 0xeb, 0x10, 0x00, 0xff, + 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff, + 0xef, 0x7a, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, 0x7b, 0x74, 0x00, 0xff, + 0x60, 0x4a, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, + 0x54, 0x43, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x8d, 0x0e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff, + 0xa1, 0x26, 0x00, 0xff, 0x8d, 0x0e, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xe5, 0x01, 0x00, 0xff, 0xe7, 0x07, 0x00, 0xff, + 0xe7, 0x0c, 0x00, 0xff, 0xe9, 0x10, 0x00, 0xff, 0xeb, 0x1b, 0x00, 0xff, + 0xec, 0x39, 0x00, 0xff, 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, + 0x73, 0x38, 0x00, 0xff, 0x73, 0x3e, 0x00, 0xff, 0x73, 0x32, 0x00, 0xff, + 0x7c, 0x26, 0x00, 0xff, 0x7c, 0x1c, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff, + 0x8e, 0x28, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb3, 0x0e, 0x00, 0xff, 0xad, 0x08, 0x00, 0xff, 0xbd, 0x18, 0x00, 0xff, + 0xb9, 0x12, 0x00, 0xff, 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x00, 0xff, + 0xdd, 0x00, 0x00, 0xff, 0xdf, 0x02, 0x00, 0xff, 0xe1, 0x02, 0x00, 0xff, + 0xe4, 0x02, 0x00, 0xff, 0xe6, 0x08, 0x00, 0xff, 0xe8, 0x0e, 0x00, 0xff, + 0xea, 0x16, 0x00, 0xff, 0xeb, 0x23, 0x00, 0xff, 0xed, 0x41, 0x00, 0xff, + 0xef, 0x6e, 0x00, 0xff, 0xf1, 0x82, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, + 0x85, 0x3e, 0x00, 0xff, 0x85, 0x32, 0x00, 0xff, 0x8b, 0x26, 0x00, 0xff, + 0x8b, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xad, 0x08, 0x00, 0xff, + 0xbd, 0x18, 0x00, 0xff, 0xbd, 0x18, 0x00, 0xff, 0xb3, 0x0e, 0x00, 0xff, + 0xc9, 0x02, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xdb, 0x05, 0x00, 0xff, 0xdd, 0x05, 0x00, 0xff, 0xdf, 0x05, 0x00, 0xff, + 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x08, 0x00, 0xff, 0xe2, 0x02, 0x00, 0xff, + 0xe4, 0x0b, 0x00, 0xff, 0xe6, 0x13, 0x00, 0xff, 0xe8, 0x19, 0x00, 0xff, + 0xe9, 0x32, 0x00, 0xff, 0xeb, 0x55, 0x00, 0xff, 0xed, 0x6e, 0x00, 0xff, + 0xef, 0x91, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff, + 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, 0x9a, 0x42, 0x00, 0xff, + 0x9a, 0x38, 0x00, 0xff, 0xa0, 0x2c, 0x00, 0xff, 0xa0, 0x20, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xcb, 0x0e, 0x00, 0xff, 0xcb, 0x0e, 0x00, 0xff, + 0xcb, 0x0e, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff, + 0xd5, 0x0d, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, + 0xdd, 0x08, 0x00, 0xff, 0xdf, 0x0b, 0x00, 0xff, 0xe1, 0x0b, 0x00, 0xff, + 0xe3, 0x0b, 0x00, 0xff, 0xe2, 0x08, 0x00, 0xff, 0xe4, 0x0e, 0x00, 0xff, + 0xe6, 0x16, 0x00, 0xff, 0xe8, 0x1f, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff, + 0xe9, 0x55, 0x00, 0xff, 0xeb, 0x82, 0x00, 0xff, 0xed, 0xa0, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff, 0xa9, 0x6f, 0x00, 0xff, + 0x8e, 0x56, 0x00, 0xff, 0xa9, 0x42, 0x00, 0xff, 0xa9, 0x38, 0x00, 0xff, + 0xb2, 0x2c, 0x00, 0xff, 0xb2, 0x20, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xd7, 0x18, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, 0xd7, 0x18, 0x00, 0xff, + 0xd7, 0x18, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, + 0xe5, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, 0xdf, 0x0e, 0x00, 0xff, + 0xe1, 0x0e, 0x00, 0xff, 0xe3, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, + 0xe0, 0x0b, 0x00, 0xff, 0xe2, 0x13, 0x00, 0xff, 0xe4, 0x19, 0x00, 0xff, + 0xe6, 0x1f, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff, 0xe7, 0x6e, 0x00, 0xff, + 0xe9, 0x82, 0x00, 0xff, 0xeb, 0xa0, 0x00, 0xff, 0xd3, 0x8d, 0x00, 0xff, + 0xc4, 0x7b, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, 0xb9, 0x35, 0x00, 0xff, + 0xb9, 0x35, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, + 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff, + 0xd8, 0x1f, 0x00, 0xff, 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff, + 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff, + 0xe7, 0x1e, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, + 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, + 0xdf, 0x25, 0x00, 0xff, 0xe2, 0x25, 0x00, 0xff, 0xe2, 0x31, 0x00, 0xff, + 0xe4, 0x50, 0x00, 0xff, 0xe4, 0x68, 0x00, 0xff, 0xe6, 0x80, 0x00, 0xff, + 0xe6, 0x94, 0x00, 0xff, 0xe8, 0x9f, 0x00, 0xff, 0xd3, 0x8d, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, + 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, + 0xd8, 0x45, 0x00, 0xff, 0xd8, 0x45, 0x00, 0xff, 0xd8, 0x41, 0x00, 0xff, + 0xd8, 0x41, 0x00, 0xff, 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff, + 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, 0xe9, 0x3e, 0x00, 0xff, + 0xe9, 0x36, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff, + 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff, + 0xe7, 0x36, 0x00, 0xff, 0xe4, 0x31, 0x00, 0xff, 0xe4, 0x41, 0x00, 0xff, + 0xe4, 0x41, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, 0xe6, 0x68, 0x00, 0xff, + 0xe8, 0x74, 0x00, 0xff, 0xe8, 0x94, 0x00, 0xff, 0xea, 0xa0, 0x00, 0xff, + 0xfa, 0xb1, 0x00, 0xff, 0xe8, 0x9f, 0x00, 0xff, 0xe2, 0x7b, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, + 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, 0xe5, 0x5d, 0x00, 0xff, + 0xe5, 0x5d, 0x00, 0xff, 0xe5, 0x59, 0x00, 0xff, 0xe5, 0x59, 0x00, 0xff, + 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, 0xe9, 0x57, 0x00, 0xff, + 0xec, 0x57, 0x00, 0xff, 0xeb, 0x5a, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff, + 0xeb, 0x52, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, + 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, + 0xe7, 0x55, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, 0xea, 0x65, 0x00, 0xff, + 0xea, 0x65, 0x00, 0xff, 0xea, 0x74, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff, + 0xec, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, 0xfa, 0xb1, 0x00, 0xff, + 0xfa, 0xb1, 0x00, 0xff, 0xf1, 0x8d, 0x00, 0xff, 0xf1, 0x8d, 0x00, 0xff, + 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff, + 0xf8, 0x7d, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, + 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, 0xe9, 0x73, 0x00, 0xff, + 0xec, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, + 0xed, 0x72, 0x00, 0xff, 0xed, 0x72, 0x00, 0xff, 0xed, 0x72, 0x00, 0xff, + 0xed, 0x66, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, + 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, 0xea, 0x65, 0x00, 0xff, + 0xed, 0x71, 0x00, 0xff, 0xed, 0x7d, 0x00, 0xff, 0xef, 0x7d, 0x00, 0xff, + 0xec, 0x80, 0x00, 0xff, 0xee, 0x94, 0x00, 0xff, 0xee, 0xac, 0x00, 0xff, + 0xee, 0xc4, 0x00, 0xff, + ]), +}; + +var img_32x32_signed_rg11_eac = { + compressed: new Uint8Array([ + 0x24, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, 0x09, 0x72, 0xdb, 0x5d, + 0x68, 0xb4, 0x49, 0x01, 0xd6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02, + 0xe6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02, 0xe0, 0x47, 0xd1, 0x1d, + 0x42, 0xf0, 0x39, 0x1b, 0xf1, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0xd8, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, 0xd8, 0x69, 0xd0, 0x2f, + 0x0a, 0xf4, 0xad, 0x42, 0xd4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0xe4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, 0xcb, 0x7b, 0xd4, 0x4d, + 0x41, 0xd6, 0x2f, 0x41, 0xcb, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0xf2, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, 0xe0, 0x47, 0xf5, 0x2f, + 0x51, 0xf4, 0xaf, 0x02, 0x1f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7, + 0xf5, 0x6b, 0x80, 0xab, 0x01, 0xd6, 0x0f, 0xac, 0xe9, 0x69, 0xbb, 0x58, + 0x00, 0x25, 0x20, 0x9a, 0xe9, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0x9d, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, 0xb2, 0x3c, 0xfe, 0xbe, + 0x18, 0x1d, 0xb0, 0x2b, 0x90, 0x3c, 0xa2, 0xde, 0x00, 0xd9, 0x09, 0x22, + 0xa5, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, 0x93, 0x3d, 0x18, 0xea, + 0x0e, 0x14, 0xbc, 0x1e, 0x98, 0x2a, 0x32, 0xf0, 0x6f, 0x22, 0xa8, 0x57, + 0x82, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, 0xa9, 0x3a, 0x54, 0x2a, + 0x80, 0x54, 0x2e, 0x2a, 0xdd, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0, + 0xb7, 0x4b, 0xd5, 0x0f, 0x02, 0x98, 0x29, 0x78, 0xea, 0x44, 0x6a, 0xc0, + 0xad, 0x82, 0x61, 0x26, 0xc5, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6, + 0x35, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, 0xe5, 0x47, 0x64, 0x14, + 0x80, 0x00, 0x0b, 0x6d, 0xdd, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0xed, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, 0x97, 0x2a, 0xf7, 0xd5, + 0xe8, 0x0b, 0xaa, 0x05, 0xa0, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0x8e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, 0xa0, 0x30, 0x63, 0x82, + 0xaf, 0x24, 0x00, 0x1b, 0x8e, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25, + 0x8f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, 0xc0, 0x42, 0x09, 0x44, + 0x88, 0xa0, 0x6b, 0xad, 0x97, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed, + 0xf0, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, 0x87, 0xb2, 0xb6, 0xdd, + 0x6d, 0xba, 0xd9, 0x6d, 0x24, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f, + 0xa7, 0x4c, 0x63, 0x90, 0xc9, 0xe0, 0x9f, 0xc9, 0xfb, 0xb5, 0xdb, 0x6d, + 0xb6, 0xdf, 0xff, 0xff, 0xdb, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6, + 0xe3, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, 0xf1, 0x67, 0xdb, 0xfb, + 0xae, 0x12, 0x46, 0xd4, 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, 0x80, 0x2f, 0x02, 0x78, + 0x04, 0xb4, 0x0b, 0x6d, 0x80, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6, + 0xaf, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, 0xa8, 0x2a, 0x56, 0xd5, + 0x7f, 0x0a, 0xfb, 0xff, 0xe5, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe, + 0xb2, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, 0x20, 0x20, 0x00, 0x41, + 0x04, 0x0a, 0x0f, 0xff, 0xaf, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb, + 0x5a, 0x2b, 0x6d, 0x14, 0x44, 0x12, 0xdb, 0xbf, 0x8b, 0x19, 0x25, 0x28, + 0x01, 0xb6, 0x4f, 0xb5, 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xcd, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, 0xd5, 0x47, 0xff, 0x6f, + 0x24, 0x90, 0x08, 0x12, 0xcd, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49, + 0xb0, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, 0xb3, 0x52, 0xfa, 0x19, + 0x24, 0x68, 0x06, 0xda, 0x83, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f, + 0x83, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, 0xdc, 0x20, 0x6c, 0x00, + 0x06, 0xc3, 0xfd, 0xbf, 0xaf, 0x20, 0x4a, 0x49, 0x27, 0xf2, 0x4f, 0xe4, + 0x0a, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, 0xc8, 0x42, 0x10, 0xaa, + 0x08, 0xd4, 0x8b, 0xa1, 0x41, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d, + 0x92, 0x3c, 0x9f, 0xff, 0x3f, 0xe4, 0x92, 0x49, 0x64, 0x11, 0x6c, 0x01, + 0xb6, 0xb6, 0x4f, 0xfd, 0x89, 0x1a, 0x6d, 0xb6, 0x49, 0x90, 0x0d, 0xb4, + 0x6f, 0x2d, 0x49, 0x12, 0x40, 0x12, 0x5b, 0x76, 0xb3, 0xb2, 0x00, 0x09, + 0x24, 0xb6, 0xdd, 0xb6, 0xf6, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9, + 0xd9, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, 0xcb, 0x3a, 0x02, 0xd4, + 0xad, 0x0b, 0xf1, 0x6f, 0xa9, 0x3a, 0xb7, 0xf0, 0x3f, 0xa1, 0x2b, 0xfa, + 0xf0, 0x23, 0x76, 0xd3, 0xed, 0x7f, 0xfb, 0x7f, 0x9f, 0x32, 0x9f, 0xf6, + 0x7f, 0x84, 0x9f, 0xc9, 0x06, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34, + 0xb6, 0x32, 0xd8, 0x33, 0x81, 0xd1, 0x19, 0x8b, 0x26, 0x20, 0x00, 0x60, + 0x07, 0x1b, 0xfd, 0xb7, 0x9a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8, + 0x5b, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, 0x82, 0xfd, 0x00, 0x0a, + 0x00, 0x00, 0x08, 0x00, 0x6b, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60, + 0x89, 0x1a, 0x69, 0x22, 0x00, 0x96, 0xdd, 0xb7, 0x6d, 0x00, 0x49, 0x20, + 0x00, 0xdb, 0x6f, 0xff, 0xce, 0x5c, 0x6d, 0xb2, 0x49, 0xb6, 0xcf, 0xff, + 0x1b, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, 0xe6, 0x5f, 0xdb, 0xfd, + 0xed, 0x12, 0x46, 0x00, 0x15, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f, + 0xb1, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, 0x15, 0x20, 0x5b, 0x61, + 0xb7, 0x1f, 0xfd, 0xbf, 0x84, 0x41, 0xb6, 0xdd, 0x6e, 0xdb, 0x6b, 0x76, + 0x43, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, 0x86, 0x2b, 0xb2, 0xf9, + 0xee, 0xfe, 0xfd, 0x77, 0x54, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f, + 0x8b, 0x2a, 0x46, 0x62, 0x66, 0x4a, 0xd4, 0x05, 0x61, 0x2d, 0x44, 0x82, + 0x04, 0x12, 0x59, 0x6e, 0x88, 0x1b, 0x62, 0x64, 0x26, 0x22, 0xf3, 0x2f, + 0x66, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, 0x91, 0x10, 0x6d, 0x14, + 0x44, 0x12, 0xeb, 0xbf, 0x6c, 0x2d, 0x80, 0xab, 0x01, 0xd6, 0x0d, 0xac, + 0xe7, 0x6b, 0x6d, 0x12, 0x44, 0x92, 0xed, 0xbf, 0x5d, 0x37, 0x17, 0xf4, + 0x2f, 0x66, 0x66, 0xce, 0x07, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c, + 0x47, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, 0xd5, 0x47, 0x02, 0xf0, + 0x2f, 0x42, 0xf4, 0x2f, 0x59, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e, + 0xd2, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, 0x66, 0x12, 0x68, 0x56, + 0x66, 0x42, 0xf3, 0x37, 0x83, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0xc7, 0x47, 0x42, 0xf6, + 0x2f, 0x62, 0xf6, 0x67, 0x60, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x83, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, 0x66, 0x1b, 0x42, 0x62, + 0x2e, 0x32, 0xf1, 0x2f, 0xcd, 0x5b, 0x66, 0x64, 0x26, 0x42, 0xf3, 0x37, + 0x6b, 0x2d, 0x44, 0x54, 0x65, 0x42, 0x62, 0x2e, 0x0d, 0x40, 0x68, 0x84, + 0x44, 0x12, 0xe9, 0x77, + ]), + decompressed: new Uint8Array([ + 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x7c, 0x8f, 0x00, 0xff, 0x80, 0x8f, 0x00, 0xff, 0x6e, 0x7e, 0x00, 0xff, + 0x80, 0x8f, 0x00, 0xff, 0x80, 0x8f, 0x00, 0xff, 0x7c, 0x8c, 0x00, 0xff, + 0x7c, 0x8c, 0x00, 0xff, 0x87, 0x98, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, + 0x70, 0x81, 0x00, 0xff, 0x81, 0x8d, 0x00, 0xff, 0x81, 0x8d, 0x00, 0xff, + 0x70, 0x81, 0x00, 0xff, 0x7e, 0x8d, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x75, 0x75, 0x00, 0xff, + 0x75, 0x75, 0x00, 0xff, 0x75, 0x75, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff, + 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff, + 0x87, 0x87, 0x00, 0xff, 0x7f, 0x7b, 0x00, 0xff, 0x8a, 0x8c, 0x00, 0xff, + 0xa2, 0x98, 0x00, 0xff, 0xae, 0xaa, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff, + 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, + 0x5c, 0x6c, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, 0x70, 0x80, 0x00, 0xff, + 0x68, 0x79, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, 0x4c, 0x5e, 0x00, 0xff, + 0x4c, 0x5e, 0x00, 0xff, 0x5e, 0x70, 0x00, 0xff, 0x5e, 0x70, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x42, 0x52, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, + 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, 0x72, 0x70, 0x00, 0xff, + 0x72, 0x70, 0x00, 0xff, 0x72, 0x70, 0x00, 0xff, 0x67, 0x68, 0x00, 0xff, + 0x7f, 0x69, 0x00, 0xff, 0x96, 0x7b, 0x00, 0xff, 0xa2, 0x8c, 0x00, 0xff, + 0xba, 0x98, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x6c, 0x7b, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, + 0x4a, 0x5a, 0x00, 0xff, 0x38, 0x48, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff, + 0x40, 0x51, 0x00, 0xff, 0x54, 0x65, 0x00, 0xff, 0x54, 0x65, 0x00, 0xff, + 0x34, 0x45, 0x00, 0xff, 0x4c, 0x4c, 0x00, 0xff, 0x3a, 0x3a, 0x00, 0xff, + 0x3a, 0x3a, 0x00, 0xff, 0x4c, 0x4c, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3d, 0x3d, 0x00, 0xff, 0x3d, 0x3d, 0x00, 0xff, 0x52, 0x52, 0x00, 0xff, + 0x3d, 0x3d, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, + 0x5c, 0x4c, 0x00, 0xff, 0x67, 0x54, 0x00, 0xff, 0x8a, 0x57, 0x00, 0xff, + 0x96, 0x69, 0x00, 0xff, 0xae, 0x7b, 0x00, 0xff, 0xba, 0x8c, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff, + 0x54, 0x66, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff, 0x38, 0x48, 0x00, 0xff, + 0x38, 0x48, 0x00, 0xff, 0x26, 0x36, 0x00, 0xff, 0x4c, 0x5d, 0x00, 0xff, + 0x40, 0x51, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff, + 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x28, 0x28, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, 0x52, 0x52, 0x00, 0xff, + 0x28, 0x28, 0x00, 0xff, 0x1a, 0x1a, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x51, 0x40, 0x00, 0xff, 0x5c, 0x4c, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, + 0x51, 0x40, 0x00, 0xff, 0x8a, 0x4b, 0x00, 0xff, 0xa2, 0x57, 0x00, 0xff, + 0xae, 0x69, 0x00, 0xff, 0xc2, 0x7b, 0x00, 0xff, 0x80, 0x80, 0x00, 0xff, + 0x6f, 0x6f, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x41, 0x4d, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff, + 0x20, 0x29, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff, 0x2b, 0x41, 0x00, 0xff, + 0x22, 0x29, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x14, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x19, 0x1a, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff, + 0x32, 0x44, 0x00, 0xff, 0x49, 0x4f, 0x00, 0xff, 0x51, 0x5b, 0x00, 0xff, + 0x31, 0x3b, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x3a, 0x27, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x8c, 0x39, 0x00, 0xff, 0x98, 0x45, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff, + 0xd8, 0x75, 0x00, 0xff, 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, + 0x17, 0x29, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff, + 0x07, 0x19, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, 0x22, 0x29, 0x00, 0xff, + 0x16, 0x1f, 0x00, 0xff, 0x19, 0x1a, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x14, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, + 0x3d, 0x47, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, 0x49, 0x4f, 0x00, 0xff, + 0x3d, 0x47, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, 0xa0, 0x51, 0x00, 0xff, + 0x98, 0x45, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, + 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x2d, 0x2d, 0x00, 0xff, 0x29, 0x3b, 0x00, 0xff, 0x05, 0x14, 0x00, 0xff, + 0x0e, 0x14, 0x00, 0xff, 0x32, 0x3b, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff, + 0x07, 0x19, 0x00, 0xff, 0x00, 0x07, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, + 0x0d, 0x1e, 0x00, 0xff, 0x0d, 0x1e, 0x00, 0xff, 0x0d, 0x1e, 0x00, 0xff, + 0x00, 0x08, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, + 0x12, 0x23, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, + 0x51, 0x2f, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x79, 0x5b, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, + 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, 0x80, 0x80, 0x00, 0xff, + 0x5d, 0x5d, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x05, 0x14, 0x00, 0xff, 0x17, 0x29, 0x00, 0xff, 0x0e, 0x14, 0x00, 0xff, + 0x0e, 0x14, 0x00, 0xff, 0x19, 0x29, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, + 0x07, 0x13, 0x00, 0xff, 0x00, 0x07, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff, + 0x19, 0x2a, 0x00, 0xff, 0x00, 0x08, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, + 0x3d, 0x1b, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x85, 0x55, 0x00, 0xff, 0x85, 0x55, 0x00, 0xff, + 0xa0, 0x51, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, 0xb8, 0x59, 0x00, 0xff, + 0xd8, 0x75, 0x00, 0xff, 0x75, 0x84, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, + 0x11, 0x17, 0x00, 0xff, 0x12, 0x21, 0x00, 0xff, 0x12, 0x21, 0x00, 0xff, + 0x2a, 0x21, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, 0x38, 0x1d, 0x00, 0xff, + 0x20, 0x07, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x76, 0x54, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x68, 0x12, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1b, 0x00, 0xff, + 0xaf, 0x4b, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff, 0xd2, 0x5b, 0x00, 0xff, + 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x5b, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff, + 0x00, 0x05, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff, + 0x06, 0x15, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff, + 0x38, 0x07, 0x00, 0xff, 0x5c, 0x29, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x76, 0x54, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x82, 0x1b, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, 0x82, 0x1b, 0x00, 0xff, + 0xaf, 0x4b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, 0x75, 0x84, 0x00, 0xff, + 0x51, 0x61, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x29, 0x4a, 0x00, 0xff, 0x0e, 0x2f, 0x00, 0xff, + 0x00, 0x17, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, + 0x00, 0x0b, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, + 0x20, 0x07, 0x00, 0xff, 0x2c, 0x13, 0x00, 0xff, 0x38, 0x07, 0x00, 0xff, + 0x50, 0x1d, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x5b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, 0xe8, 0x50, 0x00, 0xff, + 0xe8, 0x71, 0x00, 0xff, 0x86, 0x96, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x17, 0x00, 0xff, 0x29, 0x4a, 0x00, 0xff, 0x00, 0x17, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, + 0x2a, 0x21, 0x00, 0xff, 0x1e, 0x15, 0x00, 0xff, 0x44, 0x29, 0x00, 0xff, + 0x38, 0x1d, 0x00, 0xff, 0x5c, 0x29, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xd2, 0x3a, 0x00, 0xff, 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x7c, 0x9a, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff, 0x54, 0x5f, 0x00, 0xff, + 0x18, 0x2f, 0x00, 0xff, 0x21, 0x21, 0x00, 0xff, 0x0f, 0x0f, 0x00, 0xff, + 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x0f, 0x18, 0x00, 0xff, 0x0f, 0x18, 0x00, 0xff, 0x33, 0x24, 0x00, 0xff, + 0x3f, 0x2e, 0x00, 0xff, 0x45, 0x14, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, + 0x6d, 0x20, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xc5, 0x06, 0x00, 0xff, 0xcb, 0x0c, 0x00, 0xff, 0xd5, 0x0f, 0x00, 0xff, + 0xe1, 0x14, 0x00, 0xff, 0xe7, 0x25, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff, + 0xe7, 0x59, 0x00, 0xff, 0xe7, 0x71, 0x00, 0xff, 0x7c, 0x9a, 0x00, 0xff, + 0x6d, 0x9a, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, 0x27, 0x2e, 0x00, 0xff, + 0x27, 0x2e, 0x00, 0xff, 0x27, 0x18, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, + 0x59, 0x26, 0x00, 0xff, 0x45, 0x14, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, + 0x80, 0x36, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff, + 0x8d, 0x29, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, 0xc5, 0x06, 0x00, 0xff, + 0xcf, 0x09, 0x00, 0xff, 0xdb, 0x0f, 0x00, 0xff, 0xe5, 0x12, 0x00, 0xff, + 0xe9, 0x25, 0x00, 0xff, 0xe9, 0x3d, 0x00, 0xff, 0xe9, 0x59, 0x00, 0xff, + 0xe9, 0x71, 0x00, 0xff, 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, 0x0f, 0x0f, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff, + 0x3f, 0x2e, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, + 0x6d, 0x3c, 0x00, 0xff, 0x75, 0x2c, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff, + 0xbb, 0x11, 0x00, 0xff, 0xcb, 0x03, 0x00, 0xff, 0xd5, 0x09, 0x00, 0xff, + 0xe1, 0x0c, 0x00, 0xff, 0xeb, 0x12, 0x00, 0xff, 0xeb, 0x25, 0x00, 0xff, + 0xeb, 0x3d, 0x00, 0xff, 0xeb, 0x59, 0x00, 0xff, 0xeb, 0x71, 0x00, 0xff, + 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x9a, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x36, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, + 0x4b, 0x3a, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, 0x80, 0x4e, 0x00, 0xff, + 0x8c, 0x42, 0x00, 0xff, 0x80, 0x36, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff, + 0xa3, 0x3f, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xcf, 0x03, 0x00, 0xff, 0xdb, 0x06, 0x00, 0xff, 0xe1, 0x0c, 0x00, 0xff, + 0xeb, 0x0f, 0x00, 0xff, 0xed, 0x25, 0x00, 0xff, 0xed, 0x3d, 0x00, 0xff, + 0xed, 0x55, 0x00, 0xff, 0xed, 0x71, 0x00, 0xff, 0x7d, 0x94, 0x00, 0xff, + 0x7d, 0x94, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x6f, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x3e, 0x1d, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, + 0x6a, 0x40, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, 0x8d, 0x64, 0x00, 0xff, + 0x81, 0x58, 0x00, 0xff, 0x9f, 0x18, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xd6, 0x00, 0x00, 0xff, + 0xe0, 0x00, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, 0xec, 0x5f, 0x00, 0xff, + 0xf0, 0x80, 0x00, 0xff, 0x7d, 0x94, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x49, 0x65, 0x00, 0xff, 0x3f, 0x56, 0x00, 0xff, + 0x26, 0x38, 0x00, 0xff, 0x1c, 0x0b, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x3e, 0x1d, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, 0x76, 0x4c, 0x00, 0xff, + 0x6a, 0x40, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, 0x8d, 0x64, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0x9f, 0x18, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xd2, 0x06, 0x00, 0xff, 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff, + 0xea, 0x3e, 0x00, 0xff, 0xee, 0x5f, 0x00, 0xff, 0xf0, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, + 0x35, 0x2f, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, + 0x3f, 0x29, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, + 0x78, 0x33, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff, + 0x8d, 0x34, 0x00, 0xff, 0xa5, 0x4c, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xe0, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, 0xe5, 0x07, 0x00, 0xff, + 0xef, 0x10, 0x00, 0xff, 0xe8, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, 0x71, 0x65, 0x00, 0xff, + 0x5d, 0x53, 0x00, 0xff, 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x08, 0x1a, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, 0x3f, 0x29, 0x00, 0xff, + 0x1c, 0x0b, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x6c, 0x4b, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, + 0x81, 0x28, 0x00, 0xff, 0x99, 0x40, 0x00, 0xff, 0x99, 0x40, 0x00, 0xff, + 0x8d, 0x34, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, 0xe0, 0x00, 0x00, 0xff, + 0xec, 0x05, 0x00, 0xff, 0xe5, 0x07, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, + 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, 0xf0, 0x5f, 0x00, 0xff, + 0xf2, 0x80, 0x00, 0xff, 0x7c, 0x75, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff, + 0x61, 0x4b, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, 0x56, 0x22, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, 0x66, 0x27, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x7a, 0x39, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc2, 0x00, 0x00, 0xff, 0xe8, 0x11, 0x00, 0xff, 0xde, 0x00, 0x00, 0xff, + 0xe8, 0x02, 0x00, 0xff, 0xea, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xec, 0x0a, 0x00, 0xff, 0xee, 0x10, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff, + 0xec, 0x3a, 0x00, 0xff, 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, + 0x4f, 0x36, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, 0x7a, 0x39, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, 0xc2, 0x00, 0x00, 0xff, + 0xd4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, + 0xe8, 0x01, 0x00, 0xff, 0xea, 0x07, 0x00, 0xff, 0xea, 0x0c, 0x00, 0xff, + 0xec, 0x10, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, + 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, + 0x6d, 0x60, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff, + 0x54, 0x44, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff, + 0x54, 0x44, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, 0xad, 0x30, 0x00, 0xff, + 0xad, 0x30, 0x00, 0xff, 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, + 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, 0xe6, 0x01, 0x00, 0xff, + 0xe8, 0x07, 0x00, 0xff, 0xe8, 0x0c, 0x00, 0xff, 0xea, 0x10, 0x00, 0xff, + 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, 0xed, 0x5d, 0x00, 0xff, + 0xee, 0x7b, 0x00, 0xff, 0x90, 0x89, 0x00, 0xff, 0x7c, 0x75, 0x00, 0xff, + 0x61, 0x4b, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, + 0x54, 0x44, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x8d, 0x0f, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff, + 0xa1, 0x27, 0x00, 0xff, 0x8d, 0x0f, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, 0xde, 0x00, 0x00, 0xff, + 0xde, 0x00, 0x00, 0xff, 0xe4, 0x01, 0x00, 0xff, 0xe6, 0x07, 0x00, 0xff, + 0xe6, 0x0c, 0x00, 0xff, 0xe8, 0x12, 0x00, 0xff, 0xeb, 0x1c, 0x00, 0xff, + 0xec, 0x3a, 0x00, 0xff, 0xed, 0x58, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, + 0x74, 0x39, 0x00, 0xff, 0x74, 0x3f, 0x00, 0xff, 0x74, 0x33, 0x00, 0xff, + 0x7d, 0x27, 0x00, 0xff, 0x7d, 0x1d, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff, + 0x8e, 0x28, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb2, 0x0e, 0x00, 0xff, 0xac, 0x08, 0x00, 0xff, 0xbc, 0x18, 0x00, 0xff, + 0xb8, 0x12, 0x00, 0xff, 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xda, 0x00, 0x00, 0xff, + 0xdc, 0x01, 0x00, 0xff, 0xde, 0x03, 0x00, 0xff, 0xe0, 0x03, 0x00, 0xff, + 0xe3, 0x02, 0x00, 0xff, 0xe5, 0x08, 0x00, 0xff, 0xe7, 0x0e, 0x00, 0xff, + 0xe9, 0x16, 0x00, 0xff, 0xeb, 0x2b, 0x00, 0xff, 0xed, 0x49, 0x00, 0xff, + 0xef, 0x6d, 0x00, 0xff, 0xef, 0x8a, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, + 0x85, 0x3f, 0x00, 0xff, 0x85, 0x33, 0x00, 0xff, 0x8b, 0x27, 0x00, 0xff, + 0x8b, 0x1d, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xac, 0x08, 0x00, 0xff, + 0xbc, 0x18, 0x00, 0xff, 0xbc, 0x18, 0x00, 0xff, 0xb2, 0x0e, 0x00, 0xff, + 0xc9, 0x03, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xdb, 0x07, 0x00, 0xff, 0xdc, 0x06, 0x00, 0xff, 0xde, 0x06, 0x00, 0xff, + 0xe0, 0x06, 0x00, 0xff, 0xe2, 0x09, 0x00, 0xff, 0xe1, 0x02, 0x00, 0xff, + 0xe3, 0x0b, 0x00, 0xff, 0xe5, 0x13, 0x00, 0xff, 0xe7, 0x19, 0x00, 0xff, + 0xe9, 0x2b, 0x00, 0xff, 0xeb, 0x49, 0x00, 0xff, 0xed, 0x6d, 0x00, 0xff, + 0xef, 0x8a, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff, + 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, 0x9a, 0x43, 0x00, 0xff, + 0x9a, 0x39, 0x00, 0xff, 0xa0, 0x2d, 0x00, 0xff, 0xa0, 0x21, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xca, 0x0e, 0x00, 0xff, 0xca, 0x0e, 0x00, 0xff, + 0xca, 0x0e, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff, + 0xd5, 0x0d, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, 0xdb, 0x07, 0x00, 0xff, + 0xdc, 0x09, 0x00, 0xff, 0xde, 0x09, 0x00, 0xff, 0xe0, 0x0c, 0x00, 0xff, + 0xe2, 0x0c, 0x00, 0xff, 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x0e, 0x00, 0xff, + 0xe5, 0x16, 0x00, 0xff, 0xe7, 0x1f, 0x00, 0xff, 0xe7, 0x3d, 0x00, 0xff, + 0xe9, 0x5b, 0x00, 0xff, 0xeb, 0x7f, 0x00, 0xff, 0xed, 0x9c, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff, 0xa9, 0x70, 0x00, 0xff, + 0x8e, 0x57, 0x00, 0xff, 0xa9, 0x43, 0x00, 0xff, 0xa9, 0x39, 0x00, 0xff, + 0xb2, 0x2d, 0x00, 0xff, 0xb2, 0x21, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xd6, 0x18, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, 0xd6, 0x18, 0x00, 0xff, + 0xd6, 0x18, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, + 0xe5, 0x11, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, 0xde, 0x0e, 0x00, 0xff, + 0xe0, 0x0e, 0x00, 0xff, 0xe2, 0x11, 0x00, 0xff, 0xe4, 0x11, 0x00, 0xff, + 0xdf, 0x0b, 0x00, 0xff, 0xe1, 0x13, 0x00, 0xff, 0xe3, 0x19, 0x00, 0xff, + 0xe5, 0x1f, 0x00, 0xff, 0xe5, 0x49, 0x00, 0xff, 0xe7, 0x6d, 0x00, 0xff, + 0xe9, 0x8a, 0x00, 0xff, 0xeb, 0x9c, 0x00, 0xff, 0xd3, 0x8c, 0x00, 0xff, + 0xc4, 0x7b, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, 0xb8, 0x35, 0x00, 0xff, + 0xb8, 0x35, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, + 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff, + 0xd8, 0x1f, 0x00, 0xff, 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff, + 0xe7, 0x27, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff, + 0xe7, 0x1b, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, + 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, 0xde, 0x1b, 0x00, 0xff, + 0xe0, 0x2a, 0x00, 0xff, 0xe0, 0x2a, 0x00, 0xff, 0xe3, 0x34, 0x00, 0xff, + 0xe4, 0x51, 0x00, 0xff, 0xe4, 0x69, 0x00, 0xff, 0xe4, 0x80, 0x00, 0xff, + 0xe6, 0x94, 0x00, 0xff, 0xe8, 0x9e, 0x00, 0xff, 0xd3, 0x8c, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, + 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, + 0xd8, 0x46, 0x00, 0xff, 0xd8, 0x46, 0x00, 0xff, 0xd8, 0x42, 0x00, 0xff, + 0xd8, 0x42, 0x00, 0xff, 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff, + 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, 0xe9, 0x3b, 0x00, 0xff, + 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x33, 0x00, 0xff, + 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff, + 0xe7, 0x37, 0x00, 0xff, 0xe3, 0x34, 0x00, 0xff, 0xe3, 0x43, 0x00, 0xff, + 0xe6, 0x43, 0x00, 0xff, 0xe6, 0x52, 0x00, 0xff, 0xe6, 0x69, 0x00, 0xff, + 0xe6, 0x75, 0x00, 0xff, 0xe8, 0x94, 0x00, 0xff, 0xe8, 0xa0, 0x00, 0xff, + 0xfa, 0xb0, 0x00, 0xff, 0xe8, 0x9e, 0x00, 0xff, 0xe2, 0x7b, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, + 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, 0xe5, 0x5e, 0x00, 0xff, + 0xe5, 0x5e, 0x00, 0xff, 0xe5, 0x5a, 0x00, 0xff, 0xe5, 0x5a, 0x00, 0xff, + 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, 0xe9, 0x57, 0x00, 0xff, + 0xec, 0x57, 0x00, 0xff, 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x57, 0x00, 0xff, + 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x4f, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, + 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, + 0xe6, 0x52, 0x00, 0xff, 0xe9, 0x52, 0x00, 0xff, 0xe9, 0x61, 0x00, 0xff, + 0xe9, 0x6b, 0x00, 0xff, 0xe8, 0x75, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff, + 0xea, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, 0xfa, 0xb0, 0x00, 0xff, + 0xfa, 0xb0, 0x00, 0xff, 0xf1, 0x8c, 0x00, 0xff, 0xf1, 0x8c, 0x00, 0xff, + 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff, + 0xf7, 0x7d, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, + 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, 0xe9, 0x73, 0x00, 0xff, + 0xec, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, + 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff, + 0xed, 0x6f, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, + 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, 0xeb, 0x6b, 0x00, 0xff, + 0xeb, 0x6b, 0x00, 0xff, 0xee, 0x7a, 0x00, 0xff, 0xee, 0x7a, 0x00, 0xff, + 0xec, 0x80, 0x00, 0xff, 0xec, 0x94, 0x00, 0xff, 0xee, 0xac, 0x00, 0xff, + 0xee, 0xc4, 0x00, 0xff, + ]), +}; + +var img_32x32_rgb_etc2 = { + compressed: new Uint8Array([ + 0x8d, 0x9d, 0xb6, 0x4a, 0xc4, 0x80, 0x83, 0x97, 0x64, 0x74, 0x95, 0x4b, + 0xae, 0xa2, 0x91, 0x05, 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42, + 0x64, 0x74, 0x85, 0x49, 0xae, 0xea, 0x89, 0xba, 0x64, 0x74, 0x7c, 0x4b, + 0xa8, 0x8a, 0xa4, 0x81, 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a, + 0x75, 0x74, 0x86, 0x25, 0xaa, 0x6e, 0x71, 0x11, 0xbe, 0x7f, 0x04, 0x62, + 0xbb, 0x6c, 0x86, 0xcf, + + 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6, 0x21, 0x30, 0x5f, 0x4a, + 0xbd, 0xe8, 0x8e, 0x5b, 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10, + 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9, 0x05, 0x13, 0x23, 0x57, + 0x66, 0xd6, 0x34, 0xc4, 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4, + 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01, 0x9a, 0x48, 0x41, 0x2e, + 0x00, 0x31, 0xf0, 0xc5, + + 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, 0x18, 0x20, 0x4a, 0x27, + 0x6b, 0x90, 0x0e, 0x35, 0x00, 0x0b, 0x29, 0x2f, 0xcc, 0x29, 0xf0, 0x87, + 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, 0x33, 0x18, 0x40, 0x26, + 0x06, 0x76, 0x2e, 0x3e, 0xb9, 0x06, 0x32, 0x2b, 0x02, 0x13, 0x10, 0x03, + 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, 0x6a, 0x06, 0x6b, 0x33, + 0xf1, 0x05, 0x01, 0xff, + + 0x74, 0x95, 0xa6, 0x2c, 0x70, 0xf0, 0xbe, 0x5c, 0x1d, 0x1d, 0x32, 0x4e, + 0xfe, 0xf6, 0x4c, 0xe8, 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b, + 0x23, 0x28, 0x43, 0x26, 0x03, 0x11, 0xea, 0xd1, 0x63, 0x30, 0x66, 0x46, + 0x05, 0x23, 0x5b, 0xa1, 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8, + 0x60, 0x86, 0x04, 0xf6, 0x18, 0x46, 0x80, 0x00, 0x72, 0xa6, 0x0d, 0x73, + 0x8b, 0x2f, 0x64, 0x48, + + 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f, 0x31, 0x40, 0x63, 0x6c, + 0x71, 0xfc, 0x2d, 0x09, 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33, + 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83, 0x7b, 0x55, 0x67, 0x27, + 0x84, 0x6f, 0x61, 0x29, 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21, + 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03, 0x72, 0x9e, 0x0c, 0x7a, + 0xa1, 0x2f, 0x43, 0x87, + + 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, 0x0e, 0x15, 0x43, 0x67, + 0x13, 0x33, 0x62, 0xfc, 0xb8, 0x04, 0xb1, 0xb3, 0x31, 0xcf, 0x01, 0x11, + 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, 0x58, 0x14, 0xc9, 0x1a, + 0x01, 0x77, 0x72, 0x08, 0xd9, 0x0f, 0x08, 0x42, 0xef, 0xef, 0x89, 0x03, + 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, 0x74, 0x9c, 0x07, 0xf7, + 0x9b, 0x2f, 0x43, 0x47, + + 0x98, 0x84, 0xa5, 0x0e, 0xf1, 0xd2, 0x10, 0xec, 0xb8, 0xbc, 0xfa, 0xc2, + 0x10, 0x85, 0xc8, 0xd2, 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f, + 0xb3, 0x10, 0x10, 0x03, 0x24, 0x57, 0x8b, 0x3a, 0xca, 0x08, 0x10, 0x22, + 0x73, 0x33, 0x9f, 0x89, 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46, + 0x70, 0x80, 0x04, 0x76, 0x1c, 0x56, 0xe2, 0x03, 0x74, 0xa6, 0x0c, 0xfa, + 0xa5, 0x37, 0x0a, 0x50, + + 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c, 0xd2, 0x53, 0x53, 0x47, + 0x77, 0x77, 0x99, 0x88, 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4, + 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3, 0x72, 0xa2, 0x0c, 0xf3, + 0x18, 0x4f, 0x71, 0xa0, 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2, + 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61, 0x70, 0x54, 0x15, 0x73, + 0xa7, 0x3f, 0x72, 0x22, + ]), + decompressed: new Uint8Array([ + 0xa9, 0xb9, 0xd2, 0xff, 0xa9, 0xb9, 0xd2, 0xff, 0x90, 0xa1, 0xc2, 0xff, + 0x7c, 0x8d, 0xae, 0xff, 0x80, 0x90, 0xb1, 0xff, 0x6c, 0x7c, 0x9d, 0xff, + 0x80, 0x90, 0xb1, 0xff, 0x80, 0x90, 0xb1, 0xff, 0x7c, 0x8d, 0xaf, 0xff, + 0x7c, 0x8d, 0xaf, 0xff, 0x88, 0x99, 0xbb, 0xff, 0x66, 0x77, 0x99, 0xff, + 0x6f, 0x80, 0x91, 0xff, 0x83, 0x94, 0xa5, 0xff, 0x83, 0x94, 0xa5, 0xff, + 0x6f, 0x80, 0x91, 0xff, 0x80, 0x90, 0x98, 0xff, 0x6c, 0x7c, 0x84, 0xff, + 0x6c, 0x7c, 0x84, 0xff, 0x6c, 0x7c, 0x84, 0xff, 0x72, 0x72, 0x83, 0xff, + 0x7c, 0x7c, 0x8d, 0xff, 0x72, 0x72, 0x83, 0xff, 0x88, 0x88, 0x99, 0xff, + 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff, + 0x88, 0x88, 0x99, 0xff, 0x7d, 0x7e, 0x82, 0xff, 0x8f, 0x8d, 0x8f, 0xff, + 0xa0, 0x9d, 0x9c, 0xff, 0xb2, 0xac, 0xa9, 0xff, 0xa9, 0xb9, 0xd2, 0xff, + 0x95, 0xa5, 0xbe, 0xff, 0x90, 0xa1, 0xc2, 0xff, 0x7c, 0x8d, 0xae, 0xff, + 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff, + 0x5a, 0x6a, 0x8b, 0xff, 0x66, 0x77, 0x99, 0xff, 0x72, 0x83, 0xa5, 0xff, + 0x66, 0x77, 0x99, 0xff, 0x66, 0x77, 0x99, 0xff, 0x49, 0x5a, 0x6b, 0xff, + 0x49, 0x5a, 0x6b, 0xff, 0x5d, 0x6e, 0x7f, 0xff, 0x5d, 0x6e, 0x7f, 0xff, + 0x5a, 0x6a, 0x72, 0xff, 0x6c, 0x7c, 0x84, 0xff, 0x6c, 0x7c, 0x84, 0xff, + 0x46, 0x56, 0x5e, 0xff, 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff, + 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff, 0x72, 0x72, 0x83, 0xff, + 0x72, 0x72, 0x83, 0xff, 0x72, 0x72, 0x83, 0xff, 0x66, 0x66, 0x77, 0xff, + 0x82, 0x6c, 0x71, 0xff, 0x94, 0x7b, 0x7e, 0xff, 0xa5, 0x8b, 0x8b, 0xff, + 0xb7, 0x9a, 0x98, 0xff, 0xa9, 0xb9, 0xd2, 0xff, 0x95, 0xa5, 0xbe, 0xff, + 0x6a, 0x7b, 0x9c, 0xff, 0x6a, 0x7b, 0x9c, 0xff, 0x5f, 0x6f, 0x98, 0xff, + 0x4b, 0x5b, 0x84, 0xff, 0x39, 0x49, 0x72, 0xff, 0x4b, 0x5b, 0x84, 0xff, + 0x3f, 0x50, 0x72, 0xff, 0x55, 0x66, 0x88, 0xff, 0x55, 0x66, 0x88, 0xff, + 0x33, 0x44, 0x66, 0xff, 0x4d, 0x4d, 0x5e, 0xff, 0x3b, 0x3b, 0x4c, 0xff, + 0x3b, 0x3b, 0x4c, 0xff, 0x4d, 0x4d, 0x5e, 0xff, 0x4b, 0x5b, 0x63, 0xff, + 0x4b, 0x5b, 0x63, 0xff, 0x5f, 0x6f, 0x77, 0xff, 0x4b, 0x5b, 0x63, 0xff, + 0x3c, 0x3c, 0x5e, 0xff, 0x3c, 0x3c, 0x5e, 0xff, 0x50, 0x50, 0x72, 0xff, + 0x3c, 0x3c, 0x5e, 0xff, 0x50, 0x3f, 0x61, 0xff, 0x50, 0x3f, 0x61, 0xff, + 0x5a, 0x49, 0x6b, 0xff, 0x66, 0x55, 0x77, 0xff, 0x88, 0x5a, 0x5f, 0xff, + 0x99, 0x69, 0x6c, 0xff, 0xab, 0x79, 0x79, 0xff, 0xbc, 0x88, 0x86, 0xff, + 0x95, 0xa5, 0xbe, 0xff, 0x6f, 0x7f, 0x98, 0xff, 0x7c, 0x8d, 0xae, 0xff, + 0x56, 0x67, 0x88, 0xff, 0x4b, 0x5b, 0x84, 0xff, 0x39, 0x49, 0x72, 0xff, + 0x39, 0x49, 0x72, 0xff, 0x25, 0x35, 0x5e, 0xff, 0x49, 0x5a, 0x7c, 0xff, + 0x3f, 0x50, 0x72, 0xff, 0x33, 0x44, 0x66, 0xff, 0x33, 0x44, 0x66, 0xff, + 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff, + 0x27, 0x27, 0x38, 0xff, 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff, + 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff, 0x50, 0x50, 0x72, 0xff, + 0x2a, 0x2a, 0x4c, 0xff, 0x16, 0x16, 0x38, 0xff, 0x2a, 0x2a, 0x4c, 0xff, + 0x50, 0x3f, 0x61, 0xff, 0x5a, 0x49, 0x6b, 0xff, 0x50, 0x3f, 0x61, 0xff, + 0x50, 0x3f, 0x61, 0xff, 0x8d, 0x48, 0x4e, 0xff, 0x9e, 0x57, 0x5b, 0xff, + 0xb0, 0x67, 0x68, 0xff, 0xc1, 0x76, 0x75, 0xff, 0x80, 0x80, 0xa2, 0xff, + 0x6e, 0x6e, 0x90, 0xff, 0x4d, 0x4d, 0x80, 0xff, 0x61, 0x61, 0x94, 0xff, + 0x3e, 0x4e, 0x77, 0xff, 0x3e, 0x4e, 0x77, 0xff, 0x20, 0x28, 0x49, 0xff, + 0x20, 0x28, 0x49, 0xff, 0x19, 0x2a, 0x42, 0xff, 0x2d, 0x3e, 0x56, 0xff, + 0x21, 0x29, 0x5b, 0xff, 0x15, 0x1d, 0x4f, 0xff, 0x10, 0x10, 0x42, 0xff, + 0x16, 0x16, 0x48, 0xff, 0x10, 0x10, 0x42, 0xff, 0x1a, 0x1a, 0x4c, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x22, 0x33, 0x55, 0xff, 0x11, 0x11, 0x33, 0xff, + 0x32, 0x43, 0x65, 0xff, 0x47, 0x4f, 0x5f, 0xff, 0x53, 0x5b, 0x6b, 0xff, + 0x31, 0x39, 0x49, 0xff, 0x31, 0x39, 0x49, 0xff, 0x38, 0x27, 0x38, 0xff, + 0x5e, 0x4d, 0x5e, 0xff, 0x72, 0x61, 0x72, 0xff, 0x5e, 0x4d, 0x5e, 0xff, + 0x8b, 0x39, 0x31, 0xff, 0x97, 0x45, 0x3d, 0xff, 0xba, 0x57, 0x57, 0xff, + 0xd7, 0x74, 0x74, 0xff, 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff, + 0x4d, 0x4d, 0x80, 0xff, 0x3b, 0x3b, 0x6e, 0xff, 0x3e, 0x4e, 0x77, 0xff, + 0x18, 0x28, 0x51, 0xff, 0x46, 0x4e, 0x6f, 0xff, 0x20, 0x28, 0x49, 0xff, + 0x07, 0x18, 0x30, 0xff, 0x07, 0x18, 0x30, 0xff, 0x21, 0x29, 0x5b, 0xff, + 0x15, 0x1d, 0x4f, 0xff, 0x1a, 0x1a, 0x4c, 0xff, 0x10, 0x10, 0x42, 0xff, + 0x16, 0x16, 0x48, 0xff, 0x10, 0x10, 0x42, 0xff, 0x22, 0x33, 0x55, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x22, 0x33, 0x55, 0xff, 0x12, 0x23, 0x45, 0xff, + 0x3d, 0x45, 0x55, 0xff, 0x31, 0x39, 0x49, 0xff, 0x47, 0x4f, 0x5f, 0xff, + 0x3d, 0x45, 0x55, 0xff, 0x4c, 0x3b, 0x4c, 0xff, 0x4c, 0x3b, 0x4c, 0xff, + 0x5e, 0x4d, 0x5e, 0xff, 0x72, 0x61, 0x72, 0xff, 0xa1, 0x4f, 0x47, 0xff, + 0x97, 0x45, 0x3d, 0xff, 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, + 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff, 0x3b, 0x3b, 0x6e, 0xff, + 0x27, 0x27, 0x5a, 0xff, 0x2a, 0x3a, 0x63, 0xff, 0x04, 0x14, 0x3d, 0xff, + 0x0c, 0x14, 0x35, 0xff, 0x32, 0x3a, 0x5b, 0xff, 0x19, 0x2a, 0x42, 0xff, + 0x07, 0x18, 0x30, 0xff, 0x00, 0x07, 0x39, 0xff, 0x15, 0x1d, 0x4f, 0xff, + 0x0d, 0x1d, 0x4f, 0xff, 0x0d, 0x1d, 0x4f, 0xff, 0x0d, 0x1d, 0x4f, 0xff, + 0x00, 0x07, 0x39, 0xff, 0x12, 0x23, 0x45, 0xff, 0x12, 0x23, 0x45, 0xff, + 0x12, 0x23, 0x45, 0xff, 0x22, 0x33, 0x55, 0xff, 0x3d, 0x1c, 0x1c, 0xff, + 0x51, 0x30, 0x30, 0xff, 0x51, 0x30, 0x30, 0xff, 0x77, 0x56, 0x56, 0xff, + 0x7c, 0x49, 0x5a, 0xff, 0x7c, 0x49, 0x5a, 0xff, 0x72, 0x3f, 0x50, 0xff, + 0x72, 0x3f, 0x50, 0xff, 0xad, 0x5b, 0x53, 0xff, 0xad, 0x5b, 0x53, 0xff, + 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, 0x80, 0x80, 0xa2, 0xff, + 0x5a, 0x5a, 0x7c, 0xff, 0x3b, 0x3b, 0x6e, 0xff, 0x3b, 0x3b, 0x6e, 0xff, + 0x04, 0x14, 0x3d, 0xff, 0x18, 0x28, 0x51, 0xff, 0x0c, 0x14, 0x35, 0xff, + 0x0c, 0x14, 0x35, 0xff, 0x19, 0x2a, 0x42, 0xff, 0x07, 0x18, 0x30, 0xff, + 0x0b, 0x13, 0x45, 0xff, 0x00, 0x07, 0x39, 0xff, 0x19, 0x29, 0x5b, 0xff, + 0x19, 0x29, 0x5b, 0xff, 0x00, 0x07, 0x39, 0xff, 0x19, 0x29, 0x5b, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x12, 0x23, 0x45, 0xff, 0x11, 0x11, 0x33, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x51, 0x30, 0x30, 0xff, 0x3d, 0x1c, 0x1c, 0xff, + 0x3d, 0x1c, 0x1c, 0xff, 0x51, 0x30, 0x30, 0xff, 0x72, 0x3f, 0x50, 0xff, + 0x7c, 0x49, 0x5a, 0xff, 0x88, 0x55, 0x66, 0xff, 0x88, 0x55, 0x66, 0xff, + 0xa1, 0x4f, 0x47, 0xff, 0xad, 0x5b, 0x53, 0xff, 0xba, 0x57, 0x57, 0xff, + 0xd7, 0x74, 0x74, 0xff, 0x74, 0x84, 0xa5, 0xff, 0x4e, 0x5e, 0x7f, 0xff, + 0x41, 0x51, 0x83, 0xff, 0x2d, 0x3d, 0x6f, 0xff, 0x29, 0x32, 0x5b, 0xff, + 0x07, 0x10, 0x39, 0xff, 0x13, 0x1c, 0x45, 0xff, 0x1d, 0x26, 0x4f, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x05, 0x0d, 0x2e, 0xff, 0x05, 0x0d, 0x2e, 0xff, + 0x11, 0x19, 0x3a, 0xff, 0x11, 0x21, 0x3a, 0xff, 0x11, 0x21, 0x3a, 0xff, + 0x29, 0x21, 0x32, 0xff, 0x13, 0x0b, 0x1c, 0xff, 0x36, 0x1d, 0x47, 0xff, + 0x20, 0x07, 0x31, 0xff, 0x4f, 0x1d, 0x47, 0xff, 0x4f, 0x1d, 0x47, 0xff, + 0x56, 0x34, 0x45, 0xff, 0x76, 0x54, 0x65, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x67, 0x12, 0x34, 0xff, 0x93, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x1c, 0xff, + 0xb0, 0x4a, 0x4a, 0xff, 0xb0, 0x4a, 0x4a, 0xff, 0xd2, 0x5b, 0x5b, 0xff, + 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x5b, 0x5b, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x62, 0x72, 0x93, 0xff, 0x62, 0x72, 0x93, 0xff, 0x41, 0x51, 0x83, 0xff, + 0x41, 0x51, 0x83, 0xff, 0x1d, 0x26, 0x4f, 0xff, 0x29, 0x32, 0x5b, 0xff, + 0x07, 0x10, 0x39, 0xff, 0x13, 0x1c, 0x45, 0xff, 0x11, 0x19, 0x3a, 0xff, + 0x00, 0x03, 0x24, 0xff, 0x05, 0x0d, 0x2e, 0xff, 0x11, 0x19, 0x3a, 0xff, + 0x05, 0x15, 0x2e, 0xff, 0x05, 0x15, 0x2e, 0xff, 0x13, 0x0b, 0x1c, 0xff, + 0x07, 0x00, 0x10, 0xff, 0x20, 0x07, 0x31, 0xff, 0x20, 0x07, 0x31, 0xff, + 0x39, 0x07, 0x31, 0xff, 0x5b, 0x29, 0x53, 0xff, 0x56, 0x34, 0x45, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x76, 0x54, 0x65, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x82, 0x1c, 0x1c, 0xff, 0x93, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x1c, 0xff, + 0xb0, 0x4a, 0x4a, 0xff, 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, 0x74, 0x84, 0xa5, 0xff, + 0x4e, 0x5e, 0x7f, 0xff, 0x53, 0x63, 0x95, 0xff, 0x2d, 0x3d, 0x6f, 0xff, + 0x29, 0x32, 0x6b, 0xff, 0x1d, 0x26, 0x5f, 0xff, 0x29, 0x32, 0x6b, 0xff, + 0x13, 0x1c, 0x55, 0xff, 0x2a, 0x4b, 0x5b, 0xff, 0x0d, 0x2e, 0x3e, 0xff, + 0x00, 0x14, 0x24, 0xff, 0x00, 0x00, 0x07, 0xff, 0x05, 0x15, 0x2e, 0xff, + 0x00, 0x0b, 0x24, 0xff, 0x13, 0x0b, 0x1c, 0xff, 0x13, 0x0b, 0x1c, 0xff, + 0x20, 0x07, 0x31, 0xff, 0x2c, 0x13, 0x3d, 0xff, 0x39, 0x07, 0x31, 0xff, + 0x4f, 0x1d, 0x47, 0xff, 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, 0xb0, 0x4a, 0x4a, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xd2, 0x5b, 0x5b, 0xff, 0xd2, 0x39, 0x39, 0xff, 0xe8, 0x4f, 0x4f, 0xff, + 0xe8, 0x71, 0x71, 0xff, 0x88, 0x98, 0xb9, 0xff, 0x62, 0x72, 0x93, 0xff, + 0x2d, 0x3d, 0x6f, 0xff, 0x2d, 0x3d, 0x6f, 0xff, 0x1d, 0x26, 0x5f, 0xff, + 0x13, 0x1c, 0x55, 0xff, 0x07, 0x10, 0x49, 0xff, 0x1d, 0x26, 0x5f, 0xff, + 0x00, 0x14, 0x24, 0xff, 0x2a, 0x4b, 0x5b, 0xff, 0x00, 0x14, 0x24, 0xff, + 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x18, 0xff, 0x05, 0x15, 0x2e, 0xff, + 0x29, 0x21, 0x32, 0xff, 0x1d, 0x15, 0x26, 0xff, 0x42, 0x29, 0x53, 0xff, + 0x36, 0x1d, 0x47, 0xff, 0x5b, 0x29, 0x53, 0xff, 0x4f, 0x1d, 0x47, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x87, 0x32, 0x54, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xd2, 0x39, 0x39, 0xff, 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x7c, 0x9e, 0xaf, 0xff, 0x66, 0x88, 0x99, 0xff, 0x51, 0x62, 0x73, 0xff, + 0x1a, 0x2b, 0x3c, 0xff, 0x21, 0x21, 0x3a, 0xff, 0x0f, 0x0f, 0x28, 0xff, + 0x0d, 0x0d, 0x4f, 0xff, 0x00, 0x00, 0x35, 0xff, 0x00, 0x00, 0x20, 0xff, + 0x05, 0x05, 0x36, 0xff, 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x10, 0x18, 0x31, 0xff, 0x10, 0x18, 0x31, 0xff, 0x34, 0x24, 0x55, 0xff, + 0x3e, 0x2e, 0x5f, 0xff, 0x46, 0x14, 0x46, 0xff, 0x6c, 0x3a, 0x6c, 0xff, + 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, 0x99, 0x33, 0x44, 0xff, + 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xc3, 0x06, 0x04, 0xff, 0xcd, 0x0b, 0x0b, 0xff, 0xd7, 0x0f, 0x12, 0xff, + 0xe1, 0x14, 0x19, 0xff, 0xe7, 0x26, 0x28, 0xff, 0xe7, 0x3f, 0x44, 0xff, + 0xe7, 0x59, 0x5f, 0xff, 0xe7, 0x72, 0x7b, 0xff, 0x7c, 0x9e, 0xaf, 0xff, + 0x72, 0x94, 0xa5, 0xff, 0x6e, 0x7f, 0x90, 0xff, 0x1a, 0x2b, 0x3c, 0xff, + 0x0f, 0x0f, 0x28, 0xff, 0x00, 0x00, 0x14, 0xff, 0x00, 0x00, 0x35, 0xff, + 0x00, 0x00, 0x35, 0xff, 0x00, 0x00, 0x20, 0xff, 0x00, 0x00, 0x20, 0xff, + 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff, 0x26, 0x2e, 0x47, 0xff, + 0x26, 0x2e, 0x47, 0xff, 0x28, 0x18, 0x49, 0xff, 0x4a, 0x3a, 0x6b, 0xff, + 0x5a, 0x28, 0x5a, 0xff, 0x46, 0x14, 0x46, 0xff, 0x8c, 0x42, 0x63, 0xff, + 0x80, 0x36, 0x57, 0xff, 0x99, 0x33, 0x44, 0xff, 0xa4, 0x3e, 0x4f, 0xff, + 0x8e, 0x28, 0x39, 0xff, 0xbb, 0x11, 0x22, 0xff, 0xc7, 0x05, 0x03, 0xff, + 0xd1, 0x09, 0x0a, 0xff, 0xdb, 0x0e, 0x11, 0xff, 0xe5, 0x12, 0x18, 0xff, + 0xe9, 0x25, 0x26, 0xff, 0xe9, 0x3e, 0x42, 0xff, 0xe9, 0x58, 0x5d, 0xff, + 0xe9, 0x71, 0x79, 0xff, 0x88, 0xaa, 0xbb, 0xff, 0x66, 0x88, 0x99, 0xff, + 0x6e, 0x7f, 0x90, 0xff, 0x37, 0x48, 0x59, 0xff, 0x0f, 0x0f, 0x28, 0xff, + 0x00, 0x00, 0x14, 0xff, 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x18, 0xff, + 0x05, 0x05, 0x36, 0xff, 0x00, 0x00, 0x20, 0xff, 0x00, 0x00, 0x0c, 0xff, + 0x09, 0x11, 0x32, 0xff, 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff, + 0x3e, 0x2e, 0x5f, 0xff, 0x4a, 0x3a, 0x6b, 0xff, 0x6c, 0x3a, 0x6c, 0xff, + 0x6c, 0x3a, 0x6c, 0xff, 0x76, 0x2c, 0x4d, 0xff, 0x8c, 0x42, 0x63, 0xff, + 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, 0xa4, 0x3e, 0x4f, 0xff, + 0xbb, 0x11, 0x22, 0xff, 0xcb, 0x03, 0x02, 0xff, 0xd5, 0x08, 0x09, 0xff, + 0xdf, 0x0c, 0x10, 0xff, 0xe9, 0x11, 0x17, 0xff, 0xeb, 0x24, 0x24, 0xff, + 0xeb, 0x3d, 0x40, 0xff, 0xeb, 0x57, 0x5b, 0xff, 0xeb, 0x70, 0x77, 0xff, + 0x88, 0xaa, 0xbb, 0xff, 0x72, 0x94, 0xa5, 0xff, 0x6e, 0x7f, 0x90, 0xff, + 0x6e, 0x7f, 0x90, 0xff, 0x35, 0x35, 0x4e, 0xff, 0x00, 0x00, 0x14, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x35, 0xff, 0x11, 0x11, 0x42, 0xff, + 0x05, 0x05, 0x36, 0xff, 0x00, 0x00, 0x0c, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff, 0x4a, 0x3a, 0x6b, 0xff, + 0x4a, 0x3a, 0x6b, 0xff, 0x6c, 0x3a, 0x6c, 0xff, 0x80, 0x4e, 0x80, 0xff, + 0x8c, 0x42, 0x63, 0xff, 0x80, 0x36, 0x57, 0xff, 0xa4, 0x3e, 0x4f, 0xff, + 0xa4, 0x3e, 0x4f, 0xff, 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xcf, 0x02, 0x01, 0xff, 0xd9, 0x06, 0x08, 0xff, 0xe3, 0x0b, 0x0f, 0xff, + 0xed, 0x0f, 0x16, 0xff, 0xed, 0x23, 0x22, 0xff, 0xed, 0x3c, 0x3e, 0xff, + 0xed, 0x56, 0x59, 0xff, 0xed, 0x6f, 0x75, 0xff, 0x7c, 0x95, 0xae, 0xff, + 0x7c, 0x95, 0xae, 0xff, 0x5f, 0x78, 0x91, 0xff, 0x5f, 0x78, 0x91, 0xff, + 0x5d, 0x6e, 0x90, 0xff, 0x26, 0x37, 0x59, 0xff, 0x00, 0x00, 0x09, 0xff, + 0x04, 0x00, 0x26, 0xff, 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x33, 0x00, 0x11, 0xff, 0x3e, 0x1c, 0x3e, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, 0x6c, 0x4a, 0x6c, 0xff, + 0x6a, 0x41, 0x52, 0xff, 0x80, 0x57, 0x68, 0xff, 0x8c, 0x63, 0x74, 0xff, + 0x80, 0x57, 0x68, 0xff, 0x9f, 0x17, 0x17, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xd6, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x03, 0xff, 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff, + 0xe7, 0x1e, 0x20, 0xff, 0xea, 0x3f, 0x3e, 0xff, 0xed, 0x60, 0x5b, 0xff, + 0xf0, 0x80, 0x79, 0xff, 0x7c, 0x95, 0xae, 0xff, 0x5f, 0x78, 0x91, 0xff, + 0x5f, 0x78, 0x91, 0xff, 0x45, 0x5e, 0x77, 0xff, 0x40, 0x51, 0x73, 0xff, + 0x26, 0x37, 0x59, 0xff, 0x1e, 0x0d, 0x40, 0xff, 0x00, 0x00, 0x09, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff, 0x33, 0x33, 0x66, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x3e, 0x1c, 0x3e, 0xff, 0x55, 0x33, 0x55, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, 0x76, 0x4d, 0x5e, 0xff, + 0x6a, 0x41, 0x52, 0xff, 0x80, 0x57, 0x68, 0xff, 0x8c, 0x63, 0x74, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0x9f, 0x17, 0x17, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xd2, 0x06, 0x06, 0xff, 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x0d, 0xff, + 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff, 0xe8, 0x1e, 0x1f, 0xff, + 0xeb, 0x3e, 0x3d, 0xff, 0xee, 0x5f, 0x5a, 0xff, 0xf1, 0x80, 0x78, 0xff, + 0x6f, 0x67, 0x88, 0xff, 0x5b, 0x53, 0x74, 0xff, 0x49, 0x41, 0x62, 0xff, + 0x35, 0x2d, 0x4e, 0xff, 0x26, 0x37, 0x59, 0xff, 0x26, 0x37, 0x59, 0xff, + 0x3b, 0x2a, 0x5d, 0xff, 0x04, 0x00, 0x26, 0xff, 0x33, 0x00, 0x11, 0xff, + 0x33, 0x33, 0x66, 0xff, 0x33, 0x33, 0x66, 0xff, 0x33, 0x33, 0x66, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x55, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff, + 0x77, 0x33, 0x55, 0xff, 0x8f, 0x34, 0x55, 0xff, 0x8f, 0x34, 0x55, 0xff, + 0x8f, 0x34, 0x55, 0xff, 0xa5, 0x4a, 0x6b, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xe2, 0x00, 0x03, 0xff, 0xec, 0x05, 0x0d, 0xff, 0xe5, 0x06, 0x0e, 0xff, + 0xef, 0x10, 0x18, 0xff, 0xe9, 0x1d, 0x1e, 0xff, 0xec, 0x3e, 0x3c, 0xff, + 0xef, 0x5f, 0x59, 0xff, 0xf2, 0x7f, 0x77, 0xff, 0x6f, 0x67, 0x88, 0xff, + 0x5b, 0x53, 0x74, 0xff, 0x49, 0x41, 0x62, 0xff, 0x35, 0x2d, 0x4e, 0xff, + 0x09, 0x1a, 0x3c, 0xff, 0x26, 0x37, 0x59, 0xff, 0x3b, 0x2a, 0x5d, 0xff, + 0x1e, 0x0d, 0x40, 0xff, 0x33, 0x00, 0x11, 0xff, 0x33, 0x00, 0x11, 0xff, + 0x33, 0x33, 0x66, 0xff, 0x53, 0x53, 0x86, 0xff, 0x55, 0x33, 0x55, 0xff, + 0x6c, 0x4a, 0x6c, 0xff, 0x77, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff, + 0x83, 0x28, 0x49, 0xff, 0x99, 0x3e, 0x5f, 0xff, 0x99, 0x3e, 0x5f, 0xff, + 0x8f, 0x34, 0x55, 0xff, 0xb5, 0x2d, 0x2d, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, 0xe2, 0x00, 0x03, 0xff, + 0xec, 0x05, 0x0d, 0xff, 0xe5, 0x06, 0x0e, 0xff, 0xe9, 0x0a, 0x12, 0xff, + 0xea, 0x1d, 0x1d, 0xff, 0xed, 0x3d, 0x3b, 0xff, 0xf0, 0x5e, 0x58, 0xff, + 0xf3, 0x7f, 0x76, 0xff, 0x7c, 0x74, 0x95, 0xff, 0x56, 0x4e, 0x6f, 0xff, + 0x62, 0x49, 0x7b, 0xff, 0x4e, 0x35, 0x67, 0xff, 0x44, 0x33, 0x66, 0xff, + 0x34, 0x23, 0x56, 0xff, 0x44, 0x33, 0x66, 0xff, 0x44, 0x33, 0x66, 0xff, + 0x56, 0x23, 0x56, 0xff, 0x67, 0x00, 0x01, 0xff, 0x56, 0x23, 0x56, 0xff, + 0x76, 0x43, 0x76, 0xff, 0x8d, 0x4b, 0x6c, 0xff, 0x67, 0x25, 0x46, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x7b, 0x39, 0x5a, 0xff, 0x9f, 0x28, 0x39, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, 0xb5, 0x0b, 0x0b, 0xff, + 0xc1, 0x00, 0x00, 0xff, 0xe7, 0x11, 0x11, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xe9, 0x02, 0x0a, 0xff, 0xeb, 0x00, 0x04, 0xff, 0xec, 0x05, 0x0a, 0xff, + 0xed, 0x0a, 0x10, 0xff, 0xee, 0x0f, 0x16, 0xff, 0xeb, 0x1c, 0x1c, 0xff, + 0xec, 0x3c, 0x3b, 0xff, 0xed, 0x5c, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff, + 0x90, 0x88, 0xa9, 0xff, 0x56, 0x4e, 0x6f, 0xff, 0x4e, 0x35, 0x67, 0xff, + 0x4e, 0x35, 0x67, 0xff, 0x44, 0x33, 0x66, 0xff, 0x34, 0x23, 0x56, 0xff, + 0x34, 0x23, 0x56, 0xff, 0x54, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x8d, 0x4b, 0x6c, 0xff, 0x7b, 0x39, 0x5a, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, + 0xb5, 0x0b, 0x0b, 0xff, 0xb5, 0x0b, 0x0b, 0xff, 0xc1, 0x00, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff, + 0xe9, 0x01, 0x05, 0xff, 0xea, 0x06, 0x0b, 0xff, 0xeb, 0x0b, 0x11, 0xff, + 0xec, 0x10, 0x17, 0xff, 0xeb, 0x1c, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff, + 0xed, 0x5b, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff, 0x90, 0x88, 0xa9, 0xff, + 0x6a, 0x62, 0x83, 0xff, 0x4e, 0x35, 0x67, 0xff, 0x62, 0x49, 0x7b, 0xff, + 0x54, 0x43, 0x76, 0xff, 0x54, 0x43, 0x76, 0xff, 0x66, 0x11, 0x55, 0xff, + 0x54, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, 0xad, 0x32, 0x53, 0xff, + 0xad, 0x32, 0x53, 0xff, 0x97, 0x1c, 0x3d, 0xff, 0xa1, 0x26, 0x47, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xb5, 0x0b, 0x0b, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff, 0xe7, 0x01, 0x06, 0xff, + 0xe8, 0x06, 0x0c, 0xff, 0xe9, 0x0b, 0x12, 0xff, 0xea, 0x10, 0x18, 0xff, + 0xeb, 0x1b, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff, 0xed, 0x5b, 0x59, 0xff, + 0xee, 0x7a, 0x78, 0xff, 0x90, 0x88, 0xa9, 0xff, 0x7c, 0x74, 0x95, 0xff, + 0x62, 0x49, 0x7b, 0xff, 0x62, 0x49, 0x7b, 0xff, 0x54, 0x43, 0x76, 0xff, + 0x54, 0x43, 0x76, 0xff, 0x66, 0x11, 0x55, 0xff, 0x66, 0x11, 0x55, 0xff, + 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, 0x87, 0x10, 0x21, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x8b, 0x10, 0x31, 0xff, 0xa1, 0x26, 0x47, 0xff, + 0xa1, 0x26, 0x47, 0xff, 0x8b, 0x10, 0x31, 0xff, 0xb5, 0x0b, 0x0b, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x07, 0xff, 0xe6, 0x07, 0x0d, 0xff, + 0xe7, 0x0c, 0x13, 0xff, 0xe8, 0x11, 0x19, 0xff, 0xeb, 0x1b, 0x1c, 0xff, + 0xec, 0x3a, 0x3b, 0xff, 0xed, 0x5a, 0x59, 0xff, 0xee, 0x7a, 0x78, 0xff, + 0x9e, 0x86, 0xa7, 0xff, 0x9a, 0x82, 0xa3, 0xff, 0x8f, 0x56, 0x7f, 0xff, + 0x72, 0x39, 0x62, 0xff, 0x71, 0x3c, 0x75, 0xff, 0x75, 0x31, 0x68, 0xff, + 0x7a, 0x26, 0x5b, 0xff, 0x7e, 0x1b, 0x4e, 0xff, 0x82, 0x1c, 0x4f, 0xff, + 0x8e, 0x28, 0x5b, 0xff, 0x8e, 0x28, 0x5b, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb3, 0x0e, 0x0e, 0xff, 0xad, 0x08, 0x08, 0xff, 0xbd, 0x18, 0x18, 0xff, + 0xb7, 0x12, 0x12, 0xff, 0xbd, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x0b, 0xff, + 0xd6, 0x00, 0x08, 0xff, 0xd6, 0x00, 0x08, 0xff, 0xdb, 0x00, 0x08, 0xff, + 0xdd, 0x01, 0x07, 0xff, 0xdf, 0x02, 0x06, 0xff, 0xe1, 0x03, 0x05, 0xff, + 0xe3, 0x00, 0x00, 0xff, 0xe5, 0x07, 0x0a, 0xff, 0xe7, 0x0e, 0x14, 0xff, + 0xe9, 0x15, 0x1e, 0xff, 0xeb, 0x26, 0x24, 0xff, 0xed, 0x46, 0x42, 0xff, + 0xef, 0x66, 0x5f, 0xff, 0xf1, 0x85, 0x7d, 0xff, 0x9a, 0x82, 0xa3, 0xff, + 0xa4, 0x8c, 0xad, 0xff, 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, + 0x83, 0x3f, 0x6a, 0xff, 0x88, 0x34, 0x5d, 0xff, 0x8c, 0x29, 0x50, 0xff, + 0x90, 0x1e, 0x43, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xad, 0x08, 0x08, 0xff, + 0xbd, 0x18, 0x18, 0xff, 0xbd, 0x18, 0x18, 0xff, 0xb3, 0x0e, 0x0e, 0xff, + 0xc9, 0x03, 0x0b, 0xff, 0xc9, 0x03, 0x0b, 0xff, 0xd6, 0x00, 0x08, 0xff, + 0xdc, 0x06, 0x0e, 0xff, 0xdc, 0x05, 0x0c, 0xff, 0xde, 0x06, 0x0b, 0xff, + 0xe0, 0x07, 0x0a, 0xff, 0xe2, 0x08, 0x09, 0xff, 0xe2, 0x04, 0x03, 0xff, + 0xe4, 0x0b, 0x0d, 0xff, 0xe6, 0x12, 0x17, 0xff, 0xe8, 0x19, 0x21, 0xff, + 0xe9, 0x31, 0x2b, 0xff, 0xeb, 0x51, 0x49, 0xff, 0xed, 0x71, 0x66, 0xff, + 0xef, 0x90, 0x84, 0xff, 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff, + 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, 0x96, 0x41, 0x5f, 0xff, + 0x9a, 0x36, 0x52, 0xff, 0x9e, 0x2b, 0x45, 0xff, 0xa2, 0x20, 0x38, 0xff, + 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff, 0xb0, 0x28, 0x28, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xcc, 0x0e, 0x0e, 0xff, 0xcc, 0x0e, 0x0e, 0xff, + 0xcc, 0x0e, 0x0e, 0xff, 0xd0, 0x12, 0x12, 0xff, 0xd3, 0x0d, 0x15, 0xff, + 0xd3, 0x0d, 0x15, 0xff, 0xe6, 0x10, 0x18, 0xff, 0xdc, 0x06, 0x0e, 0xff, + 0xdd, 0x09, 0x10, 0xff, 0xdf, 0x0a, 0x0f, 0xff, 0xe1, 0x0b, 0x0e, 0xff, + 0xe3, 0x0c, 0x0d, 0xff, 0xe1, 0x08, 0x06, 0xff, 0xe3, 0x0f, 0x10, 0xff, + 0xe5, 0x16, 0x1a, 0xff, 0xe7, 0x1d, 0x24, 0xff, 0xe7, 0x3c, 0x33, 0xff, + 0xe9, 0x5c, 0x50, 0xff, 0xeb, 0x7c, 0x6e, 0xff, 0xed, 0x9b, 0x8b, 0xff, + 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff, 0xa9, 0x70, 0x99, 0xff, + 0x8f, 0x56, 0x7f, 0xff, 0xa8, 0x44, 0x54, 0xff, 0xac, 0x39, 0x47, 0xff, + 0xb0, 0x2e, 0x3a, 0xff, 0xb5, 0x23, 0x2d, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff, + 0xd6, 0x18, 0x18, 0xff, 0xd0, 0x12, 0x12, 0xff, 0xd6, 0x18, 0x18, 0xff, + 0xd6, 0x18, 0x18, 0xff, 0xdf, 0x19, 0x21, 0xff, 0xdf, 0x19, 0x21, 0xff, + 0xe6, 0x10, 0x18, 0xff, 0xe6, 0x10, 0x18, 0xff, 0xde, 0x0e, 0x14, 0xff, + 0xe0, 0x0f, 0x13, 0xff, 0xe2, 0x10, 0x12, 0xff, 0xe4, 0x11, 0x11, 0xff, + 0xe0, 0x0c, 0x09, 0xff, 0xe2, 0x13, 0x13, 0xff, 0xe4, 0x1a, 0x1d, 0xff, + 0xe6, 0x21, 0x27, 0xff, 0xe5, 0x47, 0x3a, 0xff, 0xe7, 0x67, 0x57, 0xff, + 0xe9, 0x87, 0x75, 0xff, 0xeb, 0xa6, 0x92, 0xff, 0xd5, 0x8b, 0x83, 0xff, + 0xc1, 0x77, 0x6f, 0xff, 0xb9, 0x56, 0x56, 0xff, 0xb9, 0x56, 0x56, 0xff, + 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, 0xb9, 0x35, 0x35, 0xff, + 0xb9, 0x35, 0x35, 0xff, 0xcb, 0x2e, 0x2c, 0xff, 0xcb, 0x2c, 0x2c, 0xff, + 0xcb, 0x2a, 0x2c, 0xff, 0xcb, 0x28, 0x2c, 0xff, 0xd7, 0x20, 0x24, 0xff, + 0xda, 0x20, 0x23, 0xff, 0xdd, 0x1f, 0x22, 0xff, 0xe0, 0x1f, 0x21, 0xff, + 0xe7, 0x22, 0x24, 0xff, 0xe7, 0x20, 0x24, 0xff, 0xe7, 0x1d, 0x24, 0xff, + 0xe7, 0x1b, 0x24, 0xff, 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff, + 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff, 0xdf, 0x1a, 0x20, 0xff, + 0xe0, 0x23, 0x25, 0xff, 0xe1, 0x2b, 0x2a, 0xff, 0xe2, 0x34, 0x2f, 0xff, + 0xe3, 0x54, 0x49, 0xff, 0xe4, 0x69, 0x5e, 0xff, 0xe5, 0x7e, 0x74, 0xff, + 0xe6, 0x92, 0x89, 0xff, 0xe7, 0x9d, 0x95, 0xff, 0xd5, 0x8b, 0x83, 0xff, + 0xcd, 0x6a, 0x6a, 0xff, 0xb9, 0x56, 0x56, 0xff, 0xcd, 0x49, 0x49, 0xff, + 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, + 0xd8, 0x46, 0x46, 0xff, 0xd8, 0x44, 0x46, 0xff, 0xd8, 0x42, 0x46, 0xff, + 0xd8, 0x40, 0x46, 0xff, 0xdd, 0x3c, 0x3f, 0xff, 0xe0, 0x3b, 0x3e, 0xff, + 0xe3, 0x3b, 0x3d, 0xff, 0xe6, 0x3a, 0x3c, 0xff, 0xe9, 0x3d, 0x3c, 0xff, + 0xe9, 0x3a, 0x3c, 0xff, 0xe9, 0x38, 0x3c, 0xff, 0xe9, 0x35, 0x3c, 0xff, + 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff, + 0xe7, 0x36, 0x3b, 0xff, 0xe3, 0x34, 0x3a, 0xff, 0xe4, 0x3d, 0x3f, 0xff, + 0xe5, 0x45, 0x44, 0xff, 0xe6, 0x4e, 0x49, 0xff, 0xe6, 0x63, 0x59, 0xff, + 0xe7, 0x78, 0x6f, 0xff, 0xe8, 0x8d, 0x84, 0xff, 0xe9, 0xa2, 0x99, 0xff, + 0xfb, 0xb1, 0xa9, 0xff, 0xe7, 0x9d, 0x95, 0xff, 0xdf, 0x7c, 0x7c, 0xff, + 0xcd, 0x6a, 0x6a, 0xff, 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff, + 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff, 0xe5, 0x5f, 0x5f, 0xff, + 0xe5, 0x5d, 0x5f, 0xff, 0xe5, 0x5b, 0x5f, 0xff, 0xe5, 0x59, 0x5f, 0xff, + 0xe3, 0x58, 0x59, 0xff, 0xe6, 0x57, 0x58, 0xff, 0xe9, 0x57, 0x57, 0xff, + 0xec, 0x56, 0x56, 0xff, 0xeb, 0x58, 0x53, 0xff, 0xeb, 0x55, 0x53, 0xff, + 0xeb, 0x53, 0x53, 0xff, 0xeb, 0x50, 0x53, 0xff, 0xeb, 0x51, 0x55, 0xff, + 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff, + 0xe7, 0x4f, 0x53, 0xff, 0xe8, 0x57, 0x58, 0xff, 0xe9, 0x60, 0x5d, 0xff, + 0xea, 0x68, 0x62, 0xff, 0xe9, 0x73, 0x6a, 0xff, 0xea, 0x87, 0x7f, 0xff, + 0xeb, 0x9c, 0x94, 0xff, 0xec, 0xb1, 0xa9, 0xff, 0xfb, 0xb1, 0xa9, 0xff, + 0xfb, 0xb1, 0xa9, 0xff, 0xf3, 0x90, 0x90, 0xff, 0xf3, 0x90, 0x90, 0xff, + 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff, + 0xf8, 0x7c, 0x7c, 0xff, 0xf2, 0x77, 0x79, 0xff, 0xf2, 0x75, 0x79, 0xff, + 0xf2, 0x73, 0x79, 0xff, 0xf2, 0x71, 0x79, 0xff, 0xe9, 0x73, 0x74, 0xff, + 0xec, 0x73, 0x73, 0xff, 0xef, 0x72, 0x72, 0xff, 0xf2, 0x72, 0x71, 0xff, + 0xed, 0x72, 0x6b, 0xff, 0xed, 0x70, 0x6b, 0xff, 0xed, 0x6d, 0x6b, 0xff, + 0xed, 0x6b, 0x6b, 0xff, 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff, + 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff, 0xeb, 0x69, 0x6d, 0xff, + 0xec, 0x71, 0x72, 0xff, 0xed, 0x7a, 0x77, 0xff, 0xee, 0x82, 0x7c, 0xff, + 0xec, 0x82, 0x7a, 0xff, 0xed, 0x97, 0x8f, 0xff, 0xee, 0xab, 0xa4, 0xff, + 0xef, 0xc0, 0xba, 0xff, + ]), +}; + +var img_32x32_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([ + 0x84, 0x94, 0xb4, 0x05, 0xf6, 0xff, 0x99, 0x00, 0x74, 0x84, 0xa4, 0x05, + 0xff, 0xf6, 0x08, 0x91, 0x5f, 0x6f, 0x8f, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x4b, 0x5b, 0x6b, 0x00, 0xff, 0xfd, 0x20, 0x00, 0x56, 0x66, 0x6e, 0x00, + 0xdf, 0xfd, 0x00, 0x02, 0x0e, 0x67, 0x33, 0x54, 0xff, 0xb9, 0x00, 0xc4, + 0xeb, 0x78, 0x54, 0x61, 0xff, 0xff, 0x08, 0x00, 0x8b, 0x4b, 0x53, 0x00, + 0xff, 0xf7, 0x00, 0x00, 0xeb, 0x79, 0x44, 0x74, 0xff, 0xff, 0x80, 0x00, + 0x01, 0x10, 0x3f, 0x00, 0xfb, 0xb7, 0x00, 0x00, 0x10, 0x27, 0x3a, 0x00, + 0xff, 0xfb, 0x00, 0xc4, 0x05, 0x24, 0x00, 0x38, 0xff, 0xef, 0x00, 0x10, + 0x05, 0x13, 0x23, 0x50, 0xfe, 0xff, 0x00, 0x00, 0x41, 0x4c, 0x5c, 0x25, + 0xff, 0xa7, 0x00, 0xb0, 0x61, 0x43, 0x53, 0x00, 0xfe, 0xff, 0x01, 0x00, + 0x8b, 0x3b, 0x33, 0x01, 0xff, 0x9e, 0x00, 0x60, 0x0e, 0x79, 0x34, 0x71, + 0xff, 0xff, 0x80, 0x00, 0x18, 0x20, 0x58, 0x04, 0xbb, 0xbf, 0x04, 0x40, + 0x16, 0x25, 0x3d, 0x00, 0xff, 0xff, 0x00, 0x00, 0x03, 0x10, 0x2f, 0x00, + 0xff, 0xdf, 0x00, 0x60, 0x0c, 0x24, 0x21, 0x31, 0xee, 0xff, 0x00, 0x10, + 0x79, 0x3f, 0x50, 0x00, 0xff, 0xff, 0x00, 0x00, 0x93, 0x34, 0x34, 0x21, + 0xfa, 0xf7, 0x07, 0x08, 0xf9, 0x66, 0xc3, 0x31, 0xff, 0x3f, 0x00, 0xc0, + 0x74, 0x94, 0xa4, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x22, 0x0d, 0x7f, 0x70, 0x08, 0x00, + 0x23, 0x28, 0x43, 0x00, 0xff, 0xf7, 0x00, 0x08, 0x6a, 0x3f, 0x6d, 0x04, + 0xe7, 0xef, 0x19, 0x00, 0xa6, 0x46, 0x56, 0x00, 0xf7, 0x77, 0x00, 0x00, + 0xc3, 0x08, 0x09, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xef, 0x43, 0x4b, 0x00, + 0xff, 0xff, 0x00, 0x70, 0x6c, 0x74, 0x94, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x21, 0x35, 0x57, 0x04, 0xf7, 0xcf, 0x88, 0x30, 0x06, 0x13, 0x33, 0x65, + 0x77, 0x77, 0x88, 0x00, 0x0e, 0x35, 0x42, 0x4c, 0xea, 0x3f, 0x11, 0x80, + 0x88, 0x64, 0x74, 0x01, 0xf2, 0xbb, 0x08, 0x00, 0x1c, 0x00, 0xa2, 0x24, + 0xf0, 0xff, 0x01, 0x00, 0xd2, 0x01, 0x01, 0x01, 0xff, 0xfc, 0x00, 0x04, + 0xe1, 0x3b, 0x3b, 0x00, 0xff, 0x1f, 0x00, 0x60, 0x58, 0x4f, 0x70, 0x01, + 0x7f, 0xff, 0x80, 0x00, 0x3b, 0x2d, 0x5f, 0x01, 0xfa, 0xff, 0x07, 0x10, + 0x6a, 0x2e, 0x55, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x30, 0x50, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x15, 0x23, 0xb1, 0x11, 0xf2, 0xff, 0x0e, 0x00, + 0xdf, 0x00, 0x00, 0x01, 0xfc, 0xbf, 0x02, 0x20, 0xe0, 0x02, 0x0a, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0xe0, 0x27, 0x27, 0x21, 0xff, 0xe8, 0x00, 0x10, + 0x90, 0x6e, 0x96, 0x01, 0xff, 0xff, 0xc0, 0x00, 0x8e, 0x3c, 0x5e, 0x00, + 0xef, 0xff, 0x00, 0x00, 0xf2, 0x22, 0x82, 0x51, 0xff, 0xff, 0x00, 0x01, + 0xb2, 0x17, 0x17, 0x01, 0xaa, 0xba, 0x45, 0x54, 0xc2, 0x0f, 0x08, 0x04, + 0x7e, 0xef, 0x80, 0x01, 0xd9, 0x09, 0x10, 0x00, 0xff, 0xb3, 0x00, 0x00, + 0xe0, 0x12, 0x1a, 0x01, 0x6c, 0xff, 0x10, 0x20, 0xef, 0x4b, 0x43, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xb3, 0x53, 0x53, 0x01, 0xef, 0xff, 0x00, 0x00, + 0xc0, 0x40, 0x40, 0x00, 0xdd, 0xdd, 0x22, 0x22, 0xd0, 0x40, 0x40, 0x00, + 0xdd, 0xdd, 0x00, 0x00, 0xd8, 0x38, 0x38, 0x00, 0xfd, 0xdd, 0x00, 0x00, + 0xe0, 0x33, 0x3b, 0x01, 0xdb, 0xbf, 0x04, 0x40, 0xe0, 0x47, 0x4e, 0x00, + 0xdf, 0xff, 0x00, 0x00, 0xd8, 0x37, 0x3e, 0x00, 0xee, 0xdd, 0x10, 0x20, + 0xe0, 0x73, 0x6b, 0x00, 0xff, 0xff, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9c, 0xbd, 0xff, + 0x7c, 0x8c, 0xad, 0xff, 0x7b, 0x8c, 0xad, 0xff, 0x6b, 0x7c, 0x9d, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x5a, 0x6b, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x6b, 0x7c, 0xff, + 0x5a, 0x6b, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x52, 0x5a, 0xff, 0x66, 0x66, 0x77, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x60, 0xff, 0x3e, 0x3e, 0x60, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x84, 0xa5, 0xff, + 0x52, 0x62, 0x83, 0xff, 0x52, 0x63, 0x84, 0xff, 0x41, 0x52, 0x73, 0xff, + 0x41, 0x52, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x28, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x3e, 0x60, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x4a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x17, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x33, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5b, 0x6b, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x62, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x39, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x39, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x41, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x39, 0xff, + 0x08, 0x10, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x18, 0x29, 0x41, 0xff, + 0x08, 0x19, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x29, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x5a, 0x52, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x6c, 0xff, + 0x00, 0x10, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x19, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x29, 0x39, 0xff, 0x39, 0x18, 0x28, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x0b, 0x2d, 0xff, 0x44, 0x22, 0x44, 0xff, 0x44, 0x22, 0x44, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0x42, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x20, 0x20, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x29, 0x62, 0xff, 0x29, 0x32, 0x6b, 0xff, + 0x18, 0x21, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x3e, 0x71, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd2, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x39, 0x6b, 0xff, + 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x08, 0x08, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x3a, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x31, 0xff, + 0x08, 0x08, 0x31, 0xff, 0x00, 0x00, 0x07, 0xff, 0x08, 0x08, 0x31, 0xff, + 0x29, 0x31, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x42, 0x63, 0xff, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x42, 0x52, 0xff, + 0xa5, 0x42, 0x52, 0xff, 0x94, 0x31, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x29, 0x39, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x4b, 0x6d, 0xff, 0x6d, 0x4b, 0x6d, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x63, 0x73, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x2d, 0x2d, 0xff, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x39, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xef, 0x41, 0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x33, 0x55, 0xff, 0x66, 0x33, 0x55, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x42, 0x52, 0xff, 0x8c, 0x42, 0x52, 0xff, + 0x8c, 0x42, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x41, 0x41, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x29, 0x5b, 0xff, + 0x18, 0x07, 0x39, 0xff, 0x22, 0x11, 0x33, 0xff, 0x22, 0x11, 0x33, 0xff, + 0x43, 0x43, 0x76, 0xff, 0x43, 0x43, 0x76, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x4b, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x4a, 0x5a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x21, 0x52, 0xff, 0x41, 0x31, 0x62, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x99, 0x22, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x21, 0xff, + 0xf8, 0x32, 0x32, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x21, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x0b, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0xff, 0xe6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x18, 0x5a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x17, 0x17, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x4a, 0x7b, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0x4a, 0xff, 0x82, 0x1c, 0x4f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x10, 0x10, 0xff, 0xad, 0x08, 0x08, 0xff, 0xbd, 0x18, 0x18, 0xff, + 0xb5, 0x10, 0x10, 0xff, 0xbe, 0x00, 0x00, 0xff, 0xc6, 0x08, 0x08, 0xff, + 0xd6, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0x18, 0xff, + 0xef, 0x18, 0x20, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0x08, 0x10, 0xff, 0xe7, 0x10, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x52, 0x7c, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff, + 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xde, 0x08, 0x10, 0xff, 0xde, 0x08, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x52, 0x7c, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x11, 0x19, 0xff, 0xde, 0x08, 0x10, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x21, 0x29, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x52, 0x52, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xde, 0x29, 0x29, 0xff, 0xe6, 0x31, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x4a, 0x4a, 0xff, + 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff, + 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff, + 0xd6, 0x42, 0x42, 0xff, 0xde, 0x39, 0x39, 0xff, 0xde, 0x39, 0x39, 0xff, + 0xde, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x31, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x39, 0x39, 0xff, 0xde, 0x31, 0x39, 0xff, 0xe6, 0x39, 0x41, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x52, 0x5a, 0xff, + 0xef, 0x52, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ]), +}; + +var img_32x32_rgba_etc2 = { + compressed: new Uint8Array([ + 0x04, 0x1d, 0x6d, 0x26, 0x91, 0x48, 0x84, 0x45, 0x8d, 0x9d, 0xb6, 0x4a, + 0xc4, 0x80, 0x83, 0x97, 0x0b, 0x12, 0x48, 0x94, 0x88, 0x44, 0x42, 0x25, + 0x64, 0x74, 0x95, 0x4b, 0xae, 0xa2, 0x91, 0x05, 0x15, 0x11, 0x68, 0x86, + 0x84, 0x44, 0x54, 0x26, 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42, + 0x1b, 0x12, 0x68, 0x66, 0xa7, 0x66, 0xf6, 0x6f, 0x64, 0x74, 0x85, 0x49, + 0xae, 0xea, 0x89, 0xba, 0x1d, 0x12, 0x66, 0x76, 0xa7, 0x6a, 0x76, 0x86, + 0x64, 0x74, 0x7c, 0x4b, 0xa8, 0x8a, 0xa4, 0x81, 0x15, 0x11, 0x22, 0xf4, + 0x26, 0x44, 0x56, 0x84, 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a, + 0x0b, 0x1b, 0x22, 0xf2, 0x25, 0x44, 0x44, 0x88, 0x75, 0x74, 0x86, 0x25, + 0xaa, 0x6e, 0x71, 0x11, 0x04, 0x1d, 0x22, 0xe4, 0x45, 0x48, 0x86, 0x91, + 0xbe, 0x7f, 0x04, 0x62, 0xbb, 0x6c, 0x86, 0xcf, 0x0b, 0x1b, 0x6d, 0x24, + 0x89, 0x44, 0x02, 0x25, 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6, + 0x1a, 0x10, 0x6d, 0x16, 0x88, 0x42, 0x63, 0x37, 0x21, 0x30, 0x5f, 0x4a, + 0xbd, 0xe8, 0x8e, 0x5b, 0x37, 0x21, 0x68, 0x86, 0x44, 0x42, 0x52, 0x2f, + 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10, 0x4a, 0x3b, 0x64, 0x54, + 0x66, 0x42, 0x74, 0x2f, 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9, + 0x4b, 0x3a, 0x42, 0xf4, 0x2f, 0x46, 0x64, 0x66, 0x05, 0x13, 0x23, 0x57, + 0x66, 0xd6, 0x34, 0xc4, 0x38, 0x22, 0x33, 0x74, 0x2f, 0x46, 0x66, 0x84, + 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4, 0x1f, 0x2b, 0x12, 0xf2, + 0x25, 0x44, 0x46, 0x88, 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01, + 0x0b, 0x1b, 0x12, 0xf2, 0x25, 0x44, 0x04, 0x89, 0x9a, 0x48, 0x41, 0x2e, + 0x00, 0x31, 0xf0, 0xc5, 0x10, 0x19, 0x6d, 0x24, 0x48, 0x22, 0x59, 0x77, + 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, 0x32, 0x22, 0x6d, 0x24, + 0x88, 0x22, 0x51, 0x77, 0x18, 0x20, 0x4a, 0x27, 0x6b, 0x90, 0x0e, 0x35, + 0x59, 0x42, 0x44, 0x02, 0x25, 0x12, 0xe9, 0x77, 0x00, 0x0b, 0x29, 0x2f, + 0xcc, 0x29, 0xf0, 0x87, 0x8c, 0x32, 0x68, 0x54, 0x66, 0x42, 0xf3, 0x37, + 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, 0x96, 0x4a, 0x42, 0xf4, + 0x2e, 0x46, 0x66, 0x45, 0x33, 0x18, 0x40, 0x26, 0x06, 0x76, 0x2e, 0x3e, + 0x71, 0x31, 0x12, 0xf2, 0x25, 0x44, 0x46, 0x88, 0xb9, 0x06, 0x32, 0x2b, + 0x02, 0x13, 0x10, 0x03, 0x38, 0x22, 0x9b, 0xf1, 0x2e, 0x44, 0x46, 0x91, + 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, 0x15, 0x11, 0x97, 0x70, + 0x25, 0x44, 0x06, 0x91, 0x6a, 0x06, 0x6b, 0x33, 0xf1, 0x05, 0x01, 0xff, + 0x15, 0x17, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xff, 0x74, 0x95, 0xa6, 0x2c, + 0x70, 0xf0, 0xbe, 0x5c, 0x40, 0x24, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xbf, + 0x1d, 0x1d, 0x32, 0x4e, 0xfe, 0xf6, 0x4c, 0xe8, 0x7f, 0x4b, 0x69, 0x22, + 0x00, 0x92, 0xdb, 0xbf, 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b, + 0xc7, 0x32, 0x68, 0x94, 0x24, 0x13, 0x69, 0xbf, 0x23, 0x28, 0x43, 0x26, + 0x03, 0x11, 0xea, 0xd1, 0xd9, 0x32, 0x33, 0x73, 0x2e, 0x42, 0x46, 0x89, + 0x63, 0x30, 0x66, 0x46, 0x05, 0x23, 0x5b, 0xa1, 0x95, 0x4b, 0xbb, 0xf1, + 0x2d, 0x24, 0x06, 0x92, 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8, + 0x4b, 0x3a, 0xdb, 0xf9, 0x2d, 0x20, 0x04, 0x92, 0x60, 0x86, 0x04, 0xf6, + 0x18, 0x46, 0x80, 0x00, 0x1c, 0x12, 0xdf, 0xf9, 0x2d, 0x44, 0x96, 0xdb, + 0x72, 0xa6, 0x0d, 0x73, 0x8b, 0x2f, 0x64, 0x48, 0x15, 0x17, 0x6d, 0xb2, + 0x52, 0x90, 0x0f, 0xf5, 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f, + 0x3d, 0x21, 0x49, 0xb0, 0x09, 0x92, 0x0f, 0xb5, 0x31, 0x40, 0x63, 0x6c, + 0x71, 0xfc, 0x2d, 0x09, 0x7d, 0x34, 0x49, 0xb0, 0x0a, 0xb2, 0x0f, 0xf4, + 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33, 0xbb, 0x5a, 0x00, 0xab, + 0x01, 0xd6, 0x0f, 0xa8, 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83, + 0xc7, 0x32, 0xfa, 0x1f, 0xa1, 0xd4, 0x28, 0x13, 0x7b, 0x55, 0x67, 0x27, + 0x84, 0x6f, 0x61, 0x29, 0x91, 0x4b, 0xfa, 0xcb, 0x20, 0x00, 0xa4, 0x9b, + 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21, 0x4a, 0x21, 0xff, 0x5b, + 0x20, 0x00, 0x94, 0x9b, 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03, + 0x1b, 0x12, 0xff, 0xeb, 0x60, 0x25, 0x26, 0xdb, 0x72, 0x9e, 0x0c, 0x7a, + 0xa1, 0x2f, 0x43, 0x87, 0x0d, 0x19, 0x29, 0x20, 0x09, 0xb0, 0x0f, 0xac, + 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, 0x2f, 0x21, 0x29, 0xb0, + 0x4a, 0x80, 0x1d, 0x60, 0x0e, 0x15, 0x43, 0x67, 0x13, 0x33, 0x62, 0xfc, + 0x59, 0x49, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, 0xb8, 0x04, 0xb1, 0xb3, + 0x31, 0xcf, 0x01, 0x11, 0x7d, 0x34, 0x81, 0x3d, 0x0b, 0xf4, 0x2f, 0x42, + 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, 0x84, 0x37, 0xf4, 0x3f, + 0x0b, 0xd0, 0xba, 0x13, 0x58, 0x14, 0xc9, 0x1a, 0x01, 0x77, 0x72, 0x08, + 0x63, 0x4b, 0xf6, 0x0d, 0x01, 0x80, 0xa0, 0x53, 0xd9, 0x0f, 0x08, 0x42, + 0xef, 0xef, 0x89, 0x03, 0x37, 0x22, 0xfa, 0x0b, 0x02, 0x05, 0x34, 0x9b, + 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, 0x15, 0x11, 0xd6, 0x08, + 0x01, 0x05, 0x24, 0x9b, 0x74, 0x9c, 0x07, 0xf7, 0x9b, 0x2f, 0x43, 0x47, + 0x0a, 0x12, 0x49, 0x22, 0x52, 0x04, 0xa8, 0x01, 0x98, 0x84, 0xa5, 0x0e, + 0xf1, 0xd2, 0x10, 0xec, 0x14, 0x11, 0x05, 0x38, 0x0a, 0xb0, 0x1f, 0x60, + 0xb8, 0xbc, 0xfa, 0xc2, 0x10, 0x85, 0xc8, 0xd2, 0x2f, 0x21, 0x05, 0x38, + 0x0b, 0xa0, 0xad, 0x01, 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f, + 0x39, 0x3b, 0xb0, 0xad, 0x02, 0xf4, 0x1f, 0x41, 0xb3, 0x10, 0x10, 0x03, + 0x24, 0x57, 0x8b, 0x3a, 0x3d, 0x21, 0xf0, 0x2f, 0x02, 0xd0, 0x2d, 0x0b, + 0xca, 0x08, 0x10, 0x22, 0x73, 0x33, 0x9f, 0x89, 0x30, 0x22, 0xf4, 0x1d, + 0x02, 0xa0, 0xa8, 0x53, 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46, + 0x1f, 0x2b, 0xb0, 0x18, 0x0a, 0x05, 0x32, 0x9b, 0x70, 0x80, 0x04, 0x76, + 0x1c, 0x56, 0xe2, 0x03, 0x0b, 0x12, 0xb0, 0x18, 0x09, 0x05, 0x22, 0x92, + 0x74, 0xa6, 0x0c, 0xfa, 0xa5, 0x37, 0x0a, 0x50, 0x04, 0x1d, 0x4d, 0xb4, + 0x9b, 0x29, 0x30, 0x52, 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c, + 0x0f, 0x11, 0x4d, 0xb2, 0x9b, 0x29, 0x30, 0x53, 0xd2, 0x53, 0x53, 0x47, + 0x77, 0x77, 0x99, 0x88, 0x0d, 0x19, 0x80, 0xaa, 0x0a, 0xd0, 0x2f, 0x41, + 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4, 0x11, 0x12, 0xd0, 0xaf, + 0x42, 0xf4, 0x2f, 0x82, 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3, + 0x19, 0x10, 0xa1, 0x3a, 0x13, 0xa1, 0x38, 0x53, 0x72, 0xa2, 0x0c, 0xf3, + 0x18, 0x4f, 0x71, 0xa0, 0x10, 0x19, 0xf0, 0x2d, 0x0a, 0xa0, 0xb8, 0x53, + 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2, 0x0b, 0x1b, 0xa0, 0xa8, + 0x0a, 0x05, 0x32, 0x93, 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61, + 0x04, 0x1d, 0xa0, 0xa0, 0x52, 0x29, 0x34, 0x9b, 0x70, 0x54, 0x15, 0x73, + 0xa7, 0x3f, 0x72, 0x22, + ]), + decompressed: new Uint8Array([ + 0xa9, 0xb9, 0xd2, 0x00, 0xa9, 0xb9, 0xd2, 0x00, 0x90, 0xa1, 0xc2, 0x01, + 0x7c, 0x8d, 0xae, 0x01, 0x80, 0x90, 0xb1, 0x03, 0x6c, 0x7c, 0x9d, 0x03, + 0x80, 0x90, 0xb1, 0x03, 0x80, 0x90, 0xb1, 0x06, 0x7c, 0x8d, 0xaf, 0x08, + 0x7c, 0x8d, 0xaf, 0x08, 0x88, 0x99, 0xbb, 0x0b, 0x66, 0x77, 0x99, 0x0b, + 0x6f, 0x80, 0x91, 0x0e, 0x83, 0x94, 0xa5, 0x0e, 0x83, 0x94, 0xa5, 0x0e, + 0x6f, 0x80, 0x91, 0x0e, 0x80, 0x90, 0x98, 0x10, 0x6c, 0x7c, 0x84, 0x10, + 0x6c, 0x7c, 0x84, 0x10, 0x6c, 0x7c, 0x84, 0x10, 0x72, 0x72, 0x83, 0x0e, + 0x7c, 0x7c, 0x8d, 0x0b, 0x72, 0x72, 0x83, 0x0b, 0x88, 0x88, 0x99, 0x08, + 0x88, 0x88, 0x99, 0x06, 0x88, 0x88, 0x99, 0x06, 0x88, 0x88, 0x99, 0x04, + 0x88, 0x88, 0x99, 0x04, 0x7d, 0x7e, 0x82, 0x02, 0x8f, 0x8d, 0x8f, 0x01, + 0xa0, 0x9d, 0x9c, 0x01, 0xb2, 0xac, 0xa9, 0x00, 0xa9, 0xb9, 0xd2, 0x00, + 0x95, 0xa5, 0xbe, 0x01, 0x90, 0xa1, 0xc2, 0x01, 0x7c, 0x8d, 0xae, 0x02, + 0x5a, 0x6a, 0x8b, 0x03, 0x5a, 0x6a, 0x8b, 0x03, 0x5a, 0x6a, 0x8b, 0x06, + 0x5a, 0x6a, 0x8b, 0x09, 0x66, 0x77, 0x99, 0x0b, 0x72, 0x83, 0xa5, 0x0b, + 0x66, 0x77, 0x99, 0x0e, 0x66, 0x77, 0x99, 0x12, 0x49, 0x5a, 0x6b, 0x13, + 0x49, 0x5a, 0x6b, 0x13, 0x5d, 0x6e, 0x7f, 0x16, 0x5d, 0x6e, 0x7f, 0x16, + 0x5a, 0x6a, 0x72, 0x18, 0x6c, 0x7c, 0x84, 0x15, 0x6c, 0x7c, 0x84, 0x15, + 0x46, 0x56, 0x5e, 0x15, 0x66, 0x66, 0x77, 0x12, 0x66, 0x66, 0x77, 0x12, + 0x66, 0x66, 0x77, 0x0e, 0x66, 0x66, 0x77, 0x0b, 0x72, 0x72, 0x83, 0x09, + 0x72, 0x72, 0x83, 0x09, 0x72, 0x72, 0x83, 0x06, 0x66, 0x66, 0x77, 0x04, + 0x82, 0x6c, 0x71, 0x03, 0x94, 0x7b, 0x7e, 0x02, 0xa5, 0x8b, 0x8b, 0x01, + 0xb7, 0x9a, 0x98, 0x01, 0xa9, 0xb9, 0xd2, 0x01, 0x95, 0xa5, 0xbe, 0x01, + 0x6a, 0x7b, 0x9c, 0x02, 0x6a, 0x7b, 0x9c, 0x03, 0x5f, 0x6f, 0x98, 0x06, + 0x4b, 0x5b, 0x84, 0x06, 0x39, 0x49, 0x72, 0x09, 0x4b, 0x5b, 0x84, 0x0c, + 0x3f, 0x50, 0x72, 0x0e, 0x55, 0x66, 0x88, 0x12, 0x55, 0x66, 0x88, 0x12, + 0x33, 0x44, 0x66, 0x17, 0x4d, 0x4d, 0x5e, 0x19, 0x3b, 0x3b, 0x4c, 0x1c, + 0x3b, 0x3b, 0x4c, 0x1f, 0x4d, 0x4d, 0x5e, 0x1f, 0x4b, 0x5b, 0x63, 0x1e, + 0x4b, 0x5b, 0x63, 0x1e, 0x5f, 0x6f, 0x77, 0x1e, 0x4b, 0x5b, 0x63, 0x1b, + 0x3c, 0x3c, 0x5e, 0x1b, 0x3c, 0x3c, 0x5e, 0x17, 0x50, 0x50, 0x72, 0x12, + 0x3c, 0x3c, 0x5e, 0x12, 0x50, 0x3f, 0x61, 0x0f, 0x50, 0x3f, 0x61, 0x0c, + 0x5a, 0x49, 0x6b, 0x09, 0x66, 0x55, 0x77, 0x06, 0x88, 0x5a, 0x5f, 0x05, + 0x99, 0x69, 0x6c, 0x03, 0xab, 0x79, 0x79, 0x02, 0xbc, 0x88, 0x86, 0x01, + 0x95, 0xa5, 0xbe, 0x01, 0x6f, 0x7f, 0x98, 0x02, 0x7c, 0x8d, 0xae, 0x03, + 0x56, 0x67, 0x88, 0x05, 0x4b, 0x5b, 0x84, 0x06, 0x39, 0x49, 0x72, 0x09, + 0x39, 0x49, 0x72, 0x0c, 0x25, 0x35, 0x5e, 0x0f, 0x49, 0x5a, 0x7c, 0x12, + 0x3f, 0x50, 0x72, 0x17, 0x33, 0x44, 0x66, 0x1b, 0x33, 0x44, 0x66, 0x1e, + 0x27, 0x27, 0x38, 0x22, 0x27, 0x27, 0x38, 0x27, 0x27, 0x27, 0x38, 0x27, + 0x27, 0x27, 0x38, 0x27, 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x29, + 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x24, 0x50, 0x50, 0x72, 0x21, + 0x2a, 0x2a, 0x4c, 0x1e, 0x16, 0x16, 0x38, 0x1b, 0x2a, 0x2a, 0x4c, 0x17, + 0x50, 0x3f, 0x61, 0x14, 0x5a, 0x49, 0x6b, 0x0f, 0x50, 0x3f, 0x61, 0x0c, + 0x50, 0x3f, 0x61, 0x09, 0x8d, 0x48, 0x4e, 0x06, 0x9e, 0x57, 0x5b, 0x05, + 0xb0, 0x67, 0x68, 0x03, 0xc1, 0x76, 0x75, 0x02, 0x80, 0x80, 0xa2, 0x01, + 0x6e, 0x6e, 0x90, 0x04, 0x4d, 0x4d, 0x80, 0x04, 0x61, 0x61, 0x94, 0x06, + 0x3e, 0x4e, 0x77, 0x0b, 0x3e, 0x4e, 0x77, 0x0b, 0x20, 0x28, 0x49, 0x11, + 0x20, 0x28, 0x49, 0x14, 0x19, 0x2a, 0x42, 0x1d, 0x2d, 0x3e, 0x56, 0x1d, + 0x21, 0x29, 0x5b, 0x23, 0x15, 0x1d, 0x4f, 0x29, 0x10, 0x10, 0x42, 0x2c, + 0x16, 0x16, 0x48, 0x35, 0x10, 0x10, 0x42, 0x35, 0x1a, 0x1a, 0x4c, 0x35, + 0x11, 0x11, 0x33, 0x33, 0x22, 0x33, 0x55, 0x33, 0x11, 0x11, 0x33, 0x33, + 0x32, 0x43, 0x65, 0x33, 0x47, 0x4f, 0x5f, 0x2e, 0x53, 0x5b, 0x6b, 0x28, + 0x31, 0x39, 0x49, 0x28, 0x31, 0x39, 0x49, 0x1e, 0x38, 0x27, 0x38, 0x1b, + 0x5e, 0x4d, 0x5e, 0x15, 0x72, 0x61, 0x72, 0x11, 0x5e, 0x4d, 0x5e, 0x0b, + 0x8b, 0x39, 0x31, 0x09, 0x97, 0x45, 0x3d, 0x06, 0xba, 0x57, 0x57, 0x04, + 0xd7, 0x74, 0x74, 0x04, 0x94, 0x94, 0xb6, 0x01, 0x5a, 0x5a, 0x7c, 0x04, + 0x4d, 0x4d, 0x80, 0x06, 0x3b, 0x3b, 0x6e, 0x09, 0x3e, 0x4e, 0x77, 0x0b, + 0x18, 0x28, 0x51, 0x11, 0x46, 0x4e, 0x6f, 0x17, 0x20, 0x28, 0x49, 0x1c, + 0x07, 0x18, 0x30, 0x23, 0x07, 0x18, 0x30, 0x29, 0x21, 0x29, 0x5b, 0x31, + 0x15, 0x1d, 0x4f, 0x31, 0x1a, 0x1a, 0x4c, 0x3b, 0x10, 0x10, 0x42, 0x3b, + 0x16, 0x16, 0x48, 0x44, 0x10, 0x10, 0x42, 0x44, 0x22, 0x33, 0x55, 0x45, + 0x11, 0x11, 0x33, 0x45, 0x22, 0x33, 0x55, 0x3f, 0x12, 0x23, 0x45, 0x3f, + 0x3d, 0x45, 0x55, 0x3a, 0x31, 0x39, 0x49, 0x34, 0x47, 0x4f, 0x5f, 0x2e, + 0x3d, 0x45, 0x55, 0x28, 0x4c, 0x3b, 0x4c, 0x21, 0x4c, 0x3b, 0x4c, 0x1b, + 0x5e, 0x4d, 0x5e, 0x15, 0x72, 0x61, 0x72, 0x11, 0xa1, 0x4f, 0x47, 0x0c, + 0x97, 0x45, 0x3d, 0x09, 0xba, 0x57, 0x57, 0x06, 0xd7, 0x74, 0x74, 0x04, + 0x94, 0x94, 0xb6, 0x04, 0x5a, 0x5a, 0x7c, 0x06, 0x3b, 0x3b, 0x6e, 0x09, + 0x27, 0x27, 0x5a, 0x0c, 0x2a, 0x3a, 0x63, 0x11, 0x04, 0x14, 0x3d, 0x14, + 0x0c, 0x14, 0x35, 0x1c, 0x32, 0x3a, 0x5b, 0x22, 0x19, 0x2a, 0x42, 0x29, + 0x07, 0x18, 0x30, 0x31, 0x00, 0x07, 0x39, 0x3b, 0x15, 0x1d, 0x4f, 0x43, + 0x0d, 0x1d, 0x4f, 0x44, 0x0d, 0x1d, 0x4f, 0x4d, 0x0d, 0x1d, 0x4f, 0x4d, + 0x00, 0x07, 0x39, 0x56, 0x12, 0x23, 0x45, 0x54, 0x12, 0x23, 0x45, 0x54, + 0x12, 0x23, 0x45, 0x4e, 0x22, 0x33, 0x55, 0x4e, 0x3d, 0x1c, 0x1c, 0x46, + 0x51, 0x30, 0x30, 0x40, 0x51, 0x30, 0x30, 0x3a, 0x77, 0x56, 0x56, 0x34, + 0x7c, 0x49, 0x5a, 0x27, 0x7c, 0x49, 0x5a, 0x21, 0x72, 0x3f, 0x50, 0x1b, + 0x72, 0x3f, 0x50, 0x15, 0xad, 0x5b, 0x53, 0x0f, 0xad, 0x5b, 0x53, 0x0c, + 0xba, 0x57, 0x57, 0x09, 0xd7, 0x74, 0x74, 0x06, 0x80, 0x80, 0xa2, 0x04, + 0x5a, 0x5a, 0x7c, 0x06, 0x3b, 0x3b, 0x6e, 0x09, 0x3b, 0x3b, 0x6e, 0x0f, + 0x04, 0x14, 0x3d, 0x14, 0x18, 0x28, 0x51, 0x17, 0x0c, 0x14, 0x35, 0x22, + 0x0c, 0x14, 0x35, 0x28, 0x19, 0x2a, 0x42, 0x31, 0x07, 0x18, 0x30, 0x3b, + 0x0b, 0x13, 0x45, 0x43, 0x00, 0x07, 0x39, 0x4f, 0x19, 0x29, 0x5b, 0x56, + 0x19, 0x29, 0x5b, 0x5c, 0x00, 0x07, 0x39, 0x65, 0x19, 0x29, 0x5b, 0x65, + 0x11, 0x11, 0x33, 0x66, 0x12, 0x23, 0x45, 0x66, 0x11, 0x11, 0x33, 0x60, + 0x11, 0x11, 0x33, 0x60, 0x51, 0x30, 0x30, 0x50, 0x3d, 0x1c, 0x1c, 0x50, + 0x3d, 0x1c, 0x1c, 0x46, 0x51, 0x30, 0x30, 0x3a, 0x72, 0x3f, 0x50, 0x31, + 0x7c, 0x49, 0x5a, 0x27, 0x88, 0x55, 0x66, 0x21, 0x88, 0x55, 0x66, 0x1b, + 0xa1, 0x4f, 0x47, 0x14, 0xad, 0x5b, 0x53, 0x0f, 0xba, 0x57, 0x57, 0x09, + 0xd7, 0x74, 0x74, 0x06, 0x74, 0x84, 0xa5, 0x06, 0x4e, 0x5e, 0x7f, 0x08, + 0x41, 0x51, 0x83, 0x0b, 0x2d, 0x3d, 0x6f, 0x11, 0x29, 0x32, 0x5b, 0x18, + 0x07, 0x10, 0x39, 0x22, 0x13, 0x1c, 0x45, 0x28, 0x1d, 0x26, 0x4f, 0x2e, + 0x00, 0x00, 0x18, 0x39, 0x05, 0x0d, 0x2e, 0x45, 0x05, 0x0d, 0x2e, 0x51, + 0x11, 0x19, 0x3a, 0x5d, 0x11, 0x21, 0x3a, 0x65, 0x11, 0x21, 0x3a, 0x74, + 0x29, 0x21, 0x32, 0x74, 0x13, 0x0b, 0x1c, 0x7d, 0x36, 0x1d, 0x47, 0x76, + 0x20, 0x07, 0x31, 0x76, 0x4f, 0x1d, 0x47, 0x76, 0x4f, 0x1d, 0x47, 0x6e, + 0x56, 0x34, 0x45, 0x68, 0x76, 0x54, 0x65, 0x5c, 0x87, 0x32, 0x54, 0x53, + 0x67, 0x12, 0x34, 0x4a, 0x93, 0x00, 0x00, 0x3a, 0x82, 0x1c, 0x1c, 0x34, + 0xb0, 0x4a, 0x4a, 0x28, 0xb0, 0x4a, 0x4a, 0x1e, 0xd2, 0x5b, 0x5b, 0x17, + 0xd2, 0x39, 0x39, 0x12, 0xd2, 0x5b, 0x5b, 0x0b, 0xe8, 0x71, 0x71, 0x08, + 0x62, 0x72, 0x93, 0x06, 0x62, 0x72, 0x93, 0x0b, 0x41, 0x51, 0x83, 0x0e, + 0x41, 0x51, 0x83, 0x14, 0x1d, 0x26, 0x4f, 0x18, 0x29, 0x32, 0x5b, 0x22, + 0x07, 0x10, 0x39, 0x2e, 0x13, 0x1c, 0x45, 0x3a, 0x11, 0x19, 0x3a, 0x45, + 0x00, 0x03, 0x24, 0x51, 0x05, 0x0d, 0x2e, 0x5d, 0x11, 0x19, 0x3a, 0x69, + 0x05, 0x15, 0x2e, 0x74, 0x05, 0x15, 0x2e, 0x7d, 0x13, 0x0b, 0x1c, 0x86, + 0x07, 0x00, 0x10, 0x8f, 0x20, 0x07, 0x31, 0x8e, 0x20, 0x07, 0x31, 0x8e, + 0x39, 0x07, 0x31, 0x86, 0x5b, 0x29, 0x53, 0x86, 0x56, 0x34, 0x45, 0x77, + 0x87, 0x32, 0x54, 0x68, 0x76, 0x54, 0x65, 0x5c, 0x87, 0x32, 0x54, 0x53, + 0x82, 0x1c, 0x1c, 0x46, 0x93, 0x00, 0x00, 0x3a, 0x82, 0x1c, 0x1c, 0x2e, + 0xb0, 0x4a, 0x4a, 0x28, 0xd2, 0x39, 0x39, 0x1b, 0xd2, 0x39, 0x39, 0x12, + 0xe8, 0x4f, 0x4f, 0x0e, 0xe8, 0x71, 0x71, 0x0b, 0x74, 0x84, 0xa5, 0x08, + 0x4e, 0x5e, 0x7f, 0x0b, 0x53, 0x63, 0x95, 0x11, 0x2d, 0x3d, 0x6f, 0x17, + 0x29, 0x32, 0x6b, 0x22, 0x1d, 0x26, 0x5f, 0x28, 0x29, 0x32, 0x6b, 0x34, + 0x13, 0x1c, 0x55, 0x40, 0x2a, 0x4b, 0x5b, 0x51, 0x0d, 0x2e, 0x3e, 0x5d, + 0x00, 0x14, 0x24, 0x69, 0x00, 0x00, 0x07, 0x75, 0x05, 0x15, 0x2e, 0x86, + 0x00, 0x0b, 0x24, 0x8f, 0x13, 0x0b, 0x1c, 0x98, 0x13, 0x0b, 0x1c, 0xa1, + 0x20, 0x07, 0x31, 0xa2, 0x2c, 0x13, 0x3d, 0xa2, 0x39, 0x07, 0x31, 0x9a, + 0x4f, 0x1d, 0x47, 0x8e, 0x87, 0x32, 0x54, 0x83, 0x87, 0x32, 0x54, 0x77, + 0x87, 0x32, 0x54, 0x68, 0x87, 0x32, 0x54, 0x5c, 0xb0, 0x4a, 0x4a, 0x50, + 0xc1, 0x17, 0x17, 0x40, 0xc1, 0x17, 0x17, 0x34, 0xc1, 0x17, 0x17, 0x28, + 0xd2, 0x5b, 0x5b, 0x1e, 0xd2, 0x39, 0x39, 0x17, 0xe8, 0x4f, 0x4f, 0x12, + 0xe8, 0x71, 0x71, 0x0b, 0x88, 0x98, 0xb9, 0x08, 0x62, 0x72, 0x93, 0x0e, + 0x2d, 0x3d, 0x6f, 0x14, 0x2d, 0x3d, 0x6f, 0x19, 0x1d, 0x26, 0x5f, 0x22, + 0x13, 0x1c, 0x55, 0x2e, 0x07, 0x10, 0x49, 0x3a, 0x1d, 0x26, 0x5f, 0x4a, + 0x00, 0x14, 0x24, 0x51, 0x2a, 0x4b, 0x5b, 0x69, 0x00, 0x14, 0x24, 0x75, + 0x00, 0x00, 0x07, 0x89, 0x00, 0x00, 0x18, 0x98, 0x05, 0x15, 0x2e, 0xa1, + 0x29, 0x21, 0x32, 0xb0, 0x1d, 0x15, 0x26, 0xb0, 0x42, 0x29, 0x53, 0xba, + 0x36, 0x1d, 0x47, 0xb2, 0x5b, 0x29, 0x53, 0xb2, 0x4f, 0x1d, 0x47, 0xa2, + 0x87, 0x32, 0x54, 0x95, 0x87, 0x32, 0x54, 0x83, 0x87, 0x32, 0x54, 0x77, + 0x87, 0x32, 0x54, 0x68, 0xc1, 0x17, 0x17, 0x50, 0xc1, 0x17, 0x17, 0x46, + 0xc1, 0x17, 0x17, 0x3a, 0xc1, 0x17, 0x17, 0x2e, 0xd2, 0x39, 0x39, 0x21, + 0xd2, 0x39, 0x39, 0x1b, 0xe8, 0x4f, 0x4f, 0x12, 0xe8, 0x71, 0x71, 0x0e, + 0x7c, 0x9e, 0xaf, 0x0a, 0x66, 0x88, 0x99, 0x0d, 0x51, 0x62, 0x73, 0x12, + 0x1a, 0x2b, 0x3c, 0x1c, 0x21, 0x21, 0x3a, 0x28, 0x0f, 0x0f, 0x28, 0x30, + 0x0d, 0x0d, 0x4f, 0x3a, 0x00, 0x00, 0x35, 0x4e, 0x00, 0x00, 0x20, 0x57, + 0x05, 0x05, 0x36, 0x6b, 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x8f, + 0x10, 0x18, 0x31, 0xa0, 0x10, 0x18, 0x31, 0xaf, 0x34, 0x24, 0x55, 0xc1, + 0x3e, 0x2e, 0x5f, 0xca, 0x46, 0x14, 0x46, 0xca, 0x6c, 0x3a, 0x6c, 0xca, + 0x6a, 0x20, 0x41, 0xc1, 0x8c, 0x42, 0x63, 0xb2, 0x99, 0x33, 0x44, 0xa5, + 0x99, 0x33, 0x44, 0x8d, 0x99, 0x33, 0x44, 0x81, 0xbb, 0x11, 0x22, 0x6d, + 0xc3, 0x06, 0x04, 0x60, 0xcd, 0x0b, 0x0b, 0x4e, 0xd7, 0x0f, 0x12, 0x3f, + 0xe1, 0x14, 0x19, 0x33, 0xe7, 0x26, 0x28, 0x23, 0xe7, 0x3f, 0x44, 0x1d, + 0xe7, 0x59, 0x5f, 0x14, 0xe7, 0x72, 0x7b, 0x0f, 0x7c, 0x9e, 0xaf, 0x0a, + 0x72, 0x94, 0xa5, 0x10, 0x6e, 0x7f, 0x90, 0x17, 0x1a, 0x2b, 0x3c, 0x1f, + 0x0f, 0x0f, 0x28, 0x28, 0x00, 0x00, 0x14, 0x34, 0x00, 0x00, 0x35, 0x44, + 0x00, 0x00, 0x35, 0x4e, 0x00, 0x00, 0x20, 0x63, 0x00, 0x00, 0x20, 0x77, + 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x97, 0x26, 0x2e, 0x47, 0xaf, + 0x26, 0x2e, 0x47, 0xc1, 0x28, 0x18, 0x49, 0xca, 0x4a, 0x3a, 0x6b, 0xdc, + 0x5a, 0x28, 0x5a, 0xdc, 0x46, 0x14, 0x46, 0xdc, 0x8c, 0x42, 0x63, 0xd3, + 0x80, 0x36, 0x57, 0xc1, 0x99, 0x33, 0x44, 0xad, 0xa4, 0x3e, 0x4f, 0x99, + 0x8e, 0x28, 0x39, 0x81, 0xbb, 0x11, 0x22, 0x79, 0xc7, 0x05, 0x03, 0x60, + 0xd1, 0x09, 0x0a, 0x4e, 0xdb, 0x0e, 0x11, 0x45, 0xe5, 0x12, 0x18, 0x33, + 0xe9, 0x25, 0x26, 0x28, 0xe9, 0x3e, 0x42, 0x1d, 0xe9, 0x58, 0x5d, 0x17, + 0xe9, 0x71, 0x79, 0x0f, 0x88, 0xaa, 0xbb, 0x0a, 0x66, 0x88, 0x99, 0x10, + 0x6e, 0x7f, 0x90, 0x17, 0x37, 0x48, 0x59, 0x1f, 0x0f, 0x0f, 0x28, 0x28, + 0x00, 0x00, 0x14, 0x34, 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x18, 0x56, + 0x05, 0x05, 0x36, 0x63, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x0c, 0x8f, + 0x09, 0x11, 0x32, 0xa3, 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca, + 0x3e, 0x2e, 0x5f, 0xdc, 0x4a, 0x3a, 0x6b, 0xeb, 0x6c, 0x3a, 0x6c, 0xee, + 0x6c, 0x3a, 0x6c, 0xe5, 0x76, 0x2c, 0x4d, 0xdc, 0x8c, 0x42, 0x63, 0xca, + 0x99, 0x33, 0x44, 0xb9, 0x99, 0x33, 0x44, 0xa5, 0xa4, 0x3e, 0x4f, 0x8d, + 0xbb, 0x11, 0x22, 0x79, 0xcb, 0x03, 0x02, 0x66, 0xd5, 0x08, 0x09, 0x54, + 0xdf, 0x0c, 0x10, 0x45, 0xe9, 0x11, 0x17, 0x33, 0xeb, 0x24, 0x24, 0x28, + 0xeb, 0x3d, 0x40, 0x20, 0xeb, 0x57, 0x5b, 0x17, 0xeb, 0x70, 0x77, 0x0f, + 0x88, 0xaa, 0xbb, 0x0a, 0x72, 0x94, 0xa5, 0x10, 0x6e, 0x7f, 0x90, 0x17, + 0x6e, 0x7f, 0x90, 0x1f, 0x35, 0x35, 0x4e, 0x28, 0x00, 0x00, 0x14, 0x34, + 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x35, 0x56, 0x11, 0x11, 0x42, 0x63, + 0x05, 0x05, 0x36, 0x77, 0x00, 0x00, 0x0c, 0x8f, 0x09, 0x11, 0x32, 0xa3, + 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca, 0x4a, 0x3a, 0x6b, 0xdc, + 0x4a, 0x3a, 0x6b, 0xeb, 0x6c, 0x3a, 0x6c, 0xfd, 0x80, 0x4e, 0x80, 0xee, + 0x8c, 0x42, 0x63, 0xdc, 0x80, 0x36, 0x57, 0xca, 0xa4, 0x3e, 0x4f, 0xb9, + 0xa4, 0x3e, 0x4f, 0xa5, 0x99, 0x33, 0x44, 0x8d, 0xbb, 0x11, 0x22, 0x79, + 0xcf, 0x02, 0x01, 0x66, 0xd9, 0x06, 0x08, 0x54, 0xe3, 0x0b, 0x0f, 0x45, + 0xed, 0x0f, 0x16, 0x33, 0xed, 0x23, 0x22, 0x28, 0xed, 0x3c, 0x3e, 0x20, + 0xed, 0x56, 0x59, 0x17, 0xed, 0x6f, 0x75, 0x0f, 0x7c, 0x95, 0xae, 0x0a, + 0x7c, 0x95, 0xae, 0x10, 0x5f, 0x78, 0x91, 0x17, 0x5f, 0x78, 0x91, 0x1f, + 0x5d, 0x6e, 0x90, 0x29, 0x26, 0x37, 0x59, 0x37, 0x00, 0x00, 0x09, 0x41, + 0x04, 0x00, 0x26, 0x55, 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74, + 0x13, 0x13, 0x46, 0x8c, 0x33, 0x00, 0x11, 0x9e, 0x3e, 0x1c, 0x3e, 0xb1, + 0x55, 0x33, 0x55, 0xca, 0x6c, 0x4a, 0x6c, 0xde, 0x6c, 0x4a, 0x6c, 0xe8, + 0x6a, 0x41, 0x52, 0xeb, 0x80, 0x57, 0x68, 0xeb, 0x8c, 0x63, 0x74, 0xdc, + 0x80, 0x57, 0x68, 0xca, 0x9f, 0x17, 0x17, 0xb5, 0xb5, 0x2d, 0x2d, 0xa1, + 0xb5, 0x2d, 0x2d, 0x89, 0xd2, 0x06, 0x06, 0x75, 0xd6, 0x00, 0x00, 0x62, + 0xe2, 0x00, 0x03, 0x56, 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36, + 0xe7, 0x1e, 0x20, 0x27, 0xea, 0x3f, 0x3e, 0x1f, 0xed, 0x60, 0x5b, 0x16, + 0xf0, 0x80, 0x79, 0x0e, 0x7c, 0x95, 0xae, 0x0a, 0x5f, 0x78, 0x91, 0x10, + 0x5f, 0x78, 0x91, 0x17, 0x45, 0x5e, 0x77, 0x1f, 0x40, 0x51, 0x73, 0x29, + 0x26, 0x37, 0x59, 0x37, 0x1e, 0x0d, 0x40, 0x41, 0x00, 0x00, 0x09, 0x4f, + 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74, 0x33, 0x33, 0x66, 0x83, + 0x13, 0x13, 0x46, 0x9e, 0x3e, 0x1c, 0x3e, 0xb1, 0x55, 0x33, 0x55, 0xc0, + 0x55, 0x33, 0x55, 0xca, 0x6c, 0x4a, 0x6c, 0xde, 0x76, 0x4d, 0x5e, 0xdc, + 0x6a, 0x41, 0x52, 0xdc, 0x80, 0x57, 0x68, 0xd3, 0x8c, 0x63, 0x74, 0xc1, + 0xb5, 0x2d, 0x2d, 0xa9, 0x9f, 0x17, 0x17, 0x95, 0xd2, 0x06, 0x06, 0x89, + 0xd2, 0x06, 0x06, 0x75, 0xd6, 0x00, 0x00, 0x62, 0xec, 0x05, 0x0d, 0x4e, + 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36, 0xe8, 0x1e, 0x1f, 0x27, + 0xeb, 0x3e, 0x3d, 0x1f, 0xee, 0x5f, 0x5a, 0x16, 0xf1, 0x80, 0x78, 0x0e, + 0x6f, 0x67, 0x88, 0x0a, 0x5b, 0x53, 0x74, 0x0d, 0x49, 0x41, 0x62, 0x12, + 0x35, 0x2d, 0x4e, 0x1c, 0x26, 0x37, 0x59, 0x23, 0x26, 0x37, 0x59, 0x2f, + 0x3b, 0x2a, 0x5d, 0x41, 0x04, 0x00, 0x26, 0x4f, 0x33, 0x00, 0x11, 0x59, + 0x33, 0x33, 0x66, 0x6b, 0x33, 0x33, 0x66, 0x83, 0x33, 0x33, 0x66, 0x92, + 0x55, 0x33, 0x55, 0xa7, 0x55, 0x33, 0x55, 0xb1, 0x77, 0x33, 0x55, 0xc0, + 0x77, 0x33, 0x55, 0xca, 0x8f, 0x34, 0x55, 0xca, 0x8f, 0x34, 0x55, 0xca, + 0x8f, 0x34, 0x55, 0xc1, 0xa5, 0x4a, 0x6b, 0xaf, 0xb5, 0x2d, 0x2d, 0xa1, + 0xb5, 0x2d, 0x2d, 0x95, 0xd2, 0x06, 0x06, 0x7d, 0xd2, 0x06, 0x06, 0x69, + 0xe2, 0x00, 0x03, 0x5c, 0xec, 0x05, 0x0d, 0x4e, 0xe5, 0x06, 0x0e, 0x3c, + 0xef, 0x10, 0x18, 0x30, 0xe9, 0x1d, 0x1e, 0x27, 0xec, 0x3e, 0x3c, 0x1c, + 0xef, 0x5f, 0x59, 0x13, 0xf2, 0x7f, 0x77, 0x0e, 0x6f, 0x67, 0x88, 0x0a, + 0x5b, 0x53, 0x74, 0x0d, 0x49, 0x41, 0x62, 0x12, 0x35, 0x2d, 0x4e, 0x19, + 0x09, 0x1a, 0x3c, 0x23, 0x26, 0x37, 0x59, 0x2f, 0x3b, 0x2a, 0x5d, 0x37, + 0x1e, 0x0d, 0x40, 0x49, 0x33, 0x00, 0x11, 0x59, 0x33, 0x00, 0x11, 0x65, + 0x33, 0x33, 0x66, 0x74, 0x53, 0x53, 0x86, 0x83, 0x55, 0x33, 0x55, 0x93, + 0x6c, 0x4a, 0x6c, 0xa7, 0x77, 0x33, 0x55, 0xb1, 0x77, 0x33, 0x55, 0xb1, + 0x83, 0x28, 0x49, 0xb8, 0x99, 0x3e, 0x5f, 0xb8, 0x99, 0x3e, 0x5f, 0xaf, + 0x8f, 0x34, 0x55, 0xa0, 0xb5, 0x2d, 0x2d, 0x95, 0xb5, 0x2d, 0x2d, 0x89, + 0xd2, 0x06, 0x06, 0x75, 0xd2, 0x06, 0x06, 0x69, 0xe2, 0x00, 0x03, 0x56, + 0xec, 0x05, 0x0d, 0x44, 0xe5, 0x06, 0x0e, 0x3c, 0xe9, 0x0a, 0x12, 0x30, + 0xea, 0x1d, 0x1d, 0x22, 0xed, 0x3d, 0x3b, 0x19, 0xf0, 0x5e, 0x58, 0x13, + 0xf3, 0x7f, 0x76, 0x0e, 0x7c, 0x74, 0x95, 0x08, 0x56, 0x4e, 0x6f, 0x0b, + 0x62, 0x49, 0x7b, 0x11, 0x4e, 0x35, 0x67, 0x16, 0x44, 0x33, 0x66, 0x21, + 0x34, 0x23, 0x56, 0x29, 0x44, 0x33, 0x66, 0x33, 0x44, 0x33, 0x66, 0x41, + 0x56, 0x23, 0x56, 0x51, 0x67, 0x00, 0x01, 0x5d, 0x56, 0x23, 0x56, 0x69, + 0x76, 0x43, 0x76, 0x75, 0x8d, 0x4b, 0x6c, 0x83, 0x67, 0x25, 0x46, 0x92, + 0x8d, 0x4b, 0x6c, 0x9e, 0x7b, 0x39, 0x5a, 0x9e, 0x9f, 0x28, 0x39, 0xa2, + 0x9f, 0x28, 0x39, 0xa2, 0x9f, 0x28, 0x39, 0x99, 0xb5, 0x0b, 0x0b, 0x90, + 0xc1, 0x00, 0x00, 0x87, 0xe7, 0x11, 0x11, 0x7b, 0xdf, 0x00, 0x00, 0x67, + 0xe9, 0x02, 0x0a, 0x5b, 0xeb, 0x00, 0x04, 0x4f, 0xec, 0x05, 0x0a, 0x3f, + 0xed, 0x0a, 0x10, 0x33, 0xee, 0x0f, 0x16, 0x27, 0xeb, 0x1c, 0x1c, 0x1e, + 0xec, 0x3c, 0x3b, 0x17, 0xed, 0x5c, 0x59, 0x12, 0xee, 0x7b, 0x78, 0x0b, + 0x90, 0x88, 0xa9, 0x05, 0x56, 0x4e, 0x6f, 0x0b, 0x4e, 0x35, 0x67, 0x0e, + 0x4e, 0x35, 0x67, 0x14, 0x44, 0x33, 0x66, 0x1b, 0x34, 0x23, 0x56, 0x21, + 0x34, 0x23, 0x56, 0x29, 0x54, 0x43, 0x76, 0x3b, 0x76, 0x43, 0x76, 0x45, + 0x87, 0x10, 0x21, 0x51, 0x87, 0x10, 0x21, 0x5d, 0x76, 0x43, 0x76, 0x69, + 0x8d, 0x4b, 0x6c, 0x74, 0x8d, 0x4b, 0x6c, 0x83, 0x7b, 0x39, 0x5a, 0x8c, + 0x8d, 0x4b, 0x6c, 0x8c, 0x9f, 0x28, 0x39, 0x90, 0x9f, 0x28, 0x39, 0x8a, + 0xb5, 0x0b, 0x0b, 0x8a, 0xb5, 0x0b, 0x0b, 0x7b, 0xc1, 0x00, 0x00, 0x73, + 0xd5, 0x00, 0x00, 0x67, 0xe5, 0x00, 0x06, 0x5b, 0xe5, 0x00, 0x06, 0x4f, + 0xe9, 0x01, 0x05, 0x45, 0xea, 0x06, 0x0b, 0x39, 0xeb, 0x0b, 0x11, 0x2d, + 0xec, 0x10, 0x17, 0x27, 0xeb, 0x1c, 0x1c, 0x1b, 0xec, 0x3b, 0x3b, 0x12, + 0xed, 0x5b, 0x59, 0x0e, 0xee, 0x7b, 0x78, 0x0b, 0x90, 0x88, 0xa9, 0x05, + 0x6a, 0x62, 0x83, 0x08, 0x4e, 0x35, 0x67, 0x0b, 0x62, 0x49, 0x7b, 0x11, + 0x54, 0x43, 0x76, 0x15, 0x54, 0x43, 0x76, 0x21, 0x66, 0x11, 0x55, 0x29, + 0x54, 0x43, 0x76, 0x33, 0x76, 0x43, 0x76, 0x39, 0x76, 0x43, 0x76, 0x45, + 0x87, 0x10, 0x21, 0x51, 0x87, 0x10, 0x21, 0x5d, 0xad, 0x32, 0x53, 0x65, + 0xad, 0x32, 0x53, 0x6b, 0x97, 0x1c, 0x3d, 0x74, 0xa1, 0x26, 0x47, 0x74, + 0x9f, 0x28, 0x39, 0x7b, 0x9f, 0x28, 0x39, 0x75, 0xc1, 0x17, 0x17, 0x75, + 0xb5, 0x0b, 0x0b, 0x6c, 0xd5, 0x00, 0x00, 0x67, 0xd5, 0x00, 0x00, 0x5b, + 0xe5, 0x00, 0x06, 0x4f, 0xe5, 0x00, 0x06, 0x47, 0xe7, 0x01, 0x06, 0x39, + 0xe8, 0x06, 0x0c, 0x33, 0xe9, 0x0b, 0x12, 0x27, 0xea, 0x10, 0x18, 0x1d, + 0xeb, 0x1b, 0x1c, 0x17, 0xec, 0x3b, 0x3b, 0x12, 0xed, 0x5b, 0x59, 0x0b, + 0xee, 0x7a, 0x78, 0x08, 0x90, 0x88, 0xa9, 0x05, 0x7c, 0x74, 0x95, 0x08, + 0x62, 0x49, 0x7b, 0x0b, 0x62, 0x49, 0x7b, 0x0e, 0x54, 0x43, 0x76, 0x15, + 0x54, 0x43, 0x76, 0x1b, 0x66, 0x11, 0x55, 0x21, 0x66, 0x11, 0x55, 0x29, + 0x76, 0x43, 0x76, 0x31, 0x76, 0x43, 0x76, 0x39, 0x87, 0x10, 0x21, 0x45, + 0x87, 0x10, 0x21, 0x51, 0x8b, 0x10, 0x31, 0x59, 0xa1, 0x26, 0x47, 0x59, + 0xa1, 0x26, 0x47, 0x65, 0x8b, 0x10, 0x31, 0x65, 0xb5, 0x0b, 0x0b, 0x63, + 0xc1, 0x17, 0x17, 0x63, 0xc1, 0x17, 0x17, 0x63, 0xc1, 0x17, 0x17, 0x63, + 0xd5, 0x00, 0x00, 0x5b, 0xd5, 0x00, 0x00, 0x4f, 0xdf, 0x00, 0x00, 0x47, + 0xdf, 0x00, 0x00, 0x3b, 0xe5, 0x02, 0x07, 0x33, 0xe6, 0x07, 0x0d, 0x27, + 0xe7, 0x0c, 0x13, 0x1d, 0xe8, 0x11, 0x19, 0x1d, 0xeb, 0x1b, 0x1c, 0x12, + 0xec, 0x3a, 0x3b, 0x0e, 0xed, 0x5a, 0x59, 0x0b, 0xee, 0x7a, 0x78, 0x08, + 0x9e, 0x86, 0xa7, 0x02, 0x9a, 0x82, 0xa3, 0x05, 0x8f, 0x56, 0x7f, 0x08, + 0x72, 0x39, 0x62, 0x0b, 0x71, 0x3c, 0x75, 0x11, 0x75, 0x31, 0x68, 0x16, + 0x7a, 0x26, 0x5b, 0x1a, 0x7e, 0x1b, 0x4e, 0x20, 0x82, 0x1c, 0x4f, 0x29, + 0x8e, 0x28, 0x5b, 0x33, 0x8e, 0x28, 0x5b, 0x3b, 0xa4, 0x1c, 0x1c, 0x41, + 0xb3, 0x0e, 0x0e, 0x45, 0xad, 0x08, 0x08, 0x4b, 0xbd, 0x18, 0x18, 0x54, + 0xb7, 0x12, 0x12, 0x54, 0xbd, 0x00, 0x00, 0x55, 0xc9, 0x03, 0x0b, 0x55, + 0xd6, 0x00, 0x08, 0x4f, 0xd6, 0x00, 0x08, 0x4f, 0xdb, 0x00, 0x08, 0x48, + 0xdd, 0x01, 0x07, 0x3e, 0xdf, 0x02, 0x06, 0x38, 0xe1, 0x03, 0x05, 0x32, + 0xe3, 0x00, 0x00, 0x27, 0xe5, 0x07, 0x0a, 0x21, 0xe7, 0x0e, 0x14, 0x1b, + 0xe9, 0x15, 0x1e, 0x15, 0xeb, 0x26, 0x24, 0x0f, 0xed, 0x46, 0x42, 0x0c, + 0xef, 0x66, 0x5f, 0x09, 0xf1, 0x85, 0x7d, 0x06, 0x9a, 0x82, 0xa3, 0x02, + 0xa4, 0x8c, 0xad, 0x05, 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08, + 0x83, 0x3f, 0x6a, 0x0d, 0x88, 0x34, 0x5d, 0x11, 0x8c, 0x29, 0x50, 0x16, + 0x90, 0x1e, 0x43, 0x1a, 0xa4, 0x1c, 0x1c, 0x21, 0xa4, 0x1c, 0x1c, 0x29, + 0xb0, 0x28, 0x28, 0x29, 0xa4, 0x1c, 0x1c, 0x33, 0xad, 0x08, 0x08, 0x3c, + 0xbd, 0x18, 0x18, 0x3c, 0xbd, 0x18, 0x18, 0x45, 0xb3, 0x0e, 0x0e, 0x45, + 0xc9, 0x03, 0x0b, 0x41, 0xc9, 0x03, 0x0b, 0x41, 0xd6, 0x00, 0x08, 0x41, + 0xdc, 0x06, 0x0e, 0x41, 0xdc, 0x05, 0x0c, 0x38, 0xde, 0x06, 0x0b, 0x32, + 0xe0, 0x07, 0x0a, 0x2c, 0xe2, 0x08, 0x09, 0x26, 0xe2, 0x04, 0x03, 0x21, + 0xe4, 0x0b, 0x0d, 0x1b, 0xe6, 0x12, 0x17, 0x15, 0xe8, 0x19, 0x21, 0x11, + 0xe9, 0x31, 0x2b, 0x0c, 0xeb, 0x51, 0x49, 0x09, 0xed, 0x71, 0x66, 0x06, + 0xef, 0x90, 0x84, 0x03, 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02, + 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08, 0x96, 0x41, 0x5f, 0x0a, + 0x9a, 0x36, 0x52, 0x0d, 0x9e, 0x2b, 0x45, 0x11, 0xa2, 0x20, 0x38, 0x16, + 0xa4, 0x1c, 0x1c, 0x1b, 0xa4, 0x1c, 0x1c, 0x21, 0xb0, 0x28, 0x28, 0x21, + 0xb0, 0x28, 0x28, 0x29, 0xcc, 0x0e, 0x0e, 0x2a, 0xcc, 0x0e, 0x0e, 0x33, + 0xcc, 0x0e, 0x0e, 0x33, 0xd0, 0x12, 0x12, 0x33, 0xd3, 0x0d, 0x15, 0x37, + 0xd3, 0x0d, 0x15, 0x37, 0xe6, 0x10, 0x18, 0x37, 0xdc, 0x06, 0x0e, 0x2f, + 0xdd, 0x09, 0x10, 0x2c, 0xdf, 0x0a, 0x0f, 0x2c, 0xe1, 0x0b, 0x0e, 0x26, + 0xe3, 0x0c, 0x0d, 0x20, 0xe1, 0x08, 0x06, 0x1b, 0xe3, 0x0f, 0x10, 0x15, + 0xe5, 0x16, 0x1a, 0x11, 0xe7, 0x1d, 0x24, 0x0b, 0xe7, 0x3c, 0x33, 0x09, + 0xe9, 0x5c, 0x50, 0x06, 0xeb, 0x7c, 0x6e, 0x03, 0xed, 0x9b, 0x8b, 0x03, + 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02, 0xa9, 0x70, 0x99, 0x02, + 0x8f, 0x56, 0x7f, 0x05, 0xa8, 0x44, 0x54, 0x07, 0xac, 0x39, 0x47, 0x0a, + 0xb0, 0x2e, 0x3a, 0x0d, 0xb5, 0x23, 0x2d, 0x11, 0xa4, 0x1c, 0x1c, 0x15, + 0xb0, 0x28, 0x28, 0x15, 0xb0, 0x28, 0x28, 0x1b, 0xb0, 0x28, 0x28, 0x21, + 0xd6, 0x18, 0x18, 0x24, 0xd0, 0x12, 0x12, 0x24, 0xd6, 0x18, 0x18, 0x2a, + 0xd6, 0x18, 0x18, 0x2a, 0xdf, 0x19, 0x21, 0x29, 0xdf, 0x19, 0x21, 0x29, + 0xe6, 0x10, 0x18, 0x29, 0xe6, 0x10, 0x18, 0x23, 0xde, 0x0e, 0x14, 0x26, + 0xe0, 0x0f, 0x13, 0x20, 0xe2, 0x10, 0x12, 0x20, 0xe4, 0x11, 0x11, 0x16, + 0xe0, 0x0c, 0x09, 0x15, 0xe2, 0x13, 0x13, 0x11, 0xe4, 0x1a, 0x1d, 0x0b, + 0xe6, 0x21, 0x27, 0x0b, 0xe5, 0x47, 0x3a, 0x06, 0xe7, 0x67, 0x57, 0x06, + 0xe9, 0x87, 0x75, 0x03, 0xeb, 0xa6, 0x92, 0x03, 0xd5, 0x8b, 0x83, 0x01, + 0xc1, 0x77, 0x6f, 0x01, 0xb9, 0x56, 0x56, 0x02, 0xb9, 0x56, 0x56, 0x03, + 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08, 0xb9, 0x35, 0x35, 0x08, + 0xb9, 0x35, 0x35, 0x0c, 0xcb, 0x2e, 0x2c, 0x0e, 0xcb, 0x2c, 0x2c, 0x11, + 0xcb, 0x2a, 0x2c, 0x14, 0xcb, 0x28, 0x2c, 0x16, 0xd7, 0x20, 0x24, 0x18, + 0xda, 0x20, 0x23, 0x1d, 0xdd, 0x1f, 0x22, 0x1d, 0xe0, 0x1f, 0x21, 0x1d, + 0xe7, 0x22, 0x24, 0x1e, 0xe7, 0x20, 0x24, 0x1e, 0xe7, 0x1d, 0x24, 0x1e, + 0xe7, 0x1b, 0x24, 0x1b, 0xe3, 0x1c, 0x20, 0x19, 0xe3, 0x1c, 0x20, 0x17, + 0xe3, 0x1c, 0x20, 0x14, 0xe3, 0x1c, 0x20, 0x11, 0xdf, 0x1a, 0x20, 0x0f, + 0xe0, 0x23, 0x25, 0x0c, 0xe1, 0x2b, 0x2a, 0x09, 0xe2, 0x34, 0x2f, 0x06, + 0xe3, 0x54, 0x49, 0x05, 0xe4, 0x69, 0x5e, 0x03, 0xe5, 0x7e, 0x74, 0x02, + 0xe6, 0x92, 0x89, 0x01, 0xe7, 0x9d, 0x95, 0x00, 0xd5, 0x8b, 0x83, 0x01, + 0xcd, 0x6a, 0x6a, 0x01, 0xb9, 0x56, 0x56, 0x02, 0xcd, 0x49, 0x49, 0x02, + 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08, + 0xd8, 0x46, 0x46, 0x0b, 0xd8, 0x44, 0x46, 0x0b, 0xd8, 0x42, 0x46, 0x0e, + 0xd8, 0x40, 0x46, 0x11, 0xdd, 0x3c, 0x3f, 0x12, 0xe0, 0x3b, 0x3e, 0x15, + 0xe3, 0x3b, 0x3d, 0x15, 0xe6, 0x3a, 0x3c, 0x18, 0xe9, 0x3d, 0x3c, 0x16, + 0xe9, 0x3a, 0x3c, 0x16, 0xe9, 0x38, 0x3c, 0x16, 0xe9, 0x35, 0x3c, 0x13, + 0xe7, 0x36, 0x3b, 0x11, 0xe7, 0x36, 0x3b, 0x11, 0xe7, 0x36, 0x3b, 0x0e, + 0xe7, 0x36, 0x3b, 0x0b, 0xe3, 0x34, 0x3a, 0x09, 0xe4, 0x3d, 0x3f, 0x09, + 0xe5, 0x45, 0x44, 0x06, 0xe6, 0x4e, 0x49, 0x04, 0xe6, 0x63, 0x59, 0x03, + 0xe7, 0x78, 0x6f, 0x02, 0xe8, 0x8d, 0x84, 0x01, 0xe9, 0xa2, 0x99, 0x01, + 0xfb, 0xb1, 0xa9, 0x00, 0xe7, 0x9d, 0x95, 0x00, 0xdf, 0x7c, 0x7c, 0x01, + 0xcd, 0x6a, 0x6a, 0x01, 0xe2, 0x66, 0x66, 0x02, 0xe2, 0x66, 0x66, 0x02, + 0xe2, 0x66, 0x66, 0x05, 0xe2, 0x66, 0x66, 0x05, 0xe5, 0x5f, 0x5f, 0x08, + 0xe5, 0x5d, 0x5f, 0x08, 0xe5, 0x5b, 0x5f, 0x0b, 0xe5, 0x59, 0x5f, 0x0b, + 0xe3, 0x58, 0x59, 0x0c, 0xe6, 0x57, 0x58, 0x0f, 0xe9, 0x57, 0x57, 0x0f, + 0xec, 0x56, 0x56, 0x0f, 0xeb, 0x58, 0x53, 0x10, 0xeb, 0x55, 0x53, 0x10, + 0xeb, 0x53, 0x53, 0x10, 0xeb, 0x50, 0x53, 0x10, 0xeb, 0x51, 0x55, 0x0e, + 0xeb, 0x51, 0x55, 0x0b, 0xeb, 0x51, 0x55, 0x0b, 0xeb, 0x51, 0x55, 0x08, + 0xe7, 0x4f, 0x53, 0x06, 0xe8, 0x57, 0x58, 0x06, 0xe9, 0x60, 0x5d, 0x04, + 0xea, 0x68, 0x62, 0x04, 0xe9, 0x73, 0x6a, 0x02, 0xea, 0x87, 0x7f, 0x01, + 0xeb, 0x9c, 0x94, 0x01, 0xec, 0xb1, 0xa9, 0x00, 0xfb, 0xb1, 0xa9, 0x00, + 0xfb, 0xb1, 0xa9, 0x00, 0xf3, 0x90, 0x90, 0x00, 0xf3, 0x90, 0x90, 0x01, + 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02, + 0xf8, 0x7c, 0x7c, 0x02, 0xf2, 0x77, 0x79, 0x05, 0xf2, 0x75, 0x79, 0x05, + 0xf2, 0x73, 0x79, 0x05, 0xf2, 0x71, 0x79, 0x08, 0xe9, 0x73, 0x74, 0x09, + 0xec, 0x73, 0x73, 0x09, 0xef, 0x72, 0x72, 0x09, 0xf2, 0x72, 0x71, 0x09, + 0xed, 0x72, 0x6b, 0x0a, 0xed, 0x70, 0x6b, 0x0a, 0xed, 0x6d, 0x6b, 0x0a, + 0xed, 0x6b, 0x6b, 0x0a, 0xef, 0x6b, 0x70, 0x08, 0xef, 0x6b, 0x70, 0x08, + 0xef, 0x6b, 0x70, 0x06, 0xef, 0x6b, 0x70, 0x06, 0xeb, 0x69, 0x6d, 0x04, + 0xec, 0x71, 0x72, 0x04, 0xed, 0x7a, 0x77, 0x01, 0xee, 0x82, 0x7c, 0x01, + 0xec, 0x82, 0x7a, 0x01, 0xed, 0x97, 0x8f, 0x01, 0xee, 0xab, 0xa4, 0x00, + 0xef, 0xc0, 0xba, 0x00, + ]), +}; diff --git a/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py new file mode 100644 index 0000000000..bff3b675b0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py @@ -0,0 +1,119 @@ +#! /usr/bin/env python3 +import pathlib +import re +import sys + +assert len(sys.argv) == 2 +MOCHI_PATH = pathlib.Path(sys.argv[1]) +assert MOCHI_PATH.suffix == ".html" + +TEST_PATH = MOCHI_PATH.with_suffix(".solo.html") + + +def read_local_file(include): + inc_path = MOCHI_PATH.parent + file_path = inc_path / include + + try: + return file_path.read_bytes() + except IOError: + return b"" + + +SIMPLETEST_REPLACEMENT = b""" + +<script> +// SimpleTest.js replacement + +function debug(text) { + var elem = document.getElementById('mochi-to-testcase-output'); + elem.innerHTML += '\\n<br/>\\n' + text; +} + +function ok(val, text) { + var status = val ? 'Test <font color=\\'green\\'>passed</font>: ' + : 'Test <font color=\\'red\\' >FAILED</font>: '; + debug(status + text); +} + +function todo(val, text) { + var status = val ? 'Test <font color=\\'orange\\'>UNEXPECTED PASS</font>: ' + : 'Test <font color=\\'blue\\' >todo</font>: '; + debug(status + text); +} + +function addLoadEvent(func) { + window.addEventListener('load', func); +} + +SimpleTest = { + waitForExplicitFinish: () => {}, + finish: () => {}, + requestFlakyTimeout: () => {}, +}; + +SpecialPowers = { + pushPrefEnv: async (env, callback = null) => { + console.log(`SpecialPowers.pushPrefEnv(${JSON.stringify(env)})`); + await new Promise(res => { + setTimeout(res, 0); + }); + if (callback) { + await callback(); + } + }, + popPrefEnv: async (callback = null) => { + console.log('SpecialPowers.popPrefEnv()'); + await new Promise(res => { + setTimeout(res, 0); + }); + if (callback) { + await callback(); + } + }, +}; +</script> +<div id='mochi-to-testcase-output'></div> + +""" + +INCLUDE_PATTERN = re.compile(b"<script\\s*src=['\"](.*)\\.js['\"]>\\s*</script>") +CSS_PATTERN = re.compile( + b"<link\\s*rel=['\"]stylesheet['\"]\\s*href=['\"]([^=>]*)['\"]>" +) + +with open(TEST_PATH, "wb") as fout: + with open(MOCHI_PATH, "rb") as fin: + for line in fin: + skip_line = False + for css in CSS_PATTERN.findall(line): + skip_line = True + print("Ignoring stylesheet: " + css.decode()) + + for inc in INCLUDE_PATTERN.findall(line): + skip_line = True + if inc == b"/MochiKit/MochiKit": + continue + + if inc == b"/tests/SimpleTest/SimpleTest": + print("Injecting SimpleTest replacement") + fout.write(SIMPLETEST_REPLACEMENT) + continue + + inc_js = inc.decode() + ".js" + inc_data = read_local_file(inc_js) + if not inc_data: + print("Warning: Unknown JS file ignored: " + inc_js) + continue + + print("Injecting include: " + inc_js) + fout.write(b"\n<script>\n// Imported from: " + inc_js.encode() + b"\n") + fout.write(inc_data) + fout.write(b"\n</script>\n") + continue + + if skip_line: + continue + + fout.write(line) + continue diff --git a/dom/canvas/test/webgl-mochitest/mochitest.ini b/dom/canvas/test/webgl-mochitest/mochitest.ini new file mode 100644 index 0000000000..22e09f9bb5 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/mochitest.ini @@ -0,0 +1,131 @@ +[DEFAULT] +subsuite = webgl1-core + +support-files = + ensure-exts/ensure-ext.js + driver-info.js + es3-data.js + webgl-util.js + test_video_fastpath.js + red-green.mp4 + red-green.theora.ogv + red-green.webmvp8.webm + red-green.webmvp9.webm + +[ensure-exts/test_ANGLE_instanced_arrays.html] +[ensure-exts/test_EXT_blend_minmax.html] +[ensure-exts/test_EXT_color_buffer_half_float.html] +[ensure-exts/test_EXT_disjoint_timer_query.html] +fail-if = 1 +[ensure-exts/test_EXT_float_blend.html] +[ensure-exts/test_EXT_frag_depth.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_sRGB.html] +[ensure-exts/test_EXT_shader_texture_lod.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_texture_compression_bptc.html] +fail-if = (os == 'android') || (os == 'linux' && os_version == '16.04') || (os == 'mac') +[ensure-exts/test_EXT_texture_compression_rgtc.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_texture_filter_anisotropic.html] +fail-if = (os == 'linux') +[ensure-exts/test_OES_draw_buffers_indexed.html] +[ensure-exts/test_OES_fbo_render_mipmap.html] +[ensure-exts/test_OES_standard_derivatives.html] +[ensure-exts/test_OVR_multiview2.html] +fail-if = (os == 'linux') || (os == 'mac') +[ensure-exts/test_WEBGL_color_buffer_float.html] +[ensure-exts/test_WEBGL_compressed_texture_astc.html] +fail-if = (os == 'linux' && os_version == '16.04') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_etc.html] +fail-if = (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_etc1.html] +fail-if = (os == 'linux') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_pvrtc.html] +fail-if = (os == 'android') || (os == 'linux') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_s3tc.html] +fail-if = (os == 'android') +[ensure-exts/test_WEBGL_depth_texture.html] +[ensure-exts/test_WEBGL_draw_buffers.html] +fail-if = (os == 'android') +[ensure-exts/test_WEBGL_provoking_vertex.html] +fail-if = (os == 'android') || (os == 'linux') + +[ensure-exts/test_common.html] +[ensure-exts/test_implicit.html] + + +[regress/test_bug_1268096.html] + + +[test_backends.html] +[test_backbuffer_channels.html] +[test_depth_readpixels.html] +[test_canvas_size.html] +[test_capture.html] +skip-if = os == 'win' && debug # Bug 1388624 +support-files = ../captureStream_common.js +# Even though we use ../ here, in the test HTML, we need to omit this. Sub-CWD relative +# paths are fine, but they locate the file and dump it in the current directory. +[test_cubemap_must_be_square.html] +[test_depth_tex_lazy_clear.html] +[test_draw.html] +[test_draw_fakevert_large_offset.html] +[test_fb_param.html] +[test_fb_param_crash.html] +[test_has_rbab.html] +fail-if = (os == 'android' && android_version == "26") || (os == 'linux') || (os == 'mac') +[test_hidden_alpha.html] +[test_hidden_depth_stencil.html] +[test_imagedata_transfered_arraybuffer.html] +[test_implicit_color_buffer_float.html] +[test_highp_fs.html] +[test_no_arr_points.html] +[test_noprog_draw.html] +[test_pixel_pack_buffer.html] +# skip-if = os == "win" && os_version == "10.0" # Bug 1302199 +skip-if = + (os == "win") # Unofficial DXGL support regressed by bug 1632249 + apple_silicon +[test_privileged_exts.html] +[test_read_pixels_no_format.html] +[test_renderer_strings.html] +[test_sab_with_webgl.html] +[test_tex_large_uploads.html] +skip-if = + (os == "win") && debug && (bits == 32) # bug 1705863 +support-files = blank_15000x10000.png +[test_tex_pbo.html] +[test_tex_unit_different_sampler_types.html] +[test_texsubimage_float.html] +[test_uninit_data.html] +[test_webgl_available.html] +[test_webgl_compressed_texture_es3.html] +skip-if = (os == 'android') +# 2020-01-07 00:00:11.839 F/MOZ_Assert( 6742): Assertion failure: [GFX1]: void mozilla::gl::GLContext::raw_fClear(GLbitfield): Generated unexpected GL_OUT_OF_MEMORY error, at /builds/worker/workspace/build/src/gfx/2d/Logging.h:746 +# 2020-01-07 00:01:28.281 F/MOZ_Assert( 8333): Assertion failure: [GFX1]: Unexpected error from driver: DoCompressedTexSubImage(0x0de1, 0, 0,4,0, 4,4,1, 0x9270, 8) -> 0x0501, at /builds/worker/workspace/build/src/gfx/2d/Logging.h:746 +[test_webgl_force_enable.html] +[test_webgl_request_context.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl_request_mismatch.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_not_exposed.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_invalidate_framebuffer.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_alpha_luminance.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_uniform_block.html] +[test_fuzzing_bugs.html] +[test_video_fastpath_mp4.html] +skip-if = (os == 'win') && (bits == 32) # No fast video path for h264 decoder (done in RDD, can't be read in content) +[test_video_fastpath_theora.html] +skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for theora decoder (done in RDD, can't be read in content) +[test_video_fastpath_vp8.html] +skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for vp8 decoder (done in RDD, can't be read in content) +[test_video_fastpath_vp9.html] +skip-if = (os == 'linux') || (os == "mac") || ((os == 'win') && (bits == 32)) # No fast video path for vp9 decoder (done in RDD, can't be read in content) +[test_webglcontextcreationerror.html] +[test_webgl_fingerprinting_resistance.html] +[test_without_index_validation.html] +[test_vertexattrib4f_update.html] diff --git a/dom/canvas/test/webgl-mochitest/red-green.mp4 b/dom/canvas/test/webgl-mochitest/red-green.mp4 Binary files differnew file mode 100644 index 0000000000..4bd6d59658 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/red-green.mp4 diff --git a/dom/canvas/test/webgl-mochitest/red-green.theora.ogv b/dom/canvas/test/webgl-mochitest/red-green.theora.ogv Binary files differnew file mode 100644 index 0000000000..1543915a10 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/red-green.theora.ogv diff --git a/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm b/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm Binary files differnew file mode 100644 index 0000000000..fde59a18b4 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/red-green.webmvp8.webm diff --git a/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm b/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm Binary files differnew file mode 100644 index 0000000000..23dd3051cd --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/red-green.webmvp9.webm diff --git a/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html new file mode 100644 index 0000000000..0262c52d8c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html @@ -0,0 +1,140 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='../webgl-util.js'></script> + <script id='vs' type='x-shader/x-vertex'> + +attribute vec2 aPosition; + +void main(void) { + gl_PointSize = 16.0; + gl_Position = vec4(aPosition, 0, 1); +} + + </script> + <script id='fs' type='x-shader/x-fragment'> + +precision mediump float; + +uniform vec4 uColor; + +void main(void) { + gl_FragColor = uColor; +} + + </script> + </head> + <body> + <script> + +function GetPixel(gl, x, y) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + return pixel; +} + +function ColorStr(arr) { + return '{' + arr.map(function(x) { return '' + x; }).join(', ') + '}'; +} + +function PixelShouldBe(gl, x, y, ref, prefix) { + if (prefix) { + prefix += ': '; + } + + var test = GetPixel(gl, x, y); + + var testStr = ColorStr(test); + var refStr = ColorStr(ref.map(value => value * 255)); + ok(testStr == refStr, prefix + 'Should be ' + refStr + ', was ' + testStr + '.'); +} + +function GetProgram(gl) { + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + + prog.aPosition = gl.getAttribLocation(prog, 'aPosition'); + ok(prog.aPosition >= 0, '`aPosition` should be valid.'); + + prog.uColor = gl.getUniformLocation(prog, 'uColor'); + ok(prog.uColor, '`uColor` should be valid.'); + + return prog; +} + +// Give ourselves a scope to return early from: +(function () { + var c = document.createElement('canvas'); + document.body.appendChild(c); + var gl = c.getContext('webgl', { depth: false, antialias: false }); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + //////// + + // With default culling, it works fine. + // The problem seems to be that the virtual quads generated from points are wound 'backwards'. + gl.enable(gl.CULL_FACE); + gl.cullFace(gl.BACK); // Cull back faces. + + //////// + + var vertArr = new Float32Array([ + -1, -1, + +1, -1, + -1, +1, + ]); + + var vbo = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); + gl.bufferData(gl.ARRAY_BUFFER, vertArr, gl.STATIC_DRAW); + + //////// + + var triProg = GetProgram(gl); + var pointProg = GetProgram(gl); + if (!triProg || !pointProg) { + ok(false, 'Program linking should succeed.'); + return; + } + + ok(triProg.aPosition == pointProg.aPosition, 'aPosition should match.'); + gl.enableVertexAttribArray(triProg.aPosition); + gl.vertexAttribPointer(triProg.aPosition, 2, gl.FLOAT, false, 0, 0); + + //////// + + gl.useProgram(triProg); + var triColor = [1, 0, 0, 1]; + gl.uniform4fv(triProg.uColor, triColor); + + gl.useProgram(pointProg); + var pointColor = [0, 1, 0, 1]; + gl.uniform4fv(pointProg.uColor, pointColor); + + //////// + + gl.clearColor(0, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.useProgram(triProg); + gl.drawArrays(gl.TRIANGLES, 0, 3); + + gl.useProgram(pointProg); + gl.drawArrays(gl.POINTS, 0, 3); + + //////// + + PixelShouldBe(gl, 32, 32, triColor, 'Tri'); + PixelShouldBe(gl, 0, 0, pointColor, 'Point'); + + ok(true, 'Test complete'); +})(); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html new file mode 100644 index 0000000000..ef880f9c22 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html @@ -0,0 +1,111 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958723</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<script> + +function TestAttribs(attribs) { + ok(true, 'Testing attribs: ' + JSON.stringify(attribs)); + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl', attribs); + ok(gl, 'No tested attribs should result in failure to create a context'); + if (!gl) + return; + + var actual = gl.getContextAttributes(); + + ok(actual.alpha == attribs.alpha, + 'Resulting `alpha` should match request.'); + ok(actual.premultipliedAlpha == attribs.premultipliedAlpha, + 'Resulting `premultipliedAlpha` should match request.'); + ok(actual.preserveDrawingBuffer == attribs.preserveDrawingBuffer, + 'Resulting `preserveDrawingBuffer` should match request.'); + + // "The depth, stencil and antialias attributes, when set to true, are + // requests, not requirements." + if (!attribs.antialias) { + ok(!actual.antialias, 'No `antialias` if not requested.'); + } + if (!attribs.depth) { + ok(!actual.depth, 'No `depth` if not requested.'); + } + if (!attribs.stencil) { + ok(!actual.stencil, 'No `stencil` if not requested.'); + } + + var hasAlpha = !!gl.getParameter(gl.ALPHA_BITS); + var hasDepth = !!gl.getParameter(gl.DEPTH_BITS); + var hasStencil = !!gl.getParameter(gl.STENCIL_BITS); + var hasAntialias = !!gl.getParameter(gl.SAMPLES); + + ok(hasAlpha == actual.alpha, 'Bits should match `alpha` attrib.'); + ok(hasAntialias == actual.antialias, 'Bits should match `antialias` attrib.'); + ok(hasDepth == actual.depth, 'Bits should match `depth` attrib.'); + ok(hasStencil == actual.stencil, 'Bits should match `stencil` attrib.'); +} + +function CloneAttribs(attribs) { + return { + alpha: attribs.alpha, + antialias: attribs.antialias, + depth: attribs.depth, + premultipliedAlpha: attribs.premultipliedAlpha, + preserveDrawingBuffer: attribs.preserveDrawingBuffer, + stencil: attribs.stencil, + }; +} + +function SplitForAttrib(list, attrib) { + var ret = []; + + for (var i in list) { + var cur = list[i]; + if (cur[attrib]) + throw 'Attrib is already true.'; + + var clone = CloneAttribs(cur); + clone[attrib] = true; + + ret.push(cur); + ret.push(clone); + } + + return ret; +} + +function GenAttribList() { + var base = { + alpha: false, + antialias: false, + depth: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + stencil: false, + }; + var list = [base]; + list = SplitForAttrib(list, 'alpha'); + list = SplitForAttrib(list, 'antialias'); + list = SplitForAttrib(list, 'depth'); + list = SplitForAttrib(list, 'premultipliedAlpha'); + list = SplitForAttrib(list, 'preserveDrawingBuffer'); + list = SplitForAttrib(list, 'stencil'); + + if (list.length != 1<<6) + throw 'Attribs list length wrong: ' + list.length; + + return list; +} + +var list = GenAttribList(); +for (var i in list) { + var attribs = list[i]; + TestAttribs(attribs); +} + +ok(true, 'Test complete.'); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_backends.html b/dom/canvas/test/webgl-mochitest/test_backends.html new file mode 100644 index 0000000000..50ba4cbd4c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_backends.html @@ -0,0 +1,169 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> + +function RunWithPrefs(prefPairList, func) { + var prefEnv = {'set': prefPairList}; + try { + SpecialPowers.pushPrefEnv(prefEnv, func); + } catch (e) { + console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList)); + func(); + } +} + +//////////////////////////////////////// + +var ANGLE_IS_SINGLETON = true; + +var expectD3DType; +try { + // code borrowed from browser/modules/test/browser_taskbar_preview.js + var version = SpecialPowers.Services.sysinfo.getProperty('version'); + version = parseFloat(version); + + // Version 6.0 is Vista, 6.1 is 7. + if (version <= 6.0) + expectD3DType = 'd3d9'; + else + expectD3DType = 'd3d11'; +} catch (e) { + expectD3DType = 'd3d11'; +} + +function GetRenderer() { + var c = document.createElement('canvas'); + var gl = c.getContext('experimental-webgl'); + if (!gl) + return undefined; + + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + if (!ext) + throw new Error('Requires WEBGL_debug_renderer_info.'); + + var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + return renderer; +} + +function GetRendererType() { + var renderer = GetRenderer(); + if (renderer === undefined) + return 'none'; + + if (renderer.includes('ANGLE')) { + if (renderer.includes('Microsoft Basic Render Driver')) // Also includes 'Direct3D11'. + return 'warp'; + if (renderer.includes('Direct3D11')) + return 'd3d11'; + if (renderer.includes('Direct3D9')) + return 'd3d9'; + + } else { + return 'gl'; + } + + throw new Error('Unrecognized renderer type for: ' + renderer); +} + +function TestActualType(testName, expectedType) { + var actualType = GetRendererType(); + ok(actualType == expectedType, + '[' + testName + '] Expected ' + expectedType + ', was ' + actualType); +} + +//////////////////////////////////////// + +function TestDefault() { + var expectedType = 'gl'; + var isWindows = (navigator.platform.indexOf('Win') == 0); + if (isWindows) { + expectedType = expectD3DType; + } + TestActualType('TestDefault', expectedType); + + if (isWindows && !ANGLE_IS_SINGLETON) { + var prefPairList = [ + ['webgl.angle.force-warp', true], + ]; + RunWithPrefs(prefPairList, TestWARP); + return; + } + + var prefPairList = [ + ['webgl.disabled', true], + ]; + RunWithPrefs(prefPairList, TestDisabled); + return; +} + + +function TestWARP() { + var expectedType = (expectD3DType == 'd3d11') ? 'warp' : 'none'; + TestActualType('TestWARP', expectedType); + + var prefPairList = [ + ['webgl.angle.force-warp', false], + ['webgl.angle.force-d3d11', true], + ]; + RunWithPrefs(prefPairList, TestD3D11); +} + + +function TestD3D11() { + var expectedType = (expectD3DType == 'd3d11') ? 'd3d11' : 'none'; + TestActualType('TestD3D11', expectedType); + + var prefPairList = [ + ['webgl.angle.force-d3d11', false], + ['webgl.angle.try-d3d11', false], + ]; + RunWithPrefs(prefPairList, TestD3D9); +} + + +function TestD3D9() { + TestActualType('TestD3D9', 'd3d9'); + + var prefPairList = [ + ['webgl.angle.try-d3d11', true], + ['webgl.disable-angle', true], + ]; + RunWithPrefs(prefPairList, TestWinGL); +} + + +function TestWinGL() { + TestActualType('TestWinGL', 'gl'); + + var prefPairList = [ + ['webgl.disabled', true], + ]; + RunWithPrefs(prefPairList, TestDisabled); +} + + +function TestDisabled() { + TestActualType('TestDisabled', 'none'); + + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +var prefPairList = [ + ['webgl.force-enabled', true], + ['webgl.enable-debug-renderer-info', true], +]; +RunWithPrefs(prefPairList, TestDefault); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_canvas_size.html b/dom/canvas/test/webgl-mochitest/test_canvas_size.html new file mode 100644 index 0000000000..a9ea076a82 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_canvas_size.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<title>WebGL test: Framebuffer maximum size test. (Bug 1290333)</title> +<body> +<script> +function TestSize(contextName, testSize) { + var attributes = { + antialias: false, + }; + + var canvas = document.createElement('canvas'); + var gl = canvas.getContext(contextName, attributes); + + if (!gl) { + todo(false, contextName + 'is unavailable.'); + return; + } + gl.canvas.width = testSize; + gl.canvas.height = testSize; + + ok(true, contextName + 'test complete.'); +} + +function run() { + TestSize('webgl', 16384); + TestSize('webgl2', 16384); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +try { + var prefPairList = [ + ['webgl.force-enabled', true], + ]; + var prefEnv = {'set': prefPairList}; + SpecialPowers.pushPrefEnv(prefEnv, run); +} catch (e) { + warning('No SpecialPowers, but trying WebGL2 anyway...'); + run(); +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_capture.html b/dom/canvas/test/webgl-mochitest/test_capture.html new file mode 100644 index 0000000000..d456e590d9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_capture.html @@ -0,0 +1,213 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: CaptureStream()</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="captureStream_common.js"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs" type="x-shader/x-vertex"> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; +uniform vec4 uColor; + +void main(void) { + gl_FragColor = uColor; +} + +</script> +<body> +<script> + +// Globals. Initialized during beginTest(). +var c; // Canvas element captured by streams. +var gl; // WebGLContext of |c|. +var h; // CaptureStreamTestHelper holding utility test functions. +var vauto; // Video element with captureStream stream in automatic mode. +var vmanual; // Video element with captureStream stream in manual (fps 0) mode. +var vrate; // Video element with captureStream stream with fixed frame rate. + +/* Fails the test if there was a GL error */ +function checkGLError(info) { + var error = gl.getError(); + // Comparing strings for sake of log output in hex format. + is("0x" + error.toString(16), "0x0", "WebGL error [" + info + "]"); +} + +function checkClearColorInitialRed() { + info("Checking that clearing to red works for first frame."); + + h.clearColor(c, h.red); + + vauto.srcObject = c.captureStream(); + vmanual.srcObject = c.captureStream(0); + vrate.srcObject = c.captureStream(10); + + ok(h.isPixel(h.getPixel(vauto), h.blackTransparent), + "vauto should not be drawn to before stable state"); + ok(h.isPixel(h.getPixel(vrate), h.blackTransparent), + "vrate should not be drawn to before stable state"); + ok(h.isPixel(h.getPixel(vmanual), h.blackTransparent), + "vmanual should not be drawn to before stable state"); + + return Promise.resolve() + .then(() => h.pixelMustBecome(vauto, h.red, { + infoString: "should become red automatically", + })) + .then(() => h.pixelMustBecome(vrate, h.red, { + infoString: "should become red automatically", + })) + .then(() => h.pixelMustBecome(vmanual, h.red, { + infoString: "should become red when we get to stable " + + "state (first frame)", + })) +} + +function checkDrawColorGreen() { + info("Checking that drawing green results in green video frames."); + var drawing = h.startDrawing(h.drawColor.bind(h, c, h.green)); + checkGLError('after DrawColor'); + return Promise.resolve() + .then(() => h.pixelMustBecome(vauto, h.green, { + infoString: "should become green automatically", + })) + .then(() => h.pixelMustBecome(vrate, h.green, { + infoString: "should become green automatically", + })) + .then(() => h.pixelMustBecome(vmanual, h.red, { + infoString: "should still be red", + })) + .then(() => h.requestFrame(vmanual)) + .then(() => h.pixelMustBecome(vmanual, h.green, { + infoString: "should become green after requstFrame()", + })) + .then(() => drawing.stop()); +} + +function checkClearColorRed() { + info("Checking that clearing to red works."); + var drawing = h.startDrawing(h.clearColor.bind(h, c, h.red)); + return Promise.resolve() + .then(() => h.pixelMustBecome(vauto, h.red, { + infoString: "should become red automatically", + })) + .then(() => h.pixelMustBecome(vrate, h.red, { + infoString: "should become red automatically", + })) + .then(() => h.pixelMustBecome(vmanual, h.green, { + infoString: "should still be green", + })) + .then(() => h.requestFrame(vmanual)) + .then(() => h.pixelMustBecome(vmanual, h.red, { + infoString: "should become red after requestFrame()", + })) + .then(() => drawing.stop()); +} + +function checkRequestFrameOrderGuarantee() { + info("Checking that requestFrame() immediately after a draw " + + "call results in the expected frame seen in the stream."); + return Promise.resolve() + .then(() => h.pixelMustBecome(vmanual, h.red, 0, "should still be red")) + .then(() => h.drawColor(c, h.green)) // 1. Draw canvas green + .then(() => h.requestFrame(vmanual)) // 2. Immediately request a frame + .then(() => h.pixelMustBecome(vmanual, h.green, { + infoString: "should become green after call order test", + })) +} + +function checkEndedOnStop() { + let promises = [vauto, vmanual, vrate].map(elem => { + elem.srcObject.getTracks()[0].stop(); + return new Promise(resolve => + elem.addEventListener("ended", function endedListener(event) { + ok(true, "Element " + elem.id + " ended."); + resolve(); + elem.removeEventListener("ended", endedListener); + })); + }); + return Promise.all(promises); +} + + +function finish() { + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +function beginTest() { + h = new CaptureStreamTestHelperWebGL(); + + c = h.createAndAppendElement('canvas', 'c'); + vauto = h.createAndAppendElement('video', 'vauto'); + vmanual = h.createAndAppendElement('video', 'vmanual'); + vrate = h.createAndAppendElement('video', 'vrate'); + + gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + finish(); + return; + } + + gl.disable(gl.DEPTH_TEST); + + prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + // Setup vertex coordinates for drawing a rectangle across the whole canvas. + + prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord"); + ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.'); + + var vertCoordArr = new Float32Array([ + -1, -1, + 1, -1, + -1, 1, + 1, 1, + ]); + var vertCoordBuff = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff); + gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW); + + gl.useProgram(prog); + gl.enableVertexAttribArray(prog.aVertCoord); + gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0); + + // Setup the helper with a pointer to how to change fragment color. + + var uColorLocation = gl.getUniformLocation(prog, "uColor"); + h.setFragmentColorLocation(uColorLocation); + + checkGLError('after setup'); + + // Run tests. + + Promise.resolve() + .then(checkClearColorInitialRed) + .then(checkDrawColorGreen) + .then(checkClearColorRed) + .then(checkRequestFrameOrderGuarantee) + .then(checkEndedOnStop) + .then(finish); +} + +SimpleTest.waitForExplicitFinish(); + +beginTest(); +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html new file mode 100644 index 0000000000..f2bc2914b2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html @@ -0,0 +1,35 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta http-equiv='content-type' content='text/html; charset=utf-8'/> + + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> + +<body> +<script> +'use strict'; + +(function() { + var c = document.createElement('canvas'); + var gl = c.getContext('webgl'); + + ok(!gl.getError(), 'No error before.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex); + gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGBA, 4, 3, 0, gl.RGBA, + gl.UNSIGNED_BYTE, null); + + var err = gl.getError(); + ok(err == gl.INVALID_VALUE, + 'Should be INVALID_VALUE (0x501) after, was 0x' + err.toString(16) + '.'); +})(); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html new file mode 100644 index 0000000000..d0ed8e60b0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html @@ -0,0 +1,60 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check for error on ReadPixels from a depth-only FB.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> +"use strict"; + +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(gl, 'Get GL working here first.'); + return; + } + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 4, 4); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, + gl.RENDERBUFFER, rb); + + if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) { + todo(false, 'Depth-only FB incomplete. This is valid.'); + return; + } + + ok(!gl.getError(), 'Should have no errors after constructing FB.'); + + var pixels = new Uint8Array([1, 2, 3, 4]); + gl.readPixels(0, 0, // x,y + 1, 1, // w,h + gl.RGBA, gl.UNSIGNED_BYTE, pixels); + + ok(gl.getError() == gl.INVALID_OPERATION, + '1x1 color read from a depth FB should generated INVALID_OP.'); + console.log('Data after 1x1 color-from-depth readpixels:'); + console.log(pixels); + + gl.readPixels(0, 0, // x,y + 0, 0, // w,h + gl.RGBA, gl.UNSIGNED_BYTE, pixels); + + ok(gl.getError() == gl.INVALID_OPERATION, + '0x0 color read from a depth FB should generated INVALID_OP.'); +})(); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html new file mode 100644 index 0000000000..a3f2dc409a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html @@ -0,0 +1,73 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> +<body> +<script id='vs' type='x-shader/x-vertex'> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id='fs' type='x-shader/x-fragment'> + +precision mediump float; +uniform sampler2D uTexUnit; + +void main(void) { + vec4 tex = texture2D(uTexUnit, vec2(0)); + gl_FragColor = vec4(tex.r, 1.0, 0.0, 1.0); +} + +</script> +<script> +'use strict'; + +var gl = null; + +do { + var c = document.createElement('canvas'); + gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'Get GL working here first.'); + break; + } + + var ext = gl.getExtension('WEBGL_depth_texture'); + if (!ext) { + todo(false, 'WEBGL_depth_texture not supported, which is fine.'); + break; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + break; + } + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1, 1, 0, gl.DEPTH_COMPONENT, + gl.UNSIGNED_INT, null); + + var uTexUnit = gl.getUniformLocation(prog, 'uTexUnit'); + gl.useProgram(prog); + gl.uniform1i(uTexUnit, 0); + + gl.drawArrays(gl.POINTS, 0, 1); + + ok(!gl.getError(), 'Should have no errors.'); +} while (false); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_draw.html b/dom/canvas/test/webgl-mochitest/test_draw.html new file mode 100644 index 0000000000..b0e2b6ffd2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_draw.html @@ -0,0 +1,125 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: Basic drawing</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> + + +<script id="vs" type="x-shader/x-vertex"> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + gl.disable(gl.DEPTH_TEST); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord"); + ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.'); + + function checkGLError(func, info, refValue) { + if (!refValue) + refValue = 0; + + var error = gl.getError(); + func(error == refValue, + '[' + info + '] gl.getError should be 0x' + refValue.toString(16) + + ', was 0x' + error.toString(16) + '.'); + } + + var vertCoordArr = new Float32Array([ + -1, -1, + 1, -1, + -1, 1, + 1, 1, + ]); + var vertCoordBuff = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff); + gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW); + + var indexArr = new Uint16Array([ + 0, 1, 2, + 3, + ]); + var indexBuff = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuff); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); + + + function testPixel(x, y, refData, func, infoString) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + var pixelMatches = pixel[0] == refData[0] && + pixel[1] == refData[1] && + pixel[2] == refData[2] && + pixel[3] == refData[3]; + func(pixelMatches, infoString); + } + + function preDraw(info) { + gl.clearColor(1.0, 0.0, 0.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + testPixel(0, 0, [255, 0, 0, 255], ok, '[' + info + '] Should be red before drawing.'); + } + + function postDraw(info) { + testPixel(0, 0, [0, 255, 0, 255], ok, '[' + info + '] Should be green before drawing.'); + } + + gl.useProgram(prog); + gl.enableVertexAttribArray(prog.aVertCoord); + gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0); + + // Start drawing + checkGLError(ok, 'after setup'); + + preDraw('DrawArrays'); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + postDraw('DrawArrays'); + checkGLError(ok, 'after DrawArrays'); + + preDraw('DrawElements'); + gl.drawElements(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_SHORT, 0); + postDraw('DrawElements'); + checkGLError(ok, 'after DrawElements'); + + ok(true, 'Test complete.'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html b/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html new file mode 100644 index 0000000000..181711f685 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_draw_fakevert_large_offset.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +</head> +<body> +<pre id=e_out></pre> +<script> +ok = window.ok || function(e, s) { + e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`; +}; + +// - + +// Bug 1778144 +const canvas = document.createElement("canvas") +const gl = canvas.getContext("webgl") +program = gl.createProgram() +vertex = gl.createShader(gl.VERTEX_SHADER) +gl.shaderSource(vertex, `\ + precision highp float; + attribute vec4 a_vec4; + uniform bool u_bool; + uniform bvec2 u_bvec2; + uniform bvec3 u_bvec3; + uniform bvec4 u_bvec4; + varying vec2 v_vec2; + void main() { + gl_Position.x += float(a_vec4.x); + if (u_bool || u_bvec2.x || u_bvec3.x || u_bvec4.x) { + } + } +`) +gl.compileShader(vertex) +gl.attachShader(program, vertex) +fragment = gl.createShader(gl.FRAGMENT_SHADER) +gl.shaderSource(fragment, `\ + precision highp float; + varying vec2 v_vec2; + uniform sampler2D u_sampler2d; + void main() { + gl_FragColor = texture2D(u_sampler2d, v_vec2); + } +`) +gl.compileShader(fragment) +gl.attachShader(program, fragment) +gl.linkProgram(program) +gl.useProgram(program) +const begin = performance.now(); +gl.drawArrays(gl.POINTS, 1659036386, 1) + +let err = gl.getError(); +ok(err == gl.OUT_OF_MEMORY || !err, `err: ${err}`); + +const elapsed_ms = performance.now() - begin; +ok(elapsed_ms < 1000, `elapsed_ms:${elapsed_ms} < 1000`); + +// - + +// Let's be kind and kill this now-gpu-memory-heavy context. +gl.getExtension('WEBGL_lose_context').loseContext(); +err = gl.getError(); +ok(err == gl.CONTEXT_LOST_WEBGL, `err:${err} == gl.CONTEXT_LOST_WEBGL`); + +// - + +ok(true, 'done'); +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param.html b/dom/canvas/test/webgl-mochitest/test_fb_param.html new file mode 100644 index 0000000000..80d76a6137 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fb_param.html @@ -0,0 +1,47 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958491</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 4, 4); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, + gl.RENDERBUFFER, rb); + + checkGLError(ok, 'before bad param query', 0); + + var GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING); + + checkGLError(ok, 'after bad param query', gl.INVALID_ENUM); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html new file mode 100644 index 0000000000..4046309ba6 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html @@ -0,0 +1,41 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958723</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + if (!gl.getExtension('WEBGL_draw_buffers')) { + todo(false, 'Not having this extension is fine.'); + return; + } + checkGLError(ok, 'before bad param query', 0); + + var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + + checkGLError(ok, 'after bad param query', gl.INVALID_OPERATION); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html new file mode 100644 index 0000000000..4c05d43ec9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html @@ -0,0 +1,195 @@ +<!DOCTYPE HTML> +<title>WebGL fuzzy bugs</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<script> + +// Test the framebufferTexture2D() call with a unbound texture. +function framebufferTexture2D_bug1257593() { + var canvas = document.createElement('canvas'); + + var gl = null; + gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + if (!gl) { + todo(false, 'WebGL framebufferTexture2D test, webgl is unavailable.'); + return; + } + + var texture = gl.createTexture(); // only createTexture(), but no bindBuffer() + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, texture, 0); + + ok(true, 'WebGL framebufferTexture2D with unbound texture'); +} + +// Test to call ClearBufferXXX() during context lost. +function webGL2ClearBufferXXX_bug1252414() { + var canvas = document.createElement('canvas'); + + var gl = canvas.getContext('webgl2'); + if (!gl) { + todo(false, 'WebGL2 is not supported'); + return; + } + + var ext = gl.getExtension('WEBGL_lose_context'); + if (!ext) { + todo(false, 'WebGL ClearBufferXXX test, ext WEBGL_lose_context is unavailable.'); + return; + } + + // Force to lose context. + ext.loseContext(); + + // Even thought the context is lost, all clearBuffer* function should still + // work without crash. + gl.clearBufferiv(gl.COLOR, 0, new Int32Array(10)); + gl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(10)); + gl.clearBufferfv(gl.DEPTH, 0, new Float32Array(10)); + gl.clearBufferfi(gl.DEPTH_STENCIL, 0, 0.0, 0); + + ok(true, 'WebGL2 clearBufferXXX call during loseContext'); +} + +// Test gl function for multiple gl contexts switch. +function getFramebufferAttachmentParameter_bug1267100() +{ + var canvas1 = document.createElement('canvas'); + var canvas2 = document.createElement('canvas'); + + var gl1 = null; + gl1 = canvas1.getContext('webgl') || canvas1.getContext('experimental-webgl'); + if (!gl1) { + todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.'); + return; + } + var gl2 = null; + gl2 = canvas2.getContext('webgl') || canvas2.getContext('experimental-webgl'); + if (!gl2) { + todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.'); + return; + } + + gl1.bindFramebuffer(gl1.FRAMEBUFFER, gl1.createFramebuffer()); + gl2.scissor(0, 1, 2, 3); + // The gl call should still work even though we use another gl context before. + gl1.getFramebufferAttachmentParameter(gl1.FRAMEBUFFER, + gl1.COLOR_ATTACHMENT0, + gl1.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + + ok(true, 'WebGL test getFramebufferAttachmentParameter'); +} + +// Test to call getFragDataLocation() when the fragment shader is detatched. +function getFragDataLocation_bug1259702() { + var canvas = document.createElement('canvas'); + + var gl = canvas.getContext('webgl2'); + + if (!gl) { + todo(false, 'WebGL2 is not supported'); + return; + } + + var program = gl.createProgram(); + + var vertexShaderSrc = + "void main(void) { \ + gl_Position = vec4(1.0, 1.0, 1.0, 1.0); \ + }"; + var fragmentShaderSrc = + "void main(void) { \ + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); \ + }"; + + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + + gl.shaderSource(vertexShader, vertexShaderSrc); + gl.compileShader(vertexShader); + gl.attachShader(program, vertexShader); + + gl.shaderSource(fragmentShader, fragmentShaderSrc); + gl.compileShader(fragmentShader); + gl.attachShader(program, fragmentShader); + + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var lastError = gl.getProgramInfoLog(program); + ok(false, 'WebGL getFragDataLocation() test, error in linking:' + + lastError); + return; + } + + gl.useProgram(program); + + gl.detachShader(program, fragmentShader); + // Test the getFragDataLocation() call after detatch the shader. + // This call should not hit crash. + gl.getFragDataLocation(program, "foobar"); + + ok(true, 'WebGL getFragDataLocation() call after detatch fragment shader'); +} + +function deleteBuffer_bug1379995() +{ + var canvas = document.createElement('canvas'); + var gl = null; + gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + if (!gl) { + todo(false, 'WebGL deleteBuffer test, webgl is unavailable.'); + return; + } + + var program = gl.createProgram(); + var vShader = gl.createShader(gl.VERTEX_SHADER); + var fShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(vShader,'attribute vec3 pos;void main(){gl_Position = vec4(pos, 2.0);}'); + gl.shaderSource(fShader,'void main() {gl_FragColor = vec4(0.5, 0.5, 1.0, 1.0);}'); + gl.compileShader(vShader); + gl.compileShader(fShader); + gl.attachShader(program, vShader); + gl.attachShader(program, fShader); + gl.linkProgram(program); + var buffer = gl.createBuffer(); + var attr = gl.getAttribLocation(program, 'pos'); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.enableVertexAttribArray(attr); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, 0, 0,0, 1, 0,0, -1, 0,1, 0, 0]),gl.STATIC_DRAW); + gl.useProgram(program); + gl.vertexAttribPointer(attr, 3, gl.FLOAT, false, 0, 0); + gl.drawArrays(gl.TRIANGLES, 0, 3); + gl.deleteBuffer(buffer); + // Call the drawArrays after deleteBuffer(). It should not hit the crash. + gl.drawArrays(gl.TRIANGLES, 0, 3); + + ok(true, 'WebGL no crash for drawArrays() after deleteBuffer() call'); +} + +function run() { + webGL2ClearBufferXXX_bug1252414(); + framebufferTexture2D_bug1257593(); + getFramebufferAttachmentParameter_bug1267100(); + getFragDataLocation_bug1259702(); + deleteBuffer_bug1379995(); + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +try { + var prefArrArr = [ + ['webgl.force-enabled', true], + ['webgl.enable-webgl2', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, run); +} catch (e) { + warning('No SpecialPowers, but trying WebGL2 anyway...'); + run(); +} +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_has_rbab.html b/dom/canvas/test/webgl-mochitest/test_has_rbab.html new file mode 100644 index 0000000000..bc60f2deaf --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_has_rbab.html @@ -0,0 +1,40 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <title>Fail without robust_buffer_access_behavior</title> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> + +function AssertRBAB() { + const c = document.createElement('canvas'); + const g = c.getContext('webgl'); + const e = g.getExtension('MOZ_debug'); + ok(e, 'Should have MOZ_debug.'); + + const does_index_validation = e.getParameter(e.DOES_INDEX_VALIDATION); + const err = g.getError(); + ok(!err, 'Error should be 0, was 0x' + err.toString(16)); + ok(!does_index_validation, + "Should have RBAB. Mark this test as failing on platforms that can't support it."); + + SimpleTest.finish(); +} + +// - + +SimpleTest.waitForExplicitFinish(); + +const prefPairList = [ + ['webgl.force-enabled', true], + ['webgl.enable-privileged-extensions', true], +]; +const prefEnv = {'set': prefPairList}; +SpecialPowers.pushPrefEnv(prefEnv, AssertRBAB); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html new file mode 100644 index 0000000000..addc1b0162 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html @@ -0,0 +1,156 @@ +<!DOCTYPE HTML> +<title>WebGL test: Hidden alpha on no-alpha contexts</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +<script src='driver-info.js'></script> +<script src='webgl-util.js'></script> +<body> +<script id='vs' type='x-shader/x-vertex'> + attribute vec2 aPosCoord; + + void main(void) { + gl_Position = vec4(aPosCoord, 0.0, 1.0); + } +</script> + +<script id='fs' type='x-shader/x-fragment'> + precision mediump float; + + void main(void) { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } +</script> +<canvas id='canvas' style='border: none;' width='100' height='100'></canvas> +<script> + +var posCoords_arr = new Float32Array(2 * 4); +var posCoords_buff = null; +function DrawQuad(gl, prog, x0, y0, x1, y1) { + gl.useProgram(prog); + + if (!posCoords_buff) { + posCoords_buff = gl.createBuffer(); + } + gl.bindBuffer(gl.ARRAY_BUFFER, posCoords_buff); + posCoords_arr[0] = x0; + posCoords_arr[1] = y0; + + posCoords_arr[2] = x1; + posCoords_arr[3] = y0; + + posCoords_arr[4] = x0; + posCoords_arr[5] = y1; + + posCoords_arr[6] = x1; + posCoords_arr[7] = y1; + gl.bufferData(gl.ARRAY_BUFFER, posCoords_arr, gl.STREAM_DRAW); + + gl.enableVertexAttribArray(prog.aPosCoord); + gl.vertexAttribPointer(prog.aPosCoord, 2, gl.FLOAT, false, 0, 0); + + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +} + +function DrawSquare(gl, prog, size) { + DrawQuad(gl, prog, -size, -size, size, size); +} + +function Reset(gl) { + gl.canvas.width += 1; + gl.canvas.width -= 1; +} + +function ReadCenterPixel(gl) { + var w = gl.drawingbufferWidth; + var h = gl.drawingbufferHeight; + var ret = new Uint8Array(4); + gl.readPixels(w/2, h/2, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ret); + return ret; +} + +function Test(gl, prog) { + gl.enable(gl.BLEND); + gl.blendFunc(gl.ZERO, gl.DST_ALPHA); + + var iColor = 64; + var fColor = iColor / 255.0; + + ////////////////// + + ok(true, 'clear(R,G,B,0)'); + + Reset(gl); + + gl.clearColor(fColor, fColor, fColor, 0.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + var dataURL_pre = gl.canvas.toDataURL(); + //console.log('Before blending: ' + dataURL_pre); + + DrawSquare(gl, prog, 0.7); + + var pixel = ReadCenterPixel(gl); + ok(pixel[0] == iColor && + pixel[1] == iColor && + pixel[2] == iColor, 'Color should be the same.'); + ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.'); + + var dataURL_post = gl.canvas.toDataURL(); + //console.log('After blending: ' + dataURL_post); + ok(dataURL_post == dataURL_pre, + 'toDataURL should be unchanged after blending.'); + + ////////////////// + + ok(true, 'mask(R,G,B,0), clear(R,G,B,1)'); + + Reset(gl); + + gl.colorMask(true, true, true, false); + gl.clearColor(fColor, fColor, fColor, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.colorMask(true, true, true, true); + + dataURL_pre = gl.canvas.toDataURL(); + //console.log('Before blending: ' + dataURL_pre); + + DrawSquare(gl, prog, 0.7); + + var pixel = ReadCenterPixel(gl); + ok(pixel[0] == iColor && + pixel[1] == iColor && + pixel[2] == iColor, 'Color should be the same.'); + ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.'); + ok(gl.getError() == 0, 'Should have no errors.'); + + dataURL_post = gl.canvas.toDataURL(); + //console.log('After blending: ' + dataURL_post); + ok(dataURL_post == dataURL_pre, + 'toDataURL should be unchanged after blending.'); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +(function(){ + var canvas = document.getElementById('canvas'); + var attribs = { + alpha: false, + antialias: false, + premultipliedAlpha: false, + }; + var gl = canvas.getContext('experimental-webgl', attribs); + ok(gl, 'WebGL should work.'); + ok(gl.getParameter(gl.ALPHA_BITS) == 0, 'Shouldn\'t have alpha bits.'); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + ok(prog, 'Program should link.'); + prog.aPosCoord = gl.getAttribLocation(prog, 'aPosCoord'); + + SimpleTest.waitForExplicitFinish(); + SimpleTest.requestFlakyTimeout("untriaged"); + setTimeout(function(){ Test(gl, prog); }, 500); +})(); + +</script> +</body> diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html new file mode 100644 index 0000000000..987af9e371 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html @@ -0,0 +1,159 @@ +<!DOCTYPE HTML> +<title>WebGL test: Hidden depth/stencil passes without a depth/stencil buffer respectively</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +<script src='webgl-util.js'></script> +<body> +<script id='vs' type='x-shader/x-vertex'> + void main(void) { + gl_PointSize = 1.0; // Note that this is undefined if we don't write to it! + gl_Position = vec4(vec3(0), 1); + } +</script> + +<script id='fs' type='x-shader/x-fragment'> + precision mediump float; + + void main(void) { + gl_FragColor = vec4(0, 1, 0, 1); + } +</script> +<script> + +function ColorString(arr) { + return '[' + arr[0] + ', ' + arr[1] + ', ' + arr[2] + ', ' + arr[3] + ']'; +} + +function DrawAndCheck(gl, infoPrefix, refColorStr) { + gl.viewport(0, 0, 1, 1); + + gl.clearColor(1, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + + var pixel = new Uint8Array(4); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + var pixelStr = ColorString(pixel); + + ok(pixelStr == refColorStr, infoPrefix + pixelStr + ' should be ' + refColorStr); +} + +function TestCurrent(gl, attribs, infoPrefix) { + infoPrefix = infoPrefix + JSON.stringify(attribs) + ': '; + + var CLEAR_COLOR = ColorString([255, 0, 0, 255]); + var DRAW_COLOR = ColorString([0, 255, 0, 255]); + + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.STENCIL_TEST); + + DrawAndCheck(gl, infoPrefix + 'initial: ', DRAW_COLOR); + + if (!attribs.depth) { + gl.enable(gl.DEPTH_TEST); + gl.depthFunc(gl.NEVER); + + gl.disable(gl.STENCIL_TEST); + + // Depth test is enabled, and should pass NEVER. + // Since there is no depth buffer, the depth test is not run. + // Stencil test is disabled. + DrawAndCheck(gl, infoPrefix + 'no-depth: ', DRAW_COLOR); + } + + if (!attribs.stencil) { + gl.disable(gl.DEPTH_TEST); + + gl.enable(gl.STENCIL_TEST); + gl.stencilFunc(gl.NEVER, 0, 0); + + // Depth test is disabled. + // Stencil test is enabled, and should pass NEVER. + // Since there is no stencil buffer, the stencil test is not run. + DrawAndCheck(gl, infoPrefix + 'no-stencil: ', DRAW_COLOR); + } +} + +function TestBackbuffer(requestedAttribs) { + var canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + var gl = canvas.getContext('experimental-webgl', requestedAttribs); + if (!gl) { + ok(true, 'WebGL doesn\'t work, skipping test.'); + return; + } + + ok(gl.drawingBufferWidth == 1 && gl.drawingBufferHeight == 1, + 'backbuffer should be 1x1'); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + gl.useProgram(prog); + + var attribs = { + depth: gl.getContextAttributes().depth, + stencil: gl.getContextAttributes().stencil, + }; + TestCurrent(gl, attribs, 'Backbuffer: '); +} + +function TestUserFB() { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl'); + if (!gl) { + ok(true, 'WebGL doesn\'t work, skipping test.'); + return; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + gl.useProgram(prog); + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + + var depthRB = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthRB); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 1, 1); + + var stencilRB = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, stencilRB); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 1, 1); + + do { + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRB); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) { + ok(true, 'Depth-only user FB is incomplete. This is allowed.'); + break; + } + + TestCurrent(gl, {depth: true, stencil: false}, 'Depth-only user FB'); + } while (false); + + do { + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencilRB); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) { + ok(true, 'Stencil-only user FB is incomplete. This is allowed.'); + break; + } + + TestCurrent(gl, {depth: false, stencil: true}, 'Stencil-only user FB'); + } while (false); +} + +(function(){ + TestBackbuffer({depth: true, stencil: false}); + TestBackbuffer({depth: false, stencil: true}); + TestUserFB(); +})(); + +</script> +</body> diff --git a/dom/canvas/test/webgl-mochitest/test_highp_fs.html b/dom/canvas/test/webgl-mochitest/test_highp_fs.html new file mode 100644 index 0000000000..6927c5c1c2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_highp_fs.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<title>WebGL test: `highp` support</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="shader-vs" type="x-shader/x-vertex"> + +void main(void) { + gl_Position = vec4(vec3(0.0), 1.0); +} + +</script> +<script id="shader-fs" type="x-shader/x-fragment"> + +precision highp float; + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} + +</script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function checkGLError(func, info) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : '' + func(!error, prefix + 'gl.getError should be 0x0, was 0x' + error.toString(16) + '.'); + } + + var format = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); + var prog = WebGLUtil.createProgramByIds(gl, 'shader-vs', 'shader-fs'); + checkGLError(ok); + + if (format) { + ok(prog, 'Frag shader with unconditional `precision highp float` should ' + + 'link if `getShaderPrecisionFormat` gives a format for it.'); + } else { + ok(!prog, 'Frag shader with unconditional `precision highp float` should ' + + 'NOT link if `getShaderPrecisionFormat` gives NO format for it.'); + } +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html b/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html new file mode 100644 index 0000000000..18eed39a43 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_imagedata_transfered_arraybuffer.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset=utf-8> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> + <script> +'use strict'; +const ab = new ArrayBuffer(4); +const ta = new Uint8ClampedArray(ab); +const idata = new ImageData(ta, 1); +const canvas = document.createElement('canvas'); +const gl = canvas.getContext('webgl2'); +const worker = new Worker('worker.js'); +worker.postMessage([ab], [ab]); +gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 1, gl.RGB, idata.width, idata.height, 0, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, idata); +const err = gl.getError(); +window.ok = window.ok || console.log; +ok(err == gl.INVALID_VALUE, 'texImage2D(ImageData) with Transferred ArrayBuffer is INVALID_VALUE'); + </script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html new file mode 100644 index 0000000000..bbabef3e8b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html @@ -0,0 +1,199 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset='utf-8'> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +var RGBA32F_EXT = 0x8814; +var RGBA16F_EXT = 0x881A; // Yep, it's really 4 and A. +var HALF_FLOAT_OES = 0x8D61; + +function IsFormatValidForRB(gl, format) { + ok(!gl.getError(), 'Should have no errors here.'); + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, format, 4, 4); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_ENUM or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTex(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTexFB(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + return status == gl.FRAMEBUFFER_COMPLETE; +} + +function IsFormatValidForTexFBRead(gl, texFormat, texType, readType) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, texFormat, 4, 4, 0, texFormat, texType, + null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) + return false; + + var data; + switch (readType) { + case gl.UNSIGNED_BYTE: + data = new Uint8Array(4); + break; + case HALF_FLOAT_OES: + data = new Uint16Array(4); + break; + case gl.FLOAT: + data = new Float32Array(4); + break; + default: + throw 'Bad `readType`.'; + } + gl.readPixels(0, 0, 1, 1, gl.RGBA, readType, data); + + error = gl.getError(); + return error == gl.NO_ERROR; +} + +function TestColorBufferExt(gl, rbFormat, texFormat, texType, readType) +{ + var isTexFBValid = IsFormatValidForTexFB(gl, texFormat, texType); + var isTexFBReadValid = IsFormatValidForTexFBRead(gl, texFormat, texType, + readType); + var isRBValid = IsFormatValidForRB(gl, rbFormat); + + var validSubsetCount = isTexFBValid + isTexFBReadValid + isRBValid; + + if (validSubsetCount) { + ok(isTexFBValid, 'If active, texture-fbs should work.'); + ok(isTexFBReadValid, 'If active, reading texture-fbs should work.'); + ok(isRBValid, 'If active, renderbuffers should work.'); + } + + return validSubsetCount == 3; +} + +function TestImpliedExtension(gl, baseExtName, impliedExtName, rbFormat, + texFormat, texType, readType) +{ + ok(true, '========'); + ok(true, 'Testing if ' + baseExtName + ' implies ' + impliedExtName + '.'); + ok(true, '--------'); + + var baseExt = gl.getExtension(baseExtName); + if (!baseExt) { + ok(!baseExt, 'Ext \'' + baseExtName + '\' can be unsupported.'); + return; + } + + var isTexValid = IsFormatValidForTex(gl, texFormat, texType); + ok(isTexValid, baseExtName + ' should allow float textures.'); + if (!isTexValid) + return; + + var isImplicitlyActive = TestColorBufferExt(gl, rbFormat, texFormat, + texType, readType); + + if (isImplicitlyActive) { + ok(true, 'Activating ' + baseExtName + ' has implicitly activated ' + + impliedExtName + '.'); + + var impliedExt = gl.getExtension(impliedExtName); + ok(impliedExt, 'If ' + impliedExtName + ' is supported implicitly, it' + + ' must be supported explicitly as well.'); + return; + } + + ok(true, 'Activating ' + baseExtName + ' has not implicitly activated ' + + impliedExtName + '.'); + ok(true, '--------'); + + var impliedExt = gl.getExtension(impliedExtName); + if (!impliedExt) { + ok(true, impliedExtName + ' can be unsupported.'); + return; + } + ok(true, 'Explicit activation of ' + impliedExtName + ' successful.'); + + var isFunctional = TestColorBufferExt(gl, rbFormat, texFormat, texType, + readType); + ok(isFunctional, impliedExtName + ' should be fully functional.'); +} + +(function() { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl'); + if (!gl) { + ok(!gl, 'WebGL can be unsupported.'); + return; + } + + TestImpliedExtension(gl, 'OES_texture_float', 'WEBGL_color_buffer_float', + RGBA32F_EXT, gl.RGBA, gl.FLOAT, gl.FLOAT); + TestImpliedExtension(gl, 'OES_texture_half_float', + 'EXT_color_buffer_half_float', RGBA16F_EXT, gl.RGBA, + HALF_FLOAT_OES, gl.FLOAT); + ok(true, '========'); + ok(true, 'TEST COMPLETE'); +})(); + +</script> + +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_no_arr_points.html b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html new file mode 100644 index 0000000000..c4556c9b5c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html @@ -0,0 +1,156 @@ +<!DOCTYPE HTML> +<title>WebGL test: Drawing without attrib arrays</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs-no-attrib" type="x-shader/x-vertex"> + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(vec3(0.0), 1.0); +} + +</script> +<script id="vs-attrib" type="x-shader/x-vertex"> + +attribute vec3 aPosition; + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(aPosition, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + DriverInfo.dump(x => ok(true, x)); + + var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs'); + var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs'); + if (!attribProg || !noAttribProg) { + ok(false, 'Program linking should succeed.'); + return; + } + + attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition"); + ok(attribProg.aPosition >= 0, '`aPosition` should be valid.'); + + function isScreenBlack() { + var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight; + var data = new Uint8Array(4 * pixels); + gl.readPixels(0, 0, + gl.drawingBufferWidth, gl.drawingBufferHeight, + gl.RGBA, gl.UNSIGNED_BYTE, + data); + + var accum = 0; + for (var i = 0; i < pixels; i++) { + accum += data[4*i + 0]; + accum += data[4*i + 1]; + accum += data[4*i + 2]; + } + + return accum == 0; + } + + function checkGLError(func, info) { + var error = gl.getError(); + func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.'); + } + + function testDrawing(info) { + var cruelNumber = 1024*1024; + // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls, + // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array. + // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t) + var UINT16_MAX = 0xffff; + var INT32_MAX = 0x7fffffff; + var UINT32_MAX = 0xffffffff; + + // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX + var hugeFirst = Math.min(cruelNumber, INT32_MAX-1); + var hugeIndex = Math.min(cruelNumber, UINT32_MAX); + + var indexType = gl.UNSIGNED_SHORT; + var indexStride = 2; + var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]); + if (gl.getExtension('OES_element_index_uint')) { + indexType = gl.UNSIGNED_INT; + indexStride = 4; + indexArr = new Uint32Array([0, 1, hugeIndex]); + } + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, hugeFirst, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.'); + + checkGLError(ok, info); + + var elemTestFunc = ok; + var checkGLTestFunc = ok; + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR) { + // ...but the Android 4.2 x86 emulator environment is different + elemTestFunc = todo; + checkGLTestFunc = ok; + } + + // Now for drawElements: + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 0); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.'); + + checkGLError(checkGLTestFunc, info); + } + + // Begin drawing + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.disable(gl.DEPTH_TEST); + + // No-attrib prog: + gl.useProgram(noAttribProg); + testDrawing('no-attrib'); + + // One-attrib, no-array prog: + gl.useProgram(attribProg); + gl.disableVertexAttribArray(attribProg.aPosition); + gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]); + testDrawing('one-attrib, no-array'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_noprog_draw.html b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html new file mode 100644 index 0000000000..37def57fca --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html @@ -0,0 +1,74 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: Drawing with a null program</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> + + +<script id="vs" type="x-shader/x-vertex"> + +void main(void) { + gl_PointSize = 16.0; + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + gl.disable(gl.DEPTH_TEST); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + function checkGLError(func, info, refValue) { + if (!refValue) + refValue = 0; + + var error = gl.getError(); + func(error == refValue, + '[' + info + '] gl.getError should be 0x' + refValue.toString(16) + + ', was 0x' + error.toString(16) + '.'); + } + + // Start drawing + checkGLError(ok, 'after setup'); + + gl.useProgram(prog); + gl.drawArrays(gl.POINTS, 0, 1); + checkGLError(ok, 'after non-null-program DrawArrays'); + + gl.useProgram(null); + gl.drawArrays(gl.POINTS, 0, 1); + checkGLError(ok, 'after null-program DrawArrays', gl.INVALID_OPERATION); + + ok(true, 'Test complete.'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html new file mode 100644 index 0000000000..bfacc5bfa9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html @@ -0,0 +1,288 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> + <script> + +var RED = [1, 0, 0, 1]; +var GREEN = [0, 1, 0, 1]; +var BLUE = [0, 0, 1, 1]; +var WHITE = [1, 1, 1, 1]; +var ZERO = [0, 0, 0, 0]; + +function DrawColors(gl) { + var fnClearToColor = function(color) { + gl.clearColor(color[0], color[1], color[2], color[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + }; + + gl.enable(gl.SCISSOR_TEST); + + // +---+ + // |G W| + // |R B| + // +---+ + + gl.scissor(0, 0, 1, 1); + fnClearToColor(RED); + + gl.scissor(1, 0, 1, 1); + fnClearToColor(BLUE); + + gl.scissor(0, 1, 1, 1); + fnClearToColor(GREEN); + + gl.scissor(1, 1, 1, 1); + fnClearToColor(WHITE); +} + +function ClearBufferPair(gl, byteCount) { + // Using `null` here clears to zero according to WebGL. + gl.bufferData(gl.PIXEL_PACK_BUFFER, byteCount, gl.STREAM_READ); + + var arr = new Uint8Array(byteCount); + return arr; +} + +function ColorToString(color, offset=0) { + var arr = [ color[offset+0], + color[offset+1], + color[offset+2], + color[offset+3] ]; + return '[' + arr.join(', ') + ']'; +} + +function TestIsUNormColor(refColor, testData, offset) { + if (testData.length < offset + 4) { + ok(false, 'testData not long enough.'); + } + + var refUNormColor = [ + (refColor[0] * 255) | 0, + (refColor[1] * 255) | 0, + (refColor[2] * 255) | 0, + (refColor[3] * 255) | 0, + ]; + + var refStr = ColorToString(refUNormColor); + var testStr = ColorToString(testData, offset); + ok(testStr == refStr, 'Expected ' + refStr + ', was ' + testStr + '.'); +} + +function section(text) { + ok(true, ''); + ok(true, 'Section: ' + text); +} + +function EnsureNoError(gl) { + var glErr = gl.getError(); + while (gl.getError()) {} + + if (!glErr) + return; + + var extraInfo = ''; + + var err = new Error(); + var stackStr = err.stack; + if (stackStr !== undefined) { + var stackArr = stackStr.split('\n'); + stackStr = stackArr[1]; // First one after present scope. + extraInfo = ': ' + stackStr; + } + + ok(false, 'Unexpected GL error: 0x' + glErr.toString(16) + extraInfo); +} + +function TestError(gl, refErrVal, str='') { + if (str == '') { + str = 'gl.getError()'; + } else { + str = str + ': gl.getError()'; + } + + var err = gl.getError(); + while (gl.getError()) {} + + ShouldBe(err.toString(16), refErrVal.toString(16), str); +} + +function ShouldBe(val, ref, str='') { + if (str != '') { + str += ': '; + } + + ok(val == ref, str + 'Should be `' + ref + '`, was `' + val + '`.'); +} + +var gl; + +function Test() { + var canvas = document.createElement('canvas'); + canvas.width = 2; + canvas.height = 2; + canvas.style = 'width: 256px; height: 256px; border: 1px solid black;'; + document.body.appendChild(canvas); + + var attribs = { + antialias: false, + alpha: false, + }; + gl = canvas.getContext('webgl2', attribs); + if (!gl) { + todo(false, 'WebGL 2 not present, skipping.'); + return; + } + + //////// + + TestIsUNormColor(RED, new Uint8Array([255, 0, 0, 255]), 0); + + //////// + + gl.clearColor(RED[0], RED[1], RED[2], RED[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + + var data = new Uint8Array(16); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + console.log(JSON.stringify(data)); + TestIsUNormColor(RED, data, 0); + + //////// + + DrawColors(gl); + + //////// + + EnsureNoError(gl); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0); + TestError(gl, gl.INVALID_OPERATION); + + var data = new Uint8Array(16); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + EnsureNoError(gl); + TestIsUNormColor(RED, data, 0); + TestIsUNormColor(BLUE, data, 4); + TestIsUNormColor(GREEN, data, 8); + TestIsUNormColor(WHITE, data, 12); + + //////// + + var a = gl.createBuffer(); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, a); + EnsureNoError(gl); + + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + TestError(gl, gl.INVALID_OPERATION); + + //////// + + // Basic + section('Basic readback'); + data = ClearBufferPair(gl, 16); + EnsureNoError(gl); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0); + EnsureNoError(gl); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(RED, data, 0); + TestIsUNormColor(BLUE, data, 4); + TestIsUNormColor(GREEN, data, 8); + TestIsUNormColor(WHITE, data, 12); + + section('Subrect readback'); + data = ClearBufferPair(gl, 8); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(WHITE, data, 0); + TestIsUNormColor(ZERO, data, 4); + + section('ReadPixels offset:4'); + data = ClearBufferPair(gl, 16); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 4); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(WHITE, data, 4); + TestIsUNormColor(ZERO, data, 8); + TestIsUNormColor(ZERO, data, 12); + + section('ReadPixels offset:5'); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 5); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(WHITE, data, 4); // Should remain from previous read. + TestIsUNormColor(WHITE, data, 5); + TestIsUNormColor(ZERO, data, 9); + TestIsUNormColor(ZERO, data, 12); + + section('GetBufferSubData src too small'); + data = ClearBufferPair(gl, 16); + EnsureNoError(gl); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data); + TestError(gl, gl.INVALID_VALUE); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(ZERO, data, 4); + TestIsUNormColor(ZERO, data, 8); + TestIsUNormColor(ZERO, data, 12); + + section('GetBufferSubData offset:1'); + data = new Uint8Array(15); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 8); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(ZERO, data, 3); + TestIsUNormColor(WHITE, data, 7); + TestIsUNormColor(ZERO, data, 11); + + ////////////////////////////////////// + + section('Test packing state'); + EnsureNoError(gl); + + function TestPackState(enumStr, initialVal, changedVal) { + var enumVal = gl[enumStr]; + + ShouldBe(gl.getParameter(enumVal), initialVal, 'Initial ' + enumStr); + gl.pixelStorei(enumVal, changedVal); + ShouldBe(gl.getParameter(enumVal), changedVal, 'Changed ' + enumStr); + gl.pixelStorei(enumVal, initialVal); + ShouldBe(gl.getParameter(enumVal), initialVal, 'Reverted ' + enumStr); + EnsureNoError(gl); + } + + TestPackState('PACK_ALIGNMENT', 4, 1); + TestPackState('PACK_ROW_LENGTH', 0, 16); + TestPackState('PACK_SKIP_PIXELS', 0, 3); + TestPackState('PACK_SKIP_ROWS', 0, 3); +} + +function RunTest() { + Test(); + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +try { + var prefArrArr = [ + ['webgl.force-enabled', true], + ['webgl.disable-angle', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, RunTest); +} catch (e) { + todo(false, 'No SpecialPowers, but trying anyway...'); + RunTest(); +} + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_privileged_exts.html b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html new file mode 100644 index 0000000000..37d4b0deb3 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html @@ -0,0 +1,31 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check for privileged ext access.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> + +function TestExt(gl, name) { + var ext = gl.getExtension(name); + ok(!ext, 'Should not have access to \'' + name + '\'.'); +} + +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(gl, 'Get GL working here first.'); + return; + } + + // Privileged extensions: + TestExt(gl, 'MOZ_debug'); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html b/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html new file mode 100644 index 0000000000..d953058181 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_read_pixels_no_format.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +</head> +<body> +<pre id=e_out></pre> +<script> +ok = window.ok || function(e, s) { + e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`; +}; + +// - + +const canvas = document.createElement('canvas') +document.documentElement.appendChild(canvas) +const gl = canvas.getContext('webgl2') +gl.bindBuffer(gl.PIXEL_PACK_BUFFER, gl.createBuffer()) +gl.readPixels(0, 0, 0, 0, gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT), 0, 0); +const err = gl.getError(); +ok(err == gl.INVALID_ENUM, `err: ${err}`); + +ok(true, 'done'); +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_renderer_strings.html b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html new file mode 100644 index 0000000000..cbf0aeac78 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html @@ -0,0 +1,248 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +let gl, ext; + +function getStrings() { + const ret = { + renderer: gl.getParameter(gl.RENDERER), + vendor: gl.getParameter(gl.VENDOR), + }; + if (ext) { + ret.unmasked_renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + ret.unmasked_vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + } + return ret; +} + +const RTX3070_R = 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)'; +const RTX3070_V = 'Google Inc.'; +const RTX3070_R_SANITIZED = 'ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0)'; + +function expectJsonEqual(was, expected, when) { + if (when) { + when = when + ': '; + } else { + when = ''; + } + const wasStr = JSON.stringify(was); + const expectedStr = JSON.stringify(expected); + let str = `${when}Was ${wasStr}`; + const matches = (wasStr == expectedStr); + if (!matches) { + str += `, expected ${expectedStr}`; + } + ok(matches, str); +} + +async function testKnownCiStrings() { + gl = document.createElement('canvas').getContext('webgl'); + if (!gl) return; + + await SpecialPowers.pushPrefEnv({'set': [ + ['webgl.sanitize-unmasked-renderer', false], + ]}); + ext = gl.getExtension('WEBGL_debug_renderer_info'); + const was = getStrings(); + + const KNOWN_ON_CI = { + renderer: [ + 'Adreno (TM) 540', // Android + 'Adreno (TM) 650', // Android pixel5 + 'llvmpipe', // Linux + 'Intel(R) HD Graphics 400', // Mac + 'Apple M1', // Mac + 'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows + ], + vendor: [ + 'Mozilla', + ], + unmasked_renderer: [ + 'Adreno (TM) 540', // Android + 'Adreno (TM) 620', // Android pixel5 + 'llvmpipe (LLVM 10.0.0, 256 bits)', // Linux + 'Intel(R) UHD Graphics 630', // Mac + 'Apple M1', // Mac + 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-23.21.13.9181)', // Windows + 'ANGLE (NVIDIA, NVIDIA Tesla M60 Direct3D11 vs_5_0 ps_5_0, D3D11-30.0.14.7239)', // Windows 11 + ], + unmasked_vendor: [ + 'Qualcomm', // Android + 'VMware, Inc.', // Linux + 'Intel Inc.', // Mac + 'Apple', // Mac + 'Google Inc. (NVIDIA)', // Windows + ], + }; + for (const k in was) { + const wasVal = was[k]; + const knownList = KNOWN_ON_CI[k]; + ok(knownList.includes(wasVal), + `[ignore if not on CI] getParameter(${k}) -> ${wasVal} must be in KNOWN_ON_CI`); + } + await SpecialPowers.popPrefEnv(); +} + +// - + +async function testPrefBehavior() { + const canvas = document.createElement('canvas'); + gl = canvas.getContext('webgl'); + ext = null; + if (!gl) { + todo(gl, 'Get WebGL working here first.'); + return; + } + + // - + // Assuming that we're on CI, test against known-good strings. + // If we add machine configs, we'll need to add to these lists. + // This is to avoid situations like bug 1743734, where ANGLE added + // detailed driver version/date to its RENDERER strings, which + // we want to prevent. + + const KNOWN_CI_VENDORS = [ + 'Mozilla', + ]; + const KNOWN_CI_RENDERERS = [ + 'Adreno (TM) 540', // Android + 'Adreno (TM) 650', // Android + 'Intel(R) HD Graphics 400', // Mac + 'Apple M1', // Mac + 'llvmpipe', // Linux + 'ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0)', // Windows + ]; + function assertKnownValid(key, knownList) { + const val = gl.getParameter(gl[key]); + ok(knownList.includes(val), + `[ignore if not on CI] getParameter(${key}) -> ${val} not known-valid!`); + } + assertKnownValid('VENDOR', KNOWN_CI_VENDORS); + assertKnownValid('RENDERER', KNOWN_CI_RENDERERS); + + // - + + await SpecialPowers.pushPrefEnv({'set': [ + ['webgl.override-unmasked-renderer', RTX3070_R], + ['webgl.override-unmasked-vendor', RTX3070_V], + ]}); + + // - + // Test disabled + + await SpecialPowers.pushPrefEnv({'set': [ + ['webgl.enable-debug-renderer-info', false], + ]}); + + ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(!ext, + 'When pref disabled: Should not have access to \'WEBGL_debug_renderer_info\'.'); + + { + const EXPECTED = { + renderer: RTX3070_R_SANITIZED, + vendor: 'Mozilla', + }; + const was = getStrings(); + expectJsonEqual(was, EXPECTED, 'v92 behavior w/o ext'); + } + + await SpecialPowers.popPrefEnv(); + + // - + // Test RFP + + await SpecialPowers.pushPrefEnv({'set': [ + ['privacy.resistFingerprinting', true], + ]}); + + ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(!ext, + 'With RFP: Should not have access to \'WEBGL_debug_renderer_info\'.'); + + { + const EXPECTED = { + renderer: 'Mozilla', + vendor: 'Mozilla', + }; + const was = getStrings(); + expectJsonEqual(was, EXPECTED, 'RFP behavior'); + } + + await SpecialPowers.popPrefEnv(); + + // - + // Test default state (v92+) + + ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(ext, + 'By default: Should have access to \'WEBGL_debug_renderer_info\'.'); + + { + const EXPECTED = { + renderer: RTX3070_R_SANITIZED, + vendor: 'Mozilla', + unmasked_renderer: RTX3070_R_SANITIZED, + unmasked_vendor: RTX3070_V, + }; + const was = getStrings(); + expectJsonEqual(was, EXPECTED, 'v92 behavior'); + } + + // - + // Test v91 behavior + + await SpecialPowers.pushPrefEnv({'set': [ + ['webgl.enable-renderer-query', false], + ]}); + + { + const EXPECTED = { + renderer: 'Mozilla', + vendor: 'Mozilla', + unmasked_renderer: RTX3070_R_SANITIZED, + unmasked_vendor: RTX3070_V, + }; + const was = getStrings(); + expectJsonEqual(was, EXPECTED, 'v91 behavior'); + } + + // - + // Test v90 behavior + + await SpecialPowers.pushPrefEnv({'set': [ + ['webgl.sanitize-unmasked-renderer', false], + ]}); + + { + const EXPECTED = { + renderer: 'Mozilla', + vendor: 'Mozilla', + unmasked_renderer: RTX3070_R, + unmasked_vendor: RTX3070_V, + }; + const was = getStrings(); + expectJsonEqual(was, EXPECTED, 'v90 behavior'); + } +} + +// - + +SimpleTest.waitForExplicitFinish(); +(async function() { + await testKnownCiStrings(); + await testPrefBehavior(); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html new file mode 100644 index 0000000000..2700ed3007 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html @@ -0,0 +1,190 @@ +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> +<canvas id='c' width='200' height='200'></canvas> +<canvas id='c2' width='200' height='200'></canvas> + +<script> + +function RGBAToString(arr) { + return '[' + arr[0].toPrecision(4) + ', ' + + arr[1].toPrecision(4) + ', ' + + arr[2].toPrecision(4) + ', ' + + arr[3].toPrecision(4) + ']'; +} + +function TestScreenColor(gl, r, g, b, a) { + var arr = new SharedArrayBuffer(4); + var view = new Uint8Array(arr); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, view); + + var err = gl.getError(); + ok(err == 0, 'Should be no errors.'); + if (err) + return; + + var floatArr; + floatArr = new Float32Array(4); + floatArr[0] = view[0] / 255.0; + floatArr[1] = view[1] / 255.0; + floatArr[2] = view[2] / 255.0; + floatArr[3] = view[3] / 255.0; + + var testText = RGBAToString(floatArr); + var refText = RGBAToString([r, g, b, a]); + + var eps = 1.0 / 255.0; + var isSame = (Math.abs(floatArr[0] - r) < eps && + Math.abs(floatArr[1] - g) < eps && + Math.abs(floatArr[2] - b) < eps && + Math.abs(floatArr[3] - a) < eps); + + ok(isSame, 'Should be ' + refText + ', was ' + testText + ','); +} + +// Give ourselves a scope to return early from: +(function() { + var canvas = document.getElementById('c'); + var attribs = { + antialias: false, + depth: false, + }; + let gl = canvas.getContext('experimental-webgl', attribs); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + if (typeof SharedArrayBuffer === 'undefined') { + todo(false, 'SharedArrayBuffer is unavailable.'); + return; + } + + var vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, "attribute vec2 aVertCoord; void main(void) { gl_Position = vec4(aVertCoord, 0.0, 1.0); }"); + gl.compileShader(vs); + var fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, "precision mediump float; uniform vec4 uFragColor; void main(void) { gl_FragColor = uFragColor; }"); + gl.compileShader(fs); + var prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + + var success = gl.getProgramParameter(prog, gl.LINK_STATUS); + if (!success) { + console.log('Error linking program for \'' + vsId + '\' and \'' + fsId + '\'.'); + console.log('\nLink log: ' + gl.getProgramInfoLog(prog)); + console.log('\nVert shader log: ' + gl.getShaderInfoLog(vs)); + console.log('\nFrag shader log: ' + gl.getShaderInfoLog(fs)); + } + ok(prog, 'Program should link.'); + if (!prog) { + return; + } + + prog.aVertCoord = gl.getAttribLocation(prog, 'aVertCoord'); + prog.uFragColor = gl.getUniformLocation(prog, 'uFragColor'); + + gl.useProgram(prog); + + // Test gl.bufferData(), gl.bufferSubData() and gl.readPixels() APIs with SAB as input. + var arr = new SharedArrayBuffer(8*4); + var view = new Float32Array(arr); + view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); + var vb = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vb); + gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW); + ok(gl.getError() == 0, 'bufferData with SAB as input parameter works ok.'); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, view); + ok(gl.getError() == 0, 'bufferSubData with SAB as input parameter works ok.'); + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + gl.clearColor(0, 0, 0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.uniform4f(prog.uFragColor, 0.2, 0.4, 0.6, 1.0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + var arr = new Uint8Array(4); + TestScreenColor(gl, 0.2, 0.4, 0.6, 1.0); + + // Test gl.texImage2D() and gl.texSubImage2D() APIs with SAB as input. + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + var width = 4; + var height = 4; + var numChannels = 4; + var sab = new SharedArrayBuffer(width * height * numChannels); + var data = new Uint8Array(sab); + for (var i = 0; i < data.length; ++i) { + data[i] = i; + } + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texImage2D() with SAB as input parameter works ok.'); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texSubImage2D() with SAB as input parameter works ok.'); + + ok(gl.getError() == 0, 'Should be no errors after test.'); +})(); + +// Test WebGL 2 +(function() { + var canvas = document.getElementById('c2'); + var attribs = { + antialias: false, + depth: false, + }; + let gl = canvas.getContext('webgl2', attribs); + if (!gl) { + todo(false, 'WebGL 2 is unavailable.'); + return; + } + if (typeof SharedArrayBuffer === 'undefined') { + todo(false, 'SharedArrayBuffer is unavailable.'); + return; + } + + var arr = new SharedArrayBuffer(8*4); + var view = new Float32Array(arr); + view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); + var vb = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vb); + gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW); + + var arr2 = new SharedArrayBuffer(8*4); + var view2 = new Float32Array(arr2); + gl.getBufferSubData(gl.ARRAY_BUFFER, 0, view2); + var equal = true; + for(var i = 0; i < 8; ++i) { + if (view[i] != view2[i]) equal = false; + } + ok(equal, 'getBufferSubData with SAB as input parameter works ok.'); + + // Test gl.texImage3D() and gl.texSubImage3D() APIs with SAB as input. + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_3D, tex); + var width = 4; + var height = 4; + var depth = 4; + var numChannels = 4; + var sab = new SharedArrayBuffer(width * height * depth* numChannels); + var data = new Uint8Array(sab); + for (var i = 0; i < data.length; ++i) { + data[i] = i; + } + gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, width, height, depth, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texImage3D() with SAB as input parameter works ok.'); + gl.texSubImage3D(gl.TEXTURE_3D, 0, 0, 0, 0, width, height, depth, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texSubImage3D() with SAB as input parameter works ok.'); + + ok(gl.getError() == 0, 'Should be no errors after test.'); +})(); + +ok(true, 'TEST COMPLETE'); + +</script> + + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html b/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html new file mode 100644 index 0000000000..c2fd554843 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_tex_large_uploads.html @@ -0,0 +1,94 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> + <img id='e_blank_15000x10000' src='blank_15000x10000.png'> + <script> + +function shouldBe(testStr, refStr) { + ok(testStr == refStr, 'Expected "' + refStr + '", was "' + testStr + '".'); +} + +function getErrorStr(gl, err) { + if (!err) return "NO_ERROR"; + for (const k in gl) { + const v = gl[k]; + if (v == err) { + return k; + } + } + return `<${err}>`; +} + +function glErrorShouldBe(gl, expected, opt_info) { + if (opt_info) { + opt_info = opt_info + ': ' + } else { + opt_info = ''; + } + + if (!expected.length) { + expected = [expected]; + } + expected = expected.map(x => getErrorStr(gl, x)); + let was = gl.getError(); + was = getErrorStr(gl, was); + ok(expected.includes(was), + `${opt_info}Expected gl.getError() in [${expected}], was ${was}.`); +} +SimpleTest.waitForExplicitFinish(); +(async () => { + const gl = document.createElement('canvas').getContext('webgl2'); + window.gl = gl; + if (!gl) { + todo(false, 'No webgl2, skipping...'); + return; + } + const tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + + const TESTS = [ + //{w: 16000, h: 8000}, // TODO: This asserts. + //{w: 8000, h: 16000}, // TODO: This asserts. + {w: 8000, h: 4000}, + {w: 4000, h: 8000}, + {w: 4000, h: 4000}, + ]; + const src = document.createElement('canvas').getContext('webgl', + {antialias:false, depth:false}); + const maxTexSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + for (const t of TESTS) { + ok(true, 'canvas: ' + JSON.stringify(t)); + if (t.w > maxTexSize || t.h > maxTexSize) { + ok(true, `Larger than MAX_TEXTURE_SIZE of ${maxTexSize}`); + continue; + } + src.canvas.width = t.w; + src.canvas.height = t.h; + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, + src.canvas); + + glErrorShouldBe(gl, [0, gl.OUT_OF_MEMORY], `after texImage(${JSON.stringify(t)})`); + + src.canvas.width = src.canvas.height = 1; + } + + if (15000 > maxTexSize) { + ok(true, `e_blank_15000x10000 larger than MAX_TEXTURE_SIZE of ${maxTexSize}, skipping.`); + } else { + await e_blank_15000x10000.decode(); // Otherwise it will not have loaded yet. + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, + e_blank_15000x10000); + glErrorShouldBe(gl, [0, gl.OUT_OF_MEMORY], `after texImage(e_blank_15000x10000)`); + ok(!gl.isContextLost(), '!gl.isContextLost()'); + } + + SimpleTest.finish(); +})(); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_tex_pbo.html b/dom/canvas/test/webgl-mochitest/test_tex_pbo.html new file mode 100644 index 0000000000..f64d52bd41 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_tex_pbo.html @@ -0,0 +1,100 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> + <script> + +function shouldBe(testStr, refStr) { + ok(testStr == refStr, 'Expected "' + refStr + '", was "' + testStr + '".'); +} + +function getErrorStr(gl, err) { + if (!err) return "NO_ERROR"; + for (const k in gl) { + const v = gl[k]; + if (v == err) { + return k; + } + } + return `<${err}>`; +} + +function glErrorShouldBe(gl, expected, opt_info) { + if (opt_info) { + opt_info = opt_info + ': ' + } else { + opt_info = ''; + } + + if (!expected.length) { + expected = [expected]; + } + expected = expected.map(x => getErrorStr(gl, x)); + let was = gl.getError(); + was = getErrorStr(gl, was); + console.log(expected); + ok(expected.includes(was), + `${opt_info}Expected gl.getError() in [${expected}], was ${was}.`); +} + +(() => { + const gl = document.createElement('canvas').getContext('webgl2'); + if (!gl) { + todo(false, 'No webgl2, skipping...'); + return; + } + const pbo = gl.createBuffer(); + gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, pbo); + + const PBO_DATA = new Uint8Array([ + 255, 0, 0, 255, + 0, 255, 0, 255, + ]); + gl.bufferData(gl.PIXEL_UNPACK_BUFFER, PBO_DATA, gl.STATIC_DRAW); + + const tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + + const readback = new Uint8Array(4); + + const PBO_LIST = [null, pbo]; + for (const cur of PBO_LIST) { + gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, cur); + + function tryUpload(arg, expectedReadback) { + let argType = typeof(arg); + if (arg === null) { + argType = 'null'; + } + const argForPbo = (argType == 'number'); + const pboBound = !!cur; + const expectedErr = (argForPbo == pboBound) ? 0 : gl.INVALID_OPERATION; + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, + arg); + const with_without = pboBound ? 'with' : 'without'; + glErrorShouldBe(gl, expectedErr, `${with_without} pbo, texImage(..., ${argType}("${arg}"))`); + + if (expectedErr) return; + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, readback); + shouldBe(expectedReadback.toString(), readback.toString()); + } + + const CPU_DATA = new Uint8Array([255, 255, 0, 255]); + + tryUpload(null, [0,0,0,0]); + tryUpload(CPU_DATA, CPU_DATA); + tryUpload(0, PBO_DATA.slice(0,4)); + tryUpload(4, PBO_DATA.slice(4)); + } +})(); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html b/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html new file mode 100644 index 0000000000..3664f40ff7 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_tex_unit_different_sampler_types.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +</head> +<body> +<pre id=e_out></pre> +<script> + +ok = window.ok || function(e, s) { + e_out.textContent += `\n${!e ? 'FAIL' : 'pass'}: ${s}`; +}; + +const canvas = document.createElement('canvas'); +const gl = canvas.getContext('webgl'); +const program = gl.createProgram(); +const vertex = gl.createShader(gl.VERTEX_SHADER); + +gl.shaderSource(vertex, `\ + precision highp float; + varying vec2 v_vec2; + varying vec3 v_vec3; + void main() { } +`); +gl.compileShader(vertex); +gl.attachShader(program, vertex); + +const fragment = gl.createShader(gl.FRAGMENT_SHADER); +gl.shaderSource(fragment, `\ + precision highp float; + varying vec2 v_vec2; + varying vec3 v_vec3; + uniform sampler2D u_sampler2d; + uniform samplerCube u_samplercube; + void main() { + gl_FragColor = texture2D(u_sampler2d, v_vec2); + gl_FragColor += textureCube(u_samplercube, normalize(v_vec3)); + } +`); +gl.compileShader(fragment); +gl.attachShader(program, fragment); + +gl.linkProgram(program); +gl.useProgram(program); +gl.drawArrays(gl.TRIANGLE_STRIP, 29, 32); +let err = gl.getError(); +ok(err == gl.INVALID_OPERATION, `err: ${err}`); + +ok(true, `Done.`); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html new file mode 100644 index 0000000000..991066e41b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html @@ -0,0 +1,56 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 1003607</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + if (!gl.getExtension('OES_texture_float')) { + todo(false, 'Not having this extension is fine.'); + return; + } + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + checkGLError(ok, 'texture parameter setup should succeed', gl.NO_ERROR); + + // Generate data + var width = 2; + var height = 2; + var numChannels = 4; + var data = new Float32Array(width * height * numChannels); + for (var ii = 0; ii < data.length; ++ii) { + data[ii] = 10000; + } + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, data); + checkGLError(ok, 'floating-point texture allocation should succeed', gl.NO_ERROR); + + // Try respecifying data + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.FLOAT, data); + checkGLError(ok, 'floating-point texture sub image should succeed', gl.NO_ERROR); +})(); + +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_uninit_data.html b/dom/canvas/test/webgl-mochitest/test_uninit_data.html new file mode 100644 index 0000000000..541cfdbe51 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_uninit_data.html @@ -0,0 +1,84 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta http-equiv='content-type' content='text/html; charset=utf-8'/> + + <title>Test contents of uninitialized buffers</title> + + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> + +<body> +<script> +'use strict'; + +function TestFB(gl) { + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + ok(status == gl.FRAMEBUFFER_COMPLETE, 'FB should be complete.'); + + var pixel = new Uint8Array(4); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + ok(!pixel[0], 'R channel should be 0, was ' + pixel[0] + '.'); + ok(!pixel[1], 'G channel should be 0, was ' + pixel[1] + '.'); + ok(!pixel[2], 'B channel should be 0, was ' + pixel[2] + '.'); + ok(!pixel[3], 'A channel should be 0, was ' + pixel[3] + '.'); +} + +function Test(contextAttribs) { + ok(true, '==============================='); + ok(true, 'Testing ' + JSON.stringify(contextAttribs)); + + var c = document.createElement('canvas'); + var gl = c.getContext('webgl', contextAttribs); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + + var err = gl.getError(); + ok(!err, 'Error should be 0x0, was 0x' + err.toString(16)); + if (err) + return; + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + + ok(true, 'Backed with RB'); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1); + TestFB(gl); + + ok(true, 'Backed with texture'); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + TestFB(gl); + + err = gl.getError(); + ok(!err, 'Error should be 0x0, was 0x' + err.toString(16)); +} + +// Give ourselves a scope to return early from: +(function() { + // We test multiple configurations because we've had bugs regarding faking RGBX on + // ANGLE: With alpha:false, uninitialized buffers were being filled with (0,0,0,1) + // instead of (0,0,0,0). + Test({alpha: false, antialias: false}); + Test({alpha: true, antialias: false}); + Test({alpha: false, antialias: true}); + Test({alpha: true, antialias: true}); + + ok(true, 'Test complete.'); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html b/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html new file mode 100644 index 0000000000..e845b4a594 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_vertexattrib4f_update.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset='utf-8'> + <title>Bug 1426289 - vertexAttrib4f should actually update.</title> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> + </head> + <body> + <script id='eVertSource' type='none'> +attribute vec4 aColor; +varying vec4 vColor; + +void main() { + gl_PointSize = 64.0; + gl_Position = vec4(vec3(0.0), 1.0); + vColor = aColor; +} + </script> + <script id='eFragSource' type='none'> +precision mediump float; +varying vec4 vColor; + +void main() { + gl_FragColor = vColor; +} + </script> + <script> +const canvas = document.createElement('canvas'); +canvas.width = 1; +canvas.height = 1; +const gl = canvas.getContext('webgl'); + +const prog = WebGLUtil.linkProgramByIds(gl, eVertSource, eFragSource); +gl.useProgram(prog); + +function getRgb() { + const data = new Uint32Array(1); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(data.buffer)); + return data[0] & 0xffffff; +} + +gl.clearColor(0.0, 0.0, 0.0, 1.0); +gl.clear(gl.COLOR_BUFFER_BIT); +let was = getRgb(); +ok(was == 0x000000, '0x'+was.toString(16)); + +gl.disableVertexAttribArray(prog.aColor); + +gl.vertexAttrib4f(prog.aColor, 1, 0, 0, 1); +gl.drawArrays(gl.POINTS, 0, 1); +was = getRgb(); +ok(was == 0x0000ff, '0x'+was.toString(16)); + +gl.vertexAttrib4f(prog.aColor, 0, 1, 0, 1); +gl.drawArrays(gl.POINTS, 0, 1); +was = getRgb(); +ok(was == 0x00ff00, '0x'+was.toString(16)); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath.js b/dom/canvas/test/webgl-mochitest/test_video_fastpath.js new file mode 100644 index 0000000000..1c204237a7 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath.js @@ -0,0 +1,34 @@ +var gl; +var video; + +function onPlayingTestVideo() { + video.removeEventListener("playing", onPlayingTestVideo, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video); + is( + gl.getError(), + gl.NO_ERROR, + "texImage2D should not generate any error here." + ); + video.pause(); + SimpleTest.finish(); +} + +function startTest(file) { + gl = document.createElement("canvas").getContext("webgl"); + ext = gl.getExtension("MOZ_debug"); + ok(ext, "MOZ_debug extenstion should exist"); + gl.bindTexture(gl.TEXTURE_2D, gl.createTexture()); + gl.pixelStorei(ext.UNPACK_REQUIRE_FASTPATH, true); + is( + gl.getError(), + gl.NO_ERROR, + "pixelStorei should not generate any error here." + ); + + video = document.createElement("video"); + video.addEventListener("playing", onPlayingTestVideo, true); + video.preload = "auto"; + video.src = file; + video.loop = true; + video.play(); +} diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html new file mode 100644 index 0000000000..194e9b29ea --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_mp4.html @@ -0,0 +1,21 @@ +<html> + <head> + <meta name="timeout" content="long"/> + <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/> + <title>Video Fastpath upload test</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="test_video_fastpath.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + + function runTest() { + startTest("red-green.mp4"); + } + + SimpleTest.waitForExplicitFinish(); + SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html new file mode 100644 index 0000000000..4f4fbab88b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_theora.html @@ -0,0 +1,21 @@ +<html> + <head> + <meta name="timeout" content="long"/> + <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/> + <title>Video Fastpath upload test</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="test_video_fastpath.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + + function runTest() { + startTest("red-green.theora.ogv"); + } + + SimpleTest.waitForExplicitFinish(); + SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html new file mode 100644 index 0000000000..e87f6c6484 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp8.html @@ -0,0 +1,21 @@ +<html> + <head> + <meta name="timeout" content="long"/> + <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/> + <title>Video Fastpath upload test</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="test_video_fastpath.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + + function runTest() { + startTest("red-green.webmvp8.webm"); + } + + SimpleTest.waitForExplicitFinish(); + SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html new file mode 100644 index 0000000000..fd4a4332d0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_video_fastpath_vp9.html @@ -0,0 +1,21 @@ +<html> + <head> + <meta name="timeout" content="long"/> + <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/> + <title>Video Fastpath upload test</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="test_video_fastpath.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + + function runTest() { + startTest("red-green.webmvp9.webm"); + } + + SimpleTest.waitForExplicitFinish(); + SpecialPowers.pushPrefEnv({"set" : [["webgl.enable-privileged-extensions", true]]}, runTest); + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html new file mode 100644 index 0000000000..3ec6c1909e --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html @@ -0,0 +1,114 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>WebGL2 test: Alpha and Luminance Textures</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs" type="x-shader/x-vertex" +>#version 300 es + +in vec2 aTexCoord; +out vec2 vTexCoord; + +void main() { + vec2 pos = vec2(2.0)*aTexCoord - vec2(1.0); + gl_Position = vec4(pos, 0.0, 1.0); + vTexCoord = aTexCoord; +} +</script> +<script id="fs" type="x-shader/x-fragment" +>#version 300 es +precision mediump float; + +in vec2 vTexCoord; +uniform sampler2D uTex; +out vec4 oFragColor; + +void main() { + oFragColor = texture(uTex, vTexCoord); +} +</script> +<body> +<canvas id="c" width="32" height="32"></canvas> +<script> + WebGLUtil.withWebGL2('c', function(gl) { + + function testPixel(x, y, refData, infoPrefix) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + var pixelMatches = (pixel[0] == refData[0] && + pixel[1] == refData[1] && + pixel[2] == refData[2] && + pixel[3] == refData[3]); + var expectedStr = '[' + refData.join(', ') + ']'; + var actualStr = '[' + pixel.join(', ') + ']'; + + if (pixelMatches) { + ok(true, infoPrefix + 'Expected ' + expectedStr + '.'); + } else { + ok(false, infoPrefix + 'Expected ' + expectedStr + ', was ' + actualStr + '.'); + } + } + + function testTexture(details, prog) { + prog.aTexCoord = gl.getAttribLocation(prog, "aTexCoord"); + ok(prog.aTexCoord >= 0, '`aTexCoord` should be valid.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, details.format, 1, 1, 0, + details.format, gl.UNSIGNED_BYTE, details.texData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + gl.useProgram(prog); + gl.vertexAttribPointer(prog.aTexCoord, 2, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(prog.aTexCoord); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + testPixel(0, 0, details.result, details.info + ': '); + return true; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return false; + } + + gl.disable(gl.DEPTH_TEST); + + var vertData = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertData); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0, 0, 1, 0, 0, 1, 1, 1 ]), gl.STATIC_DRAW); + + gl.clearColor(0, 0, 1, 1); + gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); + + var details = [ + { info: 'Luminance8', format: gl.LUMINANCE, texData: new Uint8Array([ 128 ]), + result: [128, 128, 128, 255] }, + { info: 'Alpha8', format: gl.ALPHA, texData: new Uint8Array([ 128 ]), + result: [0, 0, 0, 128] }, + { info: 'Luminance8Alpha8', format: gl.LUMINANCE_ALPHA, texData: new Uint8Array([ 128, 128 ]), + result: [128, 128, 128, 128] }, + ]; + + for (var i = 0; i < details.length; i++) { + if (!testTexture(details[i], prog)) { + return; + } + } + ok(true, 'Test complete.'); + }, function() { + SimpleTest.finish(); + }); + + SimpleTest.waitForExplicitFinish(); +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html new file mode 100644 index 0000000000..6a384e1b9d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html @@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL2 test: Framebuffers</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +WebGLUtil.withWebGL2('c', function (gl) { + gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR]); + ok(gl.getError() == 0, 'invalidateFramebuffer'); + gl.invalidateSubFramebuffer(gl.FRAMEBUFFER, [gl.COLOR], 0, 0, 64, 64); + ok(gl.getError() == 0, 'invalidateSubFramebuffer'); + gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.GL_COLOR_ATTACHMENT0]); + ok(gl.getError() == gl.INVALID_ENUM, 'invalidateFrameBuffer should fail with GL_COLOR_ATTACHMENT on the default framebuffer'); +}, function () { + SimpleTest.finish(); +}); + +SimpleTest.waitForExplicitFinish(); + +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html new file mode 100644 index 0000000000..d8d2f54c0d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html @@ -0,0 +1,37 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: WebGL2RenderingContext only exposed when appropriate</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> + +function ShouldExpose() { + try { + return SpecialPowers.getBoolPref('webgl.enable-webgl2'); + } catch (e) {} + + return false; +} + +function DoesExpose() { + try { + null instanceof WebGL2RenderingContext; + return true; + } catch (e) {} + + return false; +} + +var doesExpose = DoesExpose(); +if (ShouldExpose()) { + ok(doesExpose, 'WebGL2RenderingContext should be exposed.'); +} else { + ok(!doesExpose, 'WebGL2RenderingContext should not be exposed.'); +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html b/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html new file mode 100644 index 0000000000..3e9ad9832a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_uniform_block.html @@ -0,0 +1,86 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>WebGL2 test: using uniform blocks</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script id='vertSource' type='none'> +#version 300 es +uniform UniformBlock +{ + vec3 color; + vec3 offset; +}; +in vec2 POSITION; +out vec3 outCOLOR0; + +void main() { + gl_Position = vec4(POSITION, 0.0, 1.0); + outCOLOR0 = vec3(color.x + offset.x, color.y + offset.y, + color.z + offset.z); +} +</script> +<script id='fragSource' type='none'> +#version 300 es +precision mediump float; +in vec3 outCOLOR0; +out vec4 oFragColor; + +void main() { + oFragColor = vec4(outCOLOR0, 1.0); +} +</script> +<body> +<canvas id="c" width="32" height="32"></canvas> +<script> + WebGLUtil.withWebGL2('c', function(gl) { + const vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, vertSource.innerHTML.trim()); + gl.compileShader(vs); + const fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, fragSource.innerHTML.trim()); + gl.compileShader(fs); + const prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + gl.useProgram(prog); + gl.detachShader(prog, vs); + gl.detachShader(prog, fs); + + gl.disable(gl.DEPTH_TEST); + var vertData = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertData); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-0.5, -0.5, + 0.5, -0.5, + 0.0, 0.5]), gl.STATIC_DRAW); + + gl.clearColor(0, 1, 0, 1); + + prog.POSITION = gl.getAttribLocation(prog, "POSITION"); + ok(prog.POSITION >= 0, '`POSITION` should be valid.'); + prog.blockIndex = gl.getUniformBlockIndex(prog, "UniformBlock"); + ok(prog.blockIndex >= 0, '`UniformBlock` index should be valid.'); + prog.blockSize = gl.getActiveUniformBlockParameter(prog, + prog.blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE); + ok(prog.blockSize >= 0, '`UniformBlock` size should be valid.'); + + var uboArray = new ArrayBuffer(prog.blockSize); + var uboFloat = new Float32Array(uboArray); + uboFloat.set([0.5, 0.2, 0.3, 0.3, 0.2, 0.1], 0); + var uniformBuffer = gl.createBuffer(); + gl.uniformBlockBinding(prog, prog.blockIndex, 1); + gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer); + gl.bufferData(gl.UNIFORM_BUFFER, uboFloat, gl.DYNAMIC_DRAW); + gl.bindBufferBase(gl.UNIFORM_BUFFER, 1, uniformBuffer); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + + ok(true, 'Test complete.'); + }, function() { + SimpleTest.finish(); + }); + + SimpleTest.waitForExplicitFinish(); +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_available.html b/dom/canvas/test/webgl-mochitest/test_webgl_available.html new file mode 100644 index 0000000000..f6817c9858 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_available.html @@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <title>WebGL test: Check that WebGL works out-of-the-box.</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + +'use strict'; +var c = document.createElement('canvas'); +var gl = c.getContext('experimental-webgl'); +ok(gl, 'Expected WebGL creation to succeed.'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html new file mode 100644 index 0000000000..d40bd1dc7f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html @@ -0,0 +1,751 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="es3-data.js"></script> +<title>WebGL test: test WEBGL_compressed_texture_etc extension</title> +<style> +img { + border: 1px solid black; + margin-right: 1em; +} +.testimages { +} + +.testimages br { + clear: both; +} + +.testimages > div { + float: left; + margin: 1em; +} +</style> +</head> +<body> +<div id="description"></div> +<canvas id="canvas" width="8" height="8"></canvas> +<div id="console"></div> +<script id="vshader" type="x-shader/x-vertex"> + attribute vec4 vPosition; + attribute vec2 texCoord0; + varying vec2 texCoord; + void main() { + gl_Position = vPosition; + texCoord = texCoord0; + } +</script> +<script id="fshader" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + gl_FragData[0] = texture2D(tex, texCoord); + } +</script> +<script id="fshader-r" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + vec4 pixel = (texture2D(tex, texCoord)); + pixel.r = (pixel.r + 1.0) / 2.0; + gl_FragData[0] = pixel; + } +</script> +<script id="fshader-rg" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + vec4 pixel = (texture2D(tex, texCoord)); + pixel.rg = (pixel.rg + 1.0) / 2.0; + gl_FragData[0] = pixel; + } +</script> +<script> +"use strict"; +var ext = null; +var vao = null; +var gl = null; +var validFormats = { + COMPRESSED_R11_EAC : 0x9270, + COMPRESSED_SIGNED_R11_EAC : 0x9271, + COMPRESSED_RG11_EAC : 0x9272, + COMPRESSED_SIGNED_RG11_EAC : 0x9273, + COMPRESSED_RGB8_ETC2 : 0x9274, + COMPRESSED_SRGB8_ETC2 : 0x9275, + COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9276, + COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9277, + COMPRESSED_RGBA8_ETC2_EAC : 0x9278, + COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : 0x9279, +}; + +function setupUnitQuad() { + var vertexObject = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 1.0, 1.0, 0.0, + -1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + 1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + 1.0, -1.0, 0.0]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); + + var vertexObject = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 1.0, 1.0, + 0.0, 1.0, + 0.0, 0.0, + 1.0, 1.0, + 0.0, 0.0, + 1.0, 0.0]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(1); + gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0); +} + +function runTest() { + gl = canvas.getContext('webgl', {antialias: false}); + if (!gl) { + ok(false, "WebGL context does not exist"); + } else { + ok(true, "WebGL context exists"); + setupUnitQuad(); + + // Run tests with extension disabled + runTestDisabled(); + + // Query the extension and store globally so shouldBe can access it + ext = gl.getExtension("WEBGL_compressed_texture_etc"); + if (!ext) { + ok(true, "No WEBGL_compressed_texture_etc support -- this is legal"); + runSupportedTest(false); + } else { + ok(true, "Successfully enabled WEBGL_compressed_texture_etc extension"); + + runSupportedTest(true); + runTestExtension(); + } + } + SimpleTest.finish(); +} + +function runSupportedTest(extensionEnabled) { + var supported = gl.getSupportedExtensions(); + if (supported.includes("WEBGL_compressed_texture_etc")) { + if (extensionEnabled) { + ok(true, "WEBGL_compressed_texture_etc listed as supported and getExtension succeeded"); + } else { + ok(false, "WEBGL_compressed_texture_etc listed as supported but getExtension failed"); + } + } else { + if (extensionEnabled) { + ok(false, "WEBGL_compressed_texture_etc not listed as supported but getExtension succeeded"); + } else { + ok(true, "WEBGL_compressed_texture_etc not listed as supported and getExtension failed -- this is legal"); + } + } +} + +function runTestDisabled() { + is(gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS).length, 0, + "Should be no compressed texture formats"); +} + +function formatExists(format, supportedFormats) { + for (var ii = 0; ii < supportedFormats.length; ++ii) { + if (format == supportedFormats[ii]) { + ok(true, "supported format " + formatToString(format) + " is exists"); + return; + } + } + ok(false, "supported format " + formatToString(format) + " does not exist"); +} + +function formatToString(format) { + for (var p in ext) { + if (ext[p] == format) { + return p; + } + } + return "0x" + format.toString(16); +} + +function runTestExtension() { + // check that all format enums exist. + for (let name in validFormats) { + is(ext[name], validFormats[name], "format is match"); + } + + let supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS); + // There should be exactly 10 formats + is(supportedFormats.length, 10, "Should be exactly 10 formats"); + + // check that all 10 formats exist + for (let name in validFormats.length) { + formatExists(validFormats[name], supportedFormats); + } + + // Test each format + testETC2_RGB(); +} + +function testETC2_RGB() { + var tests = [ + { + width: 4, + height: 4, + channels: 1, + data: img_4x4_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 4, + height: 4, + channels: 1, + data: img_4x4_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 4, + height: 4, + channels: 2, + data: img_4x4_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 4, + height: 4, + channels: 2, + data: img_4x4_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 4, + height: 4, + channels: 3, + data: img_4x4_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 4, + height: 4, + channels: 3, + data: img_4x4_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + { + width: 8, + height: 8, + channels: 1, + data: img_8x8_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 8, + height: 8, + channels: 1, + data: img_8x8_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 8, + height: 8, + channels: 2, + data: img_8x8_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 8, + height: 8, + channels: 2, + data: img_8x8_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 8, + height: 8, + channels: 3, + data: img_8x8_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 8, + height: 8, + channels: 3, + data: img_8x8_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + { + width: 32, + height: 32, + channels: 1, + data: img_32x32_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 32, + height: 32, + channels: 1, + data: img_32x32_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 32, + height: 32, + channels: 2, + data: img_32x32_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 32, + height: 32, + channels: 2, + data: img_32x32_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 32, + height: 32, + channels: 3, + data: img_32x32_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 32, + height: 32, + channels: 3, + data: img_32x32_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + ]; + testETCTextures(tests); +} + +function testETCTextures(tests) { + for (var ii = 0; ii < tests.length; ++ii) { + testETCTexture(tests[ii]); + } +} + +/* Return the size of block in bytes */ +function getBlockSize(format) { + switch (format) { + case ext.COMPRESSED_R11_EAC: + case ext.COMPRESSED_SIGNED_R11_EAC: + case ext.COMPRESSED_RGB8_ETC2: + case ext.COMPRESSED_SRGB8_ETC2: + case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + return 8; + case ext.COMPRESSED_RG11_EAC: + case ext.COMPRESSED_SIGNED_RG11_EAC: + case ext.COMPRESSED_RGBA8_ETC2_EAC: + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + return 16 + } +} + +function copyRect(data, srcX, srcY, dstX, dstY, width, height, stride) { + var bytesPerLine = width * 4; + var srcOffset = srcX * 4 + srcY * stride; + var dstOffset = dstX * 4 + dstY * stride; + for (var jj = height; jj > 0; --jj) { + for (var ii = 0; ii < bytesPerLine; ++ii) { + data[dstOffset + ii] = data[srcOffset + ii]; + } + srcOffset += stride; + dstOffset += stride; + } +} + +function testETCTexture(test) { + var data = new Uint8Array(test.data.compressed); + var width = test.width; + var height = test.height; + var format = test.format; + + var uncompressedData = new Uint8Array(test.data.decompressed); + var glErrorShouldBe = (glInner, glError, msg) => { + msg = msg || ""; + var err = glInner.getError(); + var getGLErrorAsString = error => { + if (error === glInner.NO_ERROR) { + return "NO_ERROR"; + } + for (let name in glInner) { + if (glInner[name] === error) { + return name; + } + } + return error.toString(); + } + + if (err != glError) { + ok(false, "getError expected: " + getGLErrorAsString(glError) + + ". Was " + getGLErrorAsString(err) + " : " + msg); + } else { + ok(true, "getError was expected value: " + + getGLErrorAsString(glError) + " : " + msg); + } + }; + + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, width, height); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.generateMipmap(gl.TEXTURE_2D); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "trying to generate mipmaps from compressed texture"); + if (format == ext.COMPRESSED_SIGNED_R11_EAC) { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-r'); + } else if (format == ext.COMPRESSED_SIGNED_RG11_EAC) { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-rg'); + } else { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader'); + } + gl.bindAttribLocation(program, 0, 'vPosition'); + gl.bindAttribLocation(program, 1, 'texCoord0'); + gl.useProgram(program); + + gl.clearColor(1.0, 1.0, 1.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLES, 0, 6); + compareRect(width, height, test.channels, width, height, uncompressedData, data, format); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 1, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "non 0 border"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width + 4, height, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height + 4, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 4, height, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 4, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 1, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 2, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 1, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 2, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + + if (width == 4) { + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 1, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 2, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + } + if (height == 4) { + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 1, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 2, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + } + + // pick a wrong format that uses the same amount of data. + var wrongFormat; + switch (format) { + case ext.COMPRESSED_R11_EAC: + wrongFormat = ext.COMPRESSED_SIGNED_R11_EAC; + break; + case ext.COMPRESSED_SIGNED_R11_EAC: + wrongFormat = ext.COMPRESSED_R11_EAC; + break; + case ext.COMPRESSED_RG11_EAC: + wrongFormat = ext.COMPRESSED_SIGNED_RG11_EAC; + break; + case ext.COMPRESSED_SIGNED_RG11_EAC: + wrongFormat = ext.COMPRESSED_RG11_EAC; + break; + case ext.COMPRESSED_RGB8_ETC2: + wrongFormat = ext.COMPRESSED_SRGB8_ETC2; + break; + case ext.COMPRESSED_SRGB8_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_RGBA8_ETC2_EAC: + wrongFormat = ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; + break; + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + wrongFormat = ext.COMPRESSED_RGBA8_ETC2_EAC; + break; + } + + // Restore original texture. + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, wrongFormat, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "format does not match"); + + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width + 4, height, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height + 4, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 4, height, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 4, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 1, height, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 2, height, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 1, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 2, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + + var subData = new Uint8Array(data.buffer, 0, getBlockSize(format)); + + if (width == 8 && height == 8) { + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 1, 0, 4, 4, format, subData); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 1, 4, 4, format, subData); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset"); + } + + if (width < 32 && height < 32) { + var stride = width * 4; + for (var yoff = 0; yoff < height; yoff += 4) { + for (var xoff = 0; xoff < width; xoff += 4) { + copyRect(uncompressedData, 0, 0, xoff, yoff, 4, 4, stride); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, xoff, yoff, 4, 4, format, subData); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.clearColor(1.0, 1.0, 1.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLES, 0, 6); + compareRect(width, height, test.channels, width, height, uncompressedData, data, format); + } + } + } +} + +function insertImg(element, caption, img) { + var div = document.createElement("div"); + div.appendChild(img); + var label = document.createElement("div"); + label.appendChild(document.createTextNode(caption)); + div.appendChild(label); + element.appendChild(div); +} + +function convertToSRGB(val) { + var norm = val / 255.0; + var res = 0; + if (norm <= 0.04045) { + res = norm / 12.92; + } else { + res = Math.pow(((norm + 0.055)/1.055), 2.4); + } + + return res * 255.0; +} + +function makeImage(imageWidth, imageHeight, dataWidth, data, alpha) { + var scale = 8; + var c = document.createElement("canvas"); + c.width = imageWidth * scale; + c.height = imageHeight * scale; + var ctx = c.getContext("2d"); + for (var yy = 0; yy < imageHeight; ++yy) { + for (var xx = 0; xx < imageWidth; ++xx) { + var offset = (yy * dataWidth + xx) * 4; + ctx.fillStyle = "rgba(" + + data[offset + 0] + "," + + data[offset + 1] + "," + + data[offset + 2] + "," + + (alpha ? data[offset + 3] / 255 : 1) + ")"; + ctx.fillRect(xx * scale, yy * scale, scale, scale); + } + } + var img = document.createElement("img"); + img.src = c.toDataURL(); + return img; +} + +function compareRect(actualWidth, actualHeight, actualChannels, + dataWidth, dataHeight, expectedData, + testData, testFormat) +{ + var actual = new Uint8Array(actualWidth * actualHeight * 4); + gl.readPixels( + 0, 0, actualWidth, actualHeight, gl.RGBA, gl.UNSIGNED_BYTE, actual); + + var div = document.createElement("div"); + div.className = "testimages"; + var hasAlpha = actualChannels == 4; + var imgExpected = makeImage(actualWidth, actualHeight, dataWidth, expectedData, hasAlpha); + var imgActual = makeImage(actualWidth, actualHeight, actualWidth, actual, hasAlpha); + insertImg(div, "expected", imgExpected); + insertImg(div, "actual", imgActual); + div.appendChild(document.createElement('br')); + document.getElementById("console").appendChild(div); + + var failed = false; + for (var yy = 0; yy < actualHeight; ++yy) { + for (var xx = 0; xx < actualWidth; ++xx) { + var actualOffset = (yy * actualWidth + xx) * 4; + var expectedOffset = (yy * dataWidth + xx) * 4; + var expected = expectedData.slice(expectedOffset, expectedOffset + 4); + + var maxDiffPixel = 0; + switch (testFormat) { + case ext.COMPRESSED_SRGB8_ETC2: + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + + // Alpha shouldn't do conversion. + for (var i = 0; i < 3; ++i) { + expected[i] = convertToSRGB(expected[i]); + } + //fallthrough + case ext.COMPRESSED_R11_EAC: + case ext.COMPRESSED_RG11_EAC: + case ext.COMPRESSED_SIGNED_R11_EAC: + case ext.COMPRESSED_SIGNED_RG11_EAC: + // Due to floating round error, we need fuzzy test here. + var maxDiffPixel = 1; + break; + default: + var maxDiffPixel = 0; + break; + } + + for (var channel = 0; channel < actualChannels; ++channel) { + var diff = Math.abs(expected[channel] - actual[actualOffset + channel]); + + if (diff > maxDiffPixel) { + failed = true; + var was = actual.slice(actualOffset, actualOffset + 4).join(); + ok(false, 'at (' + xx + ', ' + yy + + ') expected: ' + expected.join() + ' was ' + was); + break; + } + } + } + } + if (!failed) { + ok(true, "texture rendered correctly"); + } +} + +var prefArrArr = [ + ['webgl.enable-draft-extensions', true], +]; +var prefEnv = {'set': prefArrArr}; +SimpleTest.waitForExplicitFinish(); +SpecialPowers.pushPrefEnv(prefEnv, runTest); +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html b/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html new file mode 100644 index 0000000000..99f81cb7e1 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_fingerprinting_resistance.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<script> +/* global SimpleTest SpecialPowers */ +SimpleTest.waitForExplicitFinish(); +document.addEventListener("DOMContentLoaded", async function() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["privacy.resistFingerprinting", true] + ] + }); + + let canvas = document.body.appendChild(document.createElement("canvas")); + if (!canvas) { + SimpleTest.ok(false, "Cannot create canvas"); + SimpleTest.finish(); + } + + let gl = canvas.getContext("webgl"); + if (!gl) { + SimpleTest.ok(false, "Cannot get WebGL context"); + SimpleTest.finish(); + } + + SimpleTest.is(gl.getParameter(gl.MAX_TEXTURE_SIZE), 2048, "MAX_TEXTURE_SIZE"); + SimpleTest.is(gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE), 2048, "MAX_CUBE_MAP_TEXTURE_SIZE"); + SimpleTest.is(gl.getParameter(gl.MAX_RENDERBUFFER_SIZE), 2048, "MAX_RENDERBUFFER_SIZE"); + SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), 8, "MAX_VERTEX_TEXTURE_IMAGE_UNITS"); + SimpleTest.is(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), 8, "MAX_TEXTURE_IMAGE_UNITS"); + SimpleTest.is(gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), 16, "MAX_COMBINED_TEXTURE_IMAGE_UNITS"); + SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_ATTRIBS), 16, "MAX_VERTEX_ATTRIBS"); + SimpleTest.is(gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS), 256, "MAX_VERTEX_UNIFORM_VECTORS"); + SimpleTest.is(gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS), 224, "MAX_FRAGMENT_UNIFORM_VECTORS"); + SimpleTest.is(gl.getParameter(gl.MAX_VARYING_VECTORS), 8, "MAX_VARYING_VECTORS"); + let viewportDims = gl.getParameter(gl.MAX_VIEWPORT_DIMS); + SimpleTest.is(viewportDims[0], 4096, "MAX_VIEWPORT_DIMS[0]"); + SimpleTest.is(viewportDims[1], 4096, "MAX_VIEWPORT_DIMS[1]"); + let aliasedPointSizeRange = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE); + SimpleTest.is(aliasedPointSizeRange[0], 1, "ALIASED_POINT_SIZE_RANGE[0]"); + SimpleTest.is(aliasedPointSizeRange[1], 63, "ALIASED_POINT_SIZE_RANGE[1]"); + let aliasedLineWIdthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); + SimpleTest.is(aliasedLineWIdthRange[0], 1, "ALIASED_LINE_WIDTH_RANGE[0]"); + SimpleTest.is(aliasedLineWIdthRange[1], 1, "ALIASED_LINE_WIDTH_RANGE[1]"); + SimpleTest.finish(); +}); +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html new file mode 100644 index 0000000000..8e8b05e6d3 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check that WebGL works (or not) if it should (or should not).</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> + +function test() { + ok(SpecialPowers.getBoolPref('webgl.force-enabled'), 'WebGL should be force-enabled.'); + + var shouldSucceed = true; + var shouldFail = false; + + if (DriverInfo.getOS() == DriverInfo.OS.ANDROID && + DriverInfo.getOSVersion() < 15) + { + // Consider 'random'. Actually, ARMv6 fails, and ARMv7 succeeds, but we have + // not been successful at determining this from JS. (see bug 917478) + shouldSucceed = false; + shouldFail = false; + } + + var gl = c.getContext('webgl'); + if (shouldSucceed) { + ok(gl, 'Expected WebGL creation to succeed.'); + } + if (shouldFail) { + ok(!gl, 'Expected WebGL creation to fail.'); + } + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +var prefArrArr = [ + ['webgl.force-enabled', true] +]; +var prefEnv = {'set': prefArrArr}; +SpecialPowers.pushPrefEnv(prefEnv, test); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html new file mode 100644 index 0000000000..d11584e08c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html @@ -0,0 +1,36 @@ +<!DOCTYPE HTML> +<title>WebGL test: 'webgl' and 'experimental-webgl' context requests succeed, + 'moz-webgl' context requests fail.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<body> +<canvas id="c1"></canvas> +<canvas id="c2"></canvas> +<script> + +var testFunc = ok; + +function testContextRetrieval(canvasId, creationId, shouldSucceed) { + var canvas = document.getElementById(canvasId); + ok(canvas, 'Invalid `canvasId`: ' + canvasId); + + var createdGL = canvas.getContext(creationId); + if (shouldSucceed) { + testFunc(createdGL, 'Request for \'' + creationId + '\' should succeed.'); + } else { + ok(!createdGL, 'Request for \'' + creationId + '\' should fail.'); + } +} + +SimpleTest.waitForExplicitFinish(); +SpecialPowers.pushPrefEnv({'set': [ + ['webgl.force-enabled', true] +]}, function() { + testContextRetrieval('c1', 'experimental-webgl', true); + testContextRetrieval('c2', 'moz-webgl', false); + SimpleTest.finish(); +}); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html new file mode 100644 index 0000000000..1dcab1c167 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html @@ -0,0 +1,90 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +WEBGL_TYPES = {}; +WEBGL_TYPES['experimental-webgl'] = true; +WEBGL_TYPES.webgl = true; + +function AreBothIn(a, b, set) { + return (a in set) && (b in set); +} + +function IsAlias(typeA, typeB) { + if (typeA == typeB) + return true; + + if (AreBothIn(typeA, typeB, WEBGL_TYPES)) + return true; + + return false; +} + +function TestContextRetrieval(creationType, requestType, functionalTypeSet) { + var canvas = document.createElement('canvas'); + var createdGL = canvas.getContext(creationType); + + var didCreationSucceed = (createdGL != null); + if (creationType in functionalTypeSet) { + ok(createdGL, 'Context creation should succeed for type \'' + + creationType + '\''); + } else { + ok(!createdGL, 'Context creation should fail for type \'' + + creationType + '\''); + return; + } + + var requestedGL = canvas.getContext(requestType); + + if (requestType in functionalTypeSet && + IsAlias(creationType, requestType)) + { + ok(requestedGL, 'Request for \'' + requestType + '\' from \'' + + creationType + '\' should succeed.'); + ok(requestedGL == createdGL, 'Request for \'' + requestType + + '\' from \'' + creationType + + '\' should match.'); + } else { + ok(!requestedGL, 'Request for \'' + requestType + '\' from \'' + + creationType + '\' should fail.'); + } +} + +function IsWebGLFunctional() { + var canvas = document.createElement('canvas'); + return canvas.getContext('experimental-webgl') != null; +} + +function IsWebGLConformant() { + var canvas = document.createElement('canvas'); + return canvas.getContext('webgl') != null; +} + +var typeList = ['2d', 'experimental-webgl', 'webgl']; +var functionalTypeSet = {}; +functionalTypeSet['2d'] = true; + +if (IsWebGLFunctional()) + functionalTypeSet['experimental-webgl'] = true; + +if (IsWebGLConformant()) + functionalTypeSet.webgl = true; + +for (var i in typeList) { + var creationType = typeList[i]; + + for (var j in typeList) { + var requestType = typeList[j]; + + TestContextRetrieval(creationType, requestType, functionalTypeSet); + } +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html new file mode 100644 index 0000000000..65d9b4eb2f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html @@ -0,0 +1,66 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> +'use strict'; + +function RunWithPrefs(prefPairList, func) { + var prefEnv = {'set': prefPairList}; + try { + SpecialPowers.pushPrefEnv(prefEnv, func); + } catch (e) { + console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList)); + func(); + } +} + +//////////////////////////////////////// + +function Check(expr, text) { + ok(expr, text); + return expr; +} + +function TestWhenDisabled() { + var c = document.createElement('canvas'); + + var generatedEvent = null; + var f = function(event) { generatedEvent = event; }; + c.addEventListener('webglcontextcreationerror', f); + + var gl = c.getContext('webgl'); // Should fail. + + do { + if (!Check(!gl, 'When disabled, context creation should fail.')) + break; + + if (!Check(generatedEvent, 'Context creation failure should generate an event.')) + break; + + var reason = generatedEvent.statusMessage; + if (!Check(reason !== undefined, 'generatedEvent.statusMessage should be defined.')) + break; + + ok(reason.length, 'statusMessage should be non-empty.'); + } while (false); + + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +var prefPairList = [ + ['webgl.disabled', true], +]; +RunWithPrefs(prefPairList, TestWhenDisabled); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_without_index_validation.html b/dom/canvas/test/webgl-mochitest/test_without_index_validation.html new file mode 100644 index 0000000000..01e028539d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_without_index_validation.html @@ -0,0 +1,86 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset='utf-8'> +<title>WebGL test: Drawing without index validation</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> + +<script id='vertSource' type='none'> +void main(void) { + gl_PointSize = 1.0; + gl_Position = vec4(0, 0, 0, 1); +} +</script> + +<script id='fragSource' type='none'> +precision mediump float; + +void main(void) { + gl_FragColor = vec4(0, 1, 0, 1); +} +</script> +</head> +<body> +<script> + +function test() { + const c = document.createElement('canvas'); + c.width = c.height = 1; + const gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + document.body.appendChild(c); + + const vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, vertSource.innerHTML.trim()); + gl.compileShader(vs); + const fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, fragSource.innerHTML.trim()); + gl.compileShader(fs); + const prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + gl.useProgram(prog); + + gl.clearColor(1,0,0,1); + const pixel = new Uint32Array(1); + const pixelData = new Uint8Array(pixel.buffer); + + function expectPixel(expected, info) { + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixelData); + ok(pixel[0] == expected, + '[' + info + '] Expected 0x' + expected.toString(16) + ', was 0x' + pixel[0].toString(16)); + } + + gl.clear(gl.COLOR_BUFFER_BIT); + expectPixel(0xFF0000FF, 'Clear'); + + gl.drawArrays(gl.POINTS, 0, 1); + expectPixel(0xFF00FF00, 'DrawArrays'); + + const indexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0]), gl.STATIC_DRAW); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, gl.UNSIGNED_SHORT, 0); + expectPixel(0xFF00FF00, 'DrawElements'); + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +const prefArrArr = [ + ['webgl.force-index-validation', -1] +]; +const prefEnv = {'set': prefArrArr}; +SpecialPowers.pushPrefEnv(prefEnv, test); + +</script> +</body> +</html>
\ No newline at end of file diff --git a/dom/canvas/test/webgl-mochitest/webgl-util.js b/dom/canvas/test/webgl-mochitest/webgl-util.js new file mode 100644 index 0000000000..ca4837860a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/webgl-util.js @@ -0,0 +1,137 @@ +WebGLUtil = (function () { + // --------------------------------------------------------------------------- + // WebGL helpers + + function withWebGL2(canvasId, callback, onFinished) { + var run = function () { + var canvas = document.getElementById(canvasId); + + var gl = null; + try { + gl = canvas.getContext("webgl2"); + } catch (e) {} + + if (!gl) { + todo(false, "WebGL2 is not supported"); + onFinished(); + return; + } + + callback(gl); + onFinished(); + }; + + try { + var prefArrArr = [ + ["webgl.force-enabled", true], + ["webgl.enable-webgl2", true], + ]; + var prefEnv = { set: prefArrArr }; + SpecialPowers.pushPrefEnv(prefEnv, run); + } catch (e) { + warning("No SpecialPowers, but trying WebGL2 anyway..."); + run(); + } + } + + // Returns a valid shader, or null on errors. + function createShaderById(gl, id) { + var elem = document.getElementById(id); + if (!elem) { + throw new Error( + "Failed to create shader from non-existent id '" + id + "'." + ); + } + + var src = elem.innerHTML.trim(); + + var shader; + if (elem.type == "x-shader/x-fragment") { + shader = gl.createShader(gl.FRAGMENT_SHADER); + } else if (elem.type == "x-shader/x-vertex") { + shader = gl.createShader(gl.VERTEX_SHADER); + } else { + throw new Error( + "Bad MIME type for shader '" + id + "': " + elem.type + "." + ); + } + + gl.shaderSource(shader, src); + gl.compileShader(shader); + + return shader; + } + + function createProgramByIds(gl, vsId, fsId) { + var vs = createShaderById(gl, vsId); + var fs = createShaderById(gl, fsId); + if (!vs || !fs) { + return null; + } + + var prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + + if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { + var str = "Shader program linking failed:"; + str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog); + str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs); + str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs); + console.error(str); + return null; + } + + return prog; + } + + return { + withWebGL2, + + createShaderById, + createProgramByIds, + + linkProgramByIds(gl, vertSrcElem, fragSrcElem) { + const prog = gl.createProgram(); + + function attachShaderById(type, srcElem) { + const shader = gl.createShader(type); + gl.shaderSource(shader, srcElem.innerHTML.trim() + "\n"); + gl.compileShader(shader); + gl.attachShader(prog, shader); + prog[type] = shader; + } + attachShaderById(gl.VERTEX_SHADER, vertSrcElem); + attachShaderById(gl.FRAGMENT_SHADER, fragSrcElem); + + gl.linkProgram(prog); + const success = gl.getProgramParameter(prog, gl.LINK_STATUS); + if (!success) { + console.error("Error linking program:"); + console.error("\nLink log: " + gl.getProgramInfoLog(prog)); + console.error( + "\nVert shader log: " + gl.getShaderInfoLog(prog[gl.VERTEX_SHADER]) + ); + console.error( + "\nFrag shader log: " + gl.getShaderInfoLog(prog[gl.FRAGMENT_SHADER]) + ); + return null; + } + gl.deleteShader(prog[gl.VERTEX_SHADER]); + gl.deleteShader(prog[gl.FRAGMENT_SHADER]); + + let count = gl.getProgramParameter(prog, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < count; i++) { + const info = gl.getActiveAttrib(prog, i); + prog[info.name] = gl.getAttribLocation(prog, info.name); + } + count = gl.getProgramParameter(prog, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < count; i++) { + const info = gl.getActiveUniform(prog, i); + prog[info.name] = gl.getUniformLocation(prog, info.name); + } + return prog; + }, + }; +})(); |