diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index cf5e3c948..e35e94bb7 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -20,6 +20,7 @@ #include #include +#include "third_party/dxbc/DXBCChecksum.h" #include "third_party/fmt/include/fmt/format.h" #include "xenia/base/assert.h" #include "xenia/base/byte_order.h" @@ -35,6 +36,8 @@ #include "xenia/gpu/d3d12/d3d12_command_processor.h" #include "xenia/gpu/d3d12/d3d12_render_target_cache.h" #include "xenia/gpu/draw_util.h" +#include "xenia/gpu/dxbc.h" +#include "xenia/gpu/dxbc_shader_translator.h" #include "xenia/gpu/gpu_flags.h" #include "xenia/gpu/registers.h" #include "xenia/gpu/xenos.h" @@ -73,9 +76,6 @@ namespace shaders { #include "xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_hs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/float24_round_ps.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/float24_truncate_ps.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h" -#include "xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h" #include "xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h" } // namespace shaders @@ -676,6 +676,12 @@ void PipelineCache::InitializeShaderStorage( pixel_shader = nullptr; pipeline_runtime_description.pixel_shader = nullptr; } + GeometryShaderKey pipeline_geometry_shader_key; + pipeline_runtime_description.geometry_shader = + GetGeometryShaderKey(pipeline_description.geometry_shader, + pipeline_geometry_shader_key) + ? &GetGeometryShader(pipeline_geometry_shader_key) + : nullptr; pipeline_runtime_description.root_signature = command_processor_.GetRootSignature( vertex_shader, pixel_shader, @@ -1390,6 +1396,11 @@ bool PipelineCache::GetCurrentStateDescription( break; } } + GeometryShaderKey geometry_shader_key; + runtime_description_out.geometry_shader = + GetGeometryShaderKey(description_out.geometry_shader, geometry_shader_key) + ? &GetGeometryShader(geometry_shader_key) + : nullptr; // The rest doesn't matter when rasterization is disabled (thus no writing to // anywhere from post-geometry stages and no samples are counted). @@ -1669,6 +1680,1121 @@ bool PipelineCache::GetCurrentStateDescription( return true; } +bool PipelineCache::GetGeometryShaderKey( + PipelineGeometryShader geometry_shader_type, GeometryShaderKey& key_out) { + if (geometry_shader_type == PipelineGeometryShader::kNone) { + return false; + } + GeometryShaderKey key; + key.type = geometry_shader_type; + // TODO(Triang3l): Make the linkage parameters depend on the real needs of the + // vertex and the pixel shader. + key.interpolator_count = xenos::kMaxInterpolators; + key.user_clip_plane_count = 6; + key.user_clip_plane_cull = 0; + key.has_vertex_kill_and = 1; + key.has_point_size = 1; + key.has_point_coordinates = 1; + key_out = key; + return true; +} + +void PipelineCache::CreateDxbcGeometryShader( + GeometryShaderKey key, std::vector& shader_out) { + shader_out.clear(); + + // RDEF, ISGN, OSG5, SHEX, STAT. + constexpr uint32_t kBlobCount = 5; + + // Allocate space for the container header and the blob offsets. + shader_out.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) + + kBlobCount); + uint32_t blob_offset_position_dwords = + sizeof(dxbc::ContainerHeader) / sizeof(uint32_t); + uint32_t blob_position_dwords = uint32_t(shader_out.size()); + constexpr uint32_t kBlobHeaderSizeDwords = + sizeof(dxbc::BlobHeader) / sizeof(uint32_t); + + uint32_t name_ptr; + + // *************************************************************************** + // Resource definition + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t rdef_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + // Not needed, as the next operation done is resize, to allocate the space for + // both the blob header and the resource definition header. + // shader_out.resize(rdef_position_dwords); + + // RDEF header - the actual definitions will be written if needed. + shader_out.resize(rdef_position_dwords + + sizeof(dxbc::RdefHeader) / sizeof(uint32_t)); + // Generator name. + dxbc::AppendAlignedString(shader_out, "Xenia"); + { + auto& rdef_header = *reinterpret_cast( + shader_out.data() + rdef_position_dwords); + rdef_header.shader_model = dxbc::RdefShaderModel::kGeometryShader5_1; + rdef_header.compile_flags = + dxbc::kCompileFlagNoPreshader | dxbc::kCompileFlagPreferFlowControl | + dxbc::kCompileFlagIeeeStrictness | dxbc::kCompileFlagAllResourcesBound; + // Generator name is right after the header. + rdef_header.generator_name_ptr = sizeof(dxbc::RdefHeader); + rdef_header.fourcc = dxbc::RdefHeader::FourCC::k5_1; + rdef_header.InitializeSizes(); + } + + uint32_t system_cbuffer_size_vector_aligned_bytes = 0; + + if (key.type == PipelineGeometryShader::kPointList) { + // Need point parameters from the system constants. + + // Constant types - float2 only. + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_float2 = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "float2"); + // Types. + uint32_t rdef_type_float2_position_dwords = uint32_t(shader_out.size()); + uint32_t rdef_type_float2_ptr = + uint32_t((rdef_type_float2_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + shader_out.resize(rdef_type_float2_position_dwords + + sizeof(dxbc::RdefType) / sizeof(uint32_t)); + { + auto& rdef_type_float2 = *reinterpret_cast( + shader_out.data() + rdef_type_float2_position_dwords); + rdef_type_float2.variable_class = dxbc::RdefVariableClass::kVector; + rdef_type_float2.variable_type = dxbc::RdefVariableType::kFloat; + rdef_type_float2.row_count = 1; + rdef_type_float2.column_count = 2; + rdef_type_float2.name_ptr = rdef_name_ptr_float2; + } + + // Constants: + // - float2 xe_point_constant_diameter + // - float2 xe_point_screen_diameter_to_ndc_radius + enum PointConstant : uint32_t { + kPointConstantConstantDiameter, + kPointConstantScreenDiameterToNDCRadius, + kPointConstantCount, + }; + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_xe_point_constant_diameter = name_ptr; + name_ptr += + dxbc::AppendAlignedString(shader_out, "xe_point_constant_diameter"); + uint32_t rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius = name_ptr; + name_ptr += dxbc::AppendAlignedString( + shader_out, "xe_point_screen_diameter_to_ndc_radius"); + // Constants. + uint32_t rdef_constants_position_dwords = uint32_t(shader_out.size()); + uint32_t rdef_constants_ptr = + uint32_t((rdef_constants_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + shader_out.resize(rdef_constants_position_dwords + + sizeof(dxbc::RdefVariable) / sizeof(uint32_t) * + kPointConstantCount); + { + auto rdef_constants = reinterpret_cast( + shader_out.data() + rdef_constants_position_dwords); + // float2 xe_point_constant_diameter + static_assert( + sizeof(DxbcShaderTranslator::SystemConstants :: + point_constant_diameter) == sizeof(float) * 2, + "DxbcShaderTranslator point_constant_diameter system constant size " + "differs between the shader translator and geometry shader " + "generation"); + static_assert_size( + DxbcShaderTranslator::SystemConstants::point_constant_diameter, + sizeof(float) * 2); + dxbc::RdefVariable& rdef_constant_point_constant_diameter = + rdef_constants[kPointConstantConstantDiameter]; + rdef_constant_point_constant_diameter.name_ptr = + rdef_name_ptr_xe_point_constant_diameter; + rdef_constant_point_constant_diameter.start_offset_bytes = offsetof( + DxbcShaderTranslator::SystemConstants, point_constant_diameter); + rdef_constant_point_constant_diameter.size_bytes = sizeof(float) * 2; + rdef_constant_point_constant_diameter.flags = dxbc::kRdefVariableFlagUsed; + rdef_constant_point_constant_diameter.type_ptr = rdef_type_float2_ptr; + rdef_constant_point_constant_diameter.start_texture = UINT32_MAX; + rdef_constant_point_constant_diameter.start_sampler = UINT32_MAX; + // float2 xe_point_screen_diameter_to_ndc_radius + static_assert( + sizeof(DxbcShaderTranslator::SystemConstants :: + point_screen_diameter_to_ndc_radius) == sizeof(float) * 2, + "DxbcShaderTranslator point_screen_diameter_to_ndc_radius system " + "constant size differs between the shader translator and geometry " + "shader generation"); + dxbc::RdefVariable& rdef_constant_point_screen_diameter_to_ndc_radius = + rdef_constants[kPointConstantScreenDiameterToNDCRadius]; + rdef_constant_point_screen_diameter_to_ndc_radius.name_ptr = + rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius; + rdef_constant_point_screen_diameter_to_ndc_radius.start_offset_bytes = + offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius); + rdef_constant_point_screen_diameter_to_ndc_radius.size_bytes = + sizeof(float) * 2; + rdef_constant_point_screen_diameter_to_ndc_radius.flags = + dxbc::kRdefVariableFlagUsed; + rdef_constant_point_screen_diameter_to_ndc_radius.type_ptr = + rdef_type_float2_ptr; + rdef_constant_point_screen_diameter_to_ndc_radius.start_texture = + UINT32_MAX; + rdef_constant_point_screen_diameter_to_ndc_radius.start_sampler = + UINT32_MAX; + } + + // Constant buffers - xe_system_cbuffer only. + + // Names. + name_ptr = + uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t)); + uint32_t rdef_name_ptr_xe_system_cbuffer = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "xe_system_cbuffer"); + // Constant buffers. + uint32_t rdef_cbuffer_position_dwords = uint32_t(shader_out.size()); + shader_out.resize(rdef_cbuffer_position_dwords + + sizeof(dxbc::RdefCbuffer) / sizeof(uint32_t)); + { + auto& rdef_cbuffer_system = *reinterpret_cast( + shader_out.data() + rdef_cbuffer_position_dwords); + rdef_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer; + rdef_cbuffer_system.variable_count = kPointConstantCount; + rdef_cbuffer_system.variables_ptr = rdef_constants_ptr; + auto rdef_constants = reinterpret_cast( + shader_out.data() + rdef_constants_position_dwords); + for (uint32_t i = 0; i < kPointConstantCount; ++i) { + system_cbuffer_size_vector_aligned_bytes = + std::max(system_cbuffer_size_vector_aligned_bytes, + rdef_constants[i].start_offset_bytes + + rdef_constants[i].size_bytes); + } + system_cbuffer_size_vector_aligned_bytes = + xe::align(system_cbuffer_size_vector_aligned_bytes, + uint32_t(sizeof(uint32_t) * 4)); + rdef_cbuffer_system.size_vector_aligned_bytes = + system_cbuffer_size_vector_aligned_bytes; + } + + // Bindings - xe_system_cbuffer only. + uint32_t rdef_binding_position_dwords = uint32_t(shader_out.size()); + shader_out.resize(rdef_binding_position_dwords + + sizeof(dxbc::RdefInputBind) / sizeof(uint32_t)); + { + auto& rdef_binding_cbuffer_system = + *reinterpret_cast(shader_out.data() + + rdef_binding_position_dwords); + rdef_binding_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer; + rdef_binding_cbuffer_system.type = dxbc::RdefInputType::kCbuffer; + rdef_binding_cbuffer_system.bind_point = + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants); + rdef_binding_cbuffer_system.bind_count = 1; + rdef_binding_cbuffer_system.flags = dxbc::kRdefInputFlagUserPacked; + } + + // Pointers in the header. + { + auto& rdef_header = *reinterpret_cast( + shader_out.data() + rdef_position_dwords); + rdef_header.cbuffer_count = 1; + rdef_header.cbuffers_ptr = + uint32_t((rdef_cbuffer_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + rdef_header.input_bind_count = 1; + rdef_header.input_binds_ptr = + uint32_t((rdef_binding_position_dwords - rdef_position_dwords) * + sizeof(uint32_t)); + } + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Input signature + // *************************************************************************** + + // Clip and cull distances are tightly packed together into registers, but + // have separate signature parameters with each being a vec4-aligned window. + uint32_t input_clip_distance_count = + key.user_clip_plane_cull ? 0 : key.user_clip_plane_count; + uint32_t input_cull_distance_count = + (key.user_clip_plane_cull ? key.user_clip_plane_count : 0) + + key.has_vertex_kill_and; + uint32_t input_clip_and_cull_distance_count = + input_clip_distance_count + input_cull_distance_count; + + // Interpolators, point size, position, clip and cull distances (parameters + // containing only clip or cull distances, and also one parameter containing + // both if present). + // TODO(Triang3l): Reorder as needed when the respective changes are done in + // the shader translator. + uint32_t isgn_parameter_count = + key.interpolator_count + key.has_point_size + 1 + + ((input_clip_and_cull_distance_count + 3) / 4) + + uint32_t(input_cull_distance_count && + (input_clip_distance_count & 3) != 0); + + // Reserve space for the header and the parameters. + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t isgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(isgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t) + + sizeof(dxbc::SignatureParameter) / sizeof(uint32_t) * + isgn_parameter_count); + + // Names (after the parameters). + name_ptr = + uint32_t((shader_out.size() - isgn_position_dwords) * sizeof(uint32_t)); + uint32_t isgn_name_ptr_texcoord = name_ptr; + if (key.interpolator_count || key.has_point_size) { + name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); + } + uint32_t isgn_name_ptr_sv_position = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_Position"); + uint32_t isgn_name_ptr_sv_clip_distance = name_ptr; + if (input_clip_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_ClipDistance"); + } + uint32_t isgn_name_ptr_sv_cull_distance = name_ptr; + if (input_cull_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_CullDistance"); + } + + // Header and parameters. + uint32_t input_register_interpolators = UINT32_MAX; + uint32_t input_register_point_size = UINT32_MAX; + uint32_t input_register_position; + uint32_t input_register_clip_and_cull_distances = UINT32_MAX; + { + // Header. + auto& isgn_header = *reinterpret_cast( + shader_out.data() + isgn_position_dwords); + isgn_header.parameter_count = isgn_parameter_count; + isgn_header.parameter_info_ptr = sizeof(dxbc::Signature); + + // Parameters. + auto isgn_parameters = reinterpret_cast( + shader_out.data() + isgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t)); + uint32_t isgn_parameter_index = 0; + uint32_t input_register_index = 0; + + // Interpolators (TEXCOORD#). + if (key.interpolator_count) { + input_register_interpolators = input_register_index; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_interpolator = + isgn_parameters[isgn_parameter_index++]; + isgn_interpolator.semantic_name_ptr = isgn_name_ptr_texcoord; + isgn_interpolator.semantic_index = i; + isgn_interpolator.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_interpolator.register_index = input_register_index++; + isgn_interpolator.mask = 0b1111; + isgn_interpolator.always_reads_mask = 0b1111; + } + } + + // Point size. + // TODO(Triang3l): Put the size in X of float1, not in Z of float3, when + // linkage via shader modifications is done. + // TODO(Triang3l): Rename from TEXCOORD# to XEPSIZE when linkage via shader + // modifications is done. + if (key.has_point_size) { + input_register_point_size = input_register_index; + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_point_size = + isgn_parameters[isgn_parameter_index++]; + isgn_point_size.semantic_name_ptr = isgn_name_ptr_texcoord; + isgn_point_size.semantic_index = key.interpolator_count; + isgn_point_size.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_point_size.register_index = input_register_index++; + isgn_point_size.mask = 0b0111; + isgn_point_size.always_reads_mask = + key.type == PipelineGeometryShader::kPointList ? 0b0100 : 0; + } + + // Position. + input_register_position = input_register_index; + assert_true(isgn_parameter_index < isgn_parameter_count); + dxbc::SignatureParameter& isgn_sv_position = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_position.semantic_name_ptr = isgn_name_ptr_sv_position; + isgn_sv_position.system_value = dxbc::Name::kPosition; + isgn_sv_position.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_position.register_index = input_register_index++; + isgn_sv_position.mask = 0b1111; + isgn_sv_position.always_reads_mask = 0b1111; + + // Clip and cull distances. + if (input_clip_and_cull_distance_count) { + input_register_clip_and_cull_distances = input_register_index; + uint32_t isgn_cull_distance_semantic_index = 0; + for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) { + if (i < input_clip_distance_count) { + dxbc::SignatureParameter& isgn_sv_clip_distance = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_clip_distance.semantic_name_ptr = + isgn_name_ptr_sv_clip_distance; + isgn_sv_clip_distance.semantic_index = i / 4; + isgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance; + isgn_sv_clip_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_clip_distance.register_index = input_register_index; + uint8_t isgn_sv_clip_distance_mask = + (UINT8_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1; + isgn_sv_clip_distance.mask = isgn_sv_clip_distance_mask; + isgn_sv_clip_distance.always_reads_mask = isgn_sv_clip_distance_mask; + } + if (input_cull_distance_count && i + 4 > input_clip_distance_count) { + dxbc::SignatureParameter& isgn_sv_cull_distance = + isgn_parameters[isgn_parameter_index++]; + isgn_sv_cull_distance.semantic_name_ptr = + isgn_name_ptr_sv_cull_distance; + isgn_sv_cull_distance.semantic_index = + isgn_cull_distance_semantic_index++; + isgn_sv_cull_distance.system_value = dxbc::Name::kCullDistance; + isgn_sv_cull_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + isgn_sv_cull_distance.register_index = input_register_index; + uint8_t isgn_sv_cull_distance_mask = + (UINT8_C(1) << std::min(input_clip_and_cull_distance_count - i, + UINT32_C(4))) - + 1; + if (i < input_clip_distance_count) { + isgn_sv_cull_distance_mask &= + ~((UINT8_C(1) << (input_clip_distance_count - i)) - 1); + } + isgn_sv_cull_distance.mask = isgn_sv_cull_distance_mask; + isgn_sv_cull_distance.always_reads_mask = isgn_sv_cull_distance_mask; + } + ++input_register_index; + } + } + + assert_true(isgn_parameter_index == isgn_parameter_count); + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kInputSignature; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Output signature + // *************************************************************************** + + // Interpolators, point coordinates, position, clip distances. + // TODO(Triang3l): Reorder as needed when the respective changes are done in + // the shader translator. + uint32_t osgn_parameter_count = key.interpolator_count + + key.has_point_coordinates + 1 + + ((input_clip_distance_count + 3) / 4); + + // Reserve space for the header and the parameters. + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t osgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(osgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t) + + sizeof(dxbc::SignatureParameterForGS) / sizeof(uint32_t) * + osgn_parameter_count); + + // Names (after the parameters). + name_ptr = + uint32_t((shader_out.size() - osgn_position_dwords) * sizeof(uint32_t)); + uint32_t osgn_name_ptr_texcoord = name_ptr; + if (key.interpolator_count || key.has_point_coordinates) { + name_ptr += dxbc::AppendAlignedString(shader_out, "TEXCOORD"); + } + uint32_t osgn_name_ptr_sv_position = name_ptr; + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_Position"); + uint32_t osgn_name_ptr_sv_clip_distance = name_ptr; + if (input_clip_distance_count) { + name_ptr += dxbc::AppendAlignedString(shader_out, "SV_ClipDistance"); + } + + // Header and parameters. + uint32_t output_register_interpolators = UINT32_MAX; + uint32_t output_register_point_coordinates = UINT32_MAX; + uint32_t output_register_position; + uint32_t output_register_clip_distances = UINT32_MAX; + { + // Header. + auto& osgn_header = *reinterpret_cast( + shader_out.data() + osgn_position_dwords); + osgn_header.parameter_count = osgn_parameter_count; + osgn_header.parameter_info_ptr = sizeof(dxbc::Signature); + + // Parameters. + auto osgn_parameters = reinterpret_cast( + shader_out.data() + osgn_position_dwords + + sizeof(dxbc::Signature) / sizeof(uint32_t)); + uint32_t osgn_parameter_index = 0; + uint32_t output_register_index = 0; + + // Interpolators (TEXCOORD#). + if (key.interpolator_count) { + output_register_interpolators = output_register_index; + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_interpolator = + osgn_parameters[osgn_parameter_index++]; + osgn_interpolator.semantic_name_ptr = osgn_name_ptr_texcoord; + osgn_interpolator.semantic_index = i; + osgn_interpolator.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_interpolator.register_index = output_register_index++; + osgn_interpolator.mask = 0b1111; + } + } + + // Point coordinates. + // TODO(Triang3l): Put the coordinates in XY of float2 when linkage via + // shader modifications is done. + // TODO(Triang3l): Rename from TEXCOORD# to XESPRITETEXCOORD when linkage + // via shader modifications is done. + if (key.has_point_coordinates) { + output_register_point_coordinates = output_register_index; + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_point_coordinates = + osgn_parameters[osgn_parameter_index++]; + osgn_point_coordinates.semantic_name_ptr = osgn_name_ptr_texcoord; + osgn_point_coordinates.semantic_index = key.interpolator_count; + osgn_point_coordinates.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_point_coordinates.register_index = output_register_index++; + osgn_point_coordinates.mask = 0b0111; + osgn_point_coordinates.never_writes_mask = 0b1100; + } + + // Position. + output_register_position = output_register_index; + assert_true(osgn_parameter_index < osgn_parameter_count); + dxbc::SignatureParameterForGS& osgn_sv_position = + osgn_parameters[osgn_parameter_index++]; + osgn_sv_position.semantic_name_ptr = osgn_name_ptr_sv_position; + osgn_sv_position.system_value = dxbc::Name::kPosition; + osgn_sv_position.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_sv_position.register_index = output_register_index++; + osgn_sv_position.mask = 0b1111; + + // Clip distances. + if (input_clip_distance_count) { + output_register_clip_distances = output_register_index; + for (uint32_t i = 0; i < input_clip_distance_count; i += 4) { + dxbc::SignatureParameterForGS& osgn_sv_clip_distance = + osgn_parameters[osgn_parameter_index++]; + osgn_sv_clip_distance.semantic_name_ptr = + osgn_name_ptr_sv_clip_distance; + osgn_sv_clip_distance.semantic_index = i / 4; + osgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance; + osgn_sv_clip_distance.component_type = + dxbc::SignatureRegisterComponentType::kFloat32; + osgn_sv_clip_distance.register_index = output_register_index++; + uint8_t osgn_sv_clip_distance_mask = + (UINT8_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1; + osgn_sv_clip_distance.mask = osgn_sv_clip_distance_mask; + osgn_sv_clip_distance.never_writes_mask = + osgn_sv_clip_distance_mask ^ 0b1111; + } + } + + assert_true(osgn_parameter_index == osgn_parameter_count); + } + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kOutputSignatureForGS; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Shader program + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t shex_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(shex_position_dwords); + + shader_out.push_back( + dxbc::VersionToken(dxbc::ProgramType::kGeometryShader, 5, 1)); + // Reserve space for the length token. + shader_out.push_back(0); + + dxbc::Statistics stat; + std::memset(&stat, 0, sizeof(dxbc::Statistics)); + dxbc::Assembler a(shader_out, stat); + + a.OpDclGlobalFlags(dxbc::kGlobalFlagAllResourcesBound); + + if (system_cbuffer_size_vector_aligned_bytes) { + a.OpDclConstantBuffer( + dxbc::Src::CB( + dxbc::Src::Dcl, 0, + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants)), + system_cbuffer_size_vector_aligned_bytes / (sizeof(uint32_t) * 4)); + } + + dxbc::Primitive input_primitive = dxbc::Primitive::kUndefined; + uint32_t input_primitive_vertex_count = 0; + dxbc::PrimitiveTopology output_primitive_topology = + dxbc::PrimitiveTopology::kUndefined; + uint32_t max_output_vertex_count = 0; + switch (key.type) { + case PipelineGeometryShader::kPointList: + // Point to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kPoint; + input_primitive_vertex_count = 1; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + case PipelineGeometryShader::kRectangleList: + // Triangle to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kTriangle; + input_primitive_vertex_count = 3; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + case PipelineGeometryShader::kQuadList: + // 4 vertices passed via kLineWithAdjacency to a strip of 2 triangles. + input_primitive = dxbc::Primitive::kLineWithAdjacency; + input_primitive_vertex_count = 4; + output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip; + max_output_vertex_count = 4; + break; + default: + assert_unhandled_case(key.type); + } + + assert_false(key.interpolator_count && + input_register_interpolators == UINT32_MAX); + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_interpolators + i)); + } + if (key.has_point_size && key.type == PipelineGeometryShader::kPointList) { + assert_true(input_register_point_size != UINT32_MAX); + a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_point_size, 0b0100)); + } + a.OpDclInputSIV( + dxbc::Dest::V2D(input_primitive_vertex_count, input_register_position), + dxbc::Name::kPosition); + // Clip and cull plane declarations are separate in FXC-generated code even + // for a single register. + assert_false(input_clip_and_cull_distance_count && + input_register_clip_and_cull_distances == UINT32_MAX); + for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) { + if (i < input_clip_distance_count) { + a.OpDclInput( + dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_clip_and_cull_distances + (i >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - i, UINT32_C(4))) - + 1)); + } + if (input_cull_distance_count && i + 4 > input_clip_distance_count) { + uint32_t cull_distance_mask = + (UINT32_C(1) << std::min(input_clip_and_cull_distance_count - i, + UINT32_C(4))) - + 1; + if (i < input_clip_distance_count) { + cull_distance_mask &= + ~((UINT32_C(1) << (input_clip_distance_count - i)) - 1); + } + a.OpDclInput( + dxbc::Dest::V2D(input_primitive_vertex_count, + input_register_clip_and_cull_distances + (i >> 2), + cull_distance_mask)); + } + } + + size_t dcl_temps_instruction_position_dwords = shader_out.size(); + size_t dcl_temps_count_position_dwords = a.OpDclTemps(0); + + a.OpDclInputPrimitive(input_primitive); + dxbc::Dest stream(dxbc::Dest::M(0)); + a.OpDclStream(stream); + a.OpDclOutputTopology(output_primitive_topology); + + assert_false(key.interpolator_count && + output_register_interpolators == UINT32_MAX); + for (uint32_t i = 0; i < key.interpolator_count; ++i) { + a.OpDclOutput(dxbc::Dest::O(output_register_interpolators + i)); + } + if (key.has_point_coordinates) { + assert_true(output_register_point_coordinates != UINT32_MAX); + a.OpDclOutput(dxbc::Dest::O(output_register_point_coordinates, 0b0011)); + } + a.OpDclOutputSIV(dxbc::Dest::O(output_register_position), + dxbc::Name::kPosition); + assert_false(input_clip_distance_count && + output_register_clip_distances == UINT32_MAX); + for (uint32_t i = 0; i < input_clip_distance_count; i += 4) { + a.OpDclOutputSIV( + dxbc::Dest::O(output_register_clip_distances + (i >> 2), + (UINT32_C(1) << std::min(input_clip_distance_count - i, + UINT32_C(4))) - + 1), + dxbc::Name::kClipDistance); + } + + a.OpDclMaxOutputVertexCount(max_output_vertex_count); + + // Note that after every emit, all o# become initialized and must be written + // to again. + // Also, FXC generates only movs (from statically or dynamically indexed + // v[#][#], from r#, or from a literal) to o# for some reason. + + // Cull the whole primitive if all cull distances are < 0. + // TODO(Triang3l): For points, handle ps_ucp_mode (transform the host clip + // space to the guest one, calculate the distances to the user clip planes, + // cull using the distance from the center for modes 0, 1 and 2, cull and clip + // per-vertex for modes 2 and 3) - except for the vertex kill flag. + if (input_cull_distance_count) { + stat.temp_register_count = std::max(UINT32_C(1), stat.temp_register_count); + for (uint32_t i = 0; i < input_cull_distance_count; ++i) { + uint32_t cull_distance_register = input_register_clip_and_cull_distances + + ((input_clip_distance_count + i) >> 2); + uint32_t cull_distance_component = (input_clip_distance_count + i) & 3; + a.OpLT(dxbc::Dest::R(0, 0b0001), + dxbc::Src::V2D(0, cull_distance_register) + .Select(cull_distance_component), + dxbc::Src::LF(0.0f)); + for (uint32_t j = 1; j < input_primitive_vertex_count; ++j) { + a.OpLT(dxbc::Dest::R(0, 0b0010), + dxbc::Src::V2D(j, cull_distance_register) + .Select(cull_distance_component), + dxbc::Src::LF(0.0f)); + a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::R(0, dxbc::Src::kYYYY)); + } + a.OpRetC(true, dxbc::Src::R(0, dxbc::Src::kXXXX)); + } + } + + switch (key.type) { + case PipelineGeometryShader::kPointList: { + // Expand the point sprite, with left-to-right, top-to-bottom UVs. + dxbc::Src point_size_src(dxbc::Src::CB( + 0, uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter) >> + 4, + ((offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter[0]) >> + 2) & + 3) | + (((offsetof(DxbcShaderTranslator::SystemConstants, + point_constant_diameter[1]) >> + 2) & + 3) + << 2))); + stat.temp_register_count = + std::max(UINT32_C(1), stat.temp_register_count); + if (key.has_point_size) { + // The vertex shader's header writes -1.0 to point_size by default, so + // any non-negative value means that it was overwritten by the + // translated vertex shader, and needs to be used instead of the + // constant size. The per-vertex diameter is already clamped in the + // vertex shader (combined with making it non-negative). + a.OpGE(dxbc::Dest::R(0, 0b0001), + dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kZZZZ), + dxbc::Src::LF(0.0f)); + a.OpMovC(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kZZZZ), + point_size_src); + point_size_src = dxbc::Src::R(0, 0b0100); + } + // 4D5307F1 has zero-size snowflakes, drop them quicker, and also drop + // points with a constant size of zero since point lists may also be used + // as just "compute" with memexport. + // XY may contain the point size with the per-vertex override applied, use + // Z as temporary. + for (uint32_t i = 0; i < 2; ++i) { + a.OpLT(dxbc::Dest::R(0, 0b0100), dxbc::Src::LF(0.0f), + point_size_src.SelectFromSwizzled(i)); + a.OpRetC(false, dxbc::Src::R(0, dxbc::Src::kZZZZ)); + } + // Transform the diameter in the guest screen coordinates to radius in the + // normalized device coordinates, and then to the clip space by + // multiplying by W. + a.OpMul( + dxbc::Dest::R(0, 0b0011), point_size_src, + dxbc::Src::CB( + 0, + uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants), + offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius) >> + 4, + ((offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius[0]) >> + 2) & + 3) | + (((offsetof(DxbcShaderTranslator::SystemConstants, + point_screen_diameter_to_ndc_radius[1]) >> + 2) & + 3) + << 2))); + point_size_src = dxbc::Src::R(0, 0b0100); + a.OpMul(dxbc::Dest::R(0, 0b0011), point_size_src, + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kWWWW)); + dxbc::Src point_radius_x_src(point_size_src.SelectFromSwizzled(0)); + dxbc::Src point_radius_y_src(point_size_src.SelectFromSwizzled(1)); + + for (uint32_t i = 0; i < 4; ++i) { + // Same interpolators for the entire sprite. + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(0, input_register_interpolators + j)); + } + // Top-left, top-right, bottom-left, bottom-right order (chosen + // arbitrarily, simply based on clockwise meaning front with + // FrontCounterClockwise = FALSE, but faceness is ignored for + // non-polygon primitive types). + // Bottom is -Y in Direct3D NDC, +V in point sprite coordinates. + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(float(i & 1), float(i >> 1), 0.0f, 0.0f)); + } + // FXC generates only `mov`s for o#, use temporary registers (r0.zw, as + // r0.xy already used for the point size) for calculations. + a.OpAdd(dxbc::Dest::R(0, 0b0100), + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kXXXX), + (i & 1) ? point_radius_x_src : -point_radius_x_src); + a.OpAdd(dxbc::Dest::R(0, 0b1000), + dxbc::Src::V2D(0, input_register_position, dxbc::Src::kYYYY), + (i >> 1) ? -point_radius_y_src : point_radius_y_src); + a.OpMov(dxbc::Dest::O(output_register_position, 0b0011), + dxbc::Src::R(0, 0b1110)); + a.OpMov(dxbc::Dest::O(output_register_position, 0b1100), + dxbc::Src::V2D(0, input_register_position)); + // TODO(Triang3l): Handle ps_ucp_mode properly, clip expanded points if + // needed. + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + 0, input_register_clip_and_cull_distances + (j >> 2))); + } + if (i < 3) { + a.OpEmitStream(stream); + } + } + a.OpEmitThenCutStream(stream); + } break; + + case PipelineGeometryShader::kRectangleList: { + // Construct a strip with the fourth vertex generated by mirroring a + // vertex across the longest edge (the diagonal). + // + // Possible options: + // + // 0---1 + // | /| + // | / | - 12 is the longest edge, strip 0123 (most commonly used) + // |/ | v3 = v0 + (v1 - v0) + (v2 - v0), or v3 = -v0 + v1 + v2 + // 2--[3] + // + // 1---2 + // | /| + // | / | - 20 is the longest edge, strip 1203 + // |/ | + // 0--[3] + // + // 2---0 + // | /| + // | / | - 01 is the longest edge, strip 2013 + // |/ | + // 1--[3] + // + // Input vertices are implicitly indexable, dcl_indexRange is not needed + // for the first dimension of a v[#][#] index. + + stat.temp_register_count = + std::max(UINT32_C(1), stat.temp_register_count); + + // Get squares of edge lengths into r0.xyz to choose the longest edge. + // r0.x = ||12||^2 + a.OpAdd(dxbc::Dest::R(0, 0b0011), + dxbc::Src::V2D(2, input_register_position, 0b0100), + -dxbc::Src::V2D(1, input_register_position, 0b0100)); + a.OpDP2(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, 0b0100), + dxbc::Src::R(0, 0b0100)); + // r0.y = ||20||^2 + a.OpAdd(dxbc::Dest::R(0, 0b0110), + dxbc::Src::V2D(0, input_register_position, 0b0100 << 2), + -dxbc::Src::V2D(2, input_register_position, 0b0100 << 2)); + a.OpDP2(dxbc::Dest::R(0, 0b0010), dxbc::Src::R(0, 0b1001), + dxbc::Src::R(0, 0b1001)); + // r0.z = ||01||^2 + a.OpAdd(dxbc::Dest::R(0, 0b1100), + dxbc::Src::V2D(1, input_register_position, 0b0100 << 4), + -dxbc::Src::V2D(0, input_register_position, 0b0100 << 4)); + a.OpDP2(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, 0b1110), + dxbc::Src::R(0, 0b1110)); + + // Find the longest edge, and select the strip vertex indices into r0.xyz. + // r0.w = 12 > 20 + a.OpLT(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kYYYY), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + // r0.x = 12 > 01 + a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + // r0.x = 12 > 20 && 12 > 01 + a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kWWWW), + dxbc::Src::R(0, dxbc::Src::kXXXX)); + a.OpIf(true, dxbc::Src::R(0, dxbc::Src::kXXXX)); + { + // 12 is the longest edge, the first triangle in the strip is 012. + a.OpMov(dxbc::Dest::R(0, 0b0111), dxbc::Src::LU(0, 1, 2, 0)); + } + a.OpElse(); + { + // r0.x = 20 > 01 + a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ), + dxbc::Src::R(0, dxbc::Src::kYYYY)); + // If 20 is the longest edge, the first triangle in the strip is 120. + // Otherwise, it's 201. + a.OpMovC(dxbc::Dest::R(0, 0b0111), dxbc::Src::R(0, dxbc::Src::kXXXX), + dxbc::Src::LU(1, 2, 0, 0), dxbc::Src::LU(2, 0, 1, 0)); + } + a.OpEndIf(); + + // Emit the triangle in the strip that consisting of the original + // vertices. + for (uint32_t i = 0; i < 3; ++i) { + dxbc::Index input_vertex_index(0, i); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(input_vertex_index, + input_register_interpolators + j)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpMov(dxbc::Dest::O(output_register_position), + dxbc::Src::V2D(input_vertex_index, input_register_position)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + input_vertex_index, + input_register_clip_and_cull_distances + (j >> 2))); + } + a.OpEmitStream(stream); + } + + // Construct the fourth vertex using r1 as temporary storage, including + // for the final operation as FXC generates only `mov`s for o#. + stat.temp_register_count = + std::max(UINT32_C(2), stat.temp_register_count); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + uint32_t input_register_interpolator = input_register_interpolators + j; + a.OpAdd(dxbc::Dest::R(1), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_interpolator), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_interpolator)); + a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_interpolator)); + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::R(1)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpAdd(dxbc::Dest::R(1), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_position), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_position)); + a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_position)); + a.OpMov(dxbc::Dest::O(output_register_position), dxbc::Src::R(1)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + uint32_t clip_distance_mask = + (UINT32_C(1) << std::min(input_clip_distance_count - j, + UINT32_C(4))) - + 1; + uint32_t input_register_clip_distance = + input_register_clip_and_cull_distances + (j >> 2); + a.OpAdd( + dxbc::Dest::R(1, clip_distance_mask), + -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_clip_distance), + dxbc::Src::V2D(dxbc::Index(0, 1), input_register_clip_distance)); + a.OpAdd( + dxbc::Dest::R(1, clip_distance_mask), dxbc::Src::R(1), + dxbc::Src::V2D(dxbc::Index(0, 2), input_register_clip_distance)); + a.OpMov(dxbc::Dest::O(output_register_clip_distances + (j >> 2), + clip_distance_mask), + dxbc::Src::R(1)); + } + a.OpEmitThenCutStream(stream); + } break; + + case PipelineGeometryShader::kQuadList: { + // Build the triangle strip from the original quad vertices in the + // 0, 1, 3, 2 order (like specified for GL_QUAD_STRIP). + // TODO(Triang3l): Find the correct decomposition of quads into triangles + // on the real hardware. + for (uint32_t i = 0; i < 4; ++i) { + uint32_t input_vertex_index = i ^ (i >> 1); + for (uint32_t j = 0; j < key.interpolator_count; ++j) { + a.OpMov(dxbc::Dest::O(output_register_interpolators + j), + dxbc::Src::V2D(input_vertex_index, + input_register_interpolators + j)); + } + if (key.has_point_coordinates) { + a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011), + dxbc::Src::LF(0.0f)); + } + a.OpMov(dxbc::Dest::O(output_register_position), + dxbc::Src::V2D(input_vertex_index, input_register_position)); + for (uint32_t j = 0; j < input_clip_distance_count; j += 4) { + a.OpMov( + dxbc::Dest::O(output_register_clip_distances + (j >> 2), + (UINT32_C(1) << std::min( + input_clip_distance_count - j, UINT32_C(4))) - + 1), + dxbc::Src::V2D( + input_vertex_index, + input_register_clip_and_cull_distances + (j >> 2))); + } + if (i < 3) { + a.OpEmitStream(stream); + } + } + a.OpEmitThenCutStream(stream); + } break; + + default: + assert_unhandled_case(key.type); + } + + a.OpRet(); + + if (stat.temp_register_count) { + // Write the actual number of temporary registers used. + shader_out[dcl_temps_count_position_dwords] = stat.temp_register_count; + } else { + // Remove the dcl_temps instruction (FXC doesn't generate it when temporary + // variables aren't used). + uint32_t dcl_temps_length_dwords = dxbc::GetOpcodeTokenInstructionLength( + shader_out[dcl_temps_instruction_position_dwords]); + size_t dcl_temps_end_position_dwords = + dcl_temps_instruction_position_dwords + dcl_temps_length_dwords; + size_t shader_size_with_dcl_temps = shader_out.size(); + std::memmove(shader_out.data() + dcl_temps_instruction_position_dwords, + shader_out.data() + dcl_temps_end_position_dwords, + sizeof(uint32_t) * (shader_size_with_dcl_temps - + dcl_temps_end_position_dwords)); + shader_out.resize(shader_size_with_dcl_temps - dcl_temps_length_dwords); + } + + // Write the shader program length in dwords. + shader_out[shex_position_dwords + 1] = + uint32_t(shader_out.size()) - shex_position_dwords; + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Statistics + // *************************************************************************** + + shader_out[blob_offset_position_dwords] = + uint32_t(blob_position_dwords * sizeof(uint32_t)); + uint32_t stat_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords; + shader_out.resize(stat_position_dwords + + sizeof(dxbc::Statistics) / sizeof(uint32_t)); + std::memcpy(shader_out.data() + stat_position_dwords, &stat, + sizeof(dxbc::Statistics)); + + { + auto& blob_header = *reinterpret_cast( + shader_out.data() + blob_position_dwords); + blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics; + blob_position_dwords = uint32_t(shader_out.size()); + blob_header.size_bytes = + (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) - + shader_out[blob_offset_position_dwords++]; + } + + // *************************************************************************** + // Container header + // *************************************************************************** + + uint32_t shader_size_bytes = uint32_t(shader_out.size() * sizeof(uint32_t)); + { + auto& container_header = + *reinterpret_cast(shader_out.data()); + container_header.InitializeIdentification(); + container_header.size_bytes = shader_size_bytes; + container_header.blob_count = kBlobCount; + CalculateDXBCChecksum( + reinterpret_cast(shader_out.data()), + static_cast(shader_size_bytes), + reinterpret_cast(&container_header.hash)); + } +} + +const std::vector& PipelineCache::GetGeometryShader( + GeometryShaderKey key) { + auto it = geometry_shaders_.find(key); + if (it != geometry_shaders_.end()) { + return it->second; + } + std::vector shader; + CreateDxbcGeometryShader(key, shader); + return geometry_shaders_.emplace(key, std::move(shader)).first->second; +} + ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( const PipelineRuntimeDescription& runtime_description) { const PipelineDescription& description = runtime_description.description; @@ -1739,23 +2865,6 @@ ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( assert_unhandled_case(primitive_topology_type); return nullptr; } - switch (description.geometry_shader) { - case PipelineGeometryShader::kPointList: - state_desc.GS.pShaderBytecode = shaders::primitive_point_list_gs; - state_desc.GS.BytecodeLength = sizeof(shaders::primitive_point_list_gs); - break; - case PipelineGeometryShader::kRectangleList: - state_desc.GS.pShaderBytecode = shaders::primitive_rectangle_list_gs; - state_desc.GS.BytecodeLength = - sizeof(shaders::primitive_rectangle_list_gs); - break; - case PipelineGeometryShader::kQuadList: - state_desc.GS.pShaderBytecode = shaders::primitive_quad_list_gs; - state_desc.GS.BytecodeLength = sizeof(shaders::primitive_quad_list_gs); - break; - default: - break; - } } else { state_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH; xenos::TessellationMode tessellation_mode = xenos::TessellationMode( @@ -1864,6 +2973,14 @@ ID3D12PipelineState* PipelineCache::CreateD3D12Pipeline( } } + // Geometry shader. + if (runtime_description.geometry_shader != nullptr) { + state_desc.GS.pShaderBytecode = runtime_description.geometry_shader->data(); + state_desc.GS.BytecodeLength = + sizeof(*runtime_description.geometry_shader->data()) * + runtime_description.geometry_shader->size(); + } + // Rasterizer state. state_desc.RasterizerState.FillMode = description.fill_mode_wireframe ? D3D12_FILL_MODE_WIREFRAME diff --git a/src/xenia/gpu/d3d12/pipeline_cache.h b/src/xenia/gpu/d3d12/pipeline_cache.h index 74ea0c9e0..f60dff1f6 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.h +++ b/src/xenia/gpu/d3d12/pipeline_cache.h @@ -2,7 +2,7 @@ ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** - * Copyright 2018 Ben Vanik. All rights reserved. * + * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,7 @@ #include #include +#include "xenia/base/assert.h" #include "xenia/base/hash.h" #include "xenia/base/platform.h" #include "xenia/base/string_buffer.h" @@ -230,9 +232,37 @@ class PipelineCache { ID3D12RootSignature* root_signature; D3D12Shader::D3D12Translation* vertex_shader; D3D12Shader::D3D12Translation* pixel_shader; + const std::vector* geometry_shader; PipelineDescription description; }; + union GeometryShaderKey { + uint32_t key; + struct { + PipelineGeometryShader type : 2; + uint32_t interpolator_count : 5; + uint32_t user_clip_plane_count : 3; + uint32_t user_clip_plane_cull : 1; + uint32_t has_vertex_kill_and : 1; + uint32_t has_point_size : 1; + uint32_t has_point_coordinates : 1; + }; + + GeometryShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); } + + struct Hasher { + size_t operator()(const GeometryShaderKey& key) const { + return std::hash{}(key.key); + } + }; + bool operator==(const GeometryShaderKey& other_key) const { + return key == other_key.key; + } + bool operator!=(const GeometryShaderKey& other_key) const { + return !(*this == other_key); + } + }; + D3D12Shader* LoadShader(xenos::ShaderType shader_type, const uint32_t* host_address, uint32_t dword_count, uint64_t data_hash); @@ -257,6 +287,12 @@ class PipelineCache { const uint32_t* bound_depth_and_color_render_target_formats, PipelineRuntimeDescription& runtime_description_out); + static bool GetGeometryShaderKey(PipelineGeometryShader geometry_shader_type, + GeometryShaderKey& key_out); + static void CreateDxbcGeometryShader(GeometryShaderKey key, + std::vector& shader_out); + const std::vector& GetGeometryShader(GeometryShaderKey key); + ID3D12PipelineState* CreateD3D12Pipeline( const PipelineRuntimeDescription& runtime_description); @@ -302,6 +338,11 @@ class PipelineCache { xe::hash::IdentityHasher> bindless_sampler_layout_map_; + // Geometry shaders for Xenos primitive types not supported by Direct3D 12. + std::unordered_map, + GeometryShaderKey::Hasher> + geometry_shaders_; + // Empty depth-only pixel shader for writing to depth buffer via ROV when no // Xenos pixel shader provided. std::vector depth_only_pixel_shader_; diff --git a/src/xenia/gpu/dxbc.h b/src/xenia/gpu/dxbc.h index 5d5cb9f27..2c9f5eeab 100644 --- a/src/xenia/gpu/dxbc.h +++ b/src/xenia/gpu/dxbc.h @@ -166,11 +166,11 @@ struct alignas(uint32_t) BlobHeader { // In order of appearance in a container. kResourceDefinition = MakeFourCC('R', 'D', 'E', 'F'), kInputSignature = MakeFourCC('I', 'S', 'G', 'N'), - kInputSignature11_1 = MakeFourCC('I', 'S', 'G', '1'), + kInputSignature_11_1 = MakeFourCC('I', 'S', 'G', '1'), kPatchConstantSignature = MakeFourCC('P', 'C', 'S', 'G'), kOutputSignature = MakeFourCC('O', 'S', 'G', 'N'), kOutputSignatureForGS = MakeFourCC('O', 'S', 'G', '5'), - kOutputSignature11_1 = MakeFourCC('O', 'S', 'G', '1'), + kOutputSignature_11_1 = MakeFourCC('O', 'S', 'G', '1'), kShaderEx = MakeFourCC('S', 'H', 'E', 'X'), kShaderFeatureInfo = MakeFourCC('S', 'F', 'I', '0'), kStatistics = MakeFourCC('S', 'T', 'A', 'T'), @@ -522,7 +522,7 @@ static_assert_size(SignatureParameterForGS, sizeof(uint32_t) * 7); // D3D11_INTERNALSHADER_PARAMETER_11_1 // Extends SignatureParameterForGS, see it for more information. -struct alignas(uint32_t) SignatureParameter11_1 { +struct alignas(uint32_t) SignatureParameter_11_1 { uint32_t stream; uint32_t semantic_name_ptr; uint32_t semantic_index; @@ -536,7 +536,7 @@ struct alignas(uint32_t) SignatureParameter11_1 { }; MinPrecision min_precision; }; -static_assert_size(SignatureParameter11_1, sizeof(uint32_t) * 8); +static_assert_size(SignatureParameter_11_1, sizeof(uint32_t) * 8); // D3D10_INTERNALSHADER_SIGNATURE struct alignas(uint32_t) Signature { @@ -1527,6 +1527,10 @@ constexpr uint32_t OpcodeToken(Opcode opcode, uint32_t operands_length, (extended_opcode_count ? (uint32_t(1) << 31) : 0); } +constexpr uint32_t GetOpcodeTokenInstructionLength(uint32_t opcode_token) { + return (opcode_token >> 24) & ((UINT32_C(1) << 7) - 1); +} + constexpr uint32_t SampleControlsExtendedOpcodeToken(int32_t aoffimmi_u, int32_t aoffimmi_v, int32_t aoffimmi_w, @@ -2049,11 +2053,15 @@ class Assembler { operand.Write(code_, false, 0b1111, false, true); code_.push_back(space); } + // In geometry shaders, only kPointList, kLineStrip and kTriangleStrip are + // allowed. void OpDclOutputTopology(PrimitiveTopology output_topology) { code_.push_back(OpcodeToken(Opcode::kDclOutputTopology, 0) | (uint32_t(output_topology) << 11)); stat_.gs_output_topology = output_topology; } + // In geometry shaders, only kPoint, kLine, kTriangle, kLineWithAdjacency and + // kTriangleWithAdjacency are allowed. void OpDclInputPrimitive(Primitive input_primitive) { code_.push_back(OpcodeToken(Opcode::kDclInputPrimitive, 0) | (uint32_t(input_primitive) << 11)); @@ -2194,6 +2202,9 @@ class Assembler { code_.push_back(OpcodeToken(Opcode::kEmitThenCutStream, operands_length)); stream.Write(code_); ++stat_.instruction_count; + // TODO(Triang3l): Verify if the instruction counts should be incremented + // this way (haven't been able to obtain this from FXC because it generates + // separate emit_stream and cut_stream, at least for Shader Model 5.1). ++stat_.emit_instruction_count; ++stat_.cut_instruction_count; } diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index 2d89d541b..ec2017185 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -130,16 +130,16 @@ union alignas(uint32_t) SQ_CONTEXT_MISC { uint32_t sc_output_screen_xy : 1; // +1 xenos::SampleControl sc_sample_cntl : 2; // +2 uint32_t : 4; // +4 - // Pixel shader interpolator (according to the XNA microcode compiler - + // Pixel shader interpolator (according to the XNA microcode validator - // limited to the interpolator count, 16, not the total register count of // 64) index to write pixel parameters to. // See https://portal.unifiedpatents.com/ptab/case/IPR2015-00325 Exhibit // 2039 R400 Sequencer Specification 2.11 (a significantly early version of // the specification, however) section 19.2 "Sprites/ XY screen coordinates/ // FB information" for additional details. - // * |XY| - position on screen (vPos - the XNA microcode compiler translates - // ps_3_0 vPos directly to this, so at least in Direct3D 9 pixel center - // mode, this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the + // * |XY| - position on screen (vPos - the XNA assembler translates ps_3_0 + // vPos directly to this, so at least in Direct3D 9 pixel center mode, + // this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the // Freedreno IRC that it's .0 even in OpenGL: // https://dri.freedesktop.org/~cbrill/dri-log/?channel=freedreno&date=2020-04-19 // According to the actual usage, in the final version of the hardware, diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h deleted file mode 100644 index 530c45ecd..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_point_list_gs.h +++ /dev/null @@ -1,1540 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// Buffer Definitions: -// -// cbuffer xe_system_cbuffer -// { -// -// uint xe_flags; // Offset: 0 Size: 4 [unused] -// float2 xe_tessellation_factor_range;// Offset: 4 Size: 8 [unused] -// uint xe_line_loop_closing_index; // Offset: 12 Size: 4 [unused] -// uint xe_vertex_index_endian; // Offset: 16 Size: 4 [unused] -// uint xe_vertex_index_offset; // Offset: 20 Size: 4 [unused] -// uint2 xe_vertex_index_min_max; // Offset: 24 Size: 8 [unused] -// float4 xe_user_clip_planes[6]; // Offset: 32 Size: 96 [unused] -// float3 xe_ndc_scale; // Offset: 128 Size: 12 [unused] -// float xe_point_vertex_diameter_min;// Offset: 140 Size: 4 [unused] -// float3 xe_ndc_offset; // Offset: 144 Size: 12 [unused] -// float xe_point_vertex_diameter_max;// Offset: 156 Size: 4 [unused] -// float2 xe_point_constant_diameter; // Offset: 160 Size: 8 -// float2 xe_point_screen_diameter_to_ndc_radius;// Offset: 168 Size: 8 -// uint xe_interpolator_sampling_pattern;// Offset: 176 Size: 4 [unused] -// uint xe_ps_param_gen; // Offset: 180 Size: 4 [unused] -// uint2 xe_sample_count_log2; // Offset: 184 Size: 8 [unused] -// uint4 xe_texture_swizzled_signs[2];// Offset: 192 Size: 32 [unused] -// uint xe_textures_resolved; // Offset: 224 Size: 4 [unused] -// float xe_alpha_test_reference; // Offset: 228 Size: 4 [unused] -// uint xe_alpha_to_mask; // Offset: 232 Size: 4 [unused] -// uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset: 236 Size: 4 [unused] -// float4 xe_color_exp_bias; // Offset: 240 Size: 16 [unused] -// float2 xe_edram_poly_offset_front; // Offset: 256 Size: 8 [unused] -// float2 xe_edram_poly_offset_back; // Offset: 264 Size: 8 [unused] -// uint xe_edram_depth_base_dwords_scaled;// Offset: 272 Size: 4 [unused] -// uint4 xe_edram_stencil[2]; // Offset: 288 Size: 32 [unused] -// uint4 xe_edram_rt_base_dwords_scaled;// Offset: 320 Size: 16 [unused] -// uint4 xe_edram_rt_format_flags; // Offset: 336 Size: 16 [unused] -// float4 xe_edram_rt_clamp[4]; // Offset: 352 Size: 64 [unused] -// uint4 xe_edram_rt_keep_mask[2]; // Offset: 416 Size: 32 [unused] -// uint4 xe_edram_rt_blend_factors_ops;// Offset: 448 Size: 16 [unused] -// float4 xe_edram_blend_constant; // Offset: 464 Size: 16 [unused] -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim ID HLSL Bind Count -// ------------------------------ ---------- ------- ----------- ------- -------------- ------ -// xe_system_cbuffer cbuffer NA NA CB0 cb0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float z -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float z -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_constantbuffer CB0[0:0][11], immediateIndexed, space=0 -dcl_input v[1][0].xyzw -dcl_input v[1][1].xyzw -dcl_input v[1][2].xyzw -dcl_input v[1][3].xyzw -dcl_input v[1][4].xyzw -dcl_input v[1][5].xyzw -dcl_input v[1][6].xyzw -dcl_input v[1][7].xyzw -dcl_input v[1][8].xyzw -dcl_input v[1][9].xyzw -dcl_input v[1][10].xyzw -dcl_input v[1][11].xyzw -dcl_input v[1][12].xyzw -dcl_input v[1][13].xyzw -dcl_input v[1][14].xyzw -dcl_input v[1][15].xyzw -dcl_input v[1][16].xyz -dcl_input_siv v[1][17].xyzw, position -dcl_input v[1][18].xyzw -dcl_input v[1][19].xy -dcl_input v[1][19].z -dcl_temps 3 -dcl_inputprimitive point -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 4 -lt [precise(x)] r0.x, v[0][19].z, l(0.000000) -ne [precise] r1.xyzw, v[0][17].xyzw, v[0][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -if_nz r0.x - ret -endif -ge [precise(x)] r0.x, v[0][16].z, l(0.000000) -movc [precise(xy)] r0.xy, r0.xxxx, v[0][16].zzzz, CB0[0][10].xyxx -lt [precise(zw)] r0.zw, l(0.000000, 0.000000, 0.000000, 0.000000), r0.xxxy -and [precise(z)] r0.z, r0.w, r0.z -if_z r0.z - ret -endif -mul [precise(xy)] r0.xy, r0.xyxx, CB0[0][10].zwzz -mul [precise(xy)] r0.xy, r0.xyxx, v[0][17].wwww -mov [precise(xyz)] r1.xyz, -r0.xxyx -mov [precise(w)] r1.w, r0.y -add [precise] r2.xyzw, r1.xwyz, v[0][17].xyxy -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(0,0,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r2.xyxx -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(0,1.000000,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r2.zwzz -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -add [precise(yw)] r0.yw, r0.xxxy, v[0][17].xxxy -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(1.000000,0,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r0.ywyy -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov [precise(z)] r0.z, r1.z -add [precise(xy)] r0.xy, r0.xzxx, v[0][17].xyxx -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xy, l(1.000000,1.000000,0,0) -mov o16.z, v[0][16].z -mov o17.xy, r0.xyxx -mov o17.zw, v[0][17].zzzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 117 instruction slots used -#endif - -const BYTE primitive_point_list_gs[] = -{ - 68, 88, 66, 67, 189, 205, - 170, 40, 149, 167, 183, 76, - 207, 160, 219, 147, 216, 124, - 203, 93, 1, 0, 0, 0, - 148, 29, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 228, 10, 0, 0, 36, 13, - 0, 0, 140, 15, 0, 0, - 248, 28, 0, 0, 82, 68, - 69, 70, 168, 10, 0, 0, - 1, 0, 0, 0, 120, 0, - 0, 0, 1, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 126, 10, 0, 0, 19, 19, - 68, 37, 60, 0, 0, 0, - 24, 0, 0, 0, 40, 0, - 0, 0, 40, 0, 0, 0, - 36, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 100, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 120, 101, - 95, 115, 121, 115, 116, 101, - 109, 95, 99, 98, 117, 102, - 102, 101, 114, 0, 171, 171, - 100, 0, 0, 0, 32, 0, - 0, 0, 144, 0, 0, 0, - 224, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 144, 5, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 196, 5, - 0, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 12, 6, 0, 0, - 12, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 39, 6, 0, 0, 16, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 62, 6, - 0, 0, 20, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 85, 6, 0, 0, - 24, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 116, 6, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 152, 6, 0, 0, 32, 0, - 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 180, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 216, 6, - 0, 0, 128, 0, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 236, 6, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 16, 7, 0, 0, - 140, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 52, 7, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 88, 7, 0, 0, 144, 0, - 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 236, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 102, 7, - 0, 0, 156, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 52, 7, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 131, 7, 0, 0, - 160, 0, 0, 0, 8, 0, - 0, 0, 2, 0, 0, 0, - 232, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 158, 7, 0, 0, 168, 0, - 0, 0, 8, 0, 0, 0, - 2, 0, 0, 0, 232, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 197, 7, - 0, 0, 176, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 230, 7, 0, 0, - 180, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 246, 7, 0, 0, 184, 0, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 116, 6, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 11, 8, - 0, 0, 192, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 44, 8, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 80, 8, 0, 0, - 224, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 101, 8, 0, 0, 228, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 52, 7, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 125, 8, - 0, 0, 232, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 160, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 142, 8, 0, 0, - 236, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 160, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 182, 8, 0, 0, 240, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 200, 8, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 236, 8, - 0, 0, 0, 1, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 232, 5, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 7, 9, 0, 0, - 8, 1, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 232, 5, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 33, 9, 0, 0, 16, 1, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 160, 5, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 67, 9, - 0, 0, 32, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 84, 9, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 120, 9, 0, 0, - 64, 1, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 152, 9, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 188, 9, 0, 0, 80, 1, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 213, 9, - 0, 0, 96, 1, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 232, 9, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 12, 10, 0, 0, - 160, 1, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 36, 10, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 72, 10, 0, 0, 192, 1, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 152, 9, - 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 102, 10, - 0, 0, 208, 1, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 200, 8, 0, 0, - 0, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 120, 101, 95, 102, - 108, 97, 103, 115, 0, 100, - 119, 111, 114, 100, 0, 171, - 0, 0, 19, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 153, 5, 0, 0, - 120, 101, 95, 116, 101, 115, - 115, 101, 108, 108, 97, 116, - 105, 111, 110, 95, 102, 97, - 99, 116, 111, 114, 95, 114, - 97, 110, 103, 101, 0, 102, - 108, 111, 97, 116, 50, 0, - 1, 0, 3, 0, 1, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 225, 5, 0, 0, - 120, 101, 95, 108, 105, 110, - 101, 95, 108, 111, 111, 112, - 95, 99, 108, 111, 115, 105, - 110, 103, 95, 105, 110, 100, - 101, 120, 0, 120, 101, 95, - 118, 101, 114, 116, 101, 120, - 95, 105, 110, 100, 101, 120, - 95, 101, 110, 100, 105, 97, - 110, 0, 120, 101, 95, 118, - 101, 114, 116, 101, 120, 95, - 105, 110, 100, 101, 120, 95, - 111, 102, 102, 115, 101, 116, - 0, 120, 101, 95, 118, 101, - 114, 116, 101, 120, 95, 105, - 110, 100, 101, 120, 95, 109, - 105, 110, 95, 109, 97, 120, - 0, 117, 105, 110, 116, 50, - 0, 171, 1, 0, 19, 0, - 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 6, - 0, 0, 120, 101, 95, 117, - 115, 101, 114, 95, 99, 108, - 105, 112, 95, 112, 108, 97, - 110, 101, 115, 0, 102, 108, - 111, 97, 116, 52, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 172, 6, 0, 0, - 120, 101, 95, 110, 100, 99, - 95, 115, 99, 97, 108, 101, - 0, 102, 108, 111, 97, 116, - 51, 0, 1, 0, 3, 0, - 1, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 229, 6, - 0, 0, 120, 101, 95, 112, - 111, 105, 110, 116, 95, 118, - 101, 114, 116, 101, 120, 95, - 100, 105, 97, 109, 101, 116, - 101, 114, 95, 109, 105, 110, - 0, 102, 108, 111, 97, 116, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 45, 7, - 0, 0, 120, 101, 95, 110, - 100, 99, 95, 111, 102, 102, - 115, 101, 116, 0, 120, 101, - 95, 112, 111, 105, 110, 116, - 95, 118, 101, 114, 116, 101, - 120, 95, 100, 105, 97, 109, - 101, 116, 101, 114, 95, 109, - 97, 120, 0, 120, 101, 95, - 112, 111, 105, 110, 116, 95, - 99, 111, 110, 115, 116, 97, - 110, 116, 95, 100, 105, 97, - 109, 101, 116, 101, 114, 0, - 120, 101, 95, 112, 111, 105, - 110, 116, 95, 115, 99, 114, - 101, 101, 110, 95, 100, 105, - 97, 109, 101, 116, 101, 114, - 95, 116, 111, 95, 110, 100, - 99, 95, 114, 97, 100, 105, - 117, 115, 0, 120, 101, 95, - 105, 110, 116, 101, 114, 112, - 111, 108, 97, 116, 111, 114, - 95, 115, 97, 109, 112, 108, - 105, 110, 103, 95, 112, 97, - 116, 116, 101, 114, 110, 0, - 120, 101, 95, 112, 115, 95, - 112, 97, 114, 97, 109, 95, - 103, 101, 110, 0, 120, 101, - 95, 115, 97, 109, 112, 108, - 101, 95, 99, 111, 117, 110, - 116, 95, 108, 111, 103, 50, - 0, 120, 101, 95, 116, 101, - 120, 116, 117, 114, 101, 95, - 115, 119, 105, 122, 122, 108, - 101, 100, 95, 115, 105, 103, - 110, 115, 0, 117, 105, 110, - 116, 52, 0, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 37, 8, 0, 0, 120, 101, - 95, 116, 101, 120, 116, 117, - 114, 101, 115, 95, 114, 101, - 115, 111, 108, 118, 101, 100, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 101, - 115, 116, 95, 114, 101, 102, - 101, 114, 101, 110, 99, 101, - 0, 120, 101, 95, 97, 108, - 112, 104, 97, 95, 116, 111, - 95, 109, 97, 115, 107, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 51, 50, 98, - 112, 112, 95, 116, 105, 108, - 101, 95, 112, 105, 116, 99, - 104, 95, 100, 119, 111, 114, - 100, 115, 95, 115, 99, 97, - 108, 101, 100, 0, 120, 101, - 95, 99, 111, 108, 111, 114, - 95, 101, 120, 112, 95, 98, - 105, 97, 115, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 112, 111, 108, 121, 95, - 111, 102, 102, 115, 101, 116, - 95, 102, 114, 111, 110, 116, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 112, 111, - 108, 121, 95, 111, 102, 102, - 115, 101, 116, 95, 98, 97, - 99, 107, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 100, 101, 112, 116, 104, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 120, 101, 95, 101, 100, - 114, 97, 109, 95, 115, 116, - 101, 110, 99, 105, 108, 0, - 1, 0, 19, 0, 1, 0, - 4, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 37, 8, 0, 0, - 120, 101, 95, 101, 100, 114, - 97, 109, 95, 114, 116, 95, - 98, 97, 115, 101, 95, 100, - 119, 111, 114, 100, 115, 95, - 115, 99, 97, 108, 101, 100, - 0, 171, 1, 0, 19, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 37, 8, - 0, 0, 120, 101, 95, 101, - 100, 114, 97, 109, 95, 114, - 116, 95, 102, 111, 114, 109, - 97, 116, 95, 102, 108, 97, - 103, 115, 0, 120, 101, 95, - 101, 100, 114, 97, 109, 95, - 114, 116, 95, 99, 108, 97, - 109, 112, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 172, 6, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 107, 101, - 101, 112, 95, 109, 97, 115, - 107, 0, 171, 171, 1, 0, - 19, 0, 1, 0, 4, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 37, 8, 0, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 114, 116, 95, 98, 108, - 101, 110, 100, 95, 102, 97, - 99, 116, 111, 114, 115, 95, - 111, 112, 115, 0, 120, 101, - 95, 101, 100, 114, 97, 109, - 95, 98, 108, 101, 110, 100, - 95, 99, 111, 110, 115, 116, - 97, 110, 116, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 49, 48, 46, - 49, 0, 171, 171, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 4, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 4, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 100, 13, 0, 0, 81, 0, - 2, 0, 89, 3, 0, 0, - 106, 8, 0, 1, 89, 0, - 0, 7, 70, 142, 48, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 5, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 11, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 1, 0, 0, 0, 14, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 95, 0, 0, 4, 114, 16, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 97, 0, - 0, 5, 242, 16, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 95, 0, - 0, 4, 50, 16, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 95, 0, 0, 4, - 66, 16, 32, 0, 1, 0, - 0, 0, 19, 0, 0, 0, - 104, 0, 0, 2, 3, 0, - 0, 0, 93, 8, 0, 1, - 143, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 92, 40, 0, 1, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 2, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 3, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 4, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 5, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 6, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 7, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 8, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 9, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 10, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 11, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 12, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 13, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 14, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 15, 0, 0, 0, 101, 0, - 0, 3, 114, 32, 16, 0, - 16, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 18, 0, - 0, 0, 2, 0, 0, 0, - 103, 0, 0, 4, 50, 32, - 16, 0, 19, 0, 0, 0, - 2, 0, 0, 0, 94, 0, - 0, 2, 4, 0, 0, 0, - 49, 0, 8, 8, 18, 0, - 16, 0, 0, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 21, 0, 0, 1, 29, 0, - 8, 8, 18, 0, 16, 0, - 0, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, - 55, 0, 24, 12, 50, 0, - 16, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 166, 26, 32, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 70, 128, 48, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 49, 0, 96, 10, 194, 0, - 16, 0, 0, 0, 0, 0, - 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 6, 4, 16, 0, - 0, 0, 0, 0, 1, 0, - 32, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 31, 0, 0, 3, - 42, 0, 16, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 21, 0, 0, 1, 56, 0, - 24, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 230, 138, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 56, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 246, 31, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 56, 6, 114, 0, - 16, 0, 1, 0, 0, 0, - 6, 1, 16, 128, 65, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 64, 5, 130, 0, - 16, 0, 1, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 120, 8, - 242, 0, 16, 0, 2, 0, - 0, 0, 198, 9, 16, 0, - 1, 0, 0, 0, 70, 20, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 8, 50, 32, 16, 0, - 16, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 66, 32, - 16, 0, 16, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 17, 0, 0, 0, - 70, 0, 16, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 194, 32, 16, 0, 17, 0, - 0, 0, 166, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 18, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 18, 0, - 0, 0, 54, 0, 0, 6, - 50, 32, 16, 0, 19, 0, - 0, 0, 70, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 3, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 4, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 6, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 7, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 9, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 10, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 11, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 12, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 13, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 13, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 14, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 15, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 54, 0, 0, 8, - 50, 32, 16, 0, 16, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 66, 32, 16, 0, - 16, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 230, 10, - 16, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 194, 32, - 16, 0, 17, 0, 0, 0, - 166, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 0, 0, 80, 8, 162, 0, - 16, 0, 0, 0, 0, 0, - 6, 4, 16, 0, 0, 0, - 0, 0, 6, 20, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 3, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 4, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 6, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 7, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 9, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 10, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 10, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 11, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 12, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 13, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 13, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 14, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 15, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 54, 0, 0, 8, - 50, 32, 16, 0, 16, 0, - 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 66, 32, 16, 0, - 16, 0, 0, 0, 42, 16, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 5, 50, 32, 16, 0, - 17, 0, 0, 0, 214, 5, - 16, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 194, 32, - 16, 0, 17, 0, 0, 0, - 166, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 32, 5, 66, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 1, 0, - 0, 0, 0, 0, 24, 8, - 50, 0, 16, 0, 0, 0, - 0, 0, 134, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 8, 50, 32, 16, 0, - 16, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 66, 32, - 16, 0, 16, 0, 0, 0, - 42, 16, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 17, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 194, 32, 16, 0, 17, 0, - 0, 0, 166, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 18, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 18, 0, - 0, 0, 54, 0, 0, 6, - 50, 32, 16, 0, 19, 0, - 0, 0, 70, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 118, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 148, 0, - 0, 0, 117, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 3, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 -}; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h deleted file mode 100644 index e349a4f47..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_quad_list_gs.h +++ /dev/null @@ -1,886 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_input v[4][0].xyzw -dcl_input v[4][1].xyzw -dcl_input v[4][2].xyzw -dcl_input v[4][3].xyzw -dcl_input v[4][4].xyzw -dcl_input v[4][5].xyzw -dcl_input v[4][6].xyzw -dcl_input v[4][7].xyzw -dcl_input v[4][8].xyzw -dcl_input v[4][9].xyzw -dcl_input v[4][10].xyzw -dcl_input v[4][11].xyzw -dcl_input v[4][12].xyzw -dcl_input v[4][13].xyzw -dcl_input v[4][14].xyzw -dcl_input v[4][15].xyzw -dcl_input v[4][16].xyz -dcl_input_siv v[4][17].xyzw, position -dcl_input v[4][18].xyzw -dcl_input v[4][19].xy -dcl_input v[4][19].z -dcl_inputprimitive lineadj -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 4 -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xyz, v[0][16].xyzx -mov o17.xyzw, v[0][17].xyzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[1][0].xyzw -mov o1.xyzw, v[1][1].xyzw -mov o2.xyzw, v[1][2].xyzw -mov o3.xyzw, v[1][3].xyzw -mov o4.xyzw, v[1][4].xyzw -mov o5.xyzw, v[1][5].xyzw -mov o6.xyzw, v[1][6].xyzw -mov o7.xyzw, v[1][7].xyzw -mov o8.xyzw, v[1][8].xyzw -mov o9.xyzw, v[1][9].xyzw -mov o10.xyzw, v[1][10].xyzw -mov o11.xyzw, v[1][11].xyzw -mov o12.xyzw, v[1][12].xyzw -mov o13.xyzw, v[1][13].xyzw -mov o14.xyzw, v[1][14].xyzw -mov o15.xyzw, v[1][15].xyzw -mov o16.xyz, v[1][16].xyzx -mov o17.xyzw, v[1][17].xyzw -mov o18.xyzw, v[1][18].xyzw -mov o19.xy, v[1][19].xyxx -emit_stream m0 -mov o0.xyzw, v[3][0].xyzw -mov o1.xyzw, v[3][1].xyzw -mov o2.xyzw, v[3][2].xyzw -mov o3.xyzw, v[3][3].xyzw -mov o4.xyzw, v[3][4].xyzw -mov o5.xyzw, v[3][5].xyzw -mov o6.xyzw, v[3][6].xyzw -mov o7.xyzw, v[3][7].xyzw -mov o8.xyzw, v[3][8].xyzw -mov o9.xyzw, v[3][9].xyzw -mov o10.xyzw, v[3][10].xyzw -mov o11.xyzw, v[3][11].xyzw -mov o12.xyzw, v[3][12].xyzw -mov o13.xyzw, v[3][13].xyzw -mov o14.xyzw, v[3][14].xyzw -mov o15.xyzw, v[3][15].xyzw -mov o16.xyz, v[3][16].xyzx -mov o17.xyzw, v[3][17].xyzw -mov o18.xyzw, v[3][18].xyzw -mov o19.xy, v[3][19].xyxx -emit_stream m0 -mov o0.xyzw, v[2][0].xyzw -mov o1.xyzw, v[2][1].xyzw -mov o2.xyzw, v[2][2].xyzw -mov o3.xyzw, v[2][3].xyzw -mov o4.xyzw, v[2][4].xyzw -mov o5.xyzw, v[2][5].xyzw -mov o6.xyzw, v[2][6].xyzw -mov o7.xyzw, v[2][7].xyzw -mov o8.xyzw, v[2][8].xyzw -mov o9.xyzw, v[2][9].xyzw -mov o10.xyzw, v[2][10].xyzw -mov o11.xyzw, v[2][11].xyzw -mov o12.xyzw, v[2][12].xyzw -mov o13.xyzw, v[2][13].xyzw -mov o14.xyzw, v[2][14].xyzw -mov o15.xyzw, v[2][15].xyzw -mov o16.xyz, v[2][16].xyzx -mov o17.xyzw, v[2][17].xyzw -mov o18.xyzw, v[2][18].xyzw -mov o19.xy, v[2][19].xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 86 instruction slots used -#endif - -const BYTE primitive_quad_list_gs[] = -{ - 68, 88, 66, 67, 26, 143, - 179, 72, 238, 147, 43, 130, - 37, 11, 116, 191, 138, 68, - 255, 76, 1, 0, 0, 0, - 36, 16, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 160, 0, 0, 0, 224, 2, - 0, 0, 72, 5, 0, 0, - 136, 15, 0, 0, 82, 68, - 69, 70, 100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 60, 0, 0, 0, 19, 19, - 68, 37, 60, 0, 0, 0, - 24, 0, 0, 0, 40, 0, - 0, 0, 40, 0, 0, 0, - 36, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 49, - 48, 46, 49, 0, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 7, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 0, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 56, 10, 0, 0, 81, 0, - 2, 0, 142, 2, 0, 0, - 106, 8, 0, 1, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 3, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 5, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 6, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 7, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 8, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 9, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 10, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 11, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 12, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 13, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 4, 0, 0, 0, - 14, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 4, 0, 0, 0, 15, 0, - 0, 0, 95, 0, 0, 4, - 114, 16, 32, 0, 4, 0, - 0, 0, 16, 0, 0, 0, - 97, 0, 0, 5, 242, 16, - 32, 0, 4, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 4, 0, - 0, 0, 18, 0, 0, 0, - 95, 0, 0, 4, 50, 16, - 32, 0, 4, 0, 0, 0, - 19, 0, 0, 0, 95, 0, - 0, 4, 66, 16, 32, 0, - 4, 0, 0, 0, 19, 0, - 0, 0, 93, 48, 0, 1, - 143, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 92, 40, 0, 1, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 2, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 3, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 4, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 5, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 6, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 7, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 8, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 9, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 10, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 11, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 12, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 13, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 14, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 15, 0, 0, 0, 101, 0, - 0, 3, 114, 32, 16, 0, - 16, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 18, 0, - 0, 0, 2, 0, 0, 0, - 103, 0, 0, 4, 50, 32, - 16, 0, 19, 0, 0, 0, - 2, 0, 0, 0, 94, 0, - 0, 2, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 0, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 1, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 1, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 3, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 2, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 3, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 5, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 6, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 7, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 8, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 9, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 9, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 10, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 11, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 11, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 12, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 12, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 13, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 14, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 14, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 15, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 15, 0, 0, 0, - 54, 0, 0, 6, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 18, 32, 0, 2, 0, - 0, 0, 16, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 17, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 17, 0, 0, 0, - 54, 0, 0, 6, 242, 32, - 16, 0, 18, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 18, 0, 0, 0, - 54, 0, 0, 6, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 16, 32, 0, 2, 0, - 0, 0, 19, 0, 0, 0, - 117, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 118, 0, 0, 3, 0, 0, - 17, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 148, 0, 0, 0, - 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 41, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; diff --git a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h b/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h deleted file mode 100644 index 4c078e6ed..000000000 --- a/src/xenia/gpu/shaders/bytecode/d3d12_5_1/primitive_rectangle_list_gs.h +++ /dev/null @@ -1,2145 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// SV_CullDistance 0 z 19 CULLDST float z -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// TEXCOORD 0 xyzw 0 NONE float xyzw -// TEXCOORD 1 xyzw 1 NONE float xyzw -// TEXCOORD 2 xyzw 2 NONE float xyzw -// TEXCOORD 3 xyzw 3 NONE float xyzw -// TEXCOORD 4 xyzw 4 NONE float xyzw -// TEXCOORD 5 xyzw 5 NONE float xyzw -// TEXCOORD 6 xyzw 6 NONE float xyzw -// TEXCOORD 7 xyzw 7 NONE float xyzw -// TEXCOORD 8 xyzw 8 NONE float xyzw -// TEXCOORD 9 xyzw 9 NONE float xyzw -// TEXCOORD 10 xyzw 10 NONE float xyzw -// TEXCOORD 11 xyzw 11 NONE float xyzw -// TEXCOORD 12 xyzw 12 NONE float xyzw -// TEXCOORD 13 xyzw 13 NONE float xyzw -// TEXCOORD 14 xyzw 14 NONE float xyzw -// TEXCOORD 15 xyzw 15 NONE float xyzw -// TEXCOORD 16 xyz 16 NONE float xyz -// SV_Position 0 xyzw 17 POS float xyzw -// SV_ClipDistance 0 xyzw 18 CLIPDST float xyzw -// SV_ClipDistance 1 xy 19 CLIPDST float xy -// -gs_5_1 -dcl_globalFlags refactoringAllowed -dcl_input v[3][0].xyzw -dcl_input v[3][1].xyzw -dcl_input v[3][2].xyzw -dcl_input v[3][3].xyzw -dcl_input v[3][4].xyzw -dcl_input v[3][5].xyzw -dcl_input v[3][6].xyzw -dcl_input v[3][7].xyzw -dcl_input v[3][8].xyzw -dcl_input v[3][9].xyzw -dcl_input v[3][10].xyzw -dcl_input v[3][11].xyzw -dcl_input v[3][12].xyzw -dcl_input v[3][13].xyzw -dcl_input v[3][14].xyzw -dcl_input v[3][15].xyzw -dcl_input v[3][16].xyz -dcl_input_siv v[3][17].xyzw, position -dcl_input v[3][18].xyzw -dcl_input v[3][19].xy -dcl_input v[3][19].z -dcl_temps 20 -dcl_inputprimitive triangle -dcl_stream m0 -dcl_outputtopology trianglestrip -dcl_output o0.xyzw -dcl_output o1.xyzw -dcl_output o2.xyzw -dcl_output o3.xyzw -dcl_output o4.xyzw -dcl_output o5.xyzw -dcl_output o6.xyzw -dcl_output o7.xyzw -dcl_output o8.xyzw -dcl_output o9.xyzw -dcl_output o10.xyzw -dcl_output o11.xyzw -dcl_output o12.xyzw -dcl_output o13.xyzw -dcl_output o14.xyzw -dcl_output o15.xyzw -dcl_output o16.xyz -dcl_output_siv o17.xyzw, position -dcl_output_siv o18.xyzw, clip_distance -dcl_output_siv o19.xy, clip_distance -dcl_maxout 6 -max [precise(x)] r0.x, v[1][19].z, v[0][19].z -max [precise(x)] r0.x, r0.x, v[2][19].z -lt [precise(x)] r0.x, r0.x, l(0.000000) -ne [precise] r1.xyzw, v[0][17].xyzw, v[0][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -ne [precise] r1.xyzw, v[1][17].xyzw, v[1][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -ne [precise] r1.xyzw, v[2][17].xyzw, v[2][17].xyzw -or [precise(yz)] r0.yz, r1.zzwz, r1.xxyx -or [precise(y)] r0.y, r0.z, r0.y -or [precise(x)] r0.x, r0.y, r0.x -if_nz r0.x - ret -endif -mov o0.xyzw, v[0][0].xyzw -mov o1.xyzw, v[0][1].xyzw -mov o2.xyzw, v[0][2].xyzw -mov o3.xyzw, v[0][3].xyzw -mov o4.xyzw, v[0][4].xyzw -mov o5.xyzw, v[0][5].xyzw -mov o6.xyzw, v[0][6].xyzw -mov o7.xyzw, v[0][7].xyzw -mov o8.xyzw, v[0][8].xyzw -mov o9.xyzw, v[0][9].xyzw -mov o10.xyzw, v[0][10].xyzw -mov o11.xyzw, v[0][11].xyzw -mov o12.xyzw, v[0][12].xyzw -mov o13.xyzw, v[0][13].xyzw -mov o14.xyzw, v[0][14].xyzw -mov o15.xyzw, v[0][15].xyzw -mov o16.xyz, v[0][16].xyzx -mov o17.xyzw, v[0][17].xyzw -mov o18.xyzw, v[0][18].xyzw -mov o19.xy, v[0][19].xyxx -emit_stream m0 -mov o0.xyzw, v[1][0].xyzw -mov o1.xyzw, v[1][1].xyzw -mov o2.xyzw, v[1][2].xyzw -mov o3.xyzw, v[1][3].xyzw -mov o4.xyzw, v[1][4].xyzw -mov o5.xyzw, v[1][5].xyzw -mov o6.xyzw, v[1][6].xyzw -mov o7.xyzw, v[1][7].xyzw -mov o8.xyzw, v[1][8].xyzw -mov o9.xyzw, v[1][9].xyzw -mov o10.xyzw, v[1][10].xyzw -mov o11.xyzw, v[1][11].xyzw -mov o12.xyzw, v[1][12].xyzw -mov o13.xyzw, v[1][13].xyzw -mov o14.xyzw, v[1][14].xyzw -mov o15.xyzw, v[1][15].xyzw -mov o16.xyz, v[1][16].xyzx -mov o17.xyzw, v[1][17].xyzw -mov o18.xyzw, v[1][18].xyzw -mov o19.xy, v[1][19].xyxx -emit_stream m0 -mov o0.xyzw, v[2][0].xyzw -mov o1.xyzw, v[2][1].xyzw -mov o2.xyzw, v[2][2].xyzw -mov o3.xyzw, v[2][3].xyzw -mov o4.xyzw, v[2][4].xyzw -mov o5.xyzw, v[2][5].xyzw -mov o6.xyzw, v[2][6].xyzw -mov o7.xyzw, v[2][7].xyzw -mov o8.xyzw, v[2][8].xyzw -mov o9.xyzw, v[2][9].xyzw -mov o10.xyzw, v[2][10].xyzw -mov o11.xyzw, v[2][11].xyzw -mov o12.xyzw, v[2][12].xyzw -mov o13.xyzw, v[2][13].xyzw -mov o14.xyzw, v[2][14].xyzw -mov o15.xyzw, v[2][15].xyzw -mov o16.xyz, v[2][16].xyzx -mov o17.xyzw, v[2][17].xyzw -mov o18.xyzw, v[2][18].xyzw -mov o19.xy, v[2][19].xyxx -emit_stream m0 -cut_stream m0 -add [precise(xyz)] r0.xyz, -v[0][17].xyzx, v[1][17].xyzx -add [precise(xyz)] r1.xyz, -v[0][17].xyzx, v[2][17].xyzx -add [precise(xyz)] r2.xyz, -v[1][17].xyzx, v[2][17].xyzx -dp3 [precise(x)] r0.x, r0.xyzx, r0.xyzx -dp3 [precise(y)] r0.y, r1.xyzx, r1.xyzx -dp3 [precise(z)] r0.z, r2.xyzx, r2.xyzx -lt [precise(w)] r0.w, r0.x, r0.z -lt [precise(x)] r1.x, r0.y, r0.z -and [precise(w)] r0.w, r0.w, r1.x -if_nz r0.w - mov o0.xyzw, v[2][0].xyzw - mov o1.xyzw, v[2][1].xyzw - mov o2.xyzw, v[2][2].xyzw - mov o3.xyzw, v[2][3].xyzw - mov o4.xyzw, v[2][4].xyzw - mov o5.xyzw, v[2][5].xyzw - mov o6.xyzw, v[2][6].xyzw - mov o7.xyzw, v[2][7].xyzw - mov o8.xyzw, v[2][8].xyzw - mov o9.xyzw, v[2][9].xyzw - mov o10.xyzw, v[2][10].xyzw - mov o11.xyzw, v[2][11].xyzw - mov o12.xyzw, v[2][12].xyzw - mov o13.xyzw, v[2][13].xyzw - mov o14.xyzw, v[2][14].xyzw - mov o15.xyzw, v[2][15].xyzw - mov o16.xyz, v[2][16].xyzx - mov o17.xyzw, v[2][17].xyzw - mov o18.xyzw, v[2][18].xyzw - mov o19.xy, v[2][19].xyxx - emit_stream m0 - mov o0.xyzw, v[1][0].xyzw - mov o1.xyzw, v[1][1].xyzw - mov o2.xyzw, v[1][2].xyzw - mov o3.xyzw, v[1][3].xyzw - mov o4.xyzw, v[1][4].xyzw - mov o5.xyzw, v[1][5].xyzw - mov o6.xyzw, v[1][6].xyzw - mov o7.xyzw, v[1][7].xyzw - mov o8.xyzw, v[1][8].xyzw - mov o9.xyzw, v[1][9].xyzw - mov o10.xyzw, v[1][10].xyzw - mov o11.xyzw, v[1][11].xyzw - mov o12.xyzw, v[1][12].xyzw - mov o13.xyzw, v[1][13].xyzw - mov o14.xyzw, v[1][14].xyzw - mov o15.xyzw, v[1][15].xyzw - mov o16.xyz, v[1][16].xyzx - mov o17.xyzw, v[1][17].xyzw - mov o18.xyzw, v[1][18].xyzw - mov o19.xy, v[1][19].xyxx - emit_stream m0 - mov [precise(xyz)] r0.xyz, l(1.000000,1.000000,-1.000000,0) -else - lt [precise(x)] r0.x, r0.x, r0.y - lt [precise(y)] r0.y, r0.z, r0.y - and [precise(x)] r0.x, r0.y, r0.x - if_nz r0.x - mov o0.xyzw, v[0][0].xyzw - mov o1.xyzw, v[0][1].xyzw - mov o2.xyzw, v[0][2].xyzw - mov o3.xyzw, v[0][3].xyzw - mov o4.xyzw, v[0][4].xyzw - mov o5.xyzw, v[0][5].xyzw - mov o6.xyzw, v[0][6].xyzw - mov o7.xyzw, v[0][7].xyzw - mov o8.xyzw, v[0][8].xyzw - mov o9.xyzw, v[0][9].xyzw - mov o10.xyzw, v[0][10].xyzw - mov o11.xyzw, v[0][11].xyzw - mov o12.xyzw, v[0][12].xyzw - mov o13.xyzw, v[0][13].xyzw - mov o14.xyzw, v[0][14].xyzw - mov o15.xyzw, v[0][15].xyzw - mov o16.xyz, v[0][16].xyzx - mov o17.xyzw, v[0][17].xyzw - mov o18.xyzw, v[0][18].xyzw - mov o19.xy, v[0][19].xyxx - emit_stream m0 - mov o0.xyzw, v[2][0].xyzw - mov o1.xyzw, v[2][1].xyzw - mov o2.xyzw, v[2][2].xyzw - mov o3.xyzw, v[2][3].xyzw - mov o4.xyzw, v[2][4].xyzw - mov o5.xyzw, v[2][5].xyzw - mov o6.xyzw, v[2][6].xyzw - mov o7.xyzw, v[2][7].xyzw - mov o8.xyzw, v[2][8].xyzw - mov o9.xyzw, v[2][9].xyzw - mov o10.xyzw, v[2][10].xyzw - mov o11.xyzw, v[2][11].xyzw - mov o12.xyzw, v[2][12].xyzw - mov o13.xyzw, v[2][13].xyzw - mov o14.xyzw, v[2][14].xyzw - mov o15.xyzw, v[2][15].xyzw - mov o16.xyz, v[2][16].xyzx - mov o17.xyzw, v[2][17].xyzw - mov o18.xyzw, v[2][18].xyzw - mov o19.xy, v[2][19].xyxx - emit_stream m0 - mov [precise(xy)] r0.xy, l(-1.000000,1.000000,0,0) - else - mov o0.xyzw, v[1][0].xyzw - mov o1.xyzw, v[1][1].xyzw - mov o2.xyzw, v[1][2].xyzw - mov o3.xyzw, v[1][3].xyzw - mov o4.xyzw, v[1][4].xyzw - mov o5.xyzw, v[1][5].xyzw - mov o6.xyzw, v[1][6].xyzw - mov o7.xyzw, v[1][7].xyzw - mov o8.xyzw, v[1][8].xyzw - mov o9.xyzw, v[1][9].xyzw - mov o10.xyzw, v[1][10].xyzw - mov o11.xyzw, v[1][11].xyzw - mov o12.xyzw, v[1][12].xyzw - mov o13.xyzw, v[1][13].xyzw - mov o14.xyzw, v[1][14].xyzw - mov o15.xyzw, v[1][15].xyzw - mov o16.xyz, v[1][16].xyzx - mov o17.xyzw, v[1][17].xyzw - mov o18.xyzw, v[1][18].xyzw - mov o19.xy, v[1][19].xyxx - emit_stream m0 - mov o0.xyzw, v[0][0].xyzw - mov o1.xyzw, v[0][1].xyzw - mov o2.xyzw, v[0][2].xyzw - mov o3.xyzw, v[0][3].xyzw - mov o4.xyzw, v[0][4].xyzw - mov o5.xyzw, v[0][5].xyzw - mov o6.xyzw, v[0][6].xyzw - mov o7.xyzw, v[0][7].xyzw - mov o8.xyzw, v[0][8].xyzw - mov o9.xyzw, v[0][9].xyzw - mov o10.xyzw, v[0][10].xyzw - mov o11.xyzw, v[0][11].xyzw - mov o12.xyzw, v[0][12].xyzw - mov o13.xyzw, v[0][13].xyzw - mov o14.xyzw, v[0][14].xyzw - mov o15.xyzw, v[0][15].xyzw - mov o16.xyz, v[0][16].xyzx - mov o17.xyzw, v[0][17].xyzw - mov o18.xyzw, v[0][18].xyzw - mov o19.xy, v[0][19].xyxx - emit_stream m0 - mov [precise(xy)] r0.xy, l(1.000000,-1.000000,0,0) - endif - mov [precise(z)] r0.z, l(1.000000) -endif -mul r1.xyzw, r0.xxxx, v[1][0].xyzw -mad r1.xyzw, r0.zzzz, v[0][0].xyzw, r1.xyzw -mad r1.xyzw, r0.yyyy, v[2][0].xyzw, r1.xyzw -mul r2.xyzw, r0.xxxx, v[1][1].xyzw -mad r2.xyzw, r0.zzzz, v[0][1].xyzw, r2.xyzw -mad r2.xyzw, r0.yyyy, v[2][1].xyzw, r2.xyzw -mul r3.xyzw, r0.xxxx, v[1][2].xyzw -mad r3.xyzw, r0.zzzz, v[0][2].xyzw, r3.xyzw -mad r3.xyzw, r0.yyyy, v[2][2].xyzw, r3.xyzw -mul r4.xyzw, r0.xxxx, v[1][3].xyzw -mad r4.xyzw, r0.zzzz, v[0][3].xyzw, r4.xyzw -mad r4.xyzw, r0.yyyy, v[2][3].xyzw, r4.xyzw -mul r5.xyzw, r0.xxxx, v[1][4].xyzw -mad r5.xyzw, r0.zzzz, v[0][4].xyzw, r5.xyzw -mad r5.xyzw, r0.yyyy, v[2][4].xyzw, r5.xyzw -mul r6.xyzw, r0.xxxx, v[1][5].xyzw -mad r6.xyzw, r0.zzzz, v[0][5].xyzw, r6.xyzw -mad r6.xyzw, r0.yyyy, v[2][5].xyzw, r6.xyzw -mul r7.xyzw, r0.xxxx, v[1][6].xyzw -mad r7.xyzw, r0.zzzz, v[0][6].xyzw, r7.xyzw -mad r7.xyzw, r0.yyyy, v[2][6].xyzw, r7.xyzw -mul r8.xyzw, r0.xxxx, v[1][7].xyzw -mad r8.xyzw, r0.zzzz, v[0][7].xyzw, r8.xyzw -mad r8.xyzw, r0.yyyy, v[2][7].xyzw, r8.xyzw -mul r9.xyzw, r0.xxxx, v[1][8].xyzw -mad r9.xyzw, r0.zzzz, v[0][8].xyzw, r9.xyzw -mad r9.xyzw, r0.yyyy, v[2][8].xyzw, r9.xyzw -mul r10.xyzw, r0.xxxx, v[1][9].xyzw -mad r10.xyzw, r0.zzzz, v[0][9].xyzw, r10.xyzw -mad r10.xyzw, r0.yyyy, v[2][9].xyzw, r10.xyzw -mul r11.xyzw, r0.xxxx, v[1][10].xyzw -mad r11.xyzw, r0.zzzz, v[0][10].xyzw, r11.xyzw -mad r11.xyzw, r0.yyyy, v[2][10].xyzw, r11.xyzw -mul r12.xyzw, r0.xxxx, v[1][11].xyzw -mad r12.xyzw, r0.zzzz, v[0][11].xyzw, r12.xyzw -mad r12.xyzw, r0.yyyy, v[2][11].xyzw, r12.xyzw -mul r13.xyzw, r0.xxxx, v[1][12].xyzw -mad r13.xyzw, r0.zzzz, v[0][12].xyzw, r13.xyzw -mad r13.xyzw, r0.yyyy, v[2][12].xyzw, r13.xyzw -mul r14.xyzw, r0.xxxx, v[1][13].xyzw -mad r14.xyzw, r0.zzzz, v[0][13].xyzw, r14.xyzw -mad r14.xyzw, r0.yyyy, v[2][13].xyzw, r14.xyzw -mul r15.xyzw, r0.xxxx, v[1][14].xyzw -mad r15.xyzw, r0.zzzz, v[0][14].xyzw, r15.xyzw -mad r15.xyzw, r0.yyyy, v[2][14].xyzw, r15.xyzw -mul r16.xyzw, r0.xxxx, v[1][15].xyzw -mad r16.xyzw, r0.zzzz, v[0][15].xyzw, r16.xyzw -mad r16.xyzw, r0.yyyy, v[2][15].xyzw, r16.xyzw -mul r17.xyz, r0.xxxx, v[1][16].xyzx -mad r17.xyz, r0.zzzz, v[0][16].xyzx, r17.xyzx -mad r17.xyz, r0.yyyy, v[2][16].xyzx, r17.xyzx -mul [precise] r18.xyzw, r0.zzzz, v[0][17].xyzw -mul [precise] r19.xyzw, r0.xxxx, v[1][17].xyzw -add [precise] r18.xyzw, r18.xyzw, r19.xyzw -mul [precise] r19.xyzw, r0.yyyy, v[2][17].xyzw -add [precise] r18.xyzw, r18.xyzw, r19.xyzw -mul r19.xyzw, r0.xxxx, v[1][18].xyzw -mad r19.xyzw, r0.zzzz, v[0][18].xyzw, r19.xyzw -mad r19.xyzw, r0.yyyy, v[2][18].xyzw, r19.xyzw -mul r0.xw, r0.xxxx, v[1][19].xxxy -mad r0.xz, r0.zzzz, v[0][19].xxyx, r0.xxwx -mad r0.xy, r0.yyyy, v[2][19].xyxx, r0.xzxx -mov o0.xyzw, r1.xyzw -mov o1.xyzw, r2.xyzw -mov o2.xyzw, r3.xyzw -mov o3.xyzw, r4.xyzw -mov o4.xyzw, r5.xyzw -mov o5.xyzw, r6.xyzw -mov o6.xyzw, r7.xyzw -mov o7.xyzw, r8.xyzw -mov o8.xyzw, r9.xyzw -mov o9.xyzw, r10.xyzw -mov o10.xyzw, r11.xyzw -mov o11.xyzw, r12.xyzw -mov o12.xyzw, r13.xyzw -mov o13.xyzw, r14.xyzw -mov o14.xyzw, r15.xyzw -mov o15.xyzw, r16.xyzw -mov o16.xyz, r17.xyzx -mov o17.xyzw, r18.xyzw -mov o18.xyzw, r19.xyzw -mov o19.xy, r0.xyxx -emit_stream m0 -cut_stream m0 -ret -// Approximately 315 instruction slots used -#endif - -const BYTE primitive_rectangle_list_gs[] = -{ - 68, 88, 66, 67, 84, 207, - 1, 11, 213, 109, 28, 213, - 94, 110, 135, 167, 112, 243, - 154, 30, 1, 0, 0, 0, - 68, 40, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, - 160, 0, 0, 0, 224, 2, - 0, 0, 72, 5, 0, 0, - 168, 39, 0, 0, 82, 68, - 69, 70, 100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 1, 5, - 83, 71, 0, 5, 0, 0, - 60, 0, 0, 0, 19, 19, - 68, 37, 60, 0, 0, 0, - 24, 0, 0, 0, 40, 0, - 0, 0, 40, 0, 0, 0, - 36, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 49, - 48, 46, 49, 0, 73, 83, - 71, 78, 56, 2, 0, 0, - 21, 0, 0, 0, 8, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 4, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 9, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 9, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 13, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 13, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 15, 15, - 0, 0, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 16, 0, 0, 0, 7, 7, - 0, 0, 9, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 18, 0, 0, 0, 15, 15, - 0, 0, 21, 2, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 3, 3, - 0, 0, 37, 2, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 4, 4, - 0, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 83, - 86, 95, 67, 108, 105, 112, - 68, 105, 115, 116, 97, 110, - 99, 101, 0, 83, 86, 95, - 67, 117, 108, 108, 68, 105, - 115, 116, 97, 110, 99, 101, - 0, 171, 171, 171, 79, 83, - 71, 53, 96, 2, 0, 0, - 20, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 5, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, - 0, 0, 56, 2, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 56, 2, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 56, 2, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 7, 8, 0, 0, 0, 0, - 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 77, 2, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 18, 0, - 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 77, 2, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 19, 0, 0, 0, - 3, 12, 0, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 83, 86, 95, 67, 108, - 105, 112, 68, 105, 115, 116, - 97, 110, 99, 101, 0, 171, - 171, 171, 83, 72, 69, 88, - 88, 34, 0, 0, 81, 0, - 2, 0, 150, 8, 0, 0, - 106, 8, 0, 1, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 3, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 5, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 6, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 7, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 9, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 10, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 11, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 13, 0, 0, 0, - 95, 0, 0, 4, 242, 16, - 32, 0, 3, 0, 0, 0, - 14, 0, 0, 0, 95, 0, - 0, 4, 242, 16, 32, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 95, 0, 0, 4, - 114, 16, 32, 0, 3, 0, - 0, 0, 16, 0, 0, 0, - 97, 0, 0, 5, 242, 16, - 32, 0, 3, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 95, 0, 0, 4, - 242, 16, 32, 0, 3, 0, - 0, 0, 18, 0, 0, 0, - 95, 0, 0, 4, 50, 16, - 32, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 95, 0, - 0, 4, 66, 16, 32, 0, - 3, 0, 0, 0, 19, 0, - 0, 0, 104, 0, 0, 2, - 20, 0, 0, 0, 93, 24, - 0, 1, 143, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 92, 40, 0, 1, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 2, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 3, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 4, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 5, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 6, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 7, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 8, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 9, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 10, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 11, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 12, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 13, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 14, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 15, 0, 0, 0, - 101, 0, 0, 3, 114, 32, - 16, 0, 16, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 17, 0, 0, 0, - 1, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 18, 0, 0, 0, 2, 0, - 0, 0, 103, 0, 0, 4, - 50, 32, 16, 0, 19, 0, - 0, 0, 2, 0, 0, 0, - 94, 0, 0, 2, 6, 0, - 0, 0, 52, 0, 8, 9, - 18, 0, 16, 0, 0, 0, - 0, 0, 42, 16, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 42, 16, 32, 0, - 0, 0, 0, 0, 19, 0, - 0, 0, 52, 0, 8, 8, - 18, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 49, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 57, 0, 120, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 17, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 17, 0, - 0, 0, 60, 0, 48, 7, - 98, 0, 16, 0, 0, 0, - 0, 0, 166, 11, 16, 0, - 1, 0, 0, 0, 6, 1, - 16, 0, 1, 0, 0, 0, - 60, 0, 16, 7, 34, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 60, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, - 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 21, 0, 0, 1, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 118, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, - 56, 10, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 128, 65, 0, 0, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 70, 18, 32, 0, - 1, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 56, 10, - 114, 0, 16, 0, 1, 0, - 0, 0, 70, 18, 32, 128, - 65, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, - 70, 18, 32, 0, 2, 0, - 0, 0, 17, 0, 0, 0, - 0, 0, 56, 10, 114, 0, - 16, 0, 2, 0, 0, 0, - 70, 18, 32, 128, 65, 0, - 0, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 16, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 16, 0, 16, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, - 16, 0, 32, 7, 66, 0, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 2, 0, - 0, 0, 70, 2, 16, 0, - 2, 0, 0, 0, 49, 0, - 64, 7, 130, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, - 0, 0, 49, 0, 8, 7, - 18, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 0, - 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, - 1, 0, 64, 7, 130, 0, - 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 31, 0, - 4, 3, 58, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 56, 8, 114, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, - 128, 191, 0, 0, 0, 0, - 18, 0, 0, 1, 49, 0, - 8, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 49, 0, 16, 7, - 34, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, - 1, 0, 8, 7, 18, 0, - 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 2, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 191, - 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 18, 0, 0, 1, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 1, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 1, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 2, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 4, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 5, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 7, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 8, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 10, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 11, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 13, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 14, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 54, 0, - 0, 6, 114, 32, 16, 0, - 16, 0, 0, 0, 70, 18, - 32, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 17, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 54, 0, - 0, 6, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 54, 0, - 0, 6, 50, 32, 16, 0, - 19, 0, 0, 0, 70, 16, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 117, 0, - 0, 3, 0, 0, 17, 0, - 0, 0, 0, 0, 54, 0, - 24, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 128, 63, - 0, 0, 128, 191, 0, 0, - 0, 0, 0, 0, 0, 0, - 21, 0, 0, 1, 54, 0, - 32, 5, 66, 0, 16, 0, - 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, - 21, 0, 0, 1, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 2, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 2, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 3, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 3, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 70, 14, - 16, 0, 3, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 3, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 4, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 70, 14, 16, 0, - 4, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 4, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 70, 14, 16, 0, 4, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 5, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 5, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 5, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 70, 14, - 16, 0, 5, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 6, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 6, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 70, 14, - 16, 0, 6, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 6, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 7, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 6, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 7, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 6, 0, - 0, 0, 70, 14, 16, 0, - 7, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 7, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 6, 0, 0, 0, - 70, 14, 16, 0, 7, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 8, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 7, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 8, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 8, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 8, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 7, 0, 0, 0, 70, 14, - 16, 0, 8, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 9, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 9, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 70, 14, - 16, 0, 9, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 9, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 70, 14, 16, 0, - 9, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 10, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 9, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 10, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 9, 0, - 0, 0, 70, 14, 16, 0, - 10, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 10, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 9, 0, 0, 0, - 70, 14, 16, 0, 10, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 11, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 10, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 11, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, - 70, 14, 16, 0, 11, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 11, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 70, 14, - 16, 0, 11, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 12, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 11, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 12, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 70, 14, - 16, 0, 12, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 12, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 11, 0, - 0, 0, 70, 14, 16, 0, - 12, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 13, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 13, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 12, 0, - 0, 0, 70, 14, 16, 0, - 13, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 13, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 12, 0, 0, 0, - 70, 14, 16, 0, 13, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 14, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 14, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 13, 0, 0, 0, - 70, 14, 16, 0, 14, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 14, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 13, 0, 0, 0, 70, 14, - 16, 0, 14, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 15, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 1, 0, 0, 0, 14, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 15, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 70, 14, - 16, 0, 15, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 15, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 2, 0, 0, 0, 14, 0, - 0, 0, 70, 14, 16, 0, - 15, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 16, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 1, 0, - 0, 0, 15, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 16, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 70, 14, 16, 0, - 16, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 16, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 2, 0, - 0, 0, 15, 0, 0, 0, - 70, 14, 16, 0, 16, 0, - 0, 0, 56, 0, 0, 8, - 114, 0, 16, 0, 17, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 0, 1, 0, 0, 0, - 16, 0, 0, 0, 50, 0, - 0, 10, 114, 0, 16, 0, - 17, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 18, 32, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 70, 2, 16, 0, 17, 0, - 0, 0, 50, 0, 0, 10, - 114, 0, 16, 0, 17, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 18, - 32, 0, 2, 0, 0, 0, - 16, 0, 0, 0, 70, 2, - 16, 0, 17, 0, 0, 0, - 56, 0, 120, 8, 242, 0, - 16, 0, 18, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 30, 32, 0, - 0, 0, 0, 0, 17, 0, - 0, 0, 56, 0, 120, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 17, 0, 0, 0, 0, 0, - 120, 7, 242, 0, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 56, 0, 120, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 0, 0, - 120, 7, 242, 0, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 19, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 1, 0, 0, 0, - 18, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 19, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 30, 32, 0, 0, 0, - 0, 0, 18, 0, 0, 0, - 70, 14, 16, 0, 19, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 19, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 30, - 32, 0, 2, 0, 0, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 19, 0, 0, 0, - 56, 0, 0, 8, 146, 0, - 16, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 6, 20, 32, 0, - 1, 0, 0, 0, 19, 0, - 0, 0, 50, 0, 0, 10, - 82, 0, 16, 0, 0, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 6, 17, - 32, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 6, 3, - 16, 0, 0, 0, 0, 0, - 50, 0, 0, 10, 50, 0, - 16, 0, 0, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 16, 32, 0, - 2, 0, 0, 0, 19, 0, - 0, 0, 134, 0, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 2, 0, - 0, 0, 70, 14, 16, 0, - 3, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 3, 0, 0, 0, 70, 14, - 16, 0, 4, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 4, 0, 0, 0, - 70, 14, 16, 0, 5, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 5, 0, - 0, 0, 70, 14, 16, 0, - 6, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 6, 0, 0, 0, 70, 14, - 16, 0, 7, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 8, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 8, 0, - 0, 0, 70, 14, 16, 0, - 9, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 9, 0, 0, 0, 70, 14, - 16, 0, 10, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 10, 0, 0, 0, - 70, 14, 16, 0, 11, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 11, 0, - 0, 0, 70, 14, 16, 0, - 12, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 12, 0, 0, 0, 70, 14, - 16, 0, 13, 0, 0, 0, - 54, 0, 0, 5, 242, 32, - 16, 0, 13, 0, 0, 0, - 70, 14, 16, 0, 14, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 14, 0, - 0, 0, 70, 14, 16, 0, - 15, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 15, 0, 0, 0, 70, 14, - 16, 0, 16, 0, 0, 0, - 54, 0, 0, 5, 114, 32, - 16, 0, 16, 0, 0, 0, - 70, 2, 16, 0, 17, 0, - 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 17, 0, - 0, 0, 70, 14, 16, 0, - 18, 0, 0, 0, 54, 0, - 0, 5, 242, 32, 16, 0, - 18, 0, 0, 0, 70, 14, - 16, 0, 19, 0, 0, 0, - 54, 0, 0, 5, 50, 32, - 16, 0, 19, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 117, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 118, 0, 0, 3, - 0, 0, 17, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 148, 0, - 0, 0, 59, 1, 0, 0, - 20, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, - 78, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 0, - 4, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 -}; diff --git a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl deleted file mode 100644 index b32f57fa2..000000000 --- a/src/xenia/gpu/shaders/primitive_point_list.gs.hlsl +++ /dev/null @@ -1,63 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(4)] -void main(point XeVertexPreGS xe_in[1], - inout TriangleStream xe_stream) { - // TODO(Triang3l): Handle ps_ucp_mode (transform the host clip space to the - // guest one, calculate the distances to the user clip planes, cull using the - // distance from the center for modes 0, 1 and 2, cull and clip per-vertex for - // modes 2 and 3). - if (xe_in[0].cull_distance < 0.0 || any(isnan(xe_in[0].post_gs.position))) { - return; - } - - // The vertex shader's header writes -1.0 to point_size by default, so any - // non-negative value means that it was overwritten by the translated vertex - // shader. The per-vertex diameter is already clamped in the vertex shader - // (combined with making it non-negative). - float point_vertex_diameter = xe_in[0].post_gs.pre_ps.point_parameters.z; - float2 point_screen_diameter = (point_vertex_diameter >= 0.0) - ? point_vertex_diameter - : xe_point_constant_diameter; - if (!all(point_screen_diameter > 0.0)) { - // 4D5307F1 has zero-size snowflakes, drop them quicker. - return; - } - float2 point_clip_space_radius = - point_screen_diameter * xe_point_screen_diameter_to_ndc_radius * - xe_in[0].post_gs.position.w; - - XeVertexPostGS xe_out; - xe_out.pre_ps.interpolators = xe_in[0].post_gs.pre_ps.interpolators; - xe_out.pre_ps.point_parameters.z = xe_in[0].post_gs.pre_ps.point_parameters.z; - xe_out.position.zw = xe_in[0].post_gs.position.zw; - // TODO(Triang3l): Handle ps_ucp_mode. - xe_out.clip_distance_0123 = xe_in[0].post_gs.clip_distance_0123; - xe_out.clip_distance_45 = xe_in[0].post_gs.clip_distance_45; - - // V = 0 in the top (+Y in Direct3D), 1 in the bottom, according to the - // analysis of Adreno 200 behavior (V = 1 towards -gl_FragCoord.y, the bottom, - // but the top-left rule is used for rasterization, and gl_FragCoord is - // generated from |PsParamGen.xy| via multiply-addition as opposed to just - // addition, so -gl_FragCoord.y is likely positive in screen coordinates, or - // +|PsParamGen.y|). - // TODO(Triang3l): On Vulkan, sign of Y needs to inverted because of the - // upper-left origin. - xe_out.pre_ps.point_parameters.xy = float2(0.0, 0.0); - xe_out.position.xy = - xe_in[0].post_gs.position.xy + - float2(-point_clip_space_radius.x, point_clip_space_radius.y); - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(0.0, 1.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy - point_clip_space_radius; - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(1.0, 0.0); - xe_out.position.xy = xe_in[0].post_gs.position.xy + point_clip_space_radius; - xe_stream.Append(xe_out); - xe_out.pre_ps.point_parameters.xy = float2(1.0, 1.0); - xe_out.position.xy = - xe_in[0].post_gs.position.xy + - float2(point_clip_space_radius.x, -point_clip_space_radius.y); - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -} diff --git a/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl deleted file mode 100644 index 874ee4247..000000000 --- a/src/xenia/gpu/shaders/primitive_quad_list.gs.hlsl +++ /dev/null @@ -1,23 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(4)] -void main(lineadj XeVertexPreGS xe_in[4], - inout TriangleStream xe_stream) { - // Culling should probably be done per-triangle - while there's no - // RETAIN_QUADS on Adreno 2xx, on R6xx it's always disabled for - // non-tessellated quads, so they are always decomposed into triangles. - // Therefore, not doing any cull distance or NaN position checks here. - // TODO(Triang3l): Find whether vertex killing should actually work for each - // triangle or for the entire quad. - // TODO(Triang3l): Find the correct order. - XeVertexPostGS xe_out; - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[3].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -} diff --git a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl b/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl deleted file mode 100644 index b76bb224f..000000000 --- a/src/xenia/gpu/shaders/primitive_rectangle_list.gs.hlsl +++ /dev/null @@ -1,103 +0,0 @@ -#include "xenos_draw.hlsli" - -[maxvertexcount(6)] -void main(triangle XeVertexPreGS xe_in[3], - inout TriangleStream xe_stream) { - if (max(max(xe_in[0].cull_distance, xe_in[1].cull_distance), - xe_in[2].cull_distance) < 0.0f || - any(isnan(xe_in[0].post_gs.position)) || - any(isnan(xe_in[1].post_gs.position)) || - any(isnan(xe_in[2].post_gs.position))) { - return; - } - - XeVertexPostGS xe_out; - - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); - - // Find the diagonal (the edge that is longer than both the other two) and - // mirror the other vertex across it. - float3 edge_01 = - xe_in[1].post_gs.position.xyz - xe_in[0].post_gs.position.xyz; - float3 edge_02 = - xe_in[2].post_gs.position.xyz - xe_in[0].post_gs.position.xyz; - float3 edge_12 = - xe_in[2].post_gs.position.xyz - xe_in[1].post_gs.position.xyz; - float3 edge_squares = float3( - dot(edge_01, edge_01), dot(edge_02, edge_02), dot(edge_12, edge_12)); - float3 v3_signs; - if (edge_squares.z > edge_squares.x && edge_squares.z > edge_squares.y) { - // 12 is the diagonal. Most games use this form. - // - // 0 ------ 1 0: -1,-1 - // | - | 1: 1,-1 - // | // | 2: -1, 1 - // | - | 3: [ 1, 1 ] - // 2 ----- [3] - // - // 0 ------ 2 0: -1,-1 - // | - | 1: -1, 1 - // | // | 2: 1,-1 - // | - | 3: [ 1, 1 ] - // 1 ------[3] - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(-1.0f, 1.0f, 1.0f); - } else if (edge_squares.y > edge_squares.x && - edge_squares.y > edge_squares.z) { - // 02 is the diagonal. - // - // 0 ------ 1 0: -1,-1 - // | - | 1: 1,-1 - // | \\ | 2: 1, 1 - // | - | 3: [-1, 1 ] - // [3] ----- 2 - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[2].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(1.0f, -1.0f, 1.0f); - } else { - // 01 is the diagonal. Not seen in any game so far. - // - // 0 ------ 2 0: -1,-1 - // | - | 1: 1, 1 - // | \\ | 2: 1,-1 - // | - | 3: [-1, 1 ] - // [3] ----- 1 - xe_out = xe_in[1].post_gs; - xe_stream.Append(xe_out); - xe_out = xe_in[0].post_gs; - xe_stream.Append(xe_out); - v3_signs = float3(1.0f, 1.0f, -1.0f); - } - [unroll] for (int i = 0; i < 16; ++i) { - xe_out.pre_ps.interpolators[i] = - v3_signs.x * xe_in[0].post_gs.pre_ps.interpolators[i] + - v3_signs.y * xe_in[1].post_gs.pre_ps.interpolators[i] + - v3_signs.z * xe_in[2].post_gs.pre_ps.interpolators[i]; - } - xe_out.pre_ps.point_parameters = - v3_signs.x * xe_in[0].post_gs.pre_ps.point_parameters + - v3_signs.y * xe_in[1].post_gs.pre_ps.point_parameters + - v3_signs.z * xe_in[2].post_gs.pre_ps.point_parameters; - xe_out.position = v3_signs.x * xe_in[0].post_gs.position + - v3_signs.y * xe_in[1].post_gs.position + - v3_signs.z * xe_in[2].post_gs.position; - xe_out.clip_distance_0123 = v3_signs.x * xe_in[0].post_gs.clip_distance_0123 + - v3_signs.y * xe_in[1].post_gs.clip_distance_0123 + - v3_signs.z * xe_in[2].post_gs.clip_distance_0123; - xe_out.clip_distance_45 = v3_signs.x * xe_in[0].post_gs.clip_distance_45 + - v3_signs.y * xe_in[1].post_gs.clip_distance_45 + - v3_signs.z * xe_in[2].post_gs.clip_distance_45; - xe_stream.Append(xe_out); - xe_stream.RestartStrip(); -}