From 7a851fd3f121a8d9fb3923bb0cd156f9dee0b261 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 23 Feb 2018 21:56:34 +0100 Subject: [PATCH] libADL MIDI test. It sounds awful so obviously there's still something wrong here. Definitely not usable yet. --- src/CMakeLists.txt | 10 + src/sound/adlmidi/adldata.cpp | 10492 ++++++++++++++++ src/sound/adlmidi/adldata.hh | 65 + src/sound/adlmidi/adlmidi.cpp | 869 ++ src/sound/adlmidi/adlmidi.h | 293 + src/sound/adlmidi/adlmidi.hpp | 57 + src/sound/adlmidi/adlmidi_load.cpp | 693 + src/sound/adlmidi/adlmidi_midiplay.cpp | 2672 ++++ src/sound/adlmidi/adlmidi_mus2mid.h | 49 + src/sound/adlmidi/adlmidi_opl3.cpp | 626 + src/sound/adlmidi/adlmidi_private.cpp | 83 + src/sound/adlmidi/adlmidi_private.hpp | 996 ++ src/sound/adlmidi/adlmidi_xmi2mid.h | 60 + src/sound/adlmidi/dbopl.cpp | 2045 +++ src/sound/adlmidi/dbopl.h | 314 + src/sound/adlmidi/fraction.hpp | 206 + src/sound/adlmidi/nukedopl3.c | 1391 ++ src/sound/adlmidi/nukedopl3.h | 154 + src/sound/i_musicinterns.h | 20 + .../mididevices/music_adlmidi_mididevice.cpp | 180 + src/sound/musicformats/music_midistream.cpp | 3 + 21 files changed, 21278 insertions(+) create mode 100644 src/sound/adlmidi/adldata.cpp create mode 100644 src/sound/adlmidi/adldata.hh create mode 100644 src/sound/adlmidi/adlmidi.cpp create mode 100644 src/sound/adlmidi/adlmidi.h create mode 100644 src/sound/adlmidi/adlmidi.hpp create mode 100644 src/sound/adlmidi/adlmidi_load.cpp create mode 100644 src/sound/adlmidi/adlmidi_midiplay.cpp create mode 100644 src/sound/adlmidi/adlmidi_mus2mid.h create mode 100644 src/sound/adlmidi/adlmidi_opl3.cpp create mode 100644 src/sound/adlmidi/adlmidi_private.cpp create mode 100644 src/sound/adlmidi/adlmidi_private.hpp create mode 100644 src/sound/adlmidi/adlmidi_xmi2mid.h create mode 100644 src/sound/adlmidi/dbopl.cpp create mode 100644 src/sound/adlmidi/dbopl.h create mode 100644 src/sound/adlmidi/fraction.hpp create mode 100644 src/sound/adlmidi/nukedopl3.c create mode 100644 src/sound/adlmidi/nukedopl3.h create mode 100644 src/sound/mididevices/music_adlmidi_mididevice.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 22ea7df91..10fc9250a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -835,6 +835,14 @@ set( FASTMATH_SOURCES gl/models/gl_models.cpp r_data/models/models.cpp r_data/matrix.cpp + sound/adlmidi/adldata.cpp + sound/adlmidi/adlmidi.cpp + sound/adlmidi/adlmidi_load.cpp + sound/adlmidi/adlmidi_midiplay.cpp + sound/adlmidi/adlmidi_opl3.cpp + sound/adlmidi/adlmidi_private.cpp + sound/adlmidi/dbopl.cpp + sound/adlmidi/nukedopl3.c ) @@ -1137,6 +1145,7 @@ set (PCH_SOURCES sound/i_music.cpp sound/i_sound.cpp sound/i_soundfont.cpp + sound/mididevices/music_adlmidi_mididevice.cpp sound/mididevices/music_opldumper_mididevice.cpp sound/mididevices/music_opl_mididevice.cpp sound/mididevices/music_fluidsynth_mididevice.cpp @@ -1349,6 +1358,7 @@ install(TARGETS zdoom COMPONENT "Game executable") source_group("Audio Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/.+") +source_group("Audio Files\\ADL MIDI" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound//.+") source_group("Audio Files\\OPL Synth" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/oplsynth/.+") source_group("Audio Files\\OPL Synth\\DOSBox" FILES sound/oplsynth/dosbox/opl.cpp sound/oplsynth/dosbox/opl.h) source_group("Audio Files\\Timidity" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sound/timidity/.+") diff --git a/src/sound/adlmidi/adldata.cpp b/src/sound/adlmidi/adldata.cpp new file mode 100644 index 000000000..d43f33b2f --- /dev/null +++ b/src/sound/adlmidi/adldata.cpp @@ -0,0 +1,10492 @@ +#include "adldata.hh" + +/* THIS OPL-3 FM INSTRUMENT DATA IS AUTOMATICALLY GENERATED + * FROM A NUMBER OF SOURCES, MOSTLY PC GAMES. + * PREPROCESSED, CONVERTED, AND POSTPROCESSED OFF-SCREEN. + */ +const adldata adl[4425] = +{ // ,---------+-------- Wave select settings + // | ,-------ч-+------ Sustain/release rates + // | | ,-----ч-ч-+---- Attack/decay rates + // | | | ,---ч-ч-ч-+-- AM/VIB/EG/KSR/Multiple bits + // | | | | | | | | + // | | | | | | | | ,----+-- KSL/attenuation settings + // | | | | | | | | | | ,----- Feedback/connection bits + // | | | | | | | | | | | ,----- Fine tune + + // | | | | | | | | | | | | + // | | | | | | | | | | | | + { 0x0F4F201,0x0F7F201, 0x8F,0x06, 0x8, +0 }, + { 0x0F4F201,0x0F7F201, 0x4B,0x00, 0x8, +0 }, + { 0x0F4F201,0x0F6F201, 0x49,0x00, 0x8, +0 }, + { 0x0F7F281,0x0F7F241, 0x12,0x00, 0x6, +0 }, + { 0x0F7F101,0x0F7F201, 0x57,0x00, 0x0, +0 }, + { 0x0F7F101,0x0F7F201, 0x93,0x00, 0x0, +0 }, + { 0x0F2A101,0x0F5F216, 0x80,0x0E, 0x8, +0 }, + { 0x0F8C201,0x0F8C201, 0x92,0x00, 0xA, +0 }, + { 0x0F4F60C,0x0F5F381, 0x5C,0x00, 0x0, +0 }, + { 0x0F2F307,0x0F1F211, 0x97,0x80, 0x2, +0 }, + { 0x0F45417,0x0F4F401, 0x21,0x00, 0x2, +0 }, + { 0x0F6F398,0x0F6F281, 0x62,0x00, 0x0, +0 }, + { 0x0F6F618,0x0F7E701, 0x23,0x00, 0x0, +0 }, + { 0x0F6F615,0x0F6F601, 0x91,0x00, 0x4, +0 }, + { 0x0F3D345,0x0F3A381, 0x59,0x80, 0xC, +0 }, + { 0x1F57503,0x0F5B581, 0x49,0x80, 0x4, +0 }, + { 0x014F671,0x007F131, 0x92,0x00, 0x2, +0 }, + { 0x058C772,0x008C730, 0x14,0x00, 0x2, +0 }, + { 0x018AA70,0x0088AB1, 0x44,0x00, 0x4, +0 }, + { 0x1239723,0x01455B1, 0x93,0x00, 0x4, +0 }, + { 0x1049761,0x00455B1, 0x13,0x80, 0x0, +0 }, + { 0x12A9824,0x01A46B1, 0x48,0x00, 0xC, +0 }, + { 0x1069161,0x0076121, 0x13,0x00, 0xA, +0 }, + { 0x0067121,0x00761A1, 0x13,0x89, 0x6, +0 }, + { 0x194F302,0x0C8F341, 0x9C,0x80, 0xC, +0 }, + { 0x19AF303,0x0E7F111, 0x54,0x00, 0xC, +0 }, + { 0x03AF123,0x0F8F221, 0x5F,0x00, 0x0, +0 }, + { 0x122F603,0x0F8F321, 0x87,0x80, 0x6, +0 }, + { 0x054F903,0x03AF621, 0x47,0x00, 0x0, +0 }, + { 0x1419123,0x0198421, 0x4A,0x05, 0x8, +0 }, + { 0x1199523,0x0199421, 0x4A,0x00, 0x8, +0 }, + { 0x04F2009,0x0F8D184, 0xA1,0x80, 0x8, +0 }, + { 0x0069421,0x0A6C3A2, 0x1E,0x00, 0x2, +0 }, + { 0x028F131,0x018F131, 0x12,0x00, 0xA, +0 }, + { 0x0E8F131,0x078F131, 0x8D,0x00, 0xA, +0 }, + { 0x0285131,0x0487132, 0x5B,0x00, 0xC, +0 }, + { 0x09AA101,0x0DFF221, 0x8B,0x40, 0x8, +0 }, + { 0x016A221,0x0DFA121, 0x8B,0x08, 0x8, +0 }, + { 0x0E8F431,0x078F131, 0x8B,0x00, 0xA, +0 }, + { 0x113DD31,0x0265621, 0x15,0x00, 0x8, +0 }, + { 0x113DD31,0x0066621, 0x16,0x00, 0x8, +0 }, + { 0x11CD171,0x00C6131, 0x49,0x00, 0x8, +0 }, + { 0x1127121,0x0067223, 0x4D,0x80, 0x2, +0 }, + { 0x121F1F1,0x0166FE1, 0x40,0x00, 0x2, +0 }, + { 0x175F502,0x0358501, 0x1A,0x80, 0x0, +0 }, + { 0x175F502,0x0F4F301, 0x1D,0x80, 0x0, +0 }, + { 0x105F510,0x0C3F211, 0x41,0x00, 0x2, +0 }, + { 0x125B121,0x00872A2, 0x9B,0x01, 0xE, +0 }, + { 0x1037FA1,0x1073F21, 0x98,0x00, 0x0, +0 }, + { 0x012C1A1,0x0054F61, 0x93,0x00, 0xA, +0 }, + { 0x022C121,0x0054F61, 0x18,0x00, 0xC, +0 }, + { 0x015F431,0x0058A72, 0x5B,0x83, 0x0, +0 }, + { 0x03974A1,0x0677161, 0x90,0x00, 0x0, +0 }, + { 0x0055471,0x0057A72, 0x57,0x00, 0xC, +0 }, + { 0x0635490,0x045A541, 0x00,0x00, 0x8, +0 }, + { 0x0178521,0x0098F21, 0x92,0x01, 0xC, +0 }, + { 0x0177521,0x0098F21, 0x94,0x05, 0xC, +0 }, + { 0x0157621,0x0378261, 0x94,0x00, 0xC, +0 }, + { 0x1179E31,0x12C6221, 0x43,0x00, 0x2, +0 }, + { 0x06A6121,0x00A7F21, 0x9B,0x00, 0x2, +0 }, + { 0x01F7561,0x00F7422, 0x8A,0x06, 0x8, +0 }, + { 0x15572A1,0x0187121, 0x86,0x83, 0x0, +0 }, + { 0x03C5421,0x01CA621, 0x4D,0x00, 0x8, +0 }, + { 0x1029331,0x00B7261, 0x8F,0x00, 0x8, +0 }, + { 0x1039331,0x0097261, 0x8E,0x00, 0x8, +0 }, + { 0x1039331,0x0098261, 0x91,0x00, 0xA, +0 }, + { 0x10F9331,0x00F7261, 0x8E,0x00, 0xA, +0 }, + { 0x116AA21,0x00A8F21, 0x4B,0x00, 0x8, +0 }, + { 0x1177E31,0x10C8B21, 0x90,0x00, 0x6, +0 }, + { 0x1197531,0x0196132, 0x81,0x00, 0x0, +0 }, + { 0x0219B32,0x0177221, 0x90,0x00, 0x4, +0 }, + { 0x05F85E1,0x01A65E1, 0x1F,0x00, 0x0, +0 }, + { 0x05F88E1,0x01A65E1, 0x46,0x00, 0x0, +0 }, + { 0x01F75A1,0x00A7521, 0x9C,0x00, 0x2, +0 }, + { 0x0588431,0x01A6521, 0x8B,0x00, 0x0, +0 }, + { 0x05666E1,0x02665A1, 0x4C,0x00, 0x0, +0 }, + { 0x0467662,0x03655A1, 0xCB,0x00, 0x0, +0 }, + { 0x0075762,0x00756A1, 0x99,0x00, 0xB, +0 }, + { 0x0077762,0x00776A1, 0x93,0x00, 0xB, +0 }, + { 0x203FF22,0x00FFF21, 0x59,0x00, 0x0, +0 }, + { 0x10FFF21,0x10FFF21, 0x0E,0x00, 0x0, +0 }, + { 0x0558622,0x0186421, 0x46,0x80, 0x0, +0 }, + { 0x0126621,0x00A96A1, 0x45,0x00, 0x0, +0 }, + { 0x12A9221,0x02A9122, 0x8B,0x00, 0x0, +0 }, + { 0x005DFA2,0x0076F61, 0x9E,0x40, 0x2, +0 }, + { 0x001EF20,0x2068F60, 0x1A,0x00, 0x0, +0 }, + { 0x029F121,0x009F421, 0x8F,0x80, 0xA, +0 }, + { 0x0945377,0x005A0A1, 0xA5,0x00, 0x2, +0 }, + { 0x011A861,0x00325B1, 0x1F,0x80, 0xA, +0 }, + { 0x0349161,0x0165561, 0x17,0x00, 0xC, +0 }, + { 0x0015471,0x0036A72, 0x5D,0x00, 0x0, +0 }, + { 0x0432121,0x03542A2, 0x97,0x00, 0x8, +0 }, + { 0x177A1A1,0x1473121, 0x1C,0x00, 0x0, +0 }, + { 0x0331121,0x0254261, 0x89,0x03, 0xA, +0 }, + { 0x14711A1,0x007CF21, 0x15,0x00, 0x0, +0 }, + { 0x0F6F83A,0x0028651, 0xCE,0x00, 0x2, +0 }, + { 0x1232121,0x0134121, 0x15,0x00, 0x0, +0 }, + { 0x0957406,0x072A501, 0x5B,0x00, 0x0, +0 }, + { 0x081B122,0x026F261, 0x92,0x83, 0xC, +0 }, + { 0x151F141,0x0F5F242, 0x4D,0x00, 0x0, +0 }, + { 0x1511161,0x01311A3, 0x94,0x80, 0x6, +0 }, + { 0x0311161,0x0031DA1, 0x8C,0x80, 0x6, +0 }, + { 0x173F3A4,0x0238161, 0x4C,0x00, 0x4, +0 }, + { 0x053D202,0x1F6F207, 0x85,0x03, 0x0, +0 }, + { 0x111A311,0x0E5A213, 0x0C,0x80, 0x0, +0 }, + { 0x141F611,0x2E6F211, 0x06,0x00, 0x4, +0 }, + { 0x032D493,0x111EB91, 0x91,0x00, 0x8, +0 }, + { 0x056FA04,0x005C201, 0x4F,0x00, 0xC, +0 }, + { 0x0207C21,0x10C6F22, 0x49,0x00, 0x6, +0 }, + { 0x133DD31,0x0165621, 0x85,0x00, 0xA, +0 }, + { 0x205DA20,0x00B8F21, 0x04,0x81, 0x6, +0 }, + { 0x0E5F105,0x0E5C303, 0x6A,0x80, 0x6, +0 }, + { 0x026EC07,0x016F802, 0x15,0x00, 0xA, +0 }, + { 0x0356705,0x005DF01, 0x9D,0x00, 0x8, +0 }, + { 0x028FA18,0x0E5F812, 0x96,0x00, 0xA, +0 }, + { 0x007A810,0x003FA00, 0x86,0x03, 0x6, +0 }, + { 0x247F811,0x003F310, 0x41,0x03, 0x4, +0 }, + { 0x206F101,0x002F310, 0x8E,0x00, 0xE, +0 }, + { 0x0001F0E,0x3FF1FC0, 0x00,0x00, 0xE, +0 }, + { 0x024F806,0x2845603, 0x80,0x88, 0xE, +0 }, + { 0x000F80E,0x30434D0, 0x00,0x05, 0xE, +0 }, + { 0x000F60E,0x3021FC0, 0x00,0x00, 0xE, +0 }, + { 0x0A337D5,0x03756DA, 0x95,0x40, 0x0, +0 }, + { 0x261B235,0x015F414, 0x5C,0x08, 0xA, +0 }, + { 0x000F60E,0x3F54FD0, 0x00,0x00, 0xE, +0 }, + { 0x001FF26,0x11612E4, 0x00,0x00, 0xE, +0 }, + { 0x0F0F300,0x2C9F600, 0x00,0x00, 0xE, +0 }, + { 0x277F810,0x006F311, 0x44,0x00, 0x8, +0 }, + { 0x0FFF902,0x0FFF811, 0x07,0x00, 0x8, +0 }, + { 0x205FC00,0x017FA00, 0x00,0x00, 0xE, +0 }, + { 0x007FF00,0x008FF01, 0x02,0x00, 0x0, +0 }, + { 0x00CF600,0x006F600, 0x00,0x00, 0x4, +0 }, + { 0x008F60C,0x247FB12, 0x00,0x00, 0xA, +0 }, + { 0x008F60C,0x2477B12, 0x00,0x05, 0xA, +0 }, + { 0x002F60C,0x243CB12, 0x00,0x00, 0xA, +0 }, + { 0x000F60E,0x3029FD0, 0x00,0x00, 0xE, +0 }, + { 0x042F80E,0x3E4F407, 0x08,0x4A, 0xE, +0 }, + { 0x030F50E,0x0029FD0, 0x00,0x0A, 0xE, +0 }, + { 0x3E4E40E,0x1E5F507, 0x0A,0x5D, 0x6, +0 }, + { 0x004B402,0x0F79705, 0x03,0x0A, 0xE, +0 }, + { 0x000F64E,0x3029F9E, 0x00,0x00, 0xE, +0 }, + { 0x237F811,0x005F310, 0x45,0x08, 0x8, +0 }, + { 0x303FF80,0x014FF10, 0x00,0x0D, 0xC, +0 }, + { 0x00CF506,0x008F502, 0x0B,0x00, 0x6, +0 }, + { 0x0BFFA01,0x097C802, 0x00,0x00, 0x7, +0 }, + { 0x087FA01,0x0B7FA01, 0x51,0x00, 0x6, +0 }, + { 0x08DFA01,0x0B8F802, 0x54,0x00, 0x6, +0 }, + { 0x088FA01,0x0B6F802, 0x59,0x00, 0x6, +0 }, + { 0x30AF901,0x006FA00, 0x00,0x00, 0xE, +0 }, + { 0x389F900,0x06CF600, 0x80,0x00, 0xE, +0 }, + { 0x388F803,0x0B6F60C, 0x80,0x08, 0xF, +0 }, + { 0x388F803,0x0B6F60C, 0x85,0x00, 0xF, +0 }, + { 0x04F760E,0x2187700, 0x40,0x08, 0xE, +0 }, + { 0x049C80E,0x2699B03, 0x40,0x00, 0xE, +0 }, + { 0x305ADD7,0x0058DC7, 0xDC,0x00, 0xE, +0 }, + { 0x304A8D7,0x00488C7, 0xDC,0x00, 0xE, +0 }, + { 0x306F680,0x3176711, 0x00,0x00, 0xE, +0 }, + { 0x205F580,0x3164611, 0x00,0x09, 0xE, +0 }, + { 0x0F40006,0x0F5F715, 0x3F,0x00, 0x1, +0 }, + { 0x3F40006,0x0F5F712, 0x3F,0x00, 0x0, +0 }, + { 0x0F40006,0x0F5F712, 0x3F,0x00, 0x1, +0 }, + { 0x0E76701,0x0077502, 0x58,0x00, 0x0, +0 }, + { 0x048F841,0x0057542, 0x45,0x08, 0x0, +0 }, + { 0x3F0E00A,0x005FF1E, 0x40,0x4E, 0x8, +0 }, + { 0x3F0E00A,0x002FF1E, 0x7C,0x52, 0x8, +0 }, + { 0x04A7A0E,0x21B7B00, 0x40,0x08, 0xE, +0 }, + { 0x3E4E40E,0x1395507, 0x0A,0x40, 0x6, +0 }, + { 0x332F905,0x0A5D604, 0x05,0x40, 0xE, +0 }, + { 0x3F30002,0x0F5F715, 0x3F,0x00, 0x8, +0 }, + { 0x08DFA01,0x0B5F802, 0x4F,0x00, 0x7, +0 }, + { 0x054F231,0x056F221, 0x4B,0x00, 0x8, +0 }, + { 0x03BF2B1,0x00BF361, 0x0E,0x00, 0x6, +0 }, + { 0x0E7F21C,0x0B8F201, 0x6F,0x80, 0xC, +0 }, + { 0x0E5B111,0x0B8F211, 0x9C,0x80, 0xD, +0 }, + { 0x0E7C21C,0x0B8F301, 0x3A,0x80, 0x0, +0 }, + { 0x0F5B111,0x0D8F211, 0x1B,0x80, 0x1, +0 }, + { 0x031F031,0x037F234, 0x90,0x9F, 0x8, +0 }, + { 0x451F324,0x497F211, 0x1C,0x00, 0x8, +0 }, + { 0x010A831,0x1B9D234, 0x0A,0x03, 0x6, +0 }, + { 0x0E6CE02,0x0E6F401, 0x25,0x00, 0x0, +0 }, + { 0x0E6F507,0x0E5F341, 0xA1,0x00, 0x1, +0 }, + { 0x0045617,0x004F601, 0x21,0x00, 0x2, +0 }, + { 0x055F718,0x0D8E521, 0x23,0x00, 0x0, +0 }, + { 0x0D6F90A,0x0D6F784, 0x53,0x80, 0xA, +0 }, + { 0x0A6F615,0x0E6F601, 0x91,0x00, 0xB, +0 }, + { 0x0B3D441,0x0B4C280, 0x8A,0x13, 0x4, +0 }, + { 0x082D345,0x0E3A381, 0x59,0x80, 0x5, +0 }, + { 0x1557403,0x005B381, 0x49,0x80, 0x4, +0 }, + { 0x02FA2A0,0x02FA522, 0x85,0x9E, 0x7, +0 }, + { 0x02FA5A2,0x02FA128, 0x83,0x95, 0x7, +0 }, + { 0x02A91A0,0x03AC821, 0x85,0x0B, 0x7, +0 }, + { 0x03AC620,0x05AF621, 0x81,0x80, 0x7, +0 }, + { 0x12AA6E3,0x00AAF61, 0x56,0x83, 0x8, -12 }, + { 0x00AAFE1,0x00AAF62, 0x91,0x83, 0x9, -12 }, + { 0x10BF024,0x20B5030, 0x12,0x00, 0x1, +0 }, + { 0x71A7223,0x02A7221, 0xAC,0x83, 0x0, +0 }, + { 0x41A6223,0x02A62A1, 0x22,0x00, 0x1, +0 }, + { 0x006FF25,0x005FF23, 0xA1,0x2F, 0xA, +0 }, + { 0x405FFA1,0x0096F22, 0x1F,0x80, 0xA, +0 }, + { 0x11A6223,0x02A7221, 0x19,0x80, 0xC, +0 }, + { 0x41A6223,0x02A7222, 0x1E,0x83, 0xD, +0 }, + { 0x074F302,0x0B8F341, 0x9C,0x80, 0xA, +0 }, + { 0x274D302,0x0B8D382, 0xA5,0x40, 0xB, +0 }, + { 0x2F6F234,0x0F7F231, 0x5B,0x9E, 0xC, +0 }, + { 0x0F7F223,0x0E7F111, 0xAB,0x00, 0xC, +0 }, + { 0x0FAF322,0x0FAF223, 0x53,0x66, 0xA, +0 }, + { 0x0FAC221,0x0F7C221, 0xA7,0x00, 0xA, +0 }, + { 0x022FA02,0x0F3F301, 0x4C,0x97, 0x8, +0 }, + { 0x1F3C204,0x0F7C111, 0x9D,0x00, 0x8, +0 }, + { 0x0AFC711,0x0F8F501, 0x87,0x00, 0x8, +0 }, + { 0x098C301,0x0F8C302, 0x18,0x00, 0x9, +0 }, + { 0x0F2B913,0x0119102, 0x0D,0x1A, 0xA, +0 }, + { 0x74A9221,0x02A9122, 0x8F,0x00, 0xA, +0 }, + { 0x103FF80,0x3FFF021, 0x01,0x00, 0x8, +0 }, + { 0x04F2009,0x0F8D104, 0xA1,0x80, 0x8, +0 }, + { 0x2F8F802,0x0F8F602, 0x87,0x00, 0x9, +0 }, + { 0x015A701,0x0C8A301, 0x4D,0x00, 0x2, +0 }, + { 0x0317101,0x0C87301, 0x93,0x00, 0x3, +0 }, + { 0x0E5F111,0x0E5F312, 0xA8,0x57, 0x4, +0 }, + { 0x0E5E111,0x0E6E111, 0x97,0x00, 0x4, +0 }, + { 0x0C7F001,0x027F101, 0xB3,0x16, 0x6, +0 }, + { 0x027F101,0x028F101, 0x16,0x00, 0x6, +0 }, + { 0x00C0300,0x024FA20, 0x30,0x03, 0x6, +12 }, + { 0x024F820,0x056F510, 0x12,0x00, 0x6, +0 }, + { 0x0EBF431,0x07AF131, 0x8B,0x00, 0xA, +0 }, + { 0x1C8F621,0x0C8F101, 0x1C,0x1F, 0xA, +0 }, + { 0x0425401,0x0C8F201, 0x12,0x00, 0xA, +0 }, + { 0x0035131,0x0675461, 0x1C,0x80, 0xE, +0 }, + { 0x21351A0,0x2275360, 0x98,0x01, 0xE, +0 }, + { 0x513DD31,0x0265621, 0x95,0x00, 0x8, +0 }, + { 0x1038D13,0x0866605, 0x95,0x8C, 0x9, +0 }, + { 0x243CC70,0x21774A0, 0x92,0x03, 0xE, +0 }, + { 0x007BF21,0x1076F21, 0x95,0x00, 0xF, +0 }, + { 0x515C261,0x0056FA1, 0x97,0x00, 0x6, +0 }, + { 0x08FB563,0x08FB5A5, 0x13,0x94, 0x7, +0 }, + { 0x0848523,0x0748212, 0xA7,0xA4, 0xE, +0 }, + { 0x0748202,0x0358511, 0x27,0x00, 0xE, +0 }, + { 0x0748202,0x0338411, 0x27,0x00, 0xE, +0 }, + { 0x005F511,0x0C3F212, 0x01,0x1E, 0x3, +0 }, + { 0x2036130,0x21764A0, 0x98,0x03, 0xE, +0 }, + { 0x1176561,0x0176521, 0x92,0x00, 0xF, +0 }, + { 0x2234130,0x2174460, 0x98,0x01, 0xE, +0 }, + { 0x1037FA1,0x1073F21, 0x98,0x00, 0xF, +0 }, + { 0x125B121,0x0087262, 0x9B,0x01, 0xE, +0 }, + { 0x001D3E1,0x0396262, 0xCA,0x83, 0x6, +0 }, + { 0x2197320,0x0297563, 0x22,0x02, 0xE, +0 }, + { 0x2686500,0x613C500, 0x00,0x00, 0xB, +0 }, + { 0x606C800,0x3077400, 0x00,0x00, 0xB, +0 }, + { 0x0157620,0x0378261, 0x94,0x00, 0xC, +12 }, + { 0x02661B1,0x0266171, 0xD3,0x80, 0xD, +0 }, + { 0x00B5131,0x13BB261, 0x1C,0x00, 0xE, +0 }, + { 0x0265121,0x007F021, 0x18,0x00, 0xA, +0 }, + { 0x0257221,0x00A7F21, 0x16,0x05, 0xC, +0 }, + { 0x0357A21,0x03A7A21, 0x1D,0x09, 0xD, +0 }, + { 0x035C221,0x00ACF61, 0x16,0x09, 0xE, +0 }, + { 0x04574A1,0x0087F21, 0x8A,0x00, 0xF, +0 }, + { 0x01A52A1,0x01B8F61, 0x97,0x00, 0xC, +0 }, + { 0x01A7521,0x01B8F21, 0xA1,0x00, 0xD, +0 }, + { 0x20F9331,0x00F72A1, 0x96,0x00, 0x8, +0 }, + { 0x0078521,0x1278431, 0x96,0x00, 0x9, +0 }, + { 0x1039331,0x00972A1, 0x8E,0x00, 0x8, +0 }, + { 0x006C524,0x1276431, 0xA1,0x00, 0x9, +0 }, + { 0x10693B1,0x0067271, 0x8E,0x00, 0xA, +0 }, + { 0x0088521,0x02884B1, 0x5D,0x00, 0xB, +0 }, + { 0x10F9331,0x00F7272, 0x93,0x00, 0xC, +0 }, + { 0x0068522,0x01684B1, 0x61,0x00, 0xD, +0 }, + { 0x02AA961,0x036A863, 0xA3,0x52, 0x8, +0 }, + { 0x016AA61,0x00A8F61, 0x94,0x80, 0x8, +0 }, + { 0x0297721,0x1267A33, 0x21,0x55, 0x2, +0 }, + { 0x0167AA1,0x0197A22, 0x93,0x00, 0x2, +0 }, + { 0x1077B21,0x0007F22, 0x2B,0x57, 0xA, +0 }, + { 0x0197531,0x0196172, 0x51,0x00, 0xA, +0 }, + { 0x0219B32,0x0177221, 0x90,0x00, 0x8, +0 }, + { 0x0219B32,0x0177221, 0x90,0x13, 0x9, +0 }, + { 0x029C9A4,0x0086F21, 0xA2,0x80, 0xC, +0 }, + { 0x015CAA2,0x0086F21, 0xAA,0x00, 0xD, +0 }, + { 0x0AA7724,0x0173431, 0x5B,0x00, 0xE, +0 }, + { 0x0C676A1,0x0868726, 0x0D,0x59, 0xF, +0 }, + { 0x0566622,0x02665A1, 0x56,0x00, 0xE, +0 }, + { 0x0019F26,0x0487664, 0x00,0x25, 0xE, +0 }, + { 0x0465622,0x03645A1, 0xCB,0x00, 0xF, +0 }, + { 0x11467E1,0x0175461, 0x67,0x00, 0xC, +0 }, + { 0x1146721,0x0164421, 0x6D,0x00, 0xD, +0 }, + { 0x00F4032,0x0097021, 0xDF,0x00, 0x0, +0 }, + { 0x00FFF21,0x00FFF21, 0x35,0xB7, 0x4, +0 }, + { 0x00FFF21,0x60FFF21, 0xB9,0x80, 0x4, +0 }, + { 0x00FFF21,0x00FFF21, 0x36,0x1B, 0xA, +0 }, + { 0x00FFF21,0x409CF61, 0x1D,0x00, 0xA, +0 }, + { 0x0658722,0x0186421, 0x46,0x80, 0x0, +0 }, + { 0x4F2B912,0x0119101, 0x0D,0x1A, 0xA, +0 }, + { 0x12A9221,0x02A9122, 0x99,0x00, 0xA, +0 }, + { 0x0157D61,0x01572B1, 0x40,0xA3, 0xE, +0 }, + { 0x005DFA2,0x0077F61, 0x5D,0x40, 0xF, +0 }, + { 0x001FF20,0x4068F61, 0x36,0x00, 0x8, +0 }, + { 0x00FFF21,0x4078F61, 0x27,0x00, 0x9, +0 }, + { 0x1035317,0x004F608, 0x1A,0x0D, 0x2, +0 }, + { 0x03241A1,0x0156161, 0x9D,0x00, 0x3, +0 }, + { 0x031A181,0x0032571, 0xA1,0x00, 0xB, +0 }, + { 0x0141161,0x0165561, 0x17,0x00, 0xC, +0 }, + { 0x445C361,0x025C361, 0x14,0x00, 0xD, +0 }, + { 0x021542A,0x0136A27, 0x80,0xA6, 0xE, +0 }, + { 0x0015431,0x0036A72, 0x5D,0x00, 0xF, +0 }, + { 0x0331121,0x02542A1, 0x89,0x03, 0xA, +0 }, + { 0x1471161,0x007CF21, 0x15,0x00, 0x0, +0 }, + { 0x1B1F2DE,0x0B281D1, 0x57,0x0A, 0xE, +0 }, + { 0x2322121,0x0133220, 0x8C,0x97, 0x6, +0 }, + { 0x1031121,0x0133121, 0x0E,0x00, 0x7, +0 }, + { 0x0F6F358,0x0F6F241, 0x62,0x00, 0x0, +0 }, + { 0x00F5F00,0x005FF00, 0x00,0x00, 0x0, +0 }, + { 0x03111A1,0x0031D61, 0x8C,0x80, 0x6, +0 }, + { 0x173F364,0x02381A1, 0x4C,0x00, 0x4, +0 }, + { 0x053F301,0x1F6F101, 0x46,0x80, 0x0, +0 }, + { 0x053F201,0x0F6F208, 0x43,0x40, 0x1, +0 }, + { 0x135A511,0x133A517, 0x10,0xA4, 0x0, +0 }, + { 0x141F611,0x2E5F211, 0x0D,0x00, 0x0, +0 }, + { 0x0F8F755,0x1E4F752, 0x92,0x9F, 0xE, +0 }, + { 0x0E4F341,0x1E5F351, 0x13,0x00, 0xE, +0 }, + { 0x032D493,0x111EB11, 0x91,0x00, 0x8, +0 }, + { 0x032D453,0x112EB13, 0x91,0x0D, 0x9, +0 }, + { 0x3E5F720,0x0E5F521, 0x00,0x0C, 0xD, +0 }, + { 0x0207C21,0x10C6F22, 0x09,0x09, 0x7, +0 }, + { 0x133DD02,0x0166601, 0x83,0x80, 0xB, +0 }, + { 0x0298961,0x406D8A3, 0x33,0xA4, 0x6, +0 }, + { 0x005DA21,0x00B8F22, 0x17,0x80, 0x6, +0 }, + { 0x026EC08,0x016F804, 0x15,0x00, 0xA, +0 }, + { 0x026EC07,0x016F802, 0x15,0x00, 0xB, +0 }, + { 0x024682C,0x035DF01, 0xAB,0x00, 0x0, +0 }, + { 0x0356705,0x005DF01, 0x9D,0x00, 0x1, +0 }, + { 0x0A3FD07,0x078F902, 0xC0,0x00, 0xE, +0 }, + { 0x055FC14,0x005F311, 0x8D,0x00, 0xE, +0 }, + { 0x455F811,0x0E5F410, 0x86,0x00, 0xE, +0 }, + { 0x155F311,0x0E5F410, 0x9C,0x00, 0xF, +0 }, + { 0x0001E0E,0x3FE1800, 0x00,0x00, 0xE, +0 }, + { 0x05C5F0E,0x16C870E, 0x00,0x02, 0x0, +0 }, + { 0x0F0F00E,0x0841300, 0x00,0x00, 0xE, +0 }, + { 0x0F0F000,0x0F05F0C, 0x2E,0x00, 0xE, +0 }, + { 0x061F217,0x0B4F112, 0x4F,0x0A, 0x8, +0 }, + { 0x001EFEE,0x0069FE0, 0x01,0x04, 0x6, +0 }, + { 0x001FF26,0x71612E4, 0x00,0x00, 0xE, +0 }, + { 0x0F10001,0x0F10001, 0x3F,0x3F, 0xF, +0 }, + { 0x059F200,0x000F701, 0x00,0x00, 0xE, +0 }, + { 0x0F0F301,0x6C9F601, 0x00,0x00, 0xE, +0 }, + { 0x029A100,0x0696521, 0x02,0x08, 0xE, +0 }, + { 0x29BF300,0x008F311, 0x0C,0x00, 0xE, +0 }, + { 0x068FAC0,0x377F701, 0x02,0x00, 0x2, +0 }, + { 0x0C4FA01,0x33FF600, 0x03,0x00, 0x0, +0 }, + { 0x0FFF832,0x07FF511, 0x44,0x00, 0xE, +0 }, + { 0x27AFB12,0x047F611, 0x40,0x00, 0x6, +0 }, + { 0x144F5C6,0x018F6C1, 0x5C,0x83, 0xE, +0 }, + { 0x0D0CCC0,0x028EAC1, 0x10,0x00, 0x0, +0 }, + { 0x2B7F811,0x006F311, 0x46,0x00, 0x8, +0 }, + { 0x2BAE610,0x005EA10, 0x04,0x00, 0x0, +0 }, + { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0, +0 }, + { 0x218F401,0x008F800, 0x00,0x00, 0xC, +0 }, + { 0x0F0F009,0x0F7B700, 0x0E,0x00, 0xE, +0 }, + { 0x0FEF812,0x07ED511, 0x47,0x00, 0xE, +0 }, + { 0x005F010,0x004D011, 0x25,0x80, 0xE, +0 }, + { 0x00F9F30,0x0FAE83A, 0x00,0x00, 0xE, +0 }, + { 0x0976800,0x3987802, 0x00,0x00, 0x0, +0 }, + { 0x0FBF116,0x069F911, 0x08,0x02, 0x0, +0 }, + { 0x06CF800,0x04AE80E, 0x00,0x40, 0x0, +0 }, + { 0x0F2FA25,0x09AF612, 0x1B,0x00, 0x0, +0 }, + { 0x2F5F5C5,0x005C301, 0x08,0x06, 0x1, +0 }, + { 0x257F900,0x046FB00, 0x00,0x00, 0x0, +12 }, + { 0x0FEF512,0x0FFF612, 0x11,0xA2, 0x6, +0 }, + { 0x0FFF901,0x0FFF811, 0x0F,0x00, 0x6, +0 }, + { 0x0F0F01E,0x0B6F70E, 0x00,0x00, 0xE, +0 }, + { 0x204FF82,0x015FF10, 0x00,0x06, 0xE, +0 }, + { 0x007FF00,0x008FF01, 0x02,0x00, 0xF, +0 }, + { 0x04CA800,0x13FD600, 0x0B,0x00, 0x0, +0 }, + { 0x25E980C,0x306FB0F, 0x00,0x00, 0xF, +12 }, + { 0x25E780C,0x32B8A0A, 0x00,0x80, 0xF, +12 }, + { 0x201C700,0x233F90B, 0x45,0x00, 0xE, +12 }, + { 0x04FF82E,0x3EFF521, 0x07,0x0B, 0xE, +0 }, + { 0x065F981,0x030F241, 0x00,0x00, 0xE, +0 }, + { 0x000FE46,0x055F585, 0x00,0x00, 0xE, +0 }, + { 0x0009429,0x344F904, 0x10,0x04, 0xE, +0 }, + { 0x282B2A4,0x1D49703, 0x00,0x80, 0xE, +0 }, + { 0x000F68E,0x3029F5E, 0x00,0x00, 0xE, +0 }, + { 0x152FE09,0x008F002, 0xC0,0x00, 0xE, +0 }, + { 0x055F201,0x000F441, 0x00,0x00, 0xE, +0 }, + { 0x000F301,0x0A4F48F, 0x00,0x00, 0xE, +0 }, + { 0x100FF80,0x1F7F500, 0x00,0x00, 0xC, +0 }, + { 0x05EFD2E,0x3EFF527, 0x07,0x0C, 0xE, +0 }, + { 0x256FB00,0x026FA00, 0x00,0x00, 0x4, +12 }, + { 0x256FB00,0x017F700, 0x80,0x00, 0x0, +12 }, + { 0x1779A01,0x084F700, 0x00,0x00, 0x8, +0 }, + { 0x367FD01,0x098F601, 0x00,0x00, 0x8, +12 }, + { 0x001FF0E,0x377790E, 0x00,0x02, 0xE, +0 }, + { 0x2079F20,0x22B950E, 0x1C,0x00, 0x0, +0 }, + { 0x2079F20,0x23B940E, 0x1E,0x00, 0x0, +0 }, + { 0x506F680,0x016F610, 0x00,0x00, 0xC, +0 }, + { 0x50F6F00,0x50F6F00, 0x00,0x00, 0xD, +0 }, + { 0x50F4F00,0x50F4F00, 0x00,0x00, 0xD, +0 }, + { 0x0FFEE03,0x0FFE808, 0x40,0x00, 0xC, +0 }, + { 0x060F2C5,0x07AF4D4, 0x4F,0x80, 0x8, +12 }, + { 0x160F285,0x0B7F294, 0x4F,0x80, 0x8, +12 }, + { 0x04F760F,0x2187700, 0x40,0x08, 0xE, +0 }, + { 0x332F905,0x0A6D604, 0x05,0x40, 0xE, +0 }, + { 0x332F805,0x0A67404, 0x05,0x40, 0xF, +0 }, + { 0x0F0F126,0x0F5F527, 0x44,0x40, 0x6, +0 }, + { 0x3948F03,0x06FFA15, 0x00,0x00, 0x0, +0 }, + { 0x0F0F007,0x0DC5C00, 0x00,0x00, 0xE, +0 }, + { 0x00FFF7E,0x00F3F6E, 0x00,0x00, 0xE, +0 }, + { 0x0B3FA00,0x005D000, 0x00,0x00, 0xC, +0 }, + { 0x0FFF832,0x07FF511, 0x84,0x00, 0xE, +0 }, + { 0x0089FD4,0x0089FD4, 0xC0,0xC0, 0x4, +0 }, + { 0x2F4F50E,0x424120CA, 0x00,0x51, 0x3, +0 }, + { 0x283E0C4,0x14588C0, 0x81,0x00, 0xE, +0 }, + { 0x0B0900E,0x0BF990E, 0x03,0x03, 0xA, +0 }, + { 0x0DFDCC2,0x026C9C0, 0x17,0x00, 0x0, +0 }, + { 0x0D0ACC0,0x028EAC1, 0x18,0x00, 0x0, +0 }, + { 0x0A7CDC2,0x028EAC1, 0x2B,0x02, 0x0, +0 }, + { 0x0FE6227,0x3D9950A, 0x00,0x07, 0x8, +0 }, + { 0x1199523,0x0198421, 0x48,0x00, 0x8, +0 }, + { 0x055F231,0x076F221, 0x49,0x00, 0x8, +0 }, + { 0x038F101,0x028F121, 0x57,0x00, 0x0, +0 }, + { 0x038F101,0x028F121, 0x93,0x00, 0x0, +0 }, + { 0x001A221,0x0D5F136, 0x80,0x0E, 0x8, +0 }, + { 0x0A8C201,0x058C201, 0x92,0x00, 0xA, +0 }, + { 0x054F60C,0x0B5F381, 0x5C,0x00, 0x0, +0 }, + { 0x032F607,0x011F511, 0x97,0x80, 0x2, +0 }, + { 0x0E6F318,0x0F6F281, 0x62,0x00, 0x0, +0 }, + { 0x0A6F615,0x0E6F601, 0x91,0x00, 0x4, +0 }, + { 0x082D345,0x0E3A381, 0x59,0x80, 0xC, +0 }, + { 0x122F603,0x0F3F321, 0x87,0x80, 0x6, +0 }, + { 0x09AA101,0x0DFF221, 0x89,0x40, 0x8, +0 }, + { 0x15572A1,0x0187121, 0x86,0x0D, 0x0, +0 }, + { 0x0F00010,0x0F00010, 0x3F,0x3F, 0x0, +0 }, + { 0x0F1F02E,0x3487407, 0x00,0x07, 0x8, +0 }, + { 0x0FE5229,0x3D9850E, 0x00,0x07, 0x6, +0 }, + { 0x0FDF800,0x0C7F601, 0x0B,0x00, 0x8, +0 }, + { 0x000FF26,0x0A7F802, 0x00,0x02, 0xE, +0 }, + { 0x01FFA06,0x0F5F511, 0x0A,0x00, 0xF, +0 }, + { 0x0F1F52E,0x3F99906, 0x05,0x02, 0x0, +0 }, + { 0x0F89227,0x3D8750A, 0x00,0x03, 0x8, +0 }, + { 0x2009F2C,0x3A4C50E, 0x00,0x09, 0xE, +0 }, + { 0x0009429,0x344F904, 0x10,0x0C, 0xE, +0 }, + { 0x0F1F52E,0x3F78706, 0x09,0x02, 0x0, +0 }, + { 0x2F1F535,0x028F703, 0x19,0x02, 0x0, +0 }, + { 0x0FAFA25,0x0F99803, 0xCD,0x00, 0x0, +0 }, + { 0x1FAF825,0x0F7A803, 0x1B,0x00, 0x0, +0 }, + { 0x1FAF825,0x0F69603, 0x21,0x00, 0xE, +0 }, + { 0x2F5F504,0x236F603, 0x16,0x03, 0xA, +0 }, + { 0x091F015,0x0E8A617, 0x1E,0x04, 0xE, +0 }, + { 0x001FF0E,0x077780E, 0x06,0x04, 0xE, +0 }, + { 0x0F7F020,0x33B8809, 0x00,0x00, 0xC, +0 }, + { 0x0F7F420,0x33B560A, 0x03,0x00, 0x0, +0 }, + { 0x05BF714,0x089F712, 0x4B,0x00, 0x0, +0 }, + { 0x0F2FA27,0x09AF612, 0x22,0x00, 0x0, +0 }, + { 0x1F75020,0x03B7708, 0x09,0x05, 0x0, +0 }, + { 0x1077F26,0x06B7703, 0x29,0x05, 0x0, +0 }, + { 0x0F0F126,0x0FCF727, 0x44,0x40, 0x6, +0 }, + { 0x0F3F821,0x0ADC620, 0x1C,0x00, 0xC, +0 }, + { 0x0FFFF01,0x0FFFF01, 0x3F,0x3F, 0x0, +0 }, + { 0x4FFEE03,0x0FFE804, 0x80,0x00, 0xC, +0 }, + { 0x122F603,0x0F8F3A1, 0x87,0x80, 0x6, +0 }, + { 0x007A810,0x005FA00, 0x86,0x03, 0x6, +0 }, + { 0x053F131,0x227F232, 0x48,0x00, 0x6, +0 }, + { 0x01A9161,0x01AC1E6, 0x40,0x03, 0x8, +0 }, + { 0x071FB11,0x0B9F301, 0x00,0x00, 0x0, +0 }, + { 0x1B57231,0x098D523, 0x0B,0x00, 0x8, +0 }, + { 0x024D501,0x0228511, 0x0F,0x00, 0xA, +0 }, + { 0x025F911,0x034F131, 0x05,0x00, 0xA, +0 }, + { 0x01576A1,0x0378261, 0x94,0x00, 0xC, +0 }, + { 0x1362261,0x0084F22, 0x10,0x40, 0x8, +0 }, + { 0x2363360,0x0084F22, 0x15,0x40, 0xC, +0 }, + { 0x007F804,0x0748201, 0x0E,0x05, 0x6, +0 }, + { 0x0E5F131,0x174F131, 0x89,0x00, 0xC, +0 }, + { 0x0E3F131,0x073F172, 0x8A,0x00, 0xA, +0 }, + { 0x0FFF101,0x0FF5091, 0x0D,0x80, 0x6, +0 }, + { 0x1473161,0x007AF61, 0x0F,0x00, 0xA, +0 }, + { 0x0D3B303,0x024F204, 0x40,0x80, 0x4, +0 }, + { 0x1037531,0x0445462, 0x1A,0x40, 0xE, +0 }, + { 0x021A1A1,0x116C261, 0x92,0x40, 0x6, +0 }, + { 0x0F0F240,0x0F4F440, 0x00,0x00, 0x4, +0 }, + { 0x003F1C0,0x001107E, 0x4F,0x0C, 0x2, +0 }, + { 0x0459BC0,0x015F9C1, 0x05,0x00, 0xE, +0 }, + { 0x0064F50,0x003FF50, 0x10,0x00, 0x0, +0 }, + { 0x2F0F005,0x1B4F600, 0x08,0x00, 0xC, +0 }, + { 0x0F2F931,0x042F210, 0x40,0x00, 0x4, +0 }, + { 0x00FFF7E,0x00F2F6E, 0x00,0x00, 0xE, +0 }, + { 0x2F95401,0x2FB5401, 0x19,0x00, 0x8, +0 }, + { 0x0665F53,0x0077F00, 0x05,0x00, 0x6, +0 }, + { 0x003F1C0,0x006707E, 0x4F,0x03, 0x2, +0 }, + { 0x1111EF0,0x11411E2, 0x00,0xC0, 0x8, +0 }, + { 0x0F0A006,0x075C584, 0x00,0x00, 0xE, +0 }, + { 0x1F5F213,0x0F5F111, 0xC6,0x05, 0x0, +0 }, + { 0x153F101,0x274F111, 0x49,0x02, 0x6, +0 }, + { 0x0E4F4D0,0x006A29E, 0x80,0x00, 0x8, +0 }, + { 0x0871321,0x0084221, 0xCD,0x80, 0x8, +0 }, + { 0x065B400,0x075B400, 0x00,0x00, 0x7, +0 }, + { 0x02AF800,0x145F600, 0x03,0x00, 0x4, +0 }, + { 0x0FFF830,0x07FF511, 0x44,0x00, 0x8, +0 }, + { 0x0F9F900,0x023F110, 0x08,0x00, 0xA, +0 }, + { 0x0F9F900,0x026F180, 0x04,0x00, 0x8, +0 }, + { 0x1FDF800,0x059F800, 0xC4,0x00, 0xA, +0 }, + { 0x06FFA00,0x08FF600, 0x0B,0x00, 0x0, +0 }, + { 0x0F9F900,0x023F191, 0x04,0x00, 0x8, +0 }, + { 0x097C802,0x097C802, 0x00,0x00, 0x1, +0 }, + { 0x0BFFA01,0x0BFDA02, 0x00,0x00, 0x8, +0 }, + { 0x2F0FB01,0x096F701, 0x10,0x00, 0xE, +0 }, + { 0x002FF04,0x007FF00, 0x00,0x00, 0xE, +0 }, + { 0x0F0F006,0x0B7F600, 0x00,0x00, 0xC, +0 }, + { 0x0F0F006,0x034C4C4, 0x00,0x03, 0xE, +0 }, + { 0x0F0F019,0x0F7B720, 0x0E,0x0A, 0xE, +0 }, + { 0x0F0F006,0x0B4F600, 0x00,0x00, 0xE, +0 }, + { 0x0F0F006,0x0B6F800, 0x00,0x00, 0xE, +0 }, + { 0x0F2F931,0x008F210, 0x40,0x00, 0x4, +0 }, + { 0x0BFFA01,0x0BFDA09, 0x00,0x08, 0x8, +0 }, + { 0x210BA2E,0x2F4B40E, 0x0E,0x00, 0xE, +0 }, + { 0x210FA2E,0x2F4F40E, 0x0E,0x00, 0xE, +0 }, + { 0x2A2B2A4,0x1D49703, 0x02,0x80, 0xE, +0 }, + { 0x200FF04,0x206FFC3, 0x00,0x00, 0x8, +0 }, + { 0x200FF04,0x2F5F6C3, 0x00,0x00, 0x8, +0 }, + { 0x0E1C000,0x153951E, 0x80,0x80, 0x6, +0 }, + { 0x200FF03,0x3F6F6C4, 0x00,0x00, 0x8, +0 }, + { 0x202FF4E,0x3F7F701, 0x00,0x00, 0x8, +0 }, + { 0x202FF4E,0x3F6F601, 0x00,0x00, 0x8, +0 }, + { 0x2588A51,0x018A452, 0x00,0x00, 0xC, +0 }, + { 0x0FFFB13,0x0FFE808, 0x40,0x00, 0x8, +0 }, + { 0x0FFEE05,0x0FFE808, 0x55,0x00, 0xE, +0 }, + { 0x0FF0006,0x0FDF715, 0x3F,0x0D, 0x1, +0 }, + { 0x0F6F80E,0x0F6F80E, 0x00,0x00, 0x0, +0 }, + { 0x060F207,0x072F212, 0x4F,0x09, 0x8, +0 }, + { 0x061F217,0x074F212, 0x4F,0x08, 0x8, +0 }, + { 0x022FB18,0x012F425, 0x88,0x80, 0x8, +0 }, + { 0x0F0FF04,0x0B5F4C1, 0x00,0x00, 0xE, +0 }, + { 0x02FC811,0x0F5F531, 0x2D,0x00, 0xC, +0 }, + { 0x03D6709,0x3FC692C, 0x00,0x00, 0xE, +0 }, + { 0x053D144,0x05642B2, 0x80,0x15, 0xE, +0 }, + { 0x253B1C4,0x083B1D2, 0x8F,0x84, 0x2, +0 }, + { 0x175F5C2,0x074F2D1, 0x21,0x83, 0xE, +0 }, + { 0x1F6FB34,0x04394B1, 0x83,0x00, 0xC, +0 }, + { 0x0BDF211,0x09BA004, 0x46,0x40, 0x8, +0 }, + { 0x144F221,0x3457122, 0x8A,0x40, 0x0, +0 }, + { 0x144F221,0x1447122, 0x8A,0x40, 0x0, +0 }, + { 0x053F101,0x153F108, 0x40,0x40, 0x0, +0 }, + { 0x102FF00,0x3FFF200, 0x08,0x00, 0x0, +0 }, + { 0x144F221,0x345A122, 0x8A,0x40, 0x0, +0 }, + { 0x028F131,0x018F031, 0x0F,0x00, 0xA, +0 }, + { 0x307D7E1,0x107B6E0, 0x8D,0x00, 0x1, +0 }, + { 0x03DD500,0x02CD500, 0x11,0x00, 0xA, +0 }, + { 0x1199563,0x219C420, 0x46,0x00, 0x8, +0 }, + { 0x044D08C,0x2F4D181, 0xA1,0x80, 0x8, +0 }, + { 0x0022171,0x1035231, 0x93,0x80, 0x0, +0 }, + { 0x1611161,0x01311A2, 0x91,0x80, 0x8, +0 }, + { 0x25666E1,0x02665A1, 0x4C,0x00, 0x0, +0 }, + { 0x038FB00,0x0DAF400, 0x00,0x00, 0x4, +0 }, + { 0x2BFFB15,0x31FF817, 0x0A,0x00, 0x0, +0 }, + { 0x0BFFBC6,0x02FE8C9, 0x00,0x00, 0xE, +0 }, + { 0x2F0F006,0x2B7F800, 0x00,0x00, 0xE, +0 }, + { 0x097C802,0x040E000, 0x00,0x00, 0x1, +0 }, + { 0x00FFF2E,0x04AF602, 0x0A,0x1B, 0xE, +0 }, + { 0x3A5F0EE,0x36786CE, 0x00,0x00, 0xE, +0 }, + { 0x0B0FCD6,0x008BDD6, 0x00,0x05, 0xA, +0 }, + { 0x0F0F007,0x0DC5C00, 0x08,0x00, 0xE, +0 }, + { 0x0E7F301,0x078F211, 0x58,0x00, 0xA, +0 }, + { 0x0EFF230,0x078F521, 0x1E,0x00, 0xE, +0 }, + { 0x019D530,0x01B6171, 0x88,0x80, 0xC, +0 }, + { 0x001F201,0x0B7F211, 0x0D,0x0D, 0xA, +0 }, + { 0x03DD500,0x02CD500, 0x14,0x00, 0xA, +0 }, + { 0x010E032,0x0337D16, 0x87,0x84, 0x8, +0 }, + { 0x0F8F161,0x008F062, 0x80,0x80, 0x8, +0 }, + { 0x0745391,0x0755451, 0x00,0x00, 0xA, +0 }, + { 0x08E6121,0x09E7231, 0x15,0x00, 0xE, +0 }, + { 0x0BC7321,0x0BC8121, 0x19,0x00, 0xE, +0 }, + { 0x23C7320,0x0BC8121, 0x19,0x00, 0xE, +0 }, + { 0x209A060,0x20FF014, 0x02,0x80, 0x1, +0 }, + { 0x064F207,0x075F612, 0x73,0x00, 0x8, +0 }, + { 0x054D221,0x075B231, 0x4D,0x80, 0x8, +0 }, + { 0x053D221,0x073B231, 0x56,0x80, 0x8, +0 }, + { 0x053D221,0x073B231, 0x55,0x80, 0x8, +0 }, + { 0x201AF70,0x0084F32, 0x19,0x40, 0xC, +0 }, + { 0x201AF70,0x0083F32, 0x19,0x40, 0xC, +0 }, + { 0x0302221,0x0064F32, 0x99,0x00, 0xE, +0 }, + { 0x0006F71,0x0064F32, 0x99,0x00, 0xE, +0 }, + { 0x0006F71,0x0074F32, 0x99,0x80, 0xE, +0 }, + { 0x0006F71,0x0054F32, 0x9E,0x80, 0xE, +0 }, + { 0x0006F71,0x0054F31, 0x9E,0x80, 0xE, +0 }, + { 0x0006F71,0x0054F32, 0x9C,0x80, 0xE, +0 }, + { 0x006F231,0x0084221, 0xCF,0x80, 0x6, +0 }, + { 0x0811321,0x0074221, 0xCD,0x80, 0x8, +0 }, + { 0x0957406,0x074A401, 0x5B,0x00, 0x0, +0 }, + { 0x021A1A1,0x116C261, 0x92,0x00, 0x6, +0 }, + { 0x0EFF230,0x078F522, 0x1E,0x00, 0xE, +0 }, + { 0x01FF003,0x01FF001, 0x5B,0x80, 0xA, +0 }, + { 0x00FFF24,0x00FFF21, 0x80,0x80, 0x1, +0 }, + { 0x00F4021,0x10F1020, 0x00,0x00, 0xE, +0 }, + { 0x045F221,0x076F221, 0x8F,0x06, 0x8, +0 }, + { 0x053B121,0x074C231, 0x4F,0x00, 0x6, +0 }, + { 0x011F111,0x0B3C101, 0x4A,0x80, 0x6, +0 }, + { 0x058F381,0x058F201, 0x63,0x80, 0x0, +0 }, + { 0x001F701,0x0B7F407, 0x0D,0x06, 0xA, +0 }, + { 0x060F206,0x072F211, 0x4F,0x0C, 0x8, +0 }, + { 0x0E3F318,0x093F281, 0x62,0x00, 0x0, +0 }, + { 0x326CE15,0x025F901, 0x57,0x00, 0xC, +0 }, + { 0x1558403,0x005D381, 0x49,0x80, 0x4, +0 }, + { 0x0F0FB3E,0x09BA071, 0x29,0x40, 0x0, +0 }, + { 0x01FF003,0x014F001, 0x5B,0x88, 0xA, +0 }, + { 0x14941A1,0x009CF21, 0x15,0x00, 0x0, +0 }, + { 0x074A302,0x075C441, 0x9A,0x80, 0xA, +0 }, + { 0x01FF260,0x07CF521, 0x11,0x00, 0xA, +0 }, + { 0x122F603,0x0F4F321, 0x87,0x80, 0x6, +0 }, + { 0x0442009,0x0F4D184, 0xA1,0x80, 0x8, +0 }, + { 0x066C101,0x066A201, 0x9A,0x40, 0xA, +0 }, + { 0x0236321,0x0266421, 0x97,0x00, 0x0, +0 }, + { 0x111C031,0x1157221, 0x20,0x06, 0xC, +0 }, + { 0x1107421,0x0165223, 0x0C,0x08, 0x2, +0 }, + { 0x1DBB851,0x1567591, 0x17,0x00, 0xC, +0 }, + { 0x075C502,0x0F3C201, 0x29,0x83, 0x0, +0 }, + { 0x0EFE800,0x0FFA401, 0x0D,0x00, 0x6, +0 }, + { 0x01171B1,0x1177261, 0x8B,0x40, 0x6, +0 }, + { 0x111F0F1,0x1131121, 0x95,0x00, 0x0, +0 }, + { 0x111C031,0x1159221, 0x20,0x06, 0xC, +0 }, + { 0x111C0B1,0x1159221, 0x20,0x08, 0xC, +0 }, + { 0x00B4131,0x03B9261, 0x1C,0x80, 0xC, +0 }, + { 0x01F4131,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x0646300,0x0757211, 0x1C,0x00, 0xE, +0 }, + { 0x0014131,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x05A5321,0x01AAA21, 0x9C,0x80, 0xE, +0 }, + { 0x003F200,0x0FFF220, 0x80,0x00, 0xE, +0 }, + { 0x0001F0E,0x3F01FC0, 0x00,0x00, 0xE, +0 }, + { 0x179A1A1,0x1495121, 0x1C,0x00, 0x0, +0 }, + { 0x0177EB1,0x00E7B22, 0xC5,0x05, 0x2, +0 }, + { 0x019D531,0x01B6132, 0xD1,0x80, 0xC, +0 }, + { 0x01B5132,0x03BA261, 0x9A,0x82, 0xC, +0 }, + { 0x1047021,0x06D6361, 0xC6,0x00, 0xE, +0 }, + { 0x08F6EE0,0x02A6561, 0xEC,0x00, 0xE, +0 }, + { 0x0297122,0x0296431, 0x08,0x04, 0xD, +0 }, + { 0x20FF2D0,0x08562C1, 0xEB,0x06, 0x0, +0 }, + { 0x0154221,0x0065021, 0xE3,0x00, 0x8, +0 }, + { 0x144F221,0x0439422, 0x8A,0x40, 0x0, +0 }, + { 0x05312C4,0x07212F1, 0x17,0x00, 0xA, +0 }, + { 0x0536244,0x0046041, 0x56,0x00, 0xC, +0 }, + { 0x0E6E800,0x0F6A300, 0x0D,0x00, 0x6, +0 }, + { 0x141FA11,0x2F5F411, 0x06,0x00, 0x4, +0 }, + { 0x0268721,0x1188421, 0x07,0x00, 0x6, +0 }, + { 0x055F502,0x053F601, 0x99,0x80, 0x0, +0 }, + { 0x060F207,0x072F212, 0x4F,0x00, 0x8, +0 }, + { 0x0105AEC,0x1F454EE, 0x00,0x00, 0xE, +0 }, + { 0x286F2A5,0x228670E, 0x00,0x00, 0xE, +0 }, + { 0x007FF01,0x007FF21, 0x00,0x00, 0x7, +0 }, + { 0x00CFF01,0x00BFF21, 0x00,0x00, 0x7, +0 }, + { 0x211BA12,0x2F5B400, 0x0B,0x00, 0xE, +0 }, + { 0x021FF13,0x003FF10, 0x51,0x40, 0xA, +0 }, + { 0x002F002,0x004D001, 0xC0,0x00, 0x4, +0 }, + { 0x050F101,0x07CD201, 0x4F,0x04, 0x6, +0 }, + { 0x2129A14,0x004FA01, 0x97,0x80, 0xE, +0 }, + { 0x0038165,0x007F171, 0xD2,0x00, 0x2, +0 }, + { 0x0AE7121,0x01ED320, 0x1C,0x00, 0xE, +0 }, + { 0x053F101,0x083F212, 0xCF,0x00, 0x2, +0 }, + { 0x154FF0A,0x0F5F002, 0x04,0x00, 0x0, +0 }, + { 0x035F813,0x004FF11, 0x12,0x00, 0x8, +0 }, + { 0x100FF22,0x10BF020, 0x92,0x00, 0x4, +0 }, + { 0x00FFF24,0x00FFF21, 0x00,0x40, 0x1, +0 }, + { 0x0F0FB3E,0x09BA071, 0x29,0x00, 0x0, +0 }, + { 0x275F602,0x066F521, 0x9B,0x00, 0x4, +0 }, + { 0x315EF11,0x0B5F481, 0x53,0x00, 0x8, +0 }, + { 0x10BF224,0x00B5231, 0x50,0x00, 0xE, +0 }, + { 0x000EA36,0x003D01A, 0x8B,0x00, 0x8, +0 }, + { 0x1C3C223,0x103D000, 0x14,0x00, 0xC, +0 }, + { 0x001F211,0x0B1F215, 0x0D,0x0D, 0xA, +0 }, + { 0x0AFF832,0x07FF310, 0x45,0x00, 0xE, +0 }, + { 0x153F101,0x274F111, 0x49,0x00, 0x6, +0 }, + { 0x0F7F000,0x00687A1, 0x30,0x00, 0xF, +0 }, + { 0x0009F71,0x1069F62, 0x45,0x00, 0x2, +0 }, + { 0x0009F71,0x1069062, 0x51,0x00, 0x0, +0 }, + { 0x275F602,0x066F521, 0x1B,0x00, 0x4, +0 }, + { 0x0F7F001,0x00687A1, 0x00,0x00, 0x1, +0 }, + { 0x141B403,0x03FF311, 0x5E,0x00, 0xA, +0 }, + { 0x141B203,0x097F211, 0x5E,0x00, 0xA, +0 }, + { 0x101F901,0x0F5F001, 0x34,0x00, 0x4, +0 }, + { 0x0EFF201,0x078F501, 0x1D,0x00, 0xA, +0 }, + { 0x1EFF201,0x078F501, 0x1D,0x00, 0x6, +0 }, + { 0x01774E1,0x01765E2, 0x83,0x00, 0x7, +0 }, + { 0x154F103,0x054F10A, 0x00,0x00, 0x0, +0 }, + { 0x001EF81,0x0FB9201, 0x8E,0x00, 0x4, +0 }, + { 0x000EA36,0x024DF1A, 0x8B,0x00, 0x8, +0 }, + { 0x061F217,0x076F212, 0x4F,0x00, 0x8, +0 }, + { 0x2298432,0x0448421, 0x1A,0x00, 0x6, +0 }, + { 0x0176EB1,0x00E8B22, 0xC5,0x05, 0x2, +0 }, + { 0x01572A1,0x02784A1, 0x1C,0x00, 0xE, +0 }, + { 0x0427887,0x0548594, 0x4D,0x00, 0xA, +0 }, + { 0x011F111,0x0B3F101, 0x4A,0x85, 0x6, +0 }, + { 0x0115172,0x11552A2, 0x89,0x00, 0xA, +0 }, + { 0x2F3F021,0x004F021, 0x4F,0x00, 0x6, +0 }, + { 0x095AB0E,0x0C6F702, 0xC0,0x00, 0xE, +0 }, + { 0x00351B2,0x01352A2, 0x1C,0x05, 0xE, +0 }, + { 0x01152B0,0x0FE31B1, 0xC5,0x40, 0x0, +0 }, + { 0x0B69401,0x0268300, 0x00,0x00, 0x0, +0 }, + { 0x075F502,0x0F3F201, 0x29,0x83, 0x0, +0 }, + { 0x243A321,0x022C411, 0x11,0x00, 0xC, +0 }, + { 0x01FF201,0x088F501, 0x11,0x00, 0xA, +0 }, + { 0x07D8207,0x07D8214, 0x8F,0x80, 0xC, +0 }, + { 0x00BF224,0x00B5231, 0x4F,0x00, 0xE, +0 }, + { 0x025DC03,0x009F031, 0x90,0x00, 0x8, +0 }, + { 0x02F2501,0x06C6521, 0x15,0x80, 0xA, +0 }, + { 0x0176E30,0x12F8B32, 0x4B,0x05, 0x4, +0 }, + { 0x08F7461,0x02A6561, 0x27,0x00, 0x2, +0 }, + { 0x0EBFA10,0x0DAFA0E, 0x00,0x00, 0x0, +0 }, + { 0x0F7F0F5,0x0068771, 0x2E,0x00, 0xB, +0 }, + { 0x0537101,0x07C5212, 0x4F,0x00, 0xA, +0 }, + { 0x3DFFF20,0x20FFF21, 0x00,0x00, 0x0, +0 }, + { 0x000FF24,0x00BF020, 0x97,0x00, 0x4, +0 }, + { 0x0176EB1,0x00E8BA2, 0xC5,0x05, 0x2, +0 }, + { 0x019D530,0x01B6171, 0xCD,0x40, 0xC, +0 }, + { 0x203B122,0x005F172, 0x4F,0x00, 0x2, +0 }, + { 0x0F16000,0x0F87001, 0x1D,0x00, 0xE, +0 }, + { 0x1009F71,0x1069F22, 0x45,0x00, 0x2, +0 }, + { 0x01D5321,0x03B5261, 0x1C,0x80, 0xC, +0 }, + { 0x01F41B1,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x05A5321,0x01AAA21, 0x9F,0x80, 0xC, +0 }, + { 0x0078061,0x0077062, 0x80,0x00, 0x7, +0 }, + { 0x2D3B121,0x0149121, 0x4F,0x80, 0x6, +0 }, + { 0x1F27021,0x0F68021, 0x14,0x00, 0xE, +0 }, + { 0x2129A16,0x0039A12, 0x97,0x00, 0x2, +0 }, + { 0x01FF003,0x019F000, 0x1F,0x05, 0xA, +0 }, + { 0x204D983,0x004D081, 0x17,0x00, 0xE, +0 }, + { 0x025DA05,0x015F901, 0x8E,0x00, 0xA, +0 }, + { 0x112AA83,0x1119B91, 0x1C,0x00, 0xE, +0 }, + { 0x001FF64,0x0F3F53E, 0xDB,0xC0, 0x4, +0 }, + { 0x0AC9051,0x1F4F071, 0x1A,0x00, 0xF, +0 }, + { 0x22F5570,0x31E87E0, 0x16,0x80, 0xC, +0 }, + { 0x08F6EA0,0x02A65E1, 0xEC,0x00, 0xE, +0 }, + { 0x0EFE800,0x0FFA500, 0x0D,0x00, 0x6, +0 }, + { 0x102FD16,0x0039F12, 0x96,0x80, 0xE, +0 }, + { 0x035F803,0x004FF01, 0x12,0x00, 0x8, +0 }, + { 0x006FA15,0x025F501, 0xD3,0x00, 0xA, +0 }, + { 0x2129A16,0x0019A12, 0x97,0x00, 0x2, +0 }, + { 0x0F0E029,0x031FF1E, 0x1A,0x00, 0x6, +0 }, + { 0x0056581,0x0743251, 0x83,0x00, 0xA, +0 }, + { 0x2129FD6,0x0F290D2, 0x17,0x00, 0x2, +0 }, + { 0x0F0F000,0x0048C2C, 0x2E,0x00, 0xE, +0 }, + { 0x0111E00,0x0A11220, 0x00,0x00, 0x6, +0 }, + { 0x054F10F,0x054F60F, 0x00,0x00, 0xE, +0 }, + { 0x069F000,0x0FFF633, 0x00,0x00, 0xE, +0 }, + { 0x0F00000,0x0F00000, 0x3F,0x3F, 0x0, +0 }, + { 0x04CA800,0x045D600, 0x0B,0x00, 0x0, +0 }, + { 0x04CA800,0x04FD600, 0x0B,0x00, 0x0, +0 }, + { 0x0F0F31E,0x0F6F610, 0x00,0x00, 0xE, +0 }, + { 0x00FFF2E,0x04CF600, 0x00,0x18, 0xE, +0 }, + { 0x0BFFA01,0x0B6D602, 0x00,0x00, 0x8, +0 }, + { 0x3F6F01E,0x307F01E, 0x00,0x00, 0xE, +0 }, + { 0x30AFF2E,0x306FF1E, 0x00,0x00, 0xE, +0 }, + { 0x0F0F31E,0x0F4F410, 0x00,0x00, 0xE, +0 }, + { 0x3F6F61E,0x302F21E, 0x00,0x0C, 0xE, +0 }, + { 0x1FBFA1E,0x102F21E, 0x00,0x04, 0xE, +0 }, + { 0x0BFFA11,0x0BFDA02, 0x34,0x00, 0x8, +0 }, + { 0x001FFEF,0x0F3F53E, 0xCD,0xC0, 0xE, +0 }, + { 0x16FAA12,0x006FF06, 0x14,0x00, 0x0, +0 }, + { 0x16FAA12,0x008FF06, 0x14,0x00, 0x0, +0 }, + { 0x0FFFB13,0x0FFE804, 0x40,0x00, 0x8, +0 }, + { 0x26EF800,0x03FF600, 0x08,0x02, 0x0, +0 }, + { 0x26EF800,0x034F400, 0x08,0x02, 0x0, +0 }, + { 0x16FAA12,0x006FF06, 0x00,0x00, 0x0, +0 }, + { 0x0F0E029,0x03FF21E, 0x1A,0x00, 0x6, +0 }, + { 0x0F0E029,0x0FFF13E, 0x1A,0x00, 0x6, +0 }, + { 0x050B233,0x1F5B131, 0x5A,0x00, 0x0, +0 }, + { 0x153F231,0x0F5F111, 0x49,0x03, 0x6, +0 }, + { 0x183D131,0x0F5C132, 0x95,0x03, 0xC, +0 }, + { 0x163F334,0x1F59211, 0x9B,0x00, 0x0, +0 }, + { 0x2B7F827,0x0F9F191, 0x28,0x00, 0x0, +0 }, + { 0x1EEF31A,0x0F5F111, 0x2D,0x00, 0x0, +0 }, + { 0x158F235,0x1F68132, 0x95,0x02, 0xE, +0 }, + { 0x040C931,0x1B9C235, 0x85,0x00, 0x0, +0 }, + { 0x064C709,0x035B201, 0x15,0x05, 0x9, +0 }, + { 0x144F406,0x034F201, 0x03,0x1B, 0x1, +0 }, + { 0x124A904,0x074F501, 0x06,0x01, 0xB, +0 }, + { 0x033F6D4,0x0E361F1, 0x00,0x00, 0x1, +0 }, + { 0x0E8F7D4,0x064A4D1, 0x00,0x00, 0x5, +0 }, + { 0x0F7F736,0x0F5B531, 0x16,0x07, 0x0, +0 }, + { 0x043A203,0x074F300, 0x1B,0x00, 0xA, +0 }, + { 0x135F8C3,0x194C311, 0x8E,0x00, 0x0, +0 }, + { 0x11BF4E2,0x10DF4E0, 0x07,0x00, 0x7, +0 }, + { 0x02CF6F2,0x10BF5F0, 0x00,0x00, 0x5, +0 }, + { 0x015B6F1,0x007BFF0, 0x06,0x00, 0xB, +0 }, + { 0x1167922,0x1086DE0, 0x03,0x00, 0x9, +0 }, + { 0x0066331,0x1175172, 0x27,0x00, 0x0, +0 }, + { 0x11653B4,0x1175171, 0x1D,0x00, 0xE, +0 }, + { 0x0159725,0x1085332, 0x29,0x00, 0x0, +0 }, + { 0x0156724,0x1065331, 0x9E,0x00, 0xE, +0 }, + { 0x1B4A313,0x0F8D231, 0x27,0x00, 0x4, +0 }, + { 0x032F317,0x1C7E211, 0xA3,0x00, 0x0, +0 }, + { 0x1C1D233,0x09CF131, 0x24,0x00, 0xE, +0 }, + { 0x044F831,0x1C9F232, 0x05,0x02, 0x0, +0 }, + { 0x07B9C21,0x0FB9502, 0x09,0x03, 0x6, +0 }, + { 0x1988121,0x059A121, 0x84,0x04, 0x6, +0 }, + { 0x04378B1,0x3FC9122, 0x0C,0x03, 0x0, +0 }, + { 0x08C8200,0x0ECB408, 0x0A,0x02, 0x8, +0 }, + { 0x046AB21,0x0F79321, 0x13,0x00, 0x0, +0 }, + { 0x032F901,0x058C122, 0x0A,0x04, 0x0, +0 }, + { 0x077FA21,0x06AC322, 0x07,0x02, 0xA, +0 }, + { 0x0577121,0x0876221, 0x17,0x00, 0xA, +0 }, + { 0x178FA25,0x097F312, 0x01,0x00, 0x6, +0 }, + { 0x088FA21,0x097B313, 0x03,0x00, 0xC, +0 }, + { 0x17FF521,0x0CCF323, 0x09,0x04, 0x8, +0 }, + { 0x09BA301,0x0AA9301, 0x10,0x00, 0x8, +0 }, + { 0x129F6E2,0x10878E1, 0x19,0x00, 0xC, +0 }, + { 0x129F6E2,0x10878E1, 0x1C,0x00, 0xC, +0 }, + { 0x1166961,0x1275461, 0x19,0x00, 0xA, +0 }, + { 0x1318271,0x0566132, 0x18,0x00, 0xC, +0 }, + { 0x10670E2,0x11675E1, 0x23,0x00, 0xC, +0 }, + { 0x0E68802,0x1F6F561, 0x00,0x00, 0x9, +0 }, + { 0x1D5F612,0x0E3F311, 0x20,0x80, 0xE, +0 }, + { 0x1F4F461,0x0F5B500, 0x0E,0x00, 0x0, +0 }, + { 0x1049C61,0x0167121, 0x1E,0x80, 0xE, +0 }, + { 0x2D6C0A2,0x1553021, 0x2A,0x00, 0xE, +0 }, + { 0x1357261,0x1366261, 0x21,0x00, 0xE, +0 }, + { 0x1237221,0x0075121, 0x1A,0x02, 0xE, +0 }, + { 0x03197E1,0x0396261, 0x16,0x00, 0x8, +0 }, + { 0x0457922,0x0276621, 0xC3,0x00, 0x0, +0 }, + { 0x1556321,0x0467321, 0xDE,0x00, 0x0, +0 }, + { 0x0F78642,0x1767450, 0x05,0x00, 0xB, +0 }, + { 0x0026131,0x0389261, 0x1C,0x81, 0xE, +0 }, + { 0x0235271,0x0197161, 0x1E,0x02, 0xE, +0 }, + { 0x0167621,0x0098121, 0x1A,0x01, 0xE, +0 }, + { 0x22C8925,0x24B8320, 0x28,0x00, 0x6, +0 }, + { 0x0167921,0x05971A2, 0x1F,0x05, 0x8, +0 }, + { 0x0168721,0x0398221, 0x19,0x03, 0xE, +0 }, + { 0x0357521,0x0178422, 0x17,0x82, 0xE, +0 }, + { 0x0586221,0x0167221, 0x22,0x02, 0xE, +0 }, + { 0x10759B1,0x00A7BA1, 0x1B,0x00, 0x0, +0 }, + { 0x0049F21,0x10C8521, 0x16,0x00, 0xA, +0 }, + { 0x020A821,0x10A7B23, 0x0F,0x00, 0xC, +0 }, + { 0x0048821,0x1187926, 0x0F,0x00, 0x8, +0 }, + { 0x0058F31,0x0087332, 0x18,0x01, 0x0, +0 }, + { 0x1378CA1,0x00A7724, 0x0A,0x04, 0x0, +0 }, + { 0x067A831,0x0195175, 0x04,0x00, 0xA, +0 }, + { 0x12677A2,0x0097421, 0x1F,0x01, 0x0, +0 }, + { 0x194B8E1,0x0286321, 0x07,0x01, 0x0, +0 }, + { 0x05987A1,0x00A65E1, 0x93,0x00, 0x0, +0 }, + { 0x0389F22,0x0296761, 0x10,0x00, 0x0, +0 }, + { 0x19A88E2,0x0096721, 0x0D,0x00, 0x0, +0 }, + { 0x09498A2,0x0286A21, 0x10,0x01, 0xE, +0 }, + { 0x02686F1,0x02755F1, 0x1C,0x00, 0xE, +0 }, + { 0x0099FE1,0x0086FE1, 0x3F,0x00, 0x1, +0 }, + { 0x019F7E2,0x0077A21, 0x3B,0x00, 0x0, +0 }, + { 0x00C9222,0x00DA261, 0x1E,0x06, 0xE, +0 }, + { 0x122F421,0x05FA321, 0x15,0x00, 0xE, +0 }, + { 0x16647F2,0x02742F1, 0x20,0x00, 0x2, +0 }, + { 0x0288861,0x049B261, 0x19,0x05, 0xE, +0 }, + { 0x01B8221,0x179B223, 0x16,0x00, 0x0, +0 }, + { 0x093CA21,0x01A7A22, 0x00,0x00, 0x0, +0 }, + { 0x1C99223,0x1288222, 0x00,0x00, 0x9, +0 }, + { 0x07BF321,0x05FC322, 0x1D,0x02, 0xE, +0 }, + { 0x12581E1,0x195C4A6, 0x00,0x86, 0x1, +0 }, + { 0x0013121,0x0154421, 0x27,0x00, 0xE, +0 }, + { 0x2358360,0x006D161, 0x14,0x00, 0xC, +0 }, + { 0x101D3E1,0x0378262, 0x5C,0x00, 0x0, +0 }, + { 0x2863428,0x0354121, 0x38,0x00, 0x0, +0 }, + { 0x1F35224,0x1F53223, 0x12,0x02, 0x4, +0 }, + { 0x0A66261,0x02661A1, 0x1D,0x00, 0xA, +0 }, + { 0x1D52222,0x1053F21, 0x0F,0x84, 0xA, +0 }, + { 0x024F9E3,0x0F6D131, 0x1F,0x01, 0x0, +0 }, + { 0x1554163,0x10541A2, 0x00,0x00, 0x7, +0 }, + { 0x165A7C7,0x0E4F3C1, 0x25,0x05, 0x0, +0 }, + { 0x1B7F7E3,0x1F59261, 0x19,0x00, 0x0, +0 }, + { 0x044A866,0x1E4F241, 0x9B,0x04, 0xE, +0 }, + { 0x0752261,0x0254561, 0x20,0x00, 0xC, +0 }, + { 0x084F6E1,0x036A3E1, 0x21,0x01, 0xE, +0 }, + { 0x16473E2,0x10598E1, 0x14,0x01, 0xA, +0 }, + { 0x0347221,0x1F6A324, 0x0B,0x02, 0x8, +0 }, + { 0x053F421,0x0F8F604, 0x16,0x00, 0xC, +0 }, + { 0x002DA21,0x0F5F335, 0x18,0x00, 0xC, +0 }, + { 0x063FA25,0x1E59402, 0x0F,0x00, 0x8, +0 }, + { 0x096F932,0x0448411, 0x07,0x00, 0x0, +0 }, + { 0x2189720,0x1188325, 0x0E,0x03, 0x8, +0 }, + { 0x029F661,0x1087862, 0x18,0x01, 0x0, +0 }, + { 0x01976E6,0x1088E61, 0x21,0x03, 0xA, +0 }, + { 0x0D4F027,0x046F205, 0x23,0x09, 0x0, +0 }, + { 0x131F91C,0x1E89615, 0x0C,0x00, 0xE, +0 }, + { 0x2167502,0x1F6F601, 0x00,0x00, 0x7, +0 }, + { 0x093F502,0x045C600, 0x1D,0x00, 0x0, +0 }, + { 0x032F511,0x0B4F410, 0x15,0x00, 0x4, +0 }, + { 0x099FA22,0x025D501, 0x06,0x00, 0x8, +0 }, + { 0x200FF2E,0x02D210E, 0x00,0x0E, 0xE, +0 }, + { 0x1E45630,0x2875517, 0x0B,0x00, 0x0, +0 }, + { 0x003FF24,0x1879805, 0x00,0x08, 0xC, +0 }, + { 0x200F00E,0x304170A, 0x00,0x04, 0xE, +0 }, + { 0x0F7F620,0x2F9770E, 0x08,0x05, 0x0, +0 }, + { 0x008F120,0x008F42E, 0x14,0x02, 0x0, +0 }, + { 0x100F220,0x1053623, 0x04,0x00, 0x2, +0 }, + { 0x002FF2E,0x355322A, 0x00,0x05, 0xE, +0 }, + { 0x00F9F3E,0x0FA8730, 0x00,0x00, 0xE, +0 }, + { 0x0977801,0x3988802, 0x00,0x00, 0x8, +0 }, + { 0x0FBF116,0x069F911, 0x08,0x00, 0x0, +0 }, + { 0x06CF800,0x04AE80E, 0x00,0x80, 0x0, +0 }, + { 0x0F3F900,0x08AF701, 0x00,0x00, 0x4, +0 }, + { 0x0FDFA01,0x047F601, 0x07,0x00, 0x4, +0 }, + { 0x000FF24,0x0A9F702, 0x00,0x00, 0xE, +0 }, + { 0x01FFA06,0x0F5F511, 0x0A,0x00, 0xD, +0 }, + { 0x0FEF22C,0x3D8B802, 0x00,0x06, 0x6, +0 }, + { 0x0F6822E,0x3F87404, 0x00,0x10, 0x4, +0 }, + { 0x2009F2C,0x3D4C50E, 0x00,0x05, 0xE, +0 }, + { 0x0F1F52E,0x3F78706, 0x09,0x03, 0x0, +0 }, + { 0x1A1F737,0x028F603, 0x14,0x00, 0x8, +0 }, + { 0x0FAFA25,0x0F99903, 0xC4,0x00, 0x0, +0 }, + { 0x1FAFB21,0x0F7A802, 0x03,0x00, 0x0, +0 }, + { 0x2FAF924,0x0F6A603, 0x18,0x00, 0xE, +0 }, + { 0x2F5F505,0x236F603, 0x14,0x00, 0x6, +0 }, + { 0x107AF20,0x22BA50E, 0x15,0x00, 0x4, +0 }, + { 0x107BF20,0x23B930E, 0x18,0x00, 0x0, +0 }, + { 0x0F7F020,0x33B8908, 0x00,0x01, 0xA, +0 }, + { 0x0FAF320,0x22B5308, 0x00,0x0A, 0x8, +0 }, + { 0x19AF815,0x089F613, 0x21,0x00, 0x8, +0 }, + { 0x0075F20,0x14B8708, 0x01,0x00, 0x0, +0 }, + { 0x1F75725,0x1677803, 0x12,0x00, 0x0, +0 }, + { 0x0F0F122,0x0FCF827, 0x2F,0x02, 0x6, +0 }, + { 0x0E5AD37,0x1A58211, 0x40,0x00, 0x0, +0 }, + { 0x053F335,0x1F5F111, 0xDA,0x03, 0x0, +0 }, + { 0x163F435,0x1F5F211, 0xCF,0x03, 0x0, +0 }, + { 0x163F374,0x1F5F251, 0xD3,0x03, 0x0, +0 }, + { 0x0F7F201,0x2C9F887, 0x06,0x15, 0x5, +0 }, + { 0x08EF63C,0x0F5F131, 0x1B,0x09, 0x0, +0 }, + { 0x20AFAB2,0x1F7C231, 0x15,0x05, 0xC, +0 }, + { 0x020F831,0x1DCF236, 0x0F,0x04, 0x0, +0 }, + { 0x234F825,0x085F401, 0xA2,0x07, 0x6, +0 }, + { 0x226F6C2,0x075A501, 0x05,0x05, 0x9, +0 }, + { 0x131F6F5,0x0E3F1F1, 0x2A,0x02, 0x0, +0 }, + { 0x0F8F8F8,0x064E4D1, 0x1A,0x07, 0xC, +0 }, + { 0x0F7F73C,0x0F5F531, 0x0C,0x06, 0x9, +0 }, + { 0x0F0B022,0x0F4C425, 0x21,0x08, 0x0, +0 }, + { 0x136F8C5,0x194C311, 0x09,0x06, 0x0, +0 }, + { 0x11BF4E2,0x11DD4E0, 0x08,0x04, 0x1, +0 }, + { 0x04CF7F2,0x00BF5F0, 0x02,0x04, 0x1, +0 }, + { 0x13DF4E0,0x13BF5E0, 0x03,0x00, 0x7, +0 }, + { 0x1166722,0x1086DE0, 0x09,0x05, 0xB, +0 }, + { 0x0066331,0x1175172, 0x27,0x04, 0x0, +0 }, + { 0x11653B4,0x1175171, 0x1B,0x06, 0xE, +0 }, + { 0x1057824,0x1085333, 0x1E,0x09, 0x0, +0 }, + { 0x11653B3,0x1175172, 0x1F,0x05, 0x0, +0 }, + { 0x127F833,0x0F8F231, 0x23,0x04, 0xE, +0 }, + { 0x132F418,0x1A7E211, 0x26,0x03, 0x0, +0 }, + { 0x0C1A233,0x09CB131, 0x9D,0x85, 0x8, +0 }, + { 0x1F4F335,0x1C9F232, 0x16,0x07, 0xA, +0 }, + { 0x07B9C21,0x0FB9402, 0x12,0x03, 0xA, +0 }, + { 0x24C8120,0x17AF126, 0x06,0x0C, 0x0, +0 }, + { 0x28B7120,0x378F120, 0x11,0x06, 0x0, +0 }, + { 0x38C7205,0x19CE203, 0x13,0x0A, 0x4, +0 }, + { 0x0B6AF31,0x0F78331, 0x00,0x00, 0x0, +0 }, + { 0x068F321,0x0FCC121, 0x17,0x06, 0x8, +0 }, + { 0x077FB21,0x06AC322, 0x00,0x03, 0x8, +0 }, + { 0x047A131,0x0878231, 0x97,0x84, 0xA, +0 }, + { 0x0A8FA25,0x197F312, 0x0D,0x00, 0x8, +0 }, + { 0x06CFA21,0x0FCF334, 0x05,0x07, 0xC, +0 }, + { 0x17FF521,0x0CCF322, 0x17,0x03, 0xE, +0 }, + { 0x09BA301,0x0AA9301, 0x13,0x04, 0xA, +0 }, + { 0x129F6E2,0x10878E1, 0x19,0x05, 0xC, +0 }, + { 0x129F6E2,0x10878E1, 0x1C,0x03, 0xC, +0 }, + { 0x0099861,0x1087E61, 0x20,0x03, 0xC, +0 }, + { 0x1017171,0x05651F1, 0x1E,0x06, 0xE, +0 }, + { 0x10670E2,0x11675E1, 0x23,0x04, 0xC, +0 }, + { 0x0E69802,0x0F6F521, 0x05,0x07, 0x9, +0 }, + { 0x075F602,0x0C5F401, 0x2A,0x82, 0xE, +0 }, + { 0x1BABF61,0x0468501, 0x40,0x00, 0x0, +0 }, + { 0x195CCE1,0x12850E1, 0x00,0x00, 0x0, +0 }, + { 0x2D6C0E2,0x15530E1, 0x27,0x09, 0xE, +0 }, + { 0x1556261,0x1566261, 0x26,0x03, 0xE, +0 }, + { 0x16372A1,0x00751A1, 0x18,0x07, 0xE, +0 }, + { 0x145B822,0x0278621, 0xD2,0x02, 0x0, +0 }, + { 0x1556321,0x0467321, 0xDE,0x05, 0x0, +0 }, + { 0x0F78642,0x1767450, 0x0A,0x00, 0xD, +0 }, + { 0x0026131,0x0388261, 0x1F,0x87, 0xE, +0 }, + { 0x0135571,0x0197061, 0x20,0x0B, 0xE, +0 }, + { 0x0166621,0x0097121, 0x1C,0x06, 0xE, +0 }, + { 0x21C7824,0x14B9321, 0x19,0x84, 0x0, +0 }, + { 0x0167921,0x05971A1, 0x21,0x03, 0xC, +0 }, + { 0x0358221,0x0388221, 0x1B,0x07, 0xE, +0 }, + { 0x0357221,0x0378222, 0x1A,0x87, 0xE, +0 }, + { 0x0586221,0x0167221, 0x23,0x06, 0xE, +0 }, + { 0x10759F1,0x00A7B61, 0x1B,0x06, 0x0, +0 }, + { 0x0049F21,0x10C8521, 0x16,0x07, 0xA, +0 }, + { 0x010B821,0x1DC72A6, 0x04,0x04, 0x8, +0 }, + { 0x0096831,0x1086334, 0x0B,0x09, 0x6, +0 }, + { 0x1058F31,0x00B5333, 0x14,0x16, 0x0, +0 }, + { 0x1079FA1,0x00A7724, 0x1D,0x08, 0xA, +0 }, + { 0x009D531,0x01D6175, 0x1B,0x4C, 0xA, +0 }, + { 0x0076172,0x01B6223, 0x26,0x10, 0xE, +0 }, + { 0x194A8E1,0x0086221, 0x0F,0x04, 0x0, +0 }, + { 0x00986F1,0x00B75E1, 0x9C,0x0B, 0x0, +0 }, + { 0x008DF22,0x0297761, 0x2C,0x03, 0x0, +0 }, + { 0x27A88E2,0x0097721, 0x2C,0x00, 0x0, +0 }, + { 0x05488E2,0x0087721, 0x17,0x0B, 0xE, +0 }, + { 0x02686F1,0x02755F1, 0x1F,0x04, 0xE, +0 }, + { 0x0099FE1,0x0086FE1, 0x3F,0x05, 0x1, +0 }, + { 0x004A822,0x0096A21, 0xE6,0x05, 0x0, +0 }, + { 0x00C9222,0x00DA261, 0x1B,0x0A, 0xE, +0 }, + { 0x122F461,0x05FA361, 0x15,0x04, 0xE, +0 }, + { 0x10ABB21,0x0096FA1, 0xD2,0x03, 0xC, +0 }, + { 0x0387761,0x0499261, 0x17,0x09, 0x8, +0 }, + { 0x21D7120,0x178F124, 0x08,0x05, 0x0, +0 }, + { 0x193CA21,0x01A7A21, 0x00,0x03, 0x0, +0 }, + { 0x1C99223,0x1089122, 0x06,0x08, 0xB, +0 }, + { 0x01BF321,0x05FE122, 0x1D,0x04, 0xE, +0 }, + { 0x15562E1,0x125FAC8, 0x01,0x0B, 0x5, +0 }, + { 0x0012161,0x01534E1, 0x26,0x02, 0xE, +0 }, + { 0x0358361,0x106D161, 0x19,0x02, 0xC, +0 }, + { 0x101D3E1,0x0378262, 0xDC,0x82, 0x0, +0 }, + { 0x166446A,0x0365161, 0x33,0x04, 0x0, +0 }, + { 0x0F38262,0x1F53261, 0x0B,0x06, 0x4, +0 }, + { 0x1766261,0x02661A1, 0x9A,0x04, 0xC, +0 }, + { 0x1D52222,0x1053F21, 0x13,0x06, 0xA, +0 }, + { 0x0F4F2E1,0x0F69121, 0x9C,0x05, 0xE, +0 }, + { 0x1554163,0x10541A2, 0x0A,0x06, 0xB, +0 }, + { 0x005F604,0x0E5F301, 0x18,0x0E, 0x0, +0 }, + { 0x196F9E3,0x1F5C261, 0x10,0x00, 0x8, +0 }, + { 0x1C6A144,0x1E5B241, 0xD2,0x06, 0xE, +0 }, + { 0x1772261,0x0264561, 0x94,0x05, 0xE, +0 }, + { 0x184F5E1,0x036A2E1, 0x19,0x07, 0xE, +0 }, + { 0x16473E2,0x10598E1, 0x14,0x07, 0xA, +0 }, + { 0x0348321,0x1F6C324, 0x0B,0x09, 0x8, +0 }, + { 0x19AFB25,0x1F7F432, 0x00,0x03, 0x0, +0 }, + { 0x002DA21,0x0F5F335, 0x1B,0x04, 0xC, +0 }, + { 0x034F763,0x1E5F301, 0x4E,0x05, 0x0, +0 }, + { 0x296F931,0x0F6F531, 0x0F,0x04, 0xA, +0 }, + { 0x1176731,0x01A7325, 0x17,0x0A, 0xE, +0 }, + { 0x129F6E1,0x20868E2, 0x15,0x07, 0x0, +0 }, + { 0x019A6E6,0x1088E61, 0x23,0x05, 0x0, +0 }, + { 0x0D4F027,0x046F205, 0x23,0x0C, 0x0, +0 }, + { 0x1167504,0x1F6C601, 0x07,0x00, 0x5, +0 }, + { 0x033F731,0x085F510, 0x19,0x00, 0x0, +0 }, + { 0x089FA22,0x025F501, 0x0F,0x05, 0xE, +0 }, + { 0x200FF2E,0x02D210E, 0x00,0x18, 0xE, +0 }, + { 0x0F45630,0x2875517, 0x00,0x00, 0x8, +0 }, + { 0x003FF20,0x3967604, 0x00,0x06, 0xE, +0 }, + { 0x200F00E,0x304170A, 0x00,0x13, 0xE, +0 }, + { 0x007F020,0x2F9920E, 0x0C,0x08, 0x0, +0 }, + { 0x008F120,0x008F42E, 0x14,0x08, 0x0, +0 }, + { 0x100F220,0x0052423, 0x09,0x05, 0xE, +0 }, + { 0x002FF2E,0x325332E, 0x00,0x0A, 0xE, +0 }, + { 0x0DF8120,0x0DFF310, 0x00,0x03, 0xE, +0 }, + { 0x1FCF720,0x04AF80A, 0x00,0x00, 0x6, +0 }, + { 0x053F600,0x07AF710, 0x0C,0x00, 0x0, +0 }, + { 0x0FEF227,0x3D8980A, 0x00,0x0C, 0x8, +0 }, + { 0x0F8F128,0x3667606, 0x00,0x0A, 0xC, +0 }, + { 0x050F335,0x1F5F111, 0x69,0x02, 0x0, +0 }, + { 0x2B49230,0x208A421, 0x0F,0x00, 0xC, +0 }, + { 0x0A7FB2C,0x0C9F281, 0x16,0x08, 0x0, +0 }, + { 0x08EA43A,0x085A131, 0x35,0x07, 0xC, +0 }, + { 0x0F7F838,0x0F5F537, 0x13,0x06, 0x8, +0 }, + { 0x061C21A,0x072C212, 0x18,0x03, 0x6, +0 }, + { 0x136F8C2,0x194C311, 0x03,0x03, 0x0, +0 }, + { 0x34FFAE1,0x11AD4E0, 0x07,0x07, 0x1, +0 }, + { 0x13DF9E3,0x03BF5E0, 0x00,0x00, 0x0, +0 }, + { 0x1F62334,0x1173131, 0x1E,0x06, 0xE, +0 }, + { 0x1F2F235,0x1A7E211, 0x02,0x03, 0x0, +0 }, + { 0x084FA37,0x1C9F232, 0x09,0x00, 0x0, +0 }, + { 0x3CEFA21,0x0FBF403, 0x03,0x00, 0x0, +0 }, + { 0x2989120,0x159B125, 0x06,0x06, 0x0, +0 }, + { 0x073F9A1,0x3FCA120, 0x0D,0x04, 0xA, +0 }, + { 0x036F821,0x0F7C123, 0x11,0x00, 0x8, +0 }, + { 0x017F821,0x0FAF223, 0x9E,0x00, 0xE, +0 }, + { 0x146F821,0x006C322, 0x0C,0x07, 0x6, +0 }, + { 0x047F531,0x087F233, 0x96,0x80, 0xA, +0 }, + { 0x0B8FA21,0x077F412, 0x04,0x07, 0x0, +0 }, + { 0x08CF921,0x0FCF334, 0x05,0x00, 0x0, +0 }, + { 0x066F801,0x1F6F521, 0x08,0x06, 0x8, +0 }, + { 0x09BF501,0x0AAF302, 0x19,0x04, 0xC, +0 }, + { 0x124F661,0x2065860, 0x17,0x0B, 0xE, +0 }, + { 0x006F701,0x3F6F720, 0x19,0x08, 0xE, +0 }, + { 0x1F4F461,0x0F5B500, 0x14,0x00, 0x0, +0 }, + { 0x104F6E1,0x12670E1, 0x23,0x05, 0xE, +0 }, + { 0x113F221,0x0055121, 0x20,0x09, 0xE, +0 }, + { 0x0026131,0x0388261, 0x1F,0x83, 0xE, +0 }, + { 0x0135571,0x0197061, 0x20,0x06, 0xE, +0 }, + { 0x0157121,0x0177122, 0x1C,0x00, 0xE, +0 }, + { 0x0257521,0x01771A1, 0x21,0x00, 0xC, +0 }, + { 0x0358221,0x0388221, 0x19,0x03, 0xE, +0 }, + { 0x0357221,0x0378222, 0x1A,0x82, 0xE, +0 }, + { 0x1058F31,0x0085333, 0x14,0x0A, 0x0, +0 }, + { 0x009D531,0x01B6175, 0x1B,0x84, 0xA, +0 }, + { 0x0076172,0x0186223, 0x26,0x0A, 0xE, +0 }, + { 0x00986F1,0x00A75E1, 0x9C,0x05, 0x0, +0 }, + { 0x02384F1,0x01655F2, 0x1D,0x00, 0xE, +0 }, + { 0x2D86901,0x0B65701, 0x1B,0x00, 0xC, +0 }, + { 0x0C4FF22,0x0077921, 0x00,0x0D, 0x0, +0 }, + { 0x05FB9A2,0x0FB9121, 0x0B,0x0F, 0xE, +0 }, + { 0x072FA62,0x198F541, 0x09,0x00, 0xC, +0 }, + { 0x21D8120,0x179F125, 0x08,0x05, 0x0, +0 }, + { 0x1C99223,0x1089122, 0x0C,0x0E, 0xD, +0 }, + { 0x01BF321,0x05FE121, 0x1D,0x0A, 0xE, +0 }, + { 0x001F1A1,0x0153421, 0x27,0x07, 0xE, +0 }, + { 0x2A2F120,0x315F321, 0x14,0x12, 0x0, +0 }, + { 0x034D2E8,0x1343261, 0xDD,0x8B, 0x0, +0 }, + { 0x053F265,0x1F33263, 0x0E,0x11, 0x0, +0 }, + { 0x0837222,0x1055221, 0x19,0x05, 0xC, +0 }, + { 0x074F161,0x07441A1, 0x22,0x06, 0xE, +0 }, + { 0x00553A1,0x0F43221, 0x25,0x00, 0xE, +0 }, + { 0x1554163,0x10541A2, 0x0A,0x03, 0xB, +0 }, + { 0x091F010,0x0E7A51E, 0x0C,0x00, 0x0, +0 }, + { 0x2B29130,0x204A121, 0x10,0x00, 0xC, +0 }, + { 0x0D6F662,0x2E5B241, 0x22,0x00, 0xE, +0 }, + { 0x104F021,0x0043221, 0x2B,0x06, 0xE, +0 }, + { 0x06473E4,0x10548E1, 0x25,0x08, 0x0, +0 }, + { 0x156FA23,0x0FBF622, 0x00,0x00, 0x0, +0 }, + { 0x28CFA21,0x1F7F331, 0x13,0x04, 0xC, +0 }, + { 0x0559131,0x3788133, 0x0D,0x02, 0xA, +0 }, + { 0x0411160,0x14431E6, 0x05,0x00, 0x8, +0 }, + { 0x0722121,0x2646129, 0x0D,0x0D, 0x4, +0 }, + { 0x3922220,0x0A44125, 0x84,0x82, 0x8, +0 }, + { 0x1023220,0x3343120, 0x03,0x00, 0xC, +0 }, + { 0x0B5F100,0x0C2D400, 0x0B,0x07, 0xA, +0 }, + { 0x300FF36,0x2F4F41E, 0x09,0x00, 0xE, +0 }, + { 0x0211131,0x0937122, 0x0A,0x02, 0xA, +0 }, + { 0x1728281,0x0743182, 0x0E,0x05, 0xC, +0 }, + { 0x0331221,0x1243122, 0x00,0x00, 0x8, +0 }, + { 0x0F9F700,0x0CA8601, 0x08,0x00, 0x0, +0 }, + { 0x1F3F030,0x1F4F130, 0x54,0x00, 0xA, +12 }, + { 0x0F3F030,0x1F4F130, 0x52,0x00, 0xA, +12 }, + { 0x1F3E130,0x0F4F130, 0x4E,0x00, 0x8, +12 }, + { 0x015E811,0x014F712, 0x00,0x00, 0x1, +12 }, + { 0x153F110,0x0F4D110, 0x4F,0x00, 0x6, +12 }, + { 0x053F111,0x0F4D111, 0x4F,0x00, 0x6, +12 }, + { 0x051F121,0x0E5D231, 0x66,0x00, 0x6, +0 }, + { 0x0E6F130,0x0E5F1B0, 0x51,0x40, 0x6, +12 }, + { 0x079F212,0x099F110, 0x43,0x40, 0x9, +12 }, + { 0x201F230,0x1F4C130, 0x87,0x00, 0x6, +12 }, + { 0x162A190,0x1A79110, 0x8E,0x00, 0xC, +12 }, + { 0x164F228,0x0E4F231, 0x4F,0x00, 0x8, +0 }, + { 0x0119113,0x0347D14, 0x0E,0x00, 0x9, +0 }, + { 0x041F6B2,0x092D290, 0x0F,0x00, 0x0, +12 }, + { 0x0F3F1F0,0x0F4F1F2, 0x02,0x00, 0x1, +12 }, + { 0x0157980,0x275F883, 0x00,0x00, 0x1, +12 }, + { 0x093F614,0x053F610, 0x1F,0x00, 0x8, +12 }, + { 0x113B681,0x013FF02, 0x99,0x00, 0xA, +0 }, + { 0x0119130,0x0535211, 0x47,0x80, 0x8, +12 }, + { 0x016B1A0,0x117D161, 0x88,0x80, 0x7, +12 }, + { 0x105F130,0x036F494, 0x00,0x00, 0x7, +0 }, + { 0x017F2E2,0x107FF60, 0x9E,0x80, 0x0, +0 }, + { 0x117F2E0,0x007FFA0, 0x9E,0x80, 0x0, +12 }, + { 0x0043030,0x1145431, 0x92,0x80, 0x9, +12 }, + { 0x0178000,0x1176081, 0x49,0x80, 0x6, +12 }, + { 0x015A220,0x1264131, 0x48,0x00, 0xA, +12 }, + { 0x0158220,0x1264631, 0x4A,0x00, 0xA, +12 }, + { 0x03460B0,0x01642B2, 0x0C,0x80, 0x8, +12 }, + { 0x105F020,0x2055231, 0x92,0x00, 0x8, +12 }, + { 0x105F020,0x2055231, 0x92,0x00, 0x0, +12 }, + { 0x0F5F120,0x0F6F120, 0x8D,0x00, 0x0, +12 }, + { 0x1E4E130,0x0E3F230, 0x0D,0x00, 0xA, +12 }, + { 0x21FF100,0x088F400, 0x21,0x00, 0xA, +12 }, + { 0x132EA10,0x2E7D210, 0x87,0x00, 0x2, +12 }, + { 0x0F4E030,0x0F5F230, 0x92,0x80, 0x0, +12 }, + { 0x0FFF100,0x1FFF051, 0x10,0x00, 0xA, +12 }, + { 0x0FFF110,0x1FFF051, 0x0D,0x00, 0xC, +12 }, + { 0x297A110,0x0E7E111, 0x43,0x00, 0x0, +12 }, + { 0x020C420,0x0F6C3B0, 0x0E,0x00, 0x0, +12 }, + { 0x0FFF030,0x0F8F131, 0x96,0x00, 0xA, +12 }, + { 0x014E020,0x0D6E130, 0x8F,0x80, 0x8, +12 }, + { 0x14551E1,0x14691A0, 0x4D,0x00, 0x0, +0 }, + { 0x14551A1,0x14681A0, 0x4D,0x00, 0x0, +12 }, + { 0x2E7F030,0x047F131, 0x00,0x00, 0x0, +0 }, + { 0x0E5F030,0x0F5F131, 0x90,0x80, 0x8, +12 }, + { 0x1F5F430,0x0F6F330, 0x0A,0x00, 0xA, +12 }, + { 0x1468330,0x017D231, 0x15,0x00, 0xA, +12 }, + { 0x1455060,0x14661A1, 0x17,0x00, 0x6, +12 }, + { 0x04460F0,0x0154171, 0x8F,0x00, 0x2, +12 }, + { 0x214D0B0,0x1176261, 0x0F,0x80, 0x6, +0 }, + { 0x211B1F0,0x115A020, 0x8A,0x80, 0x6, +12 }, + { 0x201C3F0,0x0058361, 0x89,0x40, 0x6, +0 }, + { 0x201B370,0x1059360, 0x89,0x40, 0x6, +12 }, + { 0x2F9F830,0x0E67620, 0x97,0x00, 0xE, +12 }, + { 0x035F131,0x0B3F320, 0x24,0x00, 0x0, +12 }, + { 0x0C8AA00,0x0B3D210, 0x04,0x00, 0xA, +12 }, + { 0x104C060,0x10455B1, 0x51,0x80, 0x4, +12 }, + { 0x10490A0,0x1045531, 0x52,0x80, 0x6, +12 }, + { 0x1059020,0x10535A1, 0x51,0x80, 0x4, +12 }, + { 0x10590A0,0x1053521, 0x52,0x80, 0x6, +12 }, + { 0x20569A1,0x20266F1, 0x93,0x00, 0xA, +0 }, + { 0x0031121,0x1043120, 0x4D,0x80, 0x0, +12 }, + { 0x2331100,0x1363100, 0x82,0x80, 0x8, +12 }, + { 0x0549060,0x0047060, 0x56,0x40, 0x0, +12 }, + { 0x0549020,0x0047060, 0x92,0xC0, 0x0, +12 }, + { 0x0B7B1A0,0x08572A0, 0x99,0x80, 0x0, +12 }, + { 0x05460B0,0x07430B0, 0x5A,0x80, 0x0, +12 }, + { 0x0433010,0x0146410, 0x90,0x00, 0x2, -12 }, + { 0x0425090,0x0455411, 0x8F,0x00, 0x2, +0 }, + { 0x1158020,0x0365130, 0x8E,0x00, 0xA, +12 }, + { 0x01F71B0,0x03B7220, 0x1A,0x80, 0xE, +12 }, + { 0x0468020,0x1569220, 0x16,0x00, 0xC, +12 }, + { 0x1E68080,0x1F65190, 0x8D,0x00, 0xC, +12 }, + { 0x0B87020,0x0966120, 0x22,0x80, 0xE, +12 }, + { 0x0B87020,0x0966120, 0x23,0x80, 0xE, +12 }, + { 0x1156020,0x0365130, 0x8E,0x00, 0xA, +12 }, + { 0x1177030,0x1366130, 0x92,0x00, 0xE, +12 }, + { 0x2A69120,0x1978120, 0x4D,0x00, 0xC, +12 }, + { 0x2A69120,0x1979120, 0x8C,0x00, 0xC, +12 }, + { 0x2A68130,0x1976130, 0x50,0x00, 0xC, +12 }, + { 0x2A68130,0x1976130, 0x4A,0x00, 0xA, +12 }, + { 0x00560A0,0x11652B1, 0x96,0x00, 0x6, +12 }, + { 0x10670A0,0x11662B0, 0x89,0x00, 0x6, +12 }, + { 0x00B98A0,0x10B73B0, 0x4A,0x00, 0xA, +12 }, + { 0x10B90A0,0x11B63B0, 0x85,0x00, 0xA, +12 }, + { 0x0167070,0x0085CA2, 0x90,0x80, 0x6, +12 }, + { 0x007C820,0x1077331, 0x4F,0x00, 0xA, +12 }, + { 0x0199030,0x01B6131, 0x91,0x80, 0xA, +12 }, + { 0x017A530,0x01763B0, 0x8D,0x80, 0x8, +12 }, + { 0x08F6EF0,0x02A3570, 0x80,0x00, 0xE, +12 }, + { 0x08850A0,0x02A5560, 0x93,0x80, 0x8, +12 }, + { 0x0176520,0x02774A0, 0x0A,0x00, 0xB, +12 }, + { 0x12724B0,0x01745B0, 0x84,0x00, 0x9, +12 }, + { 0x00457E1,0x0375760, 0xAD,0x00, 0xE, +12 }, + { 0x33457F1,0x05D67E1, 0x28,0x00, 0xE, +0 }, + { 0x00F31D0,0x0053270, 0xC7,0x00, 0xB, +12 }, + { 0x00551B0,0x0294230, 0xC7,0x00, 0xB, +12 }, + { 0x15B5122,0x1256030, 0x52,0x00, 0x0, +12 }, + { 0x15B9122,0x125F030, 0x4D,0x00, 0x0, +12 }, + { 0x19BC120,0x165C031, 0x43,0x00, 0x8, +12 }, + { 0x1ABB160,0x005F131, 0x41,0x00, 0x8, +12 }, + { 0x33357F0,0x00767E0, 0x28,0x00, 0xE, +12 }, + { 0x30457E0,0x04D67E0, 0x23,0x00, 0xE, +12 }, + { 0x304F7E0,0x04D87E0, 0x23,0x00, 0xE, +12 }, + { 0x10B78A1,0x12BF130, 0x42,0x00, 0x8, +12 }, + { 0x0558060,0x014F2E0, 0x21,0x00, 0x8, +12 }, + { 0x0559020,0x014A2A0, 0x21,0x00, 0x8, +12 }, + { 0x195C120,0x16370B0, 0x43,0x80, 0xA, +12 }, + { 0x19591A0,0x1636131, 0x49,0x00, 0xA, +7 }, + { 0x1075124,0x229FDA0, 0x40,0x00, 0x9, +0 }, + { 0x0053280,0x0053360, 0xC0,0x00, 0x9, +12 }, + { 0x0053240,0x00533E0, 0x40,0x00, 0x9, +12 }, + { 0x2A5A1A0,0x196A1A0, 0x8F,0x00, 0xC, +12 }, + { 0x005F0E0,0x0548160, 0x44,0x00, 0x1, +12 }, + { 0x105F0E0,0x0547160, 0x44,0x80, 0x1, +12 }, + { 0x033A180,0x05452E0, 0x8A,0x00, 0x7, +12 }, + { 0x1528081,0x1532340, 0x9D,0x80, 0xE, +12 }, + { 0x14551E1,0x14691A0, 0x4D,0x00, 0x0, +12 }, + { 0x15211E1,0x17380E0, 0x8C,0x80, 0x8, +12 }, + { 0x0477220,0x019F883, 0x40,0x00, 0xB, +12 }, + { 0x1028500,0x11245C1, 0xD2,0x00, 0xA, +0 }, + { 0x0034522,0x23535E3, 0xD2,0x00, 0xA, +7 }, + { 0x074F604,0x024A302, 0xC0,0x00, 0x0, -12 }, + { 0x0D2C090,0x0D2D130, 0x8E,0x00, 0x0, +12 }, + { 0x0D2D090,0x0D2F130, 0x8E,0x00, 0x0, +12 }, + { 0x0F390D0,0x0F3C2C0, 0x12,0x00, 0x0, +12 }, + { 0x0F390D0,0x0F2C2C0, 0x12,0x80, 0x0, +12 }, + { 0x15213E0,0x21333F1, 0x1A,0x80, 0x0, +0 }, + { 0x0BA45E0,0x19132F0, 0x1A,0x00, 0x0, +12 }, + { 0x1025810,0x0724202, 0x18,0x00, 0xA, +12 }, + { 0x0B36320,0x0B36324, 0x08,0x00, 0x2, +12 }, + { 0x0127730,0x1F4F310, 0x0D,0x00, 0x4, +12 }, + { 0x033F900,0x273F400, 0x80,0x80, 0x0, +12 }, + { 0x2ACF907,0x229F90F, 0x1A,0x00, 0x0, +12 }, + { 0x153F220,0x0E49122, 0x21,0x00, 0x8, +12 }, + { 0x339F103,0x074D615, 0x4F,0x00, 0x6, +0 }, + { 0x1158930,0x2076B21, 0x42,0x00, 0xA, +12 }, + { 0x003A130,0x0265221, 0x1F,0x00, 0xE, +12 }, + { 0x0134030,0x1166130, 0x13,0x80, 0x8, +12 }, + { 0x032A113,0x172B212, 0x00,0x80, 0x1, +5 }, + { 0x001E795,0x0679616, 0x81,0x00, 0x4, +12 }, + { 0x104F003,0x0058220, 0x49,0x00, 0x6, +12 }, + { 0x0D1F813,0x078F512, 0x44,0x00, 0x6, +12 }, + { 0x0ECA710,0x0F5D510, 0x0B,0x00, 0x0, +0 }, + { 0x0C8A820,0x0B7D601, 0x0B,0x00, 0x0, +0 }, + { 0x0C4F800,0x0B7D300, 0x0B,0x00, 0x0, +12 }, + { 0x031410C,0x31D2110, 0x8F,0x80, 0xE, +0 }, + { 0x1B33432,0x3F75431, 0x21,0x00, 0xE, +12 }, + { 0x00437D1,0x0343750, 0xAD,0x00, 0xE, +12 }, + { 0x2013E02,0x2F31408, 0x00,0x00, 0xE, +0 }, + { 0x003EBF5,0x06845F6, 0xD4,0x00, 0x7, +0 }, + { 0x171DAF0,0x117B0CA, 0x00,0xC0, 0x8, +0 }, + { 0x1111EF0,0x11121E2, 0x00,0xC0, 0x8, -24 }, + { 0x20053EF,0x30210EF, 0x86,0xC0, 0xE, +12 }, + { 0x2F0F00C,0x0E6F604, 0x00,0x00, 0xE, +0 }, + { 0x047FA00,0x006F900, 0x00,0x00, 0x6, +12 }, + { 0x067FD02,0x078F703, 0x80,0x00, 0x6, +12 }, + { 0x214F70F,0x247F900, 0x05,0x00, 0xE, +12 }, + { 0x3FB88E1,0x2A8A6FF, 0x00,0x00, 0xF, +12 }, + { 0x0FFAA06,0x0FAF700, 0x00,0x00, 0xE, +12 }, + { 0x06CF502,0x138F703, 0x00,0x00, 0x7, +0 }, + { 0x078F502,0x137F700, 0x00,0x00, 0x7, +0 }, + { 0x037F502,0x137F702, 0x00,0x00, 0x3, +12 }, + { 0x0E6C204,0x343E800, 0x10,0x00, 0xE, +12 }, + { 0x212FD03,0x205FD02, 0x80,0x80, 0xA, +12 }, + { 0x085E400,0x234D7C0, 0x80,0x80, 0xE, +12 }, + { 0x0E6E204,0x144B801, 0x90,0x00, 0xE, +12 }, + { 0x2777602,0x3679801, 0x87,0x00, 0xF, +12 }, + { 0x270F604,0x3A3C607, 0x81,0x00, 0xE, +12 }, + { 0x067FD00,0x098F601, 0x00,0x00, 0x6, +12 }, + { 0x0F0F081,0x004F49F, 0x00,0xC3, 0xA, +0 }, + { 0x056FB03,0x017F700, 0x81,0x00, 0x0, +12 }, + { 0x2D65A00,0x0FFFFBF, 0x0E,0xC0, 0xA, +12 }, + { 0x1C7F900,0x0FFFF80, 0x07,0xC0, 0xA, +12 }, + { 0x1D1F813,0x078F512, 0x44,0x00, 0x6, +12 }, + { 0x1DC5E01,0x0FFFFBF, 0x0B,0xC0, 0xA, +12 }, + { 0x113F020,0x027E322, 0x8C,0x80, 0xA, +12 }, + { 0x125A020,0x136B220, 0x86,0x00, 0x6, +12 }, + { 0x015C520,0x0A6D221, 0x28,0x00, 0xC, +12 }, + { 0x1006010,0x0F68110, 0x1A,0x00, 0x8, +12 }, + { 0x2E7F030,0x047F131, 0x12,0x00, 0x0, +0 }, + { 0x1E7F510,0x2E7F610, 0x0D,0x00, 0xD, +12 }, + { 0x0465020,0x1569220, 0x96,0x80, 0xC, +12 }, + { 0x075FC01,0x037F800, 0x00,0x00, 0x0, +12 }, + { 0x175F701,0x336FC00, 0xC0,0x00, 0xC, +54 }, + { 0x2709404,0x3A3C607, 0x81,0x00, 0xE, +12 }, + { 0x0B5F901,0x050D4BF, 0x07,0xC0, 0xB, +12 }, + { 0x0FFF110,0x1FFF051, 0x06,0x00, 0x2, +12 }, + { 0x0069421,0x0A6C3A2, 0x0E,0x00, 0x2, +0 }, + { 0x000F081,0x004F41F, 0x00,0xC3, 0xA, +0 }, + { 0x03BF271,0x00BF3A1, 0x0E,0x00, 0x6, +0 }, + { 0x054F60C,0x0B5F341, 0x5C,0x00, 0x0, +0 }, + { 0x0E6F318,0x0F6F241, 0x62,0x00, 0x0, +0 }, + { 0x082D385,0x0E3A341, 0x59,0x80, 0xC, +0 }, + { 0x1557403,0x005B341, 0x49,0x80, 0x4, +0 }, + { 0x014F6B1,0x007F131, 0x92,0x00, 0x2, +0 }, + { 0x058C7B2,0x008C730, 0x14,0x00, 0x2, +0 }, + { 0x018AAB0,0x0088A71, 0x44,0x00, 0x4, +0 }, + { 0x1239723,0x0145571, 0x93,0x00, 0x4, +0 }, + { 0x10497A1,0x0045571, 0x13,0x80, 0x0, +0 }, + { 0x12A9824,0x01A4671, 0x48,0x00, 0xC, +0 }, + { 0x10691A1,0x0076121, 0x13,0x00, 0xA, +0 }, + { 0x0067121,0x0076161, 0x13,0x89, 0x6, +0 }, + { 0x194F302,0x0C8F381, 0x9C,0x80, 0xC, +0 }, + { 0x04F2009,0x0F8D144, 0xA1,0x80, 0x8, +0 }, + { 0x0069421,0x0A6C362, 0x1E,0x00, 0x2, +0 }, + { 0x11CD1B1,0x00C6131, 0x49,0x00, 0x8, +0 }, + { 0x1037F61,0x1073F21, 0x98,0x00, 0x0, +0 }, + { 0x012C161,0x0054FA1, 0x93,0x00, 0xA, +0 }, + { 0x022C121,0x0054FA1, 0x18,0x00, 0xC, +0 }, + { 0x015F431,0x0058AB2, 0x5B,0x83, 0x0, +0 }, + { 0x0397461,0x06771A1, 0x90,0x00, 0x0, +0 }, + { 0x00554B1,0x0057AB2, 0x57,0x00, 0xC, +0 }, + { 0x0635450,0x045A581, 0x00,0x00, 0x8, +0 }, + { 0x0157621,0x03782A1, 0x94,0x00, 0xC, +0 }, + { 0x01F75A1,0x00F7422, 0x8A,0x06, 0x8, +0 }, + { 0x1557261,0x0187121, 0x86,0x0D, 0x0, +0 }, + { 0x1029331,0x00B72A1, 0x8F,0x00, 0x8, +0 }, + { 0x1039331,0x00982A1, 0x91,0x00, 0xA, +0 }, + { 0x10F9331,0x00F72A1, 0x8E,0x00, 0xA, +0 }, + { 0x01F7561,0x00A7521, 0x9C,0x00, 0x2, +0 }, + { 0x05666E1,0x0266561, 0x4C,0x00, 0x0, +0 }, + { 0x04676A2,0x0365561, 0xCB,0x00, 0x0, +0 }, + { 0x00757A2,0x0075661, 0x99,0x00, 0xB, +0 }, + { 0x00777A2,0x0077661, 0x93,0x00, 0xB, +0 }, + { 0x0126621,0x00A9661, 0x45,0x00, 0x0, +0 }, + { 0x005DF62,0x0076FA1, 0x9E,0x40, 0x2, +0 }, + { 0x001EF20,0x2068FA0, 0x1A,0x00, 0x0, +0 }, + { 0x09453B7,0x005A061, 0xA5,0x00, 0x2, +0 }, + { 0x011A8A1,0x0032571, 0x1F,0x80, 0xA, +0 }, + { 0x03491A1,0x01655A1, 0x17,0x00, 0xC, +0 }, + { 0x00154B1,0x0036AB2, 0x5D,0x00, 0x0, +0 }, + { 0x0432121,0x0354262, 0x97,0x00, 0x8, +0 }, + { 0x177A161,0x1473121, 0x1C,0x00, 0x0, +0 }, + { 0x0F6F83A,0x0028691, 0xCE,0x00, 0x2, +0 }, + { 0x081B122,0x026F2A1, 0x92,0x83, 0xC, +0 }, + { 0x151F181,0x0F5F282, 0x4D,0x00, 0x0, +0 }, + { 0x15111A1,0x0131163, 0x94,0x80, 0x6, +0 }, + { 0x032D453,0x111EB51, 0x91,0x00, 0x8, +0 }, + { 0x303FF40,0x014FF10, 0x00,0x0D, 0xC, +0 }, + { 0x306F640,0x3176711, 0x00,0x00, 0xE, +0 }, + { 0x205F540,0x3164611, 0x00,0x09, 0xE, +0 }, + { 0x048F881,0x0057582, 0x45,0x08, 0x0, +0 }, + { 0x132FA13,0x1F9F211, 0x80,0x0A, 0x8, +0 }, + { 0x0F2F409,0x0E2F211, 0x1B,0x80, 0x2, +0 }, + { 0x0F3D403,0x0F3A340, 0x94,0x40, 0x6, +0 }, + { 0x1058761,0x0058730, 0x80,0x03, 0x7, +0 }, + { 0x174A423,0x0F8F271, 0x9D,0x80, 0xC, +0 }, + { 0x0007FF1,0x1167F21, 0x8D,0x00, 0x0, +0 }, + { 0x0759511,0x1F5C501, 0x0D,0x80, 0x0, +0 }, + { 0x073F222,0x0F3F331, 0x97,0x80, 0x2, +0 }, + { 0x105F510,0x0C3F411, 0x41,0x00, 0x6, +0 }, + { 0x01096C1,0x1166221, 0x8B,0x00, 0x6, +0 }, + { 0x01096C1,0x1153221, 0x8E,0x00, 0x6, +0 }, + { 0x012C4A1,0x0065F61, 0x97,0x00, 0xE, +0 }, + { 0x010E4B1,0x0056A62, 0xCD,0x83, 0x0, +0 }, + { 0x0F57591,0x144A440, 0x0D,0x00, 0xE, +0 }, + { 0x0256421,0x0088F21, 0x92,0x01, 0xC, +0 }, + { 0x0167421,0x0078F21, 0x93,0x00, 0xC, +0 }, + { 0x0176421,0x0378261, 0x94,0x00, 0xC, +0 }, + { 0x0195361,0x0077F21, 0x94,0x04, 0xA, +0 }, + { 0x0187461,0x0088422, 0x8F,0x00, 0xA, +0 }, + { 0x016A571,0x00A8F21, 0x4A,0x00, 0x8, +0 }, + { 0x00A8871,0x1198131, 0x4A,0x00, 0x0, +0 }, + { 0x0219632,0x0187261, 0x4A,0x00, 0x4, +0 }, + { 0x04A85E2,0x01A85E1, 0x59,0x00, 0x0, +0 }, + { 0x02887E1,0x01975E1, 0x48,0x00, 0x0, +0 }, + { 0x0451261,0x1045F21, 0x8E,0x84, 0x8, +0 }, + { 0x106A510,0x004FA00, 0x86,0x03, 0x6, +0 }, + { 0x202A50E,0x017A700, 0x09,0x00, 0xE, +0 }, + { 0x0F6B710,0x005F011, 0x40,0x00, 0x6, +0 }, + { 0x00BF506,0x008F602, 0x07,0x00, 0xA, +0 }, + { 0x001FF0E,0x008FF0E, 0x00,0x00, 0xE, +0 }, + { 0x209F300,0x005F600, 0x06,0x00, 0x4, +0 }, + { 0x006F60C,0x247FB12, 0x00,0x00, 0xE, +0 }, + { 0x004F60C,0x244CB12, 0x00,0x05, 0xE, +0 }, + { 0x001F60C,0x242CB12, 0x00,0x00, 0xA, +0 }, + { 0x000F00E,0x3049F40, 0x00,0x00, 0xE, +0 }, + { 0x030F50E,0x0039F50, 0x00,0x04, 0xE, +0 }, + { 0x204940E,0x0F78700, 0x02,0x0A, 0xA, +0 }, + { 0x000F64E,0x2039F1E, 0x00,0x00, 0xE, +0 }, + { 0x000F60E,0x3029F50, 0x00,0x00, 0xE, +0 }, + { 0x100FF00,0x014FF10, 0x00,0x00, 0xC, +0 }, + { 0x04F760E,0x2187700, 0x40,0x03, 0xE, +0 }, + { 0x1F4FC02,0x0F4F712, 0x00,0x05, 0x6, +0 }, + { 0x053F101,0x074D211, 0x4F,0x00, 0x6, +0 }, + { 0x00381A5,0x005F1B2, 0xD2,0x80, 0x2, +0 }, + { 0x0F0FB3E,0x09BA0B1, 0x29,0x00, 0x0, +0 }, + { 0x315EF11,0x0B5F441, 0x53,0x00, 0x8, +0 }, + { 0x0F7F000,0x0068761, 0x30,0x00, 0xF, +0 }, + { 0x0100133,0x0337D14, 0x87,0x80, 0x8, +0 }, + { 0x1FFF000,0x1FFF001, 0x0A,0x00, 0xE, +0 }, + { 0x0AE71E1,0x09E81E1, 0x16,0x00, 0xA, +0 }, + { 0x2831621,0x0C31320, 0xDA,0x00, 0x8, +0 }, + { 0x0022A95,0x0F34212, 0x97,0x80, 0x0, +0 }, + { 0x001EF4F,0x0F19801, 0x81,0x00, 0x4, +0 }, + { 0x019D530,0x01B61B1, 0x88,0x80, 0xC, +0 }, + { 0x0176E71,0x00E8B22, 0xC5,0x05, 0x2, +0 }, + { 0x0157261,0x0278461, 0x1C,0x00, 0xE, +0 }, + { 0x0427847,0x0548554, 0x4D,0x00, 0xA, +0 }, + { 0x011F111,0x0B3F101, 0x4A,0x88, 0x6, +0 }, + { 0x0117171,0x11562A1, 0x8B,0x00, 0x6, +0 }, + { 0x0035172,0x0135262, 0x1C,0x05, 0xE, +0 }, + { 0x0035131,0x06754A1, 0x1C,0x80, 0xE, +0 }, + { 0x0115270,0x0FE3171, 0xC5,0x40, 0x0, +0 }, + { 0x021FF13,0x003FF11, 0x96,0x80, 0xA, +0 }, + { 0x01797F1,0x018F121, 0x01,0x0D, 0x8, +0 }, + { 0x0F7F0F5,0x00687B1, 0x2E,0x00, 0xB, +0 }, + { 0x01B5132,0x03BA2A1, 0x9A,0x82, 0xC, +0 }, + { 0x0176E71,0x00E8B62, 0xC5,0x05, 0x2, +0 }, + { 0x019D530,0x01B61B1, 0xCD,0x40, 0xC, +0 }, + { 0x00B4131,0x03B92A1, 0x1C,0x80, 0xC, +0 }, + { 0x01D5321,0x03B52A1, 0x1C,0x80, 0xC, +0 }, + { 0x01F4171,0x03B92A1, 0x1C,0x80, 0xE, +0 }, + { 0x0177421,0x0176562, 0x83,0x00, 0x7, +0 }, + { 0x0AE7121,0x09E8121, 0x16,0x00, 0xE, +0 }, + { 0x212AA53,0x021AC51, 0x97,0x80, 0xE, +0 }, + { 0x112AA43,0x1119B51, 0x1C,0x00, 0xE, +0 }, + { 0x001FFA4,0x0F3F53E, 0xDB,0xC0, 0x4, +0 }, + { 0x0AC9011,0x1F4F071, 0x1A,0x00, 0xF, +0 }, + { 0x22F55B0,0x31E87E0, 0x16,0x80, 0xC, +0 }, + { 0x08F6EE0,0x02A65A1, 0xEC,0x00, 0xE, +0 }, + { 0x2A2B264,0x1D49703, 0x02,0x80, 0xE, +0 }, + { 0x0F3F8E2,0x0F3F770, 0x86,0x40, 0x4, +0 }, + { 0x0F0E026,0x031FF1E, 0x03,0x00, 0x8, +0 }, + { 0x0056541,0x0743291, 0x83,0x00, 0xA, +0 }, + { 0x061F217,0x0B2F112, 0x4F,0x08, 0x8, +0 }, + { 0x011F111,0x061D001, 0x4A,0x40, 0x6, +0 }, + { 0x282B264,0x1DA9803, 0x00,0x00, 0xE, +0 }, + { 0x282B264,0x1D49703, 0x00,0x80, 0xE, +0 }, + { 0x06F9A02,0x007A006, 0x00,0x00, 0x0, +0 }, + { 0x0B2F131,0x0AFF111, 0x8F,0x83, 0x8, +0 }, + { 0x0B2F131,0x0D5C131, 0x19,0x01, 0x9, +0 }, + { 0x0D2F111,0x0E6F211, 0x4C,0x83, 0xA, +0 }, + { 0x0D5C111,0x0E6C231, 0x15,0x00, 0xB, +0 }, + { 0x0D4F315,0x0E4B115, 0x5F,0x61, 0xE, +0 }, + { 0x0E4B111,0x0B5B111, 0x5C,0x00, 0xE, +0 }, + { 0x0D4F111,0x0E4C302, 0x89,0x5F, 0xD, +12 }, + { 0x035C100,0x0D5C111, 0x9B,0x00, 0xC, +0 }, + { 0x050F210,0x0F0E131, 0x60,0x5D, 0x4, +12 }, + { 0x040B230,0x5E9F111, 0xA2,0x80, 0x4, +0 }, + { 0x0E3F217,0x0E2C211, 0x54,0x06, 0xA, +0 }, + { 0x0C3F219,0x0D2F291, 0x2B,0x07, 0xB, +0 }, + { 0x004A61A,0x004F600, 0x27,0x0A, 0x3, +0 }, + { 0x0790824,0x0E6E384, 0x9A,0x5B, 0xA, +12 }, + { 0x0E6F314,0x0E6F280, 0x62,0x00, 0xB, +0 }, + { 0x055F71C,0x0D88520, 0xA3,0x0D, 0x6, +0 }, + { 0x055F718,0x0D8E521, 0x23,0x00, 0x7, +0 }, + { 0x0F7E701,0x1557403, 0x84,0x49, 0xD, +0 }, + { 0x005B301,0x0F77601, 0x80,0x80, 0xD, +0 }, + { 0x02AA2A0,0x02AA522, 0x85,0x9E, 0x7, +0 }, + { 0x02AA5A2,0x02AA128, 0x83,0x95, 0x7, +0 }, + { 0x038C620,0x057F621, 0x81,0x80, 0x7, +0 }, + { 0x00AAFE1,0x00AAF62, 0x91,0x83, 0x9, +0 }, + { 0x002B025,0x0057030, 0x5F,0x40, 0xC, +0 }, + { 0x002C031,0x0056031, 0x46,0x80, 0xD, +0 }, + { 0x015C821,0x0056F31, 0x93,0x00, 0xC, +0 }, + { 0x005CF31,0x0057F32, 0x16,0x87, 0xD, +0 }, + { 0x4F2B913,0x0119102, 0x0D,0x1A, 0xA, +0 }, + { 0x14A9221,0x02A9122, 0x99,0x00, 0xA, +0 }, + { 0x242F823,0x2FA9122, 0x96,0x1A, 0x0, +0 }, + { 0x0BA9221,0x04A9122, 0x99,0x00, 0x0, +0 }, + { 0x0487131,0x0487131, 0x19,0x00, 0xD, +0 }, + { 0x0DAF904,0x0DFF701, 0x0B,0x80, 0x9, +0 }, + { 0x09AA101,0x0DFF221, 0x89,0x40, 0x6, +0 }, + { 0x0DAF904,0x0DFF701, 0x0B,0x80, 0x7, +0 }, + { 0x0C8F621,0x0C8F101, 0x1C,0x1F, 0xA, +0 }, + { 0x0C8F101,0x0C8F201, 0xD8,0x00, 0xA, +0 }, + { 0x1038D12,0x0866503, 0x95,0x8B, 0x9, +0 }, + { 0x113DD31,0x0265621, 0x17,0x00, 0x8, +0 }, + { 0x012C121,0x0054F61, 0x1A,0x00, 0xC, +0 }, + { 0x012C1A1,0x0054F21, 0x93,0x00, 0xD, +0 }, + { 0x022C122,0x0054F22, 0x0B,0x1C, 0xD, +0 }, + { 0x0F5A006,0x035A3E4, 0x03,0x23, 0xE, +0 }, + { 0x0077FA1,0x0077F61, 0x51,0x00, 0xF, +0 }, + { 0x0578402,0x074A7E4, 0x05,0x16, 0xE, +0 }, + { 0x03974A1,0x0677161, 0x90,0x00, 0xF, +0 }, + { 0x054990A,0x0639707, 0x65,0x60, 0x8, +0 }, + { 0x1045FA1,0x0066F61, 0x59,0x00, 0x8, +0 }, + { 0x0178421,0x008AF61, 0x15,0x0B, 0xD, +0 }, + { 0x0178521,0x0097F21, 0x94,0x05, 0xC, +0 }, + { 0x0178421,0x008AF61, 0x15,0x0D, 0xD, +0 }, + { 0x1277131,0x0499161, 0x15,0x83, 0xC, +0 }, + { 0x0277DB1,0x0297A21, 0x10,0x08, 0xD, +0 }, + { 0x00A6321,0x00B7F21, 0x9F,0x00, 0xE, +0 }, + { 0x00A65A1,0x00B7F61, 0xA2,0x00, 0xF, +0 }, + { 0x02AA961,0x036A823, 0xA3,0x52, 0x8, +0 }, + { 0x016AAA1,0x00A8F21, 0x94,0x80, 0x8, +0 }, + { 0x011DA25,0x068A6E3, 0x00,0x2B, 0xC, +0 }, + { 0x05F85E1,0x01A65E1, 0x1F,0x00, 0xD, +0 }, + { 0x05F88E1,0x01A65E1, 0x46,0x00, 0xD, +0 }, + { 0x011DA25,0x068A623, 0x00,0x1E, 0xC, +0 }, + { 0x0588821,0x01A6521, 0x8C,0x00, 0xD, +0 }, + { 0x001DF26,0x03876E4, 0x00,0x2B, 0xC, +0 }, + { 0x0369522,0x00776E1, 0xD8,0x00, 0xD, +0 }, + { 0x087C4A3,0x076C626, 0x00,0x57, 0xE, +0 }, + { 0x0558622,0x0186421, 0x46,0x80, 0xF, +0 }, + { 0x04AA321,0x00A8621, 0x48,0x00, 0x8, +0 }, + { 0x0126621,0x00A9621, 0x45,0x00, 0x9, +0 }, + { 0x109F121,0x109F121, 0x1D,0x80, 0xB, +0 }, + { 0x0332121,0x0454222, 0x97,0x03, 0x8, +0 }, + { 0x0D421A1,0x0D54221, 0x99,0x03, 0x9, +0 }, + { 0x0336121,0x0354261, 0x8D,0x03, 0xA, +0 }, + { 0x177A1A1,0x1473121, 0x1C,0x00, 0xB, +0 }, + { 0x0331121,0x0354261, 0x89,0x03, 0xA, +0 }, + { 0x0E42121,0x0D54261, 0x8C,0x03, 0xB, +0 }, + { 0x1471121,0x007CF21, 0x15,0x00, 0x0, +0 }, + { 0x0E41121,0x0D55261, 0x8C,0x00, 0x1, +0 }, + { 0x58AFE0F,0x006FB04, 0x83,0x85, 0xC, +0 }, + { 0x003A821,0x004A722, 0x99,0x00, 0xD, +0 }, + { 0x0937501,0x0B4C502, 0x61,0x80, 0x8, +0 }, + { 0x0957406,0x072A501, 0x5B,0x00, 0x9, +0 }, + { 0x056B222,0x056F261, 0x92,0x8A, 0xC, +0 }, + { 0x2343121,0x00532A1, 0x9D,0x80, 0xD, +0 }, + { 0x088A324,0x087A322, 0x40,0x5B, 0xE, +0 }, + { 0x151F101,0x0F5F241, 0x13,0x00, 0xF, +0 }, + { 0x04211A1,0x0731161, 0x10,0x92, 0xA, +0 }, + { 0x0211161,0x0031DA1, 0x98,0x80, 0xB, +0 }, + { 0x0167D62,0x01672A2, 0x57,0x80, 0x4, +0 }, + { 0x0069F61,0x0049FA1, 0x5B,0x00, 0x5, +0 }, + { 0x024A238,0x024F231, 0x9F,0x9C, 0x6, +0 }, + { 0x014F123,0x0238161, 0x9F,0x00, 0x6, +0 }, + { 0x053C601,0x0D5F583, 0x71,0x40, 0x7, +0 }, + { 0x4FCFA15,0x0ECFA12, 0x11,0x80, 0xA, +0 }, + { 0x0FCFA18,0x0E5F812, 0x9D,0x00, 0xB, +0 }, + { 0x007A801,0x083F600, 0x5C,0x03, 0x7, +0 }, + { 0x458F811,0x0E5F310, 0x8F,0x00, 0xE, +0 }, + { 0x154F610,0x0E4F410, 0x92,0x00, 0xF, +0 }, + { 0x0001F0F,0x3F01FC0, 0x00,0x00, 0xE, +0 }, + { 0x0001F0F,0x3F11FC0, 0x3F,0x3F, 0xF, +0 }, + { 0x024F806,0x7845603, 0x80,0x88, 0xE, +0 }, + { 0x024D803,0x7846604, 0x1E,0x08, 0xF, +0 }, + { 0x001FF06,0x3043414, 0x00,0x00, 0xE, +0 }, + { 0x001FF26,0x1841204, 0x00,0x00, 0xE, +0 }, + { 0x0F86848,0x0F10001, 0x00,0x3F, 0x5, +0 }, + { 0x0F86747,0x0F8464C, 0x00,0x00, 0x5, +0 }, + { 0x261B235,0x015F414, 0x1C,0x08, 0xA, +1 }, + { 0x715FE11,0x019F487, 0x20,0xC0, 0xB, +0 }, + { 0x1112EF0,0x11621E2, 0x00,0xC0, 0x8, -36 }, + { 0x7112EF0,0x11621E2, 0x00,0xC0, 0x9, +0 }, + { 0x007FC01,0x638F802, 0x03,0x03, 0xF, +0 }, + { 0x007FC00,0x638F801, 0x03,0x03, 0xF, +0 }, + { 0x00CFD01,0x03CD600, 0x07,0x00, 0x0, +0 }, + { 0x00CF600,0x006F600, 0x00,0x00, 0x1, +0 }, + { 0x008F60C,0x247FB12, 0x00,0x00, 0xB, +0 }, + { 0x008F60C,0x2477B12, 0x00,0x00, 0xA, +0 }, + { 0x008F60C,0x2477B12, 0x00,0x00, 0xB, +0 }, + { 0x002F60C,0x243CB12, 0x00,0x15, 0xB, +0 }, + { 0x3E4E40F,0x1E5F508, 0x00,0x0A, 0x6, +0 }, + { 0x366F50F,0x1A5F508, 0x00,0x19, 0x7, +0 }, + { 0x3E4E40F,0x1E5F507, 0x00,0x11, 0x6, +0 }, + { 0x365F50F,0x1A5F506, 0x00,0x1E, 0x7, +0 }, + { 0x0C49406,0x2F5F604, 0x00,0x00, 0x0, +0 }, + { 0x004F902,0x0F79705, 0x00,0x03, 0x0, +0 }, + { 0x156F28F,0x100F446, 0x03,0x00, 0xE, +0 }, + { 0x000F38F,0x0A5F442, 0x00,0x06, 0xE, +0 }, + { 0x237F811,0x005F310, 0x45,0x00, 0x8, +0 }, + { 0x037F811,0x005F310, 0x05,0x08, 0x9, +0 }, + { 0x155F381,0x000F441, 0x00,0x00, 0xE, +0 }, + { 0x000F341,0x0A4F48F, 0x00,0x00, 0xE, +0 }, + { 0x503FF80,0x014FF10, 0x00,0x00, 0xC, +0 }, + { 0x503FF80,0x014FF10, 0x00,0x0D, 0xD, +0 }, + { 0x3E5E40F,0x1E7F508, 0x00,0x0A, 0x6, +0 }, + { 0x366F50F,0x1A8F608, 0x00,0x19, 0x7, +0 }, + { 0x00CF506,0x008F502, 0xC8,0x0B, 0x6, +0 }, + { 0x00CF506,0x007F501, 0xC5,0x03, 0x7, +0 }, + { 0x0BFFA01,0x096C802, 0x8F,0x80, 0x6, +0 }, + { 0x0BFFA01,0x096C802, 0xCF,0x0B, 0x7, +0 }, + { 0x087FA01,0x0B7FA01, 0x4F,0x08, 0x7, +0 }, + { 0x08DFA01,0x0B5F802, 0x55,0x00, 0x6, +0 }, + { 0x08DFA01,0x0B5F802, 0x55,0x12, 0x7, +0 }, + { 0x08DFA01,0x0B6F802, 0x59,0x00, 0x6, +0 }, + { 0x08DFA01,0x0B6F802, 0x59,0x12, 0x7, +0 }, + { 0x00AFA01,0x006F900, 0x00,0x00, 0xE, +0 }, + { 0x00AFA01,0x006F900, 0x00,0x0D, 0xF, +0 }, + { 0x089F900,0x06CF600, 0x80,0x08, 0xF, +0 }, + { 0x388F803,0x0B6F60C, 0x8D,0x00, 0xE, +0 }, + { 0x088F803,0x0B8F80C, 0x88,0x12, 0xF, +0 }, + { 0x388F803,0x0B6F60C, 0x88,0x03, 0xE, +0 }, + { 0x388F803,0x0B8F80C, 0x88,0x0F, 0xF, +0 }, + { 0x04F760F,0x2187700, 0x00,0x12, 0xF, +0 }, + { 0x249C80F,0x2699B02, 0x40,0x80, 0xE, +0 }, + { 0x249C80F,0x2699B0F, 0xC0,0x19, 0xF, +0 }, + { 0x305AD57,0x0058D87, 0xDC,0x00, 0xE, +0 }, + { 0x305AD47,0x0058D87, 0xDC,0x12, 0xF, +0 }, + { 0x304A857,0x0048887, 0xDC,0x00, 0xE, +0 }, + { 0x304A857,0x0058887, 0xDC,0x08, 0xF, +0 }, + { 0x3F40006,0x0F5F715, 0x3F,0x00, 0x0, +0 }, + { 0x3F40006,0x0F5F715, 0x3F,0x08, 0x1, +0 }, + { 0x3F40006,0x0F5F712, 0x3F,0x08, 0x1, +0 }, + { 0x7476701,0x0476703, 0xCD,0x40, 0x8, +0 }, + { 0x0476701,0x0556501, 0xC0,0x00, 0x9, +0 }, + { 0x0A76701,0x0356503, 0x17,0x1E, 0xA, +0 }, + { 0x0777701,0x0057501, 0x9D,0x00, 0xB, +0 }, + { 0x3F0E00A,0x005FF1F, 0x40,0x40, 0x8, +0 }, + { 0x3F0E00A,0x005FF1F, 0x40,0x48, 0x9, +0 }, + { 0x3F0E00A,0x002FF1F, 0x7C,0x40, 0x8, +0 }, + { 0x3E0F50A,0x003FF1F, 0x7C,0x40, 0x9, +0 }, + { 0x04F7F0F,0x21E7E00, 0x40,0x88, 0xE, +0 }, + { 0x04F7F0F,0x21E7E00, 0x40,0x14, 0xF, +0 }, + { 0x6E5E403,0x7E7F507, 0x0D,0x11, 0xB, +0 }, + { 0x366F500,0x4A8F604, 0x1B,0x15, 0xA, +0 }, + { 0x3F40003,0x0F5F715, 0x3F,0x00, 0x8, +0 }, + { 0x3F40003,0x0F5F715, 0x3F,0x08, 0x9, +0 }, + { 0x08DFA01,0x0B5F802, 0x4F,0x00, 0x6, +0 }, + { 0x08DFA01,0x0B5F802, 0x4F,0x12, 0x7, +0 }, + { 0x084FA01,0x0B4F800, 0x4F,0x00, 0x6, +0 }, + { 0x084FA01,0x0B4F800, 0x4F,0x00, 0x7, +0 }, + { 0x0F3F040,0x0038761, 0x30,0x00, 0xF, +0 }, + { 0x033E813,0x0F3F011, 0x12,0x00, 0x8, +0 }, + { 0x133F721,0x2F4F320, 0x48,0x00, 0x4, +0 }, + { 0x1F4F201,0x0F5F009, 0x00,0x00, 0x6, +0 }, + { 0x1114070,0x0034061, 0x84,0x00, 0x0, +0 }, + { 0x0D3B305,0x024F246, 0x40,0x80, 0x2, +0 }, + { 0x106F90E,0x0F4F001, 0x2F,0x00, 0xB, +0 }, + { 0x0126E71,0x0045061, 0x0D,0x00, 0x0, +0 }, + { 0x2A31321,0x0F31220, 0x1A,0x00, 0x8, +0 }, + { 0x025DC03,0x009F031, 0xA2,0x00, 0x8, +0 }, + { 0x025DC03,0x009F021, 0x17,0x00, 0x8, +0 }, + { 0x025DF23,0x0F9F021, 0x20,0x00, 0xE, +0 }, + { 0x1025161,0x0024173, 0x52,0x00, 0xA, +0 }, + { 0x0195132,0x0396061, 0x5A,0x85, 0xC, +0 }, + { 0x025DC03,0x009F031, 0x9A,0x00, 0x8, +0 }, + { 0x025DC03,0x009F031, 0x98,0x00, 0x8, +0 }, + { 0x1126EB1,0x0045021, 0x47,0x02, 0x0, +0 }, + { 0x025DC03,0x009F031, 0x97,0x00, 0x8, +0 }, + { 0x025DC03,0x009F031, 0x96,0x00, 0x8, +0 }, + { 0x025DC03,0x009F031, 0x94,0x00, 0x8, +0 }, + { 0x025DB02,0x006F030, 0x10,0x00, 0x8, +0 }, + { 0x1145152,0x0147242, 0x88,0x00, 0xA, +0 }, + { 0x0115172,0x01572A2, 0x89,0x00, 0xA, +0 }, + { 0x0F8AF00,0x0F6F401, 0xC0,0x00, 0xE, +0 }, + { 0x0009FB1,0x1069FA2, 0x45,0x0D, 0x2, +0 }, + { 0x0009FB1,0x1069FA2, 0x45,0x08, 0x2, +0 }, + { 0x1016F00,0x0F57001, 0x19,0x00, 0xE, +0 }, + { 0x229FFF2,0x0F480E1, 0x1A,0x00, 0x6, +0 }, + { 0x025DC03,0x009F032, 0x12,0x00, 0xA, +0 }, + { 0x025DC03,0x009F032, 0x10,0x00, 0xA, +0 }, + { 0x025DC03,0x009F032, 0x0E,0x00, 0xA, +0 }, + { 0x025DC03,0x009F032, 0x0C,0x00, 0xA, +0 }, + { 0x025DC03,0x009F032, 0x0A,0x00, 0xA, +0 }, + { 0x025DC03,0x009F031, 0x92,0x00, 0x8, +0 }, + { 0x1062F01,0x0076521, 0x07,0x00, 0x0, +0 }, + { 0x00470F5,0x0F38071, 0x1C,0x00, 0xB, +0 }, + { 0x0F77061,0x0256061, 0x21,0x00, 0x2, +0 }, + { 0x0C76012,0x00550F1, 0x28,0x00, 0x2, +0 }, + { 0x0049F21,0x0049F62, 0x00,0x00, 0x1, +0 }, + { 0x2119A16,0x0029012, 0x14,0x00, 0x2, +0 }, + { 0x033F813,0x003FF11, 0x0E,0x00, 0x8, +0 }, + { 0x0057F72,0x0F56071, 0x1D,0x00, 0x2, +0 }, + { 0x203B162,0x005F172, 0x4A,0x00, 0x2, +0 }, + { 0x2027062,0x0029062, 0x4A,0x00, 0x2, +0 }, + { 0x0FF0F20,0x0F1F021, 0xFF,0x00, 0x0, +0 }, + { 0x0F28021,0x0037021, 0x8F,0x00, 0x0, +0 }, + { 0x2129A16,0x0039012, 0x97,0x00, 0x2, +0 }, + { 0x212AA93,0x021AC91, 0x97,0x80, 0xE, +0 }, + { 0x024DA05,0x013F901, 0x8B,0x00, 0xA, +0 }, + { 0x203B162,0x0046172, 0xCF,0x00, 0x2, +0 }, + { 0x006FA04,0x095F201, 0xD3,0x00, 0xA, +0 }, + { 0x0847162,0x0246061, 0x21,0x00, 0x8, +0 }, + { 0x0FFF000,0x02FF607, 0x00,0x00, 0x0, +0 }, + { 0x3F27026,0x0568705, 0x00,0x00, 0xE, +0 }, + { 0x005FC11,0x1F5DF12, 0x00,0x00, 0x1, +0 }, + { 0x104F021,0x0D6F401, 0xCF,0x00, 0xA, +0 }, + { 0x104F021,0x0D6F401, 0xC7,0x00, 0x0, +0 }, + { 0x004F021,0x0D6F401, 0x1B,0x00, 0xA, +0 }, + { 0x104F061,0x1D6F441, 0xCE,0x00, 0x4, +0 }, + { 0x065F301,0x07DF111, 0x12,0x00, 0x8, +0 }, + { 0x254F5A8,0x0B7F321, 0xE8,0x00, 0x0, +0 }, + { 0x14FF101,0x3D6F311, 0xC6,0x06, 0xA, +0 }, + { 0x0ADF303,0x15E8301, 0x58,0x00, 0xE, +0 }, + { 0x01F4C28,0x045F601, 0xD4,0x00, 0xE, +0 }, + { 0x223F208,0x073F414, 0x92,0x80, 0x0, -12 }, + { 0x22F6216,0x06AF401, 0x64,0x41, 0x0, +0 }, + { 0x036F506,0x025FDA1, 0x10,0x80, 0x3, +0 }, + { 0x0176D0A,0x005F001, 0xD5,0x00, 0x4, +0 }, + { 0x265F812,0x0D7F601, 0xC8,0x00, 0xC, +0 }, + { 0x092FF43,0x003F015, 0x00,0x00, 0xE, -12 }, + { 0x0388B03,0x2398300, 0xC0,0x80, 0x0, +0 }, + { 0x00FF060,0x00FF062, 0xC0,0x06, 0xD, +0 }, + { 0x29FFF24,0x10FF021, 0x00,0x00, 0xF, +0 }, + { 0x11FFF30,0x14C5E32, 0x00,0x00, 0x7, +0 }, + { 0x10BF024,0x20B5030, 0x49,0x00, 0xF, +0 }, + { 0x00BF024,0x10B5031, 0xCC,0x0A, 0xA, +0 }, + { 0x12F6F24,0x20D4030, 0xCA,0x0A, 0x0, +0 }, + { 0x00BF022,0x10B5071, 0xCD,0x03, 0x0, +0 }, + { 0x105F003,0x1C8F211, 0xCE,0x00, 0x0, +0 }, + { 0x125FF03,0x1C8F211, 0x49,0x00, 0x0, +0 }, + { 0x145F503,0x03AF621, 0xD3,0x00, 0xE, +0 }, + { 0x1269E03,0x0BBF221, 0x90,0x80, 0xE, +0 }, + { 0x047FF01,0x2BCF400, 0xC0,0x00, 0xE, +0 }, + { 0x04F6F20,0x31FFF20, 0xE0,0x01, 0x0, +0 }, + { 0x32F5F30,0x31FFE30, 0xE0,0x01, 0x0, +0 }, + { 0x3598600,0x02A7284, 0x42,0x80, 0xC, +0 }, + { 0x054FE10,0x00FF030, 0x00,0x00, 0x6, +12 }, + { 0x0397530,0x088F220, 0xC2,0x40, 0x8, +12 }, + { 0x125FF10,0x006F030, 0x0A,0x00, 0xC, +12 }, + { 0x039F330,0x00CF0A0, 0x0F,0x00, 0x8, +12 }, + { 0x07FF420,0x00FF021, 0x18,0x00, 0xE, +0 }, + { 0x106F010,0x006F030, 0x00,0x00, 0x6, +12 }, + { 0x05FF620,0x00FF021, 0x16,0x00, 0xE, +0 }, + { 0x006F010,0x006F030, 0x08,0x00, 0x4, +0 }, + { 0x092FF43,0x003F015, 0x00,0x00, 0xE, +0 }, + { 0x106F031,0x10650B1, 0xC5,0x00, 0x0, +0 }, + { 0x11FF431,0x13653A1, 0x40,0x00, 0x0, +0 }, + { 0x01FF431,0x13663A1, 0xC0,0x00, 0x0, +0 }, + { 0x043F271,0x1285161, 0x1D,0x00, 0xE, +0 }, + { 0x279A702,0x284F410, 0xD2,0x00, 0x0, +0 }, + { 0x194F622,0x09BF231, 0x1B,0x80, 0xA, +0 }, + { 0x126F801,0x105F000, 0x40,0x00, 0x0, +0 }, + { 0x043F231,0x1285121, 0x1D,0x00, 0xE, +0 }, + { 0x1011031,0x2042030, 0x56,0x00, 0xE, +0 }, + { 0x136F131,0x0286121, 0x1B,0x00, 0xE, +0 }, + { 0x034F131,0x0285121, 0x1C,0x00, 0xE, +0 }, + { 0x015F431,0x0056072, 0x5B,0x83, 0x0, +0 }, + { 0x172FCE1,0x01762B1, 0x46,0x00, 0x0, +0 }, + { 0x0053071,0x0055072, 0x57,0x00, 0xC, +0 }, + { 0x062F600,0x01BF301, 0x00,0x08, 0x6, +0 }, + { 0x06553B1,0x00FF021, 0x14,0x00, 0xA, +0 }, + { 0x0254231,0x00FF0A1, 0x56,0x01, 0xE, +0 }, + { 0x1255221,0x02993A1, 0x55,0x01, 0xE, +0 }, + { 0x07554B1,0x0089021, 0x20,0x00, 0xE, +0 }, + { 0x0375421,0x008F021, 0x1B,0x00, 0xE, +0 }, + { 0x1396521,0x09EF221, 0x16,0x00, 0xE, +0 }, + { 0x0375621,0x00AF021, 0x1E,0x00, 0xE, +0 }, + { 0x0046021,0x1095031, 0x4E,0x00, 0x6, +0 }, + { 0x0046021,0x1095031, 0x8E,0x00, 0xA, +0 }, + { 0x0055021,0x1095021, 0x8E,0x00, 0xA, +0 }, + { 0x0055031,0x1095021, 0x8E,0x00, 0xA, +0 }, + { 0x0038031,0x136F132, 0x17,0x00, 0x0, +0 }, + { 0x2066020,0x10A7022, 0x19,0x00, 0x0, +0 }, + { 0x1065020,0x00A6022, 0x1E,0x00, 0x0, +0 }, + { 0x0258C32,0x0176221, 0x4C,0x00, 0xC, +0 }, + { 0x00430B1,0x00A5021, 0x57,0x00, 0xC, +0 }, + { 0x04451B1,0x00A5021, 0x55,0x00, 0xC, +0 }, + { 0x20F4032,0x0095021, 0xDF,0x00, 0x0, +0 }, + { 0x39C4611,0x05A6321, 0x20,0x00, 0xE, +0 }, + { 0x39D7531,0x0095021, 0x17,0x00, 0xE, +0 }, + { 0x35AF802,0x02A42B1, 0x00,0x00, 0xE, +0 }, + { 0x20FF022,0x00FF021, 0x5D,0x00, 0xE, +0 }, + { 0x0535231,0x147F221, 0x0F,0x00, 0xC, +0 }, + { 0x39D65B1,0x0095021, 0x17,0x00, 0xE, +0 }, + { 0x05AF802,0x22A42B0, 0x00,0x00, 0xE, +0 }, + { 0x057F421,0x228F232, 0xC0,0x00, 0x0, +0 }, + { 0x29D6561,0x2095021, 0xC6,0x00, 0x0, -12 }, + { 0x358F423,0x3486422, 0xC0,0x10, 0xB, -24 }, + { 0x0EDF331,0x07DF131, 0xCB,0x00, 0x8, +0 }, + { 0x395FF09,0x02552E1, 0xC0,0x00, 0x0, +0 }, + { 0x0052031,0x0063031, 0x58,0x40, 0x0, +0 }, + { 0x0735421,0x008F021, 0x0E,0x07, 0xA, +0 }, + { 0x0033071,0x0044072, 0x5D,0x00, 0x0, +0 }, + { 0x2023034,0x003F021, 0x27,0x09, 0xE, +0 }, + { 0x3042001,0x2042030, 0x63,0x00, 0x0, +0 }, + { 0x0585201,0x0364161, 0x99,0x00, 0x6, +0 }, + { 0x0261131,0x0071031, 0x1B,0x00, 0xC, +0 }, + { 0x0B4F251,0x075F101, 0xD0,0x00, 0x0, +0 }, + { 0x0572132,0x01942A3, 0x06,0x00, 0x9, -12 }, + { 0x3859F45,0x043F311, 0x15,0x00, 0xE, +0 }, + { 0x115F403,0x0C8F221, 0xD7,0x00, 0xA, +0 }, + { 0x295F300,0x2B9F260, 0x11,0x00, 0x0, +0 }, + { 0x0050021,0x2041020, 0xCF,0x00, 0x0, +0 }, + { 0x2A3F400,0x2B9F260, 0x1B,0x00, 0x0, +0 }, + { 0x0644312,0x2028030, 0x22,0x00, 0xE, +0 }, + { 0x098F201,0x1D5F307, 0x40,0x09, 0x0, +0 }, + { 0x083FF00,0x166F502, 0x00,0x00, 0xE, -12 }, + { 0x275FF12,0x2E8F310, 0x80,0x00, 0xE, +0 }, + { 0x163F402,0x164F502, 0x0F,0x00, 0x0, -12 }, + { 0x064FB05,0x2579600, 0xC9,0x00, 0x0, +0 }, + { 0x1B2FF13,0x30F5030, 0x0C,0x0A, 0xE, +0 }, + { 0x21DF230,0x10C4021, 0x0E,0x00, 0xA, +0 }, + { 0x3023030,0x2064030, 0xC0,0x00, 0x0, +0 }, + { 0x375FF25,0x033FE03, 0xC0,0x00, 0x0, -7 }, + { 0x37DFE25,0x0079003, 0xC0,0x00, 0x0, -7 }, + { 0x0034007,0x0056001, 0xDC,0x00, 0x0, +0 }, + { 0x2B3F811,0x003F010, 0xC1,0x03, 0x4, -7 }, + { 0x00CF000,0x006F000, 0x00,0x00, 0x4, +2 }, + { 0x32C8F01,0x006F000, 0x00,0x00, 0xE, +0 }, + { 0x2A2FF40,0x30E104E, 0x00,0x00, 0xE, +0 }, + { 0x092FF11,0x306301E, 0xC0,0x00, 0xE, +0 }, + { 0x003402E,0x003105E, 0x00,0x00, 0xE, +0 }, + { 0x2A3375B,0x237461A, 0x95,0x40, 0x0, +0 }, + { 0x344FF6B,0x02AF1EA, 0xC0,0x01, 0xC, -12 }, + { 0x10EF07E,0x00E3030, 0x00,0x0A, 0xE, +0 }, + { 0x003F02E,0x00310FE, 0x00,0x00, 0xE, +0 }, + { 0x023FCC0,0x006F04E, 0x00,0x00, 0xE, +0 }, + { 0x0A3FB00,0x007F000, 0xC0,0x00, 0xA, +0 }, + { 0x0C2FD05,0x3D9F910, 0xC0,0x00, 0x0, +0 }, + { 0x03A8F2E,0x067A800, 0x00,0x00, 0xE, +0 }, + { 0x22C8305,0x0589903, 0x00,0x00, 0xE, +0 }, + { 0x25C8400,0x08AF800, 0x00,0x00, 0xE, +0 }, + { 0x00CFF00,0x006FF00, 0x00,0x00, 0x4, +0 }, + { 0x004F041,0x308F009, 0xC0,0x00, 0xE, +0 }, + { 0x006F001,0x339880D, 0x40,0x00, 0xC, +0 }, + { 0x12FF201,0x356F54E, 0xC0,0x00, 0xE, +0 }, + { 0x12FF241,0x356F54E, 0xC0,0x00, 0xE, +0 }, + { 0x155AF00,0x364FF4B, 0x00,0x00, 0xE, +0 }, + { 0x1496401,0x356F54A, 0xC0,0x00, 0xE, +0 }, + { 0x2678900,0x357874E, 0x00,0x00, 0xE, +0 }, + { 0x02FF241,0x356F54E, 0xC0,0x00, 0x0, +0 }, + { 0x05FF210,0x27FC40E, 0x00,0x00, 0x6, +0 }, + { 0x00CF003,0x03AF802, 0xC0,0x00, 0x0, +0 }, + { 0x00BF003,0x037F702, 0xC0,0x00, 0x0, +0 }, + { 0x00CF003,0x01AFD02, 0xC0,0x00, 0xE, +0 }, + { 0x00BF002,0x037F702, 0xC0,0x00, 0x0, +0 }, + { 0x325FF25,0x0078003, 0xC0,0x00, 0x0, +0 }, + { 0x0089011,0x357894E, 0xC0,0x00, 0xE, +0 }, + { 0x11BF100,0x3468B5E, 0x00,0x00, 0xE, +0 }, + { 0x205508C,0x05C855D, 0x80,0x0A, 0xA, +0 }, + { 0x205504C,0x05C858D, 0x40,0x0A, 0x0, +0 }, + { 0x206F04B,0x346F610, 0x00,0x00, 0xE, +0 }, + { 0x392F700,0x2AF475E, 0x00,0x00, 0xE, +0 }, + { 0x30FF01D,0x0F0F715, 0x00,0x00, 0x1, +0 }, + { 0x0EB3402,0x0075004, 0x87,0x00, 0x0, +0 }, + { 0x0EF3301,0x0075002, 0xCB,0x00, 0x0, +0 }, + { 0x2B2FF04,0x2188719, 0x80,0x04, 0x0, +0 }, + { 0x27FFF06,0x204F009, 0x80,0x0A, 0x0, +0 }, + { 0x053F300,0x247694E, 0x43,0x00, 0xE, +0 }, + { 0x224F10E,0x335FF4E, 0x40,0x02, 0x0, +0 }, + { 0x274F911,0x108F010, 0x41,0x00, 0x2, +0 }, + { 0x288F911,0x004F010, 0xC1,0x03, 0x4, +0 }, + { 0x15DFD25,0x0079003, 0xC0,0x00, 0x0, +0 }, + { 0x015FF0E,0x0BFF800, 0x00,0x00, 0xE, +0 }, + { 0x008A000,0x1679810, 0x00,0x00, 0xE, +0 }, + { 0x104F041,0x308F009, 0xC0,0x00, 0xE, +0 }, + { 0x040F520,0x0F7F010, 0x0D,0x89, 0xA, +0 }, + { 0x060F101,0x07BD211, 0x4D,0x00, 0x8, +0 }, + { 0x013F202,0x043F502, 0x22,0x00, 0xE, +0 }, + { 0x0F0FB3E,0x09BA0B1, 0x29,0x40, 0x0, +0 }, + { 0x00381A5,0x005F1B1, 0xD2,0x40, 0x2, +0 }, + { 0x0F466E1,0x086B0E1, 0x13,0x00, 0xC, +0 }, + { 0x0014171,0x03B92A1, 0x1C,0x00, 0xE, +0 }, + { 0x0064131,0x03792A1, 0x1A,0x80, 0xC, +0 }, + { 0x175A563,0x045A421, 0x0F,0x8D, 0x0, +0 }, + { 0x002A474,0x04245D7, 0x47,0x40, 0x6, +0 }, + { 0x05331C5,0x07242D9, 0x8F,0x00, 0x6, +0 }, + { 0x1F07151,0x1856092, 0x91,0x80, 0xA, +0 }, + { 0x3D3B1E1,0x1741221, 0x4F,0x00, 0x6, +0 }, + { 0x00FF071,0x15F63B2, 0x8D,0x80, 0xA, +0 }, + { 0x175F502,0x0358501, 0x1A,0x88, 0x0, +0 }, + { 0x053F101,0x053F108, 0x40,0x40, 0x0, +0 }, + { 0x040F520,0x0F7F010, 0x0D,0x90, 0xA, +0 }, + { 0x0A4F3F0,0x1F5F460, 0x00,0x07, 0x8, +0 }, + { 0x0051F21,0x00A7121, 0x98,0x00, 0x2, +0 }, + { 0x03FFA10,0x064F210, 0x86,0x0C, 0xE, +0 }, + { 0x0013171,0x03BF2A1, 0x1C,0x00, 0xE, +0 }, + { 0x0754231,0x0F590A1, 0x98,0x80, 0xC, +0 }, + { 0x0044131,0x034F2A1, 0x1A,0x80, 0xC, +0 }, + { 0x0289130,0x048C131, 0x58,0x0E, 0xE, +0 }, + { 0x0F463E0,0x08670E1, 0x1E,0x00, 0xC, +0 }, + { 0x2034122,0x10561F2, 0x4F,0x80, 0x2, +0 }, + { 0x0175331,0x03B92A1, 0x18,0x80, 0xC, +0 }, + { 0x00B5131,0x03BA2A1, 0x1C,0x40, 0xE, +0 }, + { 0x03A4331,0x00AAA21, 0x1C,0x00, 0xC, +0 }, + { 0x1FAF000,0x1FAF211, 0x02,0x85, 0x6, +0 }, + { 0x1A57121,0x0958121, 0x17,0x00, 0xE, +0 }, + { 0x0AE7161,0x02E8160, 0x1C,0x00, 0xE, +0 }, + { 0x054F606,0x0B3F241, 0x73,0x0E, 0x0, +0 }, + { 0x055F718,0x0D5E521, 0x23,0x0E, 0x0, +0 }, + { 0x0A21B14,0x0A4A0F0, 0x7F,0x7F, 0x2, +0 }, + { 0x05285E1,0x05662E1, 0x18,0x00, 0x0, +0 }, + { 0x3F0FB02,0x006F3C2, 0x00,0x0D, 0x0, +0 }, + { 0x2448711,0x0B68041, 0x00,0x84, 0x0, +0 }, + { 0x00FBF0C,0x004F001, 0x07,0x0A, 0x0, +0 }, + { 0x0F9F913,0x0047310, 0x86,0x06, 0x0, +0 }, + { 0x03FFA10,0x064F210, 0x86,0x06, 0xE, +0 }, + { 0x1F0F001,0x136F7E4, 0x00,0x0A, 0x0, +0 }, + { 0x277F810,0x006F311, 0x44,0x07, 0x8, +0 }, + { 0x200A01E,0x0FFF810, 0x00,0x0E, 0xE, +0 }, + { 0x018BF20,0x066F800, 0x00,0x11, 0xE, +0 }, + { 0x0FFF902,0x0FFF811, 0x19,0x06, 0x0, +0 }, + { 0x215CF3E,0x0F9D92E, 0x00,0x11, 0xE, +0 }, + { 0x2A0B26E,0x2D4960E, 0x00,0x00, 0xE, +0 }, + { 0x2E0136E,0x1D4A502, 0x00,0x00, 0x0, +0 }, + { 0x025F522,0x005EF24, 0x95,0x9A, 0xE, +0 }, + { 0x004EF26,0x0065F24, 0xA1,0x07, 0xE, +0 }, + { 0x1047B20,0x072F521, 0x4B,0x00, 0xE, +0 }, + { 0x019992F,0x0BFFAA2, 0x00,0x22, 0xE, +0 }, + { 0x015FAA1,0x00B7F21, 0x55,0x08, 0xE, +0 }, + { 0x0137221,0x0B26425, 0x94,0x3E, 0xC, +0 }, + { 0x0739321,0x0099DA1, 0x38,0x04, 0xC, +0 }, + { 0x0298421,0x0CFF828, 0x9C,0xB2, 0xE, +0 }, + { 0x0187521,0x00A9F21, 0x22,0x07, 0xE, +0 }, + { 0x0F3F211,0x034F2E1, 0x0F,0x00, 0xA, +0 }, + { 0x1039761,0x004C770, 0x41,0x00, 0x3, +0 }, + { 0x00221C1,0x014B421, 0x1A,0x00, 0xE, +0 }, + { 0x001F2F1,0x02562E1, 0xCE,0x40, 0x6, +0 }, + { 0x212F1C2,0x054F743, 0x25,0x03, 0xE, +0 }, + { 0x2017230,0x2269420, 0x1C,0x00, 0xE, +0 }, + { 0x021A161,0x116C2A1, 0x92,0x40, 0x6, +0 }, + { 0x046A502,0x044F901, 0x64,0x80, 0x0, +0 }, + { 0x175F403,0x0F4F301, 0x31,0x83, 0xE, +0 }, + { 0x0858300,0x0C872A0, 0x2A,0x80, 0x6, +0 }, + { 0x0437721,0x006A5E1, 0x25,0x80, 0x8, +0 }, + { 0x0177423,0x017C563, 0x83,0x8D, 0x7, +0 }, + { 0x0187132,0x038B2A1, 0x9A,0x82, 0xC, +0 }, + { 0x0065231,0x037F2A1, 0x1B,0x80, 0xE, +0 }, + { 0x060F207,0x072F212, 0x13,0x00, 0x8, +0 }, + { 0x036BA02,0x015F901, 0x0A,0x00, 0x4, +0 }, + { 0x024F621,0x014C421, 0x13,0x80, 0x0, +0 }, + { 0x025F521,0x015C521, 0x17,0x80, 0x0, +0 }, + { 0x02C6621,0x014A521, 0x17,0x80, 0x0, +0 }, + { 0x064E400,0x074A400, 0x00,0x00, 0x7, +0 }, + { 0x2F0F009,0x047F920, 0x0D,0x00, 0xE, +0 }, + { 0x0F6E901,0x006D600, 0x15,0x00, 0xE, +0 }, + { 0x0F0F280,0x0F4F480, 0x00,0x00, 0x4, +0 }, + { 0x003F1C0,0x00110BE, 0x4F,0x0C, 0x2, +0 }, + { 0x202FF8E,0x3F6F601, 0x00,0x00, 0x8, +0 }, + { 0x202FF8E,0x3F7F701, 0x00,0x00, 0x8, +0 }, + { 0x053F101,0x074F131, 0x4B,0x00, 0x4, +0 }, + { 0x053F201,0x064F311, 0x49,0x00, 0x6, +0 }, + { 0x053F201,0x064F331, 0x50,0x00, 0x4, +0 }, + { 0x078C423,0x048C231, 0x99,0x00, 0x8, +0 }, + { 0x098C423,0x058C231, 0x97,0x00, 0x6, +0 }, + { 0x088C423,0x048C231, 0x5E,0x00, 0x0, +0 }, + { 0x05AC421,0x03AC231, 0x4E,0x00, 0x6, +0 }, + { 0x056B301,0x056B301, 0x8D,0x00, 0x8, +0 }, + { 0x019D0A3,0x017F021, 0x5C,0x80, 0xC, +0 }, + { 0x018D0A3,0x018F021, 0x64,0x80, 0x0, +0 }, + { 0x018F6B3,0x008F131, 0x61,0x00, 0x2, +0 }, + { 0x09EAAB3,0x03E80A1, 0x08,0x00, 0x6, +0 }, + { 0x1239723,0x0144571, 0x93,0x00, 0x4, +0 }, + { 0x12497A1,0x0145571, 0x0D,0x80, 0x2, +0 }, + { 0x1249761,0x0144571, 0x8F,0x00, 0xA, +0 }, + { 0x000A121,0x0F6F236, 0x80,0x00, 0x8, +0 }, + { 0x085F211,0x0B7F212, 0x87,0x80, 0x4, +0 }, + { 0x054F607,0x0B6F242, 0x73,0x00, 0x0, +0 }, + { 0x054F60E,0x0B6F242, 0x73,0x00, 0x0, +0 }, + { 0x1E26301,0x01E8821, 0x46,0x00, 0x6, +0 }, + { 0x24D7520,0x01D8921, 0x8B,0x80, 0xA, +0 }, + { 0x01C6421,0x03CD621, 0xC4,0x00, 0xA, +0 }, + { 0x03C6421,0x01CA621, 0x4A,0x00, 0x8, +0 }, + { 0x008F321,0x228F322, 0x92,0x80, 0xA, +0 }, + { 0x028F331,0x038B1B1, 0x92,0x00, 0xA, +0 }, + { 0x002DB77,0x0125831, 0xE0,0x00, 0x8, +0 }, + { 0x00211B1,0x0034231, 0x93,0x80, 0x0, +0 }, + { 0x0023AB1,0x0134232, 0xAF,0x80, 0x0, +0 }, + { 0x2556823,0x1055461, 0xD2,0x00, 0xA, +0 }, + { 0x05312C4,0x07212F1, 0x10,0x00, 0x2, +0 }, + { 0x1D6FB34,0x0269471, 0x83,0x00, 0xC, +0 }, + { 0x061F217,0x074F212, 0x4F,0x00, 0x8, +0 }, + { 0x0096821,0x01B5731, 0x11,0x80, 0xA, +0 }, + { 0x02FA433,0x0117575, 0x14,0x00, 0x0, +0 }, + { 0x078F71A,0x0024691, 0xC6,0x00, 0x2, +0 }, + { 0x0287C31,0x01AAB23, 0x91,0x00, 0xA, +0 }, + { 0x0124D01,0x013F501, 0x02,0x00, 0x7, +0 }, + { 0x118D671,0x018F571, 0x1E,0x00, 0xC, +0 }, + { 0x0287271,0x0186361, 0x95,0x00, 0xC, +0 }, + { 0x054F589,0x023F582, 0x5E,0x07, 0x2, +0 }, + { 0x20FFF22,0x00FFF21, 0x5A,0x80, 0x0, +0 }, + { 0x125F121,0x0087262, 0x56,0x00, 0xE, +0 }, + { 0x121F131,0x0166F21, 0x40,0x00, 0x2, +0 }, + { 0x1388231,0x0086821, 0x4B,0x00, 0x0, +0 }, + { 0x175F502,0x0F8F501, 0x58,0x80, 0x0, +0 }, + { 0x11561B1,0x00562A1, 0x16,0x00, 0x8, +0 }, + { 0x01351A1,0x0175221, 0x1E,0x80, 0xE, +0 }, + { 0x1145131,0x00552A1, 0x92,0x00, 0xA, +0 }, + { 0x12CF131,0x01C61B1, 0x8F,0x00, 0x8, +0 }, + { 0x1228131,0x0167223, 0x4D,0x80, 0x2, +0 }, + { 0x171D201,0x238F301, 0x55,0x00, 0x2, +0 }, + { 0x114F413,0x013F201, 0x49,0x80, 0x6, +0 }, + { 0x154F203,0x044F301, 0x4C,0x40, 0x4, +0 }, + { 0x119F523,0x019F421, 0x51,0x00, 0xC, +0 }, + { 0x1547003,0x004B301, 0x51,0x80, 0xC, +0 }, + { 0x05FF561,0x02AF562, 0x21,0x00, 0x2, +0 }, + { 0x018F221,0x018F521, 0x0F,0x80, 0x6, +0 }, + { 0x038F2A1,0x018F321, 0x93,0x00, 0xA, +0 }, + { 0x13FF631,0x01FF321, 0x89,0x40, 0xA, +0 }, + { 0x13FF431,0x01FF221, 0x88,0x40, 0xA, +0 }, + { 0x04F6421,0x028F231, 0x91,0x00, 0xA, +0 }, + { 0x05FF561,0x05A6661, 0x1E,0x00, 0x2, +0 }, + { 0x05FF561,0x02A7561, 0x1E,0x07, 0x2, +0 }, + { 0x03FF561,0x01A7562, 0x28,0x04, 0x2, +0 }, + { 0x01F7561,0x02A7561, 0x21,0x00, 0x2, +0 }, + { 0x05F8571,0x01A6661, 0x51,0x00, 0xC, +0 }, + { 0x13F93B1,0x01F6221, 0x45,0x80, 0x8, +0 }, + { 0x13FA3B1,0x00F8221, 0x89,0x80, 0x8, +0 }, + { 0x13F86B1,0x00F7221, 0x8F,0x80, 0xC, +0 }, + { 0x137C6B1,0x0067221, 0x87,0x80, 0xC, +0 }, + { 0x0217B32,0x0176221, 0x95,0x00, 0x0, +0 }, + { 0x0219B32,0x0176221, 0x97,0x00, 0x0, +0 }, + { 0x0115231,0x11E3132, 0xC5,0x00, 0x8, +0 }, + { 0x1177E31,0x10C8B21, 0x43,0x00, 0x2, +0 }, + { 0x019D520,0x11B6121, 0x93,0x00, 0xC, +0 }, + { 0x0069161,0x0076161, 0x12,0x00, 0xA, +0 }, + { 0x00D5131,0x01F7221, 0x1C,0x80, 0xE, +0 }, + { 0x13DC231,0x00F7761, 0x8A,0x80, 0xA, +0 }, + { 0x02DF431,0x00F7321, 0x8B,0x80, 0x6, +0 }, + { 0x02DA831,0x00F8321, 0x8B,0x80, 0x6, +0 }, + { 0x06A6121,0x00A7F21, 0x26,0x00, 0x2, +0 }, + { 0x01C8D21,0x00FA521, 0x90,0x00, 0xA, +0 }, + { 0x01F75A1,0x00F7422, 0x10,0x00, 0x8, +0 }, + { 0x11F75A0,0x01F7521, 0x15,0x00, 0xC, +0 }, + { 0x033F5C5,0x025FDE1, 0x53,0x80, 0xA, +0 }, + { 0x013F5C5,0x005FDE1, 0x59,0x80, 0xA, +0 }, + { 0x0248305,0x014A301, 0x66,0x00, 0x2, +0 }, + { 0x031A585,0x011F511, 0xD3,0x80, 0x2, +0 }, + { 0x033F284,0x022F211, 0xC7,0x80, 0xA, +0 }, + { 0x122F210,0x012FC11, 0xC9,0x00, 0x6, +0 }, + { 0x206FB03,0x006D901, 0xD2,0x00, 0x4, +0 }, + { 0x024D443,0x004E741, 0x51,0x40, 0x8, +0 }, + { 0x05FF561,0x01A6661, 0x1E,0x00, 0x2, +0 }, + { 0x0275722,0x0275661, 0x59,0x40, 0xB, +0 }, + { 0x0175622,0x0176361, 0xA7,0x40, 0x5, +0 }, + { 0x205A8F1,0x00563B1, 0x9B,0x00, 0xA, +0 }, + { 0x05F8571,0x00A6B61, 0x4B,0x00, 0xC, +0 }, + { 0x105F510,0x0C3F211, 0x47,0x00, 0x2, +0 }, + { 0x247F811,0x054F311, 0x47,0x00, 0x4, +0 }, + { 0x21AF400,0x008F800, 0x00,0x00, 0xC, +0 }, + { 0x01AF400,0x038F800, 0x00,0x00, 0xA, +0 }, + { 0x079F400,0x017F600, 0x03,0x00, 0xA, +0 }, + { 0x007A810,0x115DA00, 0x06,0x00, 0x6, +0 }, + { 0x009A810,0x107DF10, 0x07,0x00, 0xE, +0 }, + { 0x334F407,0x2D4F415, 0x00,0x00, 0xE, +0 }, + { 0x0F4000A,0x0F6F717, 0x3F,0x00, 0x1, +0 }, + { 0x0F2E00E,0x033FF1E, 0x5E,0x40, 0x8, +0 }, + { 0x0645451,0x045A581, 0x00,0x00, 0xA, +0 }, + { 0x261B235,0x0B2F112, 0x5C,0x08, 0xA, +0 }, + { 0x38CF800,0x06BF600, 0x80,0x00, 0xF, +0 }, + { 0x060F207,0x072F212, 0x54,0x80, 0x4, +0 }, + { 0x0557542,0x0257541, 0x96,0x87, 0x8, +0 }, + { 0x268F911,0x005F211, 0x46,0x00, 0x8, +0 }, + { 0x14BFA01,0x03BFA08, 0x08,0x00, 0xD, +0 }, + { 0x007FF21,0x107F900, 0x80,0x00, 0xE, +0 }, + { 0x20DFF20,0x027FF02, 0x00,0x00, 0xE, +0 }, + { 0x0C8F60C,0x257FF12, 0xC2,0x00, 0xC, +0 }, + { 0x000F60E,0x3059F10, 0x00,0x00, 0xE, +0 }, + { 0x000F60E,0x3039F10, 0x00,0x00, 0xE, +0 }, + { 0x0C5F59E,0x2F7F70E, 0x00,0x00, 0xF, +0 }, + { 0x2B7F811,0x003F310, 0x45,0x00, 0x8, +0 }, + { 0x0BFFA01,0x097C803, 0x00,0x00, 0x7, +0 }, + { 0x08DFA01,0x0BAFA03, 0x4F,0x00, 0x7, +0 }, + { 0x38FF801,0x06FF600, 0x47,0x00, 0xF, +0 }, + { 0x38CF800,0x06EF600, 0x80,0x00, 0xF, +0 }, + { 0x38CF803,0x0B5F80C, 0x80,0x00, 0xF, +0 }, + { 0x38CF803,0x0B5F80C, 0x83,0x00, 0xF, +0 }, + { 0x0DFF611,0x0DEF710, 0x4F,0x40, 0xC, +0 }, + { 0x053F101,0x0F3F211, 0x4F,0x80, 0x4, +0 }, + { 0x1C5C202,0x104D000, 0x11,0x00, 0xC, +0 }, + { 0x2129A16,0x0039012, 0x97,0x04, 0x2, +0 }, + { 0x0F3F507,0x0F2F501, 0x19,0x00, 0xA, +0 }, + { 0x2F3F507,0x0F2F501, 0x19,0x00, 0xA, +0 }, + { 0x0229F16,0x032B0D2, 0x16,0x00, 0x8, +0 }, + { 0x025DA05,0x015F001, 0x4E,0x00, 0xA, +0 }, + { 0x025C811,0x0F2F511, 0x29,0x00, 0xC, +0 }, + { 0x012FF54,0x0F2F051, 0x16,0x00, 0x0, +0 }, + { 0x212FF54,0x0F2F051, 0x16,0x00, 0x0, +0 }, + { 0x106DF24,0x005FF21, 0x15,0x00, 0x1, +0 }, + { 0x104F223,0x0045231, 0x50,0x80, 0xE, +0 }, + { 0x00BF223,0x00B5230, 0x4F,0x82, 0xE, +0 }, + { 0x2036162,0x0058172, 0x4A,0x00, 0x2, +0 }, + { 0x01CF201,0x087F501, 0x10,0x00, 0xA, +0 }, + { 0x014F201,0x084F501, 0x10,0x00, 0xA, +0 }, + { 0x103AF00,0x3FFF021, 0x06,0x00, 0x6, +0 }, + { 0x025DA05,0x06A5334, 0x8E,0x00, 0xA, +0 }, + { 0x035F813,0x004FF11, 0x12,0x03, 0x8, +0 }, + { 0x0114172,0x01562A2, 0x89,0x40, 0xA, +0 }, + { 0x0F9F121,0x0F6F721, 0x1C,0x00, 0xE, +0 }, + { 0x075F502,0x0F3F201, 0x29,0x00, 0x0, +0 }, + { 0x005FF00,0x0F3F020, 0x18,0x00, 0x0, +0 }, + { 0x0114172,0x01562A1, 0x89,0x40, 0xA, +0 }, + { 0x2A32321,0x1F34221, 0x1A,0x00, 0x8, +0 }, + { 0x010A130,0x0337D10, 0x07,0x00, 0x0, +0 }, + { 0x01D5320,0x03B6261, 0x18,0x00, 0xA, +0 }, + { 0x01572A1,0x02784A1, 0x17,0x00, 0xE, +0 }, + { 0x05A5321,0x01A8A21, 0x9F,0x00, 0xC, +0 }, + { 0x0009F71,0x0069060, 0x51,0x00, 0x0, +0 }, + { 0x0009F71,0x0069062, 0x51,0x00, 0x0, +0 }, + { 0x0077061,0x0077062, 0x80,0x80, 0x7, +0 }, + { 0x0077061,0x0077041, 0x80,0x80, 0x7, +0 }, + { 0x0F7F000,0x00687A2, 0x30,0x00, 0xF, +0 }, + { 0x2129A16,0x1039012, 0x97,0x04, 0x2, +0 }, + { 0x0037165,0x0076171, 0xD2,0x00, 0x2, +0 }, + { 0x0011E00,0x0A11220, 0x40,0x40, 0x6, +0 }, + { 0x0059221,0x1059421, 0x1C,0x00, 0xE, +0 }, + { 0x044FF25,0x033F324, 0x15,0x01, 0xC, +0 }, + { 0x0132F20,0x0132321, 0x0D,0x00, 0x1, +0 }, + { 0x0012E01,0x0216221, 0x40,0x40, 0x6, +0 }, + { 0x3134362,0x0038261, 0x2E,0x00, 0x2, +0 }, + { 0x2035FE6,0x00350E1, 0x0F,0x00, 0x3, +0 }, + { 0x3034F61,0x0035061, 0x0D,0x00, 0x9, +0 }, + { 0x1034F61,0x0035061, 0x00,0x00, 0x9, +0 }, + { 0x3033F60,0x0033061, 0x0D,0x00, 0x7, +0 }, + { 0x112FF53,0x0F1F071, 0x13,0x00, 0x0, +0 }, + { 0x112FFD1,0x0F1F0F1, 0x12,0x00, 0x0, +0 }, + { 0x0E11126,0x0E11120, 0xA5,0x00, 0x0, +0 }, + { 0x30244A1,0x04245E1, 0x51,0x00, 0x2, +0 }, + { 0x0E1A126,0x0E1A120, 0xA5,0x0E, 0x0, +0 }, + { 0x054F101,0x004F008, 0x40,0x00, 0x0, +0 }, + { 0x011A131,0x0437D16, 0x47,0x40, 0x8, +0 }, + { 0x211A131,0x0437D11, 0x14,0x00, 0x0, +0 }, + { 0x091AB0E,0x0C3F702, 0xC0,0x00, 0xE, +0 }, + { 0x02FC811,0x0F5F431, 0x2D,0x00, 0xC, +0 }, + { 0x1176E31,0x20CAB22, 0x43,0x08, 0x2, +0 }, + { 0x1176E31,0x20CAB22, 0x4F,0x08, 0x2, +0 }, + { 0x002FF64,0x0F3F522, 0xDB,0x02, 0x4, +0 }, + { 0x001FF63,0x0F3F534, 0xDB,0x00, 0x2, +0 }, + { 0x0FFFB13,0x0FFE802, 0x40,0x00, 0x8, +0 }, + { 0x108FF00,0x006F000, 0x00,0x00, 0x0, +0 }, + { 0x0F1100E,0x0F61800, 0x00,0x00, 0xE, +0 }, + { 0x1F18F2A,0x1F63816, 0x00,0x00, 0x8, +0 }, + { 0x0F0102E,0x2821020, 0x00,0x00, 0xE, +0 }, + { 0x201EFEE,0x0069FEE, 0x10,0x04, 0x6, +0 }, + { 0x201EFEE,0x0069FEE, 0x01,0x04, 0x6, +0 }, + { 0x001F02E,0x0064820, 0x00,0x00, 0xE, +0 }, + { 0x3EFF71C,0x08FFD0E, 0x00,0x00, 0xF, +0 }, + { 0x202FF0E,0x103FF1E, 0x00,0x80, 0xE, +0 }, + { 0x202BF8E,0x2049F0E, 0x00,0x00, 0xE, +0 }, + { 0x003FF64,0x0F6F73E, 0xDB,0x00, 0x4, +0 }, + { 0x100F300,0x054F600, 0x00,0x00, 0xC, +0 }, + { 0x2F3F40C,0x3D66E0E, 0x00,0x00, 0xE, +0 }, + { 0x07B9C21,0x0FB9502, 0x0A,0x00, 0x8, +0 }, + { 0x0778121,0x0879221, 0x17,0x00, 0xA, +0 }, + { 0x1237221,0x0075121, 0x1A,0x06, 0xE, +0 }, + { 0x0295231,0x0197121, 0x1E,0x04, 0xE, +0 }, + { 0x0187621,0x0098121, 0x1A,0x05, 0xE, +0 }, + { 0x0167921,0x05971A1, 0x1F,0x00, 0x8, +0 }, + { 0x0257521,0x0178421, 0x1A,0x81, 0xE, +0 }, + { 0x0586221,0x0167221, 0x22,0x01, 0xE, +0 }, + { 0x10759B1,0x00A7BA1, 0x1B,0x05, 0x0, +0 }, + { 0x020A821,0x10A7B23, 0x0F,0x05, 0xC, +0 }, + { 0x1378CA1,0x00A7724, 0x0A,0x07, 0x0, +0 }, + { 0x06BFF31,0x0195175, 0x04,0x03, 0xA, +0 }, + { 0x0599BA1,0x00A75E1, 0x8C,0x00, 0x0, +0 }, + { 0x0389F22,0x0296761, 0x1D,0x01, 0x0, +0 }, + { 0x00C9222,0x00DA261, 0x1D,0x03, 0xE, +0 }, + { 0x1C99223,0x1288222, 0x00,0x00, 0x9, -12 }, + { 0x2863428,0x0354121, 0x39,0x07, 0x0, +0 }, + { 0x1F35224,0x1F53223, 0x12,0x09, 0x4, +0 }, + { 0x1D52222,0x1053F21, 0x10,0x88, 0xA, +0 }, + { 0x1554163,0x10541A2, 0x00,0x00, 0x7, -12 }, + { 0x0F7F620,0x2F9770E, 0x08,0x05, 0x0, -24 }, + { 0x100F220,0x1053623, 0x04,0x00, 0x2, -36 }, + { 0x0EFA120,0x0DFF310, 0x00,0x00, 0xE, +0 }, + { 0x000FF24,0x0A9F802, 0x00,0x03, 0xE, +0 }, + { 0x0FEF22C,0x3D8B802, 0x00,0x01, 0x6, +0 }, + { 0x0FE822C,0x3D98802, 0x00,0x07, 0x6, +0 }, + { 0x0F6822E,0x3F87404, 0x00,0x09, 0x4, +0 }, + { 0x100FF2E,0x334D609, 0x00,0x01, 0xC, +0 }, + { 0x389F837,0x0F8F703, 0x0C,0x04, 0x0, +0 }, + { 0x0FAFA25,0x0F9AA03, 0x14,0x00, 0x0, +0 }, + { 0x0F7F241,0x0F7F281, 0x12,0x00, 0x6, +0 }, + { 0x10BD0E0,0x109E0A4, 0x80,0x8E, 0x1, +0 }, + { 0x0F4F60C,0x0F5F341, 0x5C,0x00, 0x0, +0 }, + { 0x1557261,0x0187121, 0x86,0x83, 0x0, +0 }, + { 0x09612F3,0x10430B1, 0x45,0x86, 0x1, +0 }, + { 0x204F061,0x2055020, 0x9D,0x83, 0xC, +0 }, + { 0x236F312,0x2D7B300, 0x2A,0x00, 0x0, +0 }, + { 0x143F701,0x1E4F3A2, 0x00,0x00, 0x8, +0 }, + { 0x35B8721,0x00A6021, 0x99,0x00, 0xE, +0 }, + { 0x0F3D385,0x0F3A341, 0x59,0x80, 0xC, +0 }, + { 0x125FF10,0x015F711, 0x56,0x00, 0xE, +0 }, + { 0x04AFA02,0x074F490, 0x16,0x01, 0xE, +0 }, + { 0x045F668,0x0289E87, 0x00,0x01, 0x6, +0 }, + { 0x164F923,0x177F607, 0x95,0x00, 0xE, +0 }, + { 0x0E7F21C,0x0B8F201, 0x6F,0x80, 0xC, +12 }, + { 0x0E2CE02,0x4E2F402, 0x25,0x00, 0x0, +0 }, + { 0x0E2F507,0x0E2F341, 0xA1,0x00, 0x0, +0 }, + { 0x2E5F5D9,0x0E5F251, 0x22,0x00, 0x8, +0 }, + { 0x0E1F111,0x0E1F251, 0x10,0x08, 0x9, +0 }, + { 0x4B1F0C9,0x0B2F251, 0x98,0x01, 0x8, +0 }, + { 0x082F311,0x0E3F311, 0x44,0x80, 0x9, +0 }, + { 0x0828523,0x0728212, 0xB3,0xA7, 0xE, +0 }, + { 0x0728201,0x0328411, 0x27,0x00, 0xE, +0 }, + { 0x4E5F111,0x4E5F312, 0xA1,0x40, 0x4, -12 }, + { 0x0E5F111,0x0E6F111, 0x89,0x00, 0x5, +0 }, + { 0x5047130,0x01474A0, 0x99,0x01, 0xE, +12 }, + { 0x1147561,0x0147522, 0x88,0x00, 0xF, +0 }, + { 0x5047130,0x01474A0, 0x99,0x01, 0xE, +0 }, + { 0x0141161,0x0165561, 0x17,0x00, 0xC, +12 }, + { 0x7217230,0x604BF31, 0x1B,0x03, 0xC, +0 }, + { 0x0357A31,0x03A7A31, 0x1D,0x09, 0xD, +0 }, + { 0x06599E1,0x0154825, 0x80,0x85, 0x8, +0 }, + { 0x015AA62,0x0058F21, 0x94,0x80, 0x9, +0 }, + { 0x025C9A4,0x0056F21, 0xA2,0x80, 0xC, +0 }, + { 0x015CAA2,0x0056F21, 0xAA,0x00, 0xD, +0 }, + { 0x07E0824,0x0E4E383, 0x80,0x40, 0xA, +24 }, + { 0x0E6F314,0x0E6F281, 0x63,0x00, 0xB, +0 }, + { 0x205FC00,0x017FA00, 0x40,0x00, 0xE, +0 }, + { 0x007FC00,0x638F801, 0x00,0x80, 0xF, +0 }, + { 0x0038165,0x005F172, 0xD2,0x80, 0x2, +0 }, + { 0x0038165,0x005F171, 0xD2,0x40, 0x2, +0 }, + { 0x002A4B4,0x04245D7, 0x47,0x40, 0x6, +0 }, + { 0x0022A55,0x0F34212, 0x97,0x80, 0x0, +0 }, + { 0x001EF8F,0x0F19801, 0x81,0x00, 0x4, +0 }, + { 0x01171B1,0x1154261, 0x8B,0x40, 0x6, +0 }, + { 0x053090E,0x094F702, 0x80,0x00, 0xE, +0 }, + { 0x08F74A1,0x02A65A1, 0x27,0x80, 0x2, +0 }, + { 0x0667190,0x08B5250, 0x92,0x00, 0xE, +0 }, + { 0x0247332,0x0577521, 0x16,0x80, 0xE, +0 }, + { 0x28FA520,0x03D3621, 0x8E,0x00, 0x6, +0 }, + { 0x08C4321,0x02F8521, 0x19,0x80, 0xC, +0 }, + { 0x0AE71A1,0x02E81A0, 0x1C,0x00, 0xE, +0 }, + { 0x054F606,0x0B3F281, 0x73,0x03, 0x0, +0 }, + { 0x0177421,0x01765A2, 0x83,0x8D, 0x7, +0 }, + { 0x0F3F8E2,0x0F3F7B0, 0x86,0x40, 0x4, +0 }, + { 0x0031801,0x090F6B4, 0x80,0xC1, 0xE, +0 }, + { 0x04CA800,0x04FD600, 0x0B,0x03, 0x0, +0 }, + { 0x282B2A4,0x1DA9803, 0x00,0x93, 0xE, +0 }, + { 0x0A0B2A4,0x1D69603, 0x02,0x80, 0xE, +0 }, + { 0x104F0A1,0x1D6F481, 0xCE,0x00, 0x4, +0 }, + { 0x254F568,0x0B7F321, 0xE8,0x00, 0x0, +0 }, + { 0x036F506,0x025FD61, 0x10,0x80, 0x3, +0 }, + { 0x092FF83,0x003F015, 0x00,0x00, 0xE, -12 }, + { 0x00FF0A0,0x00FF0A2, 0xC0,0x06, 0xD, +0 }, + { 0x00BF022,0x10B50B1, 0xCD,0x03, 0x0, +0 }, + { 0x3598600,0x02A7244, 0x42,0x80, 0xC, +0 }, + { 0x039F330,0x00CF060, 0x0F,0x00, 0x8, +12 }, + { 0x1378D31,0x0163871, 0x85,0x00, 0xA, +0 }, + { 0x106F031,0x1065071, 0xC5,0x00, 0x0, +0 }, + { 0x11FF431,0x1365361, 0x40,0x00, 0x0, +0 }, + { 0x01FF431,0x1366361, 0xC0,0x00, 0x0, +0 }, + { 0x043F2B1,0x12851A1, 0x1D,0x00, 0xE, +0 }, + { 0x015F431,0x00560B2, 0x5B,0x83, 0x0, +0 }, + { 0x172FCE1,0x0176271, 0x46,0x00, 0x0, +0 }, + { 0x00530B1,0x00550B2, 0x57,0x00, 0xC, +0 }, + { 0x0655371,0x00FF021, 0x14,0x00, 0xA, +0 }, + { 0x0254231,0x00FF061, 0x56,0x01, 0xE, +0 }, + { 0x1255221,0x0299361, 0x55,0x01, 0xE, +0 }, + { 0x0755471,0x0089021, 0x20,0x00, 0xE, +0 }, + { 0x0043071,0x00A5021, 0x57,0x00, 0xC, +0 }, + { 0x0445171,0x00A5021, 0x55,0x00, 0xC, +0 }, + { 0x35AF802,0x02A4271, 0x00,0x00, 0xE, +0 }, + { 0x08F4EE0,0x02A55A1, 0xEC,0x00, 0xE, +0 }, + { 0x39D6571,0x0095021, 0x17,0x00, 0xE, +0 }, + { 0x05AF802,0x22A4270, 0x00,0x00, 0xE, +0 }, + { 0x29D65A1,0x2095021, 0xC6,0x00, 0x0, -12 }, + { 0x00330B1,0x00440B2, 0x5D,0x00, 0x0, +0 }, + { 0x0585201,0x03641A1, 0x99,0x00, 0x6, +0 }, + { 0x0B4F291,0x075F101, 0xD0,0x00, 0x0, +0 }, + { 0x0572132,0x0194263, 0x06,0x00, 0x9, -12 }, + { 0x3859F85,0x043F311, 0x15,0x00, 0xE, +0 }, + { 0x295F300,0x2B9F2A0, 0x11,0x00, 0x0, +0 }, + { 0x2A3F400,0x2B9F2A0, 0x1B,0x00, 0x0, +0 }, + { 0x2A2FF80,0x30E108E, 0x00,0x00, 0xE, +0 }, + { 0x003402E,0x003109E, 0x00,0x00, 0xE, +0 }, + { 0x2A3379B,0x237461A, 0x95,0x40, 0x0, +0 }, + { 0x344FFAB,0x02AF1EA, 0xC0,0x01, 0xC, -12 }, + { 0x10EF0BE,0x00E3030, 0x00,0x0A, 0xE, +0 }, + { 0x023FCC0,0x006F08E, 0x00,0x00, 0xE, +0 }, + { 0x004F081,0x308F009, 0xC0,0x00, 0xE, +0 }, + { 0x12FF201,0x356F58E, 0xC0,0x00, 0xE, +0 }, + { 0x12FF281,0x356F58E, 0xC0,0x00, 0xE, +0 }, + { 0x155AF00,0x364FF8B, 0x00,0x00, 0xE, +0 }, + { 0x1496401,0x356F58A, 0xC0,0x00, 0xE, +0 }, + { 0x2678900,0x357878E, 0x00,0x00, 0xE, +0 }, + { 0x02FF281,0x356F58E, 0xC0,0x00, 0x0, +0 }, + { 0x0089011,0x357898E, 0xC0,0x00, 0xE, +0 }, + { 0x11BF100,0x3468B9E, 0x00,0x00, 0xE, +0 }, + { 0x205504C,0x05C859D, 0x80,0x0A, 0xA, +0 }, + { 0x205508C,0x05C854D, 0x40,0x0A, 0x0, +0 }, + { 0x206F08B,0x346F610, 0x00,0x00, 0xE, +0 }, + { 0x392F700,0x2AF479E, 0x00,0x00, 0xE, +0 }, + { 0x053F300,0x247698E, 0x43,0x00, 0xE, +0 }, + { 0x224F10E,0x335FF8E, 0x40,0x02, 0x0, +0 }, + { 0x104F081,0x308F009, 0xC0,0x00, 0xE, +0 }, + { 0x215BFD1,0x20473C1, 0x9C,0x00, 0x4, +0 }, + { 0x177F810,0x008F711, 0x91,0x00, 0x6, +0 }, + { 0x277F810,0x108F311, 0xF9,0xC0, 0x6, +0 }, + { 0x25DFB14,0x058F611, 0x80,0x00, 0x8, +0 }, + { 0x12AF900,0x22BFA01, 0x02,0x00, 0x5, +0 }, + { 0x28268D1,0x10563D0, 0x42,0x00, 0xA, +0 }, + { 0x317B142,0x317B101, 0x93,0x00, 0x3, +0 }, + { 0x317B242,0x317B201, 0x93,0x00, 0x3, +0 }, + { 0x2BAE610,0x005EA10, 0x3F,0x3F, 0x0, +0 }, + { 0x053B101,0x074C211, 0x4F,0x00, 0x6, +0 }, + { 0x011F111,0x0B3F101, 0x4A,0x80, 0x6, +0 }, + { 0x1FAF000,0x1FAF211, 0x02,0x80, 0x6, +0 }, + { 0x032F607,0x012F511, 0x97,0x80, 0x2, +0 }, + { 0x0E3F318,0x093F241, 0x62,0x00, 0x0, +0 }, + { 0x025DA05,0x015F901, 0x4E,0x00, 0xA, +0 }, + { 0x1558403,0x005D341, 0x49,0x80, 0x4, +0 }, + { 0x01FF003,0x012F001, 0x5B,0x92, 0xA, +0 }, + { 0x01FF2A0,0x07CF521, 0x11,0x00, 0xA, +0 }, + { 0x0442009,0x0F4D144, 0xA1,0x80, 0x8, +0 }, + { 0x08AE220,0x0A8E420, 0x11,0x00, 0xA, +0 }, + { 0x1DBB891,0x1567551, 0x17,0x00, 0xC, +0 }, + { 0x0117171,0x11772A1, 0x8B,0x40, 0x6, +0 }, + { 0x111F0F1,0x1151121, 0x95,0x00, 0x0, +0 }, + { 0x111C071,0x1159221, 0x20,0x08, 0xC, +0 }, + { 0x0C57461,0x165B220, 0x0F,0x08, 0xA, +0 }, + { 0x08153E1,0x0B962E1, 0x9F,0x05, 0xE, +0 }, + { 0x0AE71E1,0x09E81E1, 0x19,0x07, 0xA, +0 }, + { 0x0AE73E1,0x09881E2, 0x49,0x08, 0xC, +0 }, + { 0x0177E71,0x00E7B22, 0xC5,0x05, 0x2, +0 }, + { 0x08F7461,0x02A6561, 0x27,0x80, 0x2, +0 }, + { 0x0D761E1,0x0F793E1, 0x85,0x80, 0xB, +0 }, + { 0x1F6FB34,0x0439471, 0x83,0x00, 0xC, +0 }, + { 0x011A131,0x0437D16, 0x87,0x80, 0x8, +0 }, + { 0x1111EF0,0x11111E2, 0x00,0xC0, 0x8, +0 }, + { 0x053F101,0x1F5F718, 0x4F,0x00, 0x6, +0 }, + { 0x20CA808,0x13FD903, 0x09,0x00, 0x0, +0 }, + { 0x0A1B2E0,0x1D6950E, 0x84,0x00, 0xE, +0 }, + { 0x286F265,0x228670E, 0x00,0x00, 0xE, +0 }, + { 0x00CFD01,0x034D600, 0x07,0x00, 0x0, +0 }, + { 0x00CF600,0x004F600, 0x00,0x00, 0x1, +0 }, + { 0x0FEF512,0x0FFF652, 0x11,0xA2, 0x6, +0 }, + { 0x0FFF941,0x0FFF851, 0x0F,0x00, 0x6, +0 }, + { 0x205FC80,0x017FA00, 0x00,0x00, 0xE, +0 }, + { 0x034A501,0x602FF01, 0x00,0x00, 0x7, +0 }, + { 0x007FB00,0x004A401, 0x09,0x00, 0x7, +0 }, + { 0x004F902,0x0F69705, 0x00,0x03, 0x0, +0 }, + { 0x156F284,0x100F442, 0x03,0x00, 0xE, +0 }, + { 0x000F34F,0x0A5F48F, 0x00,0x06, 0xE, +0 }, + { 0x0B6FA01,0x096C802, 0x8A,0x40, 0xE, +0 }, + { 0x00CF505,0x007F501, 0xEC,0x00, 0xF, +0 }, + { 0x0BFFA01,0x095C802, 0x8F,0x80, 0x6, +0 }, + { 0x00CF505,0x006F501, 0xEC,0x00, 0x7, +0 }, + { 0x08DFA01,0x0BAFA03, 0x4F,0x00, 0x6, +0 }, + { 0x08DFA01,0x0B5F803, 0x4F,0x00, 0x6, +0 }, + { 0x006FA01,0x006FA00, 0x00,0x00, 0xE, +0 }, + { 0x38CF800,0x06EF600, 0x80,0x00, 0xE, +0 }, + { 0x38CF803,0x0B5F80C, 0x80,0x00, 0xE, +0 }, + { 0x38CF803,0x0B5F80C, 0x83,0x00, 0xE, +0 }, + { 0x049C80F,0x2699B03, 0x40,0x00, 0xE, +0 }, + { 0x305AD57,0x2058D47, 0xDC,0x00, 0xE, +0 }, + { 0x304A857,0x2048847, 0xDC,0x00, 0xE, +0 }, + { 0x506FF80,0x016FF10, 0x00,0x00, 0xC, +0 }, + { 0x7476601,0x0476603, 0xCD,0x40, 0x8, +0 }, + { 0x0476601,0x0576601, 0xC0,0x00, 0x9, +0 }, + { 0x0E56701,0x0356503, 0x11,0x24, 0xA, +0 }, + { 0x0757900,0x0057601, 0x9A,0x00, 0xB, +0 }, + { 0x0E6F622,0x0E5F923, 0x1E,0x03, 0x0, +0 }, + { 0x0E6F924,0x0E4F623, 0x28,0x00, 0x1, +0 }, + { 0x0E6F522,0x0E5F623, 0x1E,0x03, 0x0, +0 }, + { 0x0E6F524,0x0E4F423, 0x28,0x00, 0x1, +0 }, + { 0x0E5F108,0x0E5C302, 0x66,0x86, 0x8, +0 }, + { 0x052F605,0x0D5F582, 0x69,0x47, 0x9, +0 }, + { 0x131FF13,0x003FF11, 0x43,0x00, 0x6, +0 }, + { 0x074A302,0x075C401, 0x9A,0x80, 0xA, +0 }, + { 0x103E702,0x005E604, 0x86,0x40, 0xB, +0 }, + { 0x0145321,0x025D221, 0x8B,0x21, 0x8, +0 }, + { 0x104C3A1,0x0158221, 0x9F,0x0F, 0x8, +0 }, + { 0x075F502,0x0F3F201, 0x20,0x83, 0xC, +0 }, + { 0x7D2FE85,0x074F342, 0x8F,0x80, 0x6, -12 }, + { 0x0119131,0x11572A1, 0x8A,0x00, 0x6, +0 }, + { 0x0013121,0x10545A1, 0x4D,0x82, 0x6, +0 }, + { 0x0075131,0x0399261, 0x1D,0x80, 0xE, +0 }, + { 0x00741B1,0x0398221, 0x1C,0x87, 0xF, +0 }, + { 0x21A73A0,0x03A8523, 0x95,0x00, 0xE, +0 }, + { 0x05A5321,0x01A6C21, 0x9F,0x80, 0xC, +0 }, + { 0x0565321,0x0277C21, 0x18,0x00, 0xD, +0 }, + { 0x0299960,0x036F823, 0xA3,0x5D, 0xA, +12 }, + { 0x015FAA0,0x00B8F22, 0x90,0x08, 0xA, +0 }, + { 0x22871A0,0x01A8124, 0x23,0x00, 0xA, +0 }, + { 0x2287320,0x01A8424, 0x97,0x98, 0xB, +0 }, + { 0x0068B20,0x0008F21, 0x2F,0x20, 0xE, +12 }, + { 0x007CF20,0x0097F22, 0x5B,0x00, 0xE, +0 }, + { 0x0277784,0x01655A1, 0x9B,0x85, 0xC, +0 }, + { 0x01566A2,0x00566A1, 0x9B,0x06, 0xD, +0 }, + { 0x137FB00,0x05CE711, 0x05,0x00, 0x8, +0 }, + { 0x04CA900,0x04FD600, 0x0B,0x00, 0x0, +0 }, + { 0x023F302,0x067F700, 0x08,0x00, 0xE, +0 }, + { 0x017FB01,0x008FD02, 0x40,0x00, 0x9, +0 }, + { 0x0F4F306,0x0E4E203, 0xA4,0x6D, 0x6, +0 }, + { 0x0D4E101,0x0E5E111, 0x53,0x02, 0x6, +0 }, + { 0x053F241,0x0F3F213, 0x9D,0x00, 0x6, +0 }, + { 0x050F101,0x076D201, 0x4F,0x04, 0x6, +0 }, + { 0x053F101,0x0849212, 0xC3,0x09, 0x8, +0 }, + { 0x074F202,0x077F401, 0x92,0x83, 0x8, +0 }, + { 0x013F202,0x044F502, 0x22,0x00, 0xE, +0 }, + { 0x475F113,0x256F201, 0x96,0x81, 0x6, +0 }, + { 0x0100133,0x033AD14, 0x87,0x80, 0x8, +0 }, + { 0x0E5F14C,0x0E5C301, 0x69,0x06, 0x8, +0 }, + { 0x0E2660F,0x0E4C191, 0x9D,0x06, 0xE, +0 }, + { 0x033F584,0x015FDA0, 0x59,0x80, 0x2, +0 }, + { 0x0B5F615,0x0E6F311, 0x97,0x01, 0x4, +0 }, + { 0x0F8FF06,0x055F8C4, 0x01,0x00, 0xE, +0 }, + { 0x063F207,0x074F212, 0x4F,0x00, 0x8, +0 }, + { 0x341F5A3,0x203F811, 0x11,0x00, 0x0, +0 }, + { 0x01AF003,0x01DF001, 0x5B,0x80, 0xA, +0 }, + { 0x22A9132,0x12A91B1, 0xCD,0x80, 0x9, +0 }, + { 0x0038165,0x005F171, 0xD2,0x80, 0x2, +0 }, + { 0x00AFF24,0x00DFF21, 0x80,0x80, 0x1, +0 }, + { 0x01CF003,0x01EA001, 0x54,0x84, 0xC, +0 }, + { 0x0186223,0x02A6221, 0x19,0x84, 0xE, +0 }, + { 0x0087224,0x00B4231, 0x4F,0x00, 0xE, +0 }, + { 0x0186222,0x02A6221, 0x19,0x84, 0xE, +0 }, + { 0x0C3C201,0x056F501, 0x0A,0x00, 0x6, +0 }, + { 0x034F401,0x039F201, 0x13,0x80, 0x8, +0 }, + { 0x07FC611,0x0DFF511, 0x4D,0x00, 0x6, +0 }, + { 0x4C5A421,0x004F821, 0x20,0x00, 0x2, +0 }, + { 0x0E78301,0x078F201, 0x56,0x00, 0xA, +0 }, + { 0x0AFF301,0x078F501, 0x11,0x00, 0x8, +0 }, + { 0x114FF20,0x0D4F561, 0xCB,0x00, 0xC, +0 }, + { 0x1937510,0x182F501, 0x00,0x00, 0x0, +0 }, + { 0x01379C0,0x07472D2, 0x4F,0x00, 0x6, +12 }, + { 0x2355612,0x12D9531, 0x9C,0x00, 0xA, +0 }, + { 0x21351A0,0x2275360, 0x9B,0x01, 0xE, +0 }, + { 0x163F2A1,0x0368331, 0x48,0x00, 0x6, +0 }, + { 0x171A501,0x2539600, 0x0D,0x02, 0x7, +0 }, + { 0x051F431,0x074B711, 0x57,0x00, 0xC, +0 }, + { 0x005F624,0x095C702, 0xDB,0x23, 0x8, +0 }, + { 0x095F422,0x0D5F401, 0x22,0x00, 0x8, +0 }, + { 0x016F521,0x03493A1, 0x8C,0x00, 0x0, +0 }, + { 0x01FB431,0x01FA2A1, 0x1A,0x80, 0xE, +0 }, + { 0x04654A1,0x0078FA1, 0x1C,0x07, 0xE, +0 }, + { 0x0466421,0x0078FE1, 0x14,0x01, 0xF, +0 }, + { 0x0796520,0x0268AA1, 0x8C,0x03, 0x8, +12 }, + { 0x2179280,0x03686A0, 0xCF,0x00, 0x9, +0 }, + { 0x03A5321,0x00B6521, 0x9C,0x01, 0xA, +0 }, + { 0x01C7321,0x02C7C21, 0xC0,0x97, 0xB, +0 }, + { 0x06581E1,0x07C52F2, 0x51,0x00, 0xC, +0 }, + { 0x22E71E0,0x01E80E4, 0x23,0x00, 0xA, +0 }, + { 0x019D530,0x01B6171, 0xC8,0x80, 0xC, +0 }, + { 0x01582A3,0x007E562, 0x21,0x9E, 0xE, +0 }, + { 0x005D224,0x0076F21, 0x9F,0x02, 0xF, +0 }, + { 0x48674A1,0x02765A1, 0x1F,0x00, 0x0, +0 }, + { 0x0277584,0x01655A1, 0xA0,0x81, 0xC, +0 }, + { 0x01566A2,0x00566A1, 0x8A,0x00, 0xD, +0 }, + { 0x016D322,0x07DE82F, 0x9B,0x2E, 0xE, -12 }, + { 0x006C524,0x02764B2, 0x62,0x04, 0xE, +0 }, + { 0x0557221,0x096F481, 0x0B,0x08, 0x6, +0 }, + { 0x0A6CF22,0x09C8410, 0xD5,0x0D, 0x7, +0 }, + { 0x001F501,0x0F1F101, 0x37,0x20, 0x0, +0 }, + { 0x0E3F201,0x0E7F501, 0x11,0x00, 0x0, +0 }, + { 0x03CF201,0x0E2F111, 0x3F,0x14, 0x0, +0 }, + { 0x0E6F541,0x0E7F312, 0x13,0x01, 0x0, +0 }, + { 0x01582A3,0x00AF562, 0x21,0xA3, 0xE, +0 }, + { 0x005F224,0x00A6F21, 0xA2,0x09, 0xF, +0 }, + { 0x0F0F006,0x2B6F800, 0x00,0x00, 0xE, +0 }, + { 0x04CA900,0x03FF600, 0x07,0x00, 0xA, +0 }, + { 0x008B902,0x01DFC03, 0x00,0x00, 0xB, +0 }, + { 0x60AF905,0x41CFC0A, 0x00,0x00, 0xD, +0 }, + { 0x033F400,0x4FFF700, 0x04,0x00, 0xE, +0 }, + { 0x40AFF02,0x01CFF00, 0xC0,0x01, 0x4, +0 }, + { 0x003F902,0x247FB00, 0x00,0x00, 0xE, +0 }, + { 0x403FB02,0x447FB01, 0x00,0x00, 0xE, +0 }, + { 0x609F505,0x709F30F, 0x00,0x00, 0x6, +0 }, + { 0x201C687,0x023BC15, 0xC0,0x40, 0xE, +0 }, + { 0x435DE00,0x438F801, 0xC0,0x00, 0xA, +0 }, + { 0x30AF400,0x278F700, 0x47,0x04, 0xE, +0 }, + { 0x30AF400,0x278F700, 0x4B,0x02, 0xE, +0 }, + { 0x509F601,0x429F701, 0x00,0x00, 0x7, +0 }, + { 0x407FF00,0x769A901, 0x00,0x40, 0x9, +0 }, + { 0x408FA01,0x769DB02, 0x00,0x40, 0x7, +0 }, + { 0x112AA03,0x1F59011, 0x1C,0x00, 0xE, +0 }, + { 0x073F668,0x063F5A1, 0x1B,0x0D, 0x0, +0 }, + { 0x054F1A1,0x0F4F060, 0x54,0x00, 0x2, +0 }, + { 0x0038164,0x005D171, 0xD2,0x80, 0x2, +0 }, + { 0x0F1FB3E,0x093A071, 0x29,0x00, 0x0, +0 }, + { 0x022FE30,0x007FB20, 0x07,0x00, 0x0, +0 }, + { 0x0527101,0x0735012, 0x8F,0x00, 0xA, +0 }, + { 0x1249F16,0x035B012, 0x11,0x00, 0x8, +0 }, + { 0x1119183,0x0F1B142, 0xD7,0x00, 0x0, +0 }, + { 0x006FA04,0x005FF01, 0xD3,0x00, 0xA, +0 }, + { 0x044F406,0x034F201, 0x03,0x1B, 0x1, +0 }, + { 0x088FA21,0x097B313, 0x06,0x00, 0xC, +0 }, + { 0x031F91C,0x0E89615, 0x0C,0x00, 0xE, +0 }, + { 0x0F7F521,0x0F7F521, 0x99,0x80, 0xE, +0 }, + { 0x038B2F1,0x0488122, 0x19,0x40, 0xC, +0 }, + { 0x016D221,0x0F8C201, 0x1D,0x00, 0xA, +0 }, + { 0x082D301,0x0B8D301, 0x4E,0x06, 0xA, +0 }, + { 0x0036101,0x0F86101, 0x14,0x0D, 0xC, +0 }, + { 0x017F321,0x0E8F222, 0x17,0x08, 0xC, +0 }, + { 0x0CEB161,0x1BAD061, 0x13,0x40, 0xA, +0 }, + { 0x075C130,0x0659131, 0x10,0x42, 0xA, +0 }, + { 0x0977801,0x0988802, 0x00,0x00, 0x8, +0 }, + { 0x0FEF22C,0x0D8B802, 0x00,0x1A, 0x6, +0 }, + { 0x0F6822E,0x0F87404, 0x00,0x27, 0x4, +0 }, + { 0x0009F2C,0x0D4C50E, 0x00,0x05, 0xE, +0 }, + { 0x0009429,0x044F904, 0x10,0x04, 0xE, +0 }, + { 0x0F1F52E,0x0F78706, 0x09,0x03, 0x0, +0 }, + { 0x0A1F737,0x028F603, 0x14,0x00, 0x8, +0 }, + { 0x000FF80,0x0F7F500, 0x00,0x00, 0xC, +0 }, + { 0x0FAFB21,0x0F7A802, 0x03,0x00, 0x0, +0 }, + { 0x0FAF924,0x0F6A603, 0x18,0x00, 0xE, +0 }, + { 0x0F5F505,0x036F603, 0x14,0x00, 0x6, +0 }, + { 0x001FF0E,0x077790E, 0x00,0x02, 0xE, +0 }, + { 0x007AF20,0x02BA50E, 0x15,0x00, 0x4, +0 }, + { 0x007BF20,0x03B930E, 0x18,0x00, 0x0, +0 }, + { 0x0F7F020,0x03B8908, 0x00,0x01, 0xA, +0 }, + { 0x0FAF320,0x02B5308, 0x00,0x0A, 0x8, +0 }, + { 0x09AF815,0x089F613, 0x21,0x10, 0x8, +0 }, + { 0x0075F20,0x04B8708, 0x01,0x00, 0x0, +0 }, + { 0x0F75725,0x0677803, 0x12,0x00, 0x0, +0 }, + { 0x0F0F126,0x0F5F527, 0x97,0xA1, 0x4, +0 }, + { 0x054F123,0x173F231, 0x66,0x00, 0x6, +0 }, + { 0x010A132,0x0337D16, 0x87,0x80, 0x8, +0 }, + { 0x143F523,0x204F811, 0x0E,0x00, 0x0, +0 }, + { 0x0100133,0x0027D14, 0x87,0x80, 0x8, +0 }, + { 0x001AF64,0x062A33F, 0xDB,0xC0, 0x4, +0 }, + { 0x0118171,0x1156261, 0x8B,0x40, 0x6, +0 }, + { 0x0127171,0x11652E1, 0x8B,0x40, 0x6, +0 }, + { 0x143F523,0x208F831, 0x0E,0x00, 0x0, +0 }, + { 0x0E7F301,0x078F201, 0x58,0x00, 0xA, +0 }, + { 0x054C701,0x096A201, 0x4D,0x00, 0x4, +0 }, + { 0x154C701,0x096A201, 0x4D,0x00, 0x4, +0 }, + { 0x0C28621,0x0BDF221, 0x16,0x00, 0x2, +0 }, + { 0x08DF520,0x08CF311, 0x49,0x00, 0xA, +12 }, + { 0x09EF520,0x05BF411, 0x90,0x00, 0xC, +12 }, + { 0x5144261,0x3344261, 0x87,0x82, 0x1, +0 }, + { 0x02371A1,0x1286371, 0x4F,0x02, 0x6, +0 }, + { 0x11152F0,0x12E32F1, 0xC5,0x80, 0x0, +0 }, + { 0x01171F1,0x11542E1, 0x8B,0x40, 0x6, +0 }, + { 0x01FF201,0x088F701, 0x17,0x00, 0xA, +0 }, + { 0x054C701,0x096A201, 0x8D,0x00, 0x4, -24 }, + { 0x0117171,0x11542E1, 0x8B,0x40, 0x6, +0 }, + { 0x053F121,0x1743232, 0x4F,0x00, 0x6, +0 }, + { 0x0117171,0x1154261, 0x8B,0x40, 0x6, +0 }, + { 0x01271B1,0x1166261, 0x8B,0x40, 0x6, +0 }, + { 0x011A1B1,0x1159261, 0x8B,0x40, 0x6, +0 }, + { 0x5176261,0x3176261, 0x80,0x82, 0x5, +0 }, + { 0x5155261,0x3166362, 0x80,0x83, 0x5, +0 }, + { 0x0065131,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x01F61B1,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x0276561,0x2275570, 0x83,0x03, 0xB, +0 }, + { 0x0537101,0x07C6212, 0x4E,0x00, 0xA, +0 }, + { 0x0658181,0x07C52B2, 0x93,0x00, 0xA, +0 }, + { 0x02661B0,0x0375271, 0x96,0x00, 0xE, +12 }, + { 0x0A6FF64,0x01424B1, 0x8A,0x00, 0xE, +0 }, + { 0x0A4F724,0x0132431, 0x5B,0x00, 0xE, +0 }, + { 0x0384161,0x028E1A1, 0x97,0x00, 0x6, +0 }, + { 0x01797F1,0x048F321, 0x06,0x0D, 0x8, +0 }, + { 0x054F406,0x053F281, 0x73,0x03, 0x0, +0 }, + { 0x1E31111,0x0D42101, 0x09,0x05, 0x6, +0 }, + { 0x30217B1,0x0057321, 0x29,0x03, 0x6, +0 }, + { 0x08311E6,0x0541120, 0x11,0x00, 0x0, +0 }, + { 0x00361B1,0x0175461, 0x1F,0x01, 0xE, +0 }, + { 0x0F00000,0x0A21B14, 0x02,0x80, 0xE, +0 }, + { 0x03FB300,0x0F0AB08, 0x80,0x00, 0xA, +0 }, + { 0x1B29510,0x0069510, 0x11,0x00, 0x8, +0 }, + { 0x0F0F000,0x0B69800, 0x00,0x08, 0xE, +0 }, + { 0x0F0F009,0x0F7B720, 0x0E,0x0A, 0xE, +0 }, + { 0x21AF400,0x008F800, 0x00,0x08, 0xC, +0 }, + { 0x054C701,0x096A201, 0x8D,0x00, 0x4, +0 }, + { 0x202FF4F,0x3F6F601, 0x00,0x0F, 0x8, +0 }, + { 0x300EF9E,0x0D8A705, 0x80,0x00, 0xC, +0 }, + { 0x0F0F006,0x035C4C4, 0x00,0x03, 0xE, +0 }, + { 0x210BA2F,0x2F4B40F, 0x0E,0x00, 0xE, +0 }, + { 0x053F101,0x0B5F700, 0x7F,0x00, 0x6, +0 }, + { 0x013FA43,0x096F342, 0xD6,0x80, 0xA, +0 }, + { 0x030F930,0x0FEF600, 0x01,0x00, 0xE, +0 }, + { 0x0FF0006,0x0FDF715, 0x3F,0x0D, 0x0, +0 }, + { 0x0F0F006,0x0B4F600, 0x00,0x20, 0xE, +0 }, + { 0x1DEB421,0x0EEF231, 0x45,0x00, 0x6, +0 }, + { 0x0135821,0x0031531, 0x2B,0x00, 0x8, +0 }, + { 0x0ADF321,0x05DF321, 0x08,0x00, 0x8, +0 }, + { 0x0EFD245,0x0EFA301, 0x4F,0x00, 0xA, +0 }, + { 0x0E7F217,0x0E7C211, 0x54,0x06, 0xA, +0 }, + { 0x0C7F219,0x0D7F291, 0x2B,0x07, 0xB, +0 }, + { 0x1084331,0x0084232, 0x93,0x00, 0xC, +0 }, + { 0x0084522,0x01844F1, 0x65,0x00, 0xD, +0 }, + { 0x0E8F318,0x0F8F281, 0x62,0x00, 0x0, +0 }, + { 0x0DFD441,0x0DFC280, 0x8A,0x0C, 0x4, +0 }, + { 0x0DFD345,0x0FFA381, 0x93,0x00, 0x5, +0 }, + { 0x02CA760,0x00DAFE1, 0xC6,0x80, 0x4, +0 }, + { 0x0EEF121,0x17FD131, 0x00,0x00, 0x4, +0 }, + { 0x02FA7A3,0x00FAFE1, 0x56,0x83, 0x8, +0 }, + { 0x00FAF61,0x00FAFA2, 0x91,0x83, 0x9, +0 }, + { 0x275A421,0x1456161, 0x13,0x00, 0x4, +0 }, + { 0x4FAB913,0x0DA9102, 0x0D,0x1A, 0xA, +0 }, + { 0x04FF923,0x2FF9122, 0xA1,0x16, 0xE, +0 }, + { 0x0BF9120,0x04F9122, 0x99,0x00, 0xE, +0 }, + { 0x0432121,0x0355222, 0x97,0x00, 0x8, +0 }, + { 0x0AD9101,0x0CD9301, 0x53,0x00, 0x2, +0 }, + { 0x0EAF111,0x0EAF312, 0xA8,0x57, 0x4, +0 }, + { 0x0EAE111,0x0EAE111, 0x97,0x00, 0x4, +0 }, + { 0x0ECF131,0x07DF131, 0x8D,0x00, 0xA, +0 }, + { 0x02A5131,0x04A7132, 0x5B,0x00, 0xC, +0 }, + { 0x04A7131,0x04A7131, 0x19,0x00, 0xD, +0 }, + { 0x0AE9101,0x0CE9302, 0x93,0x00, 0x6, +0 }, + { 0x02FF120,0x3CFF220, 0x8C,0x00, 0x6, +0 }, + { 0x04FF220,0x35FF222, 0x94,0x00, 0x8, +0 }, + { 0x2036130,0x21754A0, 0x95,0x00, 0xA, +0 }, + { 0x3107560,0x2176520, 0x89,0x00, 0xB, +0 }, + { 0x513DD31,0x0385621, 0x95,0x00, 0xC, +0 }, + { 0x1038D13,0x0786025, 0x95,0x89, 0xD, +0 }, + { 0x121F131,0x0166FE1, 0x40,0x00, 0x2, +0 }, + { 0x1038D14,0x0266620, 0x95,0x89, 0x9, +0 }, + { 0x1FFF510,0x0FFF211, 0x41,0x00, 0x2, +0 }, + { 0x1176561,0x0176521, 0x96,0x00, 0xF, +0 }, + { 0x2097861,0x1095821, 0x16,0x00, 0x8, +0 }, + { 0x121F131,0x0177C61, 0x40,0x00, 0x2, +0 }, + { 0x6EF1F15,0x6E21115, 0xC0,0x40, 0xE, +0 }, + { 0x0E21111,0x0E31111, 0x40,0x00, 0xE, +0 }, + { 0x2686500,0x616C500, 0x00,0x00, 0xB, +0 }, + { 0x6DAC600,0x30E7400, 0x00,0x00, 0xB, +0 }, + { 0x01C8521,0x00C8F21, 0x92,0x01, 0xC, +0 }, + { 0x01C8421,0x00CAF61, 0x15,0x0B, 0xD, +0 }, + { 0x01B8521,0x00B7F21, 0x94,0x05, 0xC, +0 }, + { 0x01B8421,0x00BAF61, 0x15,0x0D, 0xD, +0 }, + { 0x0158621,0x0378221, 0x94,0x00, 0xC, +0 }, + { 0x0178521,0x0098F61, 0x92,0x00, 0xC, +0 }, + { 0x00A7321,0x00B8F21, 0x9F,0x00, 0xE, +0 }, + { 0x00A65A1,0x00B9F61, 0x9B,0x00, 0xF, +0 }, + { 0x02E7221,0x00E8F21, 0x16,0x00, 0xC, +0 }, + { 0x0EE7521,0x03E8A21, 0x1D,0x00, 0xD, +0 }, + { 0x0AC54A1,0x01CA661, 0x50,0x00, 0x8, +0 }, + { 0x2089331,0x00A72A1, 0x96,0x00, 0x8, +0 }, + { 0x0088521,0x12A8431, 0x96,0x00, 0x9, +0 }, + { 0x10A9331,0x00D72A1, 0x8E,0x00, 0x8, +0 }, + { 0x00AC524,0x12D6431, 0xA1,0x00, 0x9, +0 }, + { 0x10F9331,0x00F7271, 0x8D,0x00, 0xA, +0 }, + { 0x006A524,0x11664B1, 0x9D,0x00, 0xB, +0 }, + { 0x51E7E71,0x10F8B21, 0x4D,0x00, 0x6, +0 }, + { 0x1197531,0x0196172, 0x8E,0x00, 0xA, +0 }, + { 0x0269B32,0x0187321, 0x90,0x00, 0x4, +0 }, + { 0x02F7721,0x02F7A73, 0x21,0x55, 0x2, +0 }, + { 0x01F7A21,0x01F7A22, 0x93,0x00, 0x2, +0 }, + { 0x01DAFA1,0x00D7521, 0x9C,0x00, 0x2, +0 }, + { 0x011DA65,0x068A663, 0x00,0x1E, 0xC, +0 }, + { 0x0588861,0x01A6561, 0x8C,0x00, 0xD, +0 }, + { 0x1282121,0x0184161, 0x12,0x00, 0x0, +0 }, + { 0x00FFF21,0x60FFF21, 0x09,0x80, 0x5, +0 }, + { 0x3FAF100,0x3FAF111, 0x8E,0x00, 0x0, +0 }, + { 0x2C686A1,0x0569321, 0x46,0x80, 0xA, +0 }, + { 0x01B7D61,0x01B72B1, 0x40,0x23, 0xE, +0 }, + { 0x00BDFA2,0x00B7F61, 0x5D,0x80, 0xF, +0 }, + { 0x009FF20,0x40A8F61, 0x36,0x00, 0x8, +0 }, + { 0x00FFF21,0x40D8F61, 0x27,0x00, 0x9, +0 }, + { 0x0FCF521,0x0FDF523, 0x0F,0x00, 0xA, +0 }, + { 0x0FDF926,0x6FCF921, 0x16,0x00, 0xB, +0 }, + { 0x011A861,0x0032531, 0x1F,0x80, 0xA, +0 }, + { 0x031A101,0x0032571, 0xA1,0x00, 0xB, +0 }, + { 0x0141161,0x0175561, 0x17,0x00, 0xC, +0 }, + { 0x446C361,0x026C361, 0x14,0x00, 0xD, +0 }, + { 0x63311E1,0x0353261, 0x89,0x03, 0xA, +0 }, + { 0x6E42161,0x6D53261, 0x8C,0x03, 0xB, +0 }, + { 0x0336121,0x0355261, 0x8D,0x03, 0xA, +0 }, + { 0x177A1A1,0x1471121, 0x1C,0x00, 0xB, +0 }, + { 0x03311E1,0x0353261, 0x89,0x03, 0xA, +0 }, + { 0x0E42161,0x0D53261, 0x8C,0x03, 0xB, +0 }, + { 0x003A801,0x005A742, 0x99,0x00, 0xD, +0 }, + { 0x2332121,0x0143260, 0x8C,0x97, 0x6, +0 }, + { 0x1041161,0x0143121, 0x0E,0x00, 0x7, +0 }, + { 0x056B222,0x054F261, 0x92,0x00, 0xC, +0 }, + { 0x04311A1,0x0741161, 0x0E,0x92, 0xA, +0 }, + { 0x0841161,0x0041DA1, 0x8E,0x80, 0xB, +0 }, + { 0x0346161,0x0055D21, 0x4C,0x80, 0x6, +0 }, + { 0x0CFF411,0x1EFF411, 0x05,0x00, 0x4, +0 }, + { 0x035D493,0x114EB11, 0x11,0x00, 0x8, +0 }, + { 0x035D453,0x116EB13, 0x11,0x0D, 0x9, +0 }, + { 0x1E31117,0x2E31114, 0x10,0x6E, 0xC, +0 }, + { 0x0E31111,0x0E31111, 0x80,0x00, 0xC, +0 }, + { 0x017A821,0x0042571, 0x23,0x00, 0xA, +0 }, + { 0x45FF811,0x0EFF310, 0x4F,0x00, 0xE, +0 }, + { 0x15FF630,0x0EFF410, 0x12,0x00, 0xF, +0 }, + { 0x00F4F2F,0x30F3F20, 0x00,0x00, 0xC, +0 }, + { 0x03FF923,0x2FF9222, 0x23,0x0A, 0xE, +0 }, + { 0x0BF9122,0x04FA123, 0x18,0x00, 0xE, +0 }, + { 0x000F80F,0x3F93410, 0x00,0x05, 0xE, +0 }, + { 0x034A121,0x0166521, 0x17,0x00, 0xC, +0 }, + { 0x0FA6848,0x04AAA01, 0x00,0x3F, 0x5, +0 }, + { 0x0FA6747,0x0FA464C, 0x00,0x00, 0x5, +0 }, + { 0x2037F21,0x1065F61, 0x18,0x00, 0x0, +0 }, + { 0x10C2EF0,0x10C21E2, 0x00,0x00, 0x4, -36 }, + { 0x70C2EF0,0x10C21E2, 0x00,0x00, 0x5, +0 }, + { 0x039A321,0x03C7461, 0x8D,0x03, 0xA, +0 }, + { 0x179A3A1,0x14C2321, 0x1C,0x00, 0xB, +0 }, + { 0x01A7521,0x00F8F21, 0x97,0x00, 0xC, +0 }, + { 0x0FFF920,0x0FFF620, 0xC0,0x00, 0x8, +0 }, + { 0x277F810,0x0AFF611, 0x44,0x00, 0x8, +0 }, + { 0x01FF933,0x0FFF810, 0x80,0x00, 0x4, +0 }, + { 0x2FFF500,0x0FFF700, 0x00,0x00, 0xC, +0 }, + { 0x0DFF712,0x0DFF811, 0x08,0x00, 0x2, +0 }, + { 0x0FFF210,0x0FFF510, 0x00,0x00, 0xC, +0 }, + { 0x1DFE920,0x0CEF400, 0x00,0x00, 0x4, +0 }, + { 0x2DFF50E,0x0AFF712, 0x00,0x00, 0xE, +0 }, + { 0x03FF800,0x1FFF410, 0x03,0x00, 0x4, +0 }, + { 0x2FFF012,0x3BF8608, 0x11,0x80, 0xE, +0 }, + { 0x0FFF20E,0x2DF9502, 0x00,0x00, 0xC, +0 }, + { 0x2DDF014,0x0FF93F0, 0x00,0x00, 0xE, +0 }, + { 0x3EFE40E,0x1EFF507, 0x0A,0x40, 0x6, +0 }, + { 0x0EFB402,0x0FF9705, 0x03,0x0A, 0xE, +0 }, + { 0x01FF66E,0x3FF945E, 0x08,0x00, 0xE, +0 }, + { 0x200F6CE,0x3FFF21A, 0x04,0x00, 0xC, +0 }, + { 0x3FFF040,0x0FEF510, 0x00,0x00, 0xC, +0 }, + { 0x38CF803,0x0BCF60C, 0x80,0x08, 0xF, +0 }, + { 0x38FF803,0x0BFF60C, 0x85,0x00, 0xF, +0 }, + { 0x04F760E,0x2CF7800, 0x40,0x08, 0xE, +0 }, + { 0x04FC80E,0x26F9903, 0x40,0x00, 0xE, +0 }, + { 0x1DF75CE,0x2EF38E1, 0x00,0x00, 0xE, +0 }, + { 0x03FF162,0x0FF4B20, 0x00,0x00, 0x8, +0 }, + { 0x0F40006,0x0FBF715, 0x3F,0x00, 0x1, +0 }, + { 0x0FF47E1,0x0FF47EA, 0x00,0x00, 0x0, +0 }, + { 0x3FFE00A,0x0FFF51E, 0x40,0x0E, 0x8, +0 }, + { 0x3FFE00A,0x0FFF21E, 0x7C,0x52, 0x8, +0 }, + { 0x04E7A0E,0x21E7B00, 0x81,0x00, 0xE, +0 }, + { 0x35FF925,0x0FFD524, 0x05,0x40, 0xE, +0 }, + { 0x08FFA01,0x0FFF802, 0x4F,0x00, 0x7, +0 }, + { 0x0FFFC00,0x0FFF520, 0x00,0x00, 0x4, +0 }, + { 0x60FF331,0x70FB135, 0x94,0xD5, 0xF, +0 }, + { 0x302B133,0x305B131, 0x63,0x00, 0xE, +0 }, + { 0x04F270C,0x0F8D104, 0x98,0x90, 0x8, +0 }, + { 0x0F8F502,0x0F8F402, 0x96,0x00, 0x9, +0 }, + { 0x759F201,0x600F701, 0x40,0x00, 0x0, +0 }, + { 0x6F0F301,0x7C9F601, 0x00,0x00, 0x0, +0 }, + { 0x60FFF15,0x66FB115, 0xC0,0x40, 0xE, +0 }, + { 0x68FB111,0x6EFB111, 0x40,0x00, 0xE, +0 }, + { 0x44FF920,0x2FF9122, 0x80,0x09, 0xE, +0 }, + { 0x7BF9121,0x64F9122, 0x99,0x00, 0xE, +0 }, + { 0x00AAFE1,0x00AAF62, 0x11,0x00, 0x9, +0 }, + { 0x022FA02,0x0F3F501, 0x4C,0x97, 0x8, +0 }, + { 0x1F3C504,0x0F7C511, 0x9D,0x00, 0x8, +0 }, + { 0x0AFC711,0x0F8F501, 0x8D,0x04, 0x8, +0 }, + { 0x098C301,0x0F8C302, 0x18,0x06, 0x9, +0 }, + { 0x40FF923,0x20F9122, 0x90,0x1B, 0xE, +0 }, + { 0x00F9121,0x00F9122, 0x9F,0x00, 0xE, +0 }, + { 0x60FFF15,0x61FB015, 0xC0,0x40, 0xE, +0 }, + { 0x65FB111,0x63FB011, 0x40,0x00, 0xE, +0 }, + { 0x60FFF35,0x60FB135, 0xC0,0x40, 0xE, +0 }, + { 0x6BFB131,0x60FB131, 0x40,0x00, 0xE, +0 }, + { 0x0C8F121,0x0C8F501, 0x13,0x29, 0x6, +0 }, + { 0x0C8F501,0x0C8F401, 0x14,0x00, 0x6, +0 }, + { 0x09AF381,0x0DFF521, 0x89,0x40, 0x6, +0 }, + { 0x0C8F121,0x0C8F701, 0x0F,0x25, 0xA, +0 }, + { 0x0C8F601,0x0C8F601, 0x12,0x00, 0xA, +0 }, + { 0x105F510,0x0C5F411, 0x41,0x00, 0x2, +0 }, + { 0x005F511,0x0C5F212, 0x01,0x1E, 0x3, +0 }, + { 0x012C1A1,0x0076F21, 0x93,0x00, 0xD, +0 }, + { 0x011DA65,0x068A663, 0x00,0x1B, 0xC, +0 }, + { 0x0588861,0x01A6561, 0x0A,0x00, 0xD, +0 }, + { 0x00FFF21,0x409CF61, 0x1D,0x05, 0xA, +0 }, + { 0x70FFF20,0x30FFF61, 0x1A,0x14, 0x0, +0 }, + { 0x00FFF61,0x609CF61, 0x1A,0x07, 0x0, +0 }, + { 0x10D5317,0x00E3608, 0x1A,0x0D, 0x2, +0 }, + { 0x03D41A1,0x01E6161, 0x9D,0x00, 0x3, +0 }, + { 0x0FC8561,0x4FD8463, 0x15,0x07, 0xA, +0 }, + { 0x0FD8966,0x6FC7761, 0x1F,0x00, 0xB, +0 }, + { 0x10A5317,0x0033608, 0x1A,0x0D, 0x2, +0 }, + { 0x0041121,0x3355261, 0x8C,0x00, 0x1, +0 }, + { 0x0C6F521,0x096F461, 0x92,0x8A, 0xC, +0 }, + { 0x266F521,0x496F5A1, 0x90,0x80, 0xD, +0 }, + { 0x035D493,0x114EB11, 0x91,0x00, 0x8, +0 }, + { 0x035D453,0x116EB13, 0x91,0x0D, 0x9, +0 }, + { 0x56FF500,0x40FF300, 0x08,0x00, 0x1, +0 }, + { 0x65FF604,0x38FF580, 0x00,0x40, 0x0, +0 }, + { 0x66FF100,0x40FF300, 0x09,0x00, 0x0, +0 }, + { 0x65FF601,0x73FF580, 0x1C,0x00, 0x0, +0 }, + { 0x00F112F,0x30F1120, 0x00,0x00, 0xE, +0 }, + { 0x00F1129,0x30F1120, 0x38,0x35, 0xF, +0 }, + { 0x024F806,0x7845603, 0x00,0x04, 0xE, +0 }, + { 0x624D803,0x784F604, 0x0B,0x00, 0xF, +0 }, + { 0x624F802,0x7845604, 0x00,0x04, 0xA, +0 }, + { 0x624D800,0x784F603, 0x0B,0x00, 0xB, +0 }, + { 0x46FF220,0x07FF400, 0x14,0x00, 0xF, +1 }, + { 0x01FF501,0x51FF487, 0x00,0xC0, 0xF, +0 }, + { 0x059F200,0x700F701, 0x00,0x00, 0xE, +0 }, + { 0x0F0F301,0x6C9F401, 0x00,0x00, 0xE, +0 }, + { 0x0F7F810,0x006F211, 0x40,0x00, 0x8, +0 }, + { 0x002F010,0x006FE00, 0x00,0x00, 0xC, +0 }, + { 0x207F70E,0x008FF12, 0x00,0x00, 0xE, +0 }, + { 0x092FF83,0x003F015, 0x00,0x00, 0xE, +0 }, + { 0x0F4C306,0x0E4C203, 0xB5,0x76, 0x4, +0 }, + { 0x0D4C101,0x0E5B111, 0x53,0x02, 0x4, +0 }, + { 0x0F3C301,0x0F3C307, 0xA1,0x70, 0xC, +12 }, + { 0x034B000,0x0F5A111, 0xCC,0x00, 0xC, +0 }, + { 0x034FB31,0x0F7C131, 0x93,0x00, 0xC, +0 }, + { 0x0DFB811,0x0F7F121, 0x97,0x8B, 0xD, +0 }, + { 0x0E4A115,0x0E4A115, 0x6A,0x67, 0xE, +0 }, + { 0x0E4A111,0x0E5A111, 0x55,0x03, 0xE, +0 }, + { 0x0E7C21A,0x0E7C201, 0x33,0x85, 0x0, +0 }, + { 0x0F4B111,0x0E4B111, 0x1D,0x83, 0x1, +0 }, + { 0x0E7C21C,0x0E6C201, 0xBD,0x8B, 0xE, +0 }, + { 0x0E4B111,0x0E5B111, 0x52,0x85, 0xF, +0 }, + { 0x050F210,0x0F0E12A, 0xA1,0x64, 0xE, +12 }, + { 0x020BD20,0x0E7C112, 0x19,0x03, 0xE, +0 }, + { 0x12A91B1,0x00AF021, 0x80,0xA1, 0x7, +12 }, + { 0x038D620,0x0B7F8A6, 0x03,0x05, 0x7, +0 }, + { 0x017F820,0x0057F31, 0x94,0x08, 0xC, +12 }, + { 0x029F623,0x00A8F22, 0x1E,0x0B, 0xD, +0 }, + { 0x00AB028,0x00AB0A1, 0x5A,0x21, 0x1, +0 }, + { 0x00A8024,0x00AB021, 0xC0,0x09, 0x1, +0 }, + { 0x00AF0A2,0x00AF024, 0x06,0xA1, 0x5, +0 }, + { 0x00AF0A4,0x00AF021, 0x0A,0x06, 0x5, +0 }, + { 0x00FFF27,0x00FFF21, 0x29,0x07, 0x0, +0 }, + { 0x00FFF21,0x00FFF22, 0x18,0x06, 0x1, +0 }, + { 0x00AFF61,0x00AFF22, 0x0E,0xA1, 0x7, +0 }, + { 0x00AFF64,0x00AFF21, 0x0A,0x0B, 0x7, +0 }, + { 0x00FFF20,0x00FFFA1, 0x22,0x88, 0xC, +12 }, + { 0x00FFF22,0x00FFFA1, 0x56,0x84, 0xD, +0 }, + { 0x0F6EA09,0x0F4F518, 0x0F,0x8C, 0x0, +0 }, + { 0x00FEFA2,0x00B8F21, 0x3E,0x07, 0x1, +0 }, + { 0x0186223,0x02A6221, 0x1C,0x87, 0xE, +0 }, + { 0x1186223,0x02A62A2, 0x19,0x82, 0xF, +0 }, + { 0x001F201,0x0F1F101, 0x21,0x1D, 0xA, +0 }, + { 0x0E3F301,0x0E6F211, 0x4B,0x00, 0xA, +0 }, + { 0x030FE10,0x0F0E13A, 0x9F,0x65, 0xE, +12 }, + { 0x020BD20,0x0E7C112, 0x8D,0x07, 0xE, +0 }, + { 0x025F5E2,0x005EF24, 0x1E,0x9F, 0xE, -12 }, + { 0x004EF26,0x006CF24, 0x9E,0x06, 0xE, +0 }, + { 0x043D227,0x0E4E215, 0x9A,0x03, 0x8, -12 }, + { 0x023A7B7,0x0E4C215, 0x19,0x08, 0x9, +0 }, + { 0x043D223,0x0E4E212, 0x98,0x03, 0x8, +0 }, + { 0x023A7B3,0x0E4C212, 0x19,0x08, 0x9, +0 }, + { 0x0E6CE22,0x0E6F421, 0x25,0x03, 0x0, +0 }, + { 0x0E6F727,0x0E5F521, 0x32,0x09, 0x1, +0 }, + { 0x006F504,0x041F001, 0x3F,0x05, 0x0, +0 }, + { 0x035D208,0x005F120, 0x00,0x06, 0x0, +0 }, + { 0x034D201,0x003F120, 0x00,0x06, 0x0, +0 }, + { 0x0276621,0x0486621, 0x1C,0x00, 0xE, +0 }, + { 0x00A6621,0x0486621, 0x94,0x00, 0xF, +0 }, + { 0x0E44100,0x0046620, 0x91,0x08, 0xC, +12 }, + { 0x0E65120,0x0066620, 0x8E,0x08, 0xD, +0 }, + { 0x0257521,0x00AAF21, 0x1A,0x08, 0xE, +0 }, + { 0x0257521,0x00AAF21, 0x1A,0x0C, 0xF, +0 }, + { 0x015A221,0x00AAF21, 0x12,0x02, 0xC, +0 }, + { 0x055F2A1,0x00AAF21, 0x28,0x05, 0xD, +0 }, + { 0x0CFF416,0x0E6F205, 0x23,0x69, 0xC, +12 }, + { 0x0D5F200,0x0ECE301, 0x15,0x00, 0xC, +0 }, + { 0x058F620,0x05AF520, 0x98,0x19, 0xE, +12 }, + { 0x009FF21,0x00CFF20, 0x24,0x00, 0xE, +0 }, + { 0x006F801,0x0D5D500, 0x17,0x17, 0x8, +12 }, + { 0x4E6F511,0x0E8F500, 0x14,0x00, 0x8, +0 }, + { 0x045FB01,0x050FF12, 0x10,0x0C, 0x0, +12 }, + { 0x034FF00,0x027F300, 0x16,0x00, 0x0, +0 }, + { 0x0EAF50C,0x0E6F21F, 0x21,0x21, 0xE, +0 }, + { 0x0F6F401,0x0E7F113, 0x15,0x03, 0xE, +0 }, + { 0x0E6F407,0x0F6A114, 0x9B,0x1D, 0xE, +0 }, + { 0x00FFF21,0x0E6F112, 0x12,0x04, 0xE, +0 }, + { 0x062F227,0x062F231, 0x26,0x18, 0xC, +0 }, + { 0x066F521,0x0E4F116, 0x0E,0x03, 0xC, +0 }, + { 0x015A221,0x0DAC401, 0x13,0x14, 0xC, +0 }, + { 0x055F221,0x0DAA401, 0x2A,0x00, 0xC, +0 }, + { 0x09CF901,0x0F98701, 0x00,0x03, 0x6, +0 }, + { 0x0ACF904,0x0F98701, 0x00,0x00, 0x7, +0 }, + { 0x025F261,0x015F2A5, 0x22,0x5E, 0xE, +0 }, + { 0x015F223,0x0C6E111, 0x5B,0x02, 0xE, +0 }, + { 0x006FF22,0x00B9F22, 0x1C,0x08, 0xE, +0 }, + { 0x005FA21,0x00B9F21, 0x19,0x07, 0xF, +0 }, + { 0x0F6D133,0x0F7F221, 0x9A,0x03, 0xC, +0 }, + { 0x0E4F22F,0x0F7F224, 0x28,0x8A, 0xD, +0 }, + { 0x03FF43A,0x04FF231, 0x64,0x5A, 0xE, +0 }, + { 0x024F211,0x085F311, 0x25,0x08, 0xE, +0 }, + { 0x026F211,0x04FF43A, 0x23,0x5F, 0xE, +0 }, + { 0x04FF231,0x0D6F211, 0x63,0x07, 0xE, +0 }, + { 0x03AA021,0x097A123, 0x23,0x21, 0xE, +12 }, + { 0x0F2A310,0x0F5A020, 0x12,0x05, 0xE, +0 }, + { 0x030F70C,0x0A8F101, 0x23,0x26, 0xA, +0 }, + { 0x0C6F201,0x043F212, 0x13,0x00, 0xA, +0 }, + { 0x054D41F,0x0F5C411, 0x65,0x42, 0xC, +0 }, + { 0x0F4B113,0x0E5A111, 0x50,0x05, 0xD, +0 }, + { 0x0AFF505,0x03DFD2C, 0x3F,0x13, 0xA, +0 }, + { 0x0B0F607,0x074F411, 0x0F,0x08, 0xA, +0 }, + { 0x022E832,0x0F5B210, 0x08,0x12, 0x2, +12 }, + { 0x021F730,0x0F5B214, 0x08,0x0D, 0x3, +0 }, + { 0x025F5E2,0x005EF24, 0x20,0x9F, 0xE, -12 }, + { 0x004EF26,0x0065F24, 0x9E,0x06, 0xE, +0 }, + { 0x004EFE2,0x005EF24, 0x24,0x21, 0xE, -12 }, + { 0x004EF26,0x0065F24, 0x9F,0x07, 0xE, +0 }, + { 0x002EFE2,0x003EF24, 0xAA,0xA1, 0xE, -12 }, + { 0x003EF26,0x0065F24, 0xA4,0x03, 0xE, +0 }, + { 0x016D122,0x0055572, 0x9A,0x06, 0xE, -12 }, + { 0x0F6C102,0x2055571, 0xD9,0x0D, 0xF, +0 }, + { 0x012F322,0x0054F22, 0x1D,0x04, 0xE, +0 }, + { 0x013F321,0x0054F22, 0x91,0x80, 0xF, +0 }, + { 0x015F322,0x0065F22, 0x1D,0x05, 0xE, +0 }, + { 0x015F321,0x0075F23, 0x91,0x80, 0xF, +0 }, + { 0x295F520,0x353F411, 0x90,0x00, 0xC, +12 }, + { 0x295F520,0x353F411, 0x90,0x09, 0xC, +12 }, + { 0x0FAF52F,0x0FAF423, 0xB2,0x64, 0xE, +0 }, + { 0x0FAE323,0x0FAF321, 0x66,0x03, 0xE, +0 }, + { 0x036D122,0x0055572, 0x9A,0x00, 0xE, -12 }, + { 0x4F6C102,0x2055574, 0xD9,0x07, 0xF, +0 }, + { 0x0D6F328,0x0F9F423, 0xA2,0x5F, 0xC, +0 }, + { 0x0F8E223,0x0E8F301, 0xA6,0x03, 0xC, +0 }, + { 0x01AD1A1,0x00A9F22, 0x2C,0x8F, 0xE, +0 }, + { 0x00A9F22,0x00A9F22, 0x0F,0x08, 0xE, +0 }, + { 0x020FE70,0x0E9C212, 0x13,0x80, 0xA, +12 }, + { 0x07FBC20,0x0E9C212, 0x11,0x05, 0xB, +0 }, + { 0x020FE10,0x0E7C212, 0x12,0x00, 0xC, +12 }, + { 0x053BD00,0x0E7C212, 0x15,0x07, 0xD, +0 }, + { 0x0E54151,0x0E8F652, 0xA9,0x63, 0xE, +0 }, + { 0x0E8D151,0x0E6C251, 0x9B,0x80, 0xE, +0 }, + { 0x0C8F621,0x0F8F821, 0x1D,0x23, 0xE, +12 }, + { 0x0F8F420,0x0F8F320, 0x20,0x00, 0xE, +0 }, + { 0x058F520,0x059F520, 0x9B,0x19, 0xE, +12 }, + { 0x089F320,0x00CFF20, 0x19,0x07, 0xE, +0 }, + { 0x061F800,0x0EAF582, 0x2B,0x15, 0xC, +12 }, + { 0x0FFF420,0x097F400, 0x1B,0x00, 0xC, +0 }, + { 0x0E54711,0x0E68511, 0x29,0x1E, 0xE, +0 }, + { 0x0E8F512,0x0E6C251, 0x5E,0x40, 0xE, +0 }, + { 0x010F101,0x0C2F101, 0x35,0x17, 0xA, +0 }, + { 0x0C4F307,0x0E3F212, 0x12,0x00, 0xA, +0 }, + { 0x0DFF63C,0x0DFF521, 0xA7,0x18, 0xE, +12 }, + { 0x0D7F220,0x0E8F320, 0x1A,0x00, 0xE, +0 }, + { 0x0A0F400,0x0A7F101, 0x05,0x26, 0xA, +12 }, + { 0x0C5F201,0x043F212, 0x12,0x00, 0xA, +0 }, + { 0x019AA2F,0x0CFF9A2, 0x00,0x1F, 0xE, +0 }, + { 0x015FAA1,0x00B7F21, 0x9F,0x06, 0xE, +0 }, + { 0x01171B1,0x1E54141, 0x8B,0x40, 0x6, +0 }, + { 0x0AE7101,0x0EE8101, 0x1E,0x00, 0xE, +0 }, + { 0x0AE7101,0x0EE8101, 0x20,0x00, 0xE, +0 }, + { 0x016D322,0x02764B2, 0x9A,0x04, 0xE, -12 }, + { 0x006C524,0x02764B2, 0x61,0x09, 0xF, +0 }, + { 0x0066231,0x0E7A241, 0x1E,0x80, 0xE, +0 }, + { 0x0AE7101,0x0EE8101, 0x1C,0x00, 0xE, +0 }, + { 0x2129A13,0x0119B91, 0x97,0x80, 0xE, +0 }, + { 0x0056F22,0x0094F31, 0x56,0x0A, 0x8, +0 }, + { 0x0056F22,0x0094FB1, 0x59,0x0C, 0x9, +0 }, + { 0x1298920,0x1268532, 0x1F,0x5F, 0x0, +12 }, + { 0x0159AA0,0x01A8D22, 0x4C,0x03, 0x0, +0 }, + { 0x007CF20,0x0E97102, 0x5B,0x00, 0xE, +0 }, + { 0x0014131,0x03B9261, 0x99,0x80, 0xE, +0 }, + { 0x0475421,0x0097F21, 0x1D,0x07, 0xE, +0 }, + { 0x0476421,0x0087F61, 0x19,0x0B, 0xF, +0 }, + { 0x0176421,0x0098F21, 0x98,0x07, 0xE, +0 }, + { 0x0176421,0x0087F61, 0x17,0x0F, 0xF, +0 }, + { 0x0296321,0x00A7F21, 0x22,0x03, 0xE, +0 }, + { 0x0186521,0x00A7F61, 0x1B,0x0D, 0xF, +0 }, + { 0x0156220,0x0E67141, 0x9A,0x00, 0xE, +12 }, + { 0x02651B1,0x0E65151, 0xDB,0x87, 0xF, +0 }, + { 0x02365A3,0x0059F21, 0x1C,0x1C, 0xE, +0 }, + { 0x003DFA1,0x00BDF21, 0x1A,0x07, 0xE, +0 }, + { 0x0014131,0x03B9261, 0x20,0x80, 0xE, +0 }, + { 0x04AF823,0x0C5D283, 0xB5,0x52, 0x8, +12 }, + { 0x0E6F414,0x0D5F280, 0x99,0x00, 0x9, +0 }, + { 0x0FAF40C,0x0F4C212, 0x37,0x2B, 0x0, +0 }, + { 0x053F685,0x0E4F191, 0x64,0x00, 0x0, +0 }, + { 0x006F600,0x0E9F51F, 0x35,0x25, 0x0, +12 }, + { 0x000F023,0x0E5F280, 0x5E,0x00, 0x0, +0 }, + { 0x0F5F50C,0x0F5F2A1, 0xA9,0x05, 0xE, +0 }, + { 0x0F6F307,0x0F6F281, 0x31,0x04, 0xF, +0 }, + { 0x0E5F14F,0x0E5C301, 0x69,0x06, 0x8, +0 }, + { 0x052F605,0x0D5F281, 0x2D,0x03, 0x9, +0 }, + { 0x0E6F482,0x03AFE00, 0x0F,0x26, 0x1, +12 }, + { 0x0F6F380,0x0F5F787, 0x03,0x10, 0x1, +0 }, + { 0x0F5FD2C,0x0F5F427, 0x8E,0x20, 0x0, +0 }, + { 0x0F4F827,0x0F5F421, 0x20,0x00, 0x0, +0 }, + { 0x097CB05,0x0D5E801, 0x9F,0x00, 0xA, +0 }, + { 0x035F705,0x0E6E401, 0x28,0x05, 0xB, +0 }, + { 0x0095FE1,0x0076FE1, 0x58,0x03, 0x0, +0 }, + { 0x054890A,0x063A726, 0x6C,0x63, 0xA, +0 }, + { 0x0094F21,0x0083F61, 0xCE,0x02, 0xA, +0 }, + { 0x00F7F04,0x0CFF5EA, 0x30,0xA9, 0x8, +0 }, + { 0x00F5F21,0x00AAF61, 0x1C,0x06, 0x8, +0 }, + { 0x0549963,0x06AA768, 0x98,0xA9, 0xE, +0 }, + { 0x0095F61,0x0097F61, 0xD1,0x03, 0xE, +0 }, + { 0x0549963,0x06AA768, 0xD4,0x5E, 0xE, +0 }, + { 0x0095F61,0x0097F61, 0xC9,0x06, 0xE, +0 }, + { 0x0B643A1,0x0B6F6A3, 0x2A,0xB0, 0xE, +0 }, + { 0x0067FA1,0x0066F61, 0x2C,0x02, 0xE, +0 }, + { 0x053F101,0x0B5F700, 0x73,0x00, 0x6, +0 }, + { 0x021A121,0x116C221, 0x92,0x40, 0x6, +0 }, + { 0x024A80F,0x005DF02, 0xB8,0x03, 0x0, -12 }, + { 0x035A70A,0x005DF02, 0xA2,0x03, 0x1, +0 }, + { 0x01379C0,0x07372D2, 0x4F,0x00, 0x6, -12 }, + { 0x013FA43,0x095F342, 0xD6,0x80, 0xA, -24 }, + { 0x020D933,0x0E4B211, 0x08,0x08, 0x6, +0 }, + { 0x02278B0,0x0E4B214, 0x06,0x0D, 0x7, +0 }, + { 0x10475A0,0x0057221, 0x12,0x40, 0x6, +0 }, + { 0x0F1F007,0x0349800, 0x00,0x00, 0xE, +0 }, + { 0x1137521,0x0B47182, 0x92,0x40, 0xA, +0 }, + { 0x6B5F100,0x6B8F100, 0xD5,0x51, 0xB, +0 }, + { 0x0F0F601,0x0E2F01C, 0x3F,0x1C, 0x8, +0 }, + { 0x003F103,0x093F0A0, 0x00,0x00, 0x8, +0 }, + { 0x0F00010,0x0F00000, 0x3F,0x3F, 0x0, +0 }, + { 0x025C5A2,0x005EF24, 0x20,0x9F, 0xE, -12 }, + { 0x004EF26,0x0068F24, 0x9C,0x02, 0xE, +0 }, + { 0x0064131,0x03892A1, 0x1C,0x80, 0xE, +0 }, + { 0x0064131,0x02882A1, 0x1B,0x80, 0xF, +0 }, + { 0x0156220,0x0267321, 0x98,0x00, 0xE, +12 }, + { 0x02651B1,0x0265171, 0xD1,0x00, 0xF, +0 }, + { 0x0766321,0x0167CA1, 0x93,0x00, 0xC, +0 }, + { 0x1168321,0x0269CA1, 0x4D,0x00, 0xD, +0 }, + { 0x163F401,0x174F111, 0x12,0x00, 0xA, +0 }, + { 0x201F130,0x083F001, 0x44,0x83, 0xA, +0 }, + { 0x0117171,0x11542A1, 0x8B,0x40, 0x6, +0 }, + { 0x0667150,0x08B5290, 0x92,0x00, 0xE, +0 }, + { 0x054F606,0x0B3F241, 0x73,0x03, 0x0, +0 }, + { 0x0177421,0x0176562, 0x83,0x8D, 0x7, +0 }, + { 0x0031801,0x090F674, 0x80,0xC1, 0xE, +0 }, + { 0x282B264,0x1DA9803, 0x00,0x93, 0xE, +0 }, + { 0x0A0B264,0x1D69603, 0x02,0x80, 0xE, +0 }, + { 0x053F101,0x074F111, 0x4B,0x00, 0x6, +0 }, + { 0x0117F27,0x0441122, 0x0E,0x00, 0xE, +0 }, + { 0x0111122,0x0121123, 0x15,0x00, 0x4, +0 }, + { 0x053F101,0x074F111, 0x59,0x00, 0x6, +0 }, + { 0x0FFF691,0x0F4F511, 0x00,0x00, 0x8, +0 }, + { 0x3087631,0x00F6531, 0x08,0x00, 0x2, +0 }, + { 0x019D083,0x017F002, 0x5D,0x80, 0xA, +0 }, + { 0x019D083,0x017F002, 0x58,0x80, 0xA, +0 }, + { 0x013F6A6,0x005F1B1, 0xE5,0x40, 0x2, +0 }, + { 0x1239722,0x013457A, 0x44,0x00, 0x4, +0 }, + { 0x1239721,0x0134572, 0x8A,0x80, 0x2, +0 }, + { 0x0FFF4F1,0x06FF2F1, 0x02,0x00, 0x0, +0 }, + { 0x00F3FF1,0x06FF2F1, 0x02,0x00, 0x0, +0 }, + { 0x1E26301,0x01EB821, 0x16,0x00, 0x8, +0 }, + { 0x1226341,0x01E8821, 0x8F,0x00, 0x8, +0 }, + { 0x0024471,0x01E8831, 0x9D,0x00, 0xE, +0 }, + { 0x002A434,0x0427575, 0x54,0x40, 0x8, +0 }, + { 0x256F605,0x2047404, 0xC0,0x00, 0xE, +0 }, + { 0x0FFF09E,0x00F3F00, 0x07,0x00, 0xE, +0 }, + { 0x1217131,0x0066222, 0x40,0x40, 0x2, +0 }, + { 0x131F231,0x0066F21, 0x47,0x00, 0x0, +0 }, + { 0x0035131,0x06764A1, 0x1C,0x80, 0xE, +0 }, + { 0x0115270,0x0FE4171, 0xC5,0x40, 0x0, +0 }, + { 0x1218131,0x0167423, 0x4D,0x40, 0x2, +0 }, + { 0x151D203,0x278F301, 0x1D,0x00, 0xA, +0 }, + { 0x0F0F09E,0x063F300, 0x07,0x00, 0xE, +0 }, + { 0x0F7B096,0x00FFFE0, 0x00,0x00, 0x0, +0 }, + { 0x3199B85,0x0297424, 0x49,0x00, 0x6, +0 }, + { 0x0FFA691,0x0F45511, 0x00,0x00, 0x8, +0 }, + { 0x1226341,0x000A821, 0x8F,0x00, 0x8, +0 }, + { 0x1239721,0x0136572, 0x8A,0x80, 0x2, +0 }, + { 0x061F217,0x074F212, 0x6C,0x00, 0x8, +0 }, + { 0x1239721,0x0138572, 0x8A,0x80, 0x2, +0 }, + { 0x00D5131,0x01F7221, 0x1C,0x80, 0xC, +0 }, + { 0x08C6320,0x02F9520, 0x19,0x80, 0xC, +0 }, + { 0x1F5E510,0x162E231, 0x46,0x00, 0x0, +0 }, + { 0x24FF60E,0x318F700, 0x40,0x00, 0xE, +0 }, + { 0x0C8F60C,0x257FF12, 0xC0,0x00, 0xA, +0 }, + { 0x354B506,0x095D507, 0x00,0xC0, 0x0, +0 }, + { 0x0F0E02A,0x031FF1E, 0x52,0x54, 0x8, +0 }, + { 0x0745451,0x0756591, 0x00,0x00, 0xA, +0 }, + { 0x002A414,0x0427555, 0x54,0x40, 0x8, +0 }, + { 0x0115F31,0x11E3132, 0xC5,0x00, 0x8, +0 }, + { 0x1217131,0x0069222, 0x40,0x40, 0x2, +0 }, + { 0x053F101,0x0B5F704, 0x4F,0x00, 0x7, +0 }, + { 0x04FF60E,0x218F700, 0x40,0x00, 0xE, +0 }, + { 0x0297721,0x00B9721, 0x89,0x80, 0x6, +0 }, + { 0x12DC331,0x00F7861, 0x8A,0x00, 0xA, +0 }, + { 0x07A6161,0x00AC121, 0x99,0x80, 0x4, +0 }, + { 0x07A6161,0x00AC121, 0x9A,0x80, 0x4, +0 }, + { 0x04CA900,0x04FF600, 0x07,0x00, 0xA, +0 }, + { 0x075F80F,0x2B78A03, 0x80,0x00, 0xE, +0 }, + { 0x059A490,0x4C86590, 0x0B,0x00, 0xE, +0 }, + { 0x055A210,0x4766600, 0x0A,0x00, 0xE, +0 }, + { 0x059FA00,0x09AF500, 0x05,0x00, 0x6, +0 }, + { 0x02661B1,0x0266171, 0xD3,0x80, 0xD, +12 }, + { 0x035C100,0x0D5C111, 0x9B,0x00, 0xC, +12 }, + { 0x040B230,0x5E9F111, 0xA2,0x80, 0x4, +12 }, + { 0x0E6F314,0x0E6F280, 0x62,0x00, 0xB, +12 }, + { 0x715FE11,0x019F487, 0x20,0xC0, 0xB, +1 }, + { 0x7112EF0,0x11621E2, 0x00,0xC0, 0x9, -36 }, + { 0x00CF600,0x00CF600, 0x00,0x00, 0x1, +0 }, + { 0x001FF26,0x3751304, 0x00,0x00, 0xE, +0 }, + { 0x0E5F108,0x0E5C302, 0x66,0x86, 0x8, +5 }, + { 0x052F605,0x0D5F582, 0x69,0x47, 0x9, +5 }, + { 0x6E5E403,0x7E7F507, 0x0D,0x11, 0xB, +12 }, + { 0x366F500,0x4A8F604, 0x1B,0x15, 0xA, +12 }, + { 0x053F101,0x065D131, 0x4E,0x0C, 0x6, +0 }, + { 0x014F201,0x097F201, 0x22,0x08, 0xE, +0 }, + { 0x050F101,0x07CD301, 0x4F,0x10, 0x6, +0 }, + { 0x001F141,0x188D251, 0x4E,0x0A, 0x4, +0 }, + { 0x134A401,0x0A6C301, 0x0A,0x09, 0x9, +0 }, + { 0x103A361,0x022C411, 0x28,0x05, 0xC, +0 }, + { 0x010C733,0x033D311, 0x84,0x8A, 0x8, +0 }, + { 0x0188232,0x0076061, 0x1C,0x91, 0xC, +0 }, + { 0x0100132,0x0337212, 0x80,0x8F, 0x8, +0 }, + { 0x055F587,0x054F022, 0x91,0x13, 0x6, +0 }, + { 0x013F218,0x0E3C1E1, 0x4D,0x15, 0x8, +0 }, + { 0x043FA07,0x045F341, 0x51,0x11, 0x6, +0 }, + { 0x025DA05,0x015F901, 0x4E,0x0C, 0xA, +0 }, + { 0x0F0FE04,0x0B5F6C2, 0x00,0x0C, 0xE, +0 }, + { 0x032B6B3,0x031D190, 0x4A,0x0E, 0xE, +0 }, + { 0x011F111,0x0B3F101, 0x8A,0x4F, 0x6, +0 }, + { 0x10FFF22,0x00FFF21, 0x8D,0x87, 0x1, +0 }, + { 0x0B5F708,0x0CFD001, 0x07,0x11, 0x1, +0 }, + { 0x107E465,0x078F241, 0xD7,0x8C, 0x0, +0 }, + { 0x11F4001,0x11F8002, 0x42,0x0B, 0xB, +0 }, + { 0x0038121,0x00C6171, 0x12,0x92, 0x8, +0 }, + { 0x00BD224,0x00B5231, 0x4F,0x16, 0xE, +0 }, + { 0x243A321,0x022C411, 0x11,0x00, 0xD, +0 }, + { 0x143F401,0x074F111, 0x49,0x11, 0x4, +0 }, + { 0x133FF01,0x077F111, 0x80,0x17, 0xA, +0 }, + { 0x249A320,0x039C411, 0x0A,0x0C, 0xD, +0 }, + { 0x1E7C271,0x018F131, 0x09,0x13, 0x6, +0 }, + { 0x01FF201,0x047F701, 0x16,0x0D, 0xA, +0 }, + { 0x10BB021,0x057E221, 0x08,0x14, 0x4, +0 }, + { 0x010F631,0x016E233, 0x02,0x1A, 0x8, +0 }, + { 0x267AA01,0x013C603, 0x17,0x80, 0x8, +0 }, + { 0x1539321,0x08AC311, 0x1B,0x0B, 0x0, +0 }, + { 0x07BE001,0x098E212, 0x4E,0x12, 0x6, +0 }, + { 0x126F531,0x0C8E111, 0x49,0x0F, 0x4, +0 }, + { 0x023F221,0x0D6B212, 0x1C,0x0D, 0x4, +0 }, + { 0x0B8F413,0x0DBF111, 0x13,0x18, 0x2, +0 }, + { 0x147D621,0x00BF431, 0x88,0x8E, 0x8, +0 }, + { 0x175A501,0x0A48251, 0x86,0x16, 0x8, +0 }, + { 0x019D531,0x08B8352, 0x89,0x91, 0xA, +0 }, + { 0x0035171,0x0175421, 0x1C,0x0D, 0xE, +0 }, + { 0x0155471,0x0495321, 0x1C,0x11, 0xE, +0 }, + { 0x0035171,0x0175461, 0x56,0x10, 0xE, +0 }, + { 0x0035171,0x0175421, 0x1C,0x0C, 0xE, +0 }, + { 0x10351F1,0x01754A1, 0x16,0x0D, 0xC, +0 }, + { 0x0038171,0x017B601, 0x0E,0x0E, 0x8, +0 }, + { 0x075F502,0x0F3F201, 0x2A,0x8B, 0x0, +0 }, + { 0x117ED40,0x069C541, 0x80,0x89, 0x2, +0 }, + { 0x1DAD0A1,0x1D69012, 0x17,0x0D, 0xC, +0 }, + { 0x1DAD0A1,0x0D69012, 0x11,0x16, 0xA, +0 }, + { 0x1DAD061,0x1D69012, 0x11,0x11, 0xA, +0 }, + { 0x2DAD021,0x1D69091, 0x11,0x11, 0xA, +0 }, + { 0x207F0A0,0x03C7222, 0x17,0x16, 0xC, +0 }, + { 0x307F020,0x00C7022, 0x1A,0x16, 0x8, +0 }, + { 0x3078020,0x00C7022, 0x32,0x12, 0xE, +0 }, + { 0x20B73A1,0x246A500, 0x13,0x09, 0x8, +0 }, + { 0x00753B1,0x067D061, 0x19,0x13, 0xC, +0 }, + { 0x0064131,0x036A061, 0x1F,0x0F, 0xC, +0 }, + { 0x0586361,0x018A021, 0x19,0x12, 0xC, +0 }, + { 0x05A6321,0x01A7A21, 0x9F,0x80, 0xC, +0 }, + { 0x0577261,0x017A021, 0x19,0x12, 0xC, +0 }, + { 0x0777261,0x017A021, 0x15,0x14, 0xC, +0 }, + { 0x0577361,0x017A021, 0x19,0x13, 0xE, +0 }, + { 0x00A6331,0x00B63A1, 0x16,0x12, 0xC, +0 }, + { 0x00E7321,0x00E6361, 0x0E,0x15, 0x8, +0 }, + { 0x00A6331,0x00B6321, 0x13,0x14, 0xA, +0 }, + { 0x0178E71,0x00E8B22, 0xC3,0x13, 0x2, +0 }, + { 0x01B5132,0x0389261, 0x9A,0x89, 0xC, +0 }, + { 0x06FF4A1,0x01D53A1, 0x27,0x8A, 0xA, +0 }, + { 0x24369C1,0x00DBD21, 0x1C,0x0C, 0x0, +0 }, + { 0x0537901,0x20DBD21, 0x0D,0x0D, 0x6, +0 }, + { 0x0F0F530,0x09BF034, 0x35,0x13, 0x2, +0 }, + { 0x0F0F530,0x09BF032, 0x35,0x10, 0x2, +0 }, + { 0x047F021,0x078F012, 0x1B,0x16, 0xE, +0 }, + { 0x0FFF001,0x088F202, 0x0B,0x17, 0x8, +0 }, + { 0x25368C1,0x10DBD61, 0x14,0x0C, 0x0, +0 }, + { 0x014F6A1,0x0EAF102, 0x09,0x19, 0x2, +0 }, + { 0x02811A1,0x0187121, 0x20,0x11, 0xC, +0 }, + { 0x047F121,0x078D012, 0x11,0x19, 0xA, +0 }, + { 0x232B583,0x035D221, 0x52,0x14, 0x0, +0 }, + { 0x1137323,0x0229331, 0x1C,0x14, 0xC, +0 }, + { 0x0BF1182,0x38C9301, 0x10,0x16, 0xF, +0 }, + { 0x1E884A1,0x0487061, 0x19,0x95, 0x4, +0 }, + { 0x357B260,0x13C9022, 0x0E,0x91, 0x8, +0 }, + { 0x3679400,0x056B191, 0x4E,0x0E, 0xC, +0 }, + { 0x23AACA3,0x0BAC301, 0x18,0x12, 0x8, +0 }, + { 0x068C2A1,0x04872A1, 0x20,0x0D, 0xE, +0 }, + { 0x23A9CA3,0x04A9241, 0x17,0x95, 0x8, +0 }, + { 0x1A3C282,0x1F6E201, 0x18,0x11, 0x8, +0 }, + { 0x3C3A621,0x144E311, 0x14,0x0C, 0xA, +0 }, + { 0x243F702,0x027DC01, 0x18,0x00, 0x8, +0 }, + { 0x001A021,0x0612102, 0x02,0x18, 0xE, +0 }, + { 0x24C5803,0x11FF315, 0x00,0x00, 0x1, +0 }, + { 0x049C441,0x026F741, 0x08,0x03, 0xE, +0 }, + { 0x038FA00,0x07BF701, 0x06,0x00, 0x0, +0 }, + { 0x20A60E0,0x228F00E, 0x1D,0x00, 0xC, +0 }, + { 0x10A60E0,0x228F00E, 0x1D,0x00, 0x2, +0 }, + { 0x227F0F0,0x017F6C1, 0x0B,0x00, 0xE, +0 }, + { 0x05CA800,0x07FD600, 0x0F,0x00, 0x8, +0 }, + { 0x218F201,0x06BE601, 0x09,0x04, 0xC, +0 }, + { 0x246A321,0x026C511, 0x06,0x04, 0xE, +0 }, + { 0x248A721,0x006C801, 0x0A,0x04, 0x0, +0 }, + { 0x047A34F,0x138B703, 0x03,0x00, 0x2, +0 }, + { 0x248A721,0x015C801, 0x0A,0x04, 0x0, +0 }, + { 0x017A30E,0x119B602, 0x03,0x00, 0x8, +0 }, + { 0x248A721,0x015C801, 0x0A,0x07, 0x0, +0 }, + { 0x286F30D,0x148E404, 0x07,0x03, 0xA, +0 }, + { 0x248A721,0x025C801, 0x0C,0x07, 0x8, +0 }, + { 0x473A128,0x264A329, 0x07,0x00, 0x2, +0 }, + { 0x344F427,0x254F526, 0x09,0x00, 0xC, +0 }, + { 0x15B8308,0x32AC60A, 0x11,0x00, 0xA, +0 }, + { 0x473A048,0x264A329, 0x0D,0x00, 0x4, +0 }, + { 0x052F221,0x073D231, 0x4F,0x00, 0x6, +0 }, + { 0x050F201,0x076D201, 0x4B,0x03, 0x6, +0 }, + { 0x0F9F131,0x0F9F331, 0x8E,0x80, 0xA, +0 }, + { 0x0F9F131,0x0F9F332, 0x8E,0x81, 0xA, +0 }, + { 0x061F216,0x074F211, 0x4F,0x0A, 0x8, +0 }, + { 0x0617216,0x0B2F311, 0x4F,0x08, 0x8, +0 }, + { 0x212AA93,0x021AC91, 0x97,0x00, 0xE, +0 }, + { 0x016DA85,0x005F981, 0x4D,0x80, 0xA, +0 }, + { 0x065FE05,0x085F8C4, 0x05,0x00, 0xE, +0 }, + { 0x096F527,0x057F521, 0x1F,0x03, 0x8, +0 }, + { 0x053F103,0x074F217, 0x4F,0x0B, 0x6, +0 }, + { 0x00FFF64,0x00FFF21, 0x86,0x80, 0x1, +0 }, + { 0x20BD8F0,0x10BB3F2, 0x93,0x07, 0xA, +0 }, + { 0x4069FB2,0x10F95B0, 0x43,0x00, 0x9, +0 }, + { 0x0FFF001,0x00F9033, 0x4F,0x05, 0x6, +0 }, + { 0x10BF224,0x00B5231, 0x4F,0x10, 0xE, +0 }, + { 0x0035121,0x06742A2, 0x15,0x80, 0xA, +0 }, + { 0x0AFF5E1,0x10FF4E1, 0xD0,0x00, 0xC, +0 }, + { 0x001FF11,0x003FF11, 0x8D,0x80, 0x0, +0 }, + { 0x031F121,0x044F406, 0x40,0x85, 0x0, +0 }, + { 0x0BF73C8,0x09FF4C4, 0x12,0x03, 0x8, +0 }, + { 0x0B69402,0x0268301, 0x00,0x00, 0x1, +0 }, + { 0x0EEC101,0x0DEF302, 0x62,0x00, 0xA, +0 }, + { 0x0EFF231,0x078F522, 0x1E,0x00, 0xE, +0 }, + { 0x1B57431,0x0B8D423, 0x0B,0x00, 0x8, +0 }, + { 0x2035130,0x24753A0, 0x1C,0x00, 0xE, +0 }, + { 0x3115230,0x1254131, 0xD0,0x80, 0x0, +0 }, + { 0x11152B1,0x1FE41B2, 0xC5,0x80, 0x0, +0 }, + { 0x07572C1,0x1FE61C1, 0xCA,0x80, 0x6, +0 }, + { 0x0A7F131,0x0C6F731, 0x50,0x80, 0xE, +0 }, + { 0x171F502,0x083F211, 0x60,0x40, 0xE, +0 }, + { 0x2005130,0x2655420, 0x1C,0x00, 0xE, +0 }, + { 0x01151B1,0x1154261, 0x8B,0x40, 0x6, +0 }, + { 0x1817021,0x12C7322, 0x16,0x07, 0xC, +0 }, + { 0x0537141,0x07C62C2, 0x4F,0x40, 0xA, +0 }, + { 0x173F141,0x074F241, 0x4F,0x10, 0x6, +0 }, + { 0x10691C1,0x20562C1, 0x0F,0x00, 0xC, +0 }, + { 0x00B4131,0x03B9261, 0x1C,0x80, 0xE, +0 }, + { 0x0655201,0x0767301, 0x1D,0x00, 0xE, +0 }, + { 0x0AE71E1,0x09E81E2, 0x15,0x0A, 0xC, +0 }, + { 0x029BB21,0x00A9021, 0x8E,0x80, 0x8, +0 }, + { 0x0AE71E1,0x09E81E1, 0x16,0x0A, 0xA, +0 }, + { 0x2AE71E0,0x19E80E2, 0x23,0x00, 0xA, +0 }, + { 0x0687121,0x05E5232, 0x4E,0x00, 0xA, +0 }, + { 0x05B7111,0x07B5212, 0x56,0x00, 0xE, +0 }, + { 0x009F021,0x00A9024, 0x94,0x05, 0xA, +0 }, + { 0x0176EB1,0x00E8BA1, 0xC5,0x80, 0x2, +0 }, + { 0x02495A1,0x02A60A1, 0x1D,0x85, 0x2, +0 }, + { 0x0195132,0x0396061, 0x9A,0x8B, 0xC, +0 }, + { 0x030F5A2,0x03A61A1, 0x12,0x8B, 0x2, +0 }, + { 0x00457E2,0x0775761, 0x6D,0x00, 0xE, +0 }, + { 0x0C70CF1,0x0A560F1, 0x9A,0x80, 0xD, +0 }, + { 0x0537102,0x07C5211, 0x4F,0x05, 0xA, +0 }, + { 0x007F804,0x0748201, 0x08,0x05, 0x8, +0 }, + { 0x04FF660,0x00F7660, 0x03,0x04, 0x2, +0 }, + { 0x33457F1,0x00D67E1, 0x28,0x04, 0xE, +0 }, + { 0x0F55551,0x0F55501, 0x80,0x00, 0x8, +0 }, + { 0x0339661,0x02B5521, 0x00,0x02, 0x6, +0 }, + { 0x0F2F251,0x2F2F241, 0x0D,0x00, 0xA, +0 }, + { 0x091A311,0x094C503, 0x80,0x80, 0x6, +0 }, + { 0x145F171,0x044F423, 0x00,0x00, 0x5, +0 }, + { 0x251B1E0,0x275E0F0, 0x16,0x03, 0x0, +0 }, + { 0x102FF51,0x002FF01, 0x03,0x08, 0x4, +0 }, + { 0x11122F1,0x02E31F1, 0x46,0x80, 0xC, +0 }, + { 0x0FFF101,0x0FF5011, 0x0D,0x80, 0x6, +0 }, + { 0x0FF1000,0x0FF5011, 0x12,0x80, 0xA, +0 }, + { 0x002A4B4,0x04245F5, 0x87,0x80, 0x6, +0 }, + { 0x01111F1,0x01111F1, 0x41,0x41, 0x2, +0 }, + { 0x002A4B4,0x04245F7, 0x87,0x80, 0x6, +0 }, + { 0x1007861,0x247A260, 0x54,0x03, 0x6, +0 }, + { 0x0417F21,0x0213521, 0x56,0x00, 0xE, +0 }, + { 0x301F171,0x001F131, 0x00,0x40, 0x4, +0 }, + { 0x053F101,0x074F219, 0x4F,0x00, 0x6, +0 }, + { 0x01FF201,0x088F508, 0x11,0x00, 0x8, +0 }, + { 0x1176E31,0x20C8B22, 0x43,0x05, 0x2, +0 }, + { 0x1037531,0x0445462, 0x1C,0x00, 0xE, +0 }, + { 0x0427880,0x0548595, 0x4D,0x00, 0xE, +0 }, + { 0x072F107,0x004FC08, 0x48,0x80, 0x0, +0 }, + { 0x0FFF835,0x075F511, 0x44,0x00, 0xE, +0 }, + { 0x1068F02,0x005FF00, 0xC0,0x00, 0xA, +0 }, + { 0x0ECA710,0x0F5D510, 0x0B,0x08, 0x0, +0 }, + { 0x10B5F01,0x10B5F01, 0x80,0x80, 0x4, +0 }, + { 0x2056651,0x0066642, 0x00,0x05, 0x0, +0 }, + { 0x000200E,0x001210E, 0x00,0x00, 0xE, +0 }, + { 0x08785F4,0x09974F3, 0x50,0x80, 0xC, +0 }, + { 0x050F102,0x076D201, 0x50,0x0E, 0x6, +0 }, + { 0x050F101,0x076D201, 0x4B,0x0E, 0x6, +0 }, + { 0x050F113,0x076D201, 0x50,0x0E, 0x6, +0 }, + { 0x011FF32,0x013FF01, 0x92,0x8B, 0xA, +0 }, + { 0x010FF34,0x004FF03, 0x92,0x0B, 0xA, +0 }, + { 0x000F153,0x086D251, 0x4E,0x11, 0x6, +0 }, + { 0x0E5F828,0x0FFC021, 0xCF,0x0B, 0x0, +0 }, + { 0x0E5F8E2,0x00EC0E1, 0xCA,0x0B, 0x8, +0 }, + { 0x0FFF92C,0x0FFC0A1, 0xD4,0x0B, 0x0, +0 }, + { 0x0E5F82B,0x0FFC021, 0xCA,0x0B, 0x0, +0 }, + { 0x091F029,0x086E021, 0xCD,0x0B, 0x2, +0 }, + { 0x001F024,0x086E021, 0xD0,0x0B, 0x2, +0 }, + { 0x001F023,0x086E021, 0xC8,0x0B, 0x2, +0 }, + { 0x001B064,0x086F061, 0xC9,0x0B, 0x2, +0 }, + { 0x010A133,0x0237215, 0x85,0x8B, 0x8, +0 }, + { 0x010A131,0x0337315, 0x85,0x8B, 0x8, +0 }, + { 0x030A131,0x074C216, 0x81,0x8B, 0x8, +0 }, + { 0x07BF003,0x07BF402, 0x8A,0x8B, 0x8, +0 }, + { 0x07BF003,0x07BF401, 0x8A,0x80, 0x8, +0 }, + { 0x07BF223,0x07BF401, 0x8A,0x80, 0x8, +0 }, + { 0x0100132,0x0337212, 0x80,0x8B, 0x8, +0 }, + { 0x0100132,0x0337314, 0x80,0x8B, 0x8, +0 }, + { 0x08E7331,0x09E8021, 0x16,0x0B, 0xE, +0 }, + { 0x07E7330,0x09E8021, 0x16,0x0B, 0xE, +0 }, + { 0x0733331,0x097A021, 0x94,0x00, 0xE, +0 }, + { 0x073D331,0x097A021, 0x94,0x0C, 0xE, +0 }, + { 0x053F131,0x027F232, 0x45,0x0B, 0x6, +0 }, + { 0x001F213,0x0B6F215, 0x0C,0x18, 0x8, +0 }, + { 0x001F211,0x0B6F211, 0x0C,0x0B, 0x8, +0 }, + { 0x004FE11,0x0BDF211, 0x0A,0x0B, 0x8, +0 }, + { 0x011CA53,0x0F171E1, 0x4D,0x13, 0x2, +0 }, + { 0x011BA12,0x03124F1, 0x40,0x0C, 0x2, +0 }, + { 0x08E7261,0x01A50E1, 0xA7,0x8B, 0x2, +0 }, + { 0x0133218,0x0E351E1, 0x4D,0x0C, 0x8, +0 }, + { 0x0411217,0x0311331, 0xC0,0x8B, 0x6, +0 }, + { 0x055F503,0x033F321, 0x8F,0x8B, 0x0, +0 }, + { 0x011FA13,0x0F1F1E1, 0x4D,0x0C, 0x8, +0 }, + { 0x0154011,0x0F8A1F1, 0x43,0x0C, 0x8, +0 }, + { 0x0978211,0x0F2F0E4, 0x03,0x4C, 0x8, +0 }, + { 0x053D105,0x0715114, 0x40,0x0B, 0x6, +0 }, + { 0x01727F1,0x0185120, 0x01,0x0B, 0xC, +0 }, + { 0x01132F1,0x013F1E1, 0x18,0x0B, 0x0, +0 }, + { 0x053F173,0x006F171, 0x48,0x17, 0x8, +0 }, + { 0x0117171,0x0157261, 0x8D,0x4B, 0x6, +0 }, + { 0x061F2D7,0x0B2F1D2, 0x4F,0x0B, 0x8, +0 }, + { 0x0FFF001,0x0F8F001, 0x11,0x0B, 0xA, +0 }, + { 0x0114131,0x0132261, 0x8B,0x0B, 0x6, +0 }, + { 0x021FF31,0x0154461, 0x8B,0x0B, 0xA, +0 }, + { 0x0114131,0x0153261, 0x8B,0x0B, 0x2, +0 }, + { 0x013FD71,0x0D6E721, 0x1C,0x0B, 0xE, +0 }, + { 0x0035171,0x0675421, 0x1C,0x0B, 0xE, +0 }, + { 0x0035171,0x0175421, 0x1C,0x0B, 0xE, +0 }, + { 0x0155471,0x0495321, 0x1C,0x0B, 0xE, +0 }, + { 0x0035171,0x0175461, 0x56,0x0B, 0xE, +0 }, + { 0x075F502,0x0F3F201, 0x29,0x8B, 0x0, +0 }, + { 0x075F002,0x033F401, 0x29,0x8B, 0x0, +0 }, + { 0x053F101,0x074F111, 0x49,0x0B, 0x6, +0 }, + { 0x053F101,0x074F111, 0x89,0x0B, 0x6, +0 }, + { 0x053F102,0x074F111, 0x89,0x0B, 0x6, +0 }, + { 0x053F102,0x074F111, 0x80,0x0B, 0x6, +0 }, + { 0x053F101,0x053F108, 0x40,0x4B, 0x0, +0 }, + { 0x02CD321,0x02CC321, 0x15,0x8B, 0xA, +0 }, + { 0x0F2D401,0x08AC421, 0x18,0x8B, 0xA, +0 }, + { 0x07BF001,0x0C8F411, 0x4E,0x0B, 0x4, +0 }, + { 0x0ABF001,0x0ABF311, 0x44,0x0B, 0x4, +0 }, + { 0x0C8F453,0x0BBF111, 0x0E,0x0B, 0x4, +0 }, + { 0x0C8F253,0x0C5F211, 0x0B,0x0B, 0x4, +0 }, + { 0x04CB421,0x0AC9421, 0x15,0x0B, 0xA, +0 }, + { 0x01C9421,0x0AC6421, 0x15,0x0B, 0xA, +0 }, + { 0x08F7721,0x02A60A1, 0x16,0x8B, 0x6, +0 }, + { 0x0BF7721,0x02A60A1, 0x19,0x8B, 0x6, +0 }, + { 0x0AFD6A1,0x02A60E2, 0x13,0x8B, 0x2, +0 }, + { 0x02495A2,0x02A60E2, 0x1D,0x8B, 0x2, +0 }, + { 0x130F4A4,0x02A60E1, 0x12,0x8B, 0xA, +0 }, + { 0x00E6321,0x00E6321, 0x16,0x0B, 0xC, +0 }, + { 0x00A6331,0x00B6321, 0x16,0x0B, 0xC, +0 }, + { 0x00A6321,0x00B6321, 0x1B,0x0B, 0xC, +0 }, + { 0x00A6320,0x00B6321, 0x1B,0x0B, 0xC, +0 }, + { 0x0188232,0x0076061, 0x1C,0x8B, 0xC, +0 }, + { 0x0145132,0x03662E1, 0x18,0x8B, 0xC, +0 }, + { 0x0178731,0x00E8B22, 0xC3,0x0B, 0x2, +0 }, + { 0x0178E71,0x00E8B22, 0xC3,0x0F, 0x2, +0 }, + { 0x0176E70,0x00E6B22, 0x8D,0x0B, 0x2, +0 }, + { 0x006F224,0x0065231, 0x4F,0x0B, 0xE, +0 }, + { 0x0076431,0x067D061, 0x1B,0x0B, 0xE, +0 }, + { 0x0066131,0x036D261, 0x1B,0x0B, 0xC, +0 }, + { 0x0063131,0x0365061, 0x1F,0x0B, 0xC, +0 }, + { 0x0064131,0x036A061, 0x1F,0x0B, 0xC, +0 }, + { 0x0565321,0x016A021, 0x9A,0x8B, 0xE, +0 }, + { 0x0585361,0x018A021, 0x19,0x0B, 0xC, +0 }, + { 0x0577361,0x017A021, 0x19,0x0B, 0xC, +0 }, + { 0x0A67121,0x096A121, 0x1B,0x0B, 0xE, +0 }, + { 0x044F585,0x045F0A1, 0x91,0x0B, 0x6, +0 }, + { 0x033F507,0x025F061, 0x51,0x0B, 0x6, +0 }, + { 0x021FF13,0x003FF11, 0x8C,0x80, 0xE, +0 }, + { 0x00DF338,0x033F5B1, 0x8C,0x40, 0xE, +0 }, + { 0x055F587,0x054F022, 0x91,0x0B, 0x6, +0 }, + { 0x032B6B3,0x031D190, 0x4A,0x0B, 0xE, +0 }, + { 0x0F0FEC4,0x0B5F6C2, 0x0E,0x12, 0x0, +0 }, + { 0x015DA05,0x013F001, 0x4E,0x80, 0xA, +0 }, + { 0x09AF231,0x027F032, 0x44,0x0B, 0x6, +0 }, + { 0x002A4B0,0x04240D7, 0xC4,0x8B, 0x0, +0 }, + { 0x0F0F0CA,0x06259CC, 0x84,0x0B, 0xC, +0 }, + { 0x0F0F530,0x09BF035, 0x35,0x0B, 0x2, +0 }, + { 0x002A4B4,0x04240D7, 0x87,0x8B, 0x6, +0 }, + { 0x0530907,0x094F605, 0x40,0x0B, 0xE, +0 }, + { 0x025DA09,0x015F101, 0x4E,0x0B, 0xA, +0 }, + { 0x0A0F406,0x046F600, 0x00,0x0B, 0xE, +0 }, + { 0x0F0F007,0x0DC5C00, 0x00,0x0B, 0xE, +0 }, + { 0x0FFF832,0x07FF511, 0x44,0x0B, 0xE, +0 }, + { 0x0FFF832,0x07FF511, 0x44,0x0E, 0xE, +0 }, + { 0x0FFF832,0x07FF511, 0x44,0x10, 0xE, +0 }, + { 0x0530900,0x094F702, 0x40,0x00, 0xE, +0 }, + { 0x0A8F211,0x0A8A001, 0x86,0x8B, 0x8, +0 }, + { 0x070F200,0x072F213, 0x50,0x0B, 0xE, +0 }, + { 0x01111F0,0x01111E0, 0x00,0xCB, 0xE, +0 }, + { 0x060F207,0x072F212, 0x4F,0x0B, 0x8, +0 }, + { 0x04FA800,0x04FD600, 0x0B,0x00, 0x0, +0 }, + { 0x0BFF80C,0x04FD600, 0x00,0x00, 0x1, +0 }, + { 0x0BFF704,0x04FD600, 0x00,0x00, 0x1, +0 }, + { 0x0BFF501,0x04FD600, 0x00,0x00, 0x1, +0 }, + { 0x0BFF701,0x00F10DE, 0x00,0x00, 0x1, +0 }, + { 0x0045617,0x004F601, 0x21,0x00, 0x2, +12 }, + { 0x0790825,0x0E6E385, 0x9A,0x5B, 0xA, +0 }, + { 0x0E6F315,0x0E6F281, 0x62,0x00, 0xB, +0 }, + { 0x055F71C,0x0D88520, 0xA3,0x0D, 0x6, +12 }, + { 0x002B025,0x0057030, 0x5F,0x40, 0xC, +12 }, + { 0x042B401,0x0C8F201, 0x12,0x00, 0xA, +0 }, + { 0x261B235,0x015F414, 0x1C,0x08, 0xA, +0 }, + { 0x1112EF0,0x11621E2, 0x00,0xC0, 0x8, +0 }, + { 0x00AF601,0x036D600, 0x07,0x00, 0x0, +0 }, + { 0x006F600,0x00CF600, 0x00,0x00, 0x1, +0 }, + { 0x204FF82,0x055FF10, 0x00,0x06, 0xE, +0 }, + { 0x00CFD01,0x036D600, 0x07,0x00, 0x0, +0 }, + { 0x3E2E20F,0x1E3F308, 0x00,0x0A, 0x6, +0 }, + { 0x366F30F,0x1A5F508, 0x00,0x19, 0x7, +0 }, + { 0x3E2E20F,0x1E4F408, 0x00,0x0A, 0x6, +0 }, + { 0x153F101,0x074F111, 0x49,0x04, 0x6, +0 }, + { 0x153F101,0x074F111, 0x89,0x07, 0x6, +0 }, + { 0x160F101,0x07BD211, 0x4D,0x01, 0x8, +0 }, + { 0x153F181,0x074F111, 0x49,0x00, 0x6, +0 }, + { 0x150F101,0x07CD201, 0x4F,0x05, 0x6, +0 }, + { 0x118F603,0x0F9F212, 0x1C,0x04, 0xF, +0 }, + { 0x1F9F131,0x0F9F331, 0x0E,0x04, 0xA, +0 }, + { 0x153F101,0x074F111, 0x49,0x01, 0x6, +0 }, + { 0x1100133,0x0037D14, 0x07,0x00, 0x8, +0 }, + { 0x1F0F517,0x0F3F201, 0x53,0x09, 0x8, +0 }, + { 0x1FFF5A3,0x0FFF5A2, 0x47,0x00, 0x0, +0 }, + { 0x154F606,0x0B3F281, 0x73,0x03, 0x0, +0 }, + { 0x105F012,0x003F011, 0x15,0x80, 0xA, +0 }, + { 0x108F006,0x008F001, 0x0E,0x00, 0xE, +0 }, + { 0x101FF64,0x062F32E, 0x1B,0x00, 0x4, +0 }, + { 0x4049404,0x0059500, 0x00,0x00, 0x0, +0 }, + { 0x1118371,0x0828F73, 0x03,0x80, 0x9, +0 }, + { 0x111C371,0x082CF73, 0x03,0x80, 0x9, +0 }, + { 0x10381F0,0x005F171, 0xD9,0x85, 0xE, +0 }, + { 0x10F75F2,0x00FFFF0, 0x81,0x0E, 0x3, +0 }, + { 0x1037532,0x0F8B062, 0x1C,0x04, 0xE, +0 }, + { 0x10BF224,0x00B5231, 0x4F,0x08, 0xE, +0 }, + { 0x1F09091,0x0FC4082, 0x88,0x80, 0x8, +0 }, + { 0x10BF261,0x00B5270, 0x68,0x10, 0xA, +0 }, + { 0x131F121,0x045C302, 0x0F,0x03, 0x0, +0 }, + { 0x112F101,0x082F101, 0x10,0x04, 0xA, +0 }, + { 0x1518503,0x071D211, 0x5E,0x07, 0xE, +0 }, + { 0x113F201,0x0F88401, 0x11,0x00, 0xA, +0 }, + { 0x121FF13,0x003FF11, 0x16,0x00, 0xA, +0 }, + { 0x14AF8F0,0x047F022, 0x00,0x0A, 0x8, +0 }, + { 0x11797F0,0x018F161, 0x01,0x0A, 0x8, +0 }, + { 0x11797F1,0x018F126, 0x01,0x08, 0x8, +0 }, + { 0x1EFF201,0x078F101, 0x1D,0x0A, 0xA, +0 }, + { 0x10FF7E1,0x00BF9B1, 0x9A,0x09, 0x8, +0 }, + { 0x1618221,0x0619522, 0x12,0x05, 0x8, +0 }, + { 0x18AE221,0x0A8E421, 0x11,0x00, 0xA, +0 }, + { 0x150F101,0x025F301, 0x4F,0x05, 0x6, +0 }, + { 0x1937511,0x082F501, 0x4F,0x05, 0x0, +0 }, + { 0x119D531,0x01B6171, 0x88,0x80, 0xC, +0 }, + { 0x125F871,0x085F171, 0x40,0x08, 0x8, +0 }, + { 0x1035131,0x0065461, 0x1C,0x04, 0xE, +0 }, + { 0x1035131,0x0065461, 0x16,0x04, 0xE, +0 }, + { 0x11152B0,0x00531B1, 0xC5,0x82, 0x0, +0 }, + { 0x1B69401,0x0268300, 0x00,0x14, 0x1, +0 }, + { 0x11171B1,0x0154261, 0x82,0x04, 0x6, +0 }, + { 0x171E4B1,0x0E5E461, 0x8B,0x40, 0x6, +0 }, + { 0x1829531,0x0B1F130, 0x9C,0x88, 0xC, +0 }, + { 0x1847824,0x004B000, 0x9A,0x00, 0x0, +0 }, + { 0x111A1B1,0x0157261, 0x81,0x04, 0x6, +0 }, + { 0x11161B1,0x0153261, 0x81,0x04, 0x6, +0 }, + { 0x1339111,0x0345122, 0x8A,0x80, 0x6, +0 }, + { 0x11171B1,0x0154261, 0x85,0x04, 0x6, +0 }, + { 0x015E5D1,0x0057B72, 0x5B,0x82, 0x0, +0 }, + { 0x04964F2,0x0069261, 0x90,0x06, 0x0, +0 }, + { 0x1537101,0x00CB222, 0x4F,0x08, 0xA, +0 }, + { 0x1526641,0x0768501, 0x00,0x00, 0x0, +0 }, + { 0x0177E61,0x0098E21, 0x92,0x00, 0xE, +0 }, + { 0x0176E60,0x0096E21, 0x92,0x10, 0xE, +0 }, + { 0x165C201,0x006F321, 0x1D,0x0C, 0xE, +0 }, + { 0x0177E61,0x0098E21, 0x8F,0x04, 0xE, +0 }, + { 0x15A5321,0x01AAA21, 0x9F,0x82, 0xC, +0 }, + { 0x1AE71E1,0x00E81E2, 0x15,0x08, 0xE, +0 }, + { 0x1AE7081,0x09EB023, 0x12,0x09, 0xA, +0 }, + { 0x1AE7081,0x09EB023, 0x18,0x09, 0xA, +0 }, + { 0x1FB7012,0x0FF5014, 0x92,0x04, 0xE, +0 }, + { 0x1FB7012,0x0FF5013, 0x92,0x06, 0xE, +0 }, + { 0x1FB7011,0x0FF5013, 0x92,0x02, 0xE, +0 }, + { 0x1FB7010,0x0FF5011, 0x92,0x0A, 0xE, +0 }, + { 0x1FB7010,0x0FF5013, 0x92,0x06, 0xE, +0 }, + { 0x1FB7011,0x0FF5011, 0x92,0x02, 0xE, +0 }, + { 0x119D530,0x01B6171, 0xC8,0x82, 0xC, +0 }, + { 0x11B5132,0x00BA261, 0x1A,0x0A, 0xC, +0 }, + { 0x1297461,0x0097362, 0x12,0x80, 0xB, +0 }, + { 0x05FF732,0x01F65B1, 0x43,0x80, 0x8, +0 }, + { 0x05F87B1,0x01F67B0, 0x83,0x83, 0x8, +0 }, + { 0x05F8732,0x01F65B1, 0x83,0x80, 0x8, +0 }, + { 0x15F87A2,0x01F65B1, 0x03,0x00, 0x6, +0 }, + { 0x0177E62,0x0098E21, 0x92,0x0C, 0xE, +0 }, + { 0x1C70CB3,0x0A560B2, 0x9A,0x80, 0xD, +0 }, + { 0x15F6721,0x0FF5501, 0x83,0x86, 0x7, +0 }, + { 0x11797F1,0x0E8F121, 0x00,0x04, 0x8, +0 }, + { 0x31797F1,0x0E8F121, 0x00,0x06, 0x8, +0 }, + { 0x15F8781,0x01B6580, 0x83,0x80, 0x6, +0 }, + { 0x1F69401,0x009F426, 0x80,0x04, 0xA, +0 }, + { 0x1F69442,0x008F423, 0x80,0x04, 0xA, +0 }, + { 0x10875E6,0x00963E3, 0x66,0x00, 0xF, +0 }, + { 0x1177426,0x017F5A0, 0x8E,0x83, 0xD, +0 }, + { 0x116F1A1,0x008F421, 0x88,0x02, 0xC, +0 }, + { 0x143C373,0x0432370, 0x0C,0x00, 0x5, +0 }, + { 0x04914F2,0x0665261, 0x90,0x08, 0x0, +0 }, + { 0x11797B1,0x018F161, 0x06,0x08, 0x8, +0 }, + { 0x1176E81,0x0048B22, 0xC5,0x08, 0x8, +0 }, + { 0x100586E,0x0012632, 0x18,0x80, 0x6, +0 }, + { 0x104C113,0x0075161, 0xD3,0x0A, 0xE, +0 }, + { 0x107F021,0x0089022, 0x8E,0x40, 0x0, +0 }, + { 0x111D570,0x0112671, 0xC8,0x82, 0xA, +0 }, + { 0x1427887,0x00485B6, 0x4D,0x02, 0xA, +0 }, + { 0x11171B1,0x0154261, 0x8B,0x00, 0x6, +0 }, + { 0x654F699,0x003F2A1, 0x33,0x08, 0x0, +0 }, + { 0x1537101,0x0047132, 0x49,0x0A, 0x6, +0 }, + { 0x102A4B4,0x00245F6, 0x07,0x00, 0x6, +0 }, + { 0x10214B3,0x00285F5, 0x07,0x00, 0x6, +0 }, + { 0x015E5D1,0x0027B72, 0x9B,0x83, 0x0, +0 }, + { 0x1339660,0x02B5520, 0x00,0x03, 0x6, +0 }, + { 0x153F101,0x053F108, 0x00,0x00, 0x0, +0 }, + { 0x11FF721,0x03FF523, 0x0A,0x00, 0x4, +0 }, + { 0x153F101,0x088F108, 0x00,0x00, 0x0, +0 }, + { 0x110F201,0x004F508, 0x11,0x00, 0x8, +0 }, + { 0x105F011,0x003F010, 0x15,0x40, 0xA, +0 }, + { 0x1176E30,0x00C8B21, 0x61,0x0C, 0x2, +0 }, + { 0x1035131,0x0075462, 0x1C,0x05, 0xE, +0 }, + { 0x2FB7010,0x0FF5013, 0x52,0x06, 0xE, +0 }, + { 0x106FF09,0x004FF84, 0x4D,0x00, 0xC, +0 }, + { 0x106FF09,0x007FF84, 0x0D,0x00, 0xC, +0 }, + { 0x1847825,0x004B001, 0x9A,0x06, 0x0, +0 }, + { 0x340FF55,0x007FF12, 0x80,0x00, 0x0, +0 }, + { 0x340FF90,0x003FF10, 0x80,0x11, 0x0, +0 }, + { 0x040FF10,0x003FF10, 0x80,0x8C, 0xE, +0 }, + { 0x640FF10,0x003FF10, 0x37,0x0E, 0x0, +0 }, + { 0x000FF4E,0x0FD1F40, 0x00,0x00, 0xA, +0 }, + { 0x1945315,0x0757800, 0x00,0x00, 0x0, +0 }, + { 0x3063F72,0x0075F20, 0x85,0x0A, 0x6, +0 }, + { 0x000FF4E,0x0021E60, 0x00,0x00, 0xA, +0 }, + { 0x1F0F000,0x0FF5F09, 0x2E,0x00, 0xE, +0 }, + { 0x111FE3E,0x019F123, 0x00,0xC0, 0x8, +0 }, + { 0x111FEB0,0x019F1A0, 0x00,0xC0, 0x8, +0 }, + { 0x000FF4E,0x0022C60, 0x00,0x00, 0xA, +0 }, + { 0x000FF0D,0x006F020, 0x00,0x00, 0xA, +0 }, + { 0x0000000,0x0000000, 0x00,0x00, 0x0, +0 }, + { 0x0E8E800,0x0F8A500, 0x0D,0x00, 0x6, +0 }, + { 0x038EC12,0x009FA00, 0x06,0x06, 0xE, +0 }, + { 0x2F5F02F,0x207FA0F, 0x00,0x00, 0xE, +0 }, + { 0x077F005,0x0EDFA00, 0x00,0x00, 0xE, +0 }, + { 0x0F0F006,0x0F7F700, 0x00,0x00, 0xE, +0 }, + { 0x0F6F600,0x097F700, 0x00,0x03, 0x1, +0 }, + { 0x100F046,0x067FE02, 0x00,0x00, 0xE, +0 }, + { 0x0F6F600,0x0C7F700, 0x00,0x03, 0x1, +0 }, + { 0x0F0F063,0x2099902, 0x00,0x03, 0xE, +0 }, + { 0x0F6F600,0x0C6F600, 0x00,0x03, 0x1, +0 }, + { 0x1F0F043,0x204FD02, 0x00,0x03, 0xE, +0 }, + { 0x0F6F500,0x0C5F500, 0x00,0x03, 0x1, +0 }, + { 0x000F00F,0x2F4F4A0, 0x00,0x00, 0xE, +0 }, + { 0x342F809,0x3E4F407, 0x06,0x40, 0xE, +0 }, + { 0x320F413,0x254F800, 0x4B,0x00, 0xE, +0 }, + { 0x04F960E,0x218B700, 0x40,0x08, 0xE, +0 }, + { 0x276F502,0x0D6F809, 0x1B,0x05, 0x4, +0 }, + { 0x10070E1,0x0F4A4E0, 0x00,0x09, 0xE, +0 }, + { 0x342F809,0x3E4F404, 0x06,0x44, 0xE, +0 }, + { 0x1F8F830,0x0B6F511, 0x21,0x08, 0x0, +0 }, + { 0x1F8F830,0x0A6F511, 0x1E,0x08, 0x0, +0 }, + { 0x248EB00,0x078F700, 0x95,0x0D, 0x0, +0 }, + { 0x259FB00,0x038E700, 0x94,0x0D, 0x0, +0 }, + { 0x256FB00,0x0C7F600, 0x98,0x0D, 0x0, +0 }, + { 0x1F8F832,0x0F5F531, 0x85,0x08, 0xC, +0 }, + { 0x1BAE812,0x099F511, 0x80,0x08, 0xC, +0 }, + { 0x387FD00,0x0F6E622, 0x00,0x08, 0x0, +0 }, + { 0x387FD00,0x0F6F522, 0x00,0x08, 0x0, +0 }, + { 0x0FEF025,0x2586C03, 0x00,0x93, 0xE, +0 }, + { 0x04F760E,0x2187704, 0x40,0x08, 0xE, +0 }, + { 0x3F77723,0x2F68623, 0x04,0x0A, 0xC, +0 }, + { 0x3F76623,0x2F68623, 0x04,0x0A, 0xC, +0 }, + { 0x306FF80,0x0176F11, 0x00,0x0B, 0xE, +0 }, + { 0x306FF80,0x0166F11, 0x00,0x0B, 0xE, +0 }, + { 0x1D1F813,0x0F5F532, 0x61,0x0C, 0x6, +0 }, + { 0x1D1F813,0x0F6F632, 0x6C,0x08, 0x6, +0 }, + { 0x045FC41,0x0C56943, 0x45,0x00, 0x0, +0 }, + { 0x045FC41,0x0056942, 0x45,0x00, 0x0, +0 }, + { 0x060F205,0x07AF414, 0x51,0x80, 0xA, +0 }, + { 0x060F285,0x0B8F294, 0x51,0x80, 0xA, +0 }, + { 0x1F5F213,0x0F5F111, 0xC6,0x00, 0x0, +0 }, + { 0x013F201,0x043F501, 0x22,0x00, 0xE, +0 }, + { 0x0F9F131,0x0F9F332, 0x8E,0x80, 0xA, +0 }, + { 0x060F207,0x072F212, 0x4F,0x0A, 0x8, +0 }, + { 0x015DA85,0x013F981, 0x4E,0x80, 0xA, +0 }, + { 0x0F0FF06,0x0B5F8C4, 0x00,0x00, 0xE, +0 }, + { 0x060F217,0x072F202, 0x4F,0x10, 0x8, +0 }, + { 0x053F103,0x074F217, 0x0F,0x0B, 0x0, +0 }, + { 0x00FFF24,0x00FFF22, 0x80,0x40, 0x1, +0 }, + { 0x0FFF001,0x00F9031, 0x4F,0x00, 0x6, +0 }, + { 0x1069FB2,0x10FB4B0, 0xC0,0x80, 0x9, +0 }, + { 0x0FFF001,0x00F9033, 0x4F,0x08, 0x6, +0 }, + { 0x00BF224,0x00B9231, 0x4F,0x10, 0xE, +0 }, + { 0x0035121,0x0677262, 0x15,0x80, 0xA, +0 }, + { 0x1AFF5E0,0x10FF4E1, 0xCE,0x00, 0xC, +0 }, + { 0x021FF13,0x003FF11, 0x93,0x80, 0xA, +0 }, + { 0x101FF11,0x003FF11, 0x8B,0x80, 0x0, +0 }, + { 0x171F503,0x083F211, 0x5E,0x00, 0xE, +0 }, + { 0x031F121,0x044F406, 0x40,0x80, 0x0, +0 }, + { 0x01A9161,0x01AC1E5, 0x40,0x03, 0x8, +0 }, + { 0x0AE71E1,0x07EF0E7, 0x16,0x40, 0xA, +0 }, + { 0x0EEC101,0x0DEF302, 0x23,0x00, 0xA, +0 }, + { 0x071FB51,0x0B9F301, 0x00,0x00, 0x0, +0 }, + { 0x0EFF230,0x078F520, 0x1E,0x00, 0xE, +0 }, + { 0x1889501,0x003FF12, 0x40,0x00, 0x6, +0 }, + { 0x1F7F501,0x2F7F501, 0x10,0x00, 0x0, +0 }, + { 0x029D521,0x006B332, 0x4F,0x00, 0xA, +0 }, + { 0x2035170,0x267B420, 0x1C,0x00, 0xE, +0 }, + { 0x21152F0,0x1FE91F1, 0xD0,0x40, 0x0, +0 }, + { 0x11152B0,0x1FE71B1, 0xC5,0x80, 0x0, +0 }, + { 0x01152B1,0x1CF80B1, 0xC5,0x84, 0x8, +0 }, + { 0x01171B1,0x1156261, 0x8B,0x40, 0x6, +0 }, + { 0x0F9F131,0x0D5F531, 0x9C,0x80, 0xE, +0 }, + { 0x123B391,0x106F761, 0x4F,0x40, 0x6, +0 }, + { 0x005F010,0x004D010, 0x25,0x80, 0xE, +0 }, + { 0x2005130,0x2656420, 0x1C,0x00, 0xE, +0 }, + { 0x1037531,0x1445462, 0x1C,0x02, 0xE, +0 }, + { 0x081B021,0x12CD323, 0x16,0x00, 0xC, +0 }, + { 0x10872E1,0x02BFAE2, 0xC0,0x89, 0x0, +0 }, + { 0x1C2F071,0x0F2F2C1, 0x46,0x00, 0x4, +0 }, + { 0x173F141,0x174F242, 0x4F,0x03, 0x6, +0 }, + { 0x0059100,0x3068200, 0x0F,0x00, 0x0, +0 }, + { 0x00B4131,0x03BC262, 0x1C,0x80, 0xE, +0 }, + { 0x01F41B1,0x03BB261, 0x1C,0x80, 0xE, +0 }, + { 0x0655200,0x076A321, 0x1D,0x00, 0xE, +0 }, + { 0x08C4321,0x12FA522, 0x19,0x80, 0xC, +0 }, + { 0x05A5321,0x11ABA21, 0x9F,0x80, 0xC, +0 }, + { 0x1AE91E1,0x09EA1E1, 0x55,0x0A, 0xE, +0 }, + { 0x029BB21,0x00AB061, 0x8E,0x80, 0x8, +0 }, + { 0x0AE71E1,0x19EA1E1, 0x16,0x06, 0xA, +0 }, + { 0x2AE71E0,0x19EA1E2, 0x23,0x00, 0xA, +0 }, + { 0x0537101,0x07C9212, 0x4F,0x00, 0xA, +0 }, + { 0x0687120,0x05E9232, 0x4E,0x00, 0xA, +0 }, + { 0x05B7110,0x07B9250, 0x4F,0x00, 0xE, +0 }, + { 0x009F021,0x10AC024, 0x96,0x00, 0xA, +0 }, + { 0x0176EB1,0x10EDBA2, 0xC5,0x00, 0x2, +0 }, + { 0x019D531,0x00A9173, 0x4D,0x00, 0x8, +0 }, + { 0x01B5132,0x03BB261, 0x9A,0x02, 0xC, +0 }, + { 0x0160020,0x015B022, 0x5B,0x00, 0xA, +0 }, + { 0x0177421,0x117A5A1, 0x83,0x40, 0x7, +0 }, + { 0x18F7EE2,0x02A8661, 0xDB,0x00, 0xE, +0 }, + { 0x0160020,0x01560E1, 0x5B,0x40, 0xA, +0 }, + { 0x1063F54,0x0077E01, 0x85,0x00, 0x6, +0 }, + { 0x08F6EE0,0x02AA661, 0xEC,0x00, 0xE, +0 }, + { 0x0C70CF4,0x0A580F3, 0x9A,0x40, 0xD, +0 }, + { 0x0537102,0x07C7211, 0x4F,0x00, 0xA, +0 }, + { 0x007F803,0x074B201, 0x08,0x00, 0x8, +0 }, + { 0x14FF661,0x00FA661, 0x0B,0x00, 0x2, +0 }, + { 0x0086882,0x008C7F1, 0x90,0x00, 0x4, +0 }, + { 0x0F55551,0x1E65602, 0x80,0x00, 0x8, +0 }, + { 0x0339661,0x02B6522, 0x00,0x00, 0x6, +0 }, + { 0x303F660,0x016F621, 0x07,0x00, 0x4, +0 }, + { 0x0E1B311,0x0E4A101, 0x85,0x00, 0xA, +0 }, + { 0x1E9F251,0x0B6F272, 0x41,0x00, 0xA, +0 }, + { 0x002A4B3,0x04285F5, 0x87,0x00, 0x6, +0 }, + { 0x19041F1,0x005B2B1, 0xC0,0x00, 0x8, +0 }, + { 0x102FF52,0x104FF01, 0x03,0x01, 0x4, +0 }, + { 0x0AFF5E1,0x20FF4E0, 0xD0,0x00, 0xC, +0 }, + { 0x21133F4,0x32E53F1, 0x02,0x00, 0x3, +0 }, + { 0x0D3B305,0x125F243, 0x40,0x00, 0x2, +0 }, + { 0x3CF7232,0x1EE5111, 0x4D,0x00, 0x2, +0 }, + { 0x0FF1001,0x0FF5011, 0x12,0x00, 0xA, +0 }, + { 0x00FFF7E,0x10F6F61, 0x1A,0x00, 0xE, +0 }, + { 0x01131F1,0x11222F1, 0x41,0x40, 0x2, +0 }, + { 0x203E5B6,0x14245F1, 0x4B,0x00, 0x6, +0 }, + { 0x1005872,0x0022620, 0x18,0x40, 0x6, +0 }, + { 0x202F950,0x001FFC5, 0x90,0x00, 0x4, +0 }, + { 0x00F4D20,0x105FF00, 0x03,0x00, 0x2, +0 }, + { 0x0427F35,0x02135A2, 0xD7,0x00, 0xE, +0 }, + { 0x303F17C,0x001F130, 0x40,0x00, 0x6, +0 }, + { 0x053F101,0x053F128, 0x40,0x80, 0x0, +0 }, + { 0x011A131,0x0438D13, 0x87,0x80, 0x8, +0 }, + { 0x053F101,0x074F237, 0x4F,0x00, 0x6, +0 }, + { 0x01FF201,0x188F521, 0x0B,0x00, 0x0, +0 }, + { 0x055F502,0x053F621, 0x99,0x00, 0x0, +0 }, + { 0x1176E31,0x10CABA1, 0x43,0x00, 0x2, +0 }, + { 0x2035530,0x1448461, 0x19,0x00, 0xA, +0 }, + { 0x0427881,0x0558593, 0x4B,0x00, 0xE, +0 }, + { 0x272F107,0x104FC18, 0x46,0x00, 0x0, +0 }, + { 0x0E6F80E,0x0F6F80F, 0x00,0x00, 0x0, +0 }, + { 0x1078F03,0x1059F02, 0xC0,0x00, 0xA, +0 }, + { 0x097C802,0x097F802, 0x00,0x00, 0x1, +0 }, + { 0x007FF01,0x107FF00, 0x00,0x00, 0x5, +0 }, + { 0x196C801,0x086F800, 0x00,0x00, 0xA, +0 }, + { 0x0B3F109,0x0B4F600, 0x00,0x00, 0xE, +0 }, + { 0x00B5F01,0x30F5F00, 0x80,0x00, 0x6, +0 }, + { 0x2056651,0x2066642, 0x00,0x00, 0x2, +0 }, + { 0x3665F54,0x0077F40, 0x0A,0x00, 0x4, +0 }, + { 0x005F1C0,0x02394FB, 0x51,0x00, 0x2, +0 }, + { 0x10FFFFC,0x30FFFF0, 0xC0,0x00, 0x0, +0 }, + { 0x00FFF7E,0x00F5F6E, 0x00,0x00, 0xE, +0 }, + { 0x0F0A00A,0x075C586, 0x00,0x00, 0xE, +0 }, + { 0x050F101,0x0D6D101, 0x4E,0x06, 0xA, +0 }, + { 0x054F231,0x0C6F201, 0x48,0x00, 0x8, +0 }, + { 0x023F503,0x0E7D101, 0x47,0x06, 0xA, +0 }, + { 0x000F113,0x0F6D194, 0x54,0x00, 0x4, +0 }, + { 0x15BF80C,0x0CCD201, 0x71,0x03, 0x0, +0 }, + { 0x0DAF101,0x0E9F301, 0x93,0x00, 0x0, +0 }, + { 0x128FB23,0x0E8D301, 0x87,0x40, 0x6, +0 }, + { 0x0A5C201,0x0D7C201, 0x92,0x00, 0xA, +0 }, + { 0x040FF36,0x0F4F311, 0xC0,0x80, 0x4, +0 }, + { 0x055F587,0x0C4F411, 0x91,0x00, 0x2, +0 }, + { 0x0045616,0x034F601, 0x21,0x00, 0x2, +0 }, + { 0x0E6F318,0x0F6F281, 0xD0,0x00, 0x0, +0 }, + { 0x0FFF718,0x0D8B501, 0x21,0x00, 0x0, +0 }, + { 0x0FFF816,0x0F6F601, 0x98,0x00, 0x0, +0 }, + { 0x032FD13,0x042FD00, 0x86,0x03, 0x8, +0 }, + { 0x1058401,0x0C5F481, 0x49,0x82, 0x0, +0 }, + { 0x2E5F062,0x00EC060, 0x5D,0x00, 0x0, +0 }, + { 0x0FFF062,0x00FCF60, 0xCF,0x00, 0x0, +0 }, + { 0x00FAA30,0x10FFF71, 0x57,0x00, 0x0, +0 }, + { 0x14BF02C,0x01B5071, 0x55,0x08, 0x0, +0 }, + { 0x1059721,0x0054F31, 0x13,0x80, 0x0, +0 }, + { 0x1058721,0x0054F32, 0x8F,0x00, 0x6, +0 }, + { 0x006F223,0x00642B1, 0x53,0x0B, 0xE, +0 }, + { 0x1058721,0x0054F31, 0x50,0x00, 0x0, +0 }, + { 0x2F4F502,0x0F8F301, 0x64,0x00, 0xA, +0 }, + { 0x1FAF303,0x0F7C301, 0x57,0x00, 0xE, +0 }, + { 0x0F0F003,0x0F8F301, 0xD5,0x00, 0x2, +0 }, + { 0x120F723,0x0F7F401, 0x86,0x40, 0x8, +0 }, + { 0x043F903,0x0FAF421, 0xC0,0x00, 0x6, +0 }, + { 0x0FFF101,0x3FFF054, 0x43,0x40, 0x8, +0 }, + { 0x353F100,0x396F110, 0x49,0x00, 0xC, +0 }, + { 0x15FF510,0x1FFF134, 0x40,0x00, 0x0, +0 }, + { 0x0F2D401,0x08AC321, 0x18,0x80, 0xA, +0 }, + { 0x02FF131,0x086F131, 0x8F,0x00, 0xA, +0 }, + { 0x02FF131,0x086F131, 0x8C,0x00, 0xA, +0 }, + { 0x04CB421,0x0FC8201, 0x15,0x00, 0xA, +0 }, + { 0x016F701,0x088F321, 0x8E,0x00, 0xC, +0 }, + { 0x016FD01,0x088F321, 0x0D,0x00, 0xC, +0 }, + { 0x016F501,0x088F321, 0x8C,0x00, 0xA, +0 }, + { 0x004F311,0x06DF231, 0x06,0x00, 0x8, +0 }, + { 0x1035171,0x0155221, 0x1C,0x00, 0xE, +0 }, + { 0x113FF31,0x0366661, 0x16,0x00, 0x8, +0 }, + { 0x0035171,0x0175461, 0x56,0x00, 0xE, +0 }, + { 0x0035171,0x0476421, 0x1D,0x00, 0xE, +0 }, + { 0x121F131,0x0166FE1, 0x46,0x00, 0x2, +0 }, + { 0x0FFF611,0x0F37211, 0x05,0x00, 0x0, +0 }, + { 0x075F002,0x053F701, 0x1D,0x00, 0x0, +0 }, + { 0x1057510,0x0F3F311, 0x41,0x00, 0x0, +0 }, + { 0x1035131,0x0153061, 0x1C,0x00, 0xE, +0 }, + { 0x014C121,0x0054161, 0x93,0x00, 0xA, +0 }, + { 0x0223101,0x0159041, 0x18,0x00, 0xC, +0 }, + { 0x01FF421,0x0073F72, 0xDB,0x07, 0x0, +0 }, + { 0x0697961,0x0677121, 0x96,0x00, 0x0, +0 }, + { 0x069E961,0x0677121, 0x96,0x00, 0x0, +0 }, + { 0x0665410,0x045A581, 0x04,0x00, 0x8, +0 }, + { 0x0076431,0x067D021, 0x1E,0x00, 0xE, +0 }, + { 0x0177521,0x0078F21, 0x94,0x80, 0xC, +0 }, + { 0x0586321,0x018A021, 0x19,0x00, 0xC, +0 }, + { 0x00F7321,0x00F9321, 0x16,0x00, 0xC, +0 }, + { 0x0565321,0x016A021, 0x9A,0x80, 0xE, +0 }, + { 0x0076431,0x067D021, 0x18,0x00, 0xE, +0 }, + { 0x03E4131,0x09EF022, 0x16,0x00, 0xE, +0 }, + { 0x0566121,0x016A021, 0x99,0x80, 0xE, +0 }, + { 0x100FF31,0x0087F61, 0x94,0x00, 0x8, +0 }, + { 0x1009831,0x0096F61, 0x8E,0x00, 0x8, +0 }, + { 0x1055E31,0x0087F61, 0x8D,0x00, 0xA, +0 }, + { 0x0178731,0x00E8BA2, 0xC1,0x00, 0xC, +0 }, + { 0x0178731,0x10E8BA2, 0xC3,0x00, 0xC, +0 }, + { 0x017FE71,0x00A6B22, 0x0D,0x00, 0x8, +0 }, + { 0x0219F32,0x0F770B1, 0x48,0x00, 0x4, +0 }, + { 0x03794A1,0x00A6521, 0x1F,0x00, 0x0, +0 }, + { 0x05F7621,0x02A60A1, 0x19,0x80, 0x6, +0 }, + { 0x0195131,0x0396021, 0x9A,0x80, 0xC, +0 }, + { 0x05084B2,0x0186721, 0x8D,0x00, 0x0, +0 }, + { 0x00457E2,0x0876861, 0x52,0x00, 0x8, +0 }, + { 0x1032171,0x0175461, 0x96,0x00, 0x4, +0 }, + { 0x0031171,0x0175461, 0xD6,0x00, 0x4, +0 }, + { 0x00FF032,0x0077621, 0xF4,0x00, 0x0, +0 }, + { 0x203F422,0x00CF061, 0xA1,0x00, 0x0, +0 }, + { 0x10FFC21,0x10FF9A1, 0x0E,0x00, 0x0, +0 }, + { 0x0558721,0x0186421, 0x42,0x80, 0x0, +0 }, + { 0x0126621,0x0099021, 0x45,0x00, 0x6, +0 }, + { 0x121A221,0x02A91A2, 0x8E,0x00, 0xA, +0 }, + { 0x069E962,0x0677121, 0xAA,0x00, 0x0, +0 }, + { 0x0104100,0x206F760, 0xC4,0x00, 0x0, +0 }, + { 0x030F201,0x009F461, 0x8F,0x80, 0xA, +0 }, + { 0x0F45217,0x005A0A1, 0xA7,0x00, 0xE, +0 }, + { 0x011E861,0x00327B1, 0x1F,0x80, 0xA, +0 }, + { 0x02C6161,0x018F521, 0x16,0x00, 0xC, +0 }, + { 0x001EF71,0x0036172, 0x60,0x00, 0x0, +0 }, + { 0x0935136,0x0714331, 0xC4,0x80, 0x6, +0 }, + { 0x175A1C1,0x1752101, 0x51,0x00, 0x0, +0 }, + { 0x010F4A1,0x0033F32, 0xDB,0x07, 0x0, +0 }, + { 0x1181121,0x007CFA1, 0x15,0x00, 0x0, +0 }, + { 0x0F1B061,0x0F2F1B1, 0x1F,0x00, 0xA, +0 }, + { 0x1051201,0x0144121, 0x15,0x00, 0x0, +0 }, + { 0x0156215,0x004AD81, 0x58,0x00, 0x2, +0 }, + { 0x056F523,0x025F3A1, 0x48,0x80, 0x0, +0 }, + { 0x151F261,0x0A5F242, 0x4D,0x00, 0x0, +0 }, + { 0x1511261,0x0131123, 0x09,0x80, 0xC, +0 }, + { 0x0F11141,0x0031DA1, 0x8E,0x06, 0xA, +0 }, + { 0x15AB061,0x01AB0A3, 0x94,0x80, 0x0, +0 }, + { 0x083F101,0x085F108, 0x40,0x40, 0x0, +0 }, + { 0x1119311,0x0C5A213, 0x0C,0x09, 0x0, +0 }, + { 0x1429811,0x0D7F311, 0x06,0x00, 0x4, +0 }, + { 0x0328513,0x112E591, 0x91,0x00, 0x8, +0 }, + { 0x2569D04,0x005F201, 0x8F,0x80, 0xE, +0 }, + { 0x1206721,0x10C6F22, 0x41,0x00, 0x6, +0 }, + { 0x0206721,0x10C6F22, 0x41,0x00, 0x6, +0 }, + { 0x1178731,0x00E8B22, 0x48,0x80, 0xC, +0 }, + { 0x0E5F105,0x0E5C302, 0xD8,0x80, 0x6, +0 }, + { 0x026EC07,0x087F702, 0x0A,0x00, 0xE, +0 }, + { 0x0155805,0x005EF01, 0x9D,0x00, 0xE, +0 }, + { 0x018FA17,0x054F812, 0x18,0x00, 0x8, +0 }, + { 0x0F3E900,0x005FF00, 0x11,0x00, 0x0, +0 }, + { 0x147F811,0x003F310, 0x01,0x80, 0x4, +0 }, + { 0x0696940,0x0657300, 0x96,0x00, 0x4, +0 }, + { 0x0F0F00C,0x0DF270C, 0x00,0x00, 0xE, +0 }, + { 0x024F806,0x2D65602, 0x80,0x8D, 0xE, +0 }, + { 0x07DF011,0x0865611, 0x0A,0x89, 0xE, +0 }, + { 0x0FFF00B,0x2FF120C, 0x00,0x00, 0xE, +0 }, + { 0x05BE51C,0x0FA5D0C, 0x1E,0x00, 0xE, +0 }, + { 0x0FFD02C,0x0FFF020, 0x40,0x00, 0xE, +0 }, + { 0x200F600,0x2FF4FD0, 0x00,0x00, 0xE, +0 }, + { 0x001FF6C,0x016126C, 0x00,0x40, 0xE, +0 }, + { 0x0FFF30C,0x1DFF60C, 0x00,0x00, 0xE, +0 }, + { 0x0F00020,0x0F00000, 0x3F,0x3F, 0xD, +0 }, + { 0x0C8AA00,0x0B7D200, 0x00,0x00, 0x0, +0 }, + { 0x22BFB03,0x00BF507, 0x00,0x00, 0xF, +0 }, + { 0x3FFFFF0,0x0F0FBE5, 0xC0,0x00, 0xE, +0 }, + { 0x00AFF21,0x119F800, 0x80,0x00, 0xE, +0 }, + { 0x098C601,0x098C601, 0x08,0x08, 0x5, +0 }, + { 0x098C601,0x098C601, 0x00,0x08, 0x5, +0 }, + { 0x342F80E,0x3E4F407, 0x00,0x40, 0xE, +0 }, + { 0x342F80F,0x3E4F407, 0x00,0x40, 0xE, +0 }, + { 0x342F804,0x3E4F407, 0x00,0x44, 0xE, +0 }, + { 0x342F80F,0x3E4F40D, 0x00,0x40, 0xE, +0 }, + { 0x342F80F,0x3E4F408, 0x00,0x40, 0xE, +0 }, + { 0x200F880,0x3049F90, 0x0D,0x00, 0xE, +0 }, + { 0x08DFA01,0x0B5F801, 0x4F,0x00, 0x7, +0 }, + { 0x30AF901,0x006FA00, 0x00,0x00, 0xF, +0 }, + { 0x0EFF702,0x397C802, 0x00,0x00, 0xB, +0 }, + { 0x0EFF702,0x397C802, 0x00,0x40, 0xB, +0 }, + { 0x276F502,0x2D6F609, 0x1B,0x05, 0x4, +0 }, + { 0x05BE51C,0x0FA7D07, 0x16,0x00, 0xE, +0 }, + { 0x0FEE51C,0x0067D07, 0x16,0x00, 0xE, +0 }, + { 0x0F40006,0x005F713, 0x3F,0x00, 0x1, +0 }, + { 0x0F40006,0x005F712, 0x3F,0x00, 0x1, +0 }, + { 0x3F0E02A,0x005FF1E, 0x40,0x40, 0x8, +0 }, + { 0x3F0E02A,0x002FF1E, 0x7C,0x40, 0x8, +0 }, + { 0x053F171,0x227F272, 0x48,0x00, 0xA, +0 }, + { 0x121F1B1,0x0166F61, 0x46,0x00, 0x2, +0 }, + { 0x03EC131,0x09EF022, 0x1B,0x00, 0xE, +0 }, + { 0x203F4A2,0x00CF0F1, 0xA1,0x00, 0x0, +0 }, + { 0x008C782,0x00857F1, 0x0D,0x00, 0x0, +0 }, + { 0x053F101,0x074F217, 0x4F,0x00, 0x6, +0 }, + { 0x0328513,0x112E591, 0x90,0x00, 0x8, +0 }, + { 0x2569D04,0x005F201, 0xCF,0x80, 0xE, +0 }, + { 0x0F2EB20,0x005FF10, 0x08,0x00, 0x0, +0 }, + { 0x0F0F029,0x1DF2703, 0x00,0x00, 0xE, +0 }, + { 0x0F6A90F,0x2F6F90F, 0x02,0xC0, 0x0, +0 }, + { 0x098F601,0x008CB00, 0x00,0x00, 0x5, +0 }, + { 0x306FF80,0x0176F11, 0x00,0x00, 0xE, +0 }, + { 0x306FF80,0x0166F11, 0x00,0x00, 0xE, +0 }, + { 0x0F00006,0x0FFF816, 0x3F,0x00, 0x1, +0 }, + { 0x0FF0006,0x0FFF815, 0x3F,0x00, 0x1, +0 }, + { 0x094F3C1,0x0C8E3C1, 0x8C,0x40, 0xC, +12 }, + { 0x1E4E130,0x0E3F230, 0x8D,0x00, 0xA, +12 }, + { 0x21FF120,0x088F420, 0x21,0x00, 0xA, +12 }, + { 0x100A010,0x0F6B110, 0x15,0x00, 0x8, +12 }, + { 0x054A1E0,0x0049160, 0x4B,0x40, 0x0, +12 }, + { 0x1059020,0x10575A1, 0x51,0x80, 0x4, +12 }, + { 0x10580A0,0x1056521, 0x52,0x80, 0x6, +12 }, + { 0x10569A0,0x10266E0, 0x93,0x00, 0xA, +12 }, + { 0x0033221,0x1042120, 0x4D,0x80, 0x0, +12 }, + { 0x054A160,0x0049160, 0x4D,0x80, 0x0, +12 }, + { 0x10BA8A1,0x128D330, 0x48,0x00, 0xA, +12 }, + { 0x0C8A820,0x0B7D601, 0x00,0x00, 0x0, +0 }, + { 0x117F7CE,0x04CF9C0, 0x21,0x00, 0xF, +12 }, + { 0x075FC01,0x037F800, 0x21,0x00, 0x1, +12 }, + { 0x25E980C,0x306FB0F, 0x80,0x80, 0xF, +12 }, + { 0x0F5F201,0x0F6F201, 0x8F,0x06, 0x8, +0 }, + { 0x0F5F201,0x0F6F201, 0x4B,0x00, 0x8, +0 }, + { 0x0F5F201,0x0F5F201, 0x49,0x00, 0x8, +0 }, + { 0x0F6F2C1,0x0F6F241, 0x12,0x00, 0x6, +0 }, + { 0x0F8F181,0x0F7F201, 0x57,0x00, 0x0, +0 }, + { 0x0F7F101,0x0F6F201, 0x93,0x00, 0x0, +0 }, + { 0x0F5F60C,0x0F5F381, 0x5C,0x00, 0x0, +0 }, + { 0x0F5F3D8,0x0F5F281, 0x62,0x00, 0x0, +0 }, + { 0x014F6B1,0x004F1F1, 0x92,0x00, 0x2, +0 }, + { 0x05FC772,0x004C730, 0x14,0x00, 0x2, +0 }, + { 0x016AA70,0x0048AB1, 0x44,0x00, 0x4, +0 }, + { 0x1259723,0x01355B1, 0x93,0x00, 0x4, +0 }, + { 0x1299824,0x01646B1, 0x48,0x00, 0xC, +0 }, + { 0x1069121,0x0066161, 0x13,0x00, 0xA, +0 }, + { 0x0067121,0x00661E1, 0x13,0x89, 0x6, +0 }, + { 0x197F302,0x0C6F341, 0x9C,0x80, 0xC, +0 }, + { 0x198F303,0x0E5F111, 0x54,0x00, 0xC, +0 }, + { 0x03EF123,0x0F7F221, 0x5F,0x00, 0x0, +0 }, + { 0x127F623,0x0F7F321, 0x87,0x80, 0x6, +0 }, + { 0x054F903,0x03FF621, 0x47,0x00, 0x0, +0 }, + { 0x1479163,0x0178421, 0x4A,0x05, 0x8, +0 }, + { 0x1189563,0x0179461, 0x4A,0x00, 0x8, +0 }, + { 0x0482029,0x0F7D1A4, 0xA1,0x80, 0x8, +0 }, + { 0x077F131,0x005F771, 0x13,0x00, 0xA, +0 }, + { 0x0E7F171,0x075F171, 0x8D,0x00, 0xA, +0 }, + { 0x0276131,0x0157172, 0x5B,0x00, 0xC, +0 }, + { 0x096A101,0x0D6F261, 0x8B,0x40, 0x8, +0 }, + { 0x016A261,0x0D6A121, 0x8A,0x08, 0x8, +0 }, + { 0x0E5F431,0x075F131, 0x8B,0x00, 0xA, +0 }, + { 0x057F271,0x007E122, 0x0F,0x00, 0x6, +0 }, + { 0x114DD31,0x0265621, 0x15,0x00, 0x8, +0 }, + { 0x113DD31,0x00666E1, 0x16,0x00, 0x8, +0 }, + { 0x116D171,0x0066131, 0x49,0x00, 0x8, +0 }, + { 0x11471A1,0x0057263, 0x4D,0x80, 0x2, +0 }, + { 0x124F1F1,0x0156FE1, 0x40,0x00, 0x2, +0 }, + { 0x176F502,0x0358501, 0x1A,0x80, 0x0, +0 }, + { 0x175F422,0x0F3F301, 0x1D,0x80, 0x0, +0 }, + { 0x126B121,0x00572A2, 0x9B,0x01, 0xE, +0 }, + { 0x1037FA1,0x1053F21, 0x98,0x00, 0x0, +0 }, + { 0x03441A1,0x0035161, 0x93,0x00, 0xA, +0 }, + { 0x025C121,0x0054F61, 0x18,0x00, 0xC, +0 }, + { 0x013F431,0x0038A72, 0x5B,0x83, 0x0, +0 }, + { 0x03974A1,0x0667161, 0x90,0x00, 0x0, +0 }, + { 0x08662E1,0x0057A72, 0x57,0x00, 0xC, +0 }, + { 0x0188561,0x0088F61, 0x92,0x01, 0xC, +0 }, + { 0x01775A1,0x0078F21, 0x94,0x05, 0xC, +0 }, + { 0x0157621,0x0368261, 0x94,0x00, 0xC, +0 }, + { 0x1189E31,0x1286221, 0x43,0x00, 0x2, +0 }, + { 0x0676121,0x0067F21, 0x9B,0x00, 0x2, +0 }, + { 0x0187561,0x00874A2, 0x8A,0x06, 0x8, +0 }, + { 0x15772A1,0x0177161, 0x86,0x83, 0x0, +0 }, + { 0x0375421,0x016A621, 0x4D,0x00, 0x8, +0 }, + { 0x1079331,0x0077261, 0x8F,0x00, 0x8, +0 }, + { 0x1079331,0x0077261, 0x8E,0x00, 0x8, +0 }, + { 0x1079331,0x0078261, 0x91,0x00, 0xA, +0 }, + { 0x118AA61,0x0088F21, 0x4B,0x00, 0x8, +0 }, + { 0x1167E31,0x1078B21, 0x90,0x00, 0x6, +0 }, + { 0x0289B32,0x0187221, 0x90,0x00, 0x4, +0 }, + { 0x05C85E1,0x01765E1, 0x1F,0x00, 0x0, +0 }, + { 0x05C88E1,0x01765E1, 0x46,0x00, 0x0, +0 }, + { 0x01F75A1,0x0077521, 0x9C,0x00, 0x2, +0 }, + { 0x2FCF122,0x006FF61, 0x51,0x00, 0x0, +0 }, + { 0x1FCF121,0x207FF21, 0x0E,0x00, 0x0, +0 }, + { 0x0588622,0x01664E1, 0x46,0x80, 0x0, +0 }, + { 0x17A9221,0x02A9122, 0x8B,0x00, 0x0, +0 }, + { 0x005DFA2,0x0056F61, 0x9E,0x40, 0x2, +0 }, + { 0x0A8F121,0x007F461, 0x8F,0x80, 0xA, +0 }, + { 0x0935337,0x005A0E1, 0xA5,0x00, 0x2, +0 }, + { 0x0759121,0x0155561, 0x17,0x00, 0xC, +0 }, + { 0x0025471,0x0036A72, 0x5D,0x00, 0x0, +0 }, + { 0x0432161,0x03542A2, 0x97,0x00, 0x8, +0 }, + { 0x173A161,0x1433161, 0x1C,0x00, 0x0, +0 }, + { 0x0341121,0x0244261, 0x89,0x03, 0xA, +0 }, + { 0x14711A1,0x007CF61, 0x15,0x00, 0x0, +0 }, + { 0x085B122,0x025F261, 0x92,0x83, 0xC, +0 }, + { 0x155F101,0x0F4F242, 0x4D,0x00, 0x0, +0 }, + { 0x1511161,0x01321A3, 0x94,0x80, 0x6, +0 }, + { 0x0311161,0x0035DA1, 0x8C,0x80, 0x6, +0 }, + { 0x1F1A131,0x0F4A233, 0x0C,0x80, 0x0, +0 }, + { 0x0277C21,0x1076F22, 0x49,0x00, 0x6, +0 }, + { 0x134DD31,0x0165621, 0x85,0x00, 0xA, +0 }, + { 0x207DA20,0x0078F21, 0x04,0x81, 0x6, +0 }, + { 0x0E5F105,0x0E3C303, 0x6A,0x80, 0x6, +0 }, + { 0x0A337D5,0x03756FA, 0x95,0x40, 0x0, +0 }, + { 0x261B2B5,0x0A5F4B4, 0x5C,0x08, 0xA, +0 }, + { 0x001F6EE,0x3A54FF0, 0x00,0x00, 0xE, +0 }, + { 0x0F0F300,0x2C6F600, 0x00,0x00, 0xE, +0 }, + { 0x060F213,0x072F201, 0x4F,0x10, 0x8, +0 }, + { 0x0FFF001,0x00F9031, 0x4F,0x04, 0x6, +0 }, + { 0x021FF13,0x0F6F311, 0x96,0x80, 0xA, +0 }, + { 0x001FF11,0x0F5F311, 0x8D,0x80, 0x0, +0 }, + { 0x171F503,0x0F6F211, 0x5E,0x00, 0xE, +0 }, + { 0x031F121,0x0F8F406, 0x40,0x85, 0x0, +0 }, + { 0x09F8331,0x078F422, 0x10,0x04, 0xA, +0 }, + { 0x024D501,0x0258531, 0x0F,0x00, 0xA, +0 }, + { 0x0A7F131,0x0C6F731, 0x5A,0x80, 0xE, +0 }, + { 0x08B7261,0x01950E1, 0xA7,0x81, 0x2, +0 }, + { 0x0089782,0x00897F1, 0x0D,0x00, 0x0, +0 }, + { 0x0E1A311,0x0E4A103, 0x80,0x80, 0x6, +0 }, + { 0x003FF41,0x0F4F123, 0x23,0x00, 0x8, +0 }, + { 0x007FF01,0x007FF01, 0x00,0x00, 0x7, +0 }, + { 0x096D801,0x096D801, 0x00,0x00, 0xA, +0 }, + { 0x277C005,0x0EDB900, 0x00,0x00, 0xC, +0 }, + { 0x204FD36,0x0F8F809, 0x00,0x00, 0xC, +0 }, + { 0x0530900,0x094F700, 0x40,0x00, 0x0, +0 }, + { 0x077F005,0x0EBFA00, 0x00,0x00, 0xE, +0 }, + { 0x077F005,0x0E58A00, 0x00,0x00, 0xE, +0 }, + { 0x073F005,0x0A3FA00, 0x00,0x00, 0xE, +0 }, + { 0x042F80E,0x3E4F407, 0x08,0x51, 0xE, +0 }, + { 0x37CFD23,0x0F58401, 0x15,0x08, 0x0, +0 }, + { 0x035F203,0x4F5F401, 0x5D,0x08, 0x1, +0 }, + { 0x0F5F303,0x4F5F301, 0x7D,0x08, 0x0, +0 }, + { 0x0F5F203,0x4F5F201, 0x55,0x08, 0x1, +0 }, + { 0x0F5B111,0x0D5F211, 0x1B,0x80, 0x1, +0 }, + { 0x005F276,0x006F27A, 0x25,0x29, 0xE, +12 }, + { 0x0F2F100,0x0F7F200, 0x24,0x00, 0xE, +0 }, + { 0x185DC85,0x055F401, 0x91,0x0E, 0x3, +0 }, + { 0x0F6E181,0x0F6E798, 0x00,0x2B, 0x1, +0 }, + { 0x0F4F194,0x0A7E98A, 0x00,0x15, 0x1, +0 }, + { 0x0B3D407,0x0B4C202, 0xA0,0x00, 0xA, -12 }, + { 0x082D307,0x0E3A302, 0x58,0x80, 0xB, +0 }, + { 0x156940A,0x132F411, 0xA7,0x05, 0x5, +0 }, + { 0x027A2A0,0x023A522, 0x85,0x9E, 0x7, +0 }, + { 0x02AA5A2,0x02AA168, 0x80,0x8F, 0x7, +0 }, + { 0x02AA623,0x00AAF61, 0x51,0x80, 0x8, -12 }, + { 0x00AAF61,0x00AAF22, 0x91,0x80, 0x9, +0 }, + { 0x1239723,0x01455B1, 0x93,0x00, 0x4, +12 }, + { 0x1069FB2,0x10B55B0, 0x09,0x22, 0x5, +0 }, + { 0x066752A,0x067702A, 0x26,0x2B, 0xE, +0 }, + { 0x013C321,0x00B7022, 0x22,0x00, 0xE, +0 }, + { 0x0F4F505,0x0F9F200, 0x29,0x1E, 0x6, +12 }, + { 0x0F1F101,0x0F7F100, 0x2F,0x00, 0x6, +0 }, + { 0x0F4F405,0x0F6F100, 0x20,0x19, 0x6, +12 }, + { 0x19F53C8,0x07FFAE4, 0x1C,0x03, 0x9, +0 }, + { 0x0049420,0x0A5C523, 0x2A,0x24, 0xE, +12 }, + { 0x0F9F200,0x0F8F101, 0x21,0x00, 0xE, +0 }, + { 0x02BF82A,0x02BF620, 0x24,0x2D, 0xE, +12 }, + { 0x02BF420,0x02BF420, 0x12,0x00, 0xE, +0 }, + { 0x0ABF82A,0x02BF620, 0x23,0x32, 0xE, +12 }, + { 0x0285130,0x0487130, 0x5B,0x00, 0x0, +12 }, + { 0x0487130,0x048A130, 0x1E,0x00, 0x1, +0 }, + { 0x0F7F52F,0x1C7F523, 0x14,0x33, 0x8, +12 }, + { 0x097F320,0x0F8F121, 0x20,0x00, 0x8, +0 }, + { 0x0F7F52F,0x1C7F523, 0x1B,0x30, 0x8, +12 }, + { 0x0E8F431,0x078F131, 0x15,0x00, 0xE, +0 }, + { 0x0E8F501,0x078F101, 0x15,0x00, 0xF, +0 }, + { 0x0CFF416,0x0E6F405, 0x23,0x69, 0xC, +12 }, + { 0x0D6F200,0x0E6E201, 0x14,0x00, 0xC, +0 }, + { 0x2036130,0x20434A0, 0x98,0x0B, 0xE, +0 }, + { 0x1156561,0x0073521, 0x92,0x01, 0xF, +0 }, + { 0x012D121,0x0054F61, 0x1A,0x00, 0xC, +0 }, + { 0x016C1A1,0x0044F21, 0x93,0x00, 0xD, +0 }, + { 0x0049100,0x2045240, 0x0F,0x00, 0x9, +0 }, + { 0x0157620,0x0368261, 0x94,0x00, 0xC, +12 }, + { 0x02661B1,0x0276171, 0xD3,0x80, 0xD, +0 }, + { 0x04A6121,0x00B7F21, 0x9F,0x00, 0xE, +0 }, + { 0x00A65A1,0x0067F61, 0xA2,0x00, 0xF, +0 }, + { 0x0277221,0x0067F21, 0x16,0x05, 0xC, +0 }, + { 0x0866131,0x0D6C261, 0x1A,0x00, 0xE, +0 }, + { 0x0678221,0x0179222, 0x17,0x00, 0xE, +0 }, + { 0x00AD961,0x006A861, 0x28,0x1E, 0xE, +0 }, + { 0x0069A21,0x00ACF24, 0x25,0x00, 0xE, +0 }, + { 0x02A9B32,0x0177221, 0x90,0x00, 0x4, +0 }, + { 0x01CB632,0x01B66E1, 0x92,0x82, 0x5, +0 }, + { 0x00FFF61,0x00FFF22, 0x1C,0x00, 0xE, +0 }, + { 0x00FFF21,0x009CF62, 0x1C,0x00, 0xF, +0 }, + { 0x0559622,0x0187421, 0x46,0x80, 0xF, +0 }, + { 0x09041F1,0x00322B1, 0xCB,0x07, 0xB, +0 }, + { 0x0022A55,0x0F34212, 0x97,0x86, 0x7, +0 }, + { 0x1D38201,0x04442E1, 0x40,0x0D, 0x1, +0 }, + { 0x2164460,0x00450E1, 0xAB,0x01, 0xB, +0 }, + { 0x0022A55,0x0F34212, 0x97,0x86, 0x1, +0 }, + { 0x1623524,0x1023171, 0x20,0x05, 0x1, +0 }, + { 0x011A131,0x0137D16, 0x87,0x08, 0x1, +0 }, + { 0x0F0A101,0x0437516, 0x0C,0x03, 0x1, +0 }, + { 0x053F201,0x052F317, 0x8F,0x09, 0x5, +0 }, + { 0x055C902,0x024A601, 0x1A,0x05, 0xD, +0 }, + { 0x0175E31,0x20C7B21, 0x18,0x08, 0x7, +0 }, + { 0x119FFA1,0x0089024, 0x0C,0x11, 0x7, +0 }, + { 0x004F007,0x004F081, 0x51,0x13, 0x7, +0 }, + { 0x026EC07,0x016F801, 0x15,0x00, 0xA, +0 }, + { 0x001FF17,0x0057A12, 0x1C,0x0B, 0xB, +0 }, + { 0x09FF831,0x004FF10, 0x8B,0x05, 0x7, +0 }, + { 0x001FF0E,0x20F2F01, 0x00,0x0D, 0xE, +0 }, + { 0x2077405,0x106F403, 0x80,0x0F, 0xF, +0 }, + { 0x003FF15,0x0934511, 0x09,0x1F, 0xF, +0 }, + { 0x000200E,0x0022F0E, 0x00,0x0F, 0xF, +0 }, + { 0x060F209,0x072F214, 0x4F,0x19, 0xB, +0 }, + { 0x1111EF0,0x11311E2, 0x00,0xC5, 0xF, +0 }, + { 0x000FFEE,0x30318EE, 0x00,0x00, 0xE, +0 }, + { 0x0F7B710,0x005F011, 0x42,0x00, 0x8, +0 }, + { 0x6EF8801,0x608B502, 0x0D,0x00, 0x0, +0 }, + { 0x0F1F10F,0x007840F, 0x00,0x08, 0xC, +12 }, + { 0x6EF8800,0x608F502, 0x13,0x00, 0x0, +8 }, + { 0x0F1D101,0x0078400, 0x00,0x00, 0xE, +1 }, + { 0x254F307,0x307F905, 0x04,0x0B, 0x6, -5 }, + { 0x254F307,0x207F905, 0x04,0x0B, 0x8, +0 }, + { 0x25CD808,0x32B8A06, 0x04,0x08, 0xC, +0 }, + { 0x2F2E327,0x3F5C525, 0x04,0x08, 0xA, -5 }, + { 0x2F2F326,0x2F5C525, 0x04,0x08, 0x8, +0 }, + { 0x292F108,0x354F201, 0x00,0x08, 0x8, +12 }, + { 0x283E108,0x334D700, 0x00,0x08, 0x8, +12 }, + { 0x283E109,0x334D500, 0x00,0x08, 0x8, +11 }, + { 0x2E1F119,0x3F3F11B, 0x04,0x08, 0x8, +0 }, + { 0x251F206,0x263C504, 0x04,0x09, 0xA, +0 }, + { 0x241F287,0x353B502, 0x05,0x09, 0xA, +1 }, + { 0x292F108,0x354F201, 0x00,0x03, 0x8, +12 }, + { 0x456FB02,0x017F700, 0x81,0x00, 0x0, +12 }, + { 0x556FA01,0x117F701, 0x00,0x0D, 0x6, +10 }, + { 0x556FB02,0x117F701, 0x81,0x0D, 0x6, +10 }, + { 0x106F680,0x016F610, 0x00,0x00, 0xC, +0 }, + { 0x20F6F00,0x20F6F00, 0x00,0x00, 0x0, +0 }, + { 0x106F680,0x016F610, 0x00,0x00, 0x6, +0 }, + { 0x20F4F00,0x20F4F00, 0x00,0x00, 0x6, +0 }, + { 0x1DC5D01,0x06FF79F, 0x0B,0x00, 0xA, +12 }, + { 0x1C7C900,0x05FF49F, 0x07,0x00, 0xA, +12 }, + { 0x3F0E00A,0x0F7F21F, 0x7C,0x40, 0x8, +0 }, + { 0x3E0F50A,0x0FAF31F, 0x7C,0x40, 0x9, +0 }, + { 0x1F5F213,0x0F5F111, 0xC6,0x0A, 0x0, +0 }, + { 0x019F603,0x0F4F212, 0x30,0x10, 0xF, +0 }, + { 0x1069FB2,0x10F94B0, 0xC0,0x86, 0x9, +0 }, + { 0x1069FB2,0x10F94B0, 0xC0,0x80, 0x9, +0 }, + { 0x1F69182,0x1F69180, 0xC0,0x86, 0x9, +0 }, + { 0x00BF224,0x00B5231, 0x4F,0x1B, 0xE, +0 }, + { 0x021FE13,0x094F231, 0x96,0x80, 0xA, +0 }, + { 0x153F201,0x174F511, 0x4D,0x00, 0x8, +0 }, + { 0x0199421,0x0099428, 0x01,0x09, 0x6, +0 }, + { 0x0199421,0x0099428, 0x01,0x13, 0x6, +0 }, + { 0x06FFA24,0x0F891C2, 0x8A,0x03, 0x8, +0 }, + { 0x0CFF121,0x048F621, 0x1A,0x00, 0xA, +0 }, + { 0x022B701,0x037C422, 0x1D,0x00, 0xE, +0 }, + { 0x0EFF231,0x068F122, 0x1E,0x00, 0xE, +0 }, + { 0x025F911,0x034F131, 0x05,0x09, 0xA, +0 }, + { 0x019D531,0x01B6172, 0x8A,0x00, 0xC, +0 }, + { 0x255A511,0x1B3F511, 0x96,0x80, 0xC, +0 }, + { 0x0058001,0x006F011, 0x9C,0x80, 0x0, +0 }, + { 0x243A5C0,0x123D400, 0x0D,0x00, 0x0, +0 }, + { 0x1E3C221,0x3166120, 0x58,0x00, 0x0, +0 }, + { 0x081B021,0x12CB322, 0x16,0x00, 0xC, +0 }, + { 0x0AE7121,0x09E8121, 0x1D,0x00, 0xE, +0 }, + { 0x00B4131,0x01B92F1, 0x1C,0x00, 0xA, +0 }, + { 0x0AE71E1,0x09E81E2, 0x15,0x03, 0xE, +0 }, + { 0x0537121,0x04C5232, 0x4F,0x00, 0xA, +0 }, + { 0x0687120,0x05E5231, 0x4E,0x00, 0xA, +0 }, + { 0x0219B32,0x0077221, 0xC0,0x00, 0x4, +0 }, + { 0x08F6EE1,0x02A6562, 0xEC,0x00, 0xE, +0 }, + { 0x0C70CF5,0x0A560F2, 0x9A,0x80, 0xD, +0 }, + { 0x203FF22,0x00FFF21, 0x59,0x08, 0x0, +0 }, + { 0x00E7121,0x00E8121, 0x1D,0x00, 0xE, +0 }, + { 0x0FFF100,0x0FF5011, 0x0D,0x80, 0x6, +0 }, + { 0x0EF1100,0x00FB031, 0x10,0x80, 0xA, +0 }, + { 0x173F3A4,0x0238161, 0x4C,0x10, 0x4, +0 }, + { 0x200F601,0x3061FDD, 0x00,0x00, 0xC, +0 }, + { 0x22BFB03,0x00BF50F, 0x00,0x00, 0xF, +0 }, + { 0x07CFA01,0x004F200, 0x00,0x00, 0x0, +0 }, + { 0x000F601,0x3029FDD, 0x0C,0x00, 0xC, +0 }, + { 0x002F60C,0x213CB12, 0x00,0x00, 0xA, +0 }, + { 0x342F80E,0x3E4F407, 0x06,0x44, 0xE, +0 }, + { 0x200F601,0x3029FDD, 0x00,0x00, 0xC, +0 }, + { 0x276F502,0x0D6F609, 0x1B,0x00, 0x4, +0 }, + { 0x000F600,0x24393DF, 0x09,0x00, 0xE, +0 }, + { 0x0BFFA02,0x097C804, 0x00,0x00, 0xB, +0 }, + { 0x306FF80,0x0164F11, 0x00,0x00, 0xE, +0 }, + { 0x332F985,0x0A5D684, 0x05,0x40, 0xE, +0 }, + { 0x0FFF00B,0x2FF220C, 0x00,0x00, 0xE, +0 }, + { 0x223A133,0x4F4F131, 0xD6,0x09, 0x6, +0 }, + { 0x223B132,0x0F4F131, 0xD3,0x0A, 0x6, +0 }, + { 0x433F133,0x0F4F131, 0xD6,0x09, 0x8, +0 }, + { 0x2F3F132,0x4F6F131, 0xD3,0x0A, 0x6, +0 }, + { 0x2A4A112,0x4B5F211, 0xD2,0x05, 0x4, +0 }, + { 0x4A49112,0x2B5D110, 0xCF,0x05, 0x4, +0 }, + { 0x073FA31,0x4F4D111, 0x8E,0x08, 0xA, +0 }, + { 0x473FA32,0x4F4D111, 0x8C,0x09, 0xA, +0 }, + { 0x2E7F21A,0x0B8F201, 0x6F,0x48, 0xC, +0 }, + { 0x0E5B111,0x0B8F211, 0x9C,0x80, 0x0, +0 }, + { 0x2C7F436,0x0D7F231, 0x9D,0x0A, 0xE, +0 }, + { 0x0C7F021,0x0F8F111, 0x1E,0x0F, 0x0, +0 }, + { 0x523F134,0x4F5D111, 0x51,0x0D, 0x6, +0 }, + { 0x203FC32,0x1F7D111, 0x4B,0x0D, 0x6, +0 }, + { 0x559F101,0x0F7F111, 0x44,0x08, 0x6, +0 }, + { 0x0F00000,0x4F7F111, 0x3F,0x0D, 0x9, +0 }, + { 0x087F607,0x0E4F231, 0x54,0x08, 0x9, +0 }, + { 0x587F617,0x0E4F231, 0x54,0x08, 0x9, +0 }, + { 0x0A5F33F,0x0F2C312, 0xA1,0x06, 0xC, -12 }, + { 0x0A5F43F,0x0F2F392, 0xD5,0x07, 0x0, -12 }, + { 0x461A417,0x0017C11, 0xAA,0x08, 0x7, +0 }, + { 0x061A416,0x0018911, 0xA7,0x07, 0x7, +0 }, + { 0x0F6F2B2,0x0F6F281, 0xE5,0x00, 0xF, +0 }, + { 0x0F6F2A4,0x007F08F, 0x40,0x00, 0x1, +0 }, + { 0x0F6F618,0x0F7E500, 0x63,0x80, 0x6, +12 }, + { 0x5A6F40E,0x007D804, 0x5B,0x80, 0x0, +0 }, + { 0x2F6F71A,0x0F5F413, 0x1F,0x03, 0x4, -19 }, + { 0x0F00000,0x1F7F715, 0x3F,0x00, 0x1, +2 }, + { 0x082F307,0x0E3F302, 0x97,0x8A, 0x6, -12 }, + { 0x082D307,0x0E3F302, 0x97,0x8A, 0x6, -12 }, + { 0x4109131,0x3B5F322, 0x52,0x88, 0x8, +0 }, + { 0x118B1A4,0x11BD161, 0x88,0x80, 0x7, +0 }, + { 0x108B1A3,0x11BD161, 0x88,0x88, 0x5, +12 }, + { 0x0F8F032,0x0F8F001, 0x65,0x07, 0xE, -12 }, + { 0x0F8F024,0x008F009, 0x43,0x07, 0x1, -12 }, + { 0x018AA70,0x0088AB1, 0x44,0x10, 0x4, +0 }, + { 0x118AA71,0x0088AB2, 0x4B,0x10, 0x4, +0 }, + { 0x1043031,0x1145432, 0x92,0x80, 0xD, +0 }, + { 0x1045033,0x1145430, 0x92,0x80, 0xB, +0 }, + { 0x1178001,0x1176082, 0x5D,0x83, 0x4, +0 }, + { 0x4178000,0x1176081, 0x54,0x83, 0x6, +0 }, + { 0x025A721,0x1264132, 0x4D,0x08, 0x6, +0 }, + { 0x1258621,0x1264633, 0x4F,0x08, 0x6, +0 }, + { 0x4FAF022,0x01A6221, 0x96,0x08, 0xC, +0 }, + { 0x105FF2C,0x01A6222, 0x9D,0x12, 0x8, +0 }, + { 0x107F021,0x2055232, 0x92,0x07, 0x8, +0 }, + { 0x107F021,0x2055232, 0x92,0x07, 0x0, +0 }, + { 0x274A613,0x4B8F401, 0xDD,0x05, 0x6, +0 }, + { 0x2249134,0x2B8D301, 0x5E,0x05, 0xA, -12 }, + { 0x5E5F133,0x1E4F211, 0x99,0x07, 0x6, +0 }, + { 0x1E5F133,0x5E4F211, 0x9E,0x0B, 0x0, +0 }, + { 0x21FF021,0x088F211, 0xA5,0x80, 0xA, +12 }, + { 0x11FF023,0x088F211, 0x5E,0x80, 0xA, +0 }, + { 0x132ED11,0x3E7D211, 0x87,0x0A, 0x6, +0 }, + { 0x332ED12,0x1E7D211, 0x80,0x45, 0x2, +0 }, + { 0x0F4E431,0x0F5F331, 0x97,0x86, 0x8, +0 }, + { 0x3F0F701,0x1F8F900, 0x00,0x0D, 0xE, +0 }, + { 0x0F78111,0x3F7F054, 0x40,0x45, 0x8, +0 }, + { 0x0F78140,0x3F7F040, 0x40,0x01, 0xC, +14 }, + { 0x0F78111,0x2F7F054, 0x40,0x45, 0xA, +0 }, + { 0x0F78140,0x3F7F040, 0x40,0x05, 0xC, +14 }, + { 0x6F78AE8,0x649B1F4, 0x03,0x0A, 0xA, +0 }, + { 0x6F78AE8,0x649B1F4, 0x43,0x4B, 0xA, +0 }, + { 0x0209221,0x0E6C131, 0x97,0x05, 0x0, +0 }, + { 0x0608521,0x0E6A131, 0xD4,0x05, 0x4, +0 }, + { 0x0F9F030,0x0F8F131, 0x9D,0x05, 0xA, +12 }, + { 0x7F0F017,0x7F9B700, 0x00,0x0F, 0xA, +12 }, + { 0x026AA21,0x0D7F132, 0xCF,0x84, 0xA, +0 }, + { 0x5F9F40B,0x445F711, 0x4B,0x4D, 0x2, +0 }, + { 0x010D331,0x0B68112, 0x9A,0x40, 0x6, +0 }, + { 0x0404121,0x0B56113, 0x9B,0x4C, 0x8, +0 }, + { 0x2E69419,0x5B6B311, 0x5E,0x08, 0x0, +0 }, + { 0x077FA21,0x0F79321, 0x07,0x0D, 0x0, +0 }, + { 0x2E69515,0x1B6B211, 0x17,0x08, 0x0, +0 }, + { 0x077FA21,0x06AC332, 0x07,0x0D, 0x0, +0 }, + { 0x0F5F430,0x0F6F330, 0x0E,0x00, 0xA, +12 }, + { 0x1468331,0x017D232, 0x15,0x00, 0xA, +0 }, + { 0x2257020,0x4266161, 0x95,0x05, 0xA, +0 }, + { 0x1257021,0x0266141, 0x99,0x07, 0x8, +0 }, + { 0x2426070,0x2154130, 0x4F,0x00, 0xA, +0 }, + { 0x214D070,0x1175222, 0x0F,0x88, 0x2, +0 }, + { 0x524D071,0x5075222, 0x13,0x88, 0x0, +0 }, + { 0x521F571,0x4166022, 0x90,0x09, 0x6, +0 }, + { 0x52151F0,0x4156021, 0x97,0x0D, 0x4, +12 }, + { 0x223F8F2,0x4055421, 0x99,0x8A, 0xC, +0 }, + { 0x0A05211,0x0E4C411, 0x9F,0x03, 0xA, +0 }, + { 0x1C79612,0x0E45411, 0xD9,0x03, 0x4, +0 }, + { 0x023E133,0x0F2F131, 0xA2,0x09, 0xE, +0 }, + { 0x023F132,0x0F2F131, 0x24,0x0A, 0xE, +0 }, + { 0x4C3C413,0x0B4D214, 0x9B,0x48, 0xA, -24 }, + { 0x5BAF900,0x0B4F211, 0x87,0x48, 0x6, +0 }, + { 0x223F832,0x4055421, 0x99,0x8A, 0xC, +0 }, + { 0x433CB32,0x5057561, 0x9B,0x8A, 0xA, +0 }, + { 0x1029033,0x4044561, 0x5B,0x85, 0x4, +0 }, + { 0x4109033,0x2044520, 0xA8,0x85, 0xA, +0 }, + { 0x2034170,0x0043671, 0x08,0x20, 0x9, +0 }, + { 0x1022171,0x0042671, 0x0C,0x17, 0xB, +0 }, + { 0x0055021,0x0F55022, 0x1C,0x0F, 0x7, +0 }, + { 0x0F54066,0x0F55024, 0x5A,0x0F, 0x7, -12 }, + { 0x239B420,0x0076121, 0x50,0x05, 0x6, +0 }, + { 0x139B462,0x00D7161, 0x91,0x14, 0x0, +0 }, + { 0x05470F1,0x07460B1, 0x5A,0x80, 0x0, +0 }, + { 0x054A0F1,0x07460B1, 0x5E,0x80, 0x0, +0 }, + { 0x2436110,0x114D211, 0x90,0x00, 0xC, +0 }, + { 0x1436192,0x145F312, 0x8F,0x00, 0xC, +0 }, + { 0x0147421,0x0077521, 0x94,0x04, 0xE, +0 }, + { 0x0178461,0x008AF28, 0x10,0xA6, 0xC, +0 }, + { 0x0235271,0x0198161, 0x1E,0x08, 0xE, +0 }, + { 0x0235361,0x0196161, 0x1D,0x03, 0xE, +0 }, + { 0x0155331,0x0378261, 0x94,0x00, 0xA, +0 }, + { 0x118537A,0x5177432, 0x21,0x00, 0x4, -12 }, + { 0x0364121,0x02B7221, 0x21,0x08, 0xC, +0 }, + { 0x026F021,0x0056121, 0x26,0x03, 0xC, +0 }, + { 0x0578321,0x117C021, 0x19,0x03, 0xC, +0 }, + { 0x2E77530,0x307F520, 0x10,0x08, 0x8, +0 }, + { 0x036F121,0x337F121, 0x92,0x08, 0xE, +0 }, + { 0x0368121,0x037F121, 0x92,0x08, 0xE, +0 }, + { 0x0A66121,0x0976121, 0x9B,0x08, 0xE, +0 }, + { 0x0F37011,0x1F65052, 0x51,0x04, 0xA, +0 }, + { 0x1067021,0x1165231, 0x8A,0x00, 0x6, +0 }, + { 0x00B9820,0x10B5330, 0x8E,0x00, 0xA, +12 }, + { 0x10B8020,0x11B6330, 0x87,0x00, 0x8, +12 }, + { 0x0235031,0x0076C64, 0x58,0x08, 0xA, +0 }, + { 0x055D531,0x0076C72, 0x17,0x0D, 0x6, +0 }, + { 0x2077830,0x2076331, 0x94,0x00, 0xA, +0 }, + { 0x0199031,0x01B6134, 0x95,0x80, 0xA, +0 }, + { 0x0177532,0x0174531, 0x93,0x03, 0xC, +0 }, + { 0x0277530,0x0174536, 0x14,0x9C, 0xE, +12 }, + { 0x08D6EF1,0x02A3571, 0xC0,0x00, 0xE, +0 }, + { 0x08860A1,0x01A6561, 0x5C,0x00, 0x8, +0 }, + { 0x2176522,0x0277421, 0x5A,0x00, 0x6, +0 }, + { 0x1274472,0x01745B1, 0x8D,0x05, 0x4, +0 }, + { 0x2F0F051,0x09A7801, 0x03,0x12, 0xA, +0 }, + { 0x00457F2,0x0375761, 0xA8,0x00, 0xE, +0 }, + { 0x2545C73,0x0776821, 0x00,0x0D, 0xE, +0 }, + { 0x5543737,0x25D67A1, 0x28,0x00, 0x8, +0 }, + { 0x6243371,0x46D6331, 0x20,0x00, 0x6, +0 }, + { 0x00F31D1,0x0053271, 0xC7,0x00, 0xB, +0 }, + { 0x00581A2,0x0295231, 0x37,0x00, 0x6, +0 }, + { 0x20FFF22,0x60FFF21, 0x7F,0x12, 0x5, +0 }, + { 0x30FFF22,0x60FFF21, 0xBF,0x12, 0x5, +0 }, + { 0x39BC120,0x368C030, 0xBF,0x06, 0x0, +0 }, + { 0x3AB8120,0x308F130, 0x9E,0x06, 0x0, +0 }, + { 0x13357F1,0x00767E1, 0x21,0x00, 0xA, +0 }, + { 0x43357F2,0x00767E1, 0x28,0x00, 0x0, +0 }, + { 0x2444830,0x43D67A1, 0x22,0x00, 0x8, +0 }, + { 0x534B821,0x13D87A1, 0x1F,0x00, 0xA, +0 }, + { 0x32B7420,0x12BF134, 0x46,0x00, 0x8, +0 }, + { 0x5029072,0x0069061, 0x96,0x0C, 0x8, +0 }, + { 0x1019031,0x0069061, 0x1A,0x0C, 0x6, +0 }, + { 0x245C224,0x2550133, 0x83,0x80, 0x9, -36 }, + { 0x2459224,0x2556133, 0x83,0x80, 0x9, -36 }, + { 0x132ED10,0x3E7D010, 0x87,0x08, 0x6, +12 }, + { 0x132ED30,0x3E7D010, 0x87,0x0D, 0x6, +12 }, + { 0x2946374,0x005A0A1, 0xA5,0x05, 0x2, +0 }, + { 0x2055F02,0x004FFE1, 0xA8,0x05, 0x0, +0 }, + { 0x0031131,0x0054361, 0xD4,0x00, 0x4, +0 }, + { 0x20311B0,0x00543E1, 0xD9,0x00, 0x4, +0 }, + { 0x245A121,0x126A121, 0x98,0x05, 0xC, +0 }, + { 0x255A421,0x126A121, 0x98,0x05, 0xC, +0 }, + { 0x20470E0,0x1148161, 0x59,0x03, 0x2, +0 }, + { 0x10460E1,0x2148161, 0x5F,0x83, 0x6, +0 }, + { 0x0336186,0x05452E1, 0xA7,0x00, 0x6, +0 }, + { 0x13351A6,0x05452E1, 0xA7,0x00, 0x0, +0 }, + { 0x2529084,0x1534341, 0x9D,0x80, 0xC, +0 }, + { 0x2529082,0x0534341, 0x9D,0x80, 0xC, +0 }, + { 0x2345231,0x2135120, 0x98,0x00, 0x6, +0 }, + { 0x410F422,0x1233231, 0x20,0x00, 0xA, +0 }, + { 0x1522162,0x1633021, 0x99,0x80, 0x8, +0 }, + { 0x1522161,0x1633021, 0x99,0x80, 0x8, +0 }, + { 0x157B261,0x019F806, 0x04,0x40, 0x7, +0 }, + { 0x157B261,0x0145114, 0x04,0x40, 0x7, +0 }, + { 0x2322122,0x0133221, 0x8C,0x92, 0x6, +0 }, + { 0x4033121,0x0132122, 0x93,0x48, 0x4, +7 }, + { 0x074F624,0x0249303, 0xC0,0x0D, 0x0, +0 }, + { 0x3D2C092,0x1D2D131, 0x8E,0x03, 0x0, +0 }, + { 0x0D2D091,0x1D23132, 0x8E,0x03, 0x0, +0 }, + { 0x5F29054,0x0F2C241, 0x99,0x06, 0xE, +0 }, + { 0x1F19011,0x0F2C241, 0x1A,0x06, 0x6, +0 }, + { 0x05233E1,0x0131371, 0x1A,0x88, 0x7, +0 }, + { 0x5522363,0x0131331, 0x1A,0x8D, 0x7, +0 }, + { 0x0B67061,0x0928032, 0x9C,0x11, 0xA, +0 }, + { 0x0057F21,0x0038F62, 0x9C,0x11, 0xA, +0 }, + { 0x0025511,0x1748201, 0x94,0x06, 0xE, +0 }, + { 0x2045501,0x2445501, 0x15,0x0D, 0xA, +0 }, + { 0x0B37121,0x5F48221, 0x16,0x08, 0x2, +0 }, + { 0x2B37102,0x5F48221, 0x90,0x08, 0x6, +0 }, + { 0x1127533,0x4F4F211, 0x58,0x03, 0x6, +0 }, + { 0x3F0F014,0x6F7F611, 0x40,0x43, 0xA, +0 }, + { 0x033F201,0x373F402, 0xD1,0x8A, 0x0, +0 }, + { 0x6A7F907,0x229A904, 0x1A,0x00, 0xA, -12 }, + { 0x332F320,0x6E49423, 0x0E,0x08, 0x8, +0 }, + { 0x455F71C,0x0D68501, 0xA3,0x08, 0x6, +0 }, + { 0x055F718,0x0D6E501, 0x23,0x08, 0x0, +0 }, + { 0x1397931,0x2099B22, 0x80,0x00, 0x6, +0 }, + { 0x2137931,0x1079B22, 0x42,0xC2, 0xA, +0 }, + { 0x302A130,0x0266221, 0x1E,0x00, 0xE, +0 }, + { 0x0136031,0x1169131, 0x12,0x80, 0x8, +0 }, + { 0x032A115,0x172B212, 0x00,0x80, 0x1, +5 }, + { 0x001E79A,0x067961C, 0x81,0x00, 0x4, +0 }, + { 0x4046306,0x005A902, 0xCA,0x08, 0x6, +0 }, + { 0x0045413,0x005A601, 0x51,0x08, 0xA, +0 }, + { 0x4D1F214,0x098F715, 0xA0,0x00, 0xC, +0 }, + { 0x008F312,0x004F600, 0x08,0xC8, 0x4, -12 }, + { 0x27CFA01,0x004F200, 0x08,0x08, 0x0, +0 }, + { 0x5C8FB00,0x0B7E601, 0x00,0x00, 0x0, +0 }, + { 0x2F0F00F,0x0F8F800, 0x00,0x40, 0xE, +12 }, + { 0x518F890,0x0E7F310, 0x00,0x00, 0x8, -12 }, + { 0x250F610,0x0E7F510, 0x00,0xC8, 0x6, +0 }, + { 0x2114109,0x51D2101, 0x05,0x80, 0xA, +0 }, + { 0x2114108,0x31D2101, 0x05,0x80, 0xA, +12 }, + { 0x4543311,0x357451A, 0x19,0x03, 0xE, -14 }, + { 0x00437D2,0x0343471, 0xA1,0x07, 0xC, +0 }, + { 0x0F0F00C,0x0F66700, 0x00,0xCD, 0xE, +0 }, + { 0x200C327,0x6021300, 0x80,0x12, 0xE, -23 }, + { 0x200C32B,0x6021300, 0x80,0x12, 0xE, -24 }, + { 0x003EBD7,0x06845D8, 0xD4,0x00, 0x7, +12 }, + { 0x62FDA20,0x614B009, 0x42,0x48, 0x4, -24 }, + { 0x62FDA20,0x614B009, 0x82,0x48, 0x4, -20 }, + { 0x101FE30,0x6142120, 0x00,0x00, 0xC, -36 }, + { 0x6019460,0x1142120, 0x26,0x00, 0xC, -14 }, + { 0x200832F,0x6044020, 0x80,0x00, 0xE, -36 }, + { 0x200832F,0x6044020, 0x80,0x00, 0xE, -35 }, + { 0x2305431,0x6E7F600, 0x00,0x00, 0xE, +0 }, + { 0x059F802,0x01CF600, 0x11,0x00, 0xC, +0 }, + { 0x2159506,0x65AB701, 0x00,0x04, 0xE, +0 }, + { 0x10F5F81,0x0164611, 0x00,0x0A, 0x6, +0 }, + { 0x00F5F01,0x20F5F00, 0x00,0x00, 0x8, +0 }, + { 0x0D6D725,0x3A9A909, 0x1F,0x00, 0xE, -9 }, + { 0x0F0A00F,0x0F8F80F, 0x00,0x0C, 0xE, +0 }, + { 0x2FDFD00,0x6FAFA00, 0x00,0x00, 0xE, +0 }, + { 0x4F1F103,0x6FAFA07, 0x00,0x00, 0x8, +0 }, + { 0x0F0F007,0x2F6F60F, 0x27,0x00, 0x0, +21 }, + { 0x559FA00,0x047F800, 0x00,0x00, 0x4, +0 }, + { 0x3F1F102,0x0078400, 0x00,0x26, 0xC, +0 }, + { 0x048FA00,0x008F900, 0x00,0x00, 0x6, +12 }, + { 0x287F702,0x678F802, 0x80,0x88, 0xE, +12 }, + { 0x2F7F602,0x0F8F802, 0x00,0x88, 0xE, +12 }, + { 0x05476C1,0x30892C5, 0x80,0x08, 0x0, +0 }, + { 0x05477C1,0x30892C5, 0x00,0x08, 0xA, -2 }, + { 0x007C604,0x007C604, 0x08,0x08, 0x1, +0 }, + { 0x201F302,0x057AB09, 0x03,0x07, 0xC, +12 }, + { 0x254F307,0x307F905, 0x04,0x08, 0x6, -5 }, + { 0x254F307,0x207F905, 0x04,0x08, 0x8, +0 }, + { 0x006C604,0x007C604, 0x08,0x08, 0x1, +0 }, + { 0x201F312,0x057AB09, 0x03,0x07, 0xC, +12 }, + { 0x254D307,0x3288905, 0x04,0x03, 0xA, -5 }, + { 0x0015500,0x007C716, 0x0C,0x00, 0x0, +0 }, + { 0x201F312,0x057AB09, 0x00,0x07, 0xC, +12 }, + { 0x0015500,0x007C719, 0x0C,0x00, 0x0, +0 }, + { 0x001F312,0x047BB05, 0x03,0x07, 0xC, +12 }, + { 0x0015500,0x007C71B, 0x0C,0x00, 0x0, +0 }, + { 0x201F312,0x047BB09, 0x03,0x07, 0xC, +12 }, + { 0x0015500,0x007C71F, 0x0C,0x00, 0x0, +0 }, + { 0x210F509,0x305FE03, 0x8A,0x85, 0xE, +12 }, + { 0x200F508,0x305FE03, 0xC7,0x85, 0xC, +12 }, + { 0x2E1F119,0x3F3F11B, 0x04,0x0D, 0x8, +0 }, + { 0x2777603,0x3679601, 0x87,0x08, 0x6, +12 }, + { 0x277C643,0x3679601, 0x87,0x08, 0xE, +12 }, + { 0x366F905,0x099F701, 0x00,0x00, 0xC, +12 }, + { 0x431A000,0x085B41A, 0x81,0x05, 0xA, +12 }, + { 0x459F640,0x185B418, 0x00,0x20, 0xB, +12 }, + { 0x212FD04,0x305FD03, 0x01,0x00, 0x8, +12 }, + { 0x2A8F9E3,0x0779643, 0x1E,0x08, 0x2, +6 }, + { 0x0A5F7E8,0x0D89949, 0xDE,0x00, 0x0, +0 }, + { 0x2A8F9E3,0x0779643, 0x1E,0x00, 0xE, +12 }, + { 0x0A5F7E9,0x0D8994A, 0xDE,0x08, 0xC, +0 }, + { 0x0A8F7E9,0x5D8990A, 0x08,0x00, 0xC, +0 }, + { 0x0A5F7E9,0x0D8994A, 0x29,0x08, 0xC, +10 }, + { 0x2A8F9E2,0x0779642, 0x1E,0x00, 0xE, +8 }, + { 0x0A5F7E9,0x5D8994A, 0x08,0x00, 0xC, +0 }, + { 0x456FB02,0x017F700, 0x81,0x00, 0xC, +12 }, + { 0x556FA01,0x117F701, 0x00,0x0D, 0xA, +10 }, + { 0x556FB02,0x117F701, 0x81,0x0D, 0xA, +10 }, + { 0x367FE06,0x668F701, 0x09,0x08, 0x8, +12 }, + { 0x367FD10,0x098F901, 0x00,0x0D, 0x8, +6 }, + { 0x367FE05,0x678F701, 0x09,0x08, 0x8, +12 }, + { 0x367FD10,0x078F901, 0x00,0x0D, 0x8, +11 }, + { 0x098600F,0x3FC8590, 0x08,0xC0, 0xE, +12 }, + { 0x009F020,0x37DA588, 0x07,0x00, 0xA, +12 }, + { 0x00FC020,0x32DA5A8, 0x07,0x00, 0xA, +12 }, + { 0x0D1F815,0x078F512, 0x44,0x00, 0x8, +12 }, + { 0x2D1F213,0x098F614, 0x9D,0x00, 0x0, +0 }, + { 0x2D1F213,0x098F614, 0x9D,0x21, 0x0, -2 }, + { 0x0985900,0x039870F, 0x07,0x00, 0x8, +13 }, + { 0x2F3F307,0x09C9B0F, 0x1D,0x00, 0x0, +13 }, + { 0x09C4B00,0x43A6705, 0x21,0x00, 0xC, +13 }, + { 0x0F7F907,0x2987805, 0x1C,0x00, 0x0, +13 }, + { 0x160F2C6,0x07AF4D4, 0x4F,0x80, 0x8, +12 }, + { 0x160F286,0x0B7F294, 0x4F,0x80, 0x8, +12 }, + { 0x227A305,0x36A560A, 0x87,0x08, 0xE, +12 }, + { 0x247C345,0x3697809, 0x87,0x08, 0xE, +12 }, + { 0x4755406,0x3667601, 0x87,0x08, 0x6, +12 }, + { 0x275A346,0x3667601, 0x87,0x08, 0x6, +12 }, + { 0x6E4840B,0x6E4B409, 0x12,0x09, 0x1, +0 }, + { 0x6E4440B,0x6E46407, 0x21,0x13, 0x1, +3 }, + { 0x037A309,0x06DF904, 0x11,0x00, 0xE, +0 }, + { 0x6F9A902,0x2F7C801, 0x00,0x40, 0x8, +0 }, + { 0x4F9F901,0x4F7C713, 0x1F,0x48, 0x0, -7 }, + { 0x4B7C720,0x1F3F300, 0x0B,0x00, 0x0, +0 }, + { 0x01BF4E0,0x018F3E0, 0x8D,0x23, 0xA, +12 }, + { 0x00FFFE4,0x00FFFE1, 0x8A,0xA9, 0x1, +0 }, + { 0x031FF10,0x004FF01, 0x07,0x25, 0xA, +12 }, + { 0x050F101,0x07CE401, 0x4F,0x22, 0x6, +12 }, + { 0x00361F0,0x02CE371, 0x86,0x1F, 0xA, +12 }, + { 0x00361B0,0x02CE3F3, 0x86,0x1F, 0x8, +12 }, + { 0x00331F2,0x02C53F4, 0x4B,0x21, 0x4, -12 }, + { 0x08FAEE2,0x02A8561, 0x11,0x23, 0xE, +12 }, + { 0x019D530,0x01B6171, 0x15,0x9B, 0xC, +12 }, + { 0x00B4131,0x03B9261, 0x1C,0x99, 0xE, +0 }, + { 0x01F61B1,0x01B9261, 0x1C,0x9D, 0xE, +0 }, + { 0x04C6321,0x00FC521, 0x18,0xA0, 0xC, +0 }, + { 0x060F207,0x072F212, 0x4F,0x21, 0x8, +0 }, + { 0x053F401,0x053F308, 0x40,0x64, 0x0, -6 }, + { 0x0FFF832,0x07FF511, 0x44,0x1F, 0xE, -18 }, + { 0x04CA700,0x04FC600, 0x00,0x22, 0x0, +12 }, + { 0x0F5F062,0x0F8F60E, 0x00,0x1F, 0xE, +12 }, + { 0x005FC4E,0x0F8F90C, 0x00,0x24, 0x0, +12 }, + { 0x005756E,0x0F8F601, 0x00,0x22, 0xE, +12 }, + { 0x011F131,0x043D418, 0x90,0xA5, 0x8, -12 }, + { 0x08FAEE0,0x00A8561, 0xE8,0x21, 0xE, +12 }, + { 0x02990F2,0x02C61F2, 0x16,0x22, 0xA, -12 }, + { 0x02BF4E0,0x048F3E0, 0x8D,0x1F, 0x8, +12 }, + { 0x023F331,0x09C4333, 0x45,0x25, 0x6, -12 }, + { 0x04CA700,0x04FC600, 0x00,0x2B, 0x0, -12 }, + { 0x0B5F704,0x002010C, 0x00,0x00, 0x8, +21 }, +}; +const struct adlinsdata adlins[4547] = +{ + { 0, 0, 0, 0, 1660, 1660,0.000000 }, + { 1, 1, 0, 0, 1746, 1746,0.000000 }, + { 2, 2, 0, 0, 1980, 1980,0.000000 }, + { 3, 3, 0, 0, 1553, 1553,0.000000 }, + { 4, 4, 0, 0, 1233, 1233,0.000000 }, + { 5, 5, 0, 0, 1980, 1980,0.000000 }, + { 6, 6, 0, 0, 1100, 1100,0.000000 }, + { 7, 7, 0, 0, 1233, 1233,0.000000 }, + { 8, 8, 0, 0, 940, 940,0.000000 }, + { 9, 9, 0, 0, 1100, 1100,0.000000 }, + { 10, 10, 0, 0, 460, 460,0.000000 }, + { 11, 11, 0, 0, 1740, 1740,0.000000 }, + { 12, 12, 0, 0, 66, 66,0.000000 }, + { 13, 13, 0, 0, 140, 140,0.000000 }, + { 14, 14, 0, 0, 940, 940,0.000000 }, + { 15, 15, 0, 0, 266, 266,0.000000 }, + { 16, 16, 0, 0, 40000, 33,0.000000 }, + { 17, 17, 0, 0, 40000, 6,0.000000 }, + { 18, 18, 0, 0, 40000, 13,0.000000 }, + { 19, 19, 0, 0, 40000, 193,0.000000 }, + { 20, 20, 0, 0, 40000, 193,0.000000 }, + { 21, 21, 0, 0, 40000, 6,0.000000 }, + { 22, 22, 0, 0, 40000, 66,0.000000 }, + { 23, 23, 0, 0, 40000, 66,0.000000 }, + { 24, 24, 0, 0, 1026, 1026,0.000000 }, + { 25, 25, 0, 0, 1826, 1826,0.000000 }, + { 26, 26, 0, 0, 1813, 1813,0.000000 }, + { 27, 27, 0, 0, 1080, 1080,0.000000 }, + { 28, 28, 0, 0, 40000, 0,0.000000 }, + { 29, 29, 0, 0, 40000, 13,0.000000 }, + { 30, 30, 0, 0, 40000, 13,0.000000 }, + { 31, 31, 0, 0, 4200, 4200,0.000000 }, + { 32, 32, 0, 0, 940, 940,0.000000 }, + { 33, 33, 0, 0, 40000, 20,0.000000 }, + { 34, 34, 0, 0, 1746, 1746,0.000000 }, + { 35, 35, 0, 0, 40000, 0,0.000000 }, + { 36, 36, 0, 0, 2400, 2400,0.000000 }, + { 37, 37, 0, 0, 4166, 4166,0.000000 }, + { 38, 38, 0, 0, 1740, 1740,0.000000 }, + { 39, 39, 0, 0, 40000, 26,0.000000 }, + { 40, 40, 0, 0, 40000, 86,0.000000 }, + { 41, 41, 0, 0, 40000, 6,0.000000 }, + { 42, 42, 0, 0, 40000, 133,0.000000 }, + { 43, 43, 0, 0, 40000, 126,0.000000 }, + { 44, 44, 0, 0, 333, 333,0.000000 }, + { 45, 45, 0, 0, 940, 940,0.000000 }, + { 46, 46, 0, 0, 1046, 1046,0.000000 }, + { 47, 47, 0, 0, 40000, 33,0.000000 }, + { 48, 48, 0, 0, 1766, 13,0.000000 }, + { 49, 49, 0, 0, 40000, 220,0.000000 }, + { 50, 50, 0, 0, 40000, 153,0.000000 }, + { 51, 51, 0, 0, 40000, 146,0.000000 }, + { 52, 52, 0, 0, 2300, 2300,0.000000 }, + { 53, 53, 0, 0, 40000, 140,0.000000 }, + { 54, 54, 0, 0, 233, 233,0.000000 }, + { 55, 55, 0, 0, 40000, 6,0.000000 }, + { 56, 56, 0, 0, 40000, 6,0.000000 }, + { 57, 57, 0, 0, 40000, 6,0.000000 }, + { 58, 58, 0, 0, 40000, 6,0.000000 }, + { 59, 59, 0, 0, 40000, 6,0.000000 }, + { 60, 60, 0, 0, 40000, 0,0.000000 }, + { 61, 61, 0, 0, 40000, 26,0.000000 }, + { 62, 62, 0, 0, 40000, 0,0.000000 }, + { 63, 63, 0, 0, 40000, 6,0.000000 }, + { 64, 64, 0, 0, 40000, 20,0.000000 }, + { 65, 65, 0, 0, 40000, 20,0.000000 }, + { 66, 66, 0, 0, 40000, 0,0.000000 }, + { 67, 67, 0, 0, 40000, 6,0.000000 }, + { 68, 68, 0, 0, 3940, 3940,0.000000 }, + { 69, 69, 0, 0, 40000, 6,0.000000 }, + { 70, 70, 0, 0, 40000, 60,0.000000 }, + { 71, 71, 0, 0, 40000, 6,0.000000 }, + { 72, 72, 0, 0, 40000, 6,0.000000 }, + { 73, 73, 0, 0, 40000, 13,0.000000 }, + { 74, 74, 0, 0, 40000, 0,0.000000 }, + { 75, 75, 0, 0, 40000, 73,0.000000 }, + { 76, 76, 0, 0, 40000, 53,0.000000 }, + { 77, 77, 0, 0, 40000, 53,0.000000 }, + { 78, 78, 0, 0, 40000, 53,0.000000 }, + { 79, 79, 0, 0, 40000, 0,0.000000 }, + { 80, 80, 0, 0, 40000, 0,0.000000 }, + { 81, 81, 0, 0, 40000, 33,0.000000 }, + { 82, 82, 0, 0, 40000, 6,0.000000 }, + { 83, 83, 0, 0, 40000, 6,0.000000 }, + { 84, 84, 0, 0, 40000, 73,0.000000 }, + { 85, 85, 0, 0, 40000, 133,0.000000 }, + { 86, 86, 0, 0, 40000, 20,0.000000 }, + { 87, 87, 0, 0, 40000, 233,0.000000 }, + { 88, 88, 0, 0, 40000, 413,0.000000 }, + { 89, 89, 0, 0, 1660, 86,0.000000 }, + { 90, 90, 0, 0, 40000, 553,0.000000 }, + { 91, 91, 0, 0, 40000, 100,0.000000 }, + { 92, 92, 0, 0, 613, 13,0.000000 }, + { 93, 93, 0, 0, 40000, 126,0.000000 }, + { 94, 94, 0, 0, 40000, 53,0.000000 }, + { 95, 95, 0, 0, 993, 993,0.000000 }, + { 96, 96, 0, 0, 40000, 513,0.000000 }, + { 97, 97, 0, 0, 280, 280,0.000000 }, + { 98, 98, 0, 0, 40000, 73,0.000000 }, + { 99, 99, 0, 0, 2113, 2113,0.000000 }, + { 100, 100, 0, 0, 40000, 886,0.000000 }, + { 101, 101, 0, 0, 40000, 773,0.000000 }, + { 102, 102, 0, 0, 40000, 426,0.000000 }, + { 103, 103, 0, 0, 2413, 2413,0.000000 }, + { 104, 104, 0, 0, 1126, 1126,0.000000 }, + { 105, 105, 0, 0, 1046, 1046,0.000000 }, + { 106, 106, 0, 0, 866, 866,0.000000 }, + { 107, 107, 0, 0, 280, 280,0.000000 }, + { 108, 108, 0, 0, 40000, 6,0.000000 }, + { 109, 109, 0, 0, 40000, 113,0.000000 }, + { 110, 110, 0, 0, 40000, 6,0.000000 }, + { 111, 111, 0, 0, 1126, 1126,0.000000 }, + { 112, 112, 0, 0, 140, 140,0.000000 }, + { 113, 113, 0, 0, 246, 246,0.000000 }, + { 114, 114, 0, 0, 20, 20,0.000000 }, + { 115, 115, 0, 0, 146, 146,0.000000 }, + { 116, 116, 0, 0, 146, 146,0.000000 }, + { 117, 117, 0, 0, 340, 340,0.000000 }, + { 118, 118, 0, 0, 2280, 2280,0.000000 }, + { 119, 119, 0, 0, 286, 286,0.000000 }, + { 120, 120, 0, 0, 586, 586,0.000000 }, + { 121, 121, 0, 0, 4486, 4486,0.000000 }, + { 122, 122, 0, 0, 133, 133,0.000000 }, + { 123, 123, 0, 0, 186, 186,0.000000 }, + { 124, 124, 0, 0, 146, 146,0.000000 }, + { 125, 125, 0, 0, 40000, 113,0.000000 }, + { 126, 126, 0, 0, 140, 140,0.000000 }, + { 127, 127, 35, 0, 26, 26,0.000000 }, + { 128, 128, 52, 0, 20, 20,0.000000 }, + { 129, 129, 48, 0, 73, 73,0.000000 }, + { 130, 130, 58, 0, 40, 40,0.000000 }, + { 129, 129, 60, 0, 80, 80,0.000000 }, + { 131, 131, 47, 0, 106, 106,0.000000 }, + { 132, 132, 43, 0, 20, 20,0.000000 }, + { 131, 131, 49, 0, 146, 146,0.000000 }, + { 133, 133, 43, 0, 26, 26,0.000000 }, + { 131, 131, 51, 0, 160, 160,0.000000 }, + { 134, 134, 43, 0, 160, 160,0.000000 }, + { 131, 131, 54, 0, 140, 140,0.000000 }, + { 131, 131, 57, 0, 153, 153,0.000000 }, + { 135, 135, 72, 0, 600, 600,0.000000 }, + { 131, 131, 60, 0, 160, 160,0.000000 }, + { 136, 136, 76, 0, 513, 513,0.000000 }, + { 137, 137, 84, 0, 393, 393,0.000000 }, + { 138, 138, 36, 0, 400, 400,0.000000 }, + { 139, 139, 65, 0, 86, 86,0.000000 }, + { 140, 140, 84, 0, 406, 406,0.000000 }, + { 141, 141, 83, 0, 60, 60,0.000000 }, + { 135, 135, 84, 0, 406, 406,0.000000 }, + { 142, 142, 24, 0, 46, 46,0.000000 }, + { 136, 136, 77, 0, 500, 500,0.000000 }, + { 143, 143, 60, 0, 40, 40,0.000000 }, + { 144, 144, 65, 0, 40, 40,0.000000 }, + { 145, 145, 59, 0, 13, 13,0.000000 }, + { 146, 146, 51, 0, 46, 46,0.000000 }, + { 147, 147, 45, 0, 40, 40,0.000000 }, + { 148, 148, 71, 0, 140, 140,0.000000 }, + { 149, 149, 60, 0, 160, 160,0.000000 }, + { 150, 150, 58, 0, 153, 153,0.000000 }, + { 151, 151, 53, 0, 153, 153,0.000000 }, + { 152, 152, 64, 0, 86, 86,0.000000 }, + { 153, 153, 71, 0, 13, 13,0.000000 }, + { 154, 154, 61, 0, 313, 313,0.000000 }, + { 155, 155, 61, 0, 606, 606,0.000000 }, + { 156, 156, 44, 0, 80, 80,0.000000 }, + { 157, 157, 40, 0, 320, 320,0.000000 }, + { 158, 158, 69, 0, 20, 20,0.000000 }, + { 159, 159, 68, 0, 20, 20,0.000000 }, + { 160, 160, 63, 0, 33, 33,0.000000 }, + { 161, 161, 74, 0, 93, 93,0.000000 }, + { 162, 162, 60, 0, 353, 353,0.000000 }, + { 163, 163, 80, 0, 60, 60,0.000000 }, + { 164, 164, 64, 0, 873, 873,0.000000 }, + { 165, 165, 72, 0, 33, 33,0.000000 }, + { 166, 166, 73, 0, 286, 286,0.000000 }, + { 167, 167, 70, 0, 133, 133,0.000000 }, + { 168, 168, 68, 0, 20, 20,0.000000 }, + { 169, 169, 48, 0, 40, 40,0.000000 }, + { 131, 131, 53, 0, 126, 126,0.000000 }, + { 170, 170, 0, 0, 1020, 1020,0.000000 }, + { 171, 171, 0, 0, 40000, 0,0.000000 }, + { 172, 173, 0, 0, 1740, 1740,0.000000 }, + { 174, 175, 0, 0, 1260, 1260,0.000000 }, + { 176, 177, 0, 0, 1100, 1100,0.000000 }, + { 178, 178, 0, 0, 1100, 1100,0.000000 }, + { 179, 180, 0, 0, 726, 726,0.000000 }, + { 181, 181, 0, 0, 460, 460,0.000000 }, + { 182, 182, 0, 0, 246, 246,0.000000 }, + { 183, 184, 0, 0, 120, 120,0.000000 }, + { 185, 186, 0, 0, 840, 840,0.000000 }, + { 187, 187, 0, 0, 293, 293,0.000000 }, + { 188, 189, 0, 0, 1320, 1320,0.000000 }, + { 190, 191, 0, 0, 646, 6,0.000000 }, + { 192, 193, 0, 0, 40000, 6,0.000000 }, + { 194, 194, 0, 0, 40000, 6,0.000000 }, + { 195, 196, 0, 0, 40000, 0,0.000000 }, + { 197, 198, 0, 0, 40000, 20,0.000000 }, + { 199, 200, 0, 0, 2573, 6,0.000000 }, + { 201, 202, 0, 0, 953, 953,0.000000 }, + { 203, 204, 0, 0, 1740, 1740,0.000000 }, + { 205, 206, 0, 0, 1900, 1900,0.000000 }, + { 207, 208, 0, 0, 1986, 1986,0.000000 }, + { 209, 210, 0, 0, 760, 760,0.000000 }, + { 211, 212, 0, 0, 40000, 6,0.000000 }, + { 213, 213, 0, 0, 1613, 0,0.000000 }, + { 214, 215, 0, 0, 3260, 3260,0.000000 }, + { 216, 217, 0, 0, 360, 360,0.000000 }, + { 218, 219, 0, 0, 1020, 1020,0.000000 }, + { 220, 221, 0, 0, 2126, 2126,0.000000 }, + { 222, 223, 0, 0, 300, 13,0.000000 }, + { 224, 224, 0, 0, 1740, 1740,0.000000 }, + { 225, 226, 0, 0, 1720, 1720,0.000000 }, + { 227, 227, 0, 0, 146, 146,0.000000 }, + { 228, 228, 0, 0, 186, 40,0.000000 }, + { 229, 230, 0, 0, 40000, 46,0.000000 }, + { 231, 232, 0, 0, 40000, 66,0.000000 }, + { 233, 234, 0, 0, 40000, 266,0.000000 }, + { 235, 236, 0, 0, 160, 160,0.000000 }, + { 235, 237, 0, 0, 386, 386,0.000000 }, + { 46, 238, 0, 0, 1046, 1046,0.000000 }, + { 239, 240, 0, 0, 40000, 66,0.000000 }, + { 241, 242, 0, 0, 720, 46,0.000000 }, + { 243, 243, 0, 0, 40000, 33,0.000000 }, + { 244, 244, 0, 0, 40000, 6,0.000000 }, + { 245, 245, 0, 0, 40000, 13,0.000000 }, + { 246, 247, 0, 0, 466, 466,0.000000 }, + { 248, 249, 0, 0, 1213, 13,0.000000 }, + { 250, 250, 0, 0, 60, 6,0.000000 }, + { 251, 251, 0, 0, 40000, 66,0.000000 }, + { 252, 253, 0, 0, 40000, 6,0.000000 }, + { 254, 255, 0, 0, 40000, 26,0.000000 }, + { 256, 257, 0, 0, 166, 0,0.000000 }, + { 258, 259, 0, 0, 40000, 6,0.000000 }, + { 260, 261, 0, 0, 40000, 20,0.000000 }, + { 262, 263, 0, 0, 40000, 26,0.000000 }, + { 264, 265, 0, 0, 40000, 40,0.000000 }, + { 266, 267, 0, 0, 40000, 6,0.000000 }, + { 268, 269, 0, 0, 40000, 20,0.000000 }, + { 270, 271, 0, 0, 40000, 13,0.000000 }, + { 272, 273, 0, 0, 40000, 60,0.000000 }, + { 274, 275, 0, 0, 40000, 33,0.000000 }, + { 276, 276, 0, 0, 40000, 20,0.000000 }, + { 277, 278, 0, 0, 40000, 73,0.000000 }, + { 279, 280, 0, 0, 40000, 33,0.000000 }, + { 281, 282, 0, 0, 40000, 73,0.000000 }, + { 283, 283, 0, 0, 40000, 13,0.000000 }, + { 284, 285, 0, 0, 40000, 6,0.000000 }, + { 286, 287, 0, 0, 40000, 20,0.000000 }, + { 288, 288, 0, 0, 40000, 33,0.000000 }, + { 289, 290, 0, 0, 40000, 6,0.000000 }, + { 291, 292, 0, 0, 40000, 73,0.000000 }, + { 293, 294, 0, 0, 40000, 106,0.000000 }, + { 295, 296, 0, 0, 40000, 180,0.000000 }, + { 88, 297, 0, 0, 40000, 500,0.000000 }, + { 298, 299, 0, 0, 40000, 26,0.000000 }, + { 300, 301, 0, 0, 40000, 553,0.000000 }, + { 302, 302, 0, 0, 40000, 126,0.000000 }, + { 303, 303, 0, 0, 40000, 53,0.000000 }, + { 304, 304, 0, 0, 1793, 1793,0.000000 }, + { 305, 306, 0, 0, 40000, 300,0.000000 }, + { 307, 307, 0, 0, 1900, 1900,0.000000 }, + { 308, 308, 0, 0, 146, 146,0.000000 }, + { 309, 309, 0, 0, 40000, 580,0.000000 }, + { 310, 310, 0, 0, 40000, 480,0.000000 }, + { 311, 312, 0, 0, 2273, 2273,0.000000 }, + { 313, 314, 0, 0, 1140, 1140,0.000000 }, + { 315, 316, 0, 0, 560, 560,0.000000 }, + { 317, 318, 0, 0, 1080, 1080,0.000000 }, + { 107, 319, 0, 0, 280, 280,0.000000 }, + { 108, 320, 0, 0, 40000, 6,0.000000 }, + { 109, 321, 0, 0, 40000, 46,0.000000 }, + { 322, 323, 0, 0, 40000, 6,0.000000 }, + { 324, 325, 0, 0, 146, 146,0.000000 }, + { 326, 327, 0, 0, 246, 246,0.000000 }, + { 328, 328, 0, 0, 26, 26,0.000000 }, + { 329, 329, 0, 0, 140, 140,0.000000 }, + { 330, 331, 0, 0, 40, 40,0.000000 }, + { 332, 332, 0, 0, 2313, 2313,0.000000 }, + { 333, 333, 0, 0, 86, 86,0.000000 }, + { 334, 334, 0, 0, 3440, 3440,0.000000 }, + { 335, 335, 0, 0, 146, 146,0.000000 }, + { 336, 336, 0, 0, 2406, 2406,0.000000 }, + { 337, 337, 0, 0, 40000, 146,0.000000 }, + { 338, 339, 0, 0, 40000, 113,0.000000 }, + { 340, 341, 0, 0, 40000, 0,0.000000 }, + { 342, 342, 35, 0, 446, 446,0.000000 }, + { 343, 343, 0, 0, 20, 20,0.000000 }, + { 344, 344, 35, 0, 86, 86,0.000000 }, + { 345, 345, 35, 0, 26, 26,0.000000 }, + { 346, 346, 50, 0, 153, 153,0.000000 }, + { 347, 347, 18, 0, 53, 53,0.000000 }, + { 348, 348, 72, 0, 53, 53,0.000000 }, + { 349, 349, 74, 0, 33, 33,0.000000 }, + { 350, 350, 35, 0, 66, 66,0.000000 }, + { 351, 351, 16, 0, 86, 86,0.000000 }, + { 352, 352, 0, 0, 1513, 13,0.000000 }, + { 353, 353, 38, 0, 53, 53,0.000000 }, + { 354, 354, 38, 0, 100, 100,0.000000 }, + { 355, 355, 31, 0, 33, 33,0.000000 }, + { 355, 355, 35, 0, 33, 33,0.000000 }, + { 355, 355, 38, 0, 193, 193,0.000000 }, + { 355, 355, 41, 0, 166, 166,0.000000 }, + { 355, 355, 45, 0, 126, 126,0.000000 }, + { 355, 355, 50, 0, 146, 146,0.000000 }, + { 356, 356, 36, 0, 100, 100,0.000000 }, + { 357, 357, 36, 0, 26, 26,0.000000 }, + { 358, 358, 48, 0, 73, 73,0.000000 }, + { 358, 358, 36, 0, 100, 100,0.000000 }, + { 359, 359, 36, 0, 20, 20,0.000000 }, + { 360, 360, 0, 0, 33, 33,0.000000 }, + { 361, 361, 61, 0, 60, 60,0.000000 }, + { 362, 362, 96, 0, 233, 233,0.000000 }, + { 363, 363, 38, 0, 60, 60,0.000000 }, + { 127, 127, 16, 0, 66, 66,0.000000 }, + { 364, 365, 18, 0, 13, 13,0.000000 }, + { 366, 366, 30, 0, 106, 106,0.000000 }, + { 367, 368, 35, 0, 73, 73,0.000000 }, + { 129, 129, 0, 0, 73, 73,0.000000 }, + { 369, 369, 0, 0, 66, 66,0.000000 }, + { 370, 370, 88, 0, 86, 86,0.000000 }, + { 371, 371, 88, 0, 60, 60,0.000000 }, + { 372, 372, 79, 0, 380, 380,0.000000 }, + { 135, 135, 14, 0, 860, 860,0.000000 }, + { 373, 373, 46, 0, 313, 313,0.000000 }, + { 374, 375,129, 0, 1613, 60,0.000000 }, + { 376, 376, 58, 0, 140, 140,0.000000 }, + { 377, 377,164, 0, 106, 106,0.000000 }, + { 378, 378,142, 0, 2300, 2300,0.000000 }, + { 379, 379, 9, 0, 40, 40,0.000000 }, + { 380, 381, 35, 0, 3306, 0,0.000000 }, + { 382, 382, 28, 0, 26, 26,0.000000 }, + { 383, 383, 46, 0, 320, 320,0.000000 }, + { 384, 384, 60, 0, 93, 93,0.000000 }, + { 384, 384, 54, 0, 100, 100,0.000000 }, + { 385, 385, 72, 0, 60, 60,0.000000 }, + { 385, 385, 67, 0, 60, 60,0.000000 }, + { 385, 385, 60, 0, 53, 53,0.000000 }, + { 386, 386, 1, 0, 46, 46,0.000000 }, + { 387, 387, 77, 0, 133, 133,0.000000 }, + { 387, 387, 72, 0, 133, 133,0.000000 }, + { 388, 388, 90, 0, 46, 46,0.000000 }, + { 389, 389, 39, 0, 180, 180,0.000000 }, + { 390, 390, 36, 0, 506, 506,0.000000 }, + { 391, 392, 35, 0, 20, 20,0.000000 }, + { 391, 393, 35, 0, 20, 20,0.000000 }, + { 394, 394, 60, 0, 40, 40,0.000000 }, + { 328, 328, 7, 0, 26, 26,0.000000 }, + { 395, 395, 90, 0, 80, 80,0.000000 }, + { 396, 396, 90, 0, 306, 306,0.000000 }, + { 397, 397, 35, 0, 106, 106,0.000000 }, + { 398, 399, 5, 0, 506, 506,0.000000 }, + { 400, 400,103, 0, 220, 220,0.000000 }, + { 401, 401, 3, 0, 6, 6,0.000000 }, + { 169, 169, 1, 0, 40, 40,0.000000 }, + { 131, 131, 0, 0, 40, 40,0.000000 }, + { 402, 402, 36, 0, 180, 180,0.000000 }, + { 403, 403, 60, 0, 40000, 0,0.000000 }, + { 404, 404, 37, 0, 60, 60,0.000000 }, + { 405, 405, 36, 0, 46, 46,0.000000 }, + { 406, 406, 32, 0, 40, 40,0.000000 }, + { 407, 407, 50, 0, 306, 306,0.000000 }, + { 408, 408, 50, 0, 93, 93,0.000000 }, + { 409, 409, 83, 0, 26, 26,0.000000 }, + { 410, 410, 72, 0, 93, 93,0.000000 }, + { 148, 148, 59, 0, 153, 153,0.000000 }, + { 411, 411, 64, 0, 40, 40,0.000000 }, + { 411, 411, 60, 0, 40, 40,0.000000 }, + { 412, 412, 72, 0, 26, 26,0.000000 }, + { 412, 412, 62, 0, 33, 33,0.000000 }, + { 413, 413, 83, 0, 273, 273,0.000000 }, + { 414, 414, 0, 0, 40000, 13,0.000000 }, + { 415, 415, 0, 0, 1126, 1126,0.000000 }, + { 416, 416, 0, 0, 40000, 20,0.000000 }, + { 417, 417, 0, 0, 2940, 20,0.000000 }, + { 418, 418, 0, 0, 2233, 2233,0.000000 }, + { 419, 419, 0, 0, 1233, 1233,0.000000 }, + { 420, 420, 0, 0, 940, 940,0.000000 }, + { 421, 421, 0, 0, 1580, 1580,0.000000 }, + { 422, 422, 0, 0, 1740, 1740,0.000000 }, + { 423, 423, 0, 0, 140, 140,0.000000 }, + { 424, 424, 0, 0, 940, 940,0.000000 }, + { 425, 425, 0, 0, 1080, 1080,0.000000 }, + { 426, 426, 0, 0, 2086, 2086,0.000000 }, + { 427, 427, 0, 0, 40000, 26,0.000000 }, + { 428, 428, 60, 0, 40000, 0,0.000000 }, + { 429, 429, 73, 0, 473, 473,0.000000 }, + { 429, 429, 74, 0, 473, 473,0.000000 }, + { 429, 429, 80, 0, 473, 473,0.000000 }, + { 429, 429, 84, 0, 473, 473,0.000000 }, + { 429, 429, 92, 0, 400, 400,0.000000 }, + { 430, 430, 81, 0, 280, 280,0.000000 }, + { 430, 430, 83, 0, 280, 280,0.000000 }, + { 430, 430, 95, 0, 220, 220,0.000000 }, + { 431, 431, 35, 0, 46, 46,0.000000 }, + { 432, 432, 60, 0, 40, 40,0.000000 }, + { 357, 357, 59, 0, 13, 13,0.000000 }, + { 432, 432, 44, 0, 40, 40,0.000000 }, + { 433, 433, 41, 0, 166, 166,0.000000 }, + { 434, 434, 97, 0, 26, 26,0.000000 }, + { 433, 433, 44, 0, 140, 140,0.000000 }, + { 433, 433, 48, 0, 153, 153,0.000000 }, + { 435, 435, 96, 0, 233, 233,0.000000 }, + { 433, 433, 51, 0, 160, 160,0.000000 }, + { 433, 433, 54, 0, 160, 160,0.000000 }, + { 436, 436, 40, 0, 386, 386,0.000000 }, + { 433, 433, 57, 0, 113, 113,0.000000 }, + { 437, 437, 58, 0, 120, 120,0.000000 }, + { 438, 438, 97, 0, 73, 73,0.000000 }, + { 439, 439, 50, 0, 60, 60,0.000000 }, + { 437, 437, 60, 0, 153, 153,0.000000 }, + { 440, 440, 53, 0, 53, 53,0.000000 }, + { 441, 441, 46, 0, 46, 46,0.000000 }, + { 440, 440, 57, 0, 53, 53,0.000000 }, + { 442, 442, 42, 0, 206, 206,0.000000 }, + { 442, 442, 37, 0, 206, 206,0.000000 }, + { 443, 443, 41, 0, 193, 193,0.000000 }, + { 443, 443, 37, 0, 193, 193,0.000000 }, + { 444, 444, 77, 0, 46, 46,0.000000 }, + { 444, 444, 72, 0, 46, 46,0.000000 }, + { 445, 445, 70, 0, 60, 60,0.000000 }, + { 445, 445, 90, 0, 60, 60,0.000000 }, + { 446, 446, 46, 0, 46, 46,0.000000 }, + { 447, 447, 48, 0, 246, 246,0.000000 }, + { 448, 448, 85, 0, 20, 20,0.000000 }, + { 449, 449, 66, 0, 60, 60,0.000000 }, + { 449, 449, 61, 0, 60, 60,0.000000 }, + { 450, 450, 41, 0, 106, 106,0.000000 }, + { 451, 451, 41, 0, 140, 140,0.000000 }, + { 452, 452, 81, 0, 66, 66,0.000000 }, + { 400, 400, 81, 0, 266, 266,0.000000 }, + { 400, 400, 76, 0, 266, 266,0.000000 }, + { 359, 359, 60, 0, 13, 13,0.000000 }, + { 453, 453, 53, 0, 120, 120,0.000000 }, + { 454, 454, 0, 0, 40000, 0,0.000000 }, + { 455, 455, 0, 0, 40, 40,0.000000 }, + { 456, 456, 0, 0, 1080, 1080,0.000000 }, + { 457, 457, 0, 0, 126, 126,0.000000 }, + { 458, 458, 0, 0, 40000, 26,0.000000 }, + { 459, 459, 0, 0, 40000, 6,0.000000 }, + { 460, 460, 0, 0, 700, 700,0.000000 }, + { 461, 461, 0, 0, 280, 280,0.000000 }, + { 462, 462, 0, 0, 360, 360,0.000000 }, + { 463, 463, 0, 0, 40000, 20,0.000000 }, + { 464, 464, 0, 0, 1466, 13,0.000000 }, + { 465, 465, 0, 0, 40000, 33,0.000000 }, + { 466, 466, 0, 0, 40000, 33,0.000000 }, + { 467, 467, 0, 0, 1953, 1953,0.000000 }, + { 468, 468, 0, 0, 1580, 1580,0.000000 }, + { 469, 469, 0, 0, 1340, 1340,0.000000 }, + { 470, 470, 0, 0, 40000, 0,0.000000 }, + { 471, 471, 0, 0, 40000, 53,0.000000 }, + { 472, 472, 0, 0, 1386, 1386,0.000000 }, + { 473, 473, 0, 0, 560, 13,0.000000 }, + { 474, 474, 0, 0, 40000, 66,0.000000 }, + { 475, 475, 0, 0, 593, 593,0.000000 }, + { 476, 476, 0, 0, 40000, 2446,0.000000 }, + { 477, 477, 0, 0, 60, 60,0.000000 }, + { 478, 478, 0, 0, 220, 220,0.000000 }, + { 479, 479, 0, 0, 153, 153,0.000000 }, + { 480, 480, 0, 0, 20, 20,0.000000 }, + { 481, 481, 0, 0, 40000, 0,0.000000 }, + { 482, 482, 0, 0, 753, 753,0.000000 }, + { 483, 483, 0, 0, 100, 100,0.000000 }, + { 484, 484, 0, 0, 40000, 73,0.000000 }, + { 485, 485, 0, 0, 2600, 320,0.000000 }, + { 486, 486, 0, 0, 293, 293,0.000000 }, + { 487, 487, 0, 0, 1400, 1400,0.000000 }, + { 488, 488, 0, 0, 2073, 2073,0.000000 }, + { 489, 489, 0, 0, 80, 80,0.000000 }, + { 490, 490, 0, 0, 40000, 33,0.000000 }, + { 491, 491, 50, 0, 446, 446,0.000000 }, + { 492, 492, 37, 0, 46, 46,0.000000 }, + { 493, 493, 39, 0, 180, 180,0.000000 }, + { 494, 494, 39, 0, 33, 33,0.000000 }, + { 495, 495, 86, 0, 1800, 1800,0.000000 }, + { 496, 496, 43, 0, 33, 33,0.000000 }, + { 127, 127, 24, 0, 46, 46,0.000000 }, + { 127, 127, 29, 0, 33, 33,0.000000 }, + { 497, 497, 50, 0, 153, 153,0.000000 }, + { 498, 498, 30, 0, 100, 100,0.000000 }, + { 498, 498, 33, 0, 413, 413,0.000000 }, + { 498, 498, 38, 0, 1633, 1633,0.000000 }, + { 498, 498, 42, 0, 26, 26,0.000000 }, + { 499, 499, 24, 0, 46, 46,0.000000 }, + { 499, 499, 27, 0, 66, 66,0.000000 }, + { 499, 499, 29, 0, 66, 66,0.000000 }, + { 499, 499, 32, 0, 53, 53,0.000000 }, + { 500, 500, 32, 0, 13, 13,0.000000 }, + { 501, 501, 53, 0, 86, 86,0.000000 }, + { 501, 501, 57, 0, 86, 86,0.000000 }, + { 502, 502, 60, 0, 80, 80,0.000000 }, + { 503, 503, 55, 0, 160, 160,0.000000 }, + { 486, 486, 85, 0, 266, 266,0.000000 }, + { 504, 504, 90, 0, 453, 453,0.000000 }, + { 505, 505, 84, 0, 73, 73,0.000000 }, + { 506, 506, 48, 0, 160, 160,0.000000 }, + { 507, 507, 48, 0, 40, 40,0.000000 }, + { 132, 132, 72, 0, 13, 13,0.000000 }, + { 508, 508, 72, 0, 13, 13,0.000000 }, + { 509, 509, 72, 0, 13, 13,0.000000 }, + { 510, 510, 63, 0, 533, 533,0.000000 }, + { 510, 510, 65, 0, 526, 526,0.000000 }, + { 511, 511, 79, 0, 506, 506,0.000000 }, + { 512, 512, 38, 0, 113, 113,0.000000 }, + { 513, 513, 94, 0, 100, 100,0.000000 }, + { 514, 514, 87, 0, 113, 113,0.000000 }, + { 514, 514, 94, 0, 100, 100,0.000000 }, + { 515, 515, 80, 0, 66, 66,0.000000 }, + { 516, 516, 47, 0, 140, 140,0.000000 }, + { 517, 517, 61, 0, 80, 80,0.000000 }, + { 517, 517, 68, 0, 66, 66,0.000000 }, + { 518, 518, 61, 0, 160, 160,0.000000 }, + { 518, 518, 68, 0, 126, 126,0.000000 }, + { 499, 499, 60, 0, 46, 46,0.000000 }, + { 519, 519, 60, 0, 60, 60,0.000000 }, + { 520, 520, 36, 0, 53, 53,0.000000 }, + { 520, 520, 60, 0, 40, 40,0.000000 }, + { 521, 521, 60, 0, 40, 40,0.000000 }, + { 522, 522, 68, 0, 20, 20,0.000000 }, + { 523, 523, 71, 0, 33, 33,0.000000 }, + { 523, 523, 72, 0, 33, 33,0.000000 }, + { 524, 524,101, 0, 320, 320,0.000000 }, + { 525, 525, 36, 0, 1680, 1680,0.000000 }, + { 526, 526, 25, 0, 40000, 2286,0.000000 }, + { 527, 527, 37, 0, 400, 400,0.000000 }, + { 528, 528, 36, 0, 146, 146,0.000000 }, + { 528, 528, 41, 0, 166, 166,0.000000 }, + { 529, 529, 84, 0, 73, 73,0.000000 }, + { 530, 530, 54, 0, 1326, 1326,0.000000 }, + { 481, 481, 48, 0, 40000, 0,0.000000 }, + { 531, 531, 0, 0, 2266, 2266,0.000000 }, + { 532, 532, 0, 0, 833, 833,0.000000 }, + { 533, 533, 0, 0, 246, 13,0.000000 }, + { 534, 534, 0, 0, 40000, 6,0.000000 }, + { 535, 535, 0, 0, 4140, 26,0.000000 }, + { 536, 536, 0, 0, 3886, 13,0.000000 }, + { 537, 537, 0, 0, 4886, 4886,0.000000 }, + { 538, 538, 0, 0, 1780, 1780,0.000000 }, + { 539, 539, 0, 0, 4140, 26,0.000000 }, + { 540, 540, 0, 0, 40000, 6,0.000000 }, + { 541, 541, 0, 0, 3946, 13,0.000000 }, + { 542, 542, 0, 0, 40, 40,0.000000 }, + { 543, 543, 0, 0, 40000, 13,0.000000 }, + { 544, 544, 0, 0, 4426, 4426,0.000000 }, + { 545, 545, 0, 0, 40000, 493,0.000000 }, + { 546, 546, 0, 0, 40000, 846,0.000000 }, + { 547, 547, 0, 0, 40000, 53,0.000000 }, + { 135, 135, 49, 0, 1146, 1146,0.000000 }, + { 548, 548, 35, 0, 40, 40,0.000000 }, + { 549, 549, 41, 0, 6, 6,0.000000 }, + { 366, 366, 38, 0, 106, 106,0.000000 }, + { 550, 550, 39, 0, 26, 26,0.000000 }, + { 551, 551, 49, 0, 46, 46,0.000000 }, + { 408, 408, 59, 0, 93, 93,0.000000 }, + { 552, 552, 24, 0, 26, 26,0.000000 }, + { 552, 552, 27, 0, 40, 20,0.000000 }, + { 552, 552, 29, 0, 20, 20,0.000000 }, + { 552, 552, 32, 0, 40, 13,0.000000 }, + { 553, 553, 84, 0, 113, 113,0.000000 }, + { 512, 512, 79, 0, 73, 73,0.000000 }, + { 554, 554, 61, 0, 173, 173,0.000000 }, + { 554, 554, 68, 0, 133, 133,0.000000 }, + { 555, 555, 36, 0, 33, 33,0.000000 }, + { 555, 555, 60, 0, 20, 20,0.000000 }, + { 556, 556, 36, 0, 180, 180,0.000000 }, + { 115, 115, 37, 0, 46, 46,0.000000 }, + { 557, 557, 0, 0, 1066, 1066,0.000000 }, + { 558, 558, 0, 0, 273, 273,0.000000 }, + { 559, 559, 0, 0, 186, 186,0.000000 }, + { 560, 560, 0, 0, 966, 966,0.000000 }, + { 561, 561, 0, 0, 80, 80,0.000000 }, + { 562, 562, 0, 0, 326, 326,0.000000 }, + { 563, 563, 0, 0, 40000, 33,0.000000 }, + { 564, 564, 0, 0, 380, 380,0.000000 }, + { 565, 565, 0, 0, 40, 40,0.000000 }, + { 566, 566, 0, 0, 4586, 4586,0.000000 }, + { 567, 567, 0, 0, 2680, 2680,0.000000 }, + { 568, 568, 0, 0, 40000, 6,0.000000 }, + { 569, 569, 0, 0, 80, 80,0.000000 }, + { 570, 570, 0, 0, 1206, 1206,0.000000 }, + { 571, 571, 0, 0, 593, 593,0.000000 }, + { 572, 572, 0, 0, 680, 680,0.000000 }, + { 356, 356, 0, 0, 246, 246,0.000000 }, + { 573, 573, 0, 0, 40000, 20,0.000000 }, + { 574, 574, 0, 0, 40000, 20,0.000000 }, + { 575, 575, 0, 0, 40000, 73,0.000000 }, + { 576, 576, 0, 0, 40000, 53,0.000000 }, + { 577, 577, 0, 0, 40000, 33,0.000000 }, + { 578, 578, 0, 0, 40000, 140,0.000000 }, + { 579, 579, 0, 0, 40000, 93,0.000000 }, + { 580, 580, 0, 0, 40000, 126,0.000000 }, + { 581, 581, 0, 0, 40000, 26,0.000000 }, + { 582, 582, 0, 0, 40000, 53,0.000000 }, + { 583, 583, 0, 0, 513, 513,0.000000 }, + { 584, 584, 0, 0, 40000, 66,0.000000 }, + { 585, 585, 0, 0, 313, 313,0.000000 }, + { 516, 516, 0, 0, 140, 140,0.000000 }, + { 586, 586, 0, 0, 40000, 0,0.000000 }, + { 587, 587, 0, 0, 40000, 0,0.000000 }, + { 588, 588, 0, 0, 40000, 6,0.000000 }, + { 498, 498, 26, 0, 86, 86,0.000000 }, + { 494, 494, 35, 0, 53, 53,0.000000 }, + { 350, 350, 41, 0, 80, 80,0.000000 }, + { 353, 353, 48, 0, 40, 40,0.000000 }, + { 354, 354, 67, 0, 73, 73,0.000000 }, + { 502, 502, 24, 0, 100, 100,0.000000 }, + { 346, 346, 36, 0, 46, 46,0.000000 }, + { 346, 346, 38, 0, 193, 193,0.000000 }, + { 346, 346, 40, 0, 140, 140,0.000000 }, + { 346, 346, 42, 0, 173, 173,0.000000 }, + { 346, 346, 44, 0, 140, 140,0.000000 }, + { 510, 510, 55, 0, 453, 453,0.000000 }, + { 346, 346, 46, 0, 146, 146,0.000000 }, + { 136, 136, 80, 0, 486, 486,0.000000 }, + { 486, 486, 24, 0, 346, 346,0.000000 }, + { 153, 153, 50, 0, 13, 13,0.000000 }, + { 346, 346, 24, 0, 66, 66,0.000000 }, + { 516, 516, 31, 0, 186, 186,0.000000 }, + { 498, 498, 35, 0, 40, 40,0.000000 }, + { 517, 517, 60, 0, 80, 80,0.000000 }, + { 530, 530, 36, 0, 1760, 1760,0.000000 }, + { 530, 530, 48, 0, 1360, 6,0.000000 }, + { 589, 589, 0, 0, 1660, 1660,0.000000 }, + { 139, 139, 76, 0, 73, 73,0.000000 }, + { 156, 156, 48, 0, 80, 80,0.000000 }, + { 157, 157, 48, 0, 226, 226,0.000000 }, + { 165, 165, 69, 0, 40, 40,0.000000 }, + { 167, 167, 75, 0, 133, 133,0.000000 }, + { 590, 590, 0, 0, 1226, 1226,0.000000 }, + { 591, 591, 0, 0, 2193, 2193,0.000000 }, + { 592, 592, 0, 0, 1900, 1900,0.000000 }, + { 593, 593, 0, 0, 626, 626,0.000000 }, + { 594, 594, 0, 0, 1213, 1213,0.000000 }, + { 595, 595, 0, 0, 1740, 1740,0.000000 }, + { 596, 596, 0, 0, 193, 193,0.000000 }, + { 597, 597, 0, 0, 300, 300,0.000000 }, + { 598, 598, 0, 0, 40000, 6,0.000000 }, + { 599, 599, 0, 0, 40000, 480,0.000000 }, + { 600, 600, 0, 0, 40000, 20,0.000000 }, + { 601, 601, 0, 0, 653, 653,0.000000 }, + { 602, 602, 0, 0, 126, 126,0.000000 }, + { 603, 603, 0, 0, 1080, 1080,0.000000 }, + { 604, 604, 0, 0, 4200, 4200,0.000000 }, + { 605, 605, 0, 0, 1020, 1020,0.000000 }, + { 606, 606, 0, 0, 593, 13,0.000000 }, + { 607, 607, 0, 0, 80, 60,0.000000 }, + { 608, 608, 0, 0, 40000, 113,0.000000 }, + { 609, 609, 0, 0, 120, 120,0.000000 }, + { 610, 610, 0, 0, 1580, 1580,0.000000 }, + { 611, 611, 0, 0, 460, 460,0.000000 }, + { 612, 612, 0, 0, 40000, 53,0.000000 }, + { 613, 613, 0, 0, 2320, 13,0.000000 }, + { 614, 614, 0, 0, 80, 60,0.000000 }, + { 615, 615, 0, 0, 80, 60,0.000000 }, + { 616, 616, 0, 0, 1020, 1020,0.000000 }, + { 617, 617, 0, 0, 146, 146,0.000000 }, + { 618, 618, 0, 0, 740, 740,0.000000 }, + { 619, 619, 0, 0, 146, 146,0.000000 }, + { 620, 620, 0, 0, 40000, 6,0.000000 }, + { 621, 621, 0, 0, 913, 913,0.000000 }, + { 622, 622, 0, 0, 2280, 2280,0.000000 }, + { 623, 623, 0, 0, 166, 6,0.000000 }, + { 624, 624, 0, 0, 40000, 0,0.000000 }, + { 625, 625, 0, 0, 40000, 0,0.000000 }, + { 626, 626, 0, 0, 40000, 0,0.000000 }, + { 627, 627, 0, 0, 1046, 1046,0.000000 }, + { 628, 628, 0, 0, 40000, 6,0.000000 }, + { 629, 629, 0, 0, 40000, 0,0.000000 }, + { 630, 630, 0, 0, 1953, 1953,0.000000 }, + { 631, 631, 0, 0, 40000, 106,0.000000 }, + { 632, 632, 0, 0, 533, 13,0.000000 }, + { 633, 633, 0, 0, 2273, 2273,0.000000 }, + { 634, 634, 0, 0, 646, 646,0.000000 }, + { 635, 635, 0, 0, 166, 166,0.000000 }, + { 636, 636, 0, 0, 326, 326,0.000000 }, + { 637, 637, 0, 0, 40000, 26,0.000000 }, + { 638, 638, 0, 0, 246, 246,0.000000 }, + { 346, 346, 0, 0, 140, 140,0.000000 }, + { 639, 639, 0, 0, 1226, 1226,0.000000 }, + { 404, 404, 0, 0, 146, 146,0.000000 }, + { 506, 506, 0, 0, 153, 153,0.000000 }, + { 639, 639, 60, 0, 886, 886,0.000000 }, + { 639, 639, 79, 0, 446, 446,0.000000 }, + { 640, 640, 65, 0, 800, 800,0.000000 }, + { 486, 486, 31, 0, 353, 353,0.000000 }, + { 486, 486, 36, 0, 360, 360,0.000000 }, + { 640, 640, 72, 0, 613, 613,0.000000 }, + { 136, 136, 79, 0, 493, 493,0.000000 }, + { 148, 148, 57, 0, 160, 160,0.000000 }, + { 150, 150, 53, 0, 153, 153,0.000000 }, + { 641, 641, 84, 0, 106, 106,0.000000 }, + { 520, 520, 66, 0, 40, 40,0.000000 }, + { 642, 642, 31, 0, 166, 13,0.000000 }, + { 642, 642, 29, 0, 60, 26,0.000000 }, + { 356, 356, 31, 0, 93, 93,0.000000 }, + { 356, 356, 19, 0, 220, 220,0.000000 }, + { 643, 643, 31, 0, 40000, 6,0.000000 }, + { 643, 643, 29, 0, 40000, 6,0.000000 }, + { 644, 644, 31, 0, 560, 560,0.000000 }, + { 644, 644, 35, 0, 573, 573,0.000000 }, + { 644, 644, 40, 0, 526, 526,0.000000 }, + { 644, 644, 47, 0, 540, 540,0.000000 }, + { 516, 516, 32, 0, 186, 186,0.000000 }, + { 516, 516, 43, 0, 146, 146,0.000000 }, + { 495, 495, 26, 0, 60, 60,0.000000 }, + { 495, 495, 44, 0, 380, 380,0.000000 }, + { 496, 496, 26, 0, 26, 26,0.000000 }, + { 496, 496, 51, 0, 40, 40,0.000000 }, + { 496, 496, 39, 0, 33, 33,0.000000 }, + { 495, 495, 30, 0, 46, 46,0.000000 }, + { 645, 645, 44, 0, 486, 486,0.000000 }, + { 645, 645, 43, 0, 473, 473,0.000000 }, + { 646, 646, 0, 0, 653, 653,0.000000 }, + { 647, 647, 0, 0, 2280, 2280,0.000000 }, + { 648, 648, 0, 0, 526, 526,0.000000 }, + { 649, 649, 0, 0, 40000, 40,0.000000 }, + { 650, 650, 0, 0, 40, 40,0.000000 }, + { 651, 651, 0, 0, 933, 933,0.000000 }, + { 652, 652, 0, 0, 40000, 300,0.000000 }, + { 653, 653, 0, 0, 280, 280,0.000000 }, + { 654, 654, 0, 0, 40000, 6,0.000000 }, + { 655, 655, 0, 0, 40000, 0,0.000000 }, + { 656, 656, 0, 0, 40000, 6,0.000000 }, + { 657, 657, 0, 0, 280, 280,0.000000 }, + { 658, 658, 0, 0, 513, 513,0.000000 }, + { 659, 659, 0, 0, 40000, 6,0.000000 }, + { 660, 660, 0, 0, 600, 600,0.000000 }, + { 661, 661, 0, 0, 646, 646,0.000000 }, + { 662, 662, 0, 0, 1166, 1166,0.000000 }, + { 663, 663, 0, 0, 40, 40,0.000000 }, + { 664, 664, 0, 0, 2073, 2073,0.000000 }, + { 665, 665, 0, 0, 40000, 106,0.000000 }, + { 666, 666, 0, 0, 40000, 146,0.000000 }, + { 667, 667, 0, 0, 40000, 126,0.000000 }, + { 668, 668, 0, 0, 280, 280,0.000000 }, + { 669, 669, 0, 0, 40000, 73,0.000000 }, + { 670, 670, 0, 0, 393, 393,0.000000 }, + { 671, 671, 0, 0, 760, 760,0.000000 }, + { 672, 672, 0, 0, 40000, 233,0.000000 }, + { 673, 673, 0, 0, 253, 253,0.000000 }, + { 674, 674, 0, 0, 186, 186,0.000000 }, + { 675, 675, 0, 0, 40000, 46,0.000000 }, + { 676, 676, 0, 0, 4773, 4773,0.000000 }, + { 677, 677, 0, 0, 2186, 2186,0.000000 }, + { 678, 678, 0, 0, 313, 313,0.000000 }, + { 679, 679, 0, 0, 1226, 1226,0.000000 }, + { 680, 680, 0, 0, 526, 13,0.000000 }, + { 681, 681, 0, 0, 40000, 0,0.000000 }, + { 682, 682, 0, 0, 40, 46,0.000000 }, + { 683, 683, 0, 0, 146, 146,0.000000 }, + { 684, 684, 0, 0, 2193, 2193,0.000000 }, + { 685, 685, 0, 0, 40000, 220,0.000000 }, + { 686, 686, 0, 0, 40000, 560,0.000000 }, + { 687, 687, 0, 0, 86, 86,0.000000 }, + { 688, 688, 0, 0, 40000, 1326,0.000000 }, + { 689, 689, 0, 0, 1166, 1166,0.000000 }, + { 690, 690, 0, 0, 593, 593,0.000000 }, + { 691, 691, 0, 0, 1580, 1580,0.000000 }, + { 692, 692, 0, 0, 513, 513,0.000000 }, + { 693, 693, 0, 0, 333, 333,0.000000 }, + { 694, 694, 0, 0, 1200, 1200,0.000000 }, + { 695, 695, 0, 0, 40000, 6,0.000000 }, + { 645, 645, 0, 0, 486, 486,0.000000 }, + { 696, 696, 0, 0, 40000, 6,0.000000 }, + { 697, 697, 0, 0, 333, 333,0.000000 }, + { 698, 698, 0, 0, 120, 120,0.000000 }, + { 699, 699, 0, 0, 40000, 6,0.000000 }, + { 700, 700, 0, 0, 13, 13,0.000000 }, + { 701, 701, 0, 0, 40000, 53,0.000000 }, + { 702, 702, 0, 0, 806, 806,0.000000 }, + { 703, 703, 0, 0, 40000, 6,0.000000 }, + { 704, 704, 0, 0, 40000, 6,0.000000 }, + { 705, 705, 0, 0, 40000, 0,0.000000 }, + { 706, 706, 0, 0, 40000, 6,0.000000 }, + { 707, 707, 0, 0, 40000, 166,0.000000 }, + { 708, 708, 0, 0, 40000, 26,0.000000 }, + { 709, 709, 0, 0, 40000, 146,0.000000 }, + { 710, 710, 0, 0, 1233, 6,0.000000 }, + { 711, 711, 0, 0, 146, 146,0.000000 }, + { 712, 712, 0, 0, 40000, 6,0.000000 }, + { 713, 713, 0, 0, 40000, 66,0.000000 }, + { 714, 714, 0, 0, 40000, 393,0.000000 }, + { 715, 715, 0, 0, 40000, 93,0.000000 }, + { 716, 716, 0, 0, 620, 620,0.000000 }, + { 717, 717, 0, 0, 40000, 6,0.000000 }, + { 718, 718, 0, 0, 493, 493,0.000000 }, + { 719, 719, 0, 0, 280, 280,0.000000 }, + { 720, 720, 0, 0, 760, 760,0.000000 }, + { 721, 721, 0, 0, 160, 160,0.000000 }, + { 722, 722, 0, 0, 40000, 106,0.000000 }, + { 723, 723, 0, 0, 166, 166,0.000000 }, + { 724, 724, 0, 0, 40000, 6,0.000000 }, + { 725, 725, 0, 0, 126, 126,0.000000 }, + { 726, 726, 0, 0, 593, 593,0.000000 }, + { 727, 727, 0, 0, 513, 513,0.000000 }, + { 728, 728, 0, 0, 246, 246,0.000000 }, + { 507, 507, 0, 0, 40, 40,0.000000 }, + { 512, 512, 0, 0, 93, 93,0.000000 }, + { 729, 729, 0, 0, 2406, 2406,0.000000 }, + { 730, 730, 0, 0, 2400, 2400,0.000000 }, + { 731, 731, 0, 0, 1153, 1153,0.000000 }, + { 732, 732, 0, 0, 40000, 1113,0.000000 }, + { 733, 733, 0, 0, 40000, 613,0.000000 }, + { 734, 734, 0, 0, 4453, 4453,0.000000 }, + { 735, 735, 0, 0, 160, 160,0.000000 }, + { 736, 736, 0, 0, 80, 80,0.000000 }, + { 737, 737, 0, 0, 1513, 13,0.000000 }, + { 738, 738, 38, 0, 33, 33,0.000000 }, + { 739, 739, 44, 0, 40, 40,0.000000 }, + { 500, 500, 58, 0, 13, 13,0.000000 }, + { 740, 740, 24, 0, 160, 160,0.000000 }, + { 741, 741, 60, 0, 133, 133,0.000000 }, + { 736, 736, 44, 0, 80, 80,0.000000 }, + { 742, 742, 25, 0, 146, 146,0.000000 }, + { 743, 743, 60, 0, 33, 33,0.000000 }, + { 742, 742, 30, 0, 146, 146,0.000000 }, + { 377, 377, 60, 0, 93, 93,0.000000 }, + { 742, 742, 33, 0, 173, 173,0.000000 }, + { 744, 744, 60, 0, 53, 53,0.000000 }, + { 742, 742, 35, 0, 186, 186,0.000000 }, + { 742, 742, 37, 0, 200, 200,0.000000 }, + { 745, 745, 0, 0, 313, 313,0.000000 }, + { 742, 742, 40, 0, 206, 206,0.000000 }, + { 746, 746,102, 0, 300, 300,0.000000 }, + { 747, 747, 80, 0, 433, 433,0.000000 }, + { 377, 377, 0, 0, 86, 86,0.000000 }, + { 748, 748, 56, 0, 13, 13,0.000000 }, + { 749, 749, 0, 0, 140, 140,0.000000 }, + { 746, 746,100, 0, 280, 280,0.000000 }, + { 750, 750, 40, 0, 200, 200,0.000000 }, + { 750, 750, 35, 0, 200, 200,0.000000 }, + { 751, 751, 29, 0, 53, 53,0.000000 }, + { 750, 750, 29, 0, 200, 200,0.000000 }, + { 750, 750, 22, 0, 206, 206,0.000000 }, + { 500, 500, 0, 0, 13, 13,0.000000 }, + { 752, 752, 0, 0, 46, 46,0.000000 }, + { 753, 753, 84, 0, 86, 86,0.000000 }, + { 754, 754, 84, 0, 506, 506,0.000000 }, + { 755, 755, 0, 0, 160, 160,0.000000 }, + { 755, 755, 71, 0, 133, 133,0.000000 }, + { 755, 755, 53, 0, 160, 160,0.000000 }, + { 755, 755, 48, 0, 160, 160,0.000000 }, + { 756, 756, 95, 0, 200, 200,0.000000 }, + { 757, 757, 95, 0, 613, 613,0.000000 }, + { 758, 758, 0, 0, 866, 866,0.000000 }, + { 759, 759, 0, 0, 933, 933,0.000000 }, + { 760, 760, 0, 0, 2393, 2393,0.000000 }, + { 761, 761, 0, 0, 760, 760,0.000000 }, + { 762, 762, 0, 0, 1740, 1740,0.000000 }, + { 763, 763, 0, 0, 1846, 1846,0.000000 }, + { 764, 764, 0, 0, 2106, 2106,0.000000 }, + { 765, 765, 0, 0, 1193, 1193,0.000000 }, + { 766, 766, 0, 0, 1613, 1613,0.000000 }, + { 767, 767, 0, 0, 673, 673,0.000000 }, + { 768, 768, 0, 0, 280, 280,0.000000 }, + { 769, 769, 0, 0, 1740, 1740,0.000000 }, + { 770, 770, 0, 0, 193, 193,0.000000 }, + { 771, 771, 0, 0, 140, 140,0.000000 }, + { 772, 772, 0, 0, 933, 933,0.000000 }, + { 773, 773, 0, 0, 333, 333,0.000000 }, + { 774, 774, 0, 0, 40000, 6,0.000000 }, + { 775, 775, 0, 0, 40000, 6,0.000000 }, + { 776, 776, 0, 0, 613, 13,0.000000 }, + { 777, 777, 0, 0, 40000, 80,0.000000 }, + { 778, 778, 0, 0, 40000, 26,0.000000 }, + { 779, 779, 0, 0, 40000, 20,0.000000 }, + { 780, 780, 0, 0, 40000, 20,0.000000 }, + { 781, 781, 0, 0, 40000, 66,0.000000 }, + { 782, 782, 0, 0, 940, 940,0.000000 }, + { 783, 783, 0, 0, 566, 566,0.000000 }, + { 784, 784, 0, 0, 1846, 1846,0.000000 }, + { 785, 785, 0, 0, 1120, 1120,0.000000 }, + { 786, 786, 0, 0, 300, 300,0.000000 }, + { 787, 787, 0, 0, 3000, 3000,0.000000 }, + { 788, 788, 0, 0, 3773, 3773,0.000000 }, + { 789, 789, 0, 0, 620, 620,0.000000 }, + { 790, 790, 0, 0, 846, 846,0.000000 }, + { 791, 791, 0, 0, 4846, 4846,0.000000 }, + { 792, 792, 0, 0, 1133, 1133,0.000000 }, + { 793, 793, 0, 0, 1446, 1446,0.000000 }, + { 794, 794, 0, 0, 566, 566,0.000000 }, + { 795, 795, 0, 0, 600, 600,0.000000 }, + { 796, 796, 0, 0, 1180, 1180,0.000000 }, + { 797, 797, 0, 0, 893, 893,0.000000 }, + { 798, 798, 0, 0, 40000, 20,0.000000 }, + { 799, 799, 0, 0, 40000, 20,0.000000 }, + { 800, 800, 0, 0, 166, 40,0.000000 }, + { 801, 801, 0, 0, 2286, 2286,0.000000 }, + { 802, 802, 0, 0, 40000, 86,0.000000 }, + { 803, 803, 0, 0, 120, 120,0.000000 }, + { 804, 804, 0, 0, 440, 440,0.000000 }, + { 805, 805, 0, 0, 286, 286,0.000000 }, + { 806, 806, 0, 0, 40000, 86,0.000000 }, + { 807, 807, 0, 0, 5473, 120,0.000000 }, + { 808, 808, 0, 0, 100, 13,0.000000 }, + { 809, 809, 0, 0, 40000, 53,0.000000 }, + { 810, 810, 0, 0, 1640, 6,0.000000 }, + { 811, 811, 0, 0, 40000, 53,0.000000 }, + { 812, 812, 0, 0, 1026, 13,0.000000 }, + { 813, 813, 0, 0, 186, 186,0.000000 }, + { 814, 814, 0, 0, 40, 40,0.000000 }, + { 815, 815, 0, 0, 40000, 20,0.000000 }, + { 816, 816, 0, 0, 40000, 20,0.000000 }, + { 817, 817, 0, 0, 873, 873,0.000000 }, + { 818, 818, 0, 0, 4440, 4440,0.000000 }, + { 819, 819, 0, 0, 273, 6,0.000000 }, + { 820, 820, 0, 0, 40000, 53,0.000000 }, + { 821, 821, 0, 0, 40000, 106,0.000000 }, + { 822, 822, 0, 0, 40000, 6,0.000000 }, + { 823, 823, 0, 0, 40000, 0,0.000000 }, + { 824, 824, 0, 0, 40000, 13,0.000000 }, + { 825, 825, 0, 0, 40000, 33,0.000000 }, + { 826, 826, 0, 0, 40000, 20,0.000000 }, + { 827, 827, 0, 0, 40000, 6,0.000000 }, + { 828, 828, 0, 0, 40000, 6,0.000000 }, + { 829, 829, 0, 0, 40000, 20,0.000000 }, + { 830, 830, 0, 0, 40000, 20,0.000000 }, + { 831, 831, 0, 0, 40000, 6,0.000000 }, + { 832, 832, 0, 0, 40000, 13,0.000000 }, + { 833, 833, 0, 0, 40000, 20,0.000000 }, + { 834, 834, 0, 0, 40000, 20,0.000000 }, + { 835, 835, 0, 0, 40000, 20,0.000000 }, + { 836, 836, 0, 0, 40000, 33,0.000000 }, + { 837, 837, 0, 0, 40000, 53,0.000000 }, + { 838, 838, 0, 0, 40000, 6,0.000000 }, + { 839, 839, 0, 0, 1153, 1153,0.000000 }, + { 840, 840, 0, 0, 40000, 20,0.000000 }, + { 841, 841, 0, 0, 20, 20,0.000000 }, + { 842, 842, 0, 0, 2040, 2040,0.000000 }, + { 843, 843, 0, 0, 40000, 6,0.000000 }, + { 844, 844, 0, 0, 40000, 13,0.000000 }, + { 845, 845, 0, 0, 1153, 1153,0.000000 }, + { 846, 846, 0, 0, 1526, 80,0.000000 }, + { 847, 847, 0, 0, 40000, 180,0.000000 }, + { 848, 848, 0, 0, 40000, 86,0.000000 }, + { 849, 849, 0, 0, 40000, 26,0.000000 }, + { 850, 850, 0, 0, 40000, 53,0.000000 }, + { 851, 851, 0, 0, 2886, 2886,0.000000 }, + { 852, 852, 0, 0, 40000, 73,0.000000 }, + { 853, 853, 0, 0, 40000, 126,0.000000 }, + { 854, 854, 0, 0, 1706, 1706,0.000000 }, + { 855, 855, 0, 0, 40000, 213,0.000000 }, + { 856, 856, 0, 0, 920, 920,0.000000 }, + { 857, 857, 0, 0, 993, 993,0.000000 }, + { 858, 858, 0, 0, 1613, 1613,0.000000 }, + { 859, 859, 0, 0, 1000, 106,0.000000 }, + { 860, 860, 0, 0, 40000, 20,0.000000 }, + { 861, 861, 0, 0, 40000, 213,0.000000 }, + { 862, 862, 0, 0, 766, 766,0.000000 }, + { 863, 863, 0, 0, 153, 153,0.000000 }, + { 864, 864, 0, 0, 626, 626,0.000000 }, + { 865, 865, 0, 0, 506, 506,0.000000 }, + { 866, 866, 0, 0, 300, 300,0.000000 }, + { 867, 867, 0, 0, 40000, 33,0.000000 }, + { 868, 868, 0, 0, 40000, 33,0.000000 }, + { 869, 869, 0, 0, 40000, 20,0.000000 }, + { 870, 870, 0, 0, 2106, 2106,0.000000 }, + { 871, 871, 0, 0, 93, 93,0.000000 }, + { 872, 872, 0, 0, 213, 213,0.000000 }, + { 361, 361, 0, 0, 80, 80,0.000000 }, + { 873, 873, 0, 0, 100, 100,0.000000 }, + { 874, 874, 0, 0, 80, 80,0.000000 }, + { 875, 875, 0, 0, 300, 300,0.000000 }, + { 876, 876, 0, 0, 3186, 3186,0.000000 }, + { 877, 877, 0, 0, 226, 226,0.000000 }, + { 878, 878, 0, 0, 53, 53,0.000000 }, + { 879, 879, 0, 0, 2833, 2833,0.000000 }, + { 880, 880, 0, 0, 113, 113,0.000000 }, + { 881, 881, 0, 0, 40000, 40,0.000000 }, + { 882, 882, 0, 0, 40000, 300,0.000000 }, + { 883, 883, 0, 0, 2793, 2793,0.000000 }, + { 884, 884, 36, 0, 73, 73,0.000000 }, + { 885, 885, 48, 0, 60, 60,0.000000 }, + { 885, 885, 36, 0, 73, 73,0.000000 }, + { 886, 886, 36, 0, 20, 20,0.000000 }, + { 887, 887, 32, 0, 46, 46,0.000000 }, + { 767, 767, 96, 0, 580, 580,0.000000 }, + { 888, 888, 30, 0, 53, 53,0.000000 }, + { 889, 889, 35, 0, 106, 106,0.000000 }, + { 890, 890, 60, 0, 86, 86,0.000000 }, + { 884, 884, 59, 0, 40, 40,0.000000 }, + { 890, 890, 44, 0, 80, 80,0.000000 }, + { 891, 891, 41, 0, 166, 166,0.000000 }, + { 892, 892, 47, 0, 40, 40,0.000000 }, + { 891, 891, 44, 0, 140, 140,0.000000 }, + { 891, 891, 48, 0, 153, 153,0.000000 }, + { 893, 893, 62, 0, 606, 606,0.000000 }, + { 891, 891, 51, 0, 160, 160,0.000000 }, + { 891, 891, 54, 0, 160, 160,0.000000 }, + { 894, 894, 40, 0, 386, 386,0.000000 }, + { 891, 891, 57, 0, 113, 113,0.000000 }, + { 895, 895, 97, 0, 73, 73,0.000000 }, + { 896, 896, 50, 0, 86, 86,0.000000 }, + { 376, 376, 60, 0, 153, 153,0.000000 }, + { 897, 897, 53, 0, 33, 33,0.000000 }, + { 898, 898, 46, 0, 53, 53,0.000000 }, + { 897, 897, 57, 0, 33, 33,0.000000 }, + { 899, 899, 42, 0, 193, 193,0.000000 }, + { 899, 899, 37, 0, 200, 200,0.000000 }, + { 900, 900, 41, 0, 200, 200,0.000000 }, + { 900, 900, 37, 0, 193, 193,0.000000 }, + { 871, 871, 77, 0, 46, 46,0.000000 }, + { 871, 871, 72, 0, 40, 40,0.000000 }, + { 388, 388, 70, 0, 46, 46,0.000000 }, + { 901, 901, 39, 0, 173, 173,0.000000 }, + { 902, 902, 36, 0, 1006, 1006,0.000000 }, + { 903, 903, 46, 0, 33, 33,0.000000 }, + { 904, 904, 48, 0, 680, 680,0.000000 }, + { 905, 905, 85, 0, 33, 33,0.000000 }, + { 361, 361, 66, 0, 60, 60,0.000000 }, + { 906, 906, 41, 0, 106, 106,0.000000 }, + { 907, 907, 41, 0, 93, 93,0.000000 }, + { 908, 908, 81, 0, 33, 33,0.000000 }, + { 400, 400, 10, 0, 313, 313,0.000000 }, + { 886, 886, 60, 0, 13, 13,0.000000 }, + { 873, 873, 53, 0, 166, 166,0.000000 }, + { 909, 909, 0, 0, 566, 566,0.000000 }, + { 910, 910, 0, 0, 1313, 1313,0.000000 }, + { 911, 911, 0, 0, 760, 760,0.000000 }, + { 912, 912, 0, 0, 760, 760,0.000000 }, + { 913, 913, 0, 0, 1740, 1740,0.000000 }, + { 914, 914, 0, 0, 1900, 1900,0.000000 }, + { 915, 915, 0, 0, 1173, 1173,0.000000 }, + { 916, 916, 0, 0, 1233, 1233,0.000000 }, + { 917, 917, 0, 0, 493, 493,0.000000 }, + { 362, 362, 0, 0, 246, 246,0.000000 }, + { 918, 918, 0, 0, 226, 226,0.000000 }, + { 919, 919, 0, 0, 1740, 1740,0.000000 }, + { 920, 920, 0, 0, 246, 246,0.000000 }, + { 921, 921, 0, 0, 120, 120,0.000000 }, + { 922, 922, 0, 0, 606, 606,0.000000 }, + { 923, 923, 0, 0, 333, 333,0.000000 }, + { 924, 924, 0, 0, 40000, 6,0.000000 }, + { 925, 925, 0, 0, 40000, 6,0.000000 }, + { 926, 926, 0, 0, 13, 13,0.000000 }, + { 927, 927, 0, 0, 40000, 66,0.000000 }, + { 928, 928, 0, 0, 40000, 26,0.000000 }, + { 929, 929, 0, 0, 40000, 20,0.000000 }, + { 930, 930, 0, 0, 40000, 20,0.000000 }, + { 931, 931, 0, 0, 40000, 33,0.000000 }, + { 932, 932, 0, 0, 866, 866,0.000000 }, + { 933, 933, 0, 0, 566, 566,0.000000 }, + { 934, 934, 0, 0, 1900, 1900,0.000000 }, + { 935, 935, 0, 0, 1146, 1146,0.000000 }, + { 936, 936, 0, 0, 606, 606,0.000000 }, + { 937, 937, 0, 0, 4673, 4673,0.000000 }, + { 938, 938, 0, 0, 3126, 3126,0.000000 }, + { 939, 939, 0, 0, 2406, 2406,0.000000 }, + { 940, 940, 0, 0, 440, 440,0.000000 }, + { 941, 941, 0, 0, 3200, 3200,0.000000 }, + { 942, 942, 0, 0, 1000, 1000,0.000000 }, + { 943, 943, 0, 0, 593, 593,0.000000 }, + { 944, 944, 0, 0, 546, 546,0.000000 }, + { 945, 945, 0, 0, 620, 620,0.000000 }, + { 946, 946, 0, 0, 1206, 1206,0.000000 }, + { 947, 947, 0, 0, 680, 680,0.000000 }, + { 948, 948, 0, 0, 40000, 20,0.000000 }, + { 949, 949, 0, 0, 40000, 20,0.000000 }, + { 950, 950, 0, 0, 4793, 33,0.000000 }, + { 951, 951, 0, 0, 1773, 1773,0.000000 }, + { 952, 952, 0, 0, 40000, 86,0.000000 }, + { 953, 953, 0, 0, 173, 173,0.000000 }, + { 954, 954, 0, 0, 406, 406,0.000000 }, + { 955, 955, 0, 0, 280, 280,0.000000 }, + { 956, 956, 0, 0, 5453, 33,0.000000 }, + { 957, 957, 0, 0, 2466, 100,0.000000 }, + { 958, 958, 0, 0, 973, 973,0.000000 }, + { 959, 959, 0, 0, 40000, 53,0.000000 }, + { 960, 960, 0, 0, 40000, 33,0.000000 }, + { 961, 961, 0, 0, 1026, 13,0.000000 }, + { 962, 962, 0, 0, 166, 166,0.000000 }, + { 963, 963, 0, 0, 806, 806,0.000000 }, + { 964, 964, 0, 0, 40000, 20,0.000000 }, + { 965, 965, 0, 0, 60, 20,0.000000 }, + { 966, 966, 0, 0, 1020, 1020,0.000000 }, + { 967, 967, 0, 0, 3426, 3426,0.000000 }, + { 968, 968, 0, 0, 40000, 20,0.000000 }, + { 969, 969, 0, 0, 40000, 20,0.000000 }, + { 970, 970, 0, 0, 40000, 106,0.000000 }, + { 971, 971, 0, 0, 40000, 6,0.000000 }, + { 972, 972, 0, 0, 40000, 0,0.000000 }, + { 973, 973, 0, 0, 2280, 2280,0.000000 }, + { 974, 974, 0, 0, 40000, 20,0.000000 }, + { 975, 975, 0, 0, 40000, 6,0.000000 }, + { 976, 976, 0, 0, 40000, 6,0.000000 }, + { 977, 977, 0, 0, 40000, 0,0.000000 }, + { 978, 978, 0, 0, 40000, 6,0.000000 }, + { 979, 979, 0, 0, 40000, 33,0.000000 }, + { 980, 980, 0, 0, 40000, 0,0.000000 }, + { 981, 981, 0, 0, 40000, 13,0.000000 }, + { 982, 982, 0, 0, 40000, 20,0.000000 }, + { 983, 983, 0, 0, 40000, 33,0.000000 }, + { 984, 984, 0, 0, 40000, 20,0.000000 }, + { 985, 985, 0, 0, 40000, 33,0.000000 }, + { 986, 986, 0, 0, 40000, 20,0.000000 }, + { 987, 987, 0, 0, 40000, 6,0.000000 }, + { 988, 988, 0, 0, 1133, 1133,0.000000 }, + { 989, 989, 0, 0, 40000, 20,0.000000 }, + { 990, 990, 0, 0, 1340, 1340,0.000000 }, + { 991, 991, 0, 0, 3533, 3533,0.000000 }, + { 992, 992, 0, 0, 40000, 6,0.000000 }, + { 993, 993, 0, 0, 40000, 26,0.000000 }, + { 994, 994, 0, 0, 4140, 4140,0.000000 }, + { 995, 995, 0, 0, 1206, 1206,0.000000 }, + { 996, 996, 0, 0, 40000, 173,0.000000 }, + { 997, 997, 0, 0, 380, 80,0.000000 }, + { 998, 998, 0, 0, 40000, 26,0.000000 }, + { 999, 999, 0, 0, 40000, 20,0.000000 }, + {1000,1000, 0, 0, 2893, 2893,0.000000 }, + {1001,1001, 0, 0, 40000, 73,0.000000 }, + {1002,1002, 0, 0, 40000, 126,0.000000 }, + {1003,1003, 0, 0, 4373, 4373,0.000000 }, + {1004,1004, 0, 0, 40000, 240,0.000000 }, + {1005,1005, 0, 0, 993, 993,0.000000 }, + {1006,1006, 0, 0, 760, 760,0.000000 }, + {1007,1007, 0, 0, 1380, 1380,0.000000 }, + {1008,1008, 0, 0, 726, 53,0.000000 }, + {1009,1009, 0, 0, 40000, 33,0.000000 }, + {1010,1010, 0, 0, 40000, 213,0.000000 }, + {1011,1011, 0, 0, 1046, 1046,0.000000 }, + {1012,1012, 0, 0, 273, 273,0.000000 }, + {1013,1013, 0, 0, 626, 626,0.000000 }, + {1014,1014, 0, 0, 1166, 1166,0.000000 }, + {1015,1015, 0, 0, 153, 153,0.000000 }, + {1016,1016, 0, 0, 40000, 6,0.000000 }, + {1017,1017, 0, 0, 40000, 33,0.000000 }, + {1018,1018, 0, 0, 40000, 20,0.000000 }, + {1019,1019, 0, 0, 2106, 2106,0.000000 }, + { 444, 444, 0, 0, 86, 86,0.000000 }, + {1020,1020, 0, 0, 180, 180,0.000000 }, + { 449, 449, 0, 0, 80, 80,0.000000 }, + { 453, 453, 0, 0, 20, 20,0.000000 }, + {1021,1021, 0, 0, 20, 20,0.000000 }, + {1022,1022, 0, 0, 246, 246,0.000000 }, + {1023,1023, 0, 0, 3186, 3186,0.000000 }, + {1024,1024, 0, 0, 226, 226,0.000000 }, + {1025,1025, 0, 0, 186, 186,0.000000 }, + {1026,1026, 0, 0, 2833, 2833,0.000000 }, + {1027,1027, 0, 0, 2460, 2460,0.000000 }, + {1028,1028, 0, 0, 40000, 40,0.000000 }, + {1029,1029, 0, 0, 40000, 286,0.000000 }, + {1030,1030, 0, 0, 40000, 146,0.000000 }, + {1031,1031, 0, 0, 586, 586,0.000000 }, + {1032,1032, 32, 0, 46, 46,0.000000 }, + {1033,1033, 30, 0, 26, 26,0.000000 }, + {1034,1034, 96, 0, 40, 40,0.000000 }, + {1035,1035, 60, 0, 186, 186,0.000000 }, + {1036,1036, 0, 0, 1100, 1100,0.000000 }, + {1037,1037, 0, 0, 40000, 33,0.000000 }, + {1038,1038, 0, 0, 1740, 1740,0.000000 }, + {1039,1039, 0, 0, 1793, 1793,0.000000 }, + {1040,1040, 0, 0, 160, 160,0.000000 }, + {1041,1041, 0, 0, 1206, 1206,0.000000 }, + {1042,1042, 0, 0, 353, 353,0.000000 }, + {1043,1043, 0, 0, 40000, 6,0.000000 }, + {1044,1044, 0, 0, 40000, 0,0.000000 }, + {1045,1045, 0, 0, 40000, 20,0.000000 }, + {1046,1046, 0, 0, 1186, 1186,0.000000 }, + {1047,1047, 0, 0, 1093, 1093,0.000000 }, + {1048,1048, 0, 0, 620, 620,0.000000 }, + {1049,1049, 0, 0, 4440, 4440,0.000000 }, + {1050,1050, 0, 0, 4506, 4506,0.000000 }, + {1051,1051, 0, 0, 4673, 4673,0.000000 }, + {1052,1052, 0, 0, 2386, 2386,0.000000 }, + {1053,1053, 0, 0, 40000, 146,0.000000 }, + {1054,1054, 0, 0, 1180, 1180,0.000000 }, + {1055,1055, 0, 0, 320, 320,0.000000 }, + {1056,1056, 0, 0, 633, 633,0.000000 }, + {1057,1057, 0, 0, 80, 80,0.000000 }, + {1058,1058, 0, 0, 1180, 1180,0.000000 }, + {1059,1059, 0, 0, 6120, 100,0.000000 }, + {1060,1060, 0, 0, 86, 86,0.000000 }, + {1061,1061, 0, 0, 206, 206,0.000000 }, + {1062,1062, 0, 0, 40000, 86,0.000000 }, + {1063,1063, 0, 0, 40000, 266,0.000000 }, + {1064,1064, 0, 0, 806, 806,0.000000 }, + {1065,1065, 0, 0, 40000, 20,0.000000 }, + {1066,1066, 0, 0, 40000, 53,0.000000 }, + {1067,1067, 0, 0, 40000, 53,0.000000 }, + {1068,1068, 0, 0, 40000, 26,0.000000 }, + {1069,1069, 0, 0, 40000, 20,0.000000 }, + {1070,1070, 0, 0, 40000, 20,0.000000 }, + {1071,1071, 0, 0, 40000, 6,0.000000 }, + {1072,1072, 0, 0, 40000, 26,0.000000 }, + {1073,1073, 0, 0, 40000, 13,0.000000 }, + {1074,1074, 0, 0, 40000, 60,0.000000 }, + {1075,1075, 0, 0, 213, 213,0.000000 }, + {1076,1076, 0, 0, 40000, 73,0.000000 }, + {1077,1077, 0, 0, 4513, 4513,0.000000 }, + {1078,1078, 0, 0, 313, 313,0.000000 }, + {1079,1079, 0, 0, 4273, 4273,0.000000 }, + {1080,1080, 0, 0, 40000, 26,0.000000 }, + {1081,1081, 0, 0, 3153, 3153,0.000000 }, + {1082,1082, 0, 0, 40000, 180,0.000000 }, + {1083,1083, 0, 0, 40000, 213,0.000000 }, + {1084,1084, 0, 0, 1740, 13,0.000000 }, + {1085,1085, 0, 0, 2853, 2853,0.000000 }, + {1086,1086, 0, 0, 40000, 213,0.000000 }, + {1087,1087, 0, 0, 3946, 3946,0.000000 }, + {1088,1088, 0, 0, 2253, 2253,0.000000 }, + {1089,1089, 0, 0, 40000, 260,0.000000 }, + {1090,1090, 0, 0, 166, 166,0.000000 }, + {1091,1091, 0, 0, 40000, 493,0.000000 }, + {1092,1092, 0, 0, 2126, 2126,0.000000 }, + {1093,1093, 0, 0, 40000, 480,0.000000 }, + {1094,1094, 0, 0, 40000, 213,0.000000 }, + {1095,1095, 0, 0, 146, 146,0.000000 }, + {1096,1096, 0, 0, 333, 333,0.000000 }, + {1097,1097, 0, 0, 466, 466,0.000000 }, + {1098,1098, 0, 0, 40000, 40,0.000000 }, + {1099,1099, 0, 0, 4926, 4926,0.000000 }, + {1100,1100, 0, 0, 5113, 5113,0.000000 }, + {1101,1101, 0, 0, 3060, 13,0.000000 }, + {1102,1102, 0, 0, 420, 420,0.000000 }, + {1103,1103, 0, 0, 300, 300,0.000000 }, + {1104,1104, 0, 0, 4426, 4426,0.000000 }, + {1105,1105, 0, 0, 5513, 5513,0.000000 }, + {1106,1106, 0, 0, 40000, 233,0.000000 }, + { 430, 430, 0, 0, 300, 300,0.000000 }, + {1107,1107, 35, 0, 73, 73,0.000000 }, + {1090,1090, 77, 0, 80, 80,0.000000 }, + {1090,1090, 72, 0, 80, 80,0.000000 }, + {1108,1108, 0, 0, 60, 60,0.000000 }, + {1109,1109, 0, 0, 1453, 1453,0.000000 }, + {1110,1111, 0, 1, 506, 506,0.000000 }, + {1112,1113, 0, 1, 1253, 1253,0.031250 }, + {1114,1114, 0, 0, 866, 866,0.000000 }, + {1115,1116, 0, 1, 1473, 1473,0.000000 }, + {1117,1117, 0, 0, 1600, 1600,0.000000 }, + {1118,1118, 0, 0, 680, 680,0.000000 }, + {1119,1119, 0, 0, 1133, 1133,0.000000 }, + {1120,1120, 0, 0, 1013, 1013,0.000000 }, + {1121,1121, 0, 0, 860, 860,0.000000 }, + {1122,1122, 0, 0, 1473, 1473,0.000000 }, + {1123,1123, 0, 0, 280, 280,0.000000 }, + {1124,1124, 0, 0, 53, 53,0.000000 }, + {1125,1125, 0, 0, 1260, 1260,0.000000 }, + {1126,1126, 0, 0, 906, 906,0.000000 }, + {1127,1127, 0, 0, 40000, 66,0.000000 }, + {1128,1128, 0, 0, 260, 13,0.000000 }, + {1129,1130, 0, 1, 13973, 13,0.156250 }, + {1131,1131, 0, 0, 40000, 173,0.000000 }, + {1132,1132, 0, 0, 40000, 53,0.000000 }, + {1133,1134, 0, 1, 40000, 20,-0.046875 }, + {1135,1135, 0, 0, 40000, 26,0.000000 }, + {1136,1137, 0, 1, 40000, 113,0.000025 }, + {1138,1138, 0, 0, 3366, 3366,0.000000 }, + {1139,1139, 0, 0, 400, 400,0.000000 }, + {1140,1140, 0, 0, 473, 473,0.000000 }, + {1141,1141, 0, 0, 840, 840,0.000000 }, + {1142,1142, 0, 0, 800, 800,0.000000 }, + {1143,1143, 0, 0, 2173, 0,0.000000 }, + {1144,1144, 0, 0, 40000, 0,0.000000 }, + {1145,1145, 0, 0, 1433, 1433,0.000000 }, + {1146,1146, 0, 0, 386, 386,0.000000 }, + {1147,1147, 0, 0, 1253, 1253,0.000000 }, + {1148,1148, 0, 0, 1606, 1606,0.000000 }, + {1149,1150, 0, 1, 1553, 1553,-0.031250 }, + {1151,1151, 0, 0, 40000, 6,0.000000 }, + {1152,1152, 0, 0, 1560, 1560,0.000000 }, + {1153,1153, 0, 0, 386, 386,0.000000 }, + {1154,1154, 0, 1, 40000, 20,-0.156250 }, + {1155,1155, 0, 0, 3886, 6,0.000000 }, + {1156,1156, 0, 0, 40000, 66,0.000000 }, + {1157,1157, 0, 0, 40000, 60,0.000000 }, + {1158,1158, 0, 0, 40000, 266,0.000000 }, + {1159,1160, 0, 1, 40000, 273,0.171875 }, + {1161,1161, 0, 0, 173, 173,0.000000 }, + {1162,1162, 0, 0, 993, 993,0.000000 }, + {1163,1163, 0, 0, 726, 726,0.000000 }, + {1164,1165, 0, 1, 40000, 206,-0.125000 }, + {1166,1167, 0, 1, 40000, 266,0.078125 }, + {1168,1168, 0, 1, 40000, 1073,-0.078125 }, + {1169,1170, 0, 1, 40000, 253,0.062500 }, + {1171,1172, 0, 1, 40000, 533,0.156250 }, + {1173,1173, 0, 0, 1813, 1813,0.000000 }, + {1174,1174, 0, 0, 40000, 200,0.000000 }, + {1175,1176, 0, 1, 360, 360,0.000000 }, + {1177,1177, 0, 0, 40000, 6,0.000000 }, + {1178,1178, 0, 0, 806, 6,0.000000 }, + {1179,1179, 0, 0, 1600, 1600,0.000000 }, + {1180,1180, 0, 0, 60, 60,0.000000 }, + {1181,1182, 0, 1, 3153, 3153,0.000025 }, + {1183,1184, 0, 1, 826, 6,0.046875 }, + {1185,1186, 0, 1, 3106, 3106,0.093750 }, + {1187,1188, 0, 1, 1020, 1020,0.093750 }, + {1189,1189, 0, 0, 40000, 33,0.000000 }, + {1190,1190, 0, 0, 40000, 20,0.000000 }, + {1191,1191, 0, 0, 40000, 0,0.000000 }, + {1192,1192, 0, 0, 266, 6,0.000000 }, + {1193,1193, 0, 0, 40000, 33,0.000000 }, + {1194,1194, 0, 0, 40000, 26,0.000000 }, + {1195,1195, 0, 0, 40000, 0,0.000000 }, + {1196,1196, 0, 0, 40000, 13,0.000000 }, + {1197,1197, 0, 0, 40000, 0,0.000000 }, + {1198,1198, 0, 0, 40000, 6,0.000000 }, + {1199,1199, 0, 0, 40000, 53,0.000000 }, + {1200,1200, 0, 0, 40000, 20,0.000000 }, + {1201,1201, 0, 0, 40000, 20,0.000000 }, + {1202,1202, 0, 0, 140, 140,0.000000 }, + {1203,1203, 0, 0, 40000, 93,0.000000 }, + {1204,1204, 0, 0, 40000, 6,0.000000 }, + {1205,1206, 0, 1, 40000, 86,0.031250 }, + {1207,1208, 0, 1, 40000, 100,-0.000025 }, + {1209,1209, 0, 0, 40000, 53,0.000000 }, + {1210,1211, 0, 1, 40000, 0,0.031250 }, + {1212,1212, 0, 0, 40000, 0,0.000000 }, + {1213,1214, 0, 1, 40000, 320,-0.093750 }, + {1215,1216, 0, 1, 1660, 80,-0.046875 }, + {1217,1217, 0, 0, 40000, 66,0.000000 }, + {1218,1219, 0, 1, 40000, 233,0.031250 }, + {1220,1220, 0, 1, 1960, 1960,0.031250 }, + {1221,1222, 0, 1, 17500, 46,0.171875 }, + {1223,1223, 0, 0, 2273, 2273,0.000000 }, + {1224,1224, 0, 0, 1933, 1933,0.000000 }, + {1225,1150, 0, 1, 3126, 13,-0.031250 }, + {1226,1226, 0, 0, 40000, 640,0.000000 }, + {1227,1227, 0, 0, 1080, 1080,0.000000 }, + {1228,1229, 0, 1, 40000, 33,0.125000 }, + {1230,1230, 0, 0, 1046, 1046,0.000000 }, + {1231,1232, 0, 1, 1553, 1553,-0.031250 }, + {1233,1234, 0, 1, 2066, 2066,-0.187500 }, + {1235,1235, 0, 0, 40000, 466,0.000000 }, + {1236,1236, 0, 0, 400, 400,0.000000 }, + {1237,1237, 0, 0, 2706, 2706,0.000000 }, + {1238,1238, 0, 0, 1220, 1220,0.000000 }, + {1239,1239, 0, 0, 446, 446,0.000000 }, + {1240,1241, 0, 1, 360, 360,0.000000 }, + {1242,1242, 0, 0, 4806, 4806,0.000000 }, + {1243,1243, 0, 0, 80, 80,0.000000 }, + {1244,1244, 0, 0, 40000, 80,0.000000 }, + {1245,1245, 0, 0, 40000, 86,0.000000 }, + {1246,1246, 0, 0, 40000, 40,0.000000 }, + {1247,1247, 0, 0, 1920, 1920,0.000000 }, + {1248,1248, 0, 0, 66, 66,0.000000 }, + {1249,1249, 0, 0, 40000, 233,0.000000 }, + {1250,1250, 0, 0, 113, 113,0.000000 }, + {1251,1251, 0, 0, 46, 46,0.000000 }, + {1252,1252, 0, 0, 140, 140,0.000000 }, + {1253,1253, 0, 0, 886, 886,0.000000 }, + {1254,1254, 0, 0, 1080, 1080,0.000000 }, + {1255,1255, 0, 0, 206, 206,0.000000 }, + {1256,1256, 0, 0, 280, 280,0.000000 }, + {1257,1257, 0, 0, 2873, 2873,0.000000 }, + {1258,1258, 0, 0, 313, 313,0.000000 }, + {1259,1259, 0, 0, 40000, 73,0.000000 }, + {1260,1260, 29, 0, 1320, 1320,0.000000 }, + {1261,1261, 65, 0, 40000, 1746,0.000000 }, + {1262,1262, 0, 0, 153, 153,0.000000 }, + {1263,1263, 25, 0, 33, 33,0.000000 }, + {1264,1264, 83, 0, 53, 53,0.000000 }, + {1265,1265, 32, 0, 40, 40,0.000000 }, + {1266,1266, 60, 0, 46, 46,0.000000 }, + {1267,1267, 36, 0, 46, 46,0.000000 }, + {1268,1268, 27, 0, 13, 13,0.000000 }, + {1269,1269, 31, 0, 266, 266,0.000000 }, + {1270,1270, 21, 0, 246, 246,0.000000 }, + {1270,1270, 26, 0, 253, 253,0.000000 }, + {1270,1270, 28, 0, 260, 260,0.000000 }, + {1271,1271, 60, 0, 280, 280,0.000000 }, + {1270,1270, 32, 0, 206, 206,0.000000 }, + {1272,1272, 60, 0, 260, 260,0.000000 }, + {1273,1273, 96, 0, 140, 140,0.000000 }, + {1274,1274, 72, 0, 133, 133,0.000000 }, + {1275,1275, 79, 0, 46, 46,0.000000 }, + {1276,1276, 69, 0, 126, 126,0.000000 }, + {1277,1277, 71, 0, 146, 146,0.000000 }, + {1278,1278, 22, 0, 566, 566,0.000000 }, + {1279,1279, 55, 0, 66, 66,0.000000 }, + {1279,1279, 48, 0, 80, 80,0.000000 }, + {1280,1280, 0, 0, 6, 6,0.000000 }, + {1281,1281, 49, 0, 6, 6,0.000000 }, + {1282,1282, 73, 0, 60, 60,0.000000 }, + {1282,1282, 68, 0, 60, 60,0.000000 }, + {1282,1282, 61, 0, 80, 80,0.000000 }, + {1283,1283, 0, 0, 6, 6,0.000000 }, + {1284,1284, 0, 0, 40000, 46,0.000000 }, + {1285,1285, 0, 0, 40000, 20,0.000000 }, + {1286,1286, 0, 0, 2380, 2380,0.000000 }, + {1287,1287, 0, 0, 700, 700,0.000000 }, + {1288,1289, 0, 1, 653, 6,0.000000 }, + {1290,1290, 0, 0, 80, 80,0.000000 }, + {1291,1292, 36, 1, 46, 46,0.000000 }, + {1293,1293, 69, 0, 126, 126,0.000000 }, + {1294,1294, 0, 0, 120, 120,0.000000 }, + {1295,1295, 0, 0, 40000, 0,0.000000 }, + {1296,1296, 0, 0, 1173, 1173,0.000000 }, + {1297,1297, 22, 0, 566, 566,0.000000 }, + {1298,1298, 0, 0, 40000, 0,0.000000 }, + {1299,1299, 0, 0, 993, 993,0.000000 }, + {1300,1300, 0, 0, 1900, 1900,0.000000 }, + {1301,1301, 0, 0, 1046, 1046,0.000000 }, + {1302,1302, 0, 0, 293, 293,0.000000 }, + {1303,1303, 0, 0, 40000, 33,0.000000 }, + {1304,1304, 0, 0, 40000, 6,0.000000 }, + {1305,1305, 0, 0, 40000, 20,0.000000 }, + {1306,1306, 0, 0, 40000, 193,0.000000 }, + {1307,1307, 0, 0, 40000, 153,0.000000 }, + {1308,1308, 0, 0, 40000, 6,0.000000 }, + {1309,1309, 0, 0, 40000, 46,0.000000 }, + {1310,1310, 0, 0, 40000, 73,0.000000 }, + {1311,1311, 0, 0, 920, 920,0.000000 }, + {1312,1312, 0, 0, 4580, 4580,0.000000 }, + {1313,1313, 0, 0, 1026, 1026,0.000000 }, + {1314,1314, 0, 0, 40000, 6,0.000000 }, + {1315,1315, 0, 0, 3746, 13,0.000000 }, + {1316,1316, 0, 0, 40000, 233,0.000000 }, + {1317,1317, 0, 0, 40000, 153,0.000000 }, + {1318,1318, 0, 0, 40000, 140,0.000000 }, + {1319,1319, 0, 0, 2620, 2620,0.000000 }, + {1320,1320, 0, 0, 40000, 140,0.000000 }, + {1321,1321, 0, 0, 233, 233,0.000000 }, + {1322,1322, 0, 0, 40000, 6,0.000000 }, + {1323,1323, 0, 0, 40000, 0,0.000000 }, + {1324,1324, 0, 0, 40000, 26,0.000000 }, + {1325,1325, 0, 0, 40000, 6,0.000000 }, + { 260, 260, 0, 0, 40000, 20,0.000000 }, + {1326,1326, 0, 0, 40000, 20,0.000000 }, + {1327,1327, 0, 0, 40000, 0,0.000000 }, + {1328,1328, 0, 0, 40000, 13,0.000000 }, + {1329,1329, 0, 0, 40000, 73,0.000000 }, + {1330,1330, 0, 0, 40000, 53,0.000000 }, + {1331,1331, 0, 0, 40000, 66,0.000000 }, + {1332,1332, 0, 0, 40000, 66,0.000000 }, + {1333,1333, 0, 0, 40000, 6,0.000000 }, + {1334,1334, 0, 0, 40000, 73,0.000000 }, + {1335,1335, 0, 0, 40000, 133,0.000000 }, + {1336,1336, 0, 0, 40000, 233,0.000000 }, + {1337,1337, 0, 0, 40000, 406,0.000000 }, + {1338,1338, 0, 0, 1766, 93,0.000000 }, + {1339,1339, 0, 0, 40000, 533,0.000000 }, + {1340,1340, 0, 0, 40000, 106,0.000000 }, + {1341,1341, 0, 0, 593, 13,0.000000 }, + {1342,1342, 0, 0, 940, 940,0.000000 }, + {1343,1343, 0, 0, 40000, 53,0.000000 }, + {1344,1344, 0, 0, 2006, 2006,0.000000 }, + {1345,1345, 0, 0, 40000, 933,0.000000 }, + {1346,1346, 0, 0, 973, 973,0.000000 }, + { 378, 378, 84, 0, 440, 440,0.000000 }, + {1347,1347, 24, 0, 46, 46,0.000000 }, + {1348,1348, 44, 0, 80, 80,0.000000 }, + {1349,1349, 40, 0, 306, 306,0.000000 }, + {1350,1350, 60, 0, 340, 340,0.000000 }, + {1351,1351, 0, 0, 866, 866,0.000000 }, + {1352,1352, 0, 0, 993, 993,0.000000 }, + {1353,1353, 0, 0, 633, 633,0.000000 }, + {1354,1354, 0, 0, 40000, 40,0.000000 }, + {1355,1355, 0, 0, 973, 973,0.000000 }, + {1356,1356, 0, 0, 40000, 126,0.000000 }, + {1357,1357, 0, 0, 166, 166,0.000000 }, + {1358,1358, 0, 0, 640, 640,0.000000 }, + {1359,1359, 0, 0, 100, 100,0.000000 }, + {1360,1360, 0, 0, 40000, 113,0.000000 }, + {1361,1361, 0, 0, 40000, 240,0.000000 }, + {1362,1362, 0, 0, 3793, 80,0.000000 }, + {1363,1363, 0, 0, 40000, 240,0.000000 }, + {1364,1364, 0, 0, 126, 126,0.000000 }, + {1365,1365, 0, 0, 40000, 20,0.000000 }, + {1366,1366, 0, 0, 40000, 26,0.000000 }, + {1367,1367, 0, 0, 2233, 6,0.000000 }, + {1368,1368, 0, 0, 40000, 53,0.000000 }, + {1369,1369, 0, 0, 40000, 33,0.000000 }, + {1370,1370, 0, 0, 40000, 13,0.000000 }, + {1371,1371, 0, 0, 40000, 13,0.000000 }, + {1372,1372, 0, 0, 40000, 26,0.000000 }, + {1373,1373, 0, 0, 40000, 6,0.000000 }, + {1374,1374, 0, 0, 40000, 13,0.000000 }, + {1375,1375, 0, 0, 4473, 13,0.000000 }, + {1376,1376, 0, 0, 146, 146,0.000000 }, + {1377,1377, 0, 0, 86, 86,0.000000 }, + {1378,1378, 35, 0, 73, 73,0.000000 }, + {1379,1379, 49, 0, 40, 40,0.000000 }, + {1377,1377, 48, 0, 80, 80,0.000000 }, + {1380,1380, 58, 0, 40, 40,0.000000 }, + {1377,1377, 60, 0, 86, 86,0.000000 }, + {1381,1381, 47, 0, 106, 106,0.000000 }, + {1382,1382, 60, 0, 20, 20,0.000000 }, + {1381,1381, 49, 0, 153, 153,0.000000 }, + {1383,1383, 72, 0, 80, 80,0.000000 }, + {1381,1381, 51, 0, 200, 200,0.000000 }, + {1384,1384, 84, 0, 273, 273,0.000000 }, + {1381,1381, 54, 0, 233, 233,0.000000 }, + {1381,1381, 57, 0, 260, 260,0.000000 }, + {1385,1385, 72, 0, 506, 506,0.000000 }, + {1381,1381, 60, 0, 306, 306,0.000000 }, + {1386,1386, 36, 0, 866, 866,0.000000 }, + {1387,1387, 93, 0, 66, 66,0.000000 }, + {1388,1388, 72, 0, 273, 273,0.000000 }, + {1389,1389, 84, 0, 426, 426,0.000000 }, + {1390,1390, 36, 0, 20, 20,0.000000 }, + {1391,1391, 64, 0, 86, 86,0.000000 }, + {1392,1392, 68, 0, 26, 26,0.000000 }, + {1393,1393, 0, 0, 1226, 1226,0.000000 }, + {1394,1394, 0, 0, 40000, 140,0.000000 }, + {1395,1395, 0, 0, 40000, 0,0.000000 }, + {1396,1396, 0, 0, 513, 513,0.000000 }, + {1397,1397, 0, 0, 40000, 126,0.000000 }, + {1398,1398, 0, 0, 320, 320,0.000000 }, + {1399,1399, 0, 0, 40000, 0,0.000000 }, + {1400,1400, 0, 0, 1766, 1766,0.000000 }, + {1401,1401, 0, 0, 2513, 2513,0.000000 }, + {1402,1402, 0, 0, 1300, 1300,0.000000 }, + {1403,1403, 0, 0, 46, 46,0.000000 }, + {1404,1404, 0, 0, 186, 6,0.000000 }, + {1405,1405, 0, 0, 40000, 6,0.000000 }, + {1406,1406, 0, 0, 40, 26,0.000000 }, + {1407,1407, 0, 0, 166, 166,0.000000 }, + {1408,1408, 0, 0, 2193, 2193,0.000000 }, + {1409,1409, 0, 0, 40000, 206,0.000000 }, + {1410,1410, 0, 0, 40000, 1460,0.000000 }, + {1411,1411, 0, 0, 166, 166,0.000000 }, + {1412,1412, 0, 0, 1380, 1380,0.000000 }, + {1413,1413, 0, 0, 533, 533,0.000000 }, + {1414,1414, 0, 0, 40000, 33,0.000000 }, + {1415,1415, 0, 0, 40000, 53,0.000000 }, + {1416,1416, 0, 0, 40000, 0,0.000000 }, + {1417,1417, 0, 0, 40000, 6,0.000000 }, + {1418,1418, 0, 0, 40000, 6,0.000000 }, + {1419,1419, 0, 0, 913, 913,0.000000 }, + {1420,1420, 0, 0, 1233, 6,0.000000 }, + {1421,1421, 0, 0, 126, 126,0.000000 }, + {1422,1422, 0, 0, 40000, 46,0.000000 }, + {1423,1423, 0, 0, 933, 933,0.000000 }, + {1424,1424, 0, 0, 1846, 1846,0.000000 }, + {1425,1425, 0, 0, 973, 973,0.000000 }, + {1426,1426, 0, 0, 160, 160,0.000000 }, + {1427,1427, 0, 0, 40000, 106,0.000000 }, + {1428,1428, 0, 0, 120, 120,0.000000 }, + {1429,1429, 0, 0, 40000, 6,0.000000 }, + {1430,1430, 0, 0, 93, 93,0.000000 }, + {1431,1431, 0, 0, 40, 40,0.000000 }, + {1432,1432, 0, 0, 2420, 2420,0.000000 }, + {1433,1433, 0, 0, 1153, 1153,0.000000 }, + {1434,1434, 0, 0, 2406, 2406,0.000000 }, + { 740, 740, 0, 0, 80, 80,0.000000 }, + {1435,1435, 0, 0, 40000, 3220,0.000000 }, + { 739, 739, 48, 0, 93, 93,0.000000 }, + { 500, 500, 55, 0, 13, 13,0.000000 }, + { 740, 740, 60, 0, 53, 53,0.000000 }, + { 500, 500, 41, 0, 13, 13,0.000000 }, + {1436,1436, 84, 0, 40, 40,0.000000 }, + {1437,1437, 84, 0, 73, 73,0.000000 }, + { 500, 500, 48, 0, 13, 13,0.000000 }, + {1438,1438, 15, 0, 86, 86,0.000000 }, + { 752, 752, 49, 0, 46, 46,0.000000 }, + {1438,1438, 16, 0, 93, 93,0.000000 }, + {1438,1438, 12, 0, 86, 86,0.000000 }, + { 740, 740, 55, 0, 53, 53,0.000000 }, + { 752, 752, 18, 0, 46, 46,0.000000 }, + { 752, 752, 15, 0, 46, 46,0.000000 }, + { 752, 752, 17, 0, 46, 46,0.000000 }, + {1439,1440, 0, 0, 1340, 1340,0.000000 }, + {1441,1442, 0, 0, 1113, 1113,0.000000 }, + {1443,1444, 0, 0, 2133, 2133,0.000000 }, + {1445,1446, 0, 0, 953, 953,0.000000 }, + {1447,1448, 0, 0, 100, 100,0.000000 }, + {1449,1450, 0, 0, 1313, 1313,0.000000 }, + { 181,1451, 0, 0, 473, 473,0.000000 }, + {1452,1453, 0, 0, 680, 680,0.000000 }, + {1454,1455, 0, 0, 260, 260,0.000000 }, + {1456,1457, 0, 0, 193, 193,0.000000 }, + {1458,1459, 0, 0, 1320, 1320,0.000000 }, + { 190,1460, 0, 0, 646, 6,0.000000 }, + { 192,1461, 0, 0, 40000, 6,0.000000 }, + {1462,1463, 0, 0, 40000, 113,0.000000 }, + {1464,1465, 0, 0, 40000, 133,0.000000 }, + {1466,1467, 0, 0, 40000, 6,0.000000 }, + {1468,1469, 0, 0, 40000, 0,0.000000 }, + { 35,1470, 0, 0, 1446, 1446,0.000000 }, + { 36,1471, 0, 0, 1606, 1606,0.000000 }, + {1472,1473, 0, 0, 1553, 1553,0.000000 }, + {1474,1475, 0, 0, 2133, 2133,0.000000 }, + { 39,1476, 0, 0, 40000, 26,0.000000 }, + {1477,1476, 0, 0, 40000, 46,0.000000 }, + {1478,1479, 0, 0, 40000, 240,0.000000 }, + { 50,1480, 0, 0, 40000, 153,0.000000 }, + {1481,1482, 0, 0, 40000, 46,0.000000 }, + {1483,1484, 0, 0, 2300, 2300,0.000000 }, + {1485,1486, 0, 0, 40000, 86,0.000000 }, + { 55,1487, 0, 0, 40000, 20,0.000000 }, + {1488,1489, 0, 0, 40000, 20,0.000000 }, + {1490,1491, 0, 0, 40000, 6,0.000000 }, + {1492,1493, 0, 0, 40000, 0,0.000000 }, + {1494,1495, 0, 0, 40000, 6,0.000000 }, + {1496,1497, 0, 0, 40000, 6,0.000000 }, + {1496,1498, 0, 0, 40000, 6,0.000000 }, + {1499,1500, 0, 0, 40000, 6,0.000000 }, + {1501,1502, 0, 0, 40000, 53,0.000000 }, + {1503,1504, 0, 0, 40000, 33,0.000000 }, + {1505,1506, 0, 0, 40000, 6,0.000000 }, + { 86,1507, 0, 0, 40000, 20,0.000000 }, + {1508,1509, 0, 0, 1766, 1766,0.000000 }, + {1510,1511, 0, 0, 2853, 13,0.000000 }, + {1512,1513, 0, 0, 593, 593,0.000000 }, + {1514,1515, 0, 0, 1126, 33,0.000000 }, + {1516,1517, 0, 0, 40000, 460,0.000000 }, + {1518,1519, 0, 0, 233, 233,0.000000 }, + {1520,1521, 0, 0, 40000, 213,0.000000 }, + {1522,1523, 0, 0, 1233, 1233,0.000000 }, + {1524,1525, 0, 0, 40000, 626,0.000000 }, + {1526,1527, 0, 0, 40000, 446,0.000000 }, + {1528,1529, 0, 0, 40000, 320,0.000000 }, + { 111,1530, 0, 0, 786, 786,0.000000 }, + {1531,1532, 0, 0, 20, 20,0.000000 }, + { 115,1533, 0, 0, 26, 26,0.000000 }, + {1534,1535, 0, 0, 166, 166,0.000000 }, + {1536,1537, 0, 0, 2280, 2280,0.000000 }, + {1538,1539, 0, 0, 280, 280,0.000000 }, + {1540, 339, 0, 0, 580, 580,0.000000 }, + {1541, 339, 0, 0, 4613, 4613,0.000000 }, + {1542,1543, 0, 0, 440, 440,0.000000 }, + {1544,1545, 0, 0, 153, 153,0.000000 }, + {1546,1547, 0, 0, 40000, 53,0.000000 }, + { 364, 365, 44, 0, 20, 20,0.000000 }, + { 129,1548, 48, 0, 66, 66,0.000000 }, + { 367, 368, 58, 0, 53, 53,0.000000 }, + { 129,1549, 60, 0, 73, 73,0.000000 }, + {1550,1551, 48, 0, 93, 93,0.000000 }, + { 132,1552, 43, 0, 13, 13,0.000000 }, + {1550,1551, 49, 0, 120, 120,0.000000 }, + {1553,1554, 43, 0, 26, 26,0.000000 }, + {1550,1551, 51, 0, 153, 153,0.000000 }, + { 134,1555, 43, 0, 146, 146,0.000000 }, + {1550,1551, 54, 0, 106, 106,0.000000 }, + {1550,1551, 57, 0, 100, 100,0.000000 }, + { 380, 381, 72, 0, 40000, 0,0.000000 }, + {1550,1551, 60, 0, 106, 106,0.000000 }, + {1556,1557, 70, 0, 246, 246,0.000000 }, + { 374, 375, 60, 0, 40000, 0,0.000000 }, + {1558,1559, 36, 0, 360, 360,0.000000 }, + {1560,1561, 65, 0, 113, 113,0.000000 }, + {1562,1563, 84, 0, 40000, 0,0.000000 }, + {1564,1565, 59, 0, 133, 133,0.000000 }, + {1566,1567, 84, 0, 40000, 0,0.000000 }, + {1568,1569, 35, 0, 53, 53,0.000000 }, + {1570,1571, 44, 0, 273, 273,0.000000 }, + {1572,1573, 67, 0, 66, 66,0.000000 }, + {1574,1575, 66, 0, 46, 46,0.000000 }, + { 145,1576, 59, 0, 13, 13,0.000000 }, + {1577,1578, 51, 0, 40, 40,0.000000 }, + {1579,1580, 45, 0, 40, 40,0.000000 }, + {1581,1582, 71, 0, 120, 120,0.000000 }, + { 149,1583, 60, 0, 180, 180,0.000000 }, + {1584,1585, 58, 0, 166, 166,0.000000 }, + {1586,1587, 53, 0, 140, 140,0.000000 }, + { 397,1588, 64, 0, 86, 86,0.000000 }, + {1589,1590, 71, 0, 13, 13,0.000000 }, + {1591,1592, 61, 0, 313, 313,0.000000 }, + {1593,1594, 61, 0, 513, 513,0.000000 }, + { 391, 392, 48, 0, 80, 80,0.000000 }, + { 391, 393, 48, 0, 80, 80,0.000000 }, + {1595,1596, 69, 0, 20, 20,0.000000 }, + { 159,1597, 68, 0, 20, 20,0.000000 }, + { 159,1597, 63, 0, 33, 33,0.000000 }, + {1598,1599, 74, 0, 333, 333,0.000000 }, + {1600,1601, 60, 0, 380, 380,0.000000 }, + {1602,1603, 80, 0, 60, 60,0.000000 }, + {1604,1605, 64, 0, 646, 646,0.000000 }, + {1606,1607, 69, 0, 33, 33,0.000000 }, + { 398, 399, 55, 0, 500, 500,0.000000 }, + {1608,1609, 75, 0, 346, 346,0.000000 }, + {1610,1611, 68, 0, 20, 20,0.000000 }, + {1612,1613, 48, 0, 46, 46,0.000000 }, + {1614,1615, 53, 0, 40, 40,0.000000 }, + {1616,1616, 0, 0, 40000, 873,0.000000 }, + {1617,1617, 0, 0, 40000, 446,0.000000 }, + {1618,1618, 0, 0, 1020, 1020,0.000000 }, + {1619,1619, 0, 0, 40000, 300,0.000000 }, + {1620,1620, 0, 0, 40000, 780,0.000000 }, + {1621,1621, 0, 0, 1400, 1400,0.000000 }, + {1622,1622, 0, 0, 40000, 480,0.000000 }, + {1623,1623, 0, 0, 40000, 566,0.000000 }, + {1624,1624, 0, 0, 3220, 3220,0.000000 }, + {1625,1625, 0, 0, 40000, 6,0.000000 }, + {1626,1626, 0, 0, 40000, 20,0.000000 }, + {1627,1627, 0, 0, 40000, 20,0.000000 }, + {1628,1628, 0, 0, 40000, 1180,0.000000 }, + {1629,1629, 0, 0, 40000, 20,0.000000 }, + {1630,1630, 0, 0, 40000, 6,0.000000 }, + {1631,1631, 0, 0, 40000, 6,0.000000 }, + {1632,1632, 0, 0, 40000, 280,0.000000 }, + {1633,1633, 0, 0, 40000, 6,0.000000 }, + {1634,1634, 0, 0, 40000, 6,0.000000 }, + {1635,1635, 0, 0, 40000, 6,0.000000 }, + {1636,1636, 0, 0, 340, 26,0.000000 }, + {1637,1637, 0, 0, 1000, 1000,0.000000 }, + {1638,1638, 0, 0, 40000, 200,0.000000 }, + {1639,1639, 0, 0, 460, 460,0.000000 }, + {1640,1640, 0, 0, 40000, 146,0.000000 }, + {1641,1641, 0, 0, 40000, 146,0.000000 }, + {1642,1642, 0, 0, 40000, 233,0.000000 }, + {1643,1643, 0, 0, 40000, 480,0.000000 }, + {1644,1644, 0, 0, 40000, 6,0.000000 }, + {1645,1645, 0, 0, 40000, 6,0.000000 }, + {1646,1646, 0, 0, 40000, 6,0.000000 }, + {1647,1647, 0, 0, 40000, 6,0.000000 }, + {1648,1648, 0, 0, 40000, 6,0.000000 }, + {1649,1649, 0, 0, 40000, 6,0.000000 }, + {1650,1650, 0, 0, 40000, 53,0.000000 }, + {1651,1651, 0, 0, 40000, 480,0.000000 }, + {1652,1652, 0, 0, 40000, 286,0.000000 }, + {1653,1653, 0, 0, 40000, 106,0.000000 }, + {1654,1654, 0, 0, 40000, 413,0.000000 }, + {1655,1655, 0, 0, 1213, 1213,0.000000 }, + {1656,1656, 0, 0, 513, 513,0.000000 }, + {1657,1657, 0, 0, 40000, 160,0.000000 }, + {1658,1658, 0, 0, 40000, 153,0.000000 }, + {1659,1659, 0, 0, 40000, 1973,0.000000 }, + {1660,1660, 0, 0, 40000, 3593,0.000000 }, + {1661,1661, 0, 0, 40000, 1120,0.000000 }, + {1662,1662, 0, 0, 620, 620,0.000000 }, + {1663,1663, 0, 0, 1740, 1740,0.000000 }, + {1664,1664, 0, 0, 940, 940,0.000000 }, + {1665,1665, 0, 0, 40000, 260,0.000000 }, + {1666,1666, 0, 0, 1900, 1900,0.000000 }, + {1667,1667, 0, 0, 40000, 426,0.000000 }, + {1668,1668, 12, 0, 66, 66,0.000000 }, + {1669,1669, 48, 0, 100, 100,0.000000 }, + { 736, 736, 52, 0, 80, 80,0.000000 }, + {1670,1670, 48, 0, 153, 153,0.000000 }, + {1670,1670, 36, 0, 146, 146,0.000000 }, + { 377, 377, 84, 0, 73, 73,0.000000 }, + { 730, 730, 95, 0, 600, 600,0.000000 }, + {1669,1669, 84, 0, 86, 86,0.000000 }, + { 755, 755, 20, 0, 200, 200,0.000000 }, + { 755, 755, 22, 0, 193, 193,0.000000 }, + { 755, 755, 24, 0, 200, 200,0.000000 }, + {1671,1671, 0, 0, 400, 400,0.000000 }, + {1672,1672, 0, 0, 460, 460,0.000000 }, + {1673,1673, 0, 0, 566, 566,0.000000 }, + {1674,1674, 0, 0, 40, 40,0.000000 }, + {1675,1675, 0, 0, 913, 913,0.000000 }, + {1676,1676, 0, 0, 940, 940,0.000000 }, + {1677,1677, 0, 0, 553, 553,0.000000 }, + {1678,1678, 0, 0, 653, 653,0.000000 }, + {1679,1679, 0, 0, 140, 140,0.000000 }, + {1680,1680, 0, 0, 440, 440,0.000000 }, + {1681,1681, 0, 0, 493, 493,0.000000 }, + {1682,1682, 0, 0, 40000, 213,0.000000 }, + {1683,1683, 0, 0, 246, 246,0.000000 }, + {1684,1684, 0, 0, 140, 140,0.000000 }, + {1685,1685, 0, 0, 880, 880,0.000000 }, + {1686,1686, 0, 0, 700, 700,0.000000 }, + {1687,1687, 0, 0, 40000, 0,0.000000 }, + {1688,1688, 0, 0, 40000, 6,0.000000 }, + {1689,1689, 0, 0, 86, 86,0.000000 }, + {1690,1690, 0, 0, 40000, 6,0.000000 }, + {1691,1691, 0, 0, 40000, 6,0.000000 }, + {1692,1692, 0, 0, 40000, 6,0.000000 }, + {1693,1693, 0, 0, 40000, 6,0.000000 }, + {1694,1694, 0, 0, 440, 440,0.000000 }, + {1695,1695, 0, 0, 440, 440,0.000000 }, + {1696,1696, 0, 0, 100, 0,0.000000 }, + {1697,1697, 0, 0, 1846, 1846,0.000000 }, + {1698,1698, 0, 0, 40, 40,0.000000 }, + {1699,1699, 0, 0, 6580, 6580,0.000000 }, + {1700,1700, 0, 0, 1846, 1846,0.000000 }, + {1701,1701, 0, 0, 1080, 1080,0.000000 }, + {1702,1702, 0, 0, 40000, 0,0.000000 }, + {1703,1703, 0, 0, 1020, 1020,0.000000 }, + {1704,1704, 0, 0, 40000, 53,0.000000 }, + {1705,1705, 0, 0, 40000, 0,0.000000 }, + {1706,1706, 0, 0, 40000, 0,0.000000 }, + {1707,1707, 0, 0, 40000, 53,0.000000 }, + {1708,1708, 0, 0, 40000, 0,0.000000 }, + {1709,1709, 0, 0, 40000, 26,0.000000 }, + {1710,1710, 0, 0, 626, 626,0.000000 }, + {1711,1711, 0, 0, 40000, 26,0.000000 }, + {1712,1712, 0, 0, 1226, 13,0.000000 }, + {1713,1713, 0, 0, 40000, 0,0.000000 }, + {1714,1714, 0, 0, 3980, 13,0.000000 }, + {1715,1715, 0, 0, 253, 253,0.000000 }, + {1716,1716, 0, 0, 940, 940,0.000000 }, + {1717,1717, 0, 0, 126, 126,0.000000 }, + {1718,1718, 0, 0, 3766, 13,0.000000 }, + {1719,1719, 0, 0, 660, 200,0.000000 }, + {1720,1720, 0, 0, 40000, 20,0.000000 }, + {1721,1721, 0, 0, 40000, 20,0.000000 }, + {1722,1722, 0, 0, 40000, 146,0.000000 }, + {1723,1723, 0, 0, 40000, 26,0.000000 }, + {1724,1724, 0, 0, 40000, 140,0.000000 }, + {1725,1725, 0, 0, 260, 260,0.000000 }, + {1726,1726, 0, 0, 40000, 0,0.000000 }, + {1727,1727, 0, 0, 126, 0,0.000000 }, + {1728,1728, 0, 0, 386, 6,0.000000 }, + {1729,1729, 0, 0, 40000, 33,0.000000 }, + {1730,1730, 0, 0, 126, 33,0.000000 }, + {1731,1731, 0, 0, 1580, 1580,0.000000 }, + {1732,1732, 0, 0, 40000, 6,0.000000 }, + {1733,1733, 0, 0, 40000, 6,0.000000 }, + {1734,1734, 0, 0, 40000, 6,0.000000 }, + {1735,1735, 0, 0, 40000, 13,0.000000 }, + {1736,1736, 0, 0, 40000, 13,0.000000 }, + {1737,1737, 0, 0, 40000, 20,0.000000 }, + {1738,1738, 0, 0, 40000, 13,0.000000 }, + {1739,1739, 0, 0, 40000, 13,0.000000 }, + {1740,1740, 0, 0, 40000, 73,0.000000 }, + {1741,1741, 0, 0, 40000, 6,0.000000 }, + {1742,1742, 0, 0, 40000, 6,0.000000 }, + {1743,1743, 0, 0, 40000, 20,0.000000 }, + {1744,1744, 0, 0, 993, 993,0.000000 }, + {1745,1745, 0, 0, 40000, 20,0.000000 }, + {1746,1746, 0, 0, 40000, 0,0.000000 }, + {1747,1747, 0, 0, 40000, 0,0.000000 }, + {1748,1748, 0, 0, 933, 6,0.000000 }, + {1749,1749, 0, 0, 40000, 20,0.000000 }, + {1750,1750, 0, 0, 40000, 6,0.000000 }, + {1751,1751, 0, 0, 40000, 13,0.000000 }, + {1752,1752, 0, 0, 40000, 26,0.000000 }, + {1753,1753, 0, 0, 40000, 0,0.000000 }, + {1754,1754, 0, 0, 1793, 1793,0.000000 }, + {1755,1755, 0, 0, 40000, 106,0.000000 }, + {1756,1756, 0, 0, 40000, 46,0.000000 }, + {1757,1757, 0, 0, 40000, 33,0.000000 }, + {1758,1758, 0, 0, 40000, 286,0.000000 }, + {1759,1759, 0, 0, 40000, 906,0.000000 }, + {1760,1760, 0, 0, 40000, 220,0.000000 }, + {1761,1761, 0, 0, 40000, 53,0.000000 }, + {1762,1762, 0, 0, 40000, 40,0.000000 }, + {1763,1763, 0, 0, 3446, 3446,0.000000 }, + {1764,1764, 0, 0, 860, 13,0.000000 }, + {1765,1765, 0, 0, 513, 513,0.000000 }, + {1766,1766, 0, 0, 1846, 1846,0.000000 }, + {1767,1767, 0, 0, 973, 973,0.000000 }, + {1768,1768, 0, 0, 40000, 366,0.000000 }, + {1769,1769, 0, 0, 1426, 1426,0.000000 }, + {1770,1770, 0, 0, 40000, 686,0.000000 }, + {1771,1771, 0, 0, 1060, 1060,0.000000 }, + {1772,1772, 0, 0, 13, 13,0.000000 }, + {1773,1773, 0, 0, 380, 380,0.000000 }, + {1774,1774, 0, 0, 146, 146,0.000000 }, + {1775,1775, 0, 0, 166, 166,0.000000 }, + {1776,1776, 0, 0, 40000, 6,0.000000 }, + {1777,1777, 0, 0, 40000, 0,0.000000 }, + {1778,1778, 0, 0, 40000, 66,0.000000 }, + {1779,1779, 0, 0, 1473, 1473,0.000000 }, + {1780,1780, 0, 0, 113, 113,0.000000 }, + {1781,1781, 0, 0, 353, 353,0.000000 }, + {1782,1782, 0, 0, 46, 46,0.000000 }, + {1783,1783, 0, 0, 86, 86,0.000000 }, + {1784,1784, 0, 0, 60, 60,0.000000 }, + {1785,1785, 0, 0, 2280, 2280,0.000000 }, + {1786,1786, 0, 0, 366, 366,0.000000 }, + {1787,1787, 0, 0, 1713, 1713,0.000000 }, + {1788,1788, 0, 0, 206, 206,0.000000 }, + {1789,1789, 0, 0, 40000, 6,0.000000 }, + {1790,1790, 0, 0, 40000, 0,0.000000 }, + {1791,1791, 0, 0, 40000, 553,0.000000 }, + {1792,1792, 0, 0, 160, 160,0.000000 }, + {1793,1793, 48, 0, 46, 46,0.000000 }, + {1794,1794, 48, 0, 13, 13,0.000000 }, + {1795,1795, 60, 0, 46, 46,0.000000 }, + {1796,1796, 60, 0, 33, 33,0.000000 }, + {1797,1797, 70, 0, 33, 33,0.000000 }, + {1798,1798, 51, 0, 160, 160,0.000000 }, + {1799,1799, 60, 0, 40, 40,0.000000 }, + {1798,1798, 54, 0, 140, 140,0.000000 }, + {1800,1800, 60, 0, 53, 53,0.000000 }, + {1798,1798, 56, 0, 140, 140,0.000000 }, + {1801,1801, 60, 0, 300, 300,0.000000 }, + {1798,1798, 61, 0, 166, 166,0.000000 }, + {1798,1798, 63, 0, 166, 166,0.000000 }, + {1802,1802, 48, 0, 300, 300,0.000000 }, + {1798,1798, 68, 0, 133, 133,0.000000 }, + {1803,1803, 60, 0, 393, 393,0.000000 }, + {1804,1804, 60, 0, 313, 313,0.000000 }, + {1805,1805, 66, 0, 100, 100,0.000000 }, + {1806,1806, 60, 0, 306, 306,0.000000 }, + { 379, 379, 59, 0, 40, 40,0.000000 }, + {1802,1802, 64, 0, 306, 306,0.000000 }, + {1807,1807, 48, 0, 566, 566,0.000000 }, + {1808,1808, 56, 0, 26, 26,0.000000 }, + {1809,1809, 53, 0, 73, 73,0.000000 }, + {1810,1810, 65, 0, 13, 13,0.000000 }, + {1811,1811, 49, 0, 86, 86,0.000000 }, + {1811,1811, 43, 0, 86, 86,0.000000 }, + { 386, 386, 65, 0, 86, 86,0.000000 }, + { 386, 386, 60, 0, 86, 86,0.000000 }, + {1812,1812, 70, 0, 80, 80,0.000000 }, + {1812,1812, 65, 0, 100, 100,0.000000 }, + {1813,1813, 60, 0, 40, 40,0.000000 }, + {1814,1814, 60, 0, 33, 33,0.000000 }, + {1815,1815, 56, 0, 93, 93,0.000000 }, + {1816,1816, 53, 0, 280, 280,0.000000 }, + {1817,1817, 60, 0, 60, 60,0.000000 }, + {1818,1818, 48, 0, 180, 180,0.000000 }, + {1819,1819, 69, 0, 20, 20,0.000000 }, + { 328, 328, 67, 0, 20, 20,0.000000 }, + { 328, 328, 62, 0, 20, 20,0.000000 }, + {1820,1820, 65, 0, 220, 220,0.000000 }, + {1821,1821, 60, 0, 220, 220,0.000000 }, + {1822,1822, 63, 0, 26, 26,0.000000 }, + {1823,1823, 63, 0, 606, 606,0.000000 }, + {1824,1824, 67, 0, 86, 86,0.000000 }, + {1825,1825, 60, 0, 300, 300,0.000000 }, + {1825,1825, 72, 0, 273, 273,0.000000 }, + { 401, 401, 62, 0, 6, 6,0.000000 }, + {1826,1826, 48, 0, 13, 13,0.000000 }, + {1827,1827, 53, 0, 213, 213,0.000000 }, + {1828,1828, 60, 0, 93, 93,0.000000 }, + {1829,1829, 60, 0, 40, 40,0.000000 }, + {1830,1830, 60, 0, 20, 20,0.000000 }, + {1831,1831, 60, 0, 46, 46,0.000000 }, + {1832,1832, 0, 0, 126, 0,0.000000 }, + {1833,1833, 0, 0, 1240, 1240,0.000000 }, + {1834,1834, 0, 0, 433, 433,0.000000 }, + {1835,1835, 0, 0, 40000, 0,0.000000 }, + {1836,1836, 0, 0, 40000, 153,0.000000 }, + {1837,1837, 0, 0, 146, 106,0.000000 }, + {1838,1838, 0, 0, 126, 126,0.000000 }, + {1839,1839, 0, 0, 1740, 1740,0.000000 }, + {1840,1840, 0, 0, 440, 13,0.000000 }, + {1841,1841, 0, 0, 546, 546,0.000000 }, + {1842,1842, 0, 0, 1420, 1420,0.000000 }, + { 525, 525, 0, 0, 1220, 1220,0.000000 }, + {1843,1843, 0, 0, 40000, 140,0.000000 }, + {1844,1844, 0, 0, 3873, 3873,0.000000 }, + {1845,1845, 0, 0, 546, 546,0.000000 }, + {1846,1846, 0, 0, 333, 333,0.000000 }, + {1847,1847, 0, 0, 4933, 4933,0.000000 }, + {1848,1848, 0, 0, 126, 0,0.000000 }, + {1849,1849, 0, 0, 380, 380,0.000000 }, + {1850,1850, 0, 0, 40000, 6,0.000000 }, + {1851,1851, 0, 0, 273, 273,0.000000 }, + {1852,1852, 0, 0, 233, 233,0.000000 }, + {1853,1853, 0, 0, 40000, 233,0.000000 }, + {1854,1854, 0, 0, 1466, 6,0.000000 }, + {1855,1855, 0, 0, 1380, 1380,0.000000 }, + {1856,1856, 0, 0, 40000, 106,0.000000 }, + {1857,1857, 0, 0, 40000, 133,0.000000 }, + {1858,1858, 0, 0, 913, 913,0.000000 }, + {1859,1859, 0, 0, 60, 60,0.000000 }, + {1860,1860, 0, 0, 40000, 6,0.000000 }, + {1861,1861, 0, 0, 866, 866,0.000000 }, + {1862,1862, 0, 0, 4726, 4726,0.000000 }, + {1863,1863, 0, 0, 40, 40,0.000000 }, + {1864,1864, 0, 0, 1793, 1793,0.000000 }, + {1865,1865, 0, 0, 246, 246,0.000000 }, + {1866,1866, 0, 0, 40000, 133,0.000000 }, + {1867,1867, 0, 0, 2006, 2006,0.000000 }, + {1868,1868, 0, 0, 140, 140,0.000000 }, + {1869,1869, 0, 0, 40000, 106,0.000000 }, + {1870,1870, 0, 0, 460, 460,0.000000 }, + {1871,1871, 0, 0, 146, 146,0.000000 }, + {1872,1872, 0, 0, 273, 273,0.000000 }, + {1873,1873, 0, 0, 40000, 46,0.000000 }, + {1874,1874, 41, 0, 120, 120,0.000000 }, + {1875,1875, 70, 0, 13, 13,0.000000 }, + {1876,1876, 60, 0, 40, 40,0.000000 }, + {1877,1877, 80, 0, 13, 13,0.000000 }, + {1878,1878, 84, 0, 20, 20,0.000000 }, + {1879,1879, 72, 0, 133, 133,0.000000 }, + {1880,1880, 84, 0, 266, 266,0.000000 }, + { 128, 128, 70, 0, 13, 13,0.000000 }, + { 132, 132, 60, 0, 13, 13,0.000000 }, + {1881,1882, 0, 0, 40000, 173,0.000000 }, + {1883,1883, 0, 0, 260, 260,0.000000 }, + {1884,1885, 0, 0, 40000, 6,0.000000 }, + {1886,1887, 0, 0, 40000, 20,0.000000 }, + {1888,1889, 0, 0, 40000, 6,0.000000 }, + {1890,1890, 0, 0, 1020, 53,0.000000 }, + {1891,1891, 0, 0, 40000, 100,0.000000 }, + {1892,1892, 0, 0, 786, 340,0.000000 }, + {1893,1893, 0, 0, 40000, 140,0.000000 }, + {1894,1894, 0, 0, 86, 86,0.000000 }, + {1895,1895, 0, 0, 80, 40,0.000000 }, + {1896,1896, 0, 0, 40000, 86,0.000000 }, + {1897,1897, 0, 0, 173, 173,0.000000 }, + {1898,1898, 0, 0, 886, 886,0.000000 }, + {1899,1899, 0, 0, 466, 466,0.000000 }, + {1900,1900, 0, 0, 40000, 106,0.000000 }, + {1901,1901, 0, 0, 40000, 66,0.000000 }, + {1902,1902, 0, 0, 40000, 13,0.000000 }, + {1903,1903, 0, 0, 60, 60,0.000000 }, + {1904,1904, 0, 0, 1226, 1226,0.000000 }, + {1905,1905, 0, 0, 280, 280,0.000000 }, + {1906,1906, 0, 0, 40000, 153,0.000000 }, + {1907,1907, 0, 0, 40000, 173,0.000000 }, + {1908,1908, 0, 0, 40000, 340,0.000000 }, + {1909,1909, 0, 0, 166, 166,0.000000 }, + { 501, 501, 0, 0, 86, 86,0.000000 }, + {1910,1910, 0, 0, 40000, 20,0.000000 }, + {1911,1911, 0, 0, 20, 20,0.000000 }, + {1912,1912, 0, 0, 600, 600,0.000000 }, + {1913,1913, 0, 0, 40000, 2393,0.000000 }, + {1914,1914, 0, 0, 166, 166,0.000000 }, + { 511, 511, 0, 0, 586, 586,0.000000 }, + {1915,1915, 0, 0, 73, 73,0.000000 }, + {1910,1910, 60, 0, 40000, 26,0.000000 }, + { 511, 511, 72, 0, 493, 493,0.000000 }, + {1915,1915, 84, 0, 60, 60,0.000000 }, + {1916,1916, 0, 0, 2080, 2080,0.000000 }, + {1917,1917, 0, 0, 593, 593,0.000000 }, + {1918,1918, 0, 0, 600, 600,0.000000 }, + {1919,1919, 0, 0, 940, 940,0.000000 }, + {1920,1920, 0, 0, 940, 940,0.000000 }, + {1921,1921, 0, 0, 940, 940,0.000000 }, + {1922,1922, 0, 0, 853, 853,0.000000 }, + {1923,1923, 0, 0, 893, 893,0.000000 }, + {1924,1924, 0, 0, 40000, 73,0.000000 }, + {1925,1925, 0, 0, 40000, 33,0.000000 }, + {1926,1926, 0, 0, 40000, 20,0.000000 }, + {1927,1927, 0, 0, 40000, 0,0.000000 }, + {1928,1928, 0, 0, 40000, 193,0.000000 }, + {1929,1929, 0, 0, 40000, 133,0.000000 }, + {1930,1930, 0, 0, 40000, 153,0.000000 }, + {1931,1931, 0, 0, 1146, 1146,0.000000 }, + {1932,1932, 0, 0, 960, 960,0.000000 }, + {1933,1933, 0, 0, 2406, 2406,0.000000 }, + {1934,1934, 0, 0, 2406, 2406,0.000000 }, + {1935,1935, 0, 0, 40000, 0,0.000000 }, + {1936,1936, 0, 0, 40000, 6,0.000000 }, + {1937,1937, 0, 0, 40000, 0,0.000000 }, + {1938,1938, 0, 0, 40000, 0,0.000000 }, + {1939,1939, 0, 0, 40000, 26,0.000000 }, + {1940,1940, 0, 0, 1426, 1426,0.000000 }, + {1941,1941, 0, 0, 40000, 766,0.000000 }, + {1942,1942, 0, 0, 40000, 453,0.000000 }, + {1943,1943, 0, 0, 40000, 486,0.000000 }, + {1944,1944, 0, 0, 40000, 106,0.000000 }, + {1945,1945, 0, 0, 2273, 2273,0.000000 }, + {1946,1946, 0, 0, 40000, 33,0.000000 }, + {1947,1947, 0, 0, 1226, 1226,0.000000 }, + {1948,1948, 0, 0, 40000, 6,0.000000 }, + {1949,1949, 0, 0, 40000, 1966,0.000000 }, + {1950,1950, 0, 0, 1153, 1153,0.000000 }, + {1951,1951, 0, 0, 40000, 6,0.000000 }, + {1952,1952, 0, 0, 1473, 1473,0.000000 }, + {1953,1953, 0, 0, 40000, 20,0.000000 }, + {1954,1954, 0, 0, 466, 33,0.000000 }, + {1955,1955, 0, 0, 833, 833,0.000000 }, + {1956,1956, 0, 0, 40000, 0,0.000000 }, + {1957,1957, 0, 0, 40000, 33,0.000000 }, + {1958,1958, 0, 0, 40000, 126,0.000000 }, + {1959,1959, 0, 0, 40000, 33,0.000000 }, + {1960,1960, 0, 0, 280, 280,0.000000 }, + {1961,1961, 0, 0, 40000, 266,0.000000 }, + {1962,1962, 0, 0, 40000, 46,0.000000 }, + {1963,1963, 0, 0, 40000, 266,0.000000 }, + {1964,1964, 0, 0, 40000, 0,0.000000 }, + {1965,1965, 0, 0, 40000, 113,0.000000 }, + {1966,1966, 0, 0, 800, 800,0.000000 }, + {1967,1967, 0, 0, 1206, 1206,0.000000 }, + {1968,1968, 0, 0, 1080, 1080,0.000000 }, + {1969,1969, 0, 0, 40000, 13,0.000000 }, + {1970,1970, 0, 0, 546, 546,0.000000 }, + {1971,1971, 0, 0, 40000, 6,0.000000 }, + {1972,1972, 0, 0, 40000, 20,0.000000 }, + {1973,1973, 0, 0, 1233, 20,0.000000 }, + {1974,1974, 0, 0, 40000, 0,0.000000 }, + {1975,1975, 0, 0, 40000, 0,0.000000 }, + {1976,1976, 0, 0, 466, 6,0.000000 }, + {1977,1977, 0, 0, 206, 206,0.000000 }, + {1978,1978, 0, 0, 40000, 6,0.000000 }, + {1979,1979, 0, 0, 40000, 6,0.000000 }, + {1980,1980, 0, 0, 40000, 6,0.000000 }, + {1981,1981, 0, 0, 40000, 6,0.000000 }, + {1982,1982, 0, 0, 40000, 0,0.000000 }, + {1983,1983, 0, 0, 40000, 0,0.000000 }, + {1984,1984, 0, 0, 40000, 0,0.000000 }, + {1985,1985, 0, 0, 40000, 180,0.000000 }, + {1986,1986, 0, 0, 40000, 53,0.000000 }, + {1987,1987, 0, 0, 40000, 53,0.000000 }, + {1988,1988, 0, 0, 40000, 6,0.000000 }, + {1989,1989, 0, 0, 40000, 6,0.000000 }, + {1990,1990, 0, 0, 100, 100,0.000000 }, + {1991,1991, 0, 0, 40000, 73,0.000000 }, + {1992,1992, 0, 0, 60, 60,0.000000 }, + {1993,1993, 0, 0, 40000, 0,0.000000 }, + {1994,1994, 0, 0, 40000, 0,0.000000 }, + {1995,1995, 0, 0, 40000, 0,0.000000 }, + {1996,1996, 0, 0, 40000, 6,0.000000 }, + {1997,1997, 0, 0, 40000, 0,0.000000 }, + {1998,1998, 0, 0, 40000, 0,0.000000 }, + {1999,1999, 0, 0, 40000, 0,0.000000 }, + {2000,2000, 0, 0, 40000, 233,0.000000 }, + {2001,2001, 0, 0, 40000, 233,0.000000 }, + {2002,2002, 0, 0, 620, 620,0.000000 }, + {2003,2003, 0, 0, 1740, 1740,0.000000 }, + {2004,2004, 0, 0, 1153, 1153,0.000000 }, + {2005,2005, 0, 0, 920, 920,0.000000 }, + {2006,2006, 0, 0, 153, 153,0.000000 }, + {2007,2007, 0, 0, 526, 526,0.000000 }, + {2008,2008, 0, 0, 40000, 6,0.000000 }, + {2009,2009, 0, 0, 40000, 40,0.000000 }, + {2010,2010, 0, 0, 40000, 53,0.000000 }, + {2011,2011, 0, 0, 40000, 160,0.000000 }, + {2012,2012, 0, 0, 40000, 6,0.000000 }, + {2013,2013, 0, 0, 1046, 1046,0.000000 }, + {2014,2014, 0, 0, 513, 513,0.000000 }, + {2015,2015, 0, 0, 40, 40,0.000000 }, + {2016,2016, 0, 0, 40, 40,0.000000 }, + {2017,2017, 0, 0, 93, 93,0.000000 }, + {2018,2018, 0, 0, 66, 66,0.000000 }, + {2019,2019, 0, 0, 13, 13,0.000000 }, + {2020,2020, 0, 0, 300, 300,0.000000 }, + {2021,2021, 0, 0, 40, 40,0.000000 }, + {2022,2022, 0, 0, 586, 586,0.000000 }, + {2023,2023, 0, 0, 260, 260,0.000000 }, + {2024,2024, 0, 0, 2406, 2406,0.000000 }, + {2025,2025, 0, 0, 126, 126,0.000000 }, + {2026,2026, 0, 0, 1220, 1220,0.000000 }, + {2027,2027, 0, 0, 386, 386,0.000000 }, + { 352, 352, 51, 0, 40000, 0,0.000000 }, + {2028,2028, 35, 0, 106, 106,0.000000 }, + {2028,2028, 36, 0, 93, 93,0.000000 }, + {2029,2029, 47, 0, 13, 13,0.000000 }, + {2030,2030, 38, 0, 106, 106,0.000000 }, + {2019,2019, 39, 0, 20, 20,0.000000 }, + {2031,2031, 45, 0, 80, 80,0.000000 }, + { 492, 492, 41, 0, 26, 26,0.000000 }, + {2032,2032, 42, 0, 33, 33,0.000000 }, + {2033,2033, 44, 0, 160, 160,0.000000 }, + { 492, 492, 48, 0, 40, 40,0.000000 }, + {2034,2034, 46, 0, 600, 600,0.000000 }, + { 492, 492, 53, 0, 26, 26,0.000000 }, + { 167, 167, 56, 0, 160, 160,0.000000 }, + {2035,2035, 61, 0, 93, 93,0.000000 }, + {2036,2036, 56, 0, 353, 353,0.000000 }, + {2037,2037, 60, 0, 40, 40,0.000000 }, + { 144, 144, 59, 0, 40, 40,0.000000 }, + {2038,2038, 59, 0, 13, 13,0.000000 }, + { 169, 169, 51, 0, 40, 40,0.000000 }, + { 169, 169, 45, 0, 40, 40,0.000000 }, + {2039,2039, 72, 0, 126, 126,0.000000 }, + {2040,2040, 60, 0, 153, 153,0.000000 }, + {2041,2041, 58, 0, 40, 40,0.000000 }, + {2042,2042, 53, 0, 40, 40,0.000000 }, + {2043,2043, 73, 0, 26, 26,0.000000 }, + { 158, 158, 75, 0, 20, 20,0.000000 }, + {2044,2044, 0, 0, 1226, 1226,0.000000 }, + {2045,2045, 0, 0, 493, 493,0.000000 }, + {2046,2046, 0, 0, 620, 620,0.000000 }, + {2047,2047, 0, 0, 280, 280,0.000000 }, + {2048,2048, 0, 0, 260, 260,0.000000 }, + {2049,2049, 0, 0, 40000, 1093,0.000000 }, + {2050,2050, 0, 0, 40000, 233,0.000000 }, + {2051,2051, 0, 0, 120, 120,0.000000 }, + {2052,2052, 0, 0, 40000, 926,0.000000 }, + {2053,2053, 0, 0, 40000, 926,0.000000 }, + {2054,2054, 0, 0, 40000, 233,0.000000 }, + {2055,2055, 0, 0, 40000, 280,0.000000 }, + {2056,2056, 0, 0, 40000, 6,0.000000 }, + {2057,2057, 0, 0, 40000, 153,0.000000 }, + {2058,2058, 0, 0, 286, 286,0.000000 }, + {2059,2059, 0, 0, 286, 286,0.000000 }, + {2060,2060, 0, 0, 40000, 0,0.000000 }, + {2061,2061, 0, 0, 680, 680,0.000000 }, + {2062,2062, 0, 0, 280, 280,0.000000 }, + {2063,2063, 0, 0, 40000, 200,0.000000 }, + {2064,2064, 0, 0, 40, 40,0.000000 }, + {2065,2065, 0, 0, 1580, 1580,0.000000 }, + {2066,2066, 0, 0, 140, 133,0.000000 }, + {2067,2067, 0, 0, 40000, 213,0.000000 }, + {2068,2068, 0, 0, 613, 613,0.000000 }, + {2069,2069, 0, 0, 293, 293,0.000000 }, + {2070,2070, 0, 0, 160, 160,0.000000 }, + {2071,2071, 0, 0, 146, 13,0.000000 }, + {2072,2072, 0, 0, 40000, 6,0.000000 }, + {2073,2073, 0, 0, 40000, 133,0.000000 }, + {2074,2074, 0, 0, 40000, 140,0.000000 }, + {2075,2075, 0, 0, 40000, 66,0.000000 }, + {2076,2076, 0, 0, 40000, 40,0.000000 }, + {2077,2077, 0, 0, 40000, 153,0.000000 }, + {2078,2078, 0, 0, 593, 593,0.000000 }, + {2079,2079, 0, 0, 40000, 40,0.000000 }, + {2080,2080, 0, 0, 4480, 4480,0.000000 }, + {2081,2081, 0, 0, 3600, 313,0.000000 }, + {2082,2082, 0, 0, 40000, 413,0.000000 }, + {2083,2083, 0, 0, 40000, 566,0.000000 }, + {2084,2084, 0, 0, 8420, 80,0.000000 }, + {2085,2085, 0, 0, 40000, 926,0.000000 }, + {2086,2086, 0, 0, 40000, 853,0.000000 }, + {2087,2087, 0, 0, 40000, 853,0.000000 }, + {2088,2088, 0, 0, 40000, 853,0.000000 }, + {2089,2089, 0, 0, 40000, 873,0.000000 }, + {2090,2090, 0, 0, 40000, 1780,0.000000 }, + {2091,2091, 0, 0, 40000, 1673,0.000000 }, + {2092,2092, 0, 0, 4026, 4026,0.000000 }, + {2093,2093, 0, 0, 1773, 153,0.000000 }, + {2094,2094, 0, 0, 1446, 1446,0.000000 }, + {2095,2095, 0, 0, 633, 633,0.000000 }, + {2096,2096, 0, 0, 333, 333,0.000000 }, + {2097,2097, 0, 0, 193, 193,0.000000 }, + {2098,2098, 0, 0, 86, 86,0.000000 }, + {2099,2099, 0, 0, 246, 246,0.000000 }, + {2100,2100, 0, 0, 40000, 6,0.000000 }, + {2101,2101, 0, 0, 40000, 6,0.000000 }, + {2102,2102, 0, 0, 313, 313,0.000000 }, + {2103,2103, 0, 0, 160, 160,0.000000 }, + {2104,2104, 0, 0, 46, 46,0.000000 }, + {2105,2105, 0, 0, 100, 100,0.000000 }, + {2106,2106, 0, 0, 2313, 2313,0.000000 }, + {2107,2107, 0, 0, 306, 306,0.000000 }, + {2108,2108, 0, 0, 40000, 2180,0.000000 }, + {2109,2109, 0, 0, 40000, 133,0.000000 }, + {2110,2110, 0, 0, 40000, 126,0.000000 }, + {2111,2111, 0, 0, 40000, 146,0.000000 }, + { 752, 752, 60, 0, 40, 40,0.000000 }, + { 755, 755, 12, 0, 160, 160,0.000000 }, + {2112,2112, 89, 0, 13, 13,0.000000 }, + {2113,2113, 89, 0, 206, 206,0.000000 }, + { 755, 755, 14, 0, 160, 160,0.000000 }, + { 755, 755, 16, 0, 160, 160,0.000000 }, + {2114,2114, 84, 0, 513, 513,0.000000 }, + { 755, 755, 19, 0, 160, 160,0.000000 }, + {2115,2115, 38, 0, 60, 60,0.000000 }, + {2116,2116, 36, 0, 20, 20,0.000000 }, + { 755, 755, 28, 0, 193, 193,0.000000 }, + { 755, 755, 26, 0, 200, 200,0.000000 }, + { 755, 755, 35, 0, 200, 200,0.000000 }, + { 755, 755, 30, 0, 193, 193,0.000000 }, + {2117,2117, 60, 0, 73, 73,0.000000 }, + {2104,2104, 60, 0, 40, 40,0.000000 }, + {2104,2104, 55, 0, 46, 46,0.000000 }, + { 730, 730, 94, 0, 626, 626,0.000000 }, + {2118,2118, 0, 0, 280, 280,0.000000 }, + {2119,2119, 0, 0, 1446, 1446,0.000000 }, + {2120,2120, 0, 0, 40000, 53,0.000000 }, + {2121,2121, 0, 0, 40000, 20,0.000000 }, + {2122,2122, 0, 0, 40000, 20,0.000000 }, + {2123,2123, 0, 0, 3106, 3106,0.000000 }, + {2124,2124, 0, 0, 40, 66,0.000000 }, + {2125,2125, 0, 0, 40000, 106,0.000000 }, + {2126,2126, 0, 0, 40000, 6,0.000000 }, + {2127,2127, 0, 0, 40000, 13,0.000000 }, + {2128,2128, 0, 0, 40000, 6,0.000000 }, + {2129,2129, 0, 0, 40000, 6,0.000000 }, + {2130,2130, 0, 0, 40000, 6,0.000000 }, + {2131,2131, 0, 0, 40000, 13,0.000000 }, + {2132,2132, 0, 0, 40000, 6,0.000000 }, + {2133,2133, 0, 0, 2060, 13,0.000000 }, + {2134,2134, 0, 0, 40000, 53,0.000000 }, + {2135,2135, 0, 0, 2886, 2886,0.000000 }, + {2136,2136, 0, 0, 40000, 126,0.000000 }, + {2137,2137, 0, 0, 5280, 100,0.000000 }, + {2138,2138, 0, 0, 140, 140,0.000000 }, + {2139,2139, 0, 0, 4553, 20,0.000000 }, + {2140,2140, 0, 0, 513, 513,0.000000 }, + {2141,2141, 60, 0, 40, 40,0.000000 }, + {2141,2141, 44, 0, 40, 40,0.000000 }, + {2142,2142, 47, 0, 40, 40,0.000000 }, + {2143,2143, 47, 0, 60, 60,0.000000 }, + {2144,2144, 62, 0, 606, 606,0.000000 }, + {2145,2145, 93, 0, 226, 226,0.000000 }, + {2146,2146, 50, 0, 80, 80,0.000000 }, + {2145,2145, 40, 0, 420, 420,0.000000 }, + {2147,2147, 60, 0, 20, 20,0.000000 }, + { 898, 898, 60, 0, 46, 46,0.000000 }, + {2147,2147, 57, 0, 20, 20,0.000000 }, + { 900, 900, 42, 0, 193, 193,0.000000 }, + { 900, 900, 38, 0, 193, 193,0.000000 }, + { 908, 908, 88, 0, 33, 33,0.000000 }, + {2148,2148, 0, 0, 1553, 1553,0.000000 }, + {2149,2149, 0, 0, 40000, 6,0.000000 }, + {2150,2150, 0, 0, 993, 993,0.000000 }, + {2151,2151, 0, 0, 40000, 26,0.000000 }, + {2152,2152, 0, 0, 29720, 80,0.000000 }, + {2153,2153, 0, 0, 40000, 306,0.000000 }, + {2154,2154, 0, 0, 700, 700,0.000000 }, + {2155,2155, 0, 0, 880, 880,0.000000 }, + {2156,2156, 0, 0, 40000, 6,0.000000 }, + {2157,2157, 0, 0, 1046, 1046,0.000000 }, + {2158,2158, 0, 0, 100, 100,0.000000 }, + {2159,2159, 0, 0, 40, 40,0.000000 }, + { 136, 136, 0, 0, 640, 640,0.000000 }, + { 168, 168, 0, 0, 40, 40,0.000000 }, + { 164, 164, 0, 0, 1220, 1220,0.000000 }, + { 167, 167, 0, 0, 160, 160,0.000000 }, + {2160,2160, 65, 0, 40, 40,0.000000 }, + {2161,2161, 21, 0, 200, 200,0.000000 }, + {2162, 173, 0, 0, 1513, 1513,0.000000 }, + {2163,2164, 0, 0, 653, 653,0.000000 }, + {2165,2166, 0, 0, 633, 633,0.000000 }, + {2167,2168, 0, 0, 913, 913,0.000000 }, + {2169,2170, 0, 0, 300, 300,0.000000 }, + {2171,2172, 0, 0, 1773, 1773,0.000000 }, + {2173,2174, 0, 0, 40000, 306,0.000000 }, + {2175,2174, 0, 0, 40000, 433,0.000000 }, + {2176, 299, 0, 0, 40000, 66,0.000000 }, + {2177,2178, 0, 0, 40000, 246,0.000000 }, + {2179,2180, 0, 0, 40000, 300,0.000000 }, + {2181,2182, 0, 0, 40000, 233,0.000000 }, + {2183,2184, 0, 0, 1740, 1740,0.000000 }, + { 127, 127, 65, 0, 66, 66,0.000000 }, + { 127, 127, 72, 0, 46, 46,0.000000 }, + { 364, 365, 52, 0, 20, 20,0.000000 }, + {2185,2186, 60, 0, 80, 80,0.000000 }, + {1550,1551, 47, 0, 100, 100,0.000000 }, + {1556,1557, 76, 0, 253, 253,0.000000 }, + { 374, 375, 84, 0, 40000, 0,0.000000 }, + {1564,1565, 83, 0, 73, 73,0.000000 }, + {1568,1569, 24, 0, 40, 40,0.000000 }, + {1556,1557, 77, 0, 253, 253,0.000000 }, + {1572,1573, 60, 0, 80, 80,0.000000 }, + {1574,1575, 65, 0, 46, 46,0.000000 }, + { 391, 392, 44, 0, 80, 80,0.000000 }, + { 391, 393, 40, 0, 40, 40,0.000000 }, + {1606,1607, 72, 0, 33, 33,0.000000 }, + { 398, 399, 73, 0, 400, 400,0.000000 }, + {1608,1609, 70, 0, 353, 353,0.000000 }, + {2187,2187, 0, 0, 40000, 140,0.000000 }, + {2188,2188, 0, 0, 40000, 153,0.000000 }, + {2189,2189, 0, 0, 453, 453,0.000000 }, + {2190,2190, 0, 0, 1300, 1300,0.000000 }, + {2191,2191, 0, 0, 46, 46,0.000000 }, + {2192,2192, 0, 0, 40000, 186,0.000000 }, + {2193,2193, 0, 0, 80, 80,0.000000 }, + {2194,2194, 0, 0, 40000, 6,0.000000 }, + {2195,2195, 0, 0, 186, 186,0.000000 }, + {2196,2196, 0, 0, 40000, 0,0.000000 }, + {2197,2197, 0, 0, 40000, 0,0.000000 }, + {2198,2198, 0, 0, 166, 0,0.000000 }, + {2199,2199, 0, 0, 40, 40,0.000000 }, + {2200,2200, 0, 0, 1740, 1740,0.000000 }, + { 528, 528, 0, 0, 140, 140,0.000000 }, + {2201,2201, 0, 0, 40000, 53,0.000000 }, + {2202,2202, 0, 0, 40, 40,0.000000 }, + {2203,2203, 0, 0, 80, 80,0.000000 }, + {2204,2204, 41, 0, 46, 46,0.000000 }, + {2205,2205, 84, 0, 40, 40,0.000000 }, + {2206,2206, 72, 0, 133, 133,0.000000 }, + { 741, 741, 48, 0, 133, 133,0.000000 }, + {2207,2207, 0, 0, 40, 40,0.000000 }, + {2208,2208, 0, 0, 940, 940,0.000000 }, + {2209,2209, 0, 0, 40000, 213,0.000000 }, + {2210,2210, 0, 0, 866, 866,0.000000 }, + {2211,2211, 0, 0, 40000, 0,0.000000 }, + {2212,2212, 0, 0, 40000, 6,0.000000 }, + {2213,2213, 0, 0, 1080, 1080,0.000000 }, + {2214,2214, 0, 0, 40000, 0,0.000000 }, + {2215,2215, 0, 0, 40000, 73,0.000000 }, + {2216,2216, 0, 0, 40000, 26,0.000000 }, + {2217,2217, 0, 0, 2360, 13,0.000000 }, + {2218,2218, 0, 0, 40000, 0,0.000000 }, + {2219,2219, 0, 0, 3126, 13,0.000000 }, + {2220,2220, 0, 0, 40000, 140,0.000000 }, + {2221,2221, 0, 0, 40000, 26,0.000000 }, + {2222,2222, 0, 0, 40000, 140,0.000000 }, + {2223,2223, 0, 0, 40000, 0,0.000000 }, + {2224,2224, 0, 0, 126, 0,0.000000 }, + {2225,2225, 0, 0, 40000, 6,0.000000 }, + {2226,2226, 0, 0, 40000, 33,0.000000 }, + {2227,2227, 0, 0, 40000, 6,0.000000 }, + {2228,2228, 0, 0, 40000, 6,0.000000 }, + {2229,2229, 0, 0, 40000, 0,0.000000 }, + {2230,2230, 0, 0, 40000, 6,0.000000 }, + {2231,2231, 0, 0, 40000, 20,0.000000 }, + {2232,2232, 0, 0, 40000, 6,0.000000 }, + {2233,2233, 0, 0, 40000, 26,0.000000 }, + {2234,2234, 0, 0, 40000, 266,0.000000 }, + {2235,2235, 0, 0, 40000, 40,0.000000 }, + {2236,2236, 0, 0, 3500, 3500,0.000000 }, + {2237,2237, 0, 0, 860, 20,0.000000 }, + {2238,2238, 0, 0, 513, 513,0.000000 }, + {2239,2239, 0, 0, 973, 973,0.000000 }, + {2240,2240, 0, 0, 1446, 1446,0.000000 }, + {2241,2241, 0, 0, 2280, 2280,0.000000 }, + {2242,2242, 0, 0, 1713, 1713,0.000000 }, + {2243,2243, 0, 0, 200, 200,0.000000 }, + {2244,2244, 0, 0, 40000, 6,0.000000 }, + {2245,2245, 0, 0, 40000, 0,0.000000 }, + {2246,2246, 0, 0, 140, 140,0.000000 }, + {2247,2247, 60, 0, 46, 46,0.000000 }, + {2248,2248, 60, 0, 306, 306,0.000000 }, + {2249,2249, 48, 0, 300, 300,0.000000 }, + {2250,2250, 60, 0, 360, 360,0.000000 }, + {2251,2251, 60, 0, 306, 306,0.000000 }, + {2252,2252, 66, 0, 93, 93,0.000000 }, + {2253,2253, 60, 0, 313, 313,0.000000 }, + {2249,2249, 64, 0, 300, 300,0.000000 }, + {2254,2254, 60, 0, 40, 40,0.000000 }, + {2255,2255, 60, 0, 26, 26,0.000000 }, + {2256,2256, 56, 0, 106, 106,0.000000 }, + {2257,2257, 53, 0, 313, 313,0.000000 }, + {2258,2258, 60, 0, 60, 60,0.000000 }, + {2259,2259, 48, 0, 180, 180,0.000000 }, + {2260,2260, 67, 0, 80, 80,0.000000 }, + {2261,2261, 60, 0, 320, 320,0.000000 }, + {2261,2261, 72, 0, 246, 246,0.000000 }, + {2262,2262, 60, 0, 40, 40,0.000000 }, + {2263,2263, 0, 0, 593, 593,0.000000 }, + {2264,2264, 24, 0, 13, 13,0.000000 }, + {2265,2265, 36, 0, 26, 26,0.000000 }, + { 343, 343, 36, 0, 26, 26,0.000000 }, + { 347, 347, 0, 0, 66, 66,0.000000 }, + { 347, 347, 12, 0, 53, 53,0.000000 }, + {2266,2266, 12, 0, 60, 60,0.000000 }, + {2267,2267, 24, 0, 20, 20,0.000000 }, + {2267,2267, 36, 0, 13, 13,0.000000 }, + {2268,2268, 0, 0, 66, 66,0.000000 }, + {2266,2266, 24, 0, 20, 20,0.000000 }, + {2269,2269, 88, 0, 920, 920,0.000000 }, + {2270,2270, 88, 0, 486, 486,0.000000 }, + {2271,2271, 13, 0, 100, 100,0.000000 }, + { 351, 351, 0, 0, 73, 73,0.000000 }, + {2271,2271, 15, 0, 113, 113,0.000000 }, + {2272,2272, 0, 0, 1226, 1226,0.000000 }, + {2273,2273, 0, 0, 2193, 2193,0.000000 }, + {2274,2274, 0, 0, 866, 866,0.000000 }, + {2275,2275, 0, 0, 886, 886,0.000000 }, + {2276,2276, 0, 0, 1900, 1900,0.000000 }, + {2277,2277, 0, 0, 266, 266,0.000000 }, + {2278,2278, 0, 0, 313, 313,0.000000 }, + {2279,2279, 0, 0, 40000, 1833,0.000000 }, + {2280,2280, 0, 0, 126, 126,0.000000 }, + {2281,2281, 0, 0, 4580, 4580,0.000000 }, + {2282,2282, 0, 0, 253, 253,0.000000 }, + {2283,2283, 0, 0, 120, 120,0.000000 }, + {2284,2284, 0, 0, 40000, 46,0.000000 }, + {2285,2285, 0, 0, 2320, 13,0.000000 }, + {2286,2286, 0, 0, 80, 60,0.000000 }, + {2287,2287, 0, 0, 400, 400,0.000000 }, + {2288,2288, 0, 0, 1953, 1953,0.000000 }, + {2289,2289, 0, 0, 1446, 1446,0.000000 }, + {2290,2290, 0, 0, 360, 360,0.000000 }, + {2291,2291, 0, 0, 40000, 6,0.000000 }, + {2292,2292, 0, 0, 40000, 6,0.000000 }, + {2293,2293, 0, 0, 2026, 2026,0.000000 }, + {2294,2294, 0, 0, 246, 13,0.000000 }, + {2295,2295, 0, 0, 233, 233,0.000000 }, + {2296,2296, 0, 0, 2600, 1333,0.000000 }, + {2297,2297, 79, 0, 20, 20,0.000000 }, + {2297,2297, 72, 0, 20, 20,0.000000 }, + {2298,2298, 72, 0, 13, 13,0.000000 }, + {2298,2298, 79, 0, 13, 13,0.000000 }, + { 554, 554, 60, 0, 160, 160,0.000000 }, + {2299,2299, 72, 0, 253, 253,0.000000 }, + {2300,2300, 84, 0, 106, 106,0.000000 }, + { 555, 555, 66, 0, 20, 20,0.000000 }, + {2301,2302, 35, 0, 20, 20,0.000000 }, + {2303,2304, 52, 0, 20, 20,0.000000 }, + {2305,1548, 48, 0, 66, 66,0.000000 }, + {1595,1595, 58, 0, 33, 33,0.000000 }, + {2305,1548, 60, 0, 73, 73,0.000000 }, + {2306,2307, 47, 0, 606, 606,0.000000 }, + {2306,2307, 43, 0, 313, 313,0.000000 }, + {2306,2307, 49, 0, 706, 706,0.000000 }, + {2306,2307, 51, 0, 840, 840,0.000000 }, + {2306,2307, 54, 0, 820, 820,0.000000 }, + {2306,2307, 57, 0, 780, 780,0.000000 }, + {2306,2307, 72, 0, 713, 713,0.000000 }, + {2306,2307, 60, 0, 786, 786,0.000000 }, + {2306,2307, 76, 0, 720, 720,0.000000 }, + {2306,2307, 84, 0, 720, 720,0.000000 }, + {2306,2307, 36, 0, 193, 193,0.000000 }, + {1560,2308, 65, 0, 113, 113,0.000000 }, + {2309,2310, 84, 0, 40000, 0,0.000000 }, + {1564,1564, 83, 0, 60, 60,0.000000 }, + { 380, 381, 84, 0, 40000, 0,0.000000 }, + {1568,1568, 24, 0, 40, 40,0.000000 }, + {2306,2307, 77, 0, 713, 713,0.000000 }, + {2311,2312, 60, 0, 86, 86,0.000000 }, + {2313,2314, 65, 0, 160, 160,0.000000 }, + {2315,2315, 59, 0, 13, 13,0.000000 }, + {2316,2316, 51, 0, 40, 40,0.000000 }, + {1612,1612, 45, 0, 46, 46,0.000000 }, + {2317,2317, 71, 0, 133, 133,0.000000 }, + {2318,2318, 60, 0, 153, 153,0.000000 }, + {2319,2319, 58, 0, 40, 40,0.000000 }, + {2320,2320, 53, 0, 40, 40,0.000000 }, + { 397, 397, 64, 0, 86, 86,0.000000 }, + {2321,2321, 71, 0, 13, 13,0.000000 }, + {2322,2322, 61, 0, 326, 326,0.000000 }, + {2323,2323, 61, 0, 640, 640,0.000000 }, + {2324, 392, 44, 0, 80, 80,0.000000 }, + {2324, 393, 40, 0, 40, 40,0.000000 }, + {1595,1595, 69, 0, 20, 20,0.000000 }, + {1595,1595, 68, 0, 20, 20,0.000000 }, + {1595,1595, 63, 0, 33, 33,0.000000 }, + {2325,2326, 74, 0, 200, 200,0.000000 }, + {2327,2328, 60, 0, 340, 340,0.000000 }, + {2329,2330, 80, 0, 113, 113,0.000000 }, + {2331,2332, 64, 0, 500, 500,0.000000 }, + { 397, 397, 72, 0, 73, 73,0.000000 }, + {2333,2334, 78, 0, 806, 806,0.000000 }, + {1608,1609, 82, 0, 353, 353,0.000000 }, + {2315,2315, 48, 0, 13, 13,0.000000 }, + {2316,2316, 53, 0, 40, 40,0.000000 }, + {2335,2335, 0, 0, 546, 546,0.000000 }, + {2336,2337, 0, 0, 546, 546,0.000000 }, + {2338,2339, 0, 0, 40000, 86,0.000000 }, + {2340,2340, 0, 0, 1580, 1580,0.000000 }, + {2341,2341, 0, 0, 1153, 1153,0.000000 }, + {2342,2342, 0, 0, 40000, 220,0.000000 }, + {2343,2343, 0, 0, 40000, 240,0.000000 }, + {2344,2345, 0, 0, 380, 380,0.000000 }, + {2346,2346, 0, 0, 40000, 6,0.000000 }, + {2347,2348, 0, 0, 40000, 20,0.000000 }, + {2349,2350, 0, 0, 40000, 6,0.000000 }, + {2351,2352, 0, 0, 40000, 6,0.000000 }, + {2353,2354, 0, 0, 40000, 20,0.000000 }, + {2355,2356, 0, 0, 40000, 213,0.000000 }, + {2357,2357, 14, 0, 26, 26,0.000000 }, + {2358,2358, 35, 0, 40, 40,0.000000 }, + {2357,2357, 19, 0, 26, 26,0.000000 }, + {2359,2359, 43, 0, 86, 86,0.000000 }, + {2360,2360, 41, 0, 60, 60,0.000000 }, + {2360,2360, 43, 0, 53, 53,0.000000 }, + {2360,2360, 45, 0, 60, 60,0.000000 }, + {2360,2360, 47, 0, 53, 53,0.000000 }, + {2361,2362, 0, 0, 1553, 1553,0.000000 }, + {2363,2363, 0, 0, 1213, 1213,0.000000 }, + {2364,2364, 0, 0, 2280, 2280,0.000000 }, + {2365,2365, 0, 0, 966, 966,0.000000 }, + {2366,2366, 0, 0, 500, 500,0.000000 }, + {2367,2367, 0, 0, 326, 326,0.000000 }, + {2368,2368, 0, 0, 1926, 1926,0.000000 }, + {2369,2369, 0, 0, 520, 520,0.000000 }, + {2370,2370, 0, 0, 993, 993,0.000000 }, + {2371,2371, 0, 0, 1740, 1740,0.000000 }, + {2372,2372, 0, 0, 2300, 80,0.000000 }, + {2373,2373, 0, 0, 513, 513,0.000000 }, + {2374,2374, 0, 0, 40, 40,0.000000 }, + {2375,2375, 0, 0, 1226, 1226,0.000000 }, + {2376,2376, 0, 0, 606, 606,0.000000 }, + {2377,2377, 0, 0, 40000, 6,0.000000 }, + {2378,2378, 0, 0, 993, 6,0.000000 }, + {2379,2379, 0, 0, 40000, 153,0.000000 }, + {2380,2380, 0, 0, 40000, 6,0.000000 }, + {2381,2381, 0, 0, 40000, 0,0.000000 }, + {2382,2382, 0, 0, 40000, 6,0.000000 }, + {2383,2383, 0, 0, 40000, 6,0.000000 }, + {2384,2384, 0, 0, 40000, 6,0.000000 }, + {2385,2385, 0, 0, 273, 273,0.000000 }, + {2386,2386, 0, 0, 1580, 1580,0.000000 }, + {2387,2387, 0, 0, 140, 140,0.000000 }, + { 402, 402, 0, 0, 146, 146,0.000000 }, + {2388,2388, 0, 0, 40000, 446,0.000000 }, + {2389,2389, 0, 0, 2006, 2006,0.000000 }, + {2390,2390, 0, 0, 353, 353,0.000000 }, + {2391,2391, 0, 0, 233, 233,0.000000 }, + {2392,2392, 0, 0, 226, 226,0.000000 }, + {2393,2393, 0, 0, 853, 853,0.000000 }, + {2394,2394, 0, 0, 100, 100,0.000000 }, + {2395,2395, 0, 0, 40000, 40,0.000000 }, + {2396,2397, 0, 0, 633, 20,0.000000 }, + {2398,2398, 0, 0, 40, 40,0.000000 }, + {2399,2400, 0, 0, 493, 493,0.000000 }, + {2401,2401, 0, 0, 40000, 86,0.000000 }, + {2402,2402, 0, 0, 40000, 0,0.000000 }, + {2403,2404, 0, 0, 40000, 66,0.000000 }, + {2405,2406, 0, 0, 186, 46,0.000000 }, + {2407,2408, 0, 0, 40000, 6,0.000000 }, + {2409,2409, 0, 0, 1153, 1153,0.000000 }, + {2410,2410, 0, 0, 40000, 0,0.000000 }, + {2411,2411, 0, 0, 86, 86,0.000000 }, + {2412,2413, 0, 0, 40000, 73,0.000000 }, + {2414,2414, 0, 0, 40000, 40,0.000000 }, + {2415,2416, 0, 0, 40000, 286,0.000000 }, + {2417,2418, 0, 0, 40000, 20,0.000000 }, + {2419,2420, 0, 0, 600, 600,0.000000 }, + {2421,2422, 0, 0, 253, 253,0.000000 }, + {2423,2424, 0, 0, 466, 466,0.000000 }, + {2425,2426, 0, 0, 40000, 6,0.000000 }, + {2427,2427, 33, 0, 53, 53,0.000000 }, + {2428,2429, 38, 0, 46, 46,0.000000 }, + {2430,2430, 38, 0, 13, 13,0.000000 }, + {2431,2431, 38, 0, 86, 86,0.000000 }, + {2432,2432, 40, 0, 6, 6,0.000000 }, + {2433,2434, 41, 0, 60, 60,0.000000 }, + {2435,2435, 0, 0, 20, 20,0.000000 }, + {2435,2435, 41, 0, 26, 26,0.000000 }, + {2360,2360, 48, 0, 53, 53,0.000000 }, + {2436,2436, 17, 0, 446, 446,0.000000 }, + {2360,2360, 50, 0, 46, 46,0.000000 }, + {2435,2435, 45, 0, 20, 20,0.000000 }, + {2437,2437,254, 0, 26, 26,0.000000 }, + {2438,2438, 60, 0, 80, 80,0.000000 }, + {2439,2439, 56, 0, 80, 80,0.000000 }, + {2440,2440, 60, 0, 40, 40,0.000000 }, + {2440,2440, 55, 0, 40, 40,0.000000 }, + {2441,2441, 63, 0, 86, 86,0.000000 }, + {2442,2442, 57, 0, 40, 40,0.000000 }, + {2443,2443, 0, 0, 40000, 106,0.000000 }, + {2444,2444, 0, 0, 246, 246,0.000000 }, + {2445,2445, 0, 0, 3133, 13,0.000000 }, + {2446,2446, 0, 0, 40000, 153,0.000000 }, + {2447,2447, 0, 0, 40000, 480,0.000000 }, + {2448,2448, 0, 0, 40000, 73,0.000000 }, + {2449,2449, 0, 0, 40000, 526,0.000000 }, + {2450,2450, 0, 0, 40000, 146,0.000000 }, + {2451,2451, 0, 0, 4520, 4520,0.000000 }, + {2452,2452, 0, 0, 280, 280,0.000000 }, + { 752, 752, 55, 0, 46, 46,0.000000 }, + {2453,2453, 0, 0, 646, 646,0.000000 }, + {2454,2454, 0, 0, 600, 600,0.000000 }, + {2455,2455, 0, 0, 86, 86,0.000000 }, + {2456,2456, 0, 0, 386, 386,0.000000 }, + {2457,2457, 0, 0, 40000, 0,0.000000 }, + {2458,2458, 0, 0, 1340, 1340,0.000000 }, + {2459,2459, 0, 0, 786, 786,0.000000 }, + {2460,2460, 0, 0, 680, 680,0.000000 }, + {2461,2461, 0, 0, 2113, 2113,0.000000 }, + {2462,2462, 0, 0, 3193, 13,0.000000 }, + {2463,2463, 0, 0, 726, 726,0.000000 }, + { 884, 884, 0, 0, 46, 46,0.000000 }, + { 884, 884, 28, 0, 100, 100,0.000000 }, + {2464,2464, 29, 0, 66, 66,0.000000 }, + { 886, 886, 31, 0, 20, 20,0.000000 }, + { 360, 360, 32, 0, 46, 46,0.000000 }, + { 361, 361, 33, 0, 100, 100,0.000000 }, + {2453,2453, 34, 0, 760, 760,0.000000 }, + { 888, 888, 29, 0, 46, 46,0.000000 }, + { 886, 886, 55, 0, 13, 13,0.000000 }, + { 890, 890, 48, 0, 73, 73,0.000000 }, + { 884, 884, 58, 0, 40, 40,0.000000 }, + {2465,2465, 45, 0, 46, 46,0.000000 }, + {2465,2465, 43, 0, 46, 46,0.000000 }, + {2466,2466, 73, 0, 520, 520,0.000000 }, + {2467,2467, 72, 0, 266, 266,0.000000 }, + {2468,2468, 76, 0, 160, 160,0.000000 }, + {2467,2467, 84, 0, 273, 273,0.000000 }, + {2468,2468, 36, 0, 166, 166,0.000000 }, + {2469,2469, 65, 0, 86, 86,0.000000 }, + {2470,2470, 83, 0, 73, 73,0.000000 }, + {2471,2471, 50, 0, 300, 300,0.000000 }, + {2468,2468, 77, 0, 133, 133,0.000000 }, + { 897, 897, 55, 0, 33, 33,0.000000 }, + {2472,2472, 60, 0, 46, 46,0.000000 }, + { 897, 897, 50, 0, 33, 33,0.000000 }, + {2473,2473, 42, 0, 206, 206,0.000000 }, + {2473,2473, 46, 0, 166, 166,0.000000 }, + {2474,2474, 71, 0, 133, 133,0.000000 }, + {2474,2474, 60, 0, 160, 160,0.000000 }, + {2455,2455, 58, 0, 66, 66,0.000000 }, + {2455,2455, 53, 0, 86, 86,0.000000 }, + {2475,2475, 91, 0, 40, 40,0.000000 }, + {2476,2476, 61, 0, 140, 140,0.000000 }, + {2477,2477, 61, 0, 786, 786,0.000000 }, + {2478,2478, 44, 0, 33, 33,0.000000 }, + {2479,2479, 40, 0, 840, 840,0.000000 }, + {2480,2480, 69, 0, 40, 40,0.000000 }, + { 361, 361, 68, 0, 40, 40,0.000000 }, + { 361, 361, 63, 0, 60, 60,0.000000 }, + {2481,2481, 74, 0, 73, 73,0.000000 }, + {2482,2482, 60, 0, 73, 73,0.000000 }, + { 908, 908, 80, 0, 33, 33,0.000000 }, + {2483,2483, 64, 0, 306, 306,0.000000 }, + {2483,2483, 73, 0, 260, 260,0.000000 }, + {2483,2483, 70, 0, 260, 260,0.000000 }, + { 886, 886, 68, 0, 6, 6,0.000000 }, + { 886, 886, 48, 0, 13, 13,0.000000 }, + {2484,2484, 0, 0, 440, 440,0.000000 }, + {2485,2485, 0, 0, 253, 253,0.000000 }, + {2486,2486, 0, 0, 306, 306,0.000000 }, + {2487,2487, 0, 0, 1213, 1213,0.000000 }, + {2488,2488, 0, 0, 626, 626,0.000000 }, + {2489,2489, 0, 0, 40000, 206,0.000000 }, + {2490,2490, 0, 0, 40000, 100,0.000000 }, + {2491,2491, 0, 0, 40000, 13,0.000000 }, + {2492,2492, 0, 0, 2273, 2273,0.000000 }, + {2493,2493, 0, 0, 1740, 1740,0.000000 }, + {2494,2494, 0, 0, 1953, 1953,0.000000 }, + {2495,2495, 0, 0, 1740, 1740,0.000000 }, + {2496,2496, 0, 0, 386, 386,0.000000 }, + {2497,2497, 0, 0, 233, 233,0.000000 }, + {2498,2498, 0, 0, 40000, 106,0.000000 }, + {2499,2499, 0, 0, 40000, 13,0.000000 }, + {2500,2500, 0, 0, 40000, 0,0.000000 }, + {2501,2501, 0, 0, 40000, 186,0.000000 }, + {2502,2502, 0, 0, 66, 66,0.000000 }, + {2503,2503, 0, 0, 46, 46,0.000000 }, + {2504,2504, 0, 0, 40000, 186,0.000000 }, + {2505,2505, 0, 0, 1106, 1106,0.000000 }, + {2506,2506, 0, 0, 40000, 186,0.000000 }, + {2507,2507, 0, 0, 40000, 100,0.000000 }, + {2508,2508, 0, 0, 40000, 206,0.000000 }, + {2509,2509, 0, 0, 40000, 60,0.000000 }, + {2510,2510, 0, 0, 40000, 106,0.000000 }, + {2511,2511, 0, 0, 60, 60,0.000000 }, + {2512,2512, 0, 0, 40, 40,0.000000 }, + {2513,2513, 0, 0, 1833, 26,0.000000 }, + {2514,2514, 0, 0, 806, 806,0.000000 }, + {2515,2515, 0, 0, 1106, 1106,0.000000 }, + {2516,2516, 0, 0, 40000, 6,0.000000 }, + {2517,2517, 0, 0, 40000, 180,0.000000 }, + {2518,2518, 0, 0, 40000, 340,0.000000 }, + {2519,2519, 0, 0, 1873, 6,0.000000 }, + {2520,2520, 0, 0, 2586, 2586,0.000000 }, + {2521,2521, 0, 0, 1740, 1740,0.000000 }, + {2522,2522, 0, 0, 3493, 13,0.000000 }, + {2523,2523, 0, 0, 40000, 266,0.000000 }, + {2524,2524, 0, 0, 6160, 33,0.000000 }, + {2525,2525, 0, 0, 40000, 46,0.000000 }, + {2526,2526, 0, 0, 1140, 1140,0.000000 }, + { 346, 346, 30, 0, 46, 46,0.000000 }, + { 346, 346, 31, 0, 33, 33,0.000000 }, + { 346, 346, 32, 0, 40, 40,0.000000 }, + { 346, 346, 33, 0, 46, 46,0.000000 }, + { 346, 346, 34, 0, 53, 53,0.000000 }, + { 346, 346, 35, 0, 33, 33,0.000000 }, + { 346, 346, 37, 0, 146, 146,0.000000 }, + { 346, 346, 39, 0, 186, 186,0.000000 }, + { 346, 346, 41, 0, 206, 206,0.000000 }, + { 346, 346, 43, 0, 133, 133,0.000000 }, + { 346, 346, 45, 0, 126, 126,0.000000 }, + { 346, 346, 47, 0, 153, 153,0.000000 }, + { 346, 346, 48, 0, 153, 153,0.000000 }, + { 346, 346, 49, 0, 153, 153,0.000000 }, + { 512, 512, 84, 0, 73, 73,0.000000 }, + {2206,2206, 84, 0, 140, 140,0.000000 }, + {2527,2527, 55, 0, 13, 13,0.000000 }, + {2528,2528, 36, 0, 20, 20,0.000000 }, + {2529,2529, 38, 0, 66, 66,0.000000 }, + {2530,2530, 60, 0, 86, 86,0.000000 }, + {2531,2531, 38, 0, 60, 60,0.000000 }, + {2532,2532, 17, 0, 2233, 2233,0.000000 }, + {2532,2532, 18, 0, 2266, 2266,0.000000 }, + {2532,2532, 19, 0, 2280, 2280,0.000000 }, + {2532,2532, 20, 0, 46, 46,0.000000 }, + {2532,2532, 21, 0, 46, 46,0.000000 }, + {2532,2532, 22, 0, 40, 40,0.000000 }, + {2532,2532, 23, 0, 53, 53,0.000000 }, + {2532,2532, 24, 0, 100, 100,0.000000 }, + {2532,2532, 25, 0, 46, 46,0.000000 }, + {2532,2532, 26, 0, 60, 60,0.000000 }, + {2532,2532, 27, 0, 40, 40,0.000000 }, + {2532,2532, 28, 0, 53, 53,0.000000 }, + {2532,2532, 29, 0, 126, 126,0.000000 }, + {2533,2533, 84, 0, 133, 133,0.000000 }, + {2534,2534, 48, 0, 86, 86,0.000000 }, + {2535,2535, 65, 0, 486, 486,0.000000 }, + {2536,2536, 65, 0, 526, 526,0.000000 }, + {2537,2537, 55, 0, 66, 66,0.000000 }, + {2537,2537, 41, 0, 60, 60,0.000000 }, + { 346, 346, 63, 0, 106, 106,0.000000 }, + { 346, 346, 55, 0, 106, 106,0.000000 }, + {2538,2538, 55, 0, 1200, 1200,0.000000 }, + {2538,2538, 53, 0, 1206, 1206,0.000000 }, + {2534,2534, 50, 0, 86, 86,0.000000 }, + { 506, 506, 84, 0, 133, 133,0.000000 }, + { 506, 506, 74, 0, 133, 133,0.000000 }, + { 504, 504, 84, 0, 473, 473,0.000000 }, + { 504, 504, 74, 0, 486, 486,0.000000 }, + {2539,2539, 84, 0, 133, 133,0.000000 }, + {2540,2540, 74, 0, 20, 20,0.000000 }, + {1911,1911, 48, 0, 46, 46,0.000000 }, + {1911,1911, 36, 0, 20, 20,0.000000 }, + {2541,2541, 74, 0, 133, 133,0.000000 }, + {2542,2542, 0, 0, 613, 613,0.000000 }, + {2543,2543, 0, 0, 40000, 480,0.000000 }, + {2544,2544, 0, 0, 1133, 1133,0.000000 }, + {2545,2545, 0, 0, 1200, 1200,0.000000 }, + {2546,2547, 0, 0, 1313, 1313,0.000000 }, + {2548,2549, 0, 0, 40000, 6,0.000000 }, + {2550,2550, 0, 0, 1740, 1740,0.000000 }, + {2551,2552, 0, 0, 860, 860,0.000000 }, + {2553,2553, 0, 0, 40000, 0,0.000000 }, + {2554,2554, 0, 0, 2300, 2300,0.000000 }, + {2555,2556, 0, 0, 40000, 0,0.000000 }, + {2557,2557, 0, 0, 506, 13,0.000000 }, + {2558,1467, 0, 0, 40000, 6,0.000000 }, + {2559,2560, 0, 0, 40000, 0,0.000000 }, + {2561,2561, 0, 0, 40000, 106,0.000000 }, + {2562,2562, 0, 0, 1013, 1013,0.000000 }, + {2563,2564, 0, 0, 1020, 1020,0.000000 }, + {2565,2565, 0, 0, 1746, 1746,0.000000 }, + {2566,2567, 0, 0, 1446, 1446,0.000000 }, + {2568,2568, 0, 0, 826, 826,0.000000 }, + {2569,2569, 0, 0, 2293, 2293,0.000000 }, + {2570,2570, 0, 0, 2386, 2386,0.000000 }, + {2571,2572, 0, 0, 40000, 46,0.000000 }, + {2573,2574, 0, 0, 40000, 26,0.000000 }, + {2575,2575, 0, 0, 40000, 126,0.000000 }, + { 229,2576, 0, 0, 1893, 13,0.000000 }, + {2577,2577, 0, 0, 1046, 1046,0.000000 }, + { 239,2578, 0, 0, 40000, 53,0.000000 }, + {2579,2579, 0, 0, 40000, 13,0.000000 }, + {2580,2580, 0, 0, 40000, 66,0.000000 }, + {2581,2582, 0, 0, 3466, 3466,0.000000 }, + {2583,2584, 0, 0, 233, 233,0.000000 }, + {2585,2586, 0, 0, 40000, 0,0.000000 }, + {2587,2588, 0, 0, 40000, 0,0.000000 }, + {2589,2589, 0, 0, 40000, 6,0.000000 }, + {2590,2590, 0, 0, 40000, 6,0.000000 }, + {2591,2592, 0, 0, 40000, 0,0.000000 }, + {2593,2594, 0, 0, 680, 0,0.000000 }, + {2595,2595, 0, 0, 40000, 0,0.000000 }, + {2596,2597, 0, 0, 40000, 6,0.000000 }, + {2598,2599, 0, 0, 40000, 0,0.000000 }, + {2600,2601, 0, 0, 40000, 13,0.000000 }, + {2602,2602, 0, 0, 5093, 5093,0.000000 }, + {2603,2603, 0, 0, 40000, 6,0.000000 }, + {2604,2604, 0, 0, 40000, 40,0.000000 }, + {2605,2606, 0, 0, 40000, 0,0.000000 }, + {2607,2607, 0, 0, 40000, 0,0.000000 }, + {2608,2609, 0, 0, 40000, 6,0.000000 }, + {2610,2610, 0, 0, 40000, 20,0.000000 }, + {2611,2611, 0, 0, 40000, 6,0.000000 }, + {2612,2612, 0, 0, 2253, 2253,0.000000 }, + {2613,2613, 0, 0, 973, 973,0.000000 }, + {2614,2615, 0, 0, 40000, 6,0.000000 }, + {2616,2617, 0, 0, 40000, 6,0.000000 }, + {2618,2619, 0, 0, 353, 353,0.000000 }, + {2620,2621, 0, 0, 40000, 500,0.000000 }, + {2622,2623, 0, 0, 40000, 26,0.000000 }, + {2624,2625, 0, 0, 40000, 53,0.000000 }, + {2626,2627, 0, 0, 4026, 13,0.000000 }, + {2628,2629, 0, 0, 3400, 13,0.000000 }, + {1516,2630, 0, 0, 226, 226,0.000000 }, + {2631,2632, 0, 0, 40000, 193,0.000000 }, + {2633,2633, 0, 0, 2380, 2380,0.000000 }, + {2634,2635, 0, 0, 40000, 373,0.000000 }, + {2636,2636, 0, 0, 40000, 133,0.000000 }, + {2637,2637, 0, 0, 280, 280,0.000000 }, + {2638,2639, 0, 0, 273, 273,0.000000 }, + {2640,2641, 0, 0, 3333, 3333,0.000000 }, + {2642,2642, 0, 0, 40000, 266,0.000000 }, + {2643,2644, 0, 0, 166, 166,0.000000 }, + {2645,2645, 0, 0, 40000, 6,0.000000 }, + {2646,2647, 0, 0, 40000, 0,0.000000 }, + {2648,2648, 0, 0, 586, 586,0.000000 }, + {2649,2649, 0, 0, 1660, 86,0.000000 }, + {2650,2651, 0, 0, 440, 440,0.000000 }, + {2652,2652, 0, 0, 40000, 113,0.000000 }, + {2653,2654, 0, 0, 40000, 6,0.000000 }, + {2655,2656, 0, 0, 1766, 1766,0.000000 }, + {2657,2657, 0, 0, 40000, 0,0.000000 }, + {2658,2658, 35, 0, 20, 20,0.000000 }, + {2659,2659, 35, 0, 26, 26,0.000000 }, + {2660,2660, 52, 0, 20, 20,0.000000 }, + {2661,2661, 60, 0, 80, 80,0.000000 }, + {2662,2662, 58, 0, 20, 20,0.000000 }, + {2663,2663, 60, 0, 113, 113,0.000000 }, + {2664,2664, 50, 0, 433, 433,0.000000 }, + {2665,2665, 43, 0, 40, 40,0.000000 }, + {2664,2664, 55, 0, 513, 513,0.000000 }, + {1553,1553, 43, 0, 26, 26,0.000000 }, + {2666,2666, 50, 0, 173, 173,0.000000 }, + {2667,2667, 43, 0, 173, 173,0.000000 }, + {2666,2666, 53, 0, 40, 40,0.000000 }, + {2666,2666, 57, 0, 186, 186,0.000000 }, + {2668,2668, 72, 0, 260, 260,0.000000 }, + {2666,2666, 60, 0, 220, 220,0.000000 }, + { 373, 373, 76, 0, 260, 260,0.000000 }, + {2669,2669, 84, 0, 213, 213,0.000000 }, + {2670,2670, 42, 0, 406, 406,0.000000 }, + {2671,2671, 65, 0, 86, 86,0.000000 }, + {2672,2672, 84, 0, 113, 113,0.000000 }, + {2673,2673, 84, 0, 426, 426,0.000000 }, + {2674,2674, 24, 0, 46, 46,0.000000 }, + { 383, 383, 77, 0, 246, 246,0.000000 }, + {2675,2675, 58, 0, 153, 153,0.000000 }, + {2676,2676, 53, 0, 153, 153,0.000000 }, + {2677,2677, 64, 0, 73, 73,0.000000 }, + {2678,2678, 71, 0, 26, 26,0.000000 }, + {2679,2679, 44, 0, 606, 606,0.000000 }, + {2680,2680, 40, 0, 366, 366,0.000000 }, + {2681,2681, 69, 0, 20, 20,0.000000 }, + {2682,2682, 60, 0, 360, 360,0.000000 }, + {2683,2683, 80, 0, 60, 60,0.000000 }, + {2684,2684, 64, 0, 873, 873,0.000000 }, + {2685,2685, 72, 0, 33, 33,0.000000 }, + {2686,2686, 70, 0, 273, 273,0.000000 }, + {2687,2687, 48, 0, 40, 40,0.000000 }, + {2688,2688, 53, 0, 213, 213,0.000000 }, + {2689,2690, 0, 0, 40000, 140,0.000000 }, + {2691,2692, 0, 0, 626, 626,0.000000 }, + {2693,2694, 0, 0, 40000, 0,0.000000 }, + {2695,2696, 0, 0, 2213, 2213,0.000000 }, + {2697,2698, 0, 0, 4140, 0,0.000000 }, + { 192,2699, 0, 0, 40000, 6,0.000000 }, + {2700,2701, 0, 0, 153, 153,0.000000 }, + {2702,2703, 0, 0, 253, 253,0.000000 }, + {2704,2705, 0, 0, 40000, 0,0.000000 }, + {2706,2707, 0, 0, 40000, 6,0.000000 }, + {2708,2709, 0, 0, 40000, 6,0.000000 }, + {2710,2711, 0, 0, 440, 440,0.000000 }, + {2712,1473, 0, 0, 213, 213,0.000000 }, + {2713,2714, 0, 0, 120, 120,0.000000 }, + {2715,2716, 0, 0, 140, 140,0.000000 }, + {1478,2717, 0, 0, 40000, 113,0.000000 }, + {2718,2719, 0, 0, 40000, 6,0.000000 }, + { 286,2720, 0, 0, 40000, 20,0.000000 }, + {2721,2722, 0, 0, 40000, 13,0.000000 }, + {2723,2724, 0, 0, 40000, 0,0.000000 }, + {2725,2726, 0, 0, 526, 526,0.000000 }, + {2727,2724, 0, 0, 40000, 0,0.000000 }, + {1514,2728, 0, 0, 40000, 53,0.000000 }, + {2729,2730, 0, 0, 186, 186,0.000000 }, + {2731,2732, 0, 0, 226, 226,0.000000 }, + {2733,2734, 0, 0, 266, 266,0.000000 }, + {2735,2736, 0, 0, 80, 80,0.000000 }, + {2737,2738, 0, 0, 40000, 0,0.000000 }, + {2739,2740, 0, 0, 260, 260,0.000000 }, + {2741,2742, 0, 0, 286, 286,0.000000 }, + {2743,2744, 0, 0, 193, 193,0.000000 }, + {2745,2746, 0, 0, 40000, 0,0.000000 }, + {2747,2747, 35, 0, 20, 20,0.000000 }, + {2748,2748, 60, 0, 153, 153,0.000000 }, + {2749,2749, 43, 0, 20, 20,0.000000 }, + {2750,2750, 0, 0, 626, 626,0.000000 }, + {2751,2752, 0, 0, 1553, 1553,0.000000 }, + {2753,2754, 0, 0, 1386, 1386,0.000000 }, + {2755,2756, 0, 0, 2026, 2026,0.000000 }, + {2757,2758, 0, 0, 1020, 1020,0.000000 }, + {2759,2760, 0, 0, 2486, 2486,0.000000 }, + {2761,2762, 0, 0, 2880, 2880,0.000000 }, + {2763,2764, 0, 0, 2346, 2346,0.000000 }, + {2765,2766, 0, 0, 40000, 0,0.000000 }, + {2767,2768, 0, 0, 40000, 100,0.000000 }, + {2769,2770, 0, 0, 40000, 13,0.000000 }, + {2771,2772, 0, 0, 40000, 6,0.000000 }, + {2773,2774, 0, 0, 40000, 0,0.000000 }, + {2775,2776, 0, 0, 40000, 13,0.000000 }, + {2777,2778, 0, 0, 40000, 0,0.000000 }, + {2779,2780, 0, 0, 40000, 6,0.000000 }, + {2781,2782, 0, 0, 40000, 6,0.000000 }, + {2783,2784, 0, 0, 913, 913,0.000000 }, + {2785,2786, 0, 0, 1653, 1653,0.000000 }, + {2787,2788, 0, 0, 40000, 153,0.000000 }, + {2789,2790, 0, 0, 1273, 1273,0.000000 }, + {2791,2792, 0, 0, 1166, 1166,0.000000 }, + {2793,2794, 0, 0, 386, 386,0.000000 }, + {2795,2796, 0, 0, 40000, 1993,0.000000 }, + {2795,2797, 0, 0, 2526, 1333,0.000000 }, + {2798,2799, 0, 0, 166, 6,0.000000 }, + {2800,2801, 0, 0, 13080, 213,0.000000 }, + {2802,2803, 0, 0, 40000, 6,0.000000 }, + {2804,2805, 0, 0, 40000, 6,0.000000 }, + {2806,2807, 0, 0, 493, 493,0.000000 }, + {2808,2809, 0, 0, 126, 6,0.000000 }, + {2810,2811, 0, 0, 80, 80,0.000000 }, + {2812,2813, 0, 0, 380, 380,0.000000 }, + {2814,2815, 0, 0, 2506, 2506,0.000000 }, + {2816,2817, 0, 0, 2186, 2186,0.000000 }, + {2818,2819, 0, 0, 2520, 2520,0.000000 }, + {2820,2821, 0, 0, 440, 440,0.000000 }, + {2822,2823, 0, 0, 106, 106,0.000000 }, + {2824,2825, 0, 0, 1933, 1933,0.000000 }, + {2826,2827, 0, 0, 40000, 6,0.000000 }, + {2828,2829, 0, 0, 1933, 1933,0.000000 }, + {2830,2831, 0, 0, 546, 546,0.000000 }, + {2832,2833, 0, 0, 973, 973,0.000000 }, + {2834,2835, 0, 0, 586, 26,0.000000 }, + {2836,2837, 0, 0, 786, 786,0.000000 }, + {2838,2839, 0, 0, 1920, 1920,0.000000 }, + {2840,2841, 0, 0, 333, 333,0.000000 }, + {2842,2843, 0, 0, 1120, 1120,0.000000 }, + {2844,2845, 0, 0, 40000, 153,0.000000 }, + {2846,2847, 0, 0, 40000, 153,0.000000 }, + {2848,2849, 0, 0, 40000, 153,0.000000 }, + {2850,2851, 0, 0, 40000, 213,0.000000 }, + {2852,2853, 0, 0, 40000, 240,0.000000 }, + {2854,2855, 0, 0, 40000, 93,0.000000 }, + {2856,2856, 0, 0, 333, 333,0.000000 }, + {2857,2857, 0, 0, 333, 333,0.000000 }, + {2858,2859, 0, 0, 866, 866,0.000000 }, + {2860,2861, 0, 0, 40000, 180,0.000000 }, + {2862,2863, 0, 0, 866, 866,0.000000 }, + {2864,2865, 0, 0, 40000, 6,0.000000 }, + {2866,2867, 0, 0, 946, 946,0.000000 }, + {2868,2869, 0, 0, 906, 906,0.000000 }, + {2870,2871, 0, 0, 846, 846,0.000000 }, + {2872,2873, 0, 0, 160, 160,0.000000 }, + {2874,2875, 0, 0, 586, 6,0.000000 }, + {2876,2877, 0, 0, 160, 160,0.000000 }, + {2878,2879, 0, 0, 760, 760,0.000000 }, + {2880,2881, 0, 0, 1193, 1193,0.000000 }, + {2882,2883, 0, 0, 493, 493,0.000000 }, + {2884,2885, 0, 0, 893, 893,0.000000 }, + {2886,2887, 0, 0, 40000, 0,0.000000 }, + {2888,2888, 0, 0, 4413, 4413,0.000000 }, + {2889,2889, 0, 0, 4193, 4193,0.000000 }, + {2890,2890, 0, 0, 3946, 3946,0.000000 }, + {2891,2892, 0, 0, 40000, 26,0.000000 }, + {2893,2893, 0, 0, 60, 60,0.000000 }, + {2894,2894, 0, 0, 40, 40,0.000000 }, + {2895,2895, 0, 0, 1773, 1773,0.000000 }, + {2896,2897, 0, 0, 40000, 6,0.000000 }, + {2898,2899, 0, 0, 1073, 6,0.000000 }, + {2353,2900, 0, 0, 4800, 4800,0.000000 }, + {2901,2901, 0, 0, 126, 126,0.000000 }, + {2902,2903, 0, 0, 40000, 20,0.000000 }, + {2904,2905, 0, 0, 40000, 20,0.000000 }, + {2906,2907, 0, 0, 40000, 6,0.000000 }, + {2908,2909, 0, 0, 4546, 4546,0.000000 }, + {2910,2911, 0, 0, 40000, 6,0.000000 }, + {2912,2912, 0, 0, 913, 913,0.000000 }, + {2913,2914, 0, 0, 486, 486,0.000000 }, + {2915,2916, 0, 0, 1740, 1740,0.000000 }, + {2917,2918, 0, 0, 1726, 1726,0.000000 }, + {2919,2920, 0, 0, 1740, 1740,0.000000 }, + {2921,2922, 0, 0, 1420, 1420,0.000000 }, + {2923,2924, 0, 0, 546, 546,0.000000 }, + {2925,2926, 0, 0, 513, 513,0.000000 }, + {2927,2928, 0, 0, 226, 226,0.000000 }, + {2929,2929, 0, 0, 40000, 73,0.000000 }, + {2930,2931, 0, 0, 40000, 33,0.000000 }, + {2932,2933, 0, 0, 40000, 6,0.000000 }, + {2934,2935, 0, 0, 40000, 20,0.000000 }, + {2936,2937, 0, 0, 40000, 13,0.000000 }, + {2938,2939, 0, 0, 40000, 106,0.000000 }, + {2940,2940, 0, 0, 40, 40,0.000000 }, + {2941,2941, 0, 0, 40000, 86,0.000000 }, + {2942,2943, 0, 0, 293, 293,0.000000 }, + {2944,2944, 0, 0, 53, 53,0.000000 }, + {2945,2945, 0, 0, 260, 260,0.000000 }, + {2946,2947, 0, 0, 1026, 1026,0.000000 }, + {2948,2948, 0, 0, 40000, 120,0.000000 }, + {2949,2949, 0, 0, 280, 280,0.000000 }, + {2950,2951, 0, 0, 3926, 3926,0.000000 }, + {2952,2953, 0, 0, 6373, 206,0.000000 }, + {2954,2954, 60, 0, 40000, 0,0.000000 }, + {2955,2956, 0, 0, 40000, 153,0.000000 }, + {2957,2958, 0, 0, 40000, 6,0.000000 }, + {2959,2960, 0, 0, 40000, 26,0.000000 }, + {2961,2962, 0, 0, 700, 140,0.000000 }, + {2963,2963, 0, 0, 506, 506,0.000000 }, + {2964,2964, 0, 0, 40000, 680,0.000000 }, + {2436,2436, 49, 0, 593, 593,0.000000 }, + {2357,2357, 61, 0, 26, 26,0.000000 }, + {2357,2357, 56, 0, 26, 26,0.000000 }, + {2357,2357, 58, 0, 26, 26,0.000000 }, + {2357,2357, 49, 0, 33, 33,0.000000 }, + {2357,2357, 44, 0, 26, 26,0.000000 }, + {2965,2965, 0, 0, 40000, 186,0.000000 }, + {2966,2966, 0, 0, 186, 186,0.000000 }, + {2967,2967, 0, 0, 1793, 1793,0.000000 }, + {2968,2968, 0, 0, 40000, 53,0.000000 }, + {2969,2969, 0, 0, 80, 80,0.000000 }, + {2970,2970, 84, 0, 40, 40,0.000000 }, + {2971,2971, 72, 0, 140, 140,0.000000 }, + {2972,2972, 0, 0, 2080, 2080,0.000000 }, + {2973,2973, 0, 0, 40000, 66,0.000000 }, + {2974,2974, 0, 0, 40000, 2100,0.000000 }, + {2975,2975, 0, 0, 1766, 1766,0.000000 }, + {2976,2976, 0, 0, 120, 120,0.000000 }, + {2977,2977, 0, 0, 40000, 0,0.000000 }, + {2978,2978, 0, 0, 40000, 66,0.000000 }, + {2979,2979, 0, 0, 40000, 73,0.000000 }, + {2980,2980, 0, 0, 40000, 126,0.000000 }, + {2981,2981, 0, 0, 40000, 506,0.000000 }, + {2982,2982, 0, 0, 40000, 373,0.000000 }, + {2983,2983, 0, 0, 920, 920,0.000000 }, + {2984,2984, 0, 0, 1106, 1106,0.000000 }, + {2985,2985, 0, 0, 40000, 0,0.000000 }, + {2986,2986, 0, 0, 40000, 0,0.000000 }, + {2987,2987, 0, 0, 40000, 0,0.000000 }, + {2988,2988, 0, 0, 40000, 140,0.000000 }, + {2989,2989, 0, 0, 726, 726,0.000000 }, + {2990,2990, 0, 0, 573, 573,0.000000 }, + {2991,2991, 0, 0, 40000, 146,0.000000 }, + {2992,2992, 0, 0, 40000, 66,0.000000 }, + {2993,2993, 0, 0, 146, 146,0.000000 }, + {2994,2994, 0, 0, 1380, 1380,0.000000 }, + {2995,2995, 0, 0, 40000, 113,0.000000 }, + {2996,2996, 0, 0, 1140, 1140,0.000000 }, + {2997,2997, 0, 0, 1180, 1180,0.000000 }, + {2998,2998, 0, 0, 40000, 0,0.000000 }, + {2999,2999, 0, 0, 40000, 13,0.000000 }, + {3000,3000, 0, 0, 193, 193,0.000000 }, + {3001,3001, 0, 0, 40000, 0,0.000000 }, + {3002,3002, 0, 0, 40000, 433,0.000000 }, + {3003,3003, 0, 0, 1206, 1206,0.000000 }, + {3004,3004, 0, 0, 40000, 480,0.000000 }, + {3005,3005, 0, 0, 40000, 0,0.000000 }, + {3006,3006, 0, 0, 126, 126,0.000000 }, + {3007,3007, 0, 0, 333, 333,0.000000 }, + { 350, 350, 0, 0, 66, 66,0.000000 }, + {3008,3008, 0, 0, 46, 46,0.000000 }, + {3009,3009, 0, 0, 26, 26,0.000000 }, + {3010,3010, 0, 0, 320, 320,0.000000 }, + {3011,3011, 0, 0, 2380, 2380,0.000000 }, + {3012,3012, 0, 0, 180, 180,0.000000 }, + {3013,3013, 0, 0, 260, 260,0.000000 }, + {3014,3014, 0, 0, 40000, 6,0.000000 }, + {3015,3015, 0, 0, 40000, 146,0.000000 }, + { 350, 350, 36, 0, 86, 86,0.000000 }, + { 369, 369, 37, 0, 33, 33,0.000000 }, + {3008,3008, 38, 0, 53, 53,0.000000 }, + { 369, 369, 24, 0, 33, 33,0.000000 }, + {3008,3008, 32, 0, 60, 60,0.000000 }, + { 369, 369, 48, 0, 33, 33,0.000000 }, + {3009,3009, 42, 0, 33, 33,0.000000 }, + { 369, 369, 50, 0, 100, 100,0.000000 }, + { 369, 369, 52, 0, 66, 66,0.000000 }, + { 369, 369, 54, 0, 93, 93,0.000000 }, + { 369, 369, 55, 0, 86, 86,0.000000 }, + { 369, 369, 57, 0, 100, 100,0.000000 }, + {3010,3010, 51, 0, 333, 333,0.000000 }, + { 144, 144, 61, 0, 40, 40,0.000000 }, + {3016,3016, 0, 0, 106, 106,0.000000 }, + {3016,3016, 63, 0, 86, 86,0.000000 }, + {3016,3016, 64, 0, 86, 86,0.000000 }, + {3017,3017, 40, 0, 60, 60,0.000000 }, + {3017,3017, 70, 0, 40, 40,0.000000 }, + {3018,3018, 0, 0, 40000, 6,0.000000 }, + {3019,3019, 0, 0, 40000, 0,0.000000 }, + {3020,3020, 0, 0, 40000, 6,0.000000 }, + {3021,3021, 0, 0, 40000, 6,0.000000 }, + {3022,3022, 38, 0, 46, 46,0.000000 }, + {2441,2441, 57, 0, 73, 73,0.000000 }, + {3023,3023, 63, 0, 33, 33,0.000000 }, + {3024,3024, 74, 0, 80, 80,0.000000 }, + {3025,3025, 74, 0, 206, 206,0.000000 }, + {3026,3026, 60, 0, 300, 300,0.000000 }, + {1593,1594, 35, 0, 646, 646,0.000000 }, + {1564,1565, 35, 0, 66, 66,0.000000 }, + { 248,3027, 0, 0, 40000, 33,0.000000 }, + {1445,3028, 0, 0, 1860, 1860,0.000000 }, + {1447,3029, 0, 0, 1626, 1626,0.000000 }, + {1452,3030, 0, 0, 1740, 1740,0.000000 }, + {1544,3031, 0, 0, 160, 160,0.000000 }, + {1546,3032, 0, 0, 1913, 1913,0.000000 }, + { 398, 399, 35, 0, 600, 600,0.000000 }, + {1550,3033, 35, 0, 20, 20,0.000000 }, + {1556,1557, 35, 0, 386, 386,0.000000 }, + {1558,1559, 35, 0, 346, 346,0.000000 }, + {1570,1571, 35, 0, 360, 360,0.000000 }, + {1608,1609, 35, 0, 460, 460,0.000000 }, + {1595,1596, 35, 0, 60, 60,0.000000 }, + { 159,1597, 35, 0, 60, 60,0.000000 }, + {1610,1611, 35, 0, 60, 60,0.000000 }, + { 397,1588, 35, 0, 100, 100,0.000000 }, + {1606,1607, 35, 0, 46, 46,0.000000 }, + { 145,1576, 35, 0, 6, 6,0.000000 }, + {1612,1613, 35, 0, 60, 60,0.000000 }, + {1577,1578, 35, 0, 53, 53,0.000000 }, + {1614,1615, 35, 0, 6, 6,0.000000 }, + {1550,1551, 35, 0, 20, 20,0.000000 }, + { 364, 365, 35, 0, 20, 20,0.000000 }, + { 129,1549, 35, 0, 93, 93,0.000000 }, + { 132,1552, 35, 0, 20, 20,0.000000 }, + {1553,1554, 35, 0, 33, 33,0.000000 }, + { 129,1548, 35, 0, 86, 86,0.000000 }, + { 134,1555, 35, 0, 133, 133,0.000000 }, + {1560,1561, 35, 0, 140, 140,0.000000 }, + {1562,1563, 35, 0, 40000, 0,0.000000 }, + {1572,1573, 35, 0, 66, 66,0.000000 }, + {1574,1575, 35, 0, 60, 60,0.000000 }, + {1581,1582, 35, 0, 20, 20,0.000000 }, + { 149,1583, 35, 0, 53, 53,0.000000 }, + {1584,1585, 35, 0, 206, 206,0.000000 }, + {1591,1592, 35, 0, 386, 386,0.000000 }, + {1579,1580, 35, 0, 53, 53,0.000000 }, + {1586,1587, 35, 0, 180, 180,0.000000 }, + {1589,1590, 35, 0, 20, 20,0.000000 }, + {1600,1601, 35, 0, 140, 140,0.000000 }, + {1602,1603, 35, 0, 220, 220,0.000000 }, + {1604,1605, 35, 0, 1293, 1293,0.000000 }, + {1598,1599, 35, 0, 233, 233,0.000000 }, + { 374, 375, 35, 0, 580, 580,0.000000 }, + {1566,1567, 35, 0, 1666, 0,0.000000 }, + {2306,2307, 35, 0, 140, 140,0.000000 }, + {3034, 339, 35, 0, 4293, 4293,0.000000 }, + {2305,1548, 35, 0, 80, 80,0.000000 }, + {1595,1595, 35, 0, 60, 60,0.000000 }, + {2303,2304, 35, 0, 20, 20,0.000000 }, + {1560,2308, 35, 0, 140, 140,0.000000 }, + {2309,2310, 35, 0, 40000, 0,0.000000 }, + {1568,1568, 35, 0, 20, 20,0.000000 }, + {2311,2312, 35, 0, 66, 66,0.000000 }, + {2313,2314, 35, 0, 66, 66,0.000000 }, + {2315,2315, 35, 0, 13, 13,0.000000 }, + {2316,2316, 35, 0, 53, 53,0.000000 }, + {1612,1612, 35, 0, 60, 60,0.000000 }, + {2317,2317, 35, 0, 153, 153,0.000000 }, + {2318,2318, 35, 0, 86, 86,0.000000 }, + {2319,2319, 35, 0, 46, 46,0.000000 }, + {2320,2320, 35, 0, 46, 46,0.000000 }, + {2321,2321, 35, 0, 20, 20,0.000000 }, + {2322,2322, 35, 0, 426, 426,0.000000 }, + {2323,2323, 35, 0, 826, 826,0.000000 }, + {2324, 392, 35, 0, 20, 20,0.000000 }, + {2324, 393, 35, 0, 346, 346,0.000000 }, + {2325,2326, 35, 0, 220, 220,0.000000 }, + {2327,2328, 35, 0, 180, 180,0.000000 }, + {2329,2330, 35, 0, 160, 160,0.000000 }, + {2331,2332, 35, 0, 573, 573,0.000000 }, + {3035,3036, 35, 0, 1026, 1026,0.000000 }, + {3037,3038, 35, 0, 400, 400,0.000000 }, + {1564,1564, 35, 0, 60, 60,0.000000 }, + {3039,3039, 0, 0, 2293, 2293,0.000000 }, + {3040,3040, 0, 0, 2006, 2006,0.000000 }, + {3041,3041, 0, 0, 1226, 1226,0.000000 }, + {3042,3042, 0, 0, 1026, 1026,0.000000 }, + {3043,3043, 0, 0, 760, 760,0.000000 }, + {3044,3044, 0, 0, 546, 546,0.000000 }, + {3045,3045, 0, 0, 613, 613,0.000000 }, + {3046,3046, 0, 0, 40000, 53,0.000000 }, + {3047,3047, 0, 0, 1013, 1013,0.000000 }, + {3048,3048, 0, 0, 40000, 606,0.000000 }, + {3049,3049, 0, 0, 3626, 3626,0.000000 }, + {3050,3050, 0, 0, 993, 993,0.000000 }, + {3051,3051, 0, 0, 266, 266,0.000000 }, + {3052,3052, 0, 0, 140, 140,0.000000 }, + {3053,3053, 0, 0, 2253, 2253,0.000000 }, + {3054,3054, 0, 0, 2513, 2513,0.000000 }, + {3055,3055, 0, 0, 40000, 0,0.000000 }, + {3056,3056, 0, 0, 40000, 0,0.000000 }, + {3057,3057, 0, 0, 2146, 2146,0.000000 }, + {3058,3058, 0, 0, 40000, 0,0.000000 }, + {3059,3059, 0, 0, 40000, 6,0.000000 }, + {3060,3060, 0, 0, 40000, 6,0.000000 }, + {3061,3061, 0, 0, 460, 460,0.000000 }, + {3062,3062, 0, 0, 1846, 1846,0.000000 }, + {3063,3063, 0, 0, 933, 933,0.000000 }, + {3064,3064, 0, 0, 206, 206,0.000000 }, + {3065,3065, 0, 0, 40000, 20,0.000000 }, + {3066,3066, 0, 0, 80, 80,0.000000 }, + {3067,3067, 0, 0, 1973, 1973,0.000000 }, + {3068,3068, 0, 0, 40000, 60,0.000000 }, + {3069,3069, 0, 0, 1120, 1120,0.000000 }, + {3070,3070, 0, 0, 420, 420,0.000000 }, + {3071,3071, 0, 0, 1120, 1120,0.000000 }, + {3072,3072, 0, 0, 806, 806,0.000000 }, + {3073,3073, 0, 0, 1186, 1186,0.000000 }, + {3074,3074, 0, 0, 1900, 1900,0.000000 }, + {3075,3075, 0, 0, 40000, 0,0.000000 }, + {3076,3076, 0, 0, 1046, 1046,0.000000 }, + {3077,3077, 0, 0, 600, 600,0.000000 }, + {3078,3078, 0, 0, 146, 13,0.000000 }, + {3079,3079, 0, 0, 786, 786,0.000000 }, + {3080,3080, 0, 0, 40000, 26,0.000000 }, + {3081,3081, 0, 0, 146, 13,0.000000 }, + {3082,3082, 0, 0, 40000, 46,0.000000 }, + {3083,3083, 0, 0, 100, 100,0.000000 }, + {3084,3084, 0, 0, 1580, 1580,0.000000 }, + {3085,3085, 0, 0, 280, 280,0.000000 }, + {3086,3086, 0, 0, 40000, 80,0.000000 }, + {3087,3087, 0, 0, 40000, 73,0.000000 }, + {3088,3088, 0, 0, 40000, 66,0.000000 }, + {3089,3089, 0, 0, 40000, 73,0.000000 }, + {3090,3090, 0, 0, 40000, 0,0.000000 }, + {3091,3091, 0, 0, 40000, 6,0.000000 }, + {3092,3092, 0, 0, 40000, 6,0.000000 }, + {3093,3093, 0, 0, 246, 246,0.000000 }, + {3094,3094, 0, 0, 40000, 73,0.000000 }, + {3095,3095, 0, 0, 273, 126,0.000000 }, + {3096,3096, 0, 0, 40000, 33,0.000000 }, + {3097,3097, 0, 0, 40000, 6,0.000000 }, + {3098,3098, 0, 0, 40000, 73,0.000000 }, + {3099,3099, 0, 0, 1233, 53,0.000000 }, + {3100,3100, 0, 0, 40000, 66,0.000000 }, + {3101,3101, 0, 0, 40000, 0,0.000000 }, + {3102,3102, 0, 0, 40000, 0,0.000000 }, + {3103,3103, 0, 0, 40000, 6,0.000000 }, + {3104,3104, 0, 0, 40000, 0,0.000000 }, + {3105,3105, 0, 0, 40000, 6,0.000000 }, + {3106,3106, 0, 0, 40000, 0,0.000000 }, + {3107,3107, 0, 0, 40000, 0,0.000000 }, + {3108,3108, 0, 0, 40000, 6,0.000000 }, + {3109,3109, 0, 0, 40000, 6,0.000000 }, + {3110,3110, 0, 0, 40000, 6,0.000000 }, + {3111,3111, 0, 0, 40000, 20,0.000000 }, + {3112,3112, 0, 0, 2240, 2240,0.000000 }, + {3113,3113, 0, 0, 100, 6,0.000000 }, + {3114,3114, 0, 0, 4466, 4466,0.000000 }, + {3115,3115, 0, 0, 40000, 20,0.000000 }, + {3116,3116, 0, 0, 40000, 13,0.000000 }, + {3117,3117, 0, 0, 40000, 53,0.000000 }, + {3118,3118, 0, 0, 40000, 300,0.000000 }, + {3119,3119, 0, 0, 6906, 6906,0.000000 }, + {3120,3120, 0, 0, 40000, 33,0.000000 }, + {3121,3121, 0, 0, 40000, 6,0.000000 }, + {3122,3122, 0, 0, 1953, 1953,0.000000 }, + {3123,3123, 0, 0, 973, 973,0.000000 }, + {3124,3124, 0, 0, 2240, 6,0.000000 }, + {3125,3125, 0, 0, 1986, 1986,0.000000 }, + {3126,3126, 0, 0, 1613, 1613,0.000000 }, + {3127,3127, 0, 0, 353, 353,0.000000 }, + {3128,3128, 0, 0, 66, 66,0.000000 }, + {3129,3129, 0, 0, 5586, 5586,0.000000 }, + {3130,3130, 0, 0, 173, 173,0.000000 }, + {3131,3131, 35, 0, 120, 120,0.000000 }, + {3132,3132, 35, 0, 6, 6,0.000000 }, + {3133,3133, 35, 0, 40000, 46,0.000000 }, + {3134,3134, 35, 0, 40000, 46,0.000000 }, + {3135,3135, 35, 0, 100, 100,0.000000 }, + {3061,3061, 35, 0, 140, 140,0.000000 }, + {3136,3136, 35, 0, 20, 20,0.000000 }, + { 739, 739, 35, 0, 40, 40,0.000000 }, + {3137,3137, 35, 0, 186, 186,0.000000 }, + {3138,3138, 35, 0, 160, 160,0.000000 }, + {3139,3139, 35, 0, 93, 93,0.000000 }, + {3140,3140, 35, 0, 80, 80,0.000000 }, + {3141,3141, 35, 0, 133, 133,0.000000 }, + {3142,3142, 35, 0, 66, 66,0.000000 }, + {3143,3143, 35, 0, 133, 133,0.000000 }, + {3144,3144, 35, 0, 666, 666,0.000000 }, + {3145,3145, 35, 0, 93, 93,0.000000 }, + {3146,3146, 35, 0, 1433, 1433,0.000000 }, + {3147,3147, 35, 0, 393, 393,0.000000 }, + {3148,3148, 35, 0, 93, 93,0.000000 }, + {3149,3149, 35, 0, 1480, 1480,0.000000 }, + {3150,3150, 0, 0, 1126, 1126,0.000000 }, + {3151,3151, 0, 0, 1766, 1766,0.000000 }, + {3152,3152, 0, 0, 620, 620,0.000000 }, + {3153,3153, 0, 0, 460, 460,0.000000 }, + {3154,3154, 0, 0, 1173, 1173,0.000000 }, + {3155,3155, 0, 0, 626, 626,0.000000 }, + {3156,3156, 0, 0, 1740, 1740,0.000000 }, + {3157,3157, 0, 0, 280, 280,0.000000 }, + {3158,3158, 0, 0, 46, 46,0.000000 }, + {3159,3159, 0, 0, 280, 280,0.000000 }, + {3160,3160, 0, 0, 1153, 1153,0.000000 }, + {3161,3161, 0, 0, 40000, 0,0.000000 }, + {3162,3162, 0, 0, 40000, 6,0.000000 }, + {3163,3163, 0, 0, 40000, 46,0.000000 }, + {3164,3164, 0, 0, 40000, 0,0.000000 }, + {3165,3165, 0, 0, 40000, 6,0.000000 }, + {3166,3166, 0, 0, 2280, 2280,0.000000 }, + {3167,3167, 0, 0, 40000, 0,0.000000 }, + {3168,3168, 0, 0, 486, 486,0.000000 }, + {3169,3169, 0, 0, 600, 600,0.000000 }, + {3170,3170, 0, 0, 466, 466,0.000000 }, + {3171,3171, 0, 0, 593, 593,0.000000 }, + {3172,3172, 0, 0, 1153, 1153,0.000000 }, + {3173,3173, 0, 0, 280, 280,0.000000 }, + {3174,3174, 0, 0, 586, 586,0.000000 }, + {3175,3175, 0, 0, 206, 13,0.000000 }, + {3176,3176, 0, 0, 186, 60,0.000000 }, + {3177,3177, 0, 0, 2366, 2366,0.000000 }, + {3178,3178, 0, 0, 1700, 1700,0.000000 }, + {3179,3179, 0, 0, 46, 46,0.000000 }, + {3180,3180, 0, 0, 886, 886,0.000000 }, + {3181,3181, 0, 0, 186, 186,0.000000 }, + {3182,3182, 0, 0, 40000, 186,0.000000 }, + {3183,3183, 0, 0, 560, 560,0.000000 }, + {3184,3184, 0, 0, 1466, 1466,0.000000 }, + {3185,3185, 0, 0, 1553, 1553,0.000000 }, + {3186,3186, 0, 0, 380, 380,0.000000 }, + {3187,3187, 0, 0, 146, 146,0.000000 }, + {3188,3188, 0, 0, 146, 146,0.000000 }, + {3189,3189, 0, 0, 4726, 4726,0.000000 }, + {3190,3190, 0, 0, 40000, 6,0.000000 }, + {3191,3191, 0, 0, 1766, 1766,0.000000 }, + {3192,3192, 0, 0, 40000, 0,0.000000 }, + {3193,3193, 0, 0, 806, 806,0.000000 }, + {3194,3194, 0, 0, 1133, 1133,0.000000 }, + {3195,3195, 0, 0, 40000, 6,0.000000 }, + {3196,3196, 0, 0, 40000, 0,0.000000 }, + {3197,3197, 0, 0, 40000, 6,0.000000 }, + {3198,3198, 0, 0, 40000, 20,0.000000 }, + {3199,3199, 0, 0, 40000, 6,0.000000 }, + {3200,3200, 0, 0, 213, 213,0.000000 }, + {3201,3201, 0, 0, 40000, 106,0.000000 }, + {3202,3202, 0, 0, 1113, 1113,0.000000 }, + {3203,3203, 0, 0, 1953, 1953,0.000000 }, + {3204,3204, 0, 0, 40000, 0,0.000000 }, + {3205,3205, 0, 0, 40000, 0,0.000000 }, + {3206,3206, 0, 0, 340, 340,0.000000 }, + {3207,3207, 0, 0, 40000, 6,0.000000 }, + {3208,3208, 0, 0, 1126, 1126,0.000000 }, + {3209,3209, 0, 0, 300, 300,0.000000 }, + {3210,3210, 0, 0, 40000, 46,0.000000 }, + {3211,3211, 0, 0, 40000, 113,0.000000 }, + {3212,3212, 0, 0, 1126, 1126,0.000000 }, + {3213,3213, 0, 0, 2853, 2853,0.000000 }, + {3214,3214, 0, 0, 40000, 0,0.000000 }, + {3215,3215, 0, 0, 1286, 0,0.000000 }, + {3216,3216, 0, 0, 40000, 233,0.000000 }, + {3217,3217, 0, 0, 40000, 1640,0.000000 }, + {3218,3218, 0, 0, 40000, 240,0.000000 }, + {3219,3219, 0, 0, 1766, 1766,0.000000 }, + {3220,3220, 0, 0, 40000, 1493,0.000000 }, + {3221,3221, 0, 0, 40000, 2120,0.000000 }, + {3222,3222, 0, 0, 1226, 1226,0.000000 }, + {3223,3223, 0, 0, 306, 306,0.000000 }, + {3224,3224, 0, 0, 40000, 6,0.000000 }, + {3225,3225, 0, 0, 666, 13,0.000000 }, + {3226,3226, 0, 0, 153, 153,0.000000 }, + {3227,3227, 0, 0, 626, 626,0.000000 }, + {3228,3228, 0, 0, 140, 140,0.000000 }, + {3229,3229, 0, 0, 233, 233,0.000000 }, + { 499, 499, 0, 0, 40, 40,0.000000 }, + {3230,3230, 0, 0, 46, 46,0.000000 }, + {3231,3231, 0, 0, 146, 146,0.000000 }, + {3232,3232, 0, 0, 206, 206,0.000000 }, + {3233,3233, 0, 0, 5686, 5686,0.000000 }, + {3234,3234, 0, 0, 326, 326,0.000000 }, + { 403, 403, 0, 0, 40000, 0,0.000000 }, + {3235,3235, 0, 0, 1913, 1913,0.000000 }, + {3236,3236, 0, 0, 2080, 2080,0.000000 }, + {3237,3237, 0, 0, 2026, 2026,0.000000 }, + {3238,3238, 0, 0, 1166, 1166,0.000000 }, + {3239,3239, 0, 0, 600, 600,0.000000 }, + {3240,3240, 0, 0, 1213, 1213,0.000000 }, + {3241,3241, 0, 0, 40000, 0,0.000000 }, + {3242,3242, 0, 0, 40000, 0,0.000000 }, + {3243,3243, 0, 0, 40000, 0,0.000000 }, + {3244,3244, 0, 0, 40000, 0,0.000000 }, + {3245,3245, 0, 0, 40000, 146,0.000000 }, + {3246,3246, 0, 0, 40000, 146,0.000000 }, + {3247,3247, 0, 0, 40000, 146,0.000000 }, + {3248,3248, 0, 0, 40000, 153,0.000000 }, + {3249,3249, 0, 0, 873, 873,0.000000 }, + {3250,3250, 0, 0, 553, 553,0.000000 }, + {3251,3251, 0, 0, 873, 873,0.000000 }, + {3252,3252, 0, 0, 606, 606,0.000000 }, + {3253,3253, 0, 0, 606, 606,0.000000 }, + {3254,3254, 0, 0, 600, 600,0.000000 }, + {3255,3255, 0, 0, 1013, 1013,0.000000 }, + {3256,3256, 0, 0, 626, 626,0.000000 }, + {3257,3257, 0, 0, 40000, 0,0.000000 }, + {3258,3258, 0, 0, 40000, 0,0.000000 }, + {3259,3259, 0, 0, 40000, 66,0.000000 }, + {3260,3260, 0, 0, 40000, 66,0.000000 }, + {3261,3261, 0, 0, 40000, 20,0.000000 }, + {3262,3262, 0, 0, 1120, 1120,0.000000 }, + {3263,3263, 0, 0, 1206, 1206,0.000000 }, + {3264,3264, 0, 0, 940, 940,0.000000 }, + {3265,3265, 0, 0, 3626, 3626,0.000000 }, + {3266,3266, 0, 0, 40000, 320,0.000000 }, + {3267,3267, 0, 0, 40000, 6,0.000000 }, + {3268,3268, 0, 0, 3926, 3926,0.000000 }, + {3269,3269, 0, 0, 40000, 446,0.000000 }, + {3270,3270, 0, 0, 40000, 180,0.000000 }, + {3271,3271, 0, 0, 3426, 3426,0.000000 }, + {3272,3272, 0, 0, 2253, 2253,0.000000 }, + {3273,3273, 0, 0, 40000, 2133,0.000000 }, + {3274,3274, 0, 0, 2566, 2566,0.000000 }, + {3275,3275, 0, 0, 166, 26,0.000000 }, + {3276,3276, 0, 0, 40000, 346,0.000000 }, + {3277,3277, 0, 0, 40000, 66,0.000000 }, + {3278,3278, 0, 0, 40000, 213,0.000000 }, + {3279,3279, 0, 0, 2273, 2273,0.000000 }, + {3280,3280, 0, 0, 40000, 40,0.000000 }, + {3281,3281, 0, 0, 40000, 906,0.000000 }, + {3282,3282, 0, 0, 40000, 213,0.000000 }, + {3283,3283, 0, 0, 40000, 186,0.000000 }, + {3284,3284, 0, 0, 60, 60,0.000000 }, + {3285,3285, 0, 0, 146, 146,0.000000 }, + {3286,3286, 0, 0, 146, 13,0.000000 }, + {3287,3287, 0, 0, 786, 786,0.000000 }, + {3288,3288, 0, 0, 40000, 26,0.000000 }, + {3289,3289, 0, 0, 1580, 1580,0.000000 }, + {3290,3290, 0, 0, 653, 653,0.000000 }, + {3291,3291, 0, 0, 2400, 2400,0.000000 }, + {3292,3292, 0, 0, 1926, 1926,0.000000 }, + {3293,3293, 0, 0, 2593, 2593,0.000000 }, + {3294,3294, 0, 0, 2360, 2360,0.000000 }, + {3295,3295, 0, 0, 4933, 4933,0.000000 }, + {3296,3296, 0, 0, 593, 593,0.000000 }, + {3297,3297, 0, 0, 253, 253,0.000000 }, + {3298,3298, 0, 0, 306, 306,0.000000 }, + {3299,3299, 0, 0, 613, 613,0.000000 }, + {3300,3300, 0, 0, 1900, 1900,0.000000 }, + {3301,3301, 0, 0, 1213, 1213,0.000000 }, + {3302,3302, 0, 0, 273, 273,0.000000 }, + {3303,3303, 0, 0, 566, 566,0.000000 }, + {3304,3304, 0, 0, 40000, 6,0.000000 }, + {3305,3305, 0, 0, 40000, 6,0.000000 }, + {3306,3306, 0, 0, 40000, 6,0.000000 }, + {3307,3307, 0, 0, 40000, 6,0.000000 }, + {3308,3308, 0, 0, 40000, 6,0.000000 }, + {3309,3309, 0, 0, 40000, 0,0.000000 }, + {3310,3310, 0, 0, 40000, 0,0.000000 }, + {3311,3311, 0, 0, 40000, 0,0.000000 }, + {3312,3312, 0, 0, 40000, 6,0.000000 }, + {3313,3313, 0, 0, 40000, 53,0.000000 }, + {3314,3314, 0, 0, 40000, 73,0.000000 }, + {3315,3315, 0, 0, 40000, 0,0.000000 }, + {3316,3316, 0, 0, 40000, 0,0.000000 }, + {3317,3317, 0, 0, 40000, 0,0.000000 }, + {3318,3318, 0, 0, 40000, 80,0.000000 }, + {3319,3319, 0, 0, 40, 60,0.000000 }, + {3320,3320, 0, 0, 1320, 1320,0.000000 }, + {3321,3321, 0, 0, 40000, 126,0.000000 }, + {3322,3322, 0, 0, 273, 126,0.000000 }, + {3323,3323, 0, 0, 40000, 126,0.000000 }, + {3324,3324, 0, 0, 40000, 33,0.000000 }, + {3325,3325, 0, 0, 40000, 73,0.000000 }, + {3326,3326, 0, 0, 40, 40,0.000000 }, + {3327,3327, 0, 0, 40000, 233,0.000000 }, + {3328,3328, 0, 0, 40000, 233,0.000000 }, + {3329,3329, 0, 0, 593, 593,0.000000 }, + {3330,3330, 0, 0, 40000, 213,0.000000 }, + {3331,3331, 0, 0, 40000, 606,0.000000 }, + {3332,3332, 0, 0, 2253, 2253,0.000000 }, + {3333,3333, 0, 0, 140, 140,0.000000 }, + {3334,3334, 0, 0, 40000, 926,0.000000 }, + {3335,3335, 0, 0, 40000, 33,0.000000 }, + {3336,3336, 0, 0, 40000, 1120,0.000000 }, + {3337,3337, 0, 0, 160, 160,0.000000 }, + {3338,3338, 0, 0, 40000, 6,0.000000 }, + {3339,3339, 0, 0, 40000, 1093,0.000000 }, + {3340,3340, 0, 0, 160, 160,0.000000 }, + {3341,3341, 0, 0, 1206, 1206,0.000000 }, + {3342,3342, 0, 0, 146, 146,0.000000 }, + {3343,3343, 0, 0, 146, 146,0.000000 }, + {3344,3344, 0, 0, 140, 140,0.000000 }, + {3345,3345, 0, 0, 140, 140,0.000000 }, + {3346,3346, 0, 0, 140, 140,0.000000 }, + {3347,3347, 0, 0, 80, 80,0.000000 }, + {3348,3348, 0, 0, 40000, 33,0.000000 }, + {3349,3349, 0, 0, 1186, 1186,0.000000 }, + {3350,3350, 0, 0, 40000, 1413,0.000000 }, + {3351,3351, 0, 0, 1226, 1226,0.000000 }, + {3352,3352, 0, 0, 40, 40,0.000000 }, + {3353,3353, 0, 0, 60, 60,0.000000 }, + {3354,3354, 0, 0, 100, 100,0.000000 }, + {3355,3355, 0, 0, 246, 246,0.000000 }, + {3356,3356, 0, 0, 1140, 1140,0.000000 }, + { 142, 142, 20, 0, 20, 20,0.000000 }, + {3357,1451, 0, 0, 613, 613,0.000000 }, + {3358,3359, 0, 0, 1740, 1740,0.000000 }, + {3360,1455, 0, 0, 280, 280,0.000000 }, + {3361,1463, 0, 0, 40000, 133,0.000000 }, + { 225,3362, 0, 0, 2026, 2026,0.000000 }, + {3363,1545, 0, 0, 153, 153,0.000000 }, + {3364,1547, 0, 0, 40000, 60,0.000000 }, + {3365,3366, 39, 0, 13, 13,0.000000 }, + {3367, 368, 58, 0, 46, 46,0.000000 }, + {3368,1551, 48, 0, 93, 93,0.000000 }, + {3368,3033, 49, 0, 73, 73,0.000000 }, + {3368,3033, 51, 0, 153, 153,0.000000 }, + {3368,3033, 54, 0, 140, 140,0.000000 }, + {3368,3033, 57, 0, 126, 126,0.000000 }, + {3368,3033, 60, 0, 133, 133,0.000000 }, + {3369,3370, 70, 0, 893, 893,0.000000 }, + {1564,1565, 80, 0, 66, 66,0.000000 }, + {3371,1571, 44, 0, 520, 520,0.000000 }, + {3372,3372, 0, 0, 1486, 1486,0.000000 }, + {3373,3373, 0, 0, 1806, 1806,0.000000 }, + {3374,3374, 0, 0, 633, 633,0.000000 }, + {3375,3375, 0, 0, 1273, 1273,0.000000 }, + {3376,3376, 0, 0, 1553, 1553,0.000000 }, + {3377,3377, 0, 0, 1206, 1206,0.000000 }, + {3378,3378, 0, 0, 313, 313,0.000000 }, + {3379,3379, 0, 0, 1486, 1486,0.000000 }, + {3380,3380, 0, 0, 626, 626,0.000000 }, + {3381,3381, 0, 0, 1846, 1846,0.000000 }, + {3382,3382, 0, 0, 300, 300,0.000000 }, + {3383,3383, 0, 0, 1740, 1740,0.000000 }, + {3384,3384, 0, 0, 513, 513,0.000000 }, + {3385,3385, 0, 0, 46, 46,0.000000 }, + {3386,3386, 0, 0, 1226, 1226,0.000000 }, + {3387,3387, 0, 0, 333, 333,0.000000 }, + {3388,3388, 0, 0, 40000, 300,0.000000 }, + {3389,3389, 0, 0, 40000, 533,0.000000 }, + {3390,3390, 0, 0, 40000, 126,0.000000 }, + {3391,3391, 0, 0, 40000, 0,0.000000 }, + {3392,3392, 0, 0, 40000, 33,0.000000 }, + {3393,3393, 0, 0, 40000, 6,0.000000 }, + {3394,3394, 0, 0, 40000, 6,0.000000 }, + {3395,3395, 0, 0, 3880, 6,0.000000 }, + {3396,3396, 0, 0, 1066, 1066,0.000000 }, + {3397,3397, 0, 0, 4086, 4086,0.000000 }, + {3398,3398, 0, 0, 866, 866,0.000000 }, + {3399,3399, 0, 0, 466, 466,0.000000 }, + {3400,3400, 0, 0, 420, 420,0.000000 }, + {3401,3401, 0, 0, 40000, 73,0.000000 }, + {3402,3402, 0, 0, 40000, 20,0.000000 }, + {3403,3403, 0, 0, 40000, 26,0.000000 }, + {3404,3404, 0, 0, 4266, 4266,0.000000 }, + {3405,3405, 0, 0, 40000, 0,0.000000 }, + {3406,3406, 0, 0, 253, 253,0.000000 }, + {3407,3407, 0, 0, 380, 380,0.000000 }, + {3408,3408, 0, 0, 573, 573,0.000000 }, + {3409,3409, 0, 0, 280, 280,0.000000 }, + {3410,3410, 0, 0, 40000, 6,0.000000 }, + {3411,3411, 0, 0, 1933, 1933,0.000000 }, + {3412,3412, 0, 0, 40000, 140,0.000000 }, + {3413,3413, 0, 0, 40000, 140,0.000000 }, + {3414,3414, 0, 0, 40000, 40,0.000000 }, + {3415,3415, 0, 0, 353, 353,0.000000 }, + {3416,3416, 0, 0, 40000, 166,0.000000 }, + {3417,3417, 0, 0, 273, 273,0.000000 }, + {3418,3418, 0, 0, 126, 126,0.000000 }, + {3419,3419, 0, 0, 146, 146,0.000000 }, + {3420,3420, 0, 0, 40000, 213,0.000000 }, + {3421,3421, 0, 0, 40000, 173,0.000000 }, + {3422,3422, 0, 0, 40000, 206,0.000000 }, + {3423,3423, 0, 0, 40000, 213,0.000000 }, + {3424,3424, 0, 0, 40000, 153,0.000000 }, + {3425,3425, 0, 0, 40000, 106,0.000000 }, + {3426,3426, 0, 0, 40000, 6,0.000000 }, + {3427,3427, 0, 0, 233, 233,0.000000 }, + {3428,3428, 0, 0, 40000, 6,0.000000 }, + {3429,3429, 0, 0, 11193, 13,0.000000 }, + {3430,3430, 0, 0, 40000, 126,0.000000 }, + {3431,3431, 0, 0, 40000, 13,0.000000 }, + {3432,3432, 0, 0, 40000, 6,0.000000 }, + {3433,3433, 0, 0, 40000, 0,0.000000 }, + {3434,3434, 0, 0, 40000, 0,0.000000 }, + {3435,3435, 0, 0, 40000, 0,0.000000 }, + {3436,3436, 0, 0, 40000, 0,0.000000 }, + {3437,3437, 0, 0, 40000, 0,0.000000 }, + {3438,3438, 0, 0, 40000, 0,0.000000 }, + {3439,3439, 0, 0, 6013, 6013,0.000000 }, + {3440,3440, 0, 0, 40000, 0,0.000000 }, + {3441,3441, 0, 0, 40000, 0,0.000000 }, + {3442,3442, 0, 0, 293, 293,0.000000 }, + {3443,3443, 0, 0, 40000, 6,0.000000 }, + {3444,3444, 0, 0, 40000, 20,0.000000 }, + {3445,3445, 0, 0, 40000, 0,0.000000 }, + {3446,3446, 0, 0, 40000, 0,0.000000 }, + {3447,3447, 0, 0, 40000, 0,0.000000 }, + {3448,3448, 0, 0, 40000, 0,0.000000 }, + {3449,3449, 0, 0, 40000, 20,0.000000 }, + {3450,3450, 0, 0, 40000, 153,0.000000 }, + {3451,3451, 0, 0, 440, 440,0.000000 }, + {3452,3452, 0, 0, 3253, 3253,0.000000 }, + {3453,3453, 0, 0, 3946, 3946,0.000000 }, + {3454,3454, 0, 0, 140, 140,0.000000 }, + {3455,3455, 0, 0, 40000, 20,0.000000 }, + {3456,3456, 0, 0, 40000, 33,0.000000 }, + {3457,3457, 0, 0, 40000, 20,0.000000 }, + {3458,3458, 0, 0, 40000, 26,0.000000 }, + {3459,3459, 0, 0, 40000, 20,0.000000 }, + {3460,3460, 0, 0, 786, 786,0.000000 }, + {3461,3461, 0, 0, 2560, 2560,0.000000 }, + {3462,3462, 0, 0, 40000, 26,0.000000 }, + {3463,3463, 0, 0, 40000, 580,0.000000 }, + {3464,3464, 0, 0, 40000, 2393,0.000000 }, + {3465,3465, 0, 0, 40000, 53,0.000000 }, + {3466,3466, 0, 0, 40000, 33,0.000000 }, + {3467,3467, 0, 0, 40000, 193,0.000000 }, + {3468,3468, 0, 0, 40000, 280,0.000000 }, + {3469,3469, 0, 0, 40000, 86,0.000000 }, + {3470,3470, 0, 0, 40000, 820,0.000000 }, + {3471,3471, 0, 0, 40000, 286,0.000000 }, + {3472,3472, 0, 0, 40000, 1100,0.000000 }, + {3473,3473, 0, 0, 40000, 1073,0.000000 }, + {3474,3474, 0, 0, 40000, 1173,0.000000 }, + {3475,3475, 0, 0, 340, 340,0.000000 }, + {3476,3476, 0, 0, 4846, 4846,0.000000 }, + {3477,3477, 0, 0, 40000, 0,0.000000 }, + {3478,3478, 0, 0, 4846, 4846,0.000000 }, + {3479,3479, 0, 0, 606, 606,0.000000 }, + {3480,3480, 0, 0, 106, 106,0.000000 }, + {3481,3481, 0, 0, 40000, 0,0.000000 }, + {3482,3482, 0, 0, 40000, 73,0.000000 }, + {3483,3483, 0, 0, 40000, 0,0.000000 }, + {3484,3484, 0, 0, 586, 586,0.000000 }, + {3485,3485, 0, 0, 73, 73,0.000000 }, + {3486,3486, 0, 0, 460, 460,0.000000 }, + {3487,3487, 0, 0, 40, 40,0.000000 }, + {3488,3488, 0, 0, 526, 526,0.000000 }, + {3489,3489, 0, 0, 540, 540,0.000000 }, + {3490,3490, 0, 0, 253, 253,0.000000 }, + {3491,3491, 0, 0, 2280, 2280,0.000000 }, + {3492,3492, 0, 0, 73, 73,0.000000 }, + {3493,3493, 0, 0, 40000, 73,0.000000 }, + {3494,3494, 0, 0, 40000, 2220,0.000000 }, + {3495,3495, 0, 0, 146, 146,0.000000 }, + {3496,3496, 0, 0, 40000, 13,0.000000 }, + {3497,3497, 0, 0, 380, 13,0.000000 }, + {3498,3498, 0, 0, 40000, 2220,0.000000 }, + {3499,3499, 0, 0, 40000, 146,0.000000 }, + {3500,3500, 0, 0, 1513, 13,0.000000 }, + { 739, 739, 46, 0, 53, 53,0.000000 }, + {3501,3501, 47, 0, 106, 106,0.000000 }, + {3502,3502, 64, 0, 26, 26,0.000000 }, + {3503,3503, 40, 0, 106, 106,0.000000 }, + {3504,3504, 48, 0, 13, 13,0.000000 }, + {3505,3505, 48, 0, 80, 80,0.000000 }, + {3506,3506, 46, 0, 86, 86,0.000000 }, + {3507,3507,111, 0, 33, 33,0.000000 }, + {3508,3508, 49, 0, 140, 140,0.000000 }, + {3509,3509, 56, 0, 33, 33,0.000000 }, + {3510,3510, 52, 0, 140, 140,0.000000 }, + {3511,3511, 96, 0, 440, 440,0.000000 }, + {3510,3510, 54, 0, 140, 140,0.000000 }, + {3512,3512, 57, 0, 260, 260,0.000000 }, + {3513,3513, 82, 0, 486, 486,0.000000 }, + {3510,3510, 60, 0, 153, 153,0.000000 }, + {3514,3514, 60, 0, 606, 606,0.000000 }, + {3515,3515, 92, 0, 60, 60,0.000000 }, + {3516,3516, 60, 0, 46, 46,0.000000 }, + {3517,3517, 58, 0, 40, 40,0.000000 }, + {3518,3518, 22, 0, 53, 53,0.000000 }, + {3519,3519, 60, 0, 613, 613,0.000000 }, + {3520,3520, 72, 0, 80, 80,0.000000 }, + {3521,3521, 77, 0, 80, 80,0.000000 }, + {3522,3522, 70, 0, 73, 73,0.000000 }, + {3523,3523, 75, 0, 60, 60,0.000000 }, + {3524,3524, 69, 0, 140, 140,0.000000 }, + {3525,3525, 59, 0, 113, 113,0.000000 }, + {3526,3526, 48, 0, 153, 153,0.000000 }, + {3527,3527, 89, 0, 133, 133,0.000000 }, + {3528,3528, 84, 0, 260, 260,0.000000 }, + {3529,3529, 33, 0, 93, 93,0.000000 }, + {3530,3530, 55, 0, 86, 86,0.000000 }, + {3531,3531, 58, 0, 186, 186,0.000000 }, + {3532,3532, 52, 0, 166, 166,0.000000 }, + {3533,3533, 57, 0, 46, 46,0.000000 }, + {3534,3534, 57, 0, 73, 73,0.000000 }, + {3535,3535, 85, 0, 60, 60,0.000000 }, + {3536,3536, 68, 0, 40, 40,0.000000 }, + {3536,3536, 61, 0, 60, 60,0.000000 }, + {3537,3537, 64, 0, 93, 93,0.000000 }, + {3538,3538, 44, 0, 386, 386,0.000000 }, + {3539,3539,100, 0, 80, 80,0.000000 }, + {3540,3540,100, 0, 306, 306,0.000000 }, + {3541,3541, 0, 0, 1400, 1400,0.000000 }, + {3542,3542, 0, 0, 253, 253,0.000000 }, + {3543,3543, 0, 0, 460, 460,0.000000 }, + {3544,3544, 0, 0, 1226, 1226,0.000000 }, + {3545,3545, 0, 0, 886, 886,0.000000 }, + {3546,3546, 0, 0, 40, 40,0.000000 }, + {3547,3547, 0, 0, 2406, 2406,0.000000 }, + {3548,3548, 0, 0, 1180, 1180,0.000000 }, + {3549,3549, 0, 0, 40000, 0,0.000000 }, + {3550,3550, 0, 0, 40000, 0,0.000000 }, + {3551,3551, 0, 0, 40000, 33,0.000000 }, + {3552,3552, 0, 0, 40000, 0,0.000000 }, + {3553,3553, 0, 0, 40000, 6,0.000000 }, + {3554,3554, 0, 0, 1553, 1553,0.000000 }, + {3555,3555, 0, 0, 40000, 0,0.000000 }, + {3556,3556, 0, 0, 573, 573,0.000000 }, + {3557,3557, 0, 0, 526, 526,0.000000 }, + {3558,3558, 0, 0, 940, 940,0.000000 }, + {3559,3559, 0, 0, 606, 606,0.000000 }, + {3560,3560, 0, 0, 40000, 6,0.000000 }, + {3561,3561, 0, 0, 40000, 0,0.000000 }, + {3562,3562, 0, 0, 1120, 1120,0.000000 }, + {3563,3563, 0, 0, 700, 700,0.000000 }, + {3564,3564, 0, 0, 66, 66,0.000000 }, + {3565,3565, 0, 0, 620, 620,0.000000 }, + {3566,3566, 0, 0, 286, 286,0.000000 }, + {3567,3567, 0, 0, 40000, 73,0.000000 }, + {3568,3568, 0, 0, 80, 80,0.000000 }, + {3569,3569, 0, 0, 186, 186,0.000000 }, + {3570,3570, 0, 0, 1506, 1506,0.000000 }, + {3571,3571, 0, 0, 40000, 0,0.000000 }, + {3572,3572, 0, 0, 40000, 186,0.000000 }, + {3573,3573, 0, 0, 126, 126,0.000000 }, + {3574,3574, 0, 0, 40000, 106,0.000000 }, + {3575,3575, 0, 0, 166, 166,0.000000 }, + {3576,3576, 0, 0, 80, 80,0.000000 }, + {3577,3577, 0, 0, 453, 13,0.000000 }, + {3578,3578, 0, 0, 40000, 0,0.000000 }, + {3579,3579, 0, 0, 40000, 6,0.000000 }, + {3580,3580, 0, 0, 2020, 2020,0.000000 }, + {3581,3581, 0, 0, 1646, 1646,0.000000 }, + {3582,3582, 0, 0, 166, 166,0.000000 }, + {3583,3583, 0, 0, 40000, 0,0.000000 }, + {3584,3584, 0, 0, 146, 146,0.000000 }, + {3585,3585, 0, 0, 340, 340,0.000000 }, + {3586,3586, 0, 0, 40000, 0,0.000000 }, + {3587,3587, 0, 0, 100, 13,0.000000 }, + {3588,3588, 0, 0, 5013, 5013,0.000000 }, + {3589,3589, 0, 0, 40000, 6,0.000000 }, + {3590,3590, 0, 0, 1766, 1766,0.000000 }, + {3591,3591, 0, 0, 4186, 4186,0.000000 }, + {3592,3592, 0, 0, 700, 700,0.000000 }, + {3593,3593, 0, 0, 940, 940,0.000000 }, + {3594,3594, 0, 0, 246, 246,0.000000 }, + {3595,3595, 0, 0, 40000, 6,0.000000 }, + {3596,3596, 0, 0, 40000, 6,0.000000 }, + {3597,3597, 0, 0, 40000, 6,0.000000 }, + {3598,3598, 0, 0, 40000, 0,0.000000 }, + {3599,3599, 0, 0, 40000, 306,0.000000 }, + {3600,3600, 0, 0, 40000, 53,0.000000 }, + {3601,3601, 0, 0, 40000, 6,0.000000 }, + {3602,3602, 0, 0, 40000, 233,0.000000 }, + {3603,3603, 0, 0, 120, 120,0.000000 }, + {3604,3604, 0, 0, 40000, 6,0.000000 }, + {3605,3605, 0, 0, 40000, 153,0.000000 }, + {3606,3606, 0, 0, 1086, 1086,0.000000 }, + {3607,3607, 0, 0, 1900, 1900,0.000000 }, + {3608,3608, 0, 0, 40000, 0,0.000000 }, + {3609,3609, 0, 0, 40000, 13,0.000000 }, + {3610,3610, 0, 0, 253, 253,0.000000 }, + {3611,3611, 0, 0, 40000, 6,0.000000 }, + {3612,3612, 0, 0, 40000, 126,0.000000 }, + {3613,3613, 0, 0, 3680, 3680,0.000000 }, + {3614,3614, 0, 0, 660, 660,0.000000 }, + {3615,3615, 0, 0, 40000, 206,0.000000 }, + {3616,3616, 0, 0, 40000, 106,0.000000 }, + {3617,3617, 0, 0, 546, 546,0.000000 }, + {3618,3618, 0, 0, 126, 6,0.000000 }, + {3619,3619, 0, 0, 40000, 1306,0.000000 }, + {3620,3620, 0, 0, 1240, 1240,0.000000 }, + {3621,3621, 0, 0, 1400, 1400,0.000000 }, + {3622,3622, 0, 0, 40000, 0,0.000000 }, + {3623,3623, 0, 0, 40000, 0,0.000000 }, + {3624,3624, 0, 0, 40000, 833,0.000000 }, + {3625,3625, 0, 0, 40000, 240,0.000000 }, + {3626,3626, 0, 0, 40000, 1973,0.000000 }, + {3627,3627, 0, 0, 4466, 4466,0.000000 }, + {3628,3628, 0, 0, 13, 13,0.000000 }, + {3629,3629, 0, 0, 40000, 2206,0.000000 }, + {3630,3630, 0, 0, 40000, 1180,0.000000 }, + {3631,3631, 0, 0, 4933, 4933,0.000000 }, + {3632,3632, 0, 0, 200, 200,0.000000 }, + {3633,3633, 0, 0, 1226, 1226,0.000000 }, + {3634,3634, 0, 0, 273, 273,0.000000 }, + {3635,3635, 0, 0, 353, 13,0.000000 }, + {3636,3636, 0, 0, 40000, 6,0.000000 }, + {3637,3637, 0, 0, 60, 60,0.000000 }, + {3638,3638, 0, 0, 160, 160,0.000000 }, + {3639,3639, 0, 0, 313, 313,0.000000 }, + {3640,3640, 0, 0, 46, 46,0.000000 }, + {3641,3641, 0, 0, 313, 313,0.000000 }, + {3642,3642, 0, 0, 40, 40,0.000000 }, + {3643,3643, 0, 0, 86, 86,0.000000 }, + {3644,3644, 0, 0, 46, 46,0.000000 }, + {3645,3645, 0, 0, 146, 146,0.000000 }, + {3646,3646, 0, 0, 146, 146,0.000000 }, + {3647,3647, 0, 0, 220, 220,0.000000 }, + {3648,3648, 0, 0, 86, 86,0.000000 }, + {3649,3649, 0, 0, 40000, 320,0.000000 }, + {3650,3650, 0, 0, 40000, 6,0.000000 }, + {3651,3651, 0, 0, 40000, 0,0.000000 }, + {3652,3652, 0, 0, 300, 300,0.000000 }, + {3653,3653, 0, 0, 2940, 2940,0.000000 }, + {3654,3654, 0, 0, 1233, 1233,0.000000 }, + {3655,3655, 0, 0, 3840, 3840,0.000000 }, + {3656,3656, 0, 0, 2280, 2280,0.000000 }, + {3657,3657, 0, 0, 1793, 1793,0.000000 }, + {3658,3658, 0, 0, 1120, 1120,0.000000 }, + {3659,3659, 0, 0, 1013, 1013,0.000000 }, + {3660,3660, 0, 0, 1233, 1233,0.000000 }, + {3661,3661, 0, 0, 600, 600,0.000000 }, + {3662,3662, 0, 0, 280, 280,0.000000 }, + {3663,3663, 0, 0, 266, 266,0.000000 }, + {3664,3664, 0, 0, 1740, 1740,0.000000 }, + {3665,3665, 0, 0, 246, 246,0.000000 }, + {3666,3666, 0, 0, 140, 140,0.000000 }, + {3667,3667, 0, 0, 1166, 1166,0.000000 }, + {3668,3668, 0, 0, 273, 273,0.000000 }, + {3669,3669, 0, 0, 40000, 0,0.000000 }, + {3670,3670, 0, 0, 40000, 0,0.000000 }, + {3671,3671, 0, 0, 313, 313,0.000000 }, + {3672,3672, 0, 0, 40000, 6,0.000000 }, + {3673,3673, 0, 0, 40000, 133,0.000000 }, + {3674,3674, 0, 0, 40000, 133,0.000000 }, + {3675,3675, 0, 0, 40000, 66,0.000000 }, + {3676,3676, 0, 0, 40000, 133,0.000000 }, + {3677,3677, 0, 0, 940, 940,0.000000 }, + {3678,3678, 0, 0, 760, 760,0.000000 }, + {3679,3679, 0, 0, 1200, 1200,0.000000 }, + {3680,3680, 0, 0, 566, 566,0.000000 }, + {3681,3681, 0, 0, 573, 573,0.000000 }, + {3682,3682, 0, 0, 40000, 0,0.000000 }, + {3683,3683, 0, 0, 1353, 1353,0.000000 }, + {3684,3684, 0, 0, 2226, 2226,0.000000 }, + {3685,3685, 0, 0, 866, 866,0.000000 }, + {3686,3686, 0, 0, 2293, 2293,0.000000 }, + {3687,3687, 0, 0, 2113, 2113,0.000000 }, + {3688,3688, 0, 0, 1280, 1280,0.000000 }, + {3689,3689, 0, 0, 886, 886,0.000000 }, + {3690,3690, 0, 0, 833, 833,0.000000 }, + {3691,3691, 0, 0, 886, 886,0.000000 }, + {3692,3692, 0, 0, 940, 940,0.000000 }, + {3693,3693, 0, 0, 40000, 260,0.000000 }, + {3694,3694, 0, 0, 166, 13,0.000000 }, + {3695,3695, 0, 0, 40000, 26,0.000000 }, + {3696,3696, 0, 0, 146, 146,0.000000 }, + {3697,3697, 0, 0, 40000, 86,0.000000 }, + {3698,3698, 0, 0, 940, 940,0.000000 }, + {3699,3699, 0, 0, 100, 100,0.000000 }, + {3700,3700, 0, 0, 513, 513,0.000000 }, + {3701,3701, 0, 0, 40000, 286,0.000000 }, + {3702,3702, 0, 0, 40000, 133,0.000000 }, + {3703,3703, 0, 0, 40000, 233,0.000000 }, + {3704,3704, 0, 0, 40000, 40,0.000000 }, + {3705,3705, 0, 0, 3413, 3413,0.000000 }, + {3706,3706, 0, 0, 3413, 3413,0.000000 }, + {3707,3707, 0, 0, 253, 253,0.000000 }, + {3708,3708, 0, 0, 60, 73,0.000000 }, + {3709,3709, 0, 0, 40000, 66,0.000000 }, + {3710,3710, 0, 0, 40000, 33,0.000000 }, + {3711,3711, 0, 0, 40000, 0,0.000000 }, + {3712,3712, 0, 0, 40000, 126,0.000000 }, + {3713,3713, 0, 0, 40000, 6,0.000000 }, + {3714,3714, 0, 0, 40000, 0,0.000000 }, + {3715,3715, 0, 0, 40000, 126,0.000000 }, + {3716,3716, 0, 0, 40000, 26,0.000000 }, + {3717,3717, 0, 0, 40000, 20,0.000000 }, + {3718,3718, 0, 0, 40000, 20,0.000000 }, + {3719,3719, 0, 0, 40000, 0,0.000000 }, + {3720,3720, 0, 0, 40000, 0,0.000000 }, + {3721,3721, 0, 0, 40000, 6,0.000000 }, + {3722,3722, 0, 0, 40000, 33,0.000000 }, + {3723,3723, 0, 0, 40000, 6,0.000000 }, + {3724,3724, 0, 0, 40000, 6,0.000000 }, + {3725,3725, 0, 0, 40000, 20,0.000000 }, + {3726,3726, 0, 0, 40000, 33,0.000000 }, + {3727,3727, 0, 0, 100, 100,0.000000 }, + {3728,3728, 0, 0, 40000, 26,0.000000 }, + {3729,3729, 0, 0, 40000, 26,0.000000 }, + {3730,3730, 0, 0, 40000, 53,0.000000 }, + {3731,3731, 0, 0, 40000, 0,0.000000 }, + {3732,3732, 0, 0, 40000, 0,0.000000 }, + {3733,3733, 0, 0, 40000, 26,0.000000 }, + {3734,3734, 0, 0, 40000, 13,0.000000 }, + {3735,3735, 0, 0, 40000, 6,0.000000 }, + {3736,3736, 0, 0, 3766, 3766,0.000000 }, + {3737,3737, 0, 0, 40000, 140,0.000000 }, + {3738,3738, 0, 0, 40000, 13,0.000000 }, + {3739,3739, 0, 0, 40000, 233,0.000000 }, + {3740,3740, 0, 0, 40000, 413,0.000000 }, + {3741,3741, 0, 0, 1873, 26,0.000000 }, + {3742,3742, 0, 0, 40000, 566,0.000000 }, + {3743,3743, 0, 0, 753, 753,0.000000 }, + {3744,3744, 0, 0, 1166, 13,0.000000 }, + {3745,3745, 0, 0, 40000, 566,0.000000 }, + {3746,3746, 0, 0, 40000, 53,0.000000 }, + {3747,3747, 0, 0, 1020, 1020,0.000000 }, + {3748,3748, 0, 0, 40000, 340,0.000000 }, + {3749,3749, 0, 0, 440, 440,0.000000 }, + {3750,3750, 0, 0, 40000, 106,0.000000 }, + {3751,3751, 0, 0, 2286, 2286,0.000000 }, + {3752,3752, 0, 0, 40000, 966,0.000000 }, + {3753,3753, 0, 0, 40000, 766,0.000000 }, + {3754,3754, 0, 0, 40000, 6,0.000000 }, + {3755,3755, 0, 0, 4933, 4933,0.000000 }, + {3756,3756, 0, 0, 1126, 1126,0.000000 }, + {3757,3757, 0, 0, 273, 273,0.000000 }, + {3758,3758, 0, 0, 546, 546,0.000000 }, + {3759,3759, 0, 0, 280, 280,0.000000 }, + {3760,3760, 0, 0, 40000, 6,0.000000 }, + {3761,3761, 0, 0, 40000, 6,0.000000 }, + {3762,3762, 0, 0, 40000, 0,0.000000 }, + {3763,3763, 0, 0, 1106, 1106,0.000000 }, + {3764,3764, 0, 0, 86, 86,0.000000 }, + {3765,3765, 0, 0, 280, 280,0.000000 }, + {3766,3766, 0, 0, 53, 53,0.000000 }, + {3767,3767, 0, 0, 40, 40,0.000000 }, + {3768,3768, 0, 0, 60, 60,0.000000 }, + {3769,3769, 0, 0, 253, 253,0.000000 }, + {3770,3770, 0, 0, 1213, 1213,0.000000 }, + {3771,3771, 0, 0, 293, 293,0.000000 }, + {3772,3772, 0, 0, 153, 153,0.000000 }, + {3773,3773, 0, 0, 4586, 4586,0.000000 }, + {3774,3774, 0, 0, 146, 146,0.000000 }, + {3775,3775, 0, 0, 40000, 0,0.000000 }, + {3776,3776, 0, 0, 146, 146,0.000000 }, + {3777,3777, 0, 0, 40000, 113,0.000000 }, + {3778,3778, 0, 0, 153, 153,0.000000 }, + {3779,3779, 0, 0, 1726, 13,0.000000 }, + { 738, 738, 44, 0, 40, 40,0.000000 }, + {3780,3780, 36, 0, 33, 33,0.000000 }, + {3781,3781, 32, 0, 6, 6,0.000000 }, + {2030,2030, 60, 0, 86, 86,0.000000 }, + {3782,3782, 24, 0, 6, 6,0.000000 }, + {3783,3783, 60, 0, 26, 26,0.000000 }, + {3784,3784, 44, 0, 140, 140,0.000000 }, + { 132, 132, 44, 0, 20, 20,0.000000 }, + {3785,3785, 47, 0, 153, 153,0.000000 }, + { 152, 152, 44, 0, 86, 86,0.000000 }, + {3784,3784, 50, 0, 160, 160,0.000000 }, + { 139, 139, 44, 0, 86, 86,0.000000 }, + {3784,3784, 54, 0, 160, 160,0.000000 }, + {3784,3784, 57, 0, 160, 160,0.000000 }, + {3786,3786, 60, 0, 606, 606,0.000000 }, + {3784,3784, 60, 0, 166, 166,0.000000 }, + {3787,3787, 60, 0, 606, 606,0.000000 }, + {3788,3788, 60, 0, 626, 626,0.000000 }, + {3789,3789, 60, 0, 626, 626,0.000000 }, + {3790,3790, 60, 0, 606, 606,0.000000 }, + {3791,3791, 44, 0, 300, 300,0.000000 }, + {2037,2037, 44, 0, 40, 40,0.000000 }, + { 144, 144, 44, 0, 40, 40,0.000000 }, + {2038,2038, 44, 0, 13, 13,0.000000 }, + {3792,3792, 44, 0, 33, 33,0.000000 }, + {3793,3793, 44, 0, 60, 60,0.000000 }, + {3794,3794, 45, 0, 80, 80,0.000000 }, + {3795,3795, 33, 0, 100, 100,0.000000 }, + {3796,3796, 56, 0, 153, 153,0.000000 }, + {3796,3796, 51, 0, 153, 153,0.000000 }, + {3797,3797, 44, 0, 40, 40,0.000000 }, + {3798,3798, 44, 0, 200, 200,0.000000 }, + {3534,3534, 56, 0, 73, 73,0.000000 }, + { 158, 158, 68, 0, 20, 20,0.000000 }, + {3799,3799, 51, 0, 160, 160,0.000000 }, + {3800,3800, 46, 0, 153, 153,0.000000 }, + {3801,3801, 44, 0, 160, 160,0.000000 }, + {3802,3802, 44, 0, 1233, 1233,0.000000 }, + { 152, 152, 45, 0, 80, 80,0.000000 }, + {3803,3803, 0, 0, 40000, 20,0.000000 }, + {3804,3804, 0, 0, 40000, 66,0.000000 }, + {3805,3805, 0, 0, 40000, 0,0.000000 }, + {3806,3806, 0, 0, 40000, 0,0.000000 }, + {3807,3807, 0, 0, 40000, 20,0.000000 }, + {3808,3808, 0, 0, 1226, 1226,0.000000 }, + {3809,3809, 0, 0, 546, 546,0.000000 }, + {3810,3810, 0, 0, 280, 280,0.000000 }, + {3811,3811, 0, 0, 60, 60,0.000000 }, + {3812,3812, 0, 0, 1213, 1213,0.000000 }, + {3780,3780, 45, 0, 440, 440,0.000000 }, + {3061,3061, 45, 0, 606, 606,0.000000 }, + {3813,3813, 60, 0, 20, 20,0.000000 }, + {3781,3781, 60, 0, 6, 6,0.000000 }, + {3814,3814, 44, 0, 173, 173,0.000000 }, + {3815,3815, 57, 0, 46, 46,0.000000 }, + {3816,3816, 56, 0, 73, 73,0.000000 }, + {3817,3817, 60, 0, 20, 20,0.000000 }, + {3818,3818, 60, 0, 20, 20,0.000000 }, + {3517,3517, 45, 0, 40, 40,0.000000 }, + {3819,3819, 0, 0, 820, 820,0.000000 }, + {3820,3820, 0, 0, 573, 573,0.000000 }, + {3821,3821, 0, 0, 473, 473,0.000000 }, + {3822,3822, 0, 0, 1020, 1020,0.000000 }, + {3823,3823, 0, 0, 40000, 393,0.000000 }, + {3824,3825, 0, 1, 40000, 266,0.078125 }, + {3826,3826, 0, 0, 3833, 13,0.000000 }, + {3827,3827, 0, 0, 40000, 406,0.000000 }, + {3828,1172, 0, 1, 40000, 320,0.156250 }, + {3829,3829, 0, 0, 40000, 13,0.000000 }, + {3830,3830, 0, 0, 120, 120,0.000000 }, + {3831,3831, 32, 0, 20, 20,0.000000 }, + {3832,3832, 36, 0, 46, 46,0.000000 }, + {3833,3833, 88, 0, 93, 93,0.000000 }, + {3834,3834, 0, 0, 1660, 1660,0.000000 }, + {3835,3835, 0, 0, 1746, 1746,0.000000 }, + {3836,3836, 0, 0, 1980, 1980,0.000000 }, + {3837,3837, 0, 0, 1553, 1553,0.000000 }, + {3838,3838, 0, 0, 1233, 1233,0.000000 }, + {3839,3839, 0, 0, 1980, 1980,0.000000 }, + {3840,3840, 0, 0, 940, 940,0.000000 }, + {3841,3841, 0, 0, 1740, 1740,0.000000 }, + {3842,3842, 0, 0, 40000, 133,0.000000 }, + {3843,3843, 0, 0, 40000, 26,0.000000 }, + {3844,3844, 0, 0, 40000, 60,0.000000 }, + {3845,3845, 0, 0, 40000, 320,0.000000 }, + {3846,3846, 0, 0, 40000, 53,0.000000 }, + {3847,3847, 0, 0, 40000, 160,0.000000 }, + {3848,3848, 0, 0, 40000, 106,0.000000 }, + {3849,3849, 0, 0, 1026, 1026,0.000000 }, + {3850,3850, 0, 0, 1826, 1826,0.000000 }, + {3851,3851, 0, 0, 1813, 1813,0.000000 }, + {3852,3852, 0, 0, 1013, 1013,0.000000 }, + {3853,3853, 0, 0, 40000, 0,0.000000 }, + {3854,3854, 0, 0, 40000, 53,0.000000 }, + {3855,3855, 0, 0, 40000, 53,0.000000 }, + {3856,3856, 0, 0, 4200, 4200,0.000000 }, + {3857,3857, 0, 0, 40000, 106,0.000000 }, + {3858,3858, 0, 0, 1746, 1746,0.000000 }, + {3859,3859, 0, 0, 40000, 120,0.000000 }, + {3860,3860, 0, 0, 2400, 2400,0.000000 }, + {3861,3861, 0, 0, 4606, 4606,0.000000 }, + {3862,3862, 0, 0, 1740, 1740,0.000000 }, + {3863,3863, 0, 0, 40000, 66,0.000000 }, + {3864,3864, 0, 0, 40000, 46,0.000000 }, + {3865,3865, 0, 0, 40000, 66,0.000000 }, + {3866,3866, 0, 0, 40000, 26,0.000000 }, + {3867,3867, 0, 0, 40000, 293,0.000000 }, + {3868,3868, 0, 0, 40000, 133,0.000000 }, + {3869,3869, 0, 0, 333, 333,0.000000 }, + {3870,3870, 0, 0, 993, 993,0.000000 }, + {3871,3871, 0, 0, 40000, 280,0.000000 }, + {3872,3872, 0, 0, 1766, 13,0.000000 }, + {3873,3873, 0, 0, 40000, 820,0.000000 }, + {3874,3874, 0, 0, 40000, 286,0.000000 }, + {3875,3875, 0, 0, 40000, 580,0.000000 }, + {3876,3876, 0, 0, 2300, 2300,0.000000 }, + {3877,3877, 0, 0, 40000, 146,0.000000 }, + {3878,3878, 0, 0, 40000, 6,0.000000 }, + {3879,3879, 0, 0, 40000, 66,0.000000 }, + {3880,3880, 0, 0, 40000, 6,0.000000 }, + {3881,3881, 0, 0, 40000, 6,0.000000 }, + {3882,3882, 0, 0, 40000, 126,0.000000 }, + {3883,3883, 0, 0, 40000, 33,0.000000 }, + {3884,3884, 0, 0, 40000, 53,0.000000 }, + {3885,3885, 0, 0, 40000, 93,0.000000 }, + {3886,3886, 0, 0, 40000, 73,0.000000 }, + {3887,3887, 0, 0, 40000, 66,0.000000 }, + {3888,3888, 0, 0, 40000, 86,0.000000 }, + {3889,3889, 0, 0, 40000, 46,0.000000 }, + {3890,3890, 0, 0, 3940, 13,0.000000 }, + {3891,3891, 0, 0, 40000, 33,0.000000 }, + {3892,3892, 0, 0, 40000, 53,0.000000 }, + {3893,3893, 0, 0, 40000, 53,0.000000 }, + {3894,3894, 0, 0, 40000, 73,0.000000 }, + {3895,3895, 0, 0, 40000, 126,0.000000 }, + {3896,3896, 0, 0, 40000, 60,0.000000 }, + {3897,3897, 0, 0, 40000, 106,0.000000 }, + {3898,3898, 0, 0, 40000, 6,0.000000 }, + {3899,3899, 0, 0, 40000, 266,0.000000 }, + {3900,3900, 0, 0, 40000, 53,0.000000 }, + {3901,3901, 0, 0, 40000, 233,0.000000 }, + {3902,3902, 0, 0, 1660, 180,0.000000 }, + {3903,3903, 0, 0, 40000, 566,0.000000 }, + {3904,3904, 0, 0, 40000, 100,0.000000 }, + {3905,3905, 0, 0, 593, 13,0.000000 }, + {3906,3906, 0, 0, 40000, 173,0.000000 }, + {3907,3907, 0, 0, 40000, 53,0.000000 }, + {3908,3908, 0, 0, 40000, 106,0.000000 }, + {3909,3909, 0, 0, 2133, 2133,0.000000 }, + {3910,3910, 0, 0, 40000, 846,0.000000 }, + {3911,3911, 0, 0, 40000, 773,0.000000 }, + {3912,3912, 0, 0, 1066, 1066,0.000000 }, + {3913,3913, 0, 0, 40000, 73,0.000000 }, + {3914,3914, 0, 0, 40000, 86,0.000000 }, + {3915,3915, 0, 0, 40000, 46,0.000000 }, + {3916,3916, 0, 0, 1126, 1126,0.000000 }, + {3917,3917, 0, 0, 40000, 13,0.000000 }, + {3918,3918, 0, 0, 300, 300,0.000000 }, + {3919,3919, 0, 0, 146, 146,0.000000 }, + {3920,3920, 0, 0, 140, 140,0.000000 }, + {3921,3921, 0, 0, 1920, 1920,0.000000 }, + {3922,3922, 0, 0, 40000, 0,0.000000 }, + {3923,3923, 0, 0, 533, 533,0.000000 }, + {3924,3924, 0, 0, 486, 486,0.000000 }, + {3925,3925, 0, 0, 940, 940,0.000000 }, + {3926,3926, 0, 0, 600, 600,0.000000 }, + {3927,3927, 0, 0, 253, 253,0.000000 }, + {3928,3928, 0, 0, 380, 73,0.000000 }, + {3929,3929, 0, 0, 40, 40,0.000000 }, + {3930,3930, 0, 0, 40000, 20,0.000000 }, + {3931,3931, 0, 0, 40000, 13,0.000000 }, + {3932,3932, 0, 0, 4600, 4600,0.000000 }, + {3933,3933, 0, 0, 4820, 4820,0.000000 }, + { 523, 523, 0, 0, 46, 46,0.000000 }, + {3934,3934, 0, 0, 66, 66,0.000000 }, + {3935,3935, 0, 0, 53, 53,0.000000 }, + {3936,3936, 48, 0, 26, 26,0.000000 }, + {3937,3937, 27, 0, 53, 53,0.000000 }, + {3938,3938, 40, 0, 40, 40,0.000000 }, + {3939,3939, 48, 0, 13, 13,0.000000 }, + {3938,3938, 45, 0, 46, 46,0.000000 }, + {3940,3940, 48, 0, 26, 26,0.000000 }, + {3938,3938, 47, 0, 66, 66,0.000000 }, + {3941,3941, 48, 0, 13, 13,0.000000 }, + {3938,3938, 49, 0, 73, 73,0.000000 }, + {3938,3938, 53, 0, 80, 80,0.000000 }, + {3938,3938, 56, 0, 66, 66,0.000000 }, + { 129, 129, 52, 0, 73, 73,0.000000 }, + { 130, 130, 48, 0, 40, 40,0.000000 }, + { 129, 129, 58, 0, 73, 73,0.000000 }, + { 132, 132, 47, 0, 20, 20,0.000000 }, + { 492, 492, 43, 0, 26, 26,0.000000 }, + { 132, 132, 49, 0, 20, 20,0.000000 }, + { 132, 132, 51, 0, 20, 20,0.000000 }, + { 132, 132, 54, 0, 20, 20,0.000000 }, + { 132, 132, 57, 0, 13, 13,0.000000 }, + { 492, 492, 72, 0, 140, 140,0.000000 }, + { 137, 137, 76, 0, 600, 600,0.000000 }, + { 138, 138, 84, 0, 246, 246,0.000000 }, + { 139, 139, 36, 0, 113, 113,0.000000 }, + { 140, 140, 76, 0, 586, 586,0.000000 }, + { 141, 141, 84, 0, 60, 60,0.000000 }, + { 135, 135, 83, 0, 413, 413,0.000000 }, + { 142, 142, 84, 0, 106, 106,0.000000 }, + {3942,3942, 24, 0, 600, 600,0.000000 }, + { 137, 137, 77, 0, 606, 606,0.000000 }, + { 144, 144, 60, 0, 40, 40,0.000000 }, + { 145, 145, 65, 0, 13, 13,0.000000 }, + { 146, 146, 59, 0, 40, 40,0.000000 }, + { 147, 147, 51, 0, 40, 40,0.000000 }, + { 148, 148, 45, 0, 46, 46,0.000000 }, + { 149, 149, 71, 0, 140, 140,0.000000 }, + { 150, 150, 60, 0, 146, 146,0.000000 }, + { 151, 151, 58, 0, 153, 153,0.000000 }, + { 152, 152, 53, 0, 80, 80,0.000000 }, + { 153, 153, 64, 0, 13, 13,0.000000 }, + { 154, 154, 71, 0, 273, 273,0.000000 }, + { 156, 156, 61, 0, 53, 53,0.000000 }, + { 158, 158, 48, 0, 40, 40,0.000000 }, + { 159, 159, 69, 0, 20, 20,0.000000 }, + { 160, 160, 68, 0, 20, 20,0.000000 }, + { 161, 161, 63, 0, 113, 113,0.000000 }, + { 162, 162, 74, 0, 293, 293,0.000000 }, + { 163, 163, 60, 0, 113, 113,0.000000 }, + { 164, 164, 80, 0, 440, 440,0.000000 }, + { 165, 165, 64, 0, 40, 40,0.000000 }, + { 166, 166, 69, 0, 286, 286,0.000000 }, + { 167, 167, 73, 0, 126, 126,0.000000 }, + { 168, 168, 75, 0, 20, 20,0.000000 }, + { 169, 169, 68, 0, 33, 33,0.000000 }, + { 131, 131, 48, 0, 93, 93,0.000000 }, + {3061,3061, 53, 0, 833, 833,0.000000 }, + {3943,3944, 0, 0, 546, 546,0.000000 }, + {3945,3946, 0, 0, 1813, 1813,0.000000 }, + { 174,3947, 0, 0, 1260, 1260,0.000000 }, + {3948,3949, 0, 0, 160, 160,0.000000 }, + { 9,3950, 0, 0, 1100, 1100,0.000000 }, + {3951,3952, 0, 0, 3360, 3360,0.000000 }, + {3953,3954, 0, 0, 1720, 1720,0.000000 }, + { 15,3955, 0, 0, 226, 226,0.000000 }, + {3956,3957, 0, 0, 40000, 6,0.000000 }, + {3958,3959, 0, 0, 40000, 6,0.000000 }, + {3960,3961, 0, 0, 40000, 186,0.000000 }, + {3962,3963, 0, 0, 40000, 6,0.000000 }, + {3964,3965, 0, 0, 146, 146,0.000000 }, + {3966,3965, 0, 0, 146, 146,0.000000 }, + { 31,3967, 0, 0, 3386, 3386,0.000000 }, + {3968,3969, 0, 0, 3520, 3520,0.000000 }, + {3970,3971, 0, 0, 126, 0,0.000000 }, + {3972,3971, 0, 0, 126, 0,0.000000 }, + {3973,3974, 0, 0, 1013, 1013,0.000000 }, + {3975,3976, 0, 0, 3733, 3733,0.000000 }, + {3977,3976, 0, 0, 3733, 3733,0.000000 }, + {3978,3979, 0, 0, 3020, 3020,0.000000 }, + {3980,3981, 0, 0, 686, 686,0.000000 }, + {3982,3983, 0, 0, 40000, 46,0.000000 }, + {3984,3985, 0, 0, 40000, 373,0.000000 }, + { 54,3986, 0, 0, 340, 340,0.000000 }, + {3987,3988, 0, 0, 1213, 6,0.000000 }, + {3989,3990, 0, 0, 40000, 53,0.000000 }, + {3991, 253, 0, 0, 40000, 126,0.000000 }, + {3992,3992, 0, 0, 40, 40,0.000000 }, + {3993,3993, 0, 0, 40000, 53,0.000000 }, + {3994,3995, 0, 0, 40000, 13,0.000000 }, + {3996,3997, 0, 0, 40000, 40,0.000000 }, + {3998,3999, 0, 0, 40000, 13,0.000000 }, + {1503,4000, 0, 0, 40000, 33,0.000000 }, + { 88,4001, 0, 0, 40000, 500,0.000000 }, + {3743,4002, 0, 0, 900, 900,0.000000 }, + { 92,4003, 0, 0, 1720, 13,0.000000 }, + { 93,4004, 0, 0, 1060, 80,0.000000 }, + { 94,4005, 0, 0, 40000, 53,0.000000 }, + { 96,4006, 0, 0, 1913, 533,0.000000 }, + { 103,4007, 0, 0, 1813, 1813,0.000000 }, + { 104,4008, 0, 0, 846, 846,0.000000 }, + { 105,4009, 0, 0, 900, 900,0.000000 }, + { 107,4010, 0, 0, 300, 300,0.000000 }, + { 108,4011, 0, 0, 40000, 6,0.000000 }, + { 110,4012, 0, 0, 40000, 6,0.000000 }, + { 111,4013, 0, 0, 1126, 1126,0.000000 }, + {4014,4015, 0, 0, 140, 140,0.000000 }, + { 115,4016, 0, 0, 146, 146,0.000000 }, + { 118,4017, 0, 0, 2280, 2280,0.000000 }, + { 119,4018, 0, 0, 286, 286,0.000000 }, + { 120,4019, 0, 0, 586, 586,0.000000 }, + { 121,4020, 0, 0, 4426, 4426,0.000000 }, + { 123,4021, 0, 0, 193, 193,0.000000 }, + { 124,4022, 0, 0, 146, 260,0.000000 }, + { 125,4023, 0, 0, 40000, 773,0.000000 }, + {4024,4024, 35, 0, 40, 40,0.000000 }, + {4025,4026, 38, 1, 93, 93,0.000000 }, + {4027,4028, 38, 1, 120, 120,0.000000 }, + {4029,4030, 48, 1, 73, 73,-1.906250 }, + {4031,4031, 51, 0, 26, 26,0.000000 }, + {4032,4033, 48, 1, 293, 293,-1.906250 }, + {4034,4034, 61, 1, 1873, 1873,0.093750 }, + {3369,1557, 70, 0, 906, 906,0.000000 }, + {4035,4036, 79, 1, 293, 293,0.078125 }, + {4037,4037, 62, 0, 1726, 1726,0.000000 }, + {4038,4039, 67, 1, 240, 240,0.078125 }, + {4040,4040, 62, 1, 2040, 2040,0.093750 }, + {4041,4042, 54, 1, 80, 80,0.000000 }, + {4041,4043, 48, 1, 80, 80,0.000000 }, + { 389, 389, 42, 0, 180, 180,0.000000 }, + {4044,4045, 48, 1, 80, 80,0.000000 }, + {4046,4047, 48, 1, 53, 53,0.000000 }, + {4048,4048, 16, 0, 20, 20,0.000000 }, + {4049,4049, 16, 0, 146, 146,0.000000 }, + {4050,4051, 64, 0, 646, 646,0.000000 }, + { 844, 844,244, 0, 13, 13,0.000000 }, + { 855, 855,244, 0, 246, 6,0.000000 }, + { 880, 880,232, 0, 46, 46,0.000000 }, + { 882, 882,220, 0, 5433, 5433,0.000000 }, + { 887, 887, 35, 0, 46, 46,0.000000 }, + { 884, 884, 35, 0, 73, 73,0.000000 }, + { 885, 885, 35, 0, 73, 73,0.000000 }, + { 886, 886, 35, 0, 20, 20,0.000000 }, + { 361, 361, 35, 0, 113, 113,0.000000 }, + { 767, 767, 35, 0, 760, 760,0.000000 }, + { 888, 888, 35, 0, 40, 40,0.000000 }, + {2141,2141, 35, 0, 53, 53,0.000000 }, + { 891, 891, 35, 0, 106, 106,0.000000 }, + {2142,2142, 35, 0, 53, 53,0.000000 }, + {2143,2143, 35, 0, 73, 73,0.000000 }, + {2144,2144, 35, 0, 800, 800,0.000000 }, + {2145,2145, 35, 0, 420, 420,0.000000 }, + { 376, 376, 35, 0, 146, 146,0.000000 }, + { 895, 895, 35, 0, 126, 126,0.000000 }, + {2146,2146, 35, 0, 100, 100,0.000000 }, + { 382, 382, 35, 0, 20, 20,0.000000 }, + {2147,2147, 35, 0, 20, 20,0.000000 }, + { 898, 898, 35, 0, 60, 60,0.000000 }, + { 899, 899, 35, 0, 206, 206,0.000000 }, + { 900, 900, 35, 0, 193, 193,0.000000 }, + { 871, 871, 35, 0, 120, 120,0.000000 }, + { 388, 388, 35, 0, 73, 73,0.000000 }, + { 901, 901, 35, 0, 173, 173,0.000000 }, + { 902, 902, 35, 0, 1006, 1006,0.000000 }, + { 903, 903, 35, 0, 40, 40,0.000000 }, + {3500,3500, 35, 0, 5233, 6,0.000000 }, + {4052,4052, 0, 0, 1400, 1400,0.000000 }, + {4053,4053, 0, 0, 1206, 1206,0.000000 }, + {4054,4054, 0, 0, 40000, 46,0.000000 }, + {4055,4055, 0, 0, 40000, 26,0.000000 }, + {4056,4056, 0, 0, 3600, 3600,0.000000 }, + {4057,4057, 0, 0, 40000, 6,0.000000 }, + {4058,4058, 0, 0, 960, 960,0.000000 }, + {4059,4059, 0, 0, 80, 80,0.000000 }, + {4060,4060, 0, 0, 40000, 20,0.000000 }, + {4061,4061, 0, 0, 40000, 20,0.000000 }, + {4062,4062, 0, 0, 4473, 4473,0.000000 }, + {4063,4063, 0, 0, 380, 6,0.000000 }, + {4064,4064, 0, 0, 40000, 20,0.000000 }, + {4065,4065, 0, 0, 4593, 4593,0.000000 }, + {4066,4066, 0, 0, 40000, 20,0.000000 }, + {4067,4067, 0, 0, 40000, 0,0.000000 }, + {4068,4068, 0, 0, 40, 40,0.000000 }, + {4069,4069, 0, 0, 60, 60,0.000000 }, + {4070,4070, 0, 0, 100, 100,0.000000 }, + {4071,4071, 0, 0, 40000, 40,0.000000 }, + {4072,4072, 0, 0, 126, 126,0.000000 }, + {4073,4073, 0, 0, 40, 40,0.000000 }, + {4074,4074, 0, 0, 40000, 0,0.000000 }, + {4075,4075, 0, 0, 4193, 4193,0.000000 }, + {4076,4076, 0, 0, 806, 0,0.000000 }, + {4077,4077, 0, 0, 526, 526,0.000000 }, + {4078,4078, 0, 0, 40000, 73,0.000000 }, + {4079,4079, 0, 0, 40000, 6,0.000000 }, + {4080,4080, 0, 0, 40000, 153,0.000000 }, + {4081,4081, 0, 0, 40000, 0,0.000000 }, + {4082,4082, 0, 0, 40, 6,0.000000 }, + {4083,4083, 0, 0, 3400, 0,0.000000 }, + {4084,4084, 0, 0, 2280, 0,0.000000 }, + {4085,4085, 0, 0, 40000, 426,0.000000 }, + {4086,4086, 0, 0, 1206, 1206,0.000000 }, + { 127, 127, 36, 0, 20, 20,0.000000 }, + {4087,4087, 36, 0, 6, 6,0.000000 }, + {2030,2030, 36, 0, 93, 93,0.000000 }, + {3782,3782, 48, 0, 6, 6,0.000000 }, + {3783,3783, 36, 0, 33, 33,0.000000 }, + {4088,4088, 48, 0, 246, 246,0.000000 }, + { 132, 132, 69, 0, 13, 13,0.000000 }, + {4088,4088, 52, 0, 360, 360,0.000000 }, + { 152, 152, 48, 0, 86, 86,0.000000 }, + {4088,4088, 55, 0, 493, 493,0.000000 }, + { 139, 139, 57, 0, 93, 93,0.000000 }, + {4088,4088, 58, 0, 560, 560,0.000000 }, + {4088,4088, 60, 0, 580, 580,0.000000 }, + {4089,4089, 62, 0, 840, 840,0.000000 }, + {4088,4088, 63, 0, 626, 626,0.000000 }, + { 134, 134, 70, 0, 140, 140,0.000000 }, + {4090,4090, 70, 0, 286, 286,0.000000 }, + {4091,4091, 53, 0, 613, 613,0.000000 }, + {3516,3516, 48, 0, 40, 40,0.000000 }, + {4092,4092, 84, 0, 420, 420,0.000000 }, + {4093,4093, 43, 0, 160, 160,0.000000 }, + {4094,4094, 56, 0, 326, 326,0.000000 }, + {3791,3791, 24, 0, 140, 140,0.000000 }, + { 134, 134, 65, 0, 160, 160,0.000000 }, + { 146, 146, 48, 0, 40, 40,0.000000 }, + { 146, 146, 54, 0, 40, 40,0.000000 }, + {4095,4095, 42, 0, 46, 46,0.000000 }, + {4095,4095, 39, 0, 46, 46,0.000000 }, + {3816,3816, 52, 0, 106, 106,0.000000 }, + {4096,4096, 52, 0, 200, 200,0.000000 }, + { 158, 158, 60, 0, 33, 33,0.000000 }, + { 158, 158, 66, 0, 33, 33,0.000000 }, + { 158, 158, 59, 0, 33, 33,0.000000 }, + {3538,3538, 91, 0, 273, 273,0.000000 }, + {3547,3547,109, 0, 1780, 1780,0.000000 }, + {4097,4097, 79, 0, 126, 126,0.000000 }, + {4098,4098, 0, 0, 3413, 3413,0.000000 }, + {4099,4100, 0, 1, 2040, 2040,0.031250 }, + {4101,4102, 0, 1, 2146, 2146,0.031250 }, + {4103,4104, 0, 1, 1646, 1646,0.046875 }, + {4105,4106, 0, 1, 1900, 1900,0.156250 }, + {4107,4108, 0, 1, 1473, 1473,0.046875 }, + {4109,4110, 0, 1, 1020, 1020,0.062500 }, + {4111,4112, 0, 1, 2126, 2126,0.000000 }, + {4113,4114, 0, 1, 1740, 1740,0.000000 }, + {4115,4116, 0, 1, 993, 993,0.000025 }, + {4117,4118, 0, 1, 886, 886,0.000000 }, + {4119,4120, 0, 1, 1900, 1900,0.046875 }, + {4121,4122, 0, 1, 1420, 1420,0.000000 }, + {4123,4124, 0, 1, 193, 193,0.000000 }, + {4125,4126, 0, 1, 406, 406,0.000000 }, + {4127,4128, 0, 1, 1400, 1400,0.031250 }, + {4129,4129, 0, 1, 980, 980,0.031250 }, + {4130,4131, 0, 1, 40000, 6,0.156250 }, + {4132,4133, 0, 1, 40, 13,0.078125 }, + {4134,4135, 0, 1, 7180, 13,0.156250 }, + {4136,4137, 0, 1, 40000, 180,0.031250 }, + {4138,4139, 0, 1, 40000, 46,0.062500 }, + {4140,4141, 0, 1, 40000, 46,0.140625 }, + {4142,4143, 0, 1, 40000, 6,0.000000 }, + {4144,4145, 0, 1, 40000, 153,0.109375 }, + {4146,4147, 0, 1, 600, 600,0.000000 }, + {4148,4149, 0, 1, 653, 653,0.000025 }, + {4150,4151, 0, 1, 633, 633,0.000000 }, + {4152,4153, 0, 1, 893, 893,0.046875 }, + {4154,4155, 0, 1, 440, 440,0.000000 }, + {4156,4157, 0, 1, 40000, 60,-1.906250 }, + {4158,4159, 0, 1, 40000, 60,-1.906250 }, + {4160,4161, 0, 1, 2033, 2033,0.234375 }, + {4162,4163, 0, 1, 1600, 1600,0.031250 }, + {4164,4165, 0, 1, 1453, 1453,0.000000 }, + {4166,4167, 0, 1, 2186, 2186,0.000000 }, + {4168,4169, 0, 1, 1933, 1933,0.046875 }, + {4170,4171, 0, 1, 633, 633,0.000000 }, + {4172,4173, 0, 1, 486, 486,0.000000 }, + {4174,4174, 0, 0, 313, 313,0.000000 }, + {4175,4175, 0, 1, 40000, 33,0.156250 }, + {4176,4177, 0, 1, 2040, 13,0.000000 }, + {4178,4178, 0, 0, 40000, 66,0.000000 }, + {4179,4180, 0, 1, 40000, 60,0.000025 }, + {4181,4181, 0, 0, 40000, 133,0.000000 }, + {4182,4183, 0, 1, 40000, 173,0.078125 }, + {4184,4185, 0, 1, 320, 320,0.156250 }, + {4186,4187, 0, 1, 1813, 1813,0.031250 }, + {4188,4189, 0, 1, 1740, 1740,0.031250 }, + {4190,4191, 0, 1, 40000, 213,0.062500 }, + {4192,4193, 0, 1, 40000, 500,-0.062500 }, + {4194,4194, 0, 1, 40000, 326,0.109375 }, + {4195,4195, 0, 1, 40000, 406,0.109375 }, + {4196,4197, 0, 1, 40000, 280,0.140625 }, + {4198,4199, 0, 1, 40000, 53,0.140625 }, + {4200,4201, 0, 1, 40000, 286,0.156250 }, + {4202,4203, 0, 1, 206, 206,0.125000 }, + {4204,4205, 0, 1, 40000, 26,0.000000 }, + {4206,4207, 0, 1, 40000, 20,0.031250 }, + {4208,4208, 0, 0, 40000, 6,0.000000 }, + {4209,4209, 0, 0, 40000, 20,0.000000 }, + {4210,4211, 0, 1, 40000, 160,0.031250 }, + {4212,4213, 0, 1, 40000, 73,0.062500 }, + {4214,4215, 0, 1, 2526, 2526,0.093750 }, + {4216,4216, 0, 1, 5153, 5153,0.125000 }, + {4217,4217, 0, 0, 40000, 66,0.000000 }, + {4218,4218, 0, 0, 40000, 40,0.000000 }, + {4219,4219, 0, 0, 40000, 0,0.000000 }, + {4220,4220, 0, 0, 40000, 0,0.000000 }, + {4221,4222, 0, 1, 40000, 60,0.000000 }, + {4223,4223, 0, 0, 40000, 33,0.000000 }, + {4224,4224, 0, 0, 40000, 6,0.000000 }, + {4225,4226, 0, 1, 40000, 40,0.000000 }, + {4227,4227, 0, 0, 40000, 0,0.000000 }, + {4228,4228, 0, 0, 40000, 6,0.000000 }, + {4229,4229, 0, 0, 40000, 33,0.000000 }, + {4230,4231, 0, 1, 40000, 33,0.031250 }, + {4232,4233, 0, 1, 40000, 20,0.046875 }, + {4234,4235, 0, 1, 420, 420,0.031250 }, + {4236,4236, 0, 0, 40000, 106,0.000000 }, + {4237,4237, 0, 0, 40000, 6,0.000000 }, + {4238,4239, 0, 1, 40000, 6,0.125000 }, + {4240,4241, 0, 1, 40000, 13,0.109375 }, + {4242,4243, 0, 1, 40000, 53,0.109375 }, + {4244,4245, 0, 1, 120, 0,-0.031250 }, + {4246,4246, 0, 0, 40000, 6,0.000000 }, + {4247,4248, 0, 1, 40000, 133,0.156250 }, + {4249,4250, 0, 1, 3886, 3886,0.125000 }, + {4251,4252, 0, 1, 40000, 26,0.031250 }, + {4253,4254, 0, 1, 40000, 320,0.078125 }, + {4255,4256, 0, 1, 846, 66,0.109375 }, + {4257,4258, 0, 1, 1293, 80,0.078125 }, + {4259,4260, 0, 1, 40000, 193,0.156250 }, + {4261,4262, 0, 1, 2040, 2040,0.109375 }, + {4263,4264, 0, 1, 1360, 1360,0.062500 }, + {4265,4266, 0, 1, 40000, 433,0.093750 }, + {4267,4268, 0, 1, 40000, 533,0.109375 }, + {4269,4270, 0, 1, 826, 826,0.093750 }, + {4271,4272, 0, 1, 40000, 926,0.125000 }, + {4273,4273, 0, 1, 886, 886,0.109375 }, + {4274,4275, 0, 1, 2186, 2186,-0.046875 }, + {4276,4277, 0, 1, 1486, 1486,0.125000 }, + {4278,4279, 0, 1, 40000, 393,-0.078125 }, + {4280,4281, 0, 1, 40000, 1166,0.140625 }, + {4282,4283, 0, 1, 360, 360,0.078125 }, + {4284,4285, 0, 1, 1693, 1693,0.031250 }, + {4286,4287, 0, 1, 760, 760,0.000000 }, + {4288,4289, 0, 1, 126, 126,0.031250 }, + {4290,4290, 0, 0, 633, 633,0.000000 }, + {4291,4292, 0, 1, 280, 280,0.000000 }, + {4293,4294, 0, 1, 40000, 26,0.062500 }, + {4295,4295, 0, 0, 40000, 66,0.000000 }, + {4296,4296, 0, 0, 40000, 53,0.000000 }, + {4297,4297, 0, 0, 1940, 1940,0.000000 }, + {4298,4298, 0, 0, 86, 86,0.000000 }, + {4299,4300, 0, 1, 280, 280,0.031250 }, + {4301,4301, 0, 0, 40, 40,0.000000 }, + {4302,4303, 0, 1, 53, 53,0.000000 }, + {4304,4305, 0, 1, 140, 140,0.000000 }, + {4306,4307, 0, 1, 26, 26,0.000000 }, + {4308,4309, 0, 1, 2153, 2153,0.109375 }, + {4310,4310, 0, 0, 600, 600,0.000000 }, + {4311,4312, 0, 1, 993, 26,0.000000 }, + {4313,4314, 0, 1, 5613, 5613,0.000000 }, + {4315,4315, 0, 0, 220, 220,0.000000 }, + {4316,4317, 0, 1, 10306, 526,0.000000 }, + {4318,4319, 0, 1, 1486, 13,0.000000 }, + {4320,4321, 0, 1, 40000, 660,0.000000 }, + {4322,4322, 0, 0, 120, 120,0.000000 }, + {4323,4323, 34, 0, 40, 40,0.000000 }, + {4324,4324, 28, 0, 73, 73,0.000000 }, + {4325,4326, 39, 1, 233, 233,0.000000 }, + {4325,4326, 33, 1, 193, 193,0.000000 }, + {4327,4328, 63, 1, 33, 33,0.000000 }, + {4329,4329, 15, 0, 13, 13,0.000000 }, + {4330,4330, 36, 0, 13, 13,0.000000 }, + {4330,4331, 36, 1, 133, 133,0.406250 }, + {4332,4333, 25, 1, 13, 13,0.000000 }, + {4334,4333, 25, 1, 33, 33,0.000000 }, + {4335,4336, 61, 1, 40, 40,0.000000 }, + {4337,4338, 37, 1, 53, 53,0.000000 }, + {4339,4340, 15, 1, 80, 80,0.000000 }, + {4341,4342, 48, 1, 73, 73,-1.906250 }, + {4343,4344, 19, 1, 120, 120,0.000000 }, + {4345,4345, 48, 0, 53, 53,0.000000 }, + {4346,4347, 15, 1, 33, 33,0.000000 }, + {4348,4349, 12, 1, 33, 33,0.000000 }, + {4350,4351, 12, 1, 33, 33,0.000000 }, + {4352,4351, 10, 1, 40, 40,0.000000 }, + {4353,4354, 60, 1, 286, 286,0.062500 }, + {4355,4355, 62, 0, 1726, 1726,0.000000 }, + {4356,4357, 80, 1, 106, 106,0.125000 }, + {4358,4358, 58, 0, 73, 73,0.000000 }, + {4359,4360, 31, 1, 313, 313,0.000000 }, + {4361,4361, 61, 0, 206, 206,0.000000 }, + {4362,4363, 41, 1, 100, 100,0.000000 }, + {4364,4365, 35, 1, 160, 160,0.000000 }, + {4366,4367, 29, 1, 40, 40,0.000000 }, + {4368,4369, 41, 1, 166, 166,0.000000 }, + {4368,4369, 37, 1, 160, 160,0.000000 }, + {4370,4371, 54, 1, 80, 80,0.000000 }, + {4370,4372, 48, 1, 80, 80,0.000000 }, + {4373,4374, 77, 1, 53, 53,0.000000 }, + {4375,4376, 72, 1, 46, 46,0.000000 }, + {4377,4377, 40, 0, 140, 140,0.000000 }, + {4378,4378, 45, 0, 313, 313,0.000000 }, + {4379,4379, 42, 0, 40000, 0,0.000000 }, + {4380,4380, 73, 0, 60, 60,0.000000 }, + {4381,4382, 68, 1, 40, 40,0.000000 }, + {4383,4384, 18, 1, 60, 60,0.000000 }, + {4385,4386, 18, 1, 106, 106,0.000000 }, + {4387,4387, 90, 0, 80, 80,0.000000 }, + {4388,4388, 90, 0, 306, 306,0.000000 }, + {4389,4390, 64, 1, 233, 233,0.031250 }, + {4391,4392, 80, 1, 140, 140,0.031250 }, + {4393,4394, 64, 1, 606, 606,0.000000 }, + {4395,4395, 67, 0, 20, 20,0.000000 }, + {4396,4397, 50, 1, 53, 53,0.000000 }, + {4398,4398, 36, 0, 66, 66,0.000000 }, + {4399,4399, 0, 0, 40000, 20,0.000000 }, + {4400,4400, 0, 0, 40000, 0,0.000000 }, + {4401,4401, 0, 0, 360, 360,0.000000 }, + {4402,4402, 0, 0, 586, 586,0.000000 }, + {4403,4403, 0, 0, 40000, 0,0.000000 }, + {4404,4404, 0, 0, 40000, 0,0.000000 }, + {4405,4405, 0, 0, 40000, 0,0.000000 }, + {4406,4406, 0, 0, 40000, 6,0.000000 }, + {4407,4407, 0, 0, 40000, 0,0.000000 }, + {4408,4408, 0, 0, 146, 146,0.000000 }, + {4408,4408, 73, 0, 886, 886,0.000000 }, + {4409,4409, 0, 0, 40, 0,0.000000 }, + {4410,4410, 0, 0, 486, 0,0.000000 }, + {4411,4411, 0, 0, 1226, 1226,0.000000 }, + {4412,4412, 0, 0, 1480, 1480,0.000000 }, + {4413,4413, 0, 0, 46, 46,0.000000 }, + {4414,4414, 0, 0, 126, 126,0.000000 }, + {4414,4414, 12, 0, 106, 106,0.000000 }, + {4415,4415, 0, 0, 160, 160,0.000000 }, + {4415,4415, 1, 0, 153, 153,0.000000 }, + {4416,4416, 0, 0, 20, 20,0.000000 }, + {4416,4416, 23, 0, 26, 26,0.000000 }, + {4417,4417, 0, 0, 140, 140,0.000000 }, + {4418,4418, 0, 0, 486, 486,0.000000 }, + {4419,4419, 0, 0, 40000, 13,0.000000 }, + {4420,4420, 0, 0, 40000, 0,0.000000 }, + {4421,4421, 0, 0, 1226, 1226,0.000000 }, + {4422,4422, 0, 0, 766, 766,0.000000 }, + {4423,4423, 0, 0, 93, 93,0.000000 }, + {4424,4424, 0, 2, 40000, 0,0.000000 }, +}; + + + +//Returns total number of generated banks +int maxAdlBanks() +{ return 74; +} + +const char* const banknames[74] = +{ + "AIL (Star Control 3, Albion, Empire 2, Sensible Soccer, Settlers 2, many others)", + "Bisqwit (selection of 4op and 2op)", + "HMI (Descent, Asterix)", + "HMI (Descent:: Int)", + "HMI (Descent:: Ham)", + "HMI (Descent:: Rick)", + "HMI (Descent 2)", + "HMI (Normality)", + "HMI (Shattered Steel)", + "HMI (Theme Park)", + "HMI (3d Table Sports, Battle Arena Toshinden)", + "HMI (Aces of the Deep)", + "HMI (Earthsiege)", + "HMI (Anvil of Dawn)", + "DMX (Doom :: partially pseudo 4op)", + "DMX (Hexen, Heretic :: partially pseudo 4op)", + "DMX (MUS Play :: partially pseudo 4op)", + "AIL (Discworld, Grandest Fleet, Pocahontas, Slob Zone 3d, Ultima 4, Zorro)", + "AIL (Warcraft 2)", + "AIL (Syndicate)", + "AIL (Guilty, Orion Conspiracy, Terra Nova Strike Force Centauri :: 4op)", + "AIL (Magic Carpet 2)", + "AIL (Nemesis)", + "AIL (Jagged Alliance)", + "AIL (When Two Worlds War :: 4op, MISSING INSTRUMENTS)", + "AIL (Bards Tale Construction :: MISSING INSTRUMENTS)", + "AIL (Return to Zork)", + "AIL (Theme Hospital)", + "AIL (National Hockey League PA)", + "AIL (Inherit The Earth)", + "AIL (Inherit The Earth, file two)", + "AIL (Little Big Adventure :: 4op)", + "AIL (Wreckin Crew)", + "AIL (Death Gate)", + "AIL (FIFA International Soccer)", + "AIL (Starship Invasion)", + "AIL (Super Street Fighter 2 :: 4op)", + "AIL (Lords of the Realm :: MISSING INSTRUMENTS)", + "AIL (SimFarm, SimHealth :: 4op)", + "AIL (SimFarm, Settlers, Serf City)", + "AIL (Caesar 2 :: partially 4op, MISSING INSTRUMENTS)", + "AIL (Syndicate Wars)", + "AIL (Bubble Bobble Feat. Rainbow Islands, Z)", + "AIL (Warcraft)", + "AIL (Terra Nova Strike Force Centuri :: partially 4op)", + "AIL (System Shock :: partially 4op)", + "AIL (Advanced Civilization)", + "AIL (Battle Chess 4000 :: partially 4op, melodic only)", + "AIL (Ultimate Soccer Manager :: partially 4op)", + "AIL (Air Bucks, Blue And The Gray, America Invades, Terminator 2029)", + "AIL (Ultima Underworld 2)", + "AIL (Kasparov's Gambit)", + "AIL (High Seas Trader :: MISSING INSTRUMENTS)", + "AIL (Master of Magic, Master of Orion 2 :: 4op, std percussion)", + "AIL (Master of Magic, Master of Orion 2 :: 4op, orchestral percussion)", + "SB (Action Soccer)", + "SB (3d Cyberpuck :: melodic only)", + "SB (Simon the Sorcerer :: melodic only)", + "OP3 (The Fat Man 2op set)", + "OP3 (The Fat Man 4op set)", + "OP3 (JungleVision 2op set :: melodic only)", + "OP3 (Wallace 2op set, Nitemare 3D :: melodic only)", + "TMB (Duke Nukem 3D)", + "TMB (Shadow Warrior)", + "DMX (Raptor)", + "OP3 (Modded GMOPL by Wohlstand)", + "SB (Jammey O'Connel's bank)", + "TMB (Default bank of Build Engine)", + "WOPL (4op bank by James Alan Nguyen and Wohlstand)", + "TMB (Blood)", + "TMB (Lee)", + "TMB (Nam)", + "WOPL (DMXOPL3 bank by Sneakernets)", + "EA (Cartooners)", +}; +const unsigned short banks[74][256] = +{ + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 0, 179, 2, 180, 181, 182, 183, 184, 185, 9, 186, 11, 187, 188, 189, 190, + 191, 192, 193, 194, 20, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 35, 209, 34, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 50, 223, 224, 53, 225, 55, 56, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 71, 72, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 82, 249, 250, 251, 86, 252, 253, 254, 255, 91, 92, 256, 257, + 258, 259, 260, 98, 99, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 111, 272, 273, 274, 115, 275, 276, 277, 278, 120, 279, 280, 281, 282, 283, 284, + 127, 132, 285, 286, 127, 287, 288, 289, 290, 291, 292, 127, 127, 293, 294, 295, + 289, 296, 297, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 318, 320, 318, 321, 318, + 318, 322, 318, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 337, 338, 339, 320, 340, 341, 342, 343, 344, 345, 346, 346, 169, 170, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 164, 363, 156, 364, 292, 365, 366, 367, 368, 178, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + }, + { + 370, 179, 371, 180, 372, 373, 374, 375, 376, 377, 186, 378, 187, 379, 380, 190, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 381, 28, 370, 30, 31, + 32, 33, 34, 35, 36, 382, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 383, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 369, 393, 308, 394, 395, 396, 397, 398, 399, 398, 400, 401, 402, + 403, 404, 405, 406, 404, 406, 407, 404, 408, 404, 330, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 341, 342, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 419, 430, 351, 431, 308, 432, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + }, + { + 433, 434, 435, 28, 436, 31, 30, 437, 438, 439, 440, 441, 442, 38, 46, 443, + 79, 84, 444, 445, 49, 89, 92, 93, 105, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 119, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 304, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 345, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 355, 356, 357, 358, 359, 529, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + }, + { + 433, 434, 435, 28, 436, 31, 30, 437, 438, 439, 440, 441, 442, 38, 46, 443, + 79, 84, 444, 445, 49, 89, 92, 93, 105, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 119, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 433, 112, 99, 530, 531, 93, 532, 248, 107, 116, 533, 28, 78, 534, 535, + 536, 79, 94, 38, 33, 115, 537, 538, 539, 540, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 541, 542, 543, 544, 545, 546, 433, 295, + 547, 132, 134, 136, 138, 139, 141, 173, 156, 291, 292, 127, 548, 549, 550, 551, + 552, 362, 553, 143, 433, 433, 433, 433, 433, 433, 433, 304, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 554, 555, 556, 557, 487, 488, 489, + 490, 491, 492, 493, 558, 495, 496, 497, 498, 499, 500, 501, 559, 503, 504, 505, + 506, 507, 508, 560, 561, 511, 512, 513, 514, 562, 563, 345, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 564, 356, 565, 358, 359, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 295, + }, + { + 433, 434, 435, 28, 436, 31, 30, 437, 438, 439, 440, 441, 442, 38, 46, 443, + 79, 84, 444, 445, 49, 89, 92, 93, 105, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 119, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 566, 567, 568, 569, + 570, 34, 571, 572, 437, 51, 52, 84, 573, 574, 575, 576, 577, 85, 530, 90, + 93, 94, 101, 578, 114, 119, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 293, 127, 548, + 550, 296, 297, 296, 297, 298, 299, 300, 301, 302, 303, 304, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 345, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 355, 356, 357, 358, 359, 360, 361, 362, + 164, 363, 156, 364, 292, 365, 366, 367, 368, 178, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + }, + { + 433, 434, 435, 28, 436, 31, 30, 437, 438, 439, 440, 441, 442, 38, 46, 443, + 79, 84, 444, 445, 49, 89, 92, 93, 105, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 119, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 433, 579, 580, 581, 433, 433, 582, 433, 433, 433, 433, 583, 584, 585, 586, + 587, 444, 588, 589, 590, 433, 591, 592, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 577, 566, + 437, 90, 460, 28, 593, 594, 595, 596, 31, 597, 598, 28, 441, 442, 567, 530, + 93, 572, 599, 279, 30, 435, 100, 94, 575, 38, 281, 437, 447, 51, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 356, 357, 358, 359, 304, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 345, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 355, 600, 601, 602, 127, 548, 296, 603, + 604, 550, 605, 606, 362, 607, 135, 608, 361, 609, 610, 611, 612, 507, 146, 613, + 547, 500, 614, 364, 173, 615, 366, 600, 616, 617, 618, 619, 620, 621, 433, 433, + }, + { + 622, 179, 371, 180, 372, 373, 374, 375, 376, 377, 186, 378, 187, 379, 380, 190, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 381, 28, 370, 30, 31, + 32, 33, 34, 35, 36, 382, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 383, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 623, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 624, 625, 166, 167, 168, 169, 170, + 171, 172, 626, 174, 627, 176, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + }, + { + 628, 629, 371, 442, 372, 630, 571, 631, 376, 632, 186, 633, 634, 379, 380, 635, + 636, 598, 597, 637, 28, 638, 437, 437, 639, 640, 26, 641, 28, 572, 437, 642, + 643, 566, 570, 644, 567, 34, 568, 569, 212, 645, 646, 42, 43, 647, 648, 649, + 650, 651, 652, 653, 51, 52, 53, 573, 654, 655, 656, 657, 658, 574, 575, 576, + 659, 599, 660, 661, 662, 68, 663, 664, 71, 665, 666, 74, 75, 667, 668, 669, + 577, 85, 441, 442, 38, 84, 46, 86, 530, 88, 670, 90, 91, 92, 93, 94, + 258, 671, 97, 532, 99, 100, 101, 672, 536, 673, 674, 675, 676, 677, 464, 110, + 678, 578, 113, 114, 679, 116, 680, 599, 31, 462, 279, 125, 465, 281, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 681, 682, 683, 500, 503, 614, 684, 685, 296, 552, 550, 605, 600, + 548, 602, 127, 601, 293, 549, 604, 551, 603, 298, 362, 299, 135, 300, 361, 301, + 302, 547, 303, 142, 143, 144, 619, 146, 291, 686, 149, 687, 367, 368, 292, 365, + 366, 364, 688, 158, 689, 690, 615, 162, 163, 164, 363, 691, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + }, + { + 712, 713, 714, 715, 716, 713, 717, 718, 719, 720, 721, 722, 723, 724, 715, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 739, 739, + 740, 741, 742, 743, 744, 533, 745, 568, 678, 746, 747, 748, 739, 739, 749, 750, + 751, 752, 751, 753, 754, 212, 754, 755, 756, 757, 758, 759, 759, 760, 204, 761, + 762, 739, 739, 763, 762, 762, 764, 765, 766, 766, 766, 766, 767, 768, 767, 769, + 769, 770, 771, 664, 772, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 788, 789, 786, 753, 790, 780, 780, 780, 791, 791, + 792, 793, 794, 795, 796, 680, 680, 797, 798, 799, 800, 801, 802, 803, 742, 804, + 805, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, + 820, 821, 822, 823, 821, 824, 825, 821, 826, 821, 827, 828, 829, 830, 831, 832, + 833, 834, 834, 835, 835, 825, 825, 836, 837, 838, 806, 839, 840, 841, 806, 806, + 842, 843, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + }, + { + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, + 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, + 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, + 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 295, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 971, 972, 973, 974, + 975, 310, 976, 977, 978, 974, 979, 980, 981, 982, 983, 984, 983, 985, 986, 987, + 988, 989, 990, 325, 989, 325, 991, 989, 992, 989, 330, 993, 994, 995, 996, 997, + 998, 999,1000,1001,1002,1003, 340,1004,1005,1006,1007,1008,1009, 310,1010,1011, +1012, 429,1003, 430,1013,1014, 974,1015, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 295, + }, + { +1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031, +1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047, +1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063, +1064,1065,1066,1067, 223,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078, +1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094, +1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110, +1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126, +1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 305, 306, 307, 308, +1143, 425, 311,1144, 393, 308, 394, 395, 396, 397,1145, 399,1145, 400,1146, 402, + 403, 404, 405, 406, 404, 406, 407, 404, 408, 404, 330, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 341, 342, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 419, 430, 351, 431, 308, 432, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + }, + { +1147,1017,1018,1148,1149,1150,1022, 184,1024,1025,1026,1027,1028,1151,1152,1153, +1154,1033,1155,1035,1036,1156,1038,1039,1040,1157,1042,1158,1159,1160,1161,1047, +1162,1163,1164,1165,1166,1167,1168,1169,1056,1170,1058,1059,1060,1171,1062,1172, +1173,1065,1066,1174, 223,1068,1069,1070,1175,1176,1177,1074,1178,1179,1180,1078, +1079,1080,1081,1082,1181,1084,1182,1183,1087,1184,1089,1090,1185,1186, 922,1187, +1188,1189,1097,1098,1190,1100,1191,1192,1103,1193,1194,1195,1196,1197,1198,1199, +1111,1200,1201,1202,1203,1116,1204,1205,1119,1206,1207,1122,1123,1124,1125,1208, +1127,1209,1210,1130,1131,1211,1212,1213,1135,1214,1215,1138,1139,1216,1217,1218, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 386, 387, 388, 389, + 390, 391, 392,1219,1219, 308, 394, 395, 396, 397, 398, 399, 398, 400, 401, 402, + 403, 404, 405, 406, 404, 406, 407, 404, 408, 404, 330, 409, 410, 411, 412, 413, + 414, 415, 416,1220,1221, 419, 420, 341, 342, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 419, 430, 351, 431, 308, 432, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + }, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 623, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 624, 625, 166, 167, 168, 169, 170, + 171, 172, 626, 174, 627, 176, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + }, + { +1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237, +1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253, +1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269, +1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285, +1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301, +1302,1303,1304,1305,1306,1307,1308,1309,1309,1310,1311,1312,1313,1314,1315,1316, +1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332, +1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 312,1349,1350,1351,1352,1353,1354, 319,1355, 320,1356, 321,1357, +1358,1359,1360,1361,1362,1363,1364,1365,1366,1359,1367,1361, 332, 333, 334, 335, + 336,1368,1369, 338, 339, 320,1370,1371,1371,1371,1371,1372,1373,1374,1375,1371, + 347, 348, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237, +1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1376,1377,1253, +1378,1255,1256,1379,1380,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269, +1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1381,1281,1282,1283,1284,1285, +1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301, +1302,1303,1304,1305,1306,1307,1308,1309,1309,1310,1311,1312,1313,1314,1315,1316, +1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332, +1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 312,1349,1350,1351,1352,1382,1354, 319,1355, 320,1356, 321,1357, +1358,1359,1360,1361,1362,1363,1364,1383,1366,1359,1384,1361, 332, 333, 334, 335, + 336,1368,1369, 338, 339, 320,1370,1371,1371,1371,1371,1372,1373,1374,1375,1371, + 347, 348, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237, +1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1385,1252,1253, +1386,1255,1256,1379,1380,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269, +1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1381,1281,1282,1283,1284,1285, +1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301, +1302,1303,1304,1305,1306,1307,1308,1309,1309,1310,1311,1312,1313,1314,1315,1316, +1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332, +1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 312,1349,1350,1351,1352,1353,1354, 319,1355, 320,1356, 321,1357, +1358,1359,1360,1361,1362,1363,1364,1383,1366,1359,1387,1361, 332, 333, 334, 335, + 336,1368,1369, 338, 339, 320,1370,1371,1371,1371,1371,1372,1373,1374,1375,1371, + 347, 348, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 622, 179, 371,1388, 372, 373, 374, 375,1389, 377, 186,1390, 187, 379,1391,1392, +1393,1394,1395,1396,1397,1398,1399,1400,1401, 25, 26, 381, 28, 370, 30,1402, +1403, 33, 34, 35, 36, 382, 38, 33, 39, 40,1404, 42, 43, 44, 45, 46, + 222,1405,1406,1407,1408,1409,1410,1411, 55, 56,1412, 58, 59,1413,1414, 62, +1415,1416,1417,1418, 67, 68, 69, 70, 71, 72,1419, 74,1420,1421,1422,1423, + 79, 80, 81,1424, 83,1425,1426, 86,1427,1428,1429,1430,1431,1432, 256, 257, +1433, 96, 97,1434,1435,1436, 262, 263, 103, 104, 105,1437, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 660, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145,1438, 147, 148,1439, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163,1440,1441, 166, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 0, 1, 2, 3, 4, 5,1443, 7, 8,1444, 10, 11, 12, 13,1445, 15, + 16, 17, 18,1446, 20, 21, 22, 23,1447, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42,1448,1449,1450,1451, +1452,1453,1454, 50,1455, 52, 53,1456,1457,1458,1459, 58,1460,1461, 61, 62, + 63, 64, 65, 66,1462, 68,1463,1464,1465,1466, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,1467, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114,1468, 116,1469, 277, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1470,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481, +1482,1483,1484, 142,1485, 144,1486,1487, 147,1488,1489, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159,1490, 161, 162, 163, 164, 165, 166,1491, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 713, 714, 715, 716, 713, 717,1492, 719,1493, 721,1494, 723,1495, 715, 725, + 728, 728, 728, 729, 730,1496,1497,1497, 734,1498, 736,1499, 739, 739, 739, 739, + 740,1500,1501,1502,1500, 533, 745,1503, 678, 746,1504,1505, 739, 739,1506,1507, +1508, 781,1508, 753,1509,1510,1509,1511, 756, 757, 758, 759, 759,1512,1513, 761, + 762, 739, 739, 739, 762, 762, 764, 765, 766, 766, 766, 766, 767,1514, 769, 769, + 769, 770, 771,1515,1516,1516,1517, 774,1518,1518,1519,1520, 779,1521, 781,1522, + 783, 784,1523, 786,1524,1525,1525,1526, 786, 753,1527,1521,1521,1521,1528,1528, + 792, 793, 680, 795, 796, 680, 680,1529,1530,1531,1532,1533, 802, 803,1534,1535, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1536,1536,1537,1538, 811,1537,1539,1540,1539,1541,1542,1541,1541, +1543,1544,1537, 295,1545,1546, 295, 295,1542, 295, 295, 295,1547,1539,1537,1548, +1542,1537,1539,1549,1550,1541,1541,1541,1541,1541, 295,1541, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,1554, 181, 182, 183,1555, 185,1556,1557,1558,1559, 188, 189,1560, +1561,1562,1563,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580, 226,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,1611,1612, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623, +1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639, +1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655, +1656,1657,1658,1659,1660,1661,1662,1663, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 713, 714,1664,1665,1666, 717,1492, 719,1667,1668, 722, 723, 724, 715, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736,1669,1670,1671, 739, 739, + 740,1672,1673,1674,1675,1676,1677,1678,1679, 746,1680, 748,1681,1682,1683,1684, +1685, 752,1686,1687,1688,1689, 732, 755, 756, 757, 758, 759, 759,1690, 204,1691, +1692,1693,1694,1695,1696,1697,1698,1699, 766,1700,1701, 766,1702, 768,1703,1704, +1705,1706,1707, 664, 772, 772, 773,1706,1690,1708,1708,1708,1708,1708,1709, 782, +1710, 784,1711,1712, 787, 788, 788, 789,1712, 753, 790, 780, 780, 780, 791, 791, + 792, 793,1713,1714, 796, 680, 680, 797, 798, 799, 800,1533,1715, 803,1534,1535, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1716,1717,1718,1719,1720,1720,1539, 814,1539,1721,1542, 818,1721, +1543,1544,1537, 295,1545,1546, 295, 295,1542, 295, 295, 295,1547,1539,1537,1722, +1542,1537,1539,1549,1550,1721,1723,1721,1724,1725, 295,1726, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742, +1743,1744,1745, 194,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757, +1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773, +1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785, 228,1786,1787,1788, +1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1766, 245, +1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818, +1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834, +1835,1836,1837, 274,1838,1839,1840,1841, 278,1842,1843,1844,1845,1846,1847,1848, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1849,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860, +1861,1862,1863,1864,1865,1864,1866,1867,1868,1869,1870,1864,1871,1872,1873,1874, +1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890, +1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1903, 295,1904, 713,1905, 713, 717,1492, 598,1493,1493,1906,1907,1907,1907, 761, + 728, 728, 728, 730, 730, 730,1497,1497,1908,1909,1910,1910, 739, 739,1911, 739, +1912,1913,1501,1502,1913, 533,1914,1503, 678, 678,1504, 764, 739, 739,1506,1507, +1915,1916,1917,1918,1509,1510,1509,1511, 756, 757, 758, 759, 759,1512,1513,1919, +1909,1920,1921, 295,1910, 295, 764,1922,1923, 295, 295, 295,1924,1925, 295, 769, +1926,1927, 295, 295, 295, 295,1928,1929,1930,1518,1519,1931,1932,1932,1933,1934, +1935,1936,1937,1938,1939, 295,1525,1940,1937,1934, 295,1941, 295, 295, 295,1941, +1942, 295, 295, 295,1943,1944, 295,1945, 295, 295,1921, 295, 280,1903, 678, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295,1946,1947,1948,1949,1948,1539,1950,1539,1541,1542,1541,1542, +1537,1951,1537,1952, 295,1948,1953,1948, 295, 295, 295, 295,1537,1539,1537,1537, +1542,1537,1539,1948,1954,1541,1954,1541,1541,1541, 295,1541, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, +1955, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295,1956, 295, 295, 295, 295, 295, 295, 295, 295,1957, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295,1958, 295, 295,1959, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 456,1960, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,1961,1961,1961, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295,1962,1963, 295, 295, 295,1964, 295, 295, 295, 295, 295, 295, 295, 295, 295, +1965,1966, 295, 295, 295, 295, 295, 295, 295, 757,1967,1968,1968, 295, 295, 295, + 295, 295, 295, 295, 295, 295,1969,1969,1970,1971,1970, 295, 295, 295, 295, 295, + 295, 295,1972,1972, 295, 295, 295, 295, 295,1973,1520, 295, 779, 295, 295, 295, + 295, 295, 295, 295, 295, 295,1974,1964,1975,1976,1977,1978, 295, 295, 673,1979, + 459,1980,1981, 295, 295,1982, 295, 295,1983, 295, 295,1984,1985,1986,1987, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295,1988,1988,1988, 295, 295, 295, 295, 295, 295, 295, + 295,1989, 295, 295, 295, 295,1990, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,1398, +2006,2006,2006,2007,2007,2007,2008,2009,2010,2011,2012,2013, 34,2014, 33,2015, +2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031, +2032,2033,2034,2035,2036,2037,2038,2039,2040, 45, 45,2041,2042,2043,2044,2045, +2046, 739,2047,2048,2049,2050,2051,2051,2052,2053,2053,2054,2055,2056,2057,2058, +2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2071,2072,2073, +2074,2075,2076,2077,2078,2079,2080, 275,2081,2082,1527,2083,2084,2085,2086,2087, +2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099, 122,2100,2101,2102, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2104,2105,2106,2107,2108,2109,2110,2111,2110,2112,2113,2114,2113, +2115, 547,2115,2116,2103,2103,2117,2103,2118,2103,2103,2103,2119,2120,2121,2122, +2123,2124,2125,2126,2127, 160, 161, 162, 163,2128,2103,2129,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103, 295,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, + }, + { +2130,2130,2130,2130,2130,2130, 727,2131,2132,2133,2134,2135,2136,2137,2138,2139, +2140,2140,2140,2140,2141,2142,2143,2142,2144,2145,2144,2144,2144,2146, 204,2147, +2148,2148,2148,2148,2148,2148,2148,2148,2149,2149,2149,2148,2149,2150,2151,2152, +2149,2149,2153,2153, 754,2154,2154,2155, 227,2156,2157, 227,2158, 227, 227, 227, + 227, 227, 227, 227, 733,2158,2159,2160,2161,2161,2161,2162,2161,2161,2163,2163, +2164, 770,2165,2165,2130,2154,2166,2167,2168,2169,2170,2171,2172,2173,2174,2166, +2174,2175,2138,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2187, +2132,2188,2189,2190,2191,2191,2191,2192,2193,2165,2194,2195,2196, 282,2197,1534, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,1716,1716,1716,1716,1716, +1544,1544,1544,1716,1536,2198,1538,1538,1547,2199,2200,2199,2201,2199,2201,2202, +2203,2204,2205, 814,2204, 814, 814, 816,2206,2204,2207, 814,2208,2209,1726,1725, +1724,2210,2211,1549,1550,2212,2212,1721,1724,1725,1725,2198,2213,2214,2214,2214, +1722,2215,2212,2215,2215,2198,1724,1726, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871,2216, 873, 874, 875, + 876, 877, 878,2217, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894,2218, 896, 897, 898, 899, 900,2219,2220, 903,2221, 905,2222,2223, +2224, 909,2225, 911, 912,2226,2227, 915, 916,2228,2229, 919, 920, 921, 922, 923, +2230, 925, 926, 927, 928, 929,2231, 931, 932, 933, 934, 935,2232,2233, 938,2234, + 940,2235, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966,2236, 968,2237, 970,2238, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 971, 972, 973, 974, + 975, 310, 976, 977, 978, 974,2239, 980,2240, 982,2241, 984,2242, 985,2243, 987, + 988,2244, 990, 325,2244, 325, 991,2244,2245,2246, 330, 993,2247,2248,2249, 997, + 998,2250,2251,1001,1002,1003, 340,1004,1005,1006,1007,1008,1009, 310,1010,1011, +2252, 429,1003, 430,1013,1014, 974,1015, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 0, 1, 2, 295, 295, 295, 5,2253, 295, 295,1395, 295,1396,1396,2254,1398, + 295, 295, 295, 295, 295, 295,2255,2255,2256,2256, 62,2256, 33, 33, 38, 38, +1427,2257,1408,1408, 96,1434, 34,1410, 260,1433, 35,1433, 62, 295,1393, 79, +1406,1407,2258, 44, 295, 295,1404,1404, 42, 45, 45,2259, 25,2260, 295, 103, + 295,1403, 295, 34, 36, 37, 35, 35, 72, 72, 295, 295,2261, 74, 295, 295, +1420,1418, 70, 70, 67, 68, 69,1399, 295, 295, 56, 295, 59, 59,1412, 295, + 295, 12, 260, 295, 10, 9,2262, 13, 12,1437, 295,1421,1422,1420,1420,1423, +2263, 116, 295, 295, 295,2264, 115,2265,2266,2267,1411, 123, 122,2265,2268,2265, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144,2269,1438, 147, 148,1439, 150, 151, 152, 153, 154, + 155, 156,2270, 158, 159, 160, 161, 162, 163,1440,1441, 166, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 0, 1, 2, 295, 295, 295, 5,2253, 295, 295,1395, 295,1396,1396,1396,1398, + 295, 295, 295, 295, 295, 295,2255,2255,2256,2256, 62,2256, 33, 33, 38, 38, +1427,1408,1408,1408, 96,1434, 34,1410, 260,1433, 35,1433, 62, 295,1393, 79, +1406,1407, 222, 44, 295, 295,1404,1404, 42, 45, 45,1401, 25, 27, 295, 103, + 295,1403, 295, 34, 36, 37, 35, 35, 72, 72, 295, 295,1419, 74, 295, 295, +1420,1418, 70, 70, 67, 68, 69,1399, 295, 295, 56, 295, 59, 59,1412, 295, + 295, 12, 260, 295, 10, 9,2262, 13, 12,1437, 295,1421,1422,1420,1420,1423, + 46, 116, 295, 295, 295, 115, 115,2265,2266,2267,1411, 123, 122,2265,2268,2265, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145,1438, 147, 148,1439, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163,1440,1441, 166, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,1554,2271, 182, 183,1555,2272,1556,1557,2273,1559, 188,2274,1560, +1561,1562,1563,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 268,2275,2276, +2277,2277,2278,1575,1576,1577,1578, 225,1579,1580, 226,1581,2279,2280, 230, 254, + 232, 233, 234, 235,2281, 237, 238, 239,1584,1585,2282,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590,2283, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,1611,1612, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2284, + 295, 295, 295,2284,2285,2286,1614,1615,2287,2288,1618,1619,1620,1621,1622,1623, +1624,1625,1626,2289,2290,1629,1630,1631,2291,1633,2292,2293,2294,2295,1638,1639, +1640,1641,1642,1643,1644,1645,1646,1647,1648,2296,2297,1651,1652,1653,1654,1655, +1656,1657,2298,2299,2300,1661,1662,1663, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 713,1904, 713,1905, 713, 717,1492, 598,2301,2301, 636,2302,2302,2302, 761, + 728, 728, 728, 730, 730, 730,1497,1497,1499,1499,1499,1499, 739, 739, 739, 739, +2303,1913,2304,2305,1913, 533,1914, 568, 678, 678, 747, 764, 739, 739, 749,1507, +2306,1916,2306,2307, 754, 212, 754, 755, 756, 757, 758, 759, 759,1512,1513,1919, + 762, 739, 739, 739, 762, 762, 764, 764,2308,2308,2308,2308, 666, 666, 769, 769, + 769,2309,2310, 664, 772, 772, 773,1929, 654, 654, 777, 778, 779,2311,2312,1522, +2313,2314,1711, 786, 788, 788, 788,2315, 786,2307, 790,2316,2316,2316, 666, 666, + 792, 834, 680, 796, 796, 680, 680, 797,2317,1531, 800,1533, 280,1913, 678,2318, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2319,2319,1537, 811, 811, 811,1539,2320,1539,1721,1542,1721,1542, +1537,2321,1537,1721,1721, 295,1721, 295,1542,2321, 295, 295,1537,1539,1537,1537, +1542,1537,1539, 811,2322,1721,1721,1721,1721,1721, 295,1721, 295, 295, 295, 295, +1721,1721,1721, 295, 295,1721, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1727,1728,1729,2323,1731,2324,1733,1734,1735,1736,1737,2325,1739,1740,2326,1742, +2327,1744,1745, 194,1746,1747,1748,2328,1750,1751,1752,1753,1754,1755,1756,2329, +1758,1759,1760,2330,1762,1763,1764,1765,2331,2332,2333,2334,2335,1771,1772,1773, +1774,1775,1776,1777,2336,2337,2338,1781,2339,2340,2341,2342, 228,1786,1787,1788, +1789,1790,1791,1792,1793,1794,1795,1796,2343,2344,1799,1800,1801,2345,2346, 245, +1803,1804,2347,2348,1807,2349,1809,1810,1811,1812,1813,2350,1815,1816,2351,1818, +2352,2353,2354,1822,2355,1824,2356,1826,1827,1828,1829,1830,1831,1832,1833,1834, +1835,1836,1837, 274,1838,1839,1840,2357, 278,1842,2358,2359,2360,2361,1847,2362, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1849,1849,1850,1851,1852,1853,1854,2363,1856,1857,1858,2364,1860, +1861,2365,1863,2366,2367,2366,2368,2369,1868,2370,1870,2366,1871,1872,1873,1874, +1875,1876,1877,1878,1879,2371,2372,2373,2374,2375,2376,1886,1887,1888,1889,1890, +1891,1892,2377,2378,2379,1896,1897,1898,1899,1900,1901,2380, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,2381, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, +2382, 497,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +2397,2398, 371,1388, 372, 373,2399, 631,1389,2400, 186,2401,2402, 379,1391,2403, +1906, 598,2404, 637,1397,1398,1929,1400, 531,2405, 26, 641, 28, 370, 30,2406, + 643,2407, 570, 644, 567, 34, 38, 33,1510, 645, 646, 42, 43,2408, 648, 649, +2409,2410, 652,2411,1408,1409,1410,2412,1518,1520, 656, 58,2413, 574,2414,2415, +1415,1416,1417,1418,2416, 68,1517,1515, 71,2417,1528, 74,1420,2418, 668,1423, + 79, 537, 248,1424, 533,1425,1426, 86, 530,1428, 670,1430,1431,1432, 256, 257, + 258, 671, 97,2419,1435,1436, 262, 263, 536,2420, 674,1437, 107, 108, 109, 110, + 678, 112, 113, 114, 115, 116, 680, 660, 119, 120, 279, 280, 281,2421, 125, 659, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2422, +2423,2424,2425, 127, 548, 549, 550, 551, 552, 132, 362, 134, 135, 136, 361, 138, + 139, 547, 141, 142, 143, 144,2426,1438, 291,2427,1439, 150, 367, 368, 292, 365, + 366, 156, 364, 158, 689,2428, 615, 162, 163,1440, 363,2429, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,1554, 181, 182, 183,1555, 185,1556,1557,1558,1559, 188, 189,1560, +1561,1562,1563,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580, 226,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,1611,1612, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2430,2430,2431,2432,2433,2434,2435,2436,2437,2436,2438,2436,2439, +2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455, +2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471, +2472,2473,2474,2475,2476,2468,2477,2478, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295,2479,2479,2480, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295,2481, 213, 295, 295, 295, 295,2482,2483, +2484,2485, 295, 295, 295, 295, 295, 295,2486, 777, 295,2487,2488, 576, 295, 295, + 295, 295, 295, 295,2489,2490,2491, 664,2308,2308,2492, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2493, + 295, 295, 295,2494,2495, 295, 295, 295,2496,2497, 295,2498, 295,2499, 295,2500, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,1554, 181, 182, 183,1555, 185,1556,1557,1558,1559, 188, 189,1560, +1561,1562,1563,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580, 226,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,1611,1612, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127,2286,1614,1615,1616,2288,1618,1619,1620,1621,1622,1623, +1624,1625,1626,2289,2290,1629,1630,1631,2291,1633,2292,2293,2294,2295,1638,1639, +1640,1641,1642,1643,1644,1645,1646,1647,1648,2296,2297,1651,1652,1653,1654,1655, +1656,1657,2298,2299,2300,1661,1662,1663, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 622, 179, 371,1388, 372, 373, 374, 375,1389, 377, 186,1390, 187, 379,1391,1392, +1393,1394,1395,1396,1397,1398,1399,1400,1401, 25, 26, 381, 28, 370, 30,1402, +1403, 33, 34, 35, 36, 382, 38, 33, 39, 40,1404, 42, 43, 44, 45, 46, + 222,1405,1406,1407,1408,1409,1410,1411, 55, 56,1412, 58, 59,1413,1414, 62, +1415,1416,1417,1418, 67, 68, 69, 70, 71, 72,1419, 74,1420,1421,1422,1423, + 79, 80, 81,1424, 83,1425,1426, 86,1427,1428,1429,1430,1431,1432, 256, 257, +1433, 96, 97,1434,1435,1436, 262, 263, 103, 104, 105,1437, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145,1438, 147, 148,1439, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163,1440,1441, 166, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +2501,2502,2503,2504,2505,2506,2507, 730,2508,2509,2510,2511,2512,2513,2514,2515, +2516,2517,2518,2519,2520,2521,2522,2523, 639,2524,2525,1512,2526,2527,2527,2527, +2528,2529,2530,2531,2532,2532,2533,2534, 212,2535,2536, 295,2527,2537,2538,2483, +2539,2485,2527,2527,2527,2527,2527,2527,2540,2541,2542,2487,2543, 576, 575,1522, +2544,2527,2527,2527, 224,2545,2546,2547,2548,2308,2549,2527, 295,2550, 295, 295, + 295, 295, 295, 295,2551, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2552,2553, 295, 295, 295,2554, + 295, 295, 295, 677,2483, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2493, + 295,2555, 295,2556,2495,2557,2558,2559,2496,2497,2560,2498,2561,2499,2562,2500, +2563,2564,2565,2527, 295, 295,2566, 295,2567, 295, 295, 295,2570,2571, 295,2572, +2573, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 713, 714,2574,2575,1666,2576,1492, 719,2577, 721,2578, 723, 724, 715, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734,1498, 736, 737,1670, 739, 739, 739, + 740,1672,2304,2305,1672, 533, 745, 568, 678, 746,1680, 748, 739, 739, 749, 750, +1686, 752,1686, 753, 754, 212, 754, 755, 756, 757, 758, 759,2579, 760, 204, 761, + 762, 739, 739, 739, 762, 762, 764, 765, 766, 766, 766, 766, 767, 768,2580,2580, +2580, 770, 771, 664, 772, 772, 773,1706,1690, 654, 777, 778, 779, 780, 781, 782, +2581, 784,2582,1712, 787, 788, 788, 789,1712, 753, 790, 780, 780, 780, 791, 791, + 792, 793, 680,2583, 796, 680, 680, 797, 798, 799, 800,1533, 802, 803,1534,1535, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1716,1536,1718,1538, 811,1537,1539, 814,1539,1721,1542, 818,1721, +1543,1544,1537, 295,1545,1546, 295, 295,1542, 295, 295, 295,2584,1539,1537,1722, +1542,1537,1539,1549,1550,1721,1721,1721,1724,1725, 295,1726, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 844, 845, 846, 847, 848, 849, 850, 851, 852,2585, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, + 876, 877, 878, 879, 880,2586, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, + 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, + 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956,2587, 958, 959, 960, 961, 962,2588,2589,2590,2591,2592,2593,2594,2595,2596, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2597,2598,2598,2599, +2600,2601,2602,2603, 127,2604,2605,2606, 979, 132,2607, 134,2608, 136,2609, 138, + 139,2610, 141,2611,2612,2613,2614,2612,2615,2612,2616,2617,2618,2619,2620,2621, +2622,2623,2624,2625,2626, 160,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636, +2637,2638, 173,2639,2640,2641,2642,1015, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +2397,1492,2643,1904, 630, 713,2644,2645,2646, 295, 295, 295, 295, 295,2647, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2648,2649,2650, 295, 295, 295, +2651,2651, 739,2652,2653,2654,2655,2656,2657,2535,2658,2659,2660,2661, 757,2662, +2663, 651,2664,2665,2666,2667,2668,2669,2670,2671, 656,2672, 779, 575,1522, 576, + 295,2673,2674,2675, 747, 224,2546, 664,2316,2308, 241,2676,2677, 295, 666, 295, + 79, 295, 295,2678,2679, 295, 295, 295,2680, 295, 295, 295, 91,2681,2682, 94, + 295, 295, 295, 295, 295,2683, 295, 295, 295, 295, 295, 295, 295, 295,2684, 295, + 295, 295, 295, 295,1982, 295, 295, 295, 295, 295,2685, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295,2686,2687,2688,2689,2690,2691, 606,2692, 607, +2693, 608,2694, 609,2695, 610,2696, 612,2697,2698,2699, 289,2700, 295,2701, 295, + 295,2702, 295, 295,2703,2702,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713, +2714,2715,2716,2717,2718,2719,2720, 295,2721,2722, 295,2723,2724,2725,2726,2727, +2698,2728,2729,2730,2721,2731,2732,2733,2734,2735, 295,2736, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295,2737,2738,2739, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,2740,2741, 181, 182, 183,2742,2743,2744, 186,1558,2745,2746,2747, 190, + 191, 192,2748,1564,2749,2750, 196, 197, 198, 199, 200,2751, 202,2752,2753,2754, +2755,2756,2757,2758,2759,2760, 210,2761,1572,2762,2763, 215,2764,2765, 218,2766, +2767,2768,1574, 50,2769,2770,1578,2771,2772,2773,2774,2775,2776,2777, 59,2778, +2779,2780,2781, 235, 236,2782,2783,2784,2785,2786, 240,2787, 242,2788, 244,1587, +2789,2790,2791,1589, 249,2792,2793,2794, 252,2795,2796, 255,2797,2798,2799,1594, +2800,2801,1596,2802,1598,2803,2804,1601, 264, 265,2805,2806, 268, 269, 270, 271, +1602, 272, 273,2807,2808,2809, 276,2810,2811,2812,2813,2814,2815,2816,2817,2818, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831, +2832,2833,2834,2835,2836,2837,2838,2839, 147,2840,2841,2842, 151, 152, 153, 154, + 155, 156, 157,2843,2844,2845,2846, 162, 163,2847,2848,2849, 167, 168,2850,1442, +2851,2852,2853, 174,2854, 176,2855,2856, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 203,1566,2857,2858, 181, 182, 183,2859,2860,2861,1557,1558,1559, 188, 189,1560, +1561,1562,2862,1564,1565, 195, 196, 197,2861, 199, 200,2863,2864, 203,2865,2866, +2860,2867,2868,1568,1569,2869,2870, 207,1572,1573, 214, 215, 216, 217, 218,2871, + 220, 221,2872,1575,1576,1577,1578, 225,1579,1580, 226,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,2873, 242, 243, 244,2874, + 246, 247,1588,1589, 249,2875,2876,2877,2878, 253, 254, 255,1591,1592,1593,2879, +1595, 259,1596,2880,1598,1599,1600,1601, 264, 265, 266,2881, 268, 108, 270,2859, +2882,2883, 273,1603,1604,1605, 276,2884,2885,2886,1609,1610,2887,1612,2888, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2889,2889, 128, 129, 130,2890, 132,2891, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145,1438, 147, 148,1439, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163,1440,1441, 166, 167, 168, 169,1442, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1727,1728,1729,2323,1731,2324,1733,1734,1735,1736,1737,2325,1739,1740,2326,1742, +2327,1744,1745, 194,1746,1747,1748,2328,1750,1751,1752,1753,1754,1755,1756,2329, +1758,1759,1760,2330,1762,1763,1764,1765,2892,2332,2333,2334,2335,1771,1772,1773, +1774,1775,1776,1777,2336,2337,2338,1781,2339,2340,2341,2342, 228,1786,1787,1788, +1789,1790,1791,1792,1793,1794,1795,1796,2343,2344,1799,1800,1801,2345,2892, 245, +1803,1804,2347,2348,1807,2349,1809,1810,1811,1812,1813,2350,1815,1816,2351,1818, +2352,2353,2354,1822,2355,1824,2356,1826,1827,1828,1829,1830,1831,1832,1833,1834, +1835,1836,1837, 274,1838,1839,1840,2357, 278,1842,2358,2359,2360,2361,1847,2362, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,1849,1849,1850,1851,1852,1853,1854,2363,1856,1857,1858,2364,1860, +1861,2365,1863,2366,2367,2366,2368,2369,1868,2370,1870,2366,1871,1872,1873,1874, +1875,1876,1877,1878,1879,2371,2372,2373,2374,2375,2376,1886,1887,1888,1889,1890, +1891,1892,2377,2378,2379,1896,1897,1898,1899,1900,1901,2380, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908, +2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924, +2925,2926,2927,2928, 209,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939, +2940,2941,2942,2940,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953, 437, +2954,2955,2956,2957,2958,2959,2960,2961,2962,2306,2963,2964,2965,2550,2966,2967, +2968,2969,2554,2970,2489,2971,2972,2973, 657, 575,2974,2975,2976, 779,2977,2978, +2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2553,2989,2990,2991,2992,2993, +2994,2995, 680, 796,2996, 797,2662,2997,2998,2999,2514,3000,3001,1913,3002,3003, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 384, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,3004, 295, + 295, 295, 295,1219,1219, 308, 394, 395, 396, 397, 398, 399, 398, 400, 401, 402, + 403, 404, 405, 406, 404, 406, 407, 404, 408, 404, 330, 409, 410, 411, 412, 413, + 414, 415, 416,1220,1221, 419, 420, 341, 342, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 419, 430, 351, 431, 308, 432, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + }, + { +2501,2502,2503,2504,2505,2506,2507, 730,2508,2509,2510,2511,2512,2513,2514,2515, +2516,2517,2518,2519,2520,2521,2522,2523, 639,2524,2525,1512,2526,2527,2527,2527, +2528,2529,2530,2531,2532,2954,2533,2534, 212, 213,2536, 295,2527,2537,2482,2483, +3005,2485,2527,2527,2527,2527,2527,2527,3006,2541,3007,2487,3008, 576, 575,1522, +2544,2527,2527,2527, 224,2545,2546,2547,2548,2308,2549, 241, 295,2550, 295, 295, +2304,3009, 295, 295,2551, 295, 295,3010, 295, 295,3010, 295, 295, 295, 295, 295, + 295, 295, 295,2898, 295, 295, 295, 295, 295, 295,2552,2553, 295, 295, 295,2554, + 295, 295, 295, 677,2483, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2493, + 295,2555, 295,2556,2495,2557,2558,2559,2496,2497,2560,2498,2561,2499,2562,2500, +2563,3011,2565,2527, 295, 295,2566, 295,2567, 295, 295, 295,3012,3013,3014,3015, +3016,3015,3016, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1492, 713,1904, 713,1905, 713, 717,1492, 598,1493,1493,1906,1907,1907,1907, 761, + 728, 728, 728, 730, 730, 730,1497,1497,1499,1499,1499,1499, 739, 739, 739, 739, +1912,1913,1501,1502,1913, 533,1914,1503, 678, 678,1504, 764, 739, 739,1506,1507, +3017,1916,3017,2307,1509,1510,1509,1511, 756, 757, 758, 759, 759,1512,1513,1919, + 762, 739, 739, 739, 762, 762, 764, 764,2417,2417,2417,2417,1528,1528, 769, 769, + 769,3018,2310,1515,1516,1516,1517,1929,1518,1518,1519,1520, 779,2311,2312,1522, +1935,3019,1523, 786,1525,1525,1525,2315, 786,2307,1527,3020,3020,3020,1528,1528, + 792, 834, 680, 796, 796, 680, 680,1529,1530,1531,1532,1533, 280,1913, 678,3021, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2319,2319,1537, 811, 811, 811,1539,3022,1539,1541,1542,1541,1542, +1537,3023,1537,1541, 295, 295,1541, 295,1542, 295, 295, 295,1537,1539,1537,1537, +1542,1537,1539, 811,2322,1541,1541,1541,1541,1541, 295,1541, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +3024,3024,3024,3025,3026,3027,3028,3029,3030,3031,3032,1906,3033,3034,3035,3036, +2006,2006,2006,2007,2007,2007,2008,2009,3037,3038,1499,3039, 739, 739, 739, 739, +3040,2017,2018,3041,2020, 533,2022,1503,2024,3042,1504,2027, 739, 739,1506,2031, +3043,2033,3044,2035,1509,3045,1509,3046,3047, 45, 45,3048,3049,3050,3051,3052, +2046, 739, 739, 739, 762, 762,2051,2051,2052,2053,2053,2054,2055,1528,3053,3054, +3055,3056,2061,2062,2063,2064,2065,1929,2067,2067,3057,3057,2071,2071,3058,1522, +1935,2075,2075, 786,1525,1525,1525,2315, 786,2307,1527,2083,3020,3020,1528,1528, +3059,3060,3061,3062,3063, 318, 680,3063, 318,3064,3065,1533,3066,3067,3068,3021, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 293,3069,3070,3071,3072,3073,3074,3075,3076,2112,3077,2114,3078, +3079, 547,3080,3081, 295, 295,2117, 295, 295, 295, 295, 295,2119,3082,3083,3084, +3085, 295, 295, 295, 295,3086,3087, 295, 295, 295, 295,2129, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,1398, +2006,2006,2006,2007,2007,2007,2008,2009,3088,2011,2012,2013, 34,2014, 33,2015, +2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031, +2032,2033,2034,2035,2036,2037,2038,2039,2040, 45, 45,2041,2042,2043,2044,2045, +2046, 739,2047,2048,2049,2050,2051,2051,2052,2053,2053,2054,2055,2056,2057,2058, +2059,2060,2061,2062,2063,2064,2065,2066,3089,2068,2069,2070,3090,3091,2072,2073, +2074,2075,2076,2077,2078,2079,2080, 275,2081,2082,1527,2083,2084,2085,2086,2087, +2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099, 122,2100,2101,2102, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2104,2105,2106,2107,2108,2109,2110,2111,2110,2112,2113,2114,2113, +2115, 547,2115,2116,2103,2103,2117,2103,2118,2103,2103,2103,2119,2120,2121,2122, +2123,2124,2125,2126,2127, 160, 161, 162, 163,2128,2103,2129,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103, 295,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, +2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103, + }, + { +2501,2502,2503,2504,2505,2506,2507, 730,2508,2509,2510,2511,2512,2513,2514,2515, +2516,2517,2518,2519,2520,2521,2522,2523, 639,2524,2525,1512,2526,2527,2527,2527, +2528,2529,2530,2531,2532,2532,2533,2534, 212, 213,2536, 295,2527,2537,2482,2483, +3005,2485,2527,2527,2527,2527,2527,2527,3006,2541,3007,2487,3008, 576, 575,1522, +2544,2527,2527,2527, 224,2545,2546,2547,2548,2308,2549,2527, 295,2550, 295, 295, + 295, 295, 295, 295,2551, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2552,2553, 295, 295, 295,2554, + 295, 295, 295, 677,2483, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,2493, + 295,2555, 295,3092,2495,2557,2558,2559,2496,2497,2562,2498,2561,2499,2562,2500, +2563,3011,2565,2527, 295, 295,2566, 295,2567, 295, 295, 295,2570,2571, 295,2572, +3093, 295, 295, 295, 295, 295,3094, 295, 295,3095,3096, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295,3097, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,3101, 181, 182, 183,3102, 185,1556,1557,3103,1559, 188, 189,1560, +1561,1562, 193,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580,3100,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,3104,3105, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127,3107,3122,3126, 316,3123,3121,3124,3107,3125,3107,3127,3107, +3107, 329,3107,3108,3143,3109,3128,3129,3099,3144,1634,3110,3130,3131,3117,3119, +3136,3132,3133,3134,3137,3115,3138,3135,3098, 343, 344,3112,3113,3113,3142,3139, +3140,3141,3116,3106,3111,3114,3118,3120, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,3101, 181, 182, 183,3102, 185,1556,1557,3103,1559, 188, 189,1560, +1561,1562, 193,1564,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571, 211,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580,3100,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,3104,3105, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,2430,2430,3149,3147,3148,3147,3145,3145,3145,3145,3145,3145,3145, +3145,3145,3145,3145,3145,3145,3150,3151,3173, 329,3152, 329,3153,3154,3155,3156, +3157,3158,3159,3160,3161, 349,3162,3163,3164,3165,3166,3148,3148,3148,3167,3168, +3169,3170, 349,3171,3172,3148,3155,3156,3146, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189, +3190,3191,3192,3193,3194,3195,3196,3196,3197,3198,3199,3200,3201,3202,3203,3204, +3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220, +3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3196,3232,3233,3234,3235, +3196,3236,3237,3238,3196,3239,3196,3240,3196,3241,3196,3242,3196,3243,3244,3245, +3246,3247,3248,3196,3249,3250,3196,3251,3252,3253,3254,3255,3196,3196,3256,3196, +3257,3196,3258,3196,3259,3260,3196,3261,3196,3196,3262,3196,3196,3196,3196,3196, +3196,3196,3196,3263,3196,3196,3196,3196,3196,3196,3264,3265,3196,3196,3196,3196, +3266,3267, 285,3268,3269, 287, 288,3270,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3272,3273,3271,3274,3271,3275,3276,3277,3278,3279,3280,3281,3282, +3282,3283,3280,3284,3271,3271,3285,3286,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271, +3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271, + }, + { +3287,3288, 466,3289, 713,3196,3290, 467,3291, 632,3292,3293,3294,3295,3296,3297, +3298, 598,3299,3300,3301,3302,3303,3304,1512,3305,3294,3306, 759, 437, 437,3307, +3308,3309, 439,3310, 440,3311, 442, 441,3312,3313,3314,3315,2306,3316,3317, 582, +3318,3319, 452,3320,3321,3290,3322,3323,3324, 778,3325,2312, 779,3326,3327,3328, +3329, 769,3330,3331,3332,3333, 663, 664,3334,2316,3335,3336,3337,1299,3338,3339, +3340,3341,3342,3343,3344,3345,3346, 442,3347,3348,3349,3304,3350,1669,3351,3352, +3353,3354,3355,3356,3353, 261,3357,3358,1919,2420,3359,3360, 676,3361,3362,3363, +3364,3365,3366,3367, 677,3368, 677,3369,3370, 677,3371, 455,3372,2421,3373, 465, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +3374,3374,3375,3376,3377,3378,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387, +3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403, +3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419, +3420,3421,3422,3423,3424,3425,3426,3427,3425,3428,3429,3430,3431,3432,3433,3434, +3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3335,3447,3448,3449, +3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3462,3463,3464, +3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480, +3481,3482,3481,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,3496, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +1551,1552,1553,1554, 181, 182, 183,1555, 185,1556,3497,3498,3499, 188, 189,1560, +1561,1562,1563,3500,1565, 195, 196, 197, 198, 199, 200, 201, 202,1566,1567, 205, + 206, 207, 208,1568,1569,1570,1571,3501,1572,1573, 214, 215, 216, 217, 218, 219, + 220, 221,1574,1575,1576,1577,1578, 225,1579,1580, 226,1581,1582, 229, 230, 231, + 232, 233, 234, 235,1583, 237, 238, 239,1584,1585, 240,1586, 242, 243, 244,1587, + 246, 247,1588,1589, 249, 250, 251,1590, 252, 253, 254, 255,1591,1592,1593,1594, +1595, 259,1596,1597,1598,1599,1600,1601, 264, 265, 266, 267, 268, 269, 270, 271, +1602, 272, 273,1603,1604,1605, 276,1606,1607,1608,1609,1610,3502,3503, 283, 284, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127,3504,1613,1614,3505,1616,3506,1618,3507,1620,3508,1622,3509, +3510,1625,3511,3512,1628,1629,1630,1631,3513,1633,1634,3514,1636,1637,1638,1639, +1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655, +1656,1657,1658,1659,1660,1661,1662,1663, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530, +3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546, +3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562, +3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578, +3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594, +3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610, +3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626, +3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642, +3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643, +3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643, +3643,3643,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656, +3657,3658,3659,3660,3658,3661,3662,3658,3663,3658,3664,3665,3666,3667,3668,3669, +3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685, +3686,3687, 806, 806, 806, 806, 806,3643,3643,3643,3643,3643,3643,3643,3643,3643, +3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643, +3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643,3643, + }, + { +3287,1492,3688,3289, 713,3689,3690, 730,1914,3691,1533,3293,3692,3693,3694,3695, +3298,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706, 759, 437,3707,3708, +3308,3709,3710,3711,3712,3713, 442,3714,3715,3716,3717,3718,3719,3720,3721,3722, +3723,2306,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737, +3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769, +3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785, +3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3371,3796,3797,2421,3798,3799, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656, +3657,3658,3659,3660,3658,3661,3662,3658,3663,3658,3664,3665,3666,3667,3668,3669, +3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685, +3686,3687, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815, +3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831, +3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847, +3840,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862, +3863,3864,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877, +3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893, +3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, +3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925, +3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926, +3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926, +3926,3926,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, +3940,3941,3942,3660,3943,3944,3662,3945,3663,3946,3947,3665,3948,3949,3950,3951, +3952,3953,3954,3955,3956,3936,3676,3957,3958,3679,3959,3960,3961,3962,3684,3685, +3963,3964,3965,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926, +3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926, +3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926,3926, + }, + { +3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815, +3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3830,3966,3831, +3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3967,3845,3846,3847, +3840,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3968,3862, +3863,3864,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877, +3969,3879,3970,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893, +3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3971,3972,3973,3907,3908,3909, +3910,3911,3912,3913,3974,3915,3916,3975,3918,3919,3920,3921,3922,3923,3924,3925, +3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976, +3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3977,3977,3977,3977,3978, +3977,3977,3977,3927,3928,3979,3930,3931,3932,3980,3934,3935,3936,3937,3938,3939, +3940,3941,3942,3660,3943,3944,3662,3945,3663,3946,3947,3665,3948,3949,3950,3951, +3952,3953,3954,3955,3956,3936,3676,3957,3958,3981,3982,3960,3983,3984,3684,3685, +3963,3964,3965,3977,3977,3977,3977,3977,3977,3976,3985,3985,3985,3985,3985,3985, +3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985, +3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985, + }, + { +1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237, +1238,1239,1240,1241,1242,1243,1244,1245,3986,3987,3988,1249,1250,1376,1377,1253, +1378,1255,1256,3989,1380,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,3990, +1270,3991,3992,3993,3994,1275,1276,1277,1278,1279,1381,1281,1282,1283,1284,1285, +1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301, +1302,1303,1304,1305,3995,1307,1308,1309,1309,1310,1311,1312,1313,1314,1315,1316, +1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332, +1333,1334,1335,1336,1337,3996,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 312,1349,1350,3997,1352,3998,1354,3999,1355, 320,1356, 321,1357, +1358,1359,1360,1361,1362,1363,1364,1383,1366,1359,1384,1361, 332, 333, 334, 335, + 336,1368,1369, 338, 339, 320,1370,1371,1371,1371,1371,1372,1373,1374,1375,1371, + 347, 348, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, + { +4000,4001,4002,4003,4004,4005, 6, 7,4006, 9, 10,4007, 12, 13, 14, 15, +4008,4009,4010,4011, 20,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022, + 32,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036, 46, +4037,4038,4039,4040,4041,4042,4043, 54,4044,4045,4046,4047,4048,4049,4050,4051, +4052,4053,4054, 66,4055,4056, 69,4057,4058,4059,4060, 74, 75, 76, 77, 78, +4061,4062,4063, 82,4064,4065, 85,4066,4067, 88,4068,4069,4070,4071,4072,4073, + 95, 96, 97,4074,4075,4076,4077, 102, 103,4078, 105, 106, 107,4079,4080,4081, +4082, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,4083,4084,4085, 125,4086, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656, +3657,3658,3659,3660,3658,3661,3662,3658,3663,3658,3664,3665,3666,3667,3668,3669, +3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685, +3686,3687, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + }, + { +3287,3288, 466,3289, 713,3196,3290, 467,3291, 632,3292,3293,3294,3295,4087,3297, +3298, 598,4088,3300,3301,3302,3303,3304,4089,4090,4091,4092, 759, 437, 438,3307, +3308,3309, 439,3310, 440,4093, 442,4094,3312,3313,3314,3315,2306,4095,3317, 582, +3318,3319, 452,3320,3321,4096,3322,3323,3324, 778,3325,2312, 779,3326,3327,3328, +3329, 769,3330,3331,3332,3333, 663, 664,3334,2316,3335,3336,3337,1299,3338,3339, +3340,3341,4097,3343,3344,3345,4098, 442,3347,3348,3349,3304,3350,1669,3351,3352, +3353,3354,3355,3356,4099, 261,3357,3358,1919,2420,3359,3360, 676,3361,3362,3363, +3364,4100,3366,3367,4101,4102, 680,3369,3370, 462,3371, 455,3372,2421,3373, 465, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806,3644,3645,4103,3649,3648,4104,4105,4106,4107,4108,4109,4110,4111, +4112,3658,4113,3660,3658,3661,3662,3658,3663,3658,3664,2617,3666,3667,3668,3669, +3670,3671,3672,3673,3674, 160,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685, +3686,3687, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + }, + { + 622, 179, 371, 180, 372, 373, 374, 375, 376, 377, 186, 378, 187, 379, 380, 190, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 381, 28, 370, 30, 31, + 32, 33, 34, 35, 36, 382, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 383, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127,4114,4115,4116, 141,4117,4118,4119,4118,4120,4118,4121,4122, +4123,1954,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137, +4138,4139,4140,4141,4142,4143, 163,4144, 625,4145,4146,4147,4148,4149,4150,4151, +4152,4153,4154,4155,4156,4157,4158, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + }, + { +4159,4160,1553,1554, 181,4161,4162,1555, 185,4163,3497,4164,1559, 188,4165,4166, +4167,1562,4168,4169,1565, 195,4170, 197,4171,4172, 200, 201, 28,1566,1567,4173, +4174,4175,4176,4177,4178,4179,4180,4181,1572,1573, 214, 215, 216, 217, 218, 219, + 220,4182,4183,1575,1576,1577,1578,4184,1579,1580,4185,1581,4186,4187,4188,4189, + 232, 233, 234, 235,4190, 237, 238,4191,1584,1585, 240,1586, 242, 243, 244,1587, + 246,4192,4193,1589, 249, 250, 251,1590, 252,4194, 254, 255,4195,4196,4197,4198, +1595,4199,1596,1597,1598,1599,1600,1601,4200,4201,4202, 267,4203,4204, 270,4205, +4206,4207, 273,1603,4208,1605, 276,4209,4210,4211,4212,1610,4213,4214,4215, 126, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806,4216,1470,1613,4217,1615,4218,1475,4219,1477,4220,1479,4221,1481, +1482,4222,1484,4223,4224,4225,1630,4226,2291,4227,1634,3514,1636,1637,1638,1639, +1640,4228,4229,1643,1644,1645,1646,4230, 342,4231,4232,1651,1652,1653,4233,4234, +1656,4235,1658,1659,1660,1661,1662,1663, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + }, + { +3643, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871,2216, 873, 874, 875, + 876, 877, 878,2217, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894,2218, 896, 897, 898, 899, 900,2219,2220, 903,2221, 905,2222,2223, +2224, 909,2225, 911, 912,2226,2227, 915, 916,2228,2229, 919, 920, 921, 922, 923, +2230, 925, 926, 927, 928, 929,4236, 931, 932, 933, 934, 935,2232,2233, 938,2234, + 940,4237, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966,4238, 968,4239,3643,3643, +4240,4241,4242,4243,4244,4245,4246, 978,4247,4248,4249,4250,4251,4252,4253,4254, +4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, 975, 971, 972, 973, 974, + 975, 310, 976, 977, 978, 974,2239, 980,2240, 982,2241, 984,2242, 985,2243, 987, + 988,2244, 990, 325,2244, 325, 991,2244,2245,2246, 330, 993,2247,2248,2249, 997, + 998,2250,2251,1001,1002,1003, 340,1004,1005,1006,1007,1008,1009, 310,1010,1011, +2252, 429,1003, 430,1013,1014, 974,1015,4266,4266,4266,4266,4266,4266,4266,4266, +4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266, +4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266,4266, + }, + { +3287,4267,3196,3196,4268,3196,3196,3196,3196,3196,3196, 378,3196,3196,3694,3196, +3196,4269,3196,4270,4271,4272,3196,3196,3196, 370,3196,4273,4274,4275,4276,4277, +3196,4278,4279,4280,3310,3310,4281, 442,4282,3196,3196,4283,4284,4283, 676,4285, +4286,3196,3196,4287, 51,3196,3196,3196,4288,3324,4289,3196, 59,4290,4288, 62, +3196,4291,4291,4292, 67,3196, 664,4293,3196,2316,3196,4294, 70,3196,4295, 78, +4296,4297, 81,3196,3196,3196,3196,3196,3196,3196,3196, 90,3196,4298, 93,4299, +3196,3196,3196,3196,3196,3196,3196,4300,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,4101,3196,4301,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,4302,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313, +4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,3196,3196,4326, 154, +4327,4328,4329,3196,3196, 160,3196,3196,3196,4330,4331,4332,4333,4334,4335,3196, +3196,4336, 160,4337,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, +3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196,3196, + }, + { +3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815, +3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831, +3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847, +3840,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862, +3863,3864,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877, +3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893, +3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, +3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,4338,3921,3922,3923,3924,3925, +3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976, +3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3976,3977,3977,3977,3977,3977, +3977,3977,3977,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, +3940,3941,3942,3660,3943,3944,3662,3945,3663,3946,3947,3665,3948,3949,3950,3951, +3952,3953,3954,3955,3956,3936,3676,3957,3958,3679,3959,3960,3961,3962,3684,3685, +3963,3964,3965,3977,3977,3977,3977,3977,3977,3976,3985,3985,3985,3985,3985,3985, +3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985, +3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985,3985, + }, + { +4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354, +4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370, +4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386, +4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402, +4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418, +4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434, +4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450, +4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806,4467,4468,4469,4470,4471, +4472,4473,4474,4475,4476,4477,4217,4478,4218,4479,4480,4481,4482,4483,4221,4484, +4485,4222,4486,4487,4224,4488,4489,4226,4490,4227,4491,4492,4493,4494,4495,4496, +4497,4498,4499,4500,4501, 320,4502,4503,4504,4231,4232,4505,4506,1374,4507,4508, +4509,4510,4511,4512,4513,4514,4515,4516, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + }, + { +4517,4518,4519,4520,4518,4521,4522,4523,4524,4525,4526,4528,4529,4530,4531,4532, +4533,4535,4537,4530,4539,4540,4541,4542,4543,4544,4545, 295, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 33, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 127,4534, 128,4536, 130, 131, 132,4538, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144,4527, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + }, +}; + +const AdlBankSetup adlbanksetup[74] = +{ + {0, 1, 1, 0, 0}, //Bank 0, AIL (Star Control 3, Albion, Empire 2, Sensible Soccer, Settlers 2, many others) + {0, 1, 1, 0, 0}, //Bank 1, Bisqwit (selection of 4op and 2op) + {0, 0, 0, 0, 0}, //Bank 2, HMI (Descent, Asterix) + {0, 0, 0, 0, 0}, //Bank 3, HMI (Descent:: Int) + {0, 0, 0, 0, 0}, //Bank 4, HMI (Descent:: Ham) + {0, 0, 0, 0, 0}, //Bank 5, HMI (Descent:: Rick) + {0, 0, 0, 0, 0}, //Bank 6, HMI (Descent 2) + {0, 0, 0, 0, 0}, //Bank 7, HMI (Normality) + {0, 0, 0, 0, 0}, //Bank 8, HMI (Shattered Steel) + {3, 0, 0, 0, 0}, //Bank 9, HMI (Theme Park) + {0, 0, 0, 0, 0}, //Bank 10, HMI (3d Table Sports, Battle Arena Toshinden) + {0, 0, 0, 0, 0}, //Bank 11, HMI (Aces of the Deep) + {0, 0, 0, 0, 0}, //Bank 12, HMI (Earthsiege) + {0, 0, 0, 0, 0}, //Bank 13, HMI (Anvil of Dawn) + {2, 0, 0, 0, 0}, //Bank 14, DMX (Doom :: partially pseudo 4op) + {2, 0, 0, 0, 0}, //Bank 15, DMX (Hexen, Heretic :: partially pseudo 4op) + {2, 0, 0, 0, 0}, //Bank 16, DMX (MUS Play :: partially pseudo 4op) + {0, 1, 1, 0, 0}, //Bank 17, AIL (Discworld, Grandest Fleet, Pocahontas, Slob Zone 3d, Ultima 4, Zorro) + {0, 1, 1, 0, 0}, //Bank 18, AIL (Warcraft 2) + {0, 1, 1, 0, 0}, //Bank 19, AIL (Syndicate) + {0, 1, 1, 0, 0}, //Bank 20, AIL (Guilty, Orion Conspiracy, Terra Nova Strike Force Centauri :: 4op) + {0, 1, 1, 0, 0}, //Bank 21, AIL (Magic Carpet 2) + {0, 1, 1, 0, 0}, //Bank 22, AIL (Nemesis) + {0, 1, 1, 0, 0}, //Bank 23, AIL (Jagged Alliance) + {0, 1, 1, 0, 0}, //Bank 24, AIL (When Two Worlds War :: 4op, MISSING INSTRUMENTS) + {0, 1, 1, 0, 0}, //Bank 25, AIL (Bards Tale Construction :: MISSING INSTRUMENTS) + {0, 1, 1, 0, 0}, //Bank 26, AIL (Return to Zork) + {0, 1, 1, 0, 0}, //Bank 27, AIL (Theme Hospital) + {0, 1, 1, 0, 0}, //Bank 28, AIL (National Hockey League PA) + {0, 1, 1, 0, 0}, //Bank 29, AIL (Inherit The Earth) + {0, 1, 1, 0, 0}, //Bank 30, AIL (Inherit The Earth, file two) + {0, 1, 1, 0, 0}, //Bank 31, AIL (Little Big Adventure :: 4op) + {0, 1, 1, 0, 0}, //Bank 32, AIL (Wreckin Crew) + {0, 1, 1, 0, 0}, //Bank 33, AIL (Death Gate) + {0, 1, 1, 0, 0}, //Bank 34, AIL (FIFA International Soccer) + {0, 1, 1, 0, 0}, //Bank 35, AIL (Starship Invasion) + {0, 1, 1, 0, 0}, //Bank 36, AIL (Super Street Fighter 2 :: 4op) + {0, 1, 1, 0, 0}, //Bank 37, AIL (Lords of the Realm :: MISSING INSTRUMENTS) + {0, 1, 1, 0, 0}, //Bank 38, AIL (SimFarm, SimHealth :: 4op) + {0, 1, 1, 0, 0}, //Bank 39, AIL (SimFarm, Settlers, Serf City) + {0, 1, 1, 0, 0}, //Bank 40, AIL (Caesar 2 :: partially 4op, MISSING INSTRUMENTS) + {0, 1, 1, 0, 0}, //Bank 41, AIL (Syndicate Wars) + {0, 1, 1, 0, 0}, //Bank 42, AIL (Bubble Bobble Feat. Rainbow Islands, Z) + {0, 1, 1, 0, 0}, //Bank 43, AIL (Warcraft) + {0, 1, 1, 0, 0}, //Bank 44, AIL (Terra Nova Strike Force Centuri :: partially 4op) + {0, 1, 1, 0, 0}, //Bank 45, AIL (System Shock :: partially 4op) + {0, 1, 1, 0, 0}, //Bank 46, AIL (Advanced Civilization) + {0, 1, 1, 0, 0}, //Bank 47, AIL (Battle Chess 4000 :: partially 4op, melodic only) + {0, 1, 1, 0, 0}, //Bank 48, AIL (Ultimate Soccer Manager :: partially 4op) + {0, 1, 1, 0, 0}, //Bank 49, AIL (Air Bucks, Blue And The Gray, America Invades, Terminator 2029) + {0, 1, 1, 0, 0}, //Bank 50, AIL (Ultima Underworld 2) + {0, 1, 1, 0, 0}, //Bank 51, AIL (Kasparov's Gambit) + {0, 1, 1, 0, 0}, //Bank 52, AIL (High Seas Trader :: MISSING INSTRUMENTS) + {0, 0, 0, 0, 0}, //Bank 53, AIL (Master of Magic, Master of Orion 2 :: 4op, std percussion) + {0, 0, 0, 0, 0}, //Bank 54, AIL (Master of Magic, Master of Orion 2 :: 4op, orchestral percussion) + {0, 0, 0, 0, 0}, //Bank 55, SB (Action Soccer) + {0, 0, 0, 0, 0}, //Bank 56, SB (3d Cyberpuck :: melodic only) + {0, 0, 0, 0, 0}, //Bank 57, SB (Simon the Sorcerer :: melodic only) + {4, 1, 1, 0, 0}, //Bank 58, OP3 (The Fat Man 2op set) + {0, 1, 1, 0, 0}, //Bank 59, OP3 (The Fat Man 4op set) + {4, 1, 1, 0, 0}, //Bank 60, OP3 (JungleVision 2op set :: melodic only) + {4, 1, 1, 0, 0}, //Bank 61, OP3 (Wallace 2op set, Nitemare 3D :: melodic only) + {3, 0, 0, 0, 0}, //Bank 62, TMB (Duke Nukem 3D) + {3, 0, 0, 0, 0}, //Bank 63, TMB (Shadow Warrior) + {2, 0, 0, 0, 0}, //Bank 64, DMX (Raptor) + {3, 0, 0, 0, 0}, //Bank 65, OP3 (Modded GMOPL by Wohlstand) + {3, 0, 0, 0, 0}, //Bank 66, SB (Jammey O'Connel's bank) + {3, 0, 0, 0, 0}, //Bank 67, TMB (Default bank of Build Engine) + {0, 1, 1, 0, 0}, //Bank 68, WOPL (4op bank by James Alan Nguyen and Wohlstand) + {3, 0, 0, 0, 0}, //Bank 69, TMB (Blood) + {3, 0, 0, 0, 0}, //Bank 70, TMB (Lee) + {3, 0, 0, 0, 0}, //Bank 71, TMB (Nam) + {1, 0, 0, 0, 0}, //Bank 72, WOPL (DMXOPL3 bank by Sneakernets) + {1, 0, 0, 0, 0} //Bank 73, EA (Cartooners) +}; diff --git a/src/sound/adlmidi/adldata.hh b/src/sound/adlmidi/adldata.hh new file mode 100644 index 000000000..e9ff00b25 --- /dev/null +++ b/src/sound/adlmidi/adldata.hh @@ -0,0 +1,65 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2016 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ADLDATA_H +#define ADLDATA_H + +#include + +extern const struct adldata +{ + uint32_t modulator_E862, carrier_E862; // See below + uint8_t modulator_40, carrier_40; // KSL/attenuation settings + uint8_t feedconn; // Feedback/connection bits for the channel + + int8_t finetune; +} adl[]; + +extern const struct adlinsdata +{ + enum { Flag_Pseudo4op = 0x01, Flag_NoSound = 0x02 }; + + uint16_t adlno1, adlno2; + uint8_t tone; + uint8_t flags; + uint16_t ms_sound_kon; // Number of milliseconds it produces sound; + uint16_t ms_sound_koff; + double voice2_fine_tune; +} adlins[]; +int maxAdlBanks(); +extern const unsigned short banks[][256]; +extern const char* const banknames[]; + +/** + * @brief Bank global setup + */ +extern const struct AdlBankSetup +{ + int volumeModel; + bool deepTremolo; + bool deepVibrato; + bool adLibPercussions; + bool scaleModulators; +} adlbanksetup[]; + +#endif //ADLDATA_H diff --git a/src/sound/adlmidi/adlmidi.cpp b/src/sound/adlmidi/adlmidi.cpp new file mode 100644 index 000000000..5adad234a --- /dev/null +++ b/src/sound/adlmidi/adlmidi.cpp @@ -0,0 +1,869 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "adlmidi_private.hpp" + +#ifdef ADLMIDI_HW_OPL +#define MaxCards 1 +#define MaxCards_STR "1" //Why not just "#MaxCards" ? Watcom fails to pass this with "syntax error" :-P +#else +#define MaxCards 100 +#define MaxCards_STR "100" +#endif + +static ADL_Version adl_version = { + ADLMIDI_VERSION_MAJOR, + ADLMIDI_VERSION_MINOR, + ADLMIDI_VERSION_PATCHLEVEL +}; + +/*---------------------------EXPORTS---------------------------*/ + +ADLMIDI_EXPORT struct ADL_MIDIPlayer *adl_init(long sample_rate) +{ + ADL_MIDIPlayer *midi_device; + midi_device = (ADL_MIDIPlayer *)malloc(sizeof(ADL_MIDIPlayer)); + if(!midi_device) + { + ADLMIDI_ErrorString = "Can't initialize ADLMIDI: out of memory!"; + return NULL; + } + + MIDIplay *player = new MIDIplay(static_cast(sample_rate)); + if(!player) + { + free(midi_device); + ADLMIDI_ErrorString = "Can't initialize ADLMIDI: out of memory!"; + return NULL; + } + midi_device->adl_midiPlayer = player; + adlRefreshNumCards(midi_device); + return midi_device; +} + +ADLMIDI_EXPORT int adl_setNumChips(ADL_MIDIPlayer *device, int numCards) +{ + if(device == NULL) + return -2; + + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.NumCards = static_cast(numCards); + if(play->m_setup.NumCards < 1 || play->m_setup.NumCards > MaxCards) + { + play->setErrorString("number of chips may only be 1.." MaxCards_STR ".\n"); + return -1; + } + + play->opl.NumCards = play->m_setup.NumCards; + adl_reset(device); + + return adlRefreshNumCards(device); +} + +ADLMIDI_EXPORT int adl_getNumChips(struct ADL_MIDIPlayer *device) +{ + if(device == NULL) + return -2; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(play) + return (int)play->m_setup.NumCards; + return -2; +} + +ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank) +{ + #ifdef DISABLE_EMBEDDED_BANKS + ADL_UNUSED(device); + ADL_UNUSED(bank); + ADLMIDI_ErrorString = "This build of libADLMIDI has no embedded banks. Please load bank by using of adl_openBankFile() or adl_openBankData() functions instead of adl_setBank()"; + return -1; + #else + const uint32_t NumBanks = static_cast(maxAdlBanks()); + int32_t bankno = bank; + + if(bankno < 0) + bankno = 0; + + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(static_cast(bankno) >= NumBanks) + { + #if 0 //ndef __WATCOMC__ + std::stringstream s; + s << "bank number may only be 0.." << (NumBanks - 1) << ".\n"; + play->setErrorString(s.str()); + #else + play->setErrorString("Selected embedded bank is not exists!\n"); + #endif + return -1; + } + + play->m_setup.AdlBank = static_cast(bankno); + play->opl.setEmbeddedBank(play->m_setup.AdlBank); + play->applySetup(); + + return adlRefreshNumCards(device); + #endif +} + +ADLMIDI_EXPORT int adl_getBanksCount() +{ + return maxAdlBanks(); +} + +ADLMIDI_EXPORT const char *const *adl_getBankNames() +{ + return banknames; +} + +ADLMIDI_EXPORT int adl_setNumFourOpsChn(ADL_MIDIPlayer *device, int ops4) +{ + if(!device) + return -1; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if((unsigned int)ops4 > 6 * play->m_setup.NumCards) + { + #if 0 //ndef __WATCOMC__ + std::stringstream s; + s << "number of four-op channels may only be 0.." << (6 * (play->m_setup.NumCards)) << " when " << play->m_setup.NumCards << " OPL3 cards are used.\n"; + play->setErrorString(s.str()); + #else + play->setErrorString("number of four-op channels may not be more than 6 channels per each OPL3 chip!\n"); + #endif + + return -1; + } + + play->m_setup.NumFourOps = static_cast(ops4); + play->opl.NumFourOps = play->m_setup.NumFourOps; + + return 0; //adlRefreshNumCards(device); +} + +ADLMIDI_EXPORT int adl_getNumFourOpsChn(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(play) + return (int)play->m_setup.NumFourOps; + return -1; +} + +ADLMIDI_EXPORT void adl_setPercMode(ADL_MIDIPlayer *device, int percmod) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.AdlPercussionMode = percmod; + play->opl.AdlPercussionMode = play->m_setup.AdlPercussionMode; + play->opl.updateFlags(); +} + +ADLMIDI_EXPORT void adl_setHVibrato(ADL_MIDIPlayer *device, int hvibro) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.HighVibratoMode = hvibro; + play->opl.HighVibratoMode = play->m_setup.HighVibratoMode; + play->opl.updateDeepFlags(); +} + +ADLMIDI_EXPORT void adl_setHTremolo(ADL_MIDIPlayer *device, int htremo) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.HighTremoloMode = htremo; + play->opl.HighTremoloMode = play->m_setup.HighTremoloMode; + play->opl.updateDeepFlags(); +} + +ADLMIDI_EXPORT void adl_setScaleModulators(ADL_MIDIPlayer *device, int smod) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.ScaleModulators = smod; + play->opl.ScaleModulators = play->m_setup.ScaleModulators; +} + +ADLMIDI_EXPORT void adl_setLoopEnabled(ADL_MIDIPlayer *device, int loopEn) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.loopingIsEnabled = (loopEn != 0); +} + +ADLMIDI_EXPORT void adl_setLogarithmicVolumes(struct ADL_MIDIPlayer *device, int logvol) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.LogarithmicVolumes = logvol; + play->opl.LogarithmicVolumes = play->m_setup.LogarithmicVolumes; +} + +ADLMIDI_EXPORT void adl_setVolumeRangeModel(struct ADL_MIDIPlayer *device, int volumeModel) +{ + if(!device) return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.VolumeModel = volumeModel; + play->opl.ChangeVolumeRangesModel(static_cast(volumeModel)); +} + +ADLMIDI_EXPORT int adl_openBankFile(struct ADL_MIDIPlayer *device, const char *filePath) +{ + if(device && device->adl_midiPlayer) + { + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.tick_skip_samples_delay = 0; + if(!play->LoadBank(filePath)) + { + std::string err = play->getErrorString(); + if(err.empty()) + play->setErrorString("ADL MIDI: Can't load file"); + return -1; + } + else return adlRefreshNumCards(device); + } + + ADLMIDI_ErrorString = "Can't load file: ADLMIDI is not initialized"; + return -1; +} + +ADLMIDI_EXPORT int adl_openBankData(struct ADL_MIDIPlayer *device, const void *mem, unsigned long size) +{ + if(device && device->adl_midiPlayer) + { + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.tick_skip_samples_delay = 0; + if(!play->LoadBank(mem, static_cast(size))) + { + std::string err = play->getErrorString(); + if(err.empty()) + play->setErrorString("ADL MIDI: Can't load data from memory"); + return -1; + } + else return adlRefreshNumCards(device); + } + + ADLMIDI_ErrorString = "Can't load file: ADL MIDI is not initialized"; + return -1; +} + +ADLMIDI_EXPORT int adl_openFile(ADL_MIDIPlayer *device, const char *filePath) +{ + if(device && device->adl_midiPlayer) + { + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.tick_skip_samples_delay = 0; + if(!play->LoadMIDI(filePath)) + { + std::string err = play->getErrorString(); + if(err.empty()) + play->setErrorString("ADL MIDI: Can't load file"); + return -1; + } + else return 0; + } + + ADLMIDI_ErrorString = "Can't load file: ADL MIDI is not initialized"; + return -1; +} + +ADLMIDI_EXPORT int adl_openData(ADL_MIDIPlayer *device, const void *mem, unsigned long size) +{ + if(device && device->adl_midiPlayer) + { + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.tick_skip_samples_delay = 0; + if(!play->LoadMIDI(mem, static_cast(size))) + { + std::string err = play->getErrorString(); + if(err.empty()) + play->setErrorString("ADL MIDI: Can't load data from memory"); + return -1; + } + else return 0; + } + ADLMIDI_ErrorString = "Can't load file: ADL MIDI is not initialized"; + return -1; +} + + +ADLMIDI_EXPORT const char *adl_emulatorName() +{ + #ifdef ADLMIDI_USE_DOSBOX_OPL + return "DosBox"; + #else + return "Nuked"; + #endif +} + +ADLMIDI_EXPORT const char *adl_linkedLibraryVersion() +{ + return ADLMIDI_VERSION; +} + +ADLMIDI_EXPORT const ADL_Version *adl_linkedVersion() +{ + return &adl_version; +} + +ADLMIDI_EXPORT const char *adl_errorString() +{ + return ADLMIDI_ErrorString.c_str(); +} + +ADLMIDI_EXPORT const char *adl_errorInfo(struct ADL_MIDIPlayer *device) +{ + if(!device) + return adl_errorString(); + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(!play) + return adl_errorString(); + return play->getErrorString().c_str(); +} + +ADLMIDI_EXPORT const char *adl_getMusicTitle(struct ADL_MIDIPlayer *device) +{ + if(!device) + return ""; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(!play) + return ""; + return play->musTitle.c_str(); +} + +ADLMIDI_EXPORT void adl_close(struct ADL_MIDIPlayer *device) +{ + if(device->adl_midiPlayer) + delete reinterpret_cast(device->adl_midiPlayer); + device->adl_midiPlayer = NULL; + free(device); + device = NULL; +} + +ADLMIDI_EXPORT void adl_reset(struct ADL_MIDIPlayer *device) +{ + if(!device) + return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->m_setup.tick_skip_samples_delay = 0; + play->opl.Reset(play->m_setup.PCM_RATE); + play->ch.clear(); + play->ch.resize(play->opl.NumChannels); +} + +ADLMIDI_EXPORT double adl_totalTimeLength(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1.0; + return reinterpret_cast(device->adl_midiPlayer)->timeLength(); +} + +ADLMIDI_EXPORT double adl_loopStartTime(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1.0; + return reinterpret_cast(device->adl_midiPlayer)->getLoopStart(); +} + +ADLMIDI_EXPORT double adl_loopEndTime(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1.0; + return reinterpret_cast(device->adl_midiPlayer)->getLoopEnd(); +} + +ADLMIDI_EXPORT double adl_positionTell(struct ADL_MIDIPlayer *device) +{ + if(!device) + return -1.0; + return reinterpret_cast(device->adl_midiPlayer)->tell(); +} + +ADLMIDI_EXPORT void adl_positionSeek(struct ADL_MIDIPlayer *device, double seconds) +{ + if(!device) + return; + reinterpret_cast(device->adl_midiPlayer)->seek(seconds); +} + +ADLMIDI_EXPORT void adl_positionRewind(struct ADL_MIDIPlayer *device) +{ + if(!device) + return; + reinterpret_cast(device->adl_midiPlayer)->rewind(); +} + +ADLMIDI_EXPORT void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo) +{ + if(!device || (tempo <= 0.0)) + return; + reinterpret_cast(device->adl_midiPlayer)->setTempo(tempo); +} + + +ADLMIDI_EXPORT const char *adl_metaMusicTitle(struct ADL_MIDIPlayer *device) +{ + if(!device) + return ""; + return reinterpret_cast(device->adl_midiPlayer)->musTitle.c_str(); +} + + +ADLMIDI_EXPORT const char *adl_metaMusicCopyright(struct ADL_MIDIPlayer *device) +{ + if(!device) + return ""; + return reinterpret_cast(device->adl_midiPlayer)->musCopyright.c_str(); +} + +ADLMIDI_EXPORT size_t adl_metaTrackTitleCount(struct ADL_MIDIPlayer *device) +{ + if(!device) + return 0; + return reinterpret_cast(device->adl_midiPlayer)->musTrackTitles.size(); +} + +ADLMIDI_EXPORT const char *adl_metaTrackTitle(struct ADL_MIDIPlayer *device, size_t index) +{ + if(!device) + return 0; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(index >= play->musTrackTitles.size()) + return "INVALID"; + return play->musTrackTitles[index].c_str(); +} + + +ADLMIDI_EXPORT size_t adl_metaMarkerCount(struct ADL_MIDIPlayer *device) +{ + if(!device) + return 0; + return reinterpret_cast(device->adl_midiPlayer)->musMarkers.size(); +} + +ADLMIDI_EXPORT Adl_MarkerEntry adl_metaMarker(struct ADL_MIDIPlayer *device, size_t index) +{ + struct Adl_MarkerEntry marker; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + if(!device || !play || (index >= play->musMarkers.size())) + { + marker.label = "INVALID"; + marker.pos_time = 0.0; + marker.pos_ticks = 0; + return marker; + } + else + { + MIDIplay::MIDI_MarkerEntry &mk = play->musMarkers[index]; + marker.label = mk.label.c_str(); + marker.pos_time = mk.pos_time; + marker.pos_ticks = (unsigned long)mk.pos_ticks; + } + return marker; +} + +ADLMIDI_EXPORT void adl_setRawEventHook(struct ADL_MIDIPlayer *device, ADL_RawEventHook rawEventHook, void *userData) +{ + if(!device) + return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->hooks.onEvent = rawEventHook; + play->hooks.onEvent_userData = userData; +} + +/* Set note hook */ +ADLMIDI_EXPORT void adl_setNoteHook(struct ADL_MIDIPlayer *device, ADL_NoteHook noteHook, void *userData) +{ + if(!device) + return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->hooks.onNote = noteHook; + play->hooks.onNote_userData = userData; +} + +/* Set debug message hook */ +ADLMIDI_EXPORT void adl_setDebugMessageHook(struct ADL_MIDIPlayer *device, ADL_DebugMessageHook debugMessageHook, void *userData) +{ + if(!device) + return; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + play->hooks.onDebugMessage = debugMessageHook; + play->hooks.onDebugMessage_userData = userData; +} + + + +inline static void SendStereoAudio(int &samples_requested, + ssize_t &in_size, + short *_in, + ssize_t out_pos, + short *_out) +{ + if(!in_size) + return; + size_t offset = static_cast(out_pos); + size_t inSamples = static_cast(in_size * 2); + size_t maxSamples = static_cast(samples_requested) - offset; + size_t toCopy = std::min(maxSamples, inSamples); + std::memcpy(_out + out_pos, _in, toCopy * sizeof(short)); +} + + +ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out) +{ + #ifdef ADLMIDI_HW_OPL + (void)device; + (void)sampleCount; + (void)out; + return 0; + #else + sampleCount -= sampleCount % 2; //Avoid even sample requests + if(sampleCount < 0) + return 0; + if(!device) + return 0; + + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + MIDIplay::Setup &setup = player->m_setup; + + ssize_t gotten_len = 0; + ssize_t n_periodCountStereo = 512; + //ssize_t n_periodCountPhys = n_periodCountStereo * 2; + int left = sampleCount; + bool hasSkipped = setup.tick_skip_samples_delay > 0; + + while(left > 0) + { + {//... + const double eat_delay = setup.delay < setup.maxdelay ? setup.delay : setup.maxdelay; + if(hasSkipped) + { + size_t samples = setup.tick_skip_samples_delay > sampleCount ? sampleCount : setup.tick_skip_samples_delay; + n_periodCountStereo = samples / 2; + } + else + { + setup.delay -= eat_delay; + setup.carry += setup.PCM_RATE * eat_delay; + n_periodCountStereo = static_cast(setup.carry); + setup.carry -= n_periodCountStereo; + } + + //if(setup.SkipForward > 0) + // setup.SkipForward -= 1; + //else + { + if((player->atEnd) && (setup.delay <= 0.0)) + break;//Stop to fetch samples at reaching the song end with disabled loop + + ssize_t leftSamples = left / 2; + if(n_periodCountStereo > leftSamples) + { + setup.tick_skip_samples_delay = (n_periodCountStereo - leftSamples) * 2; + n_periodCountStereo = leftSamples; + } + //! Count of stereo samples + ssize_t in_generatedStereo = (n_periodCountStereo > 512) ? 512 : n_periodCountStereo; + //! Total count of samples + ssize_t in_generatedPhys = in_generatedStereo * 2; + //! Unsigned total sample count + //fill buffer with zeros + int16_t *out_buf = player->outBuf; + std::memset(out_buf, 0, static_cast(in_generatedPhys) * sizeof(int16_t)); + unsigned int chips = player->opl.NumCards; + if(chips == 1) + { + #ifdef ADLMIDI_USE_DOSBOX_OPL + player->opl.cards[0].GenerateArr(out_buf, &in_generatedStereo); + in_generatedPhys = in_generatedStereo * 2; + #else + OPL3_GenerateStream(&player->opl.cards[0], out_buf, static_cast(in_generatedStereo)); + #endif + } + else if(n_periodCountStereo > 0) + { + /* Generate data from every chip and mix result */ + for(unsigned card = 0; card < chips; ++card) + { + #ifdef ADLMIDI_USE_DOSBOX_OPL + player->opl.cards[card].GenerateArrMix(out_buf, &in_generatedStereo); + in_generatedPhys = in_generatedStereo * 2; + #else + OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf, static_cast(in_generatedStereo)); + #endif + } + } + /* Process it */ + SendStereoAudio(sampleCount, in_generatedStereo, out_buf, gotten_len, out); + + left -= (int)in_generatedPhys; + gotten_len += (in_generatedPhys) /* - setup.stored_samples*/; + } + + if(hasSkipped) + { + setup.tick_skip_samples_delay -= n_periodCountStereo * 2; + hasSkipped = setup.tick_skip_samples_delay > 0; + } + else + setup.delay = player->Tick(eat_delay, setup.mindelay); + + }//... + } + + return static_cast(gotten_len); + #endif +} + + +ADLMIDI_EXPORT int adl_generate(struct ADL_MIDIPlayer *device, int sampleCount, short *out) +{ + #ifdef ADLMIDI_HW_OPL + (void)device; + (void)sampleCount; + (void)out; + return 0; + #else + sampleCount -= sampleCount % 2; //Avoid even sample requests + if(sampleCount < 0) + return 0; + if(!device) + return 0; + + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + MIDIplay::Setup &setup = player->m_setup; + + ssize_t gotten_len = 0; + ssize_t n_periodCountStereo = 512; + + int left = sampleCount; + double delay = double(sampleCount) / double(setup.PCM_RATE); + + while(left > 0) + { + {//... + const double eat_delay = delay < setup.maxdelay ? delay : setup.maxdelay; + delay -= eat_delay; + setup.carry += setup.PCM_RATE * eat_delay; + n_periodCountStereo = static_cast(setup.carry); + setup.carry -= n_periodCountStereo; + + { + ssize_t leftSamples = left / 2; + if(n_periodCountStereo > leftSamples) + n_periodCountStereo = leftSamples; + //! Count of stereo samples + ssize_t in_generatedStereo = (n_periodCountStereo > 512) ? 512 : n_periodCountStereo; + //! Total count of samples + ssize_t in_generatedPhys = in_generatedStereo * 2; + //! Unsigned total sample count + //fill buffer with zeros + int16_t *out_buf = player->outBuf; + std::memset(out_buf, 0, static_cast(in_generatedPhys) * sizeof(int16_t)); + unsigned int chips = player->opl.NumCards; + if(chips == 1) + { + #ifdef ADLMIDI_USE_DOSBOX_OPL + player->opl.cards[0].GenerateArr(out_buf, &in_generatedStereo); + in_generatedPhys = in_generatedStereo * 2; + #else + OPL3_GenerateStream(&player->opl.cards[0], out_buf, static_cast(in_generatedStereo)); + #endif + } + else if(n_periodCountStereo > 0) + { + /* Generate data from every chip and mix result */ + for(unsigned card = 0; card < chips; ++card) + { + #ifdef ADLMIDI_USE_DOSBOX_OPL + player->opl.cards[card].GenerateArrMix(out_buf, &in_generatedStereo); + in_generatedPhys = in_generatedStereo * 2; + #else + OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf, static_cast(in_generatedStereo)); + #endif + } + } + /* Process it */ + SendStereoAudio(sampleCount, in_generatedStereo, out_buf, gotten_len, out); + + left -= (int)in_generatedPhys; + gotten_len += (in_generatedPhys) /* - setup.stored_samples*/; + } + + player->TickIteratos(eat_delay); + }//... + } + + return static_cast(gotten_len); + #endif +} + +ADLMIDI_EXPORT double adl_tickEvents(struct ADL_MIDIPlayer *device, double seconds, double granuality) +{ + if(!device) + return -1.0; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return -1.0; + return player->Tick(seconds, granuality); +} + +ADLMIDI_EXPORT int adl_atEnd(struct ADL_MIDIPlayer *device) +{ + if(!device) + return 1; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return 1; + return (int)player->atEnd; +} + +ADLMIDI_EXPORT void adl_panic(struct ADL_MIDIPlayer *device) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_panic(); +} + +ADLMIDI_EXPORT void adl_rt_resetState(struct ADL_MIDIPlayer *device) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_ResetState(); +} + +ADLMIDI_EXPORT int adl_rt_noteOn(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note, ADL_UInt8 velocity) +{ + if(!device) + return 0; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return 0; + return (int)player->realTime_NoteOn(channel, note, velocity); +} + +ADLMIDI_EXPORT void adl_rt_noteOff(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_NoteOff(channel, note); +} + +ADLMIDI_EXPORT void adl_rt_noteAfterTouch(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note, ADL_UInt8 atVal) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_NoteAfterTouch(channel, note, atVal); +} + +ADLMIDI_EXPORT void adl_rt_channelAfterTouch(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 atVal) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_ChannelAfterTouch(channel, atVal); +} + +ADLMIDI_EXPORT void adl_rt_controllerChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 type, ADL_UInt8 value) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_Controller(channel, type, value); +} + +ADLMIDI_EXPORT void adl_rt_patchChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 patch) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_PatchChange(channel, patch); +} + +ADLMIDI_EXPORT void adl_rt_pitchBend(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt16 pitch) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_PitchBend(channel, pitch); +} + +ADLMIDI_EXPORT void adl_rt_pitchBendML(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 msb, ADL_UInt8 lsb) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_PitchBend(channel, msb, lsb); +} + +ADLMIDI_EXPORT void adl_rt_bankChangeLSB(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 lsb) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_BankChangeLSB(channel, lsb); +} + +ADLMIDI_EXPORT void adl_rt_bankChangeMSB(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 msb) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_BankChangeMSB(channel, msb); +} + +ADLMIDI_EXPORT void adl_rt_bankChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_SInt16 bank) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast(device->adl_midiPlayer); + if(!player) + return; + player->realTime_BankChange(channel, (uint16_t)bank); +} diff --git a/src/sound/adlmidi/adlmidi.h b/src/sound/adlmidi/adlmidi.h new file mode 100644 index 000000000..a1ac0f8ac --- /dev/null +++ b/src/sound/adlmidi/adlmidi.h @@ -0,0 +1,293 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ADLMIDI_H +#define ADLMIDI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define ADLMIDI_VERSION_MAJOR 1 +#define ADLMIDI_VERSION_MINOR 3 +#define ADLMIDI_VERSION_PATCHLEVEL 1 + +#define ADLMIDI_TOSTR(s) #s +#define ADLMIDI_VERSION \ + ADLMIDI_TOSTR(OPNMIDI_VERSION_MAJOR) "." \ + ADLMIDI_TOSTR(OPNMIDI_VERSION_MINOR) "." \ + ADLMIDI_TOSTR(OPNMIDI_VERSION_PATCHLEVEL) + + +#include + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +typedef uint8_t ADL_UInt8; +typedef uint16_t ADL_UInt16; +typedef int8_t ADL_SInt8; +typedef int16_t ADL_SInt16; +#else +typedef unsigned char ADL_UInt8; +typedef unsigned short ADL_UInt16; +typedef char ADL_SInt8; +typedef short ADL_SInt16; +#endif + +enum ADLMIDI_VolumeModels +{ + ADLMIDI_VolumeModel_AUTO = 0, + ADLMIDI_VolumeModel_Generic, + ADLMIDI_VolumeModel_CMF, + ADLMIDI_VolumeModel_DMX, + ADLMIDI_VolumeModel_APOGEE, + ADLMIDI_VolumeModel_9X +}; + +struct ADL_MIDIPlayer +{ + void *adl_midiPlayer; +}; + +/* DEPRECATED */ +#define adl_setNumCards adl_setNumChips + +/* Sets number of emulated chips (from 1 to 100). Emulation of multiple chips exchanges polyphony limits*/ +extern int adl_setNumChips(struct ADL_MIDIPlayer *device, int numCards); + +/* Get current number of emulated chips */ +extern int adl_getNumChips(struct ADL_MIDIPlayer *device); + +/* Sets a number of the patches bank from 0 to N banks. Is recommended to call adl_reset() to apply changes to already-loaded file player or real-time. */ +extern int adl_setBank(struct ADL_MIDIPlayer *device, int bank); + +/* Returns total number of available banks */ +extern int adl_getBanksCount(); + +/* Returns pointer to array of names of every bank */ +extern const char *const *adl_getBankNames(); + +/*Sets number of 4-operator channels between all chips. + By default, it is automatically re-calculating every bank change. + If you want to specify custom number of four operator channels, + please call this function after bank change (adl_setBank() or adl_openBank()), + otherwise, value will be overwritten by auto-calculated.*/ +extern int adl_setNumFourOpsChn(struct ADL_MIDIPlayer *device, int ops4); + +/*Get current total count of 4-operator channels between all chips*/ +extern int adl_getNumFourOpsChn(struct ADL_MIDIPlayer *device); + +/*Override Enable(1) or Disable(0) AdLib percussion mode. -1 - use bank default AdLib percussion mode*/ +extern void adl_setPercMode(struct ADL_MIDIPlayer *device, int percmod); + +/*Override Enable(1) or Disable(0) deep vibrato state. -1 - use bank default vibrato state*/ +extern void adl_setHVibrato(struct ADL_MIDIPlayer *device, int hvibro); + +/*Override Enable(1) or Disable(0) deep tremolo state. -1 - use bank default tremolo state*/ +extern void adl_setHTremolo(struct ADL_MIDIPlayer *device, int htremo); + +/*Override Enable(1) or Disable(0) scaling of modulator volumes. -1 - use bank default scaling of modulator volumes*/ +extern void adl_setScaleModulators(struct ADL_MIDIPlayer *device, int smod); + +/*Enable or disable built-in loop (built-in loop supports 'loopStart' and 'loopEnd' tags to loop specific part)*/ +extern void adl_setLoopEnabled(struct ADL_MIDIPlayer *device, int loopEn); + +/*Enable or disable Logariphmic volume changer */ +extern void adl_setLogarithmicVolumes(struct ADL_MIDIPlayer *device, int logvol); + +/*Set different volume range model */ +extern void adl_setVolumeRangeModel(struct ADL_MIDIPlayer *device, int volumeModel); + +/*Load WOPL bank file from File System. Is recommended to call adl_reset() to apply changes to already-loaded file player or real-time.*/ +extern int adl_openBankFile(struct ADL_MIDIPlayer *device, const char *filePath); + +/*Load WOPL bank file from memory data*/ +extern int adl_openBankData(struct ADL_MIDIPlayer *device, const void *mem, unsigned long size); + + +/*Returns name of currently used OPL3 emulator*/ +extern const char *adl_emulatorName(); + +typedef struct { + ADL_UInt16 major; + ADL_UInt16 minor; + ADL_UInt16 patch; +} ADL_Version; + +/*Returns string which contains a version number*/ +extern const char *adl_linkedLibraryVersion(); + +/*Returns structure which contains a version number of library */ +extern const ADL_Version *adl_linkedVersion(); + +/*Returns string which contains last error message of initialization*/ +extern const char *adl_errorString(); + +/*Returns string which contains last error message on specific device*/ +extern const char *adl_errorInfo(struct ADL_MIDIPlayer *device); + +/*Initialize ADLMIDI Player device*/ +extern struct ADL_MIDIPlayer *adl_init(long sample_rate); + +/*Load MIDI file from File System*/ +extern int adl_openFile(struct ADL_MIDIPlayer *device, const char *filePath); + +/*Load MIDI file from memory data*/ +extern int adl_openData(struct ADL_MIDIPlayer *device, const void *mem, unsigned long size); + +/*Resets MIDI player*/ +extern void adl_reset(struct ADL_MIDIPlayer *device); + +/*Get total time length of current song*/ +extern double adl_totalTimeLength(struct ADL_MIDIPlayer *device); + +/*Get loop start time if presented. -1 means MIDI file has no loop points */ +extern double adl_loopStartTime(struct ADL_MIDIPlayer *device); + +/*Get loop end time if presented. -1 means MIDI file has no loop points */ +extern double adl_loopEndTime(struct ADL_MIDIPlayer *device); + +/*Get current time position in seconds*/ +extern double adl_positionTell(struct ADL_MIDIPlayer *device); + +/*Jump to absolute time position in seconds*/ +extern void adl_positionSeek(struct ADL_MIDIPlayer *device, double seconds); + +/*Reset MIDI track position to begin */ +extern void adl_positionRewind(struct ADL_MIDIPlayer *device); + +/*Set tempo multiplier: 1.0 - original tempo, >1 - play faster, <1 - play slower */ +extern void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo); + +/*Close and delete ADLMIDI device*/ +extern void adl_close(struct ADL_MIDIPlayer *device); + + + +/**META**/ + +/*Returns string which contains a music title*/ +extern const char *adl_metaMusicTitle(struct ADL_MIDIPlayer *device); + +/*Returns string which contains a copyright string*/ +extern const char *adl_metaMusicCopyright(struct ADL_MIDIPlayer *device); + +/*Returns count of available track titles: NOTE: there are CAN'T be associated with channel in any of event or note hooks */ +extern size_t adl_metaTrackTitleCount(struct ADL_MIDIPlayer *device); + +/*Get track title by index*/ +extern const char *adl_metaTrackTitle(struct ADL_MIDIPlayer *device, size_t index); + +struct Adl_MarkerEntry +{ + const char *label; + double pos_time; + unsigned long pos_ticks; +}; + +/*Returns count of available markers*/ +extern size_t adl_metaMarkerCount(struct ADL_MIDIPlayer *device); + +/*Returns the marker entry*/ +extern struct Adl_MarkerEntry adl_metaMarker(struct ADL_MIDIPlayer *device, size_t index); + + +/*Take a sample buffer and iterate MIDI timers */ +extern int adl_play(struct ADL_MIDIPlayer *device, int sampleCount, short out[]); + +/*Generate audio output from chip emulators without iteration of MIDI timers.*/ +extern int adl_generate(struct ADL_MIDIPlayer *device, int sampleCount, short *out); + +/** + * @brief Periodic tick handler. + * @param device + * @param seconds seconds since last call + * @param granularity don't expect intervals smaller than this, in seconds + * @return desired number of seconds until next call + * + * Use it for Hardware OPL3 mode or when you want to process events differently from adl_play() function. + * DON'T USE IT TOGETHER WITH adl_play()!!! + */ +extern double adl_tickEvents(struct ADL_MIDIPlayer *device, double seconds, double granuality); + +/*Returns 1 if music position has reached end*/ +extern int adl_atEnd(struct ADL_MIDIPlayer *device); + +/**RealTime**/ + +/*Force Off all notes on all channels*/ +extern void adl_panic(struct ADL_MIDIPlayer *device); + +/*Reset states of all controllers on all MIDI channels*/ +extern void adl_rt_resetState(struct ADL_MIDIPlayer *device); + +/*Turn specific MIDI note ON*/ +extern int adl_rt_noteOn(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note, ADL_UInt8 velocity); + +/*Turn specific MIDI note OFF*/ +extern void adl_rt_noteOff(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note); + +/*Set note after-touch*/ +extern void adl_rt_noteAfterTouch(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 note, ADL_UInt8 atVal); +/*Set channel after-touch*/ +extern void adl_rt_channelAfterTouch(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 atVal); + +/*Apply controller change*/ +extern void adl_rt_controllerChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 type, ADL_UInt8 value); + +/*Apply patch change*/ +extern void adl_rt_patchChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 patch); + +/*Apply pitch bend change*/ +extern void adl_rt_pitchBend(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt16 pitch); +/*Apply pitch bend change*/ +extern void adl_rt_pitchBendML(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 msb, ADL_UInt8 lsb); + +/*Change LSB of the bank*/ +extern void adl_rt_bankChangeLSB(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 lsb); +/*Change MSB of the bank*/ +extern void adl_rt_bankChangeMSB(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_UInt8 msb); +/*Change bank by absolute signed value*/ +extern void adl_rt_bankChange(struct ADL_MIDIPlayer *device, ADL_UInt8 channel, ADL_SInt16 bank); + + +/**Hooks**/ + +typedef void (*ADL_RawEventHook)(void *userdata, ADL_UInt8 type, ADL_UInt8 subtype, ADL_UInt8 channel, const ADL_UInt8 *data, size_t len); +typedef void (*ADL_NoteHook)(void *userdata, int adlchn, int note, int ins, int pressure, double bend); +typedef void (*ADL_DebugMessageHook)(void *userdata, const char *fmt, ...); + +/* Set raw MIDI event hook */ +extern void adl_setRawEventHook(struct ADL_MIDIPlayer *device, ADL_RawEventHook rawEventHook, void *userData); + +/* Set note hook */ +extern void adl_setNoteHook(struct ADL_MIDIPlayer *device, ADL_NoteHook noteHook, void *userData); + +/* Set debug message hook */ +extern void adl_setDebugMessageHook(struct ADL_MIDIPlayer *device, ADL_DebugMessageHook debugMessageHook, void *userData); + +#ifdef __cplusplus +} +#endif + +#endif /* ADLMIDI_H */ diff --git a/src/sound/adlmidi/adlmidi.hpp b/src/sound/adlmidi/adlmidi.hpp new file mode 100644 index 000000000..63f2abd48 --- /dev/null +++ b/src/sound/adlmidi/adlmidi.hpp @@ -0,0 +1,57 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ADLMIDI_HPP +#define ADLMIDI_HPP + +#include "adlmidi.h" + +#include +#include + +class OPL3; +class MIDIplay; + +class AdlInstrumentTester +{ + uint32_t cur_gm; + uint32_t ins_idx; + std::vector adl_ins_list; + OPL3 *opl; + MIDIplay * play; + +public: + AdlInstrumentTester(ADL_MIDIPlayer *device); + virtual ~AdlInstrumentTester(); + + // Find list of adlib instruments that supposedly implement this GM + void FindAdlList(); + void Touch(unsigned c, unsigned volume); + void DoNote(int note); + void NextGM(int offset); + void NextAdl(int offset); + bool HandleInputChar(char ch); +}; + +#endif //ADLMIDI_HPP + diff --git a/src/sound/adlmidi/adlmidi_load.cpp b/src/sound/adlmidi/adlmidi_load.cpp new file mode 100644 index 000000000..3057a7e35 --- /dev/null +++ b/src/sound/adlmidi/adlmidi_load.cpp @@ -0,0 +1,693 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "adlmidi_private.hpp" + +#include "adlmidi_mus2mid.h" +#include "adlmidi_xmi2mid.h" + +uint64_t MIDIplay::ReadBEint(const void *buffer, size_t nbytes) +{ + uint64_t result = 0; + const unsigned char *data = reinterpret_cast(buffer); + + for(unsigned n = 0; n < nbytes; ++n) + result = (result << 8) + data[n]; + + return result; +} + +uint64_t MIDIplay::ReadLEint(const void *buffer, size_t nbytes) +{ + uint64_t result = 0; + const unsigned char *data = reinterpret_cast(buffer); + + for(unsigned n = 0; n < nbytes; ++n) + result = result + static_cast(data[n] << (n * 8)); + + return result; +} + +bool MIDIplay::LoadBank(const std::string &filename) +{ + fileReader file; + file.openFile(filename.c_str()); + return LoadBank(file); +} + +bool MIDIplay::LoadBank(const void *data, size_t size) +{ + fileReader file; + file.openData(data, size); + return LoadBank(file); +} + + + +/* WOPL-needed misc functions */ +static uint16_t toUint16LE(const uint8_t *arr) +{ + uint16_t num = arr[0]; + num |= ((arr[1] << 8) & 0xFF00); + return num; +} + +static uint16_t toUint16BE(const uint8_t *arr) +{ + uint16_t num = arr[1]; + num |= ((arr[0] << 8) & 0xFF00); + return num; +} + +static int16_t toSint16BE(const uint8_t *arr) +{ + int16_t num = *reinterpret_cast(&arr[0]); + num *= 1 << 8; + num |= arr[1]; + return num; +} + +static const char *wopl3_magic = "WOPL3-BANK\0"; +static const uint16_t wopl_latest_version = 3; + +#define WOPL_INST_SIZE_V2 62 +#define WOPL_INST_SIZE_V3 66 + +enum WOPL_InstrumentFlags +{ + WOPL_Flags_NONE = 0, + WOPL_Flag_Enable4OP = 0x01, + WOPL_Flag_Pseudo4OP = 0x02 +}; + +struct WOPL_Inst +{ + bool fourOps; + char padding[7]; + struct adlinsdata adlins; + struct adldata op[2]; + uint16_t ms_sound_kon; + uint16_t ms_sound_koff; +}; + +static bool readInstrument(MIDIplay::fileReader &file, WOPL_Inst &ins, uint16_t &version, bool isPercussion = false) +{ + uint8_t idata[WOPL_INST_SIZE_V3]; + if(version >= 3) + { + if(file.read(idata, 1, WOPL_INST_SIZE_V3) != WOPL_INST_SIZE_V3) + return false; + } + else + { + if(file.read(idata, 1, WOPL_INST_SIZE_V2) != WOPL_INST_SIZE_V2) + return false; + } + + //strncpy(ins.name, char_p(idata), 32); + ins.op[0].finetune = (int8_t)toSint16BE(idata + 32); + ins.op[1].finetune = (int8_t)toSint16BE(idata + 34); + //ins.velocity_offset = int8_t(idata[36]); + + ins.adlins.voice2_fine_tune = 0.0; + int8_t voice2_fine_tune = int8_t(idata[37]); + if(voice2_fine_tune != 0) + { + if(voice2_fine_tune == 1) + ins.adlins.voice2_fine_tune = 0.000025; + else if(voice2_fine_tune == -1) + ins.adlins.voice2_fine_tune = -0.000025; + else + ins.adlins.voice2_fine_tune = ((voice2_fine_tune * 15.625) / 1000.0); + } + + ins.adlins.tone = isPercussion ? idata[38] : 0; + + uint8_t flags = idata[39]; + ins.adlins.flags = (flags & WOPL_Flag_Enable4OP) && (flags & WOPL_Flag_Pseudo4OP) ? adlinsdata::Flag_Pseudo4op : 0; + ins.fourOps = (flags & WOPL_Flag_Enable4OP) || (flags & WOPL_Flag_Pseudo4OP); + + ins.op[0].feedconn = (idata[40]); + ins.op[1].feedconn = (idata[41]); + + for(size_t op = 0, slt = 0; op < 4; op++, slt++) + { + size_t off = 42 + size_t(op) * 5; + // ins.setAVEKM(op, idata[off + 0]);//AVEKM + // ins.setAtDec(op, idata[off + 2]);//AtDec + // ins.setSusRel(op, idata[off + 3]);//SusRel + // ins.setWaveForm(op, idata[off + 4]);//WaveForm + // ins.setKSLL(op, idata[off + 1]);//KSLL + ins.op[slt].carrier_E862 = + ((static_cast(idata[off + 4]) << 24) & 0xFF000000) //WaveForm + | ((static_cast(idata[off + 3]) << 16) & 0x00FF0000) //SusRel + | ((static_cast(idata[off + 2]) << 8) & 0x0000FF00) //AtDec + | ((static_cast(idata[off + 0]) << 0) & 0x000000FF); //AVEKM + ins.op[slt].carrier_40 = idata[off + 1];//KSLL + + op++; + off = 42 + size_t(op) * 5; + ins.op[slt].modulator_E862 = + ((static_cast(idata[off + 4]) << 24) & 0xFF000000) //WaveForm + | ((static_cast(idata[off + 3]) << 16) & 0x00FF0000) //SusRel + | ((static_cast(idata[off + 2]) << 8) & 0x0000FF00) //AtDec + | ((static_cast(idata[off + 0]) << 0) & 0x000000FF); //AVEKM + ins.op[slt].modulator_40 = idata[off + 1];//KSLL + } + + if(version >= 3) + { + ins.ms_sound_kon = toUint16BE(idata + 62); + ins.ms_sound_koff = toUint16BE(idata + 64); + } + else + { + ins.ms_sound_kon = 1000; + ins.ms_sound_koff = 500; + } + + return true; +} + +bool MIDIplay::LoadBank(MIDIplay::fileReader &fr) +{ + size_t fsize; + ADL_UNUSED(fsize); + if(!fr.isValid()) + { + errorStringOut = "Custom bank: Invalid data stream!"; + return false; + } + + char magic[32]; + std::memset(magic, 0, 32); + + uint16_t version = 0; + + uint16_t count_melodic_banks = 1; + uint16_t count_percusive_banks = 1; + + if(fr.read(magic, 1, 11) != 11) + { + errorStringOut = "Custom bank: Can't read magic number!"; + return false; + } + + if(std::strncmp(magic, wopl3_magic, 11) != 0) + { + errorStringOut = "Custom bank: Invalid magic number!"; + return false; + } + + uint8_t version_raw[2]; + if(fr.read(version_raw, 1, 2) != 2) + { + errorStringOut = "Custom bank: Can't read version!"; + return false; + } + + version = toUint16LE(version_raw); + if(version > wopl_latest_version) + { + errorStringOut = "Custom bank: Unsupported WOPL version!"; + return false; + } + + uint8_t head[6]; + std::memset(head, 0, 6); + if(fr.read(head, 1, 6) != 6) + { + errorStringOut = "Custom bank: Can't read header!"; + return false; + } + + count_melodic_banks = toUint16BE(head); + count_percusive_banks = toUint16BE(head + 2); + + if((count_melodic_banks < 1) || (count_percusive_banks < 1)) + { + errorStringOut = "Custom bank: Too few banks in this file!"; + return false; + } + + /*UNUSED YET*/ + bool default_deep_vibrato = ((head[4]>>0) & 0x01); + bool default_deep_tremolo = ((head[4]>>1) & 0x01); + + //5'th byte reserved for Deep-Tremolo and Deep-Vibrato flags + m_setup.HighTremoloMode = default_deep_tremolo; + m_setup.HighVibratoMode = default_deep_vibrato; + //6'th byte reserved for ADLMIDI's default volume model + m_setup.VolumeModel = (int)head[5]; + + opl.dynamic_melodic_banks.clear(); + opl.dynamic_percussion_banks.clear(); + + opl.setEmbeddedBank(m_setup.AdlBank); + + if(version >= 2)//Read bank meta-entries + { + for(uint16_t i = 0; i < count_melodic_banks; i++) + { + uint8_t bank_meta[34]; + if(fr.read(bank_meta, 1, 34) != 34) + { + errorStringOut = "Custom bank: Fail to read melodic bank meta-data!"; + return false; + } + uint16_t bank = uint16_t(bank_meta[33]) * 256 + uint16_t(bank_meta[32]); + size_t offset = opl.dynamic_melodic_banks.size(); + opl.dynamic_melodic_banks[bank] = offset; + //strncpy(bankMeta.name, char_p(bank_meta), 32); + } + + for(uint16_t i = 0; i < count_percusive_banks; i++) + { + uint8_t bank_meta[34]; + if(fr.read(bank_meta, 1, 34) != 34) + { + errorStringOut = "Custom bank: Fail to read percussion bank meta-data!"; + return false; + } + uint16_t bank = uint16_t(bank_meta[33]) * 256 + uint16_t(bank_meta[32]); + size_t offset = opl.dynamic_percussion_banks.size(); + opl.dynamic_percussion_banks[bank] = offset; + //strncpy(bankMeta.name, char_p(bank_meta), 32); + } + } + + uint16_t total = 128 * count_melodic_banks; + bool readPercussion = false; + +tryAgain: + for(uint16_t i = 0; i < total; i++) + { + WOPL_Inst ins; + std::memset(&ins, 0, sizeof(WOPL_Inst)); + if(!readInstrument(fr, ins, version, readPercussion)) + { + opl.setEmbeddedBank(m_setup.AdlBank); + errorStringOut = "Custom bank: Fail to read instrument!"; + return false; + } + ins.adlins.ms_sound_kon = ins.ms_sound_kon; + ins.adlins.ms_sound_koff = ins.ms_sound_koff; + ins.adlins.adlno1 = static_cast(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag); + opl.dynamic_instruments.push_back(ins.op[0]); + ins.adlins.adlno2 = ins.adlins.adlno1; + if(ins.fourOps) + { + ins.adlins.adlno2 = static_cast(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag); + opl.dynamic_instruments.push_back(ins.op[1]); + } + opl.dynamic_metainstruments.push_back(ins.adlins); + } + + if(!readPercussion) + { + total = 128 * count_percusive_banks; + readPercussion = true; + goto tryAgain; + } + + opl.AdlBank = ~0u; // Use dynamic banks! + //Percussion offset is count of instruments multipled to count of melodic banks + opl.dynamic_percussion_offset = 128 * count_melodic_banks; + + applySetup(); + + return true; +} + +bool MIDIplay::LoadMIDI(const std::string &filename) +{ + fileReader file; + file.openFile(filename.c_str()); + if(!LoadMIDI(file)) + return false; + return true; +} + +bool MIDIplay::LoadMIDI(const void *data, size_t size) +{ + fileReader file; + file.openData(data, size); + return LoadMIDI(file); +} + +bool MIDIplay::LoadMIDI(MIDIplay::fileReader &fr) +{ + size_t fsize; + ADL_UNUSED(fsize); + //! Temp buffer for conversion + AdlMIDI_CPtr cvt_buf; + errorString.clear(); + + #ifdef DISABLE_EMBEDDED_BANKS + if((opl.AdlBank != ~0u) || (opl.dynamic_metainstruments.size() < 256)) + { + errorStringOut = "Bank is not set! Please load any instruments bank by using of adl_openBankFile() or adl_openBankData() functions!"; + return false; + } + #endif + + if(!fr.isValid()) + { + errorStringOut = "Invalid data stream!\n"; + #ifndef _WIN32 + errorStringOut += std::strerror(errno); + #endif + return false; + } + + /**** Set all properties BEFORE starting of actial file reading! ****/ + applySetup(); + + atEnd = false; + loopStart = true; + invalidLoop = false; + + bool is_GMF = false; // GMD/MUS files (ScummVM) + //bool is_MUS = false; // MUS/DMX files (Doom) + bool is_IMF = false; // IMF + bool is_CMF = false; // Creative Music format (CMF/CTMF) + bool is_RSXX = false; // RSXX, such as Cartooners + + const size_t HeaderSize = 4 + 4 + 2 + 2 + 2; // 14 + char HeaderBuf[HeaderSize] = ""; + size_t DeltaTicks = 192, TrackCount = 1; + +riffskip: + fsize = fr.read(HeaderBuf, 1, HeaderSize); + + if(std::memcmp(HeaderBuf, "RIFF", 4) == 0) + { + fr.seek(6l, SEEK_CUR); + goto riffskip; + } + + if(std::memcmp(HeaderBuf, "GMF\x1", 4) == 0) + { + // GMD/MUS files (ScummVM) + fr.seek(7 - static_cast(HeaderSize), SEEK_CUR); + is_GMF = true; + } + else if(std::memcmp(HeaderBuf, "CTMF", 4) == 0) + { + opl.dynamic_instruments.clear(); + opl.dynamic_metainstruments.clear(); + // Creative Music Format (CMF). + // When playing CTMF files, use the following commandline: + // adlmidi song8.ctmf -p -v 1 1 0 + // i.e. enable percussion mode, deeper vibrato, and use only 1 card. + is_CMF = true; + //unsigned version = ReadLEint(HeaderBuf+4, 2); + uint64_t ins_start = ReadLEint(HeaderBuf + 6, 2); + uint64_t mus_start = ReadLEint(HeaderBuf + 8, 2); + //unsigned deltas = ReadLEint(HeaderBuf+10, 2); + uint64_t ticks = ReadLEint(HeaderBuf + 12, 2); + // Read title, author, remarks start offsets in file + fr.read(HeaderBuf, 1, 6); + //unsigned long notes_starts[3] = {ReadLEint(HeaderBuf+0,2),ReadLEint(HeaderBuf+0,4),ReadLEint(HeaderBuf+0,6)}; + fr.seek(16, SEEK_CUR); // Skip the channels-in-use table + fr.read(HeaderBuf, 1, 4); + uint64_t ins_count = ReadLEint(HeaderBuf + 0, 2); //, basictempo = ReadLEint(HeaderBuf+2, 2); + fr.seek(static_cast(ins_start), SEEK_SET); + + //std::printf("%u instruments\n", ins_count); + for(unsigned i = 0; i < ins_count; ++i) + { + unsigned char InsData[16]; + fr.read(InsData, 1, 16); + /*std::printf("Ins %3u: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + i, InsData[0],InsData[1],InsData[2],InsData[3], InsData[4],InsData[5],InsData[6],InsData[7], + InsData[8],InsData[9],InsData[10],InsData[11], InsData[12],InsData[13],InsData[14],InsData[15]);*/ + struct adldata adl; + struct adlinsdata adlins; + adl.modulator_E862 = + ((static_cast(InsData[8] & 0x07) << 24) & 0xFF000000) //WaveForm + | ((static_cast(InsData[6]) << 16) & 0x00FF0000) //Sustain/Release + | ((static_cast(InsData[4]) << 8) & 0x0000FF00) //Attack/Decay + | ((static_cast(InsData[0]) << 0) & 0x000000FF); //MultKEVA + adl.carrier_E862 = + ((static_cast(InsData[9] & 0x07) << 24) & 0xFF000000) //WaveForm + | ((static_cast(InsData[7]) << 16) & 0x00FF0000) //Sustain/Release + | ((static_cast(InsData[5]) << 8) & 0x0000FF00) //Attack/Decay + | ((static_cast(InsData[1]) << 0) & 0x000000FF); //MultKEVA + adl.modulator_40 = InsData[2]; + adl.carrier_40 = InsData[3]; + adl.feedconn = InsData[10] & 0x0F; + adl.finetune = 0; + adlins.adlno1 = static_cast(opl.dynamic_instruments.size() | opl.DynamicInstrumentTag); + adlins.adlno2 = adlins.adlno1; + adlins.ms_sound_kon = 1000; + adlins.ms_sound_koff = 500; + adlins.tone = 0; + adlins.flags = 0; + adlins.voice2_fine_tune = 0.0; + opl.dynamic_metainstruments.push_back(adlins); + opl.dynamic_instruments.push_back(adl); + } + + fr.seeku(mus_start, SEEK_SET); + TrackCount = 1; + DeltaTicks = (size_t)ticks; + opl.AdlBank = ~0u; // Ignore AdlBank number, use dynamic banks instead + //std::printf("CMF deltas %u ticks %u, basictempo = %u\n", deltas, ticks, basictempo); + opl.LogarithmicVolumes = true; + opl.AdlPercussionMode = true; + opl.m_musicMode = OPL3::MODE_CMF; + opl.m_volumeScale = OPL3::VOLUME_CMF; + } + else + { + // Try to identify RSXX format + if(HeaderBuf[0] == 0x7D) + { + fr.seek(0x6D, SEEK_SET); + fr.read(HeaderBuf, 6, 1); + if(std::memcmp(HeaderBuf, "rsxx}u", 6) == 0) + { + is_RSXX = true; + fr.seek(0x7D, SEEK_SET); + TrackCount = 1; + DeltaTicks = 60; + opl.LogarithmicVolumes = true; + //opl.CartoonersVolumes = true; + opl.m_musicMode = OPL3::MODE_RSXX; + opl.m_volumeScale = OPL3::VOLUME_CMF; + } + } + + // Try parsing as an IMF file + if(!is_RSXX) + { + do + { + uint8_t raw[4]; + size_t end = static_cast(HeaderBuf[0]) + 256 * static_cast(HeaderBuf[1]); + + if(!end || (end & 3)) + break; + + size_t backup_pos = fr.tell(); + int64_t sum1 = 0, sum2 = 0; + fr.seek(2, SEEK_SET); + + for(unsigned n = 0; n < 42; ++n) + { + if(fr.read(raw, 1, 4) != 4) + break; + int64_t value1 = raw[0]; + value1 += raw[1] << 8; + sum1 += value1; + int64_t value2 = raw[2]; + value2 += raw[3] << 8; + sum2 += value2; + } + + fr.seek(static_cast(backup_pos), SEEK_SET); + + if(sum1 > sum2) + { + is_IMF = true; + DeltaTicks = 1; + } + } while(false); + } + + if(!is_IMF && !is_RSXX) + { + if(std::memcmp(HeaderBuf, "MThd\0\0\0\6", 8) != 0) + { + fr.close(); + errorStringOut = fr._fileName + ": Invalid format, Header signature is unknown!\n"; + return false; + } + + /*size_t Fmt = ReadBEint(HeaderBuf + 8, 2);*/ + TrackCount = (size_t)ReadBEint(HeaderBuf + 10, 2); + DeltaTicks = (size_t)ReadBEint(HeaderBuf + 12, 2); + } + } + + TrackData.clear(); + TrackData.resize(TrackCount, std::vector()); + //CurrentPosition.track.clear(); + //CurrentPosition.track.resize(TrackCount); + InvDeltaTicks = fraction(1, 1000000l * static_cast(DeltaTicks)); + //Tempo = 1000000l * InvDeltaTicks; + Tempo = fraction(1, static_cast(DeltaTicks)); + static const unsigned char EndTag[4] = {0xFF, 0x2F, 0x00, 0x00}; + size_t totalGotten = 0; + + for(size_t tk = 0; tk < TrackCount; ++tk) + { + // Read track header + size_t TrackLength; + + if(is_IMF) + { + //std::fprintf(stderr, "Reading IMF file...\n"); + size_t end = static_cast(HeaderBuf[0]) + 256 * static_cast(HeaderBuf[1]); + unsigned IMF_tempo = 1428; + static const unsigned char imf_tempo[] = {0x0,//Zero delay! + MidiEvent::T_SPECIAL, MidiEvent::ST_TEMPOCHANGE, 0x4, + static_cast(IMF_tempo >> 24), + static_cast(IMF_tempo >> 16), + static_cast(IMF_tempo >> 8), + static_cast(IMF_tempo) + }; + TrackData[tk].insert(TrackData[tk].end(), imf_tempo, imf_tempo + sizeof(imf_tempo)); + TrackData[tk].push_back(0x00); + fr.seek(2, SEEK_SET); + + while(fr.tell() < end && !fr.eof()) + { + uint8_t special_event_buf[5]; + uint8_t raw[4]; + special_event_buf[0] = MidiEvent::T_SPECIAL; + special_event_buf[1] = MidiEvent::ST_RAWOPL; + special_event_buf[2] = 0x02; + if(fr.read(raw, 1, 4) != 4) + break; + special_event_buf[3] = raw[0]; // port index + special_event_buf[4] = raw[1]; // port value + uint32_t delay = static_cast(raw[2]); + delay += 256 * static_cast(raw[3]); + totalGotten += 4; + //if(special_event_buf[3] <= 8) continue; + //fprintf(stderr, "Put %02X <- %02X, plus %04X delay\n", special_event_buf[3],special_event_buf[4], delay); + TrackData[tk].insert(TrackData[tk].end(), special_event_buf, special_event_buf + 5); + //if(delay>>21) TrackData[tk].push_back( 0x80 | ((delay>>21) & 0x7F ) ); + if(delay >> 14) + TrackData[tk].push_back(0x80 | ((delay >> 14) & 0x7F)); + if(delay >> 7) + TrackData[tk].push_back(0x80 | ((delay >> 7) & 0x7F)); + TrackData[tk].push_back(((delay >> 0) & 0x7F)); + } + + TrackData[tk].insert(TrackData[tk].end(), EndTag + 0, EndTag + 4); + //CurrentPosition.track[tk].delay = 0; + //CurrentPosition.began = true; + //std::fprintf(stderr, "Done reading IMF file\n"); + opl.NumFourOps = 0; //Don't use 4-operator channels for IMF playing! + opl.m_musicMode = OPL3::MODE_IMF; + } + else + { + // Take the rest of the file + if(is_GMF || is_CMF || is_RSXX) + { + size_t pos = fr.tell(); + fr.seek(0, SEEK_END); + TrackLength = fr.tell() - pos; + fr.seek(static_cast(pos), SEEK_SET); + } + //else if(is_MUS) // Read TrackLength from file position 4 + //{ + // size_t pos = fr.tell(); + // fr.seek(4, SEEK_SET); + // TrackLength = static_cast(fr.getc()); + // TrackLength += static_cast(fr.getc() << 8); + // fr.seek(static_cast(pos), SEEK_SET); + //} + else + { + fsize = fr.read(HeaderBuf, 1, 8); + if(std::memcmp(HeaderBuf, "MTrk", 4) != 0) + { + fr.close(); + errorStringOut = fr._fileName + ": Invalid format, MTrk signature is not found!\n"; + return false; + } + TrackLength = (size_t)ReadBEint(HeaderBuf + 4, 4); + } + + // Read track data + TrackData[tk].resize(TrackLength); + fsize = fr.read(&TrackData[tk][0], 1, TrackLength); + totalGotten += fsize; + + if(is_GMF/*|| is_MUS*/) // Note: CMF does include the track end tag. + TrackData[tk].insert(TrackData[tk].end(), EndTag + 0, EndTag + 4); + if(is_RSXX)//Finalize raw track data with a zero + TrackData[tk].push_back(0); + + //bool ok = false; + //// Read next event time + //uint64_t tkDelay = ReadVarLenEx(tk, ok); + //if(ok) + // CurrentPosition.track[tk].delay = tkDelay; + //else + //{ + // std::stringstream msg; + // msg << fr._fileName << ": invalid variable length in the track " << tk << "! (error code " << tkDelay << ")"; + // ADLMIDI_ErrorString = msg.str(); + // return false; + //} + } + } + + for(size_t tk = 0; tk < TrackCount; ++tk) + totalGotten += TrackData[tk].size(); + + if(totalGotten == 0) + { + errorStringOut = fr._fileName + ": Empty track data"; + return false; + } + + //Build new MIDI events table (ALPHA!!!) + if(!buildTrackData()) + { + errorStringOut = fr._fileName + ": MIDI data parsing error has occouped!\n" + errorString; + return false; + } + + opl.Reset(m_setup.PCM_RATE); // Reset AdLib + //opl.Reset(); // ...twice (just in case someone misprogrammed OPL3 previously) + ch.clear(); + ch.resize(opl.NumChannels); + return true; +} diff --git a/src/sound/adlmidi/adlmidi_midiplay.cpp b/src/sound/adlmidi/adlmidi_midiplay.cpp new file mode 100644 index 000000000..432785f85 --- /dev/null +++ b/src/sound/adlmidi/adlmidi_midiplay.cpp @@ -0,0 +1,2672 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "adlmidi_private.hpp" + +// Mapping from MIDI volume level to OPL level value. + +static const uint32_t DMX_volume_mapping_table[] = +{ + 0, 1, 3, 5, 6, 8, 10, 11, + 13, 14, 16, 17, 19, 20, 22, 23, + 25, 26, 27, 29, 30, 32, 33, 34, + 36, 37, 39, 41, 43, 45, 47, 49, + 50, 52, 54, 55, 57, 59, 60, 61, + 63, 64, 66, 67, 68, 69, 71, 72, + 73, 74, 75, 76, 77, 79, 80, 81, + 82, 83, 84, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 92, 93, 94, 95, + 96, 96, 97, 98, 99, 99, 100, 101, + 101, 102, 103, 103, 104, 105, 105, 106, + 107, 107, 108, 109, 109, 110, 110, 111, + 112, 112, 113, 113, 114, 114, 115, 115, + 116, 117, 117, 118, 118, 119, 119, 120, + 120, 121, 121, 122, 122, 123, 123, 123, + 124, 124, 125, 125, 126, 126, 127, 127, + //Protection entries to avoid crash if value more than 127 + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, +}; + +static const uint8_t W9X_volume_mapping_table[32] = +{ + 63, 63, 40, 36, 32, 28, 23, 21, + 19, 17, 15, 14, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 5, 4, 4, + 3, 3, 2, 2, 1, 1, 0, 0 +}; + + +//static const char MIDIsymbols[256+1] = +//"PPPPPPhcckmvmxbd" // Ins 0-15 +//"oooooahoGGGGGGGG" // Ins 16-31 +//"BBBBBBBBVVVVVHHM" // Ins 32-47 +//"SSSSOOOcTTTTTTTT" // Ins 48-63 +//"XXXXTTTFFFFFFFFF" // Ins 64-79 +//"LLLLLLLLpppppppp" // Ins 80-95 +//"XXXXXXXXGGGGGTSS" // Ins 96-111 +//"bbbbMMMcGXXXXXXX" // Ins 112-127 +//"????????????????" // Prc 0-15 +//"????????????????" // Prc 16-31 +//"???DDshMhhhCCCbM" // Prc 32-47 +//"CBDMMDDDMMDDDDDD" // Prc 48-63 +//"DDDDDDDDDDDDDDDD" // Prc 64-79 +//"DD??????????????" // Prc 80-95 +//"????????????????" // Prc 96-111 +//"????????????????"; // Prc 112-127 + +static const uint8_t PercussionMap[256] = + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"//GM + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 3 = bass drum + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 4 = snare + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 5 = tom + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 6 = cymbal + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // 7 = hihat + "\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\0"//GP0 + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"//GP16 + //2 3 4 5 6 7 8 940 1 2 3 4 5 6 7 + "\0\0\0\3\3\0\0\7\0\5\7\5\0\5\7\5"//GP32 + //8 950 1 2 3 4 5 6 7 8 960 1 2 3 + "\5\6\5\0\6\0\5\6\0\6\0\6\5\5\5\5"//GP48 + //4 5 6 7 8 970 1 2 3 4 5 6 7 8 9 + "\5\0\0\0\0\0\7\0\0\0\0\0\0\0\0\0"//GP64 + "\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"; + +inline bool isXgPercChannel(uint8_t msb, uint8_t lsb) +{ + return (msb == 0x7E || msb == 0x7F) && (lsb == 0); +} + +void MIDIplay::AdlChannel::AddAge(int64_t ms) +{ + if(users.empty()) + koff_time_until_neglible = + std::max(int64_t(koff_time_until_neglible - ms), static_cast(-0x1FFFFFFFl)); + else + { + koff_time_until_neglible = 0; + + for(users_t::iterator i = users.begin(); i != users.end(); ++i) + { + i->second.kon_time_until_neglible = + std::max(i->second.kon_time_until_neglible - ms, static_cast(-0x1FFFFFFFl)); + i->second.vibdelay += ms; + } + } +} + +MIDIplay::MidiEvent::MidiEvent() : + type(T_UNKNOWN), + subtype(T_UNKNOWN), + channel(0), + isValid(1), + absPosition(0) +{} + + +MIDIplay::MidiTrackRow::MidiTrackRow() : + time(0.0), + delay(0), + absPos(0), + timeDelay(0.0) +{} + +void MIDIplay::MidiTrackRow::reset() +{ + time = 0.0; + delay = 0; + absPos = 0; + timeDelay = 0.0; + events.clear(); +} + +void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) +{ + typedef std::vector EvtArr; + EvtArr metas; + EvtArr noteOffs; + EvtArr controllers; + EvtArr anyOther; + + metas.reserve(events.size()); + noteOffs.reserve(events.size()); + controllers.reserve(events.size()); + anyOther.reserve(events.size()); + + for(size_t i = 0; i < events.size(); i++) + { + if(events[i].type == MidiEvent::T_NOTEOFF) + noteOffs.push_back(events[i]); + else if((events[i].type == MidiEvent::T_CTRLCHANGE) + || (events[i].type == MidiEvent::T_PATCHCHANGE) + || (events[i].type == MidiEvent::T_WHEEL) + || (events[i].type == MidiEvent::T_CHANAFTTOUCH)) + { + controllers.push_back(events[i]); + } + else if((events[i].type == MidiEvent::T_SPECIAL) && (events[i].subtype == MidiEvent::ST_MARKER)) + metas.push_back(events[i]); + else + anyOther.push_back(events[i]); + } + + /* + * If Note-Off and it's Note-On is on the same row - move this damned note off down! + */ + if(noteStates) + { + std::set markAsOn; + for(size_t i = 0; i < anyOther.size(); i++) + { + const MidiEvent e = anyOther[i]; + if(e.type == MidiEvent::T_NOTEON) + { + const size_t note_i = (e.channel * 255) + (e.data[0] & 0x7F); + //Check, was previously note is on or off + bool wasOn = noteStates[note_i]; + markAsOn.insert(note_i); + // Detect zero-length notes are following previously pressed note + int noteOffsOnSameNote = 0; + for(EvtArr::iterator j = noteOffs.begin(); j != noteOffs.end();) + { + //If note was off, and note-off on same row with note-on - move it down! + if( + ((*j).channel == e.channel) && + ((*j).data[0] == e.data[0]) + ) + { + //If note is already off OR more than one note-off on same row and same note + if(!wasOn || (noteOffsOnSameNote != 0)) + { + anyOther.push_back(*j); + j = noteOffs.erase(j); + markAsOn.erase(note_i); + continue; + } else { + //When same row has many note-offs on same row + //that means a zero-length note follows previous note + //it must be shuted down + noteOffsOnSameNote++; + } + } + j++; + } + } + } + + //Mark other notes as released + for(EvtArr::iterator j = noteOffs.begin(); j != noteOffs.end(); j++) + { + size_t note_i = (j->channel * 255) + (j->data[0] & 0x7F); + noteStates[note_i] = false; + } + + for(std::set::iterator j = markAsOn.begin(); j != markAsOn.end(); j++) + noteStates[*j] = true; + } + /***********************************************************************************/ + + events.clear(); + events.insert(events.end(), noteOffs.begin(), noteOffs.end()); + events.insert(events.end(), metas.begin(), metas.end()); + events.insert(events.end(), controllers.begin(), controllers.end()); + events.insert(events.end(), anyOther.begin(), anyOther.end()); +} + +bool MIDIplay::buildTrackData() +{ + fullSongTimeLength = 0.0; + loopStartTime = -1.0; + loopEndTime = -1.0; + musTitle.clear(); + musCopyright.clear(); + musTrackTitles.clear(); + musMarkers.clear(); + caugh_missing_instruments.clear(); + caugh_missing_banks_melodic.clear(); + caugh_missing_banks_percussion.clear(); + trackDataNew.clear(); + const size_t trackCount = TrackData.size(); + trackDataNew.resize(trackCount, MidiTrackQueue()); + + invalidLoop = false; + bool gotLoopStart = false, gotLoopEnd = false, gotLoopEventInThisRow = false; + //! Tick position of loop start tag + uint64_t loopStartTicks = 0; + //! Tick position of loop end tag + uint64_t loopEndTicks = 0; + //! Full length of song in ticks + uint64_t ticksSongLength = 0; + //! Cache for error message strign + char error[150]; + + CurrentPositionNew.track.clear(); + CurrentPositionNew.track.resize(trackCount); + + //! Caches note on/off states. + bool noteStates[16 * 255]; + /* This is required to carefully detect zero-length notes * + * and avoid a move of "note-off" event over "note-on" while sort. * + * Otherwise, after sort those notes will play infinite sound */ + + //Tempo change events + std::vector tempos; + + /* + * TODO: Make this be safer for memory in case of broken input data + * which may cause going away of available track data (and then give a crash!) + * + * POST: Check this more carefully for possible vulnuabilities are can crash this + */ + for(size_t tk = 0; tk < trackCount; ++tk) + { + uint64_t abs_position = 0; + int status = 0; + MidiEvent event; + bool ok = false; + uint8_t *end = TrackData[tk].data() + TrackData[tk].size(); + uint8_t *trackPtr = TrackData[tk].data(); + std::memset(noteStates, 0, sizeof(noteStates)); + + //Time delay that follows the first event in the track + { + MidiTrackRow evtPos; + if(opl.m_musicMode == OPL3::MODE_RSXX) + ok = true; + else + evtPos.delay = ReadVarLenEx(&trackPtr, end, ok); + if(!ok) + { + int len = std::sprintf(error, "buildTrackData: Can't read variable-length value at begin of track %d.\n", (int)tk); + if((len > 0) && (len < 150)) + errorString += std::string(error, (size_t)len); + return false; + } + + //HACK: Begin every track with "Reset all controllers" event to avoid controllers state break came from end of song + for(uint8_t chan = 0; chan < 16; chan++) + { + MidiEvent event; + event.type = MidiEvent::T_CTRLCHANGE; + event.channel = chan; + event.data.push_back(121); + event.data.push_back(0); + evtPos.events.push_back(event); + } + + evtPos.absPos = abs_position; + abs_position += evtPos.delay; + trackDataNew[tk].push_back(evtPos); + } + + MidiTrackRow evtPos; + do + { + event = parseEvent(&trackPtr, end, status); + if(!event.isValid) + { + int len = std::sprintf(error, "buildTrackData: Fail to parse event in the track %d.\n", (int)tk); + if((len > 0) && (len < 150)) + errorString += std::string(error, (size_t)len); + return false; + } + + evtPos.events.push_back(event); + if(event.type == MidiEvent::T_SPECIAL) + { + if(event.subtype == MidiEvent::ST_TEMPOCHANGE) + { + event.absPosition = abs_position; + tempos.push_back(event); + } + else if(!invalidLoop && (event.subtype == MidiEvent::ST_LOOPSTART)) + { + /* + * loopStart is invalid when: + * - starts together with loopEnd + * - appears more than one time in same MIDI file + */ + if(gotLoopStart || gotLoopEventInThisRow) + invalidLoop = true; + else + { + gotLoopStart = true; + loopStartTicks = abs_position; + } + //In this row we got loop event, register this! + gotLoopEventInThisRow = true; + } + else if(!invalidLoop && (event.subtype == MidiEvent::ST_LOOPEND)) + { + /* + * loopEnd is invalid when: + * - starts before loopStart + * - starts together with loopStart + * - appars more than one time in same MIDI file + */ + if(gotLoopEnd || gotLoopEventInThisRow) + invalidLoop = true; + else + { + gotLoopEnd = true; + loopEndTicks = abs_position; + } + //In this row we got loop event, register this! + gotLoopEventInThisRow = true; + } + } + + if(event.subtype != MidiEvent::ST_ENDTRACK)//Don't try to read delta after EndOfTrack event! + { + evtPos.delay = ReadVarLenEx(&trackPtr, end, ok); + if(!ok) + { + /* End of track has been reached! However, there is no EOT event presented */ + event.type = MidiEvent::T_SPECIAL; + event.subtype = MidiEvent::ST_ENDTRACK; + } + } + + if((evtPos.delay > 0) || (event.subtype == MidiEvent::ST_ENDTRACK)) + { + evtPos.absPos = abs_position; + abs_position += evtPos.delay; + evtPos.sortEvents(noteStates); + trackDataNew[tk].push_back(evtPos); + evtPos.reset(); + gotLoopEventInThisRow = false; + } + } + while((trackPtr <= end) && (event.subtype != MidiEvent::ST_ENDTRACK)); + + if(ticksSongLength < abs_position) + ticksSongLength = abs_position; + //Set the chain of events begin + if(trackDataNew[tk].size() > 0) + CurrentPositionNew.track[tk].pos = trackDataNew[tk].begin(); + } + + if(gotLoopStart && !gotLoopEnd) + { + gotLoopEnd = true; + loopEndTicks = ticksSongLength; + } + + //loopStart must be located before loopEnd! + if(loopStartTicks >= loopEndTicks) + invalidLoop = true; + + /********************************************************************************/ + //Calculate time basing on collected tempo events + /********************************************************************************/ + for(size_t tk = 0; tk < trackCount; ++tk) + { + fraction currentTempo = Tempo; + double time = 0.0; + uint64_t abs_position = 0; + size_t tempo_change_index = 0; + MidiTrackQueue &track = trackDataNew[tk]; + if(track.empty()) + continue;//Empty track is useless! + + #ifdef DEBUG_TIME_CALCULATION + std::fprintf(stdout, "\n============Track %" PRIuPTR "=============\n", tk); + std::fflush(stdout); + #endif + + MidiTrackRow *posPrev = &(*(track.begin()));//First element + for(MidiTrackQueue::iterator it = track.begin(); it != track.end(); it++) + { + #ifdef DEBUG_TIME_CALCULATION + bool tempoChanged = false; + #endif + MidiTrackRow &pos = *it; + if((posPrev != &pos) && //Skip first event + (!tempos.empty()) && //Only when in-track tempo events are available + (tempo_change_index < tempos.size()) + ) + { + // If tempo event is going between of current and previous event + if(tempos[tempo_change_index].absPosition <= pos.absPos) + { + //Stop points: begin point and tempo change points are before end point + std::vector points; + fraction t; + TempoChangePoint firstPoint = {posPrev->absPos, currentTempo}; + points.push_back(firstPoint); + + //Collect tempo change points between previous and current events + do + { + TempoChangePoint tempoMarker; + MidiEvent &tempoPoint = tempos[tempo_change_index]; + tempoMarker.absPos = tempoPoint.absPosition; + tempoMarker.tempo = InvDeltaTicks * fraction(ReadBEint(tempoPoint.data.data(), tempoPoint.data.size())); + points.push_back(tempoMarker); + tempo_change_index++; + } + while((tempo_change_index < tempos.size()) && + (tempos[tempo_change_index].absPosition <= pos.absPos)); + + // Re-calculate time delay of previous event + time -= posPrev->timeDelay; + posPrev->timeDelay = 0.0; + + for(size_t i = 0, j = 1; j < points.size(); i++, j++) + { + /* If one or more tempo events are appears between of two events, + * calculate delays between each tempo point, begin and end */ + uint64_t midDelay = 0; + //Delay between points + midDelay = points[j].absPos - points[i].absPos; + //Time delay between points + t = midDelay * currentTempo; + posPrev->timeDelay += t.value(); + + //Apply next tempo + currentTempo = points[j].tempo; + #ifdef DEBUG_TIME_CALCULATION + tempoChanged = true; + #endif + } + //Then calculate time between last tempo change point and end point + TempoChangePoint tailTempo = points.back(); + uint64_t postDelay = pos.absPos - tailTempo.absPos; + t = postDelay * currentTempo; + posPrev->timeDelay += t.value(); + + //Store Common time delay + posPrev->time = time; + time += posPrev->timeDelay; + } + } + + fraction t = pos.delay * currentTempo; + pos.timeDelay = t.value(); + pos.time = time; + time += pos.timeDelay; + + //Capture markers after time value calculation + for(size_t i = 0; i < pos.events.size(); i++) + { + MidiEvent &e = pos.events[i]; + if((e.type == MidiEvent::T_SPECIAL) && (e.subtype == MidiEvent::ST_MARKER)) + { + MIDI_MarkerEntry marker; + marker.label = std::string((char *)e.data.data(), e.data.size()); + marker.pos_ticks = pos.absPos; + marker.pos_time = pos.time; + musMarkers.push_back(marker); + } + } + + //Capture loop points time positions + if(!invalidLoop) + { + // Set loop points times + if(loopStartTicks == pos.absPos) + loopStartTime = pos.time; + else if(loopEndTicks == pos.absPos) + loopEndTime = pos.time; + } + + #ifdef DEBUG_TIME_CALCULATION + std::fprintf(stdout, "= %10" PRId64 " = %10f%s\n", pos.absPos, pos.time, tempoChanged ? " <----TEMPO CHANGED" : ""); + std::fflush(stdout); + #endif + + abs_position += pos.delay; + posPrev = &pos; + } + + if(time > fullSongTimeLength) + fullSongTimeLength = time; + } + + fullSongTimeLength += postSongWaitDelay; + //Set begin of the music + trackBeginPositionNew = CurrentPositionNew; + //Initial loop position will begin at begin of track until passing of the loop point + LoopBeginPositionNew = CurrentPositionNew; + + /********************************************************************************/ + //Resolve "hell of all times" of too short drum notes: + //move too short percussion note-offs far far away as possible + /********************************************************************************/ + #if 1 //Use this to record WAVEs for comparison before/after implementing of this + if(opl.m_musicMode == OPL3::MODE_MIDI)//Percussion fix is needed for MIDI only, not for IMF/RSXX or CMF + { + //! Minimal real time in seconds +#define DRUM_NOTE_MIN_TIME 0.03 + //! Minimal ticks count +#define DRUM_NOTE_MIN_TICKS 15 + struct NoteState + { + double delay; + uint64_t delayTicks; + bool isOn; + char ___pad[7]; + } drNotes[255]; + uint16_t banks[16]; + + for(size_t tk = 0; tk < trackCount; ++tk) + { + std::memset(drNotes, 0, sizeof(drNotes)); + std::memset(banks, 0, sizeof(banks)); + MidiTrackQueue &track = trackDataNew[tk]; + if(track.empty()) + continue;//Empty track is useless! + + for(MidiTrackQueue::iterator it = track.begin(); it != track.end(); it++) + { + MidiTrackRow &pos = *it; + + for(ssize_t e = 0; e < (ssize_t)pos.events.size(); e++) + { + MidiEvent *et = &pos.events[(size_t)e]; + + /* Set MSB/LSB bank */ + if(et->type == MidiEvent::T_CTRLCHANGE) + { + uint8_t ctrlno = et->data[0]; + uint8_t value = et->data[1]; + switch(ctrlno) + { + case 0: // Set bank msb (GM bank) + banks[et->channel] = uint16_t(uint16_t(value) << 8) | uint16_t(banks[et->channel] & 0x00FF); + break; + case 32: // Set bank lsb (XG bank) + banks[et->channel] = (banks[et->channel] & 0xFF00) | (uint16_t(value) & 0x00FF); + break; + } + continue; + } + + bool percussion = (et->channel == 9) || + banks[et->channel] == 0x7E00 || //XG SFX1/SFX2 channel (16128 signed decimal) + banks[et->channel] == 0x7F00; //XG Percussion channel (16256 signed decimal) + if(!percussion) + continue; + + if(et->type == MidiEvent::T_NOTEON) + { + uint8_t note = et->data[0] & 0x7F; + NoteState &ns = drNotes[note]; + ns.isOn = true; + ns.delay = 0.0; + ns.delayTicks = 0; + } + else if(et->type == MidiEvent::T_NOTEOFF) + { + uint8_t note = et->data[0] & 0x7F; + NoteState &ns = drNotes[note]; + if(ns.isOn) + { + ns.isOn = false; + if(ns.delayTicks < DRUM_NOTE_MIN_TICKS || ns.delay < DRUM_NOTE_MIN_TIME)//If note is too short + { + //Move it into next event position if that possible + for(MidiTrackQueue::iterator itNext = it; + itNext != track.end(); + itNext++) + { + MidiTrackRow &posN = *itNext; + if(ns.delayTicks > DRUM_NOTE_MIN_TICKS && ns.delay > DRUM_NOTE_MIN_TIME) + { + //Put note-off into begin of next event list + posN.events.insert(posN.events.begin(), pos.events[(size_t)e]); + //Renive this event from a current row + pos.events.erase(pos.events.begin() + (int)e); + e--; + break; + } + ns.delay += posN.timeDelay; + ns.delayTicks += posN.delay; + } + } + ns.delay = 0.0; + ns.delayTicks = 0; + } + } + } + + //Append time delays to sustaining notes + for(size_t no = 0; no < 128; no++) + { + NoteState &ns = drNotes[no]; + if(ns.isOn) + { + ns.delay += pos.timeDelay; + ns.delayTicks += pos.delay; + } + } + } + } +#undef DRUM_NOTE_MIN_TIME +#undef DRUM_NOTE_MIN_TICKS + } + #endif + + return true; +} + +MIDIplay::MIDIplay(unsigned long sampleRate): + cmf_percussion_mode(false), + fullSongTimeLength(0.0), + postSongWaitDelay(1.0), + loopStartTime(-1.0), + loopEndTime(-1.0), + tempoMultiplier(1.0), + atEnd(false), + loopStart(false), + loopEnd(false), + invalidLoop(false) +{ + devices.clear(); + + m_setup.PCM_RATE = sampleRate; + m_setup.mindelay = 1.0 / (double)m_setup.PCM_RATE; + m_setup.maxdelay = 512.0 / (double)m_setup.PCM_RATE; + + m_setup.AdlBank = 0; + m_setup.NumFourOps = 7; + m_setup.NumCards = 2; + m_setup.HighTremoloMode = -1; + m_setup.HighVibratoMode = -1; + m_setup.AdlPercussionMode = -1; + m_setup.LogarithmicVolumes = false; + m_setup.VolumeModel = ADLMIDI_VolumeModel_AUTO; + //m_setup.SkipForward = 0; + m_setup.loopingIsEnabled = false; + m_setup.ScaleModulators = -1; + m_setup.delay = 0.0; + m_setup.carry = 0.0; + m_setup.tick_skip_samples_delay = 0; + + applySetup(); + ChooseDevice("none"); + realTime_ResetState(); +} + +void MIDIplay::applySetup() +{ + m_setup.tick_skip_samples_delay = 0; + opl.HighTremoloMode = m_setup.HighTremoloMode == -1 ? adlbanksetup[m_setup.AdlBank].deepTremolo : (bool)m_setup.HighTremoloMode; + opl.HighVibratoMode = m_setup.HighVibratoMode == -1 ? adlbanksetup[m_setup.AdlBank].deepVibrato : (bool)m_setup.HighVibratoMode; + opl.AdlPercussionMode = m_setup.AdlPercussionMode == -1 ? adlbanksetup[m_setup.AdlBank].adLibPercussions : (bool)m_setup.AdlPercussionMode; + opl.ScaleModulators = m_setup.ScaleModulators == -1 ? adlbanksetup[m_setup.AdlBank].scaleModulators : (bool)m_setup.ScaleModulators; + opl.LogarithmicVolumes = m_setup.LogarithmicVolumes; + //opl.CartoonersVolumes = false; + opl.m_musicMode = OPL3::MODE_MIDI; + opl.ChangeVolumeRangesModel(static_cast(m_setup.VolumeModel)); + if(m_setup.VolumeModel == ADLMIDI_VolumeModel_AUTO)//Use bank default volume model + opl.m_volumeScale = (OPL3::VolumesScale)adlbanksetup[m_setup.AdlBank].volumeModel; + + opl.NumCards = m_setup.NumCards; + opl.NumFourOps = m_setup.NumFourOps; + cmf_percussion_mode = false; + + opl.Reset(m_setup.PCM_RATE); + ch.clear(); + ch.resize(opl.NumChannels); +} + +uint64_t MIDIplay::ReadVarLen(uint8_t **ptr) +{ + uint64_t result = 0; + for(;;) + { + uint8_t byte = *((*ptr)++); + result = (result << 7) + (byte & 0x7F); + if(!(byte & 0x80)) + break; + } + return result; +} + +uint64_t MIDIplay::ReadVarLenEx(uint8_t **ptr, uint8_t *end, bool &ok) +{ + uint64_t result = 0; + ok = false; + + for(;;) + { + if(*ptr >= end) + return 2; + unsigned char byte = *((*ptr)++); + result = (result << 7) + (byte & 0x7F); + if(!(byte & 0x80)) + break; + } + + ok = true; + return result; +} + + +double MIDIplay::Tick(double s, double granularity) +{ + s *= tempoMultiplier; + #ifdef ENABLE_BEGIN_SILENCE_SKIPPING + if(CurrentPositionNew.began) + #endif + CurrentPositionNew.wait -= s; + CurrentPositionNew.absTimePosition += s; + + int antiFreezeCounter = 10000;//Limit 10000 loops to avoid freezing + while((CurrentPositionNew.wait <= granularity * 0.5) && (antiFreezeCounter > 0)) + { + //std::fprintf(stderr, "wait = %g...\n", CurrentPosition.wait); + if(!ProcessEventsNew()) + break; + if(CurrentPositionNew.wait <= 0.0) + antiFreezeCounter--; + } + + if(antiFreezeCounter <= 0) + CurrentPositionNew.wait += 1.0;/* Add extra 1 second when over 10000 events + with zero delay are been detected */ + + for(uint16_t c = 0; c < opl.NumChannels; ++c) + ch[c].AddAge(static_cast(s * 1000.0)); + + UpdateVibrato(s); + UpdateArpeggio(s); + + if(CurrentPositionNew.wait < 0.0)//Avoid negative delay value! + return 0.0; + + return CurrentPositionNew.wait; +} + +void MIDIplay::TickIteratos(double s) +{ + for(uint16_t c = 0; c < opl.NumChannels; ++c) + ch[c].AddAge(static_cast(s * 1000.0)); + UpdateVibrato(s); + UpdateArpeggio(s); +} + +void MIDIplay::seek(double seconds) +{ + if(seconds < 0.0) + return;//Seeking negative position is forbidden! :-P + const double granularity = m_setup.mindelay, + granualityHalf = granularity * 0.5, + s = seconds;//m_setup.delay < m_setup.maxdelay ? m_setup.delay : m_setup.maxdelay; + + /* Attempt to go away out of song end must rewind position to begin */ + if(seconds > fullSongTimeLength) + { + rewind(); + return; + } + + bool loopFlagState = m_setup.loopingIsEnabled; + // Turn loop pooints off because it causes wrong position rememberin on a quick seek + m_setup.loopingIsEnabled = false; + + /* + * Seeking search is similar to regular ticking, except of next things: + * - We don't processsing arpeggio and vibrato + * - To keep correctness of the state after seek, begin every search from begin + * - All sustaining notes must be killed + * - Ignore Note-On events + */ + rewind(); + + /* + * Set "loop Start" to false to prevent overwrite of loopStart position with + * seek destinition position + * + * TODO: Detect & set loopStart position on load time to don't break loop while seeking + */ + loopStart = false; + + while((CurrentPositionNew.absTimePosition < seconds) && + (CurrentPositionNew.absTimePosition < fullSongTimeLength)) + { + CurrentPositionNew.wait -= s; + CurrentPositionNew.absTimePosition += s; + int antiFreezeCounter = 10000;//Limit 10000 loops to avoid freezing + double dstWait = CurrentPositionNew.wait + granualityHalf; + while((CurrentPositionNew.wait <= granualityHalf)/*&& (antiFreezeCounter > 0)*/) + { + //std::fprintf(stderr, "wait = %g...\n", CurrentPosition.wait); + if(!ProcessEventsNew(true)) + break; + //Avoid freeze because of no waiting increasing in more than 10000 cycles + if(CurrentPositionNew.wait <= dstWait) + antiFreezeCounter--; + else + { + dstWait = CurrentPositionNew.wait + granualityHalf; + antiFreezeCounter = 10000; + } + } + if(antiFreezeCounter <= 0) + CurrentPositionNew.wait += 1.0;/* Add extra 1 second when over 10000 events + with zero delay are been detected */ + } + + if(CurrentPositionNew.wait < 0.0) + CurrentPositionNew.wait = 0.0; + + m_setup.loopingIsEnabled = loopFlagState; + m_setup.delay = CurrentPositionNew.wait; + m_setup.carry = 0.0; +} + +double MIDIplay::tell() +{ + return CurrentPositionNew.absTimePosition; +} + +double MIDIplay::timeLength() +{ + return fullSongTimeLength; +} + +double MIDIplay::getLoopStart() +{ + return loopStartTime; +} + +double MIDIplay::getLoopEnd() +{ + return loopEndTime; +} + +void MIDIplay::rewind() +{ + Panic(); + KillSustainingNotes(-1, -1); + CurrentPositionNew = trackBeginPositionNew; + atEnd = false; + loopStart = true; + loopEnd = false; + //invalidLoop = false;//No more needed here as this flag is set on load time +} + +void MIDIplay::setTempo(double tempo) +{ + tempoMultiplier = tempo; +} + +void MIDIplay::realTime_ResetState() +{ + for(size_t ch = 0; ch < Ch.size(); ch++) + { + MIDIchannel &chan = Ch[ch]; + chan.volume = (opl.m_musicMode == OPL3::MODE_RSXX) ? 127 : 100; + chan.expression = 127; + chan.panning = 0x30; + chan.vibrato = 0; + chan.sustain = 0; + chan.bend = 0.0; + chan.bendsense = 2 / 8192.0; + chan.vibpos = 0.0; + chan.vibdepth = 0.5 / 127.0; + chan.vibdelay = 0; + chan.lastlrpn = 0; + chan.lastmrpn = 0; + chan.nrpn = false; + chan.brightness = 127; + NoteUpdate_All(uint16_t(ch), Upd_All); + NoteUpdate_All(uint16_t(ch), Upd_Off); + } +} + +bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity) +{ + if((opl.m_musicMode == OPL3::MODE_RSXX) && (velocity != 0)) + { + // Check if this is just a note after-touch + MIDIchannel::activenoteiterator i = Ch[channel].activenotes.find(note); + if(i != Ch[channel].activenotes.end()) + { + i->second.vol = velocity; + NoteUpdate(channel, i, Upd_Volume); + return false; + } + } + + channel = channel % 16; + NoteOff(channel, note); + // On Note on, Keyoff the note first, just in case keyoff + // was omitted; this fixes Dance of sugar-plum fairy + // by Microsoft. Now that we've done a Keyoff, + // check if we still need to do a Keyon. + // vol=0 and event 8x are both Keyoff-only. + if(velocity == 0) + return false; + + size_t midiins = Ch[channel].patch; + bool isPercussion = (channel % 16 == 9); + bool isXgPercussion = false; + + uint16_t bank = 0; + if(Ch[channel].bank_msb || Ch[channel].bank_lsb) + { + bank = (uint16_t(Ch[channel].bank_msb) * 256) + uint16_t(Ch[channel].bank_lsb); + //0x7E00 - XG SFX1/SFX2 channel (16128 signed decimal) + //0x7F00 - XG Percussion channel (16256 signed decimal) + if(bank == 0x7E00 || bank == 0x7F00) + { + //Let XG SFX1/SFX2 bank will have LSB==1 (128...255 range in WOPN file) + //Let XG Percussion bank will use (0...127 range in WOPN file) + bank = (uint16_t)midiins + ((bank == 0x7E00) ? 128 : 0); // MIDI instrument defines the patch + midiins = opl.dynamic_percussion_offset + note; // Percussion instrument + isXgPercussion = true; + isPercussion = false; + } + } + + if(isPercussion) + { + bank = (uint16_t)midiins; // MIDI instrument defines the patch + midiins = opl.dynamic_percussion_offset + note; // Percussion instrument + } + + //Set bank bank + if(bank > 0) + { + if(isPercussion || isXgPercussion) + { + OPL3::BankMap::iterator b = opl.dynamic_percussion_banks.find(bank); + if(b != opl.dynamic_percussion_banks.end()) + midiins += b->second * 128; + else + if(hooks.onDebugMessage) + { + if(!caugh_missing_banks_melodic.count(bank)) + { + hooks.onDebugMessage(hooks.onDebugMessage_userData, "[%i] Playing missing percussion bank %i (patch %i)", channel, bank, midiins); + caugh_missing_banks_melodic.insert(bank); + } + } + } + else + { + OPL3::BankMap::iterator b = opl.dynamic_melodic_banks.find(bank); + if(b != opl.dynamic_melodic_banks.end()) + midiins += b->second * 128; + else + if(hooks.onDebugMessage) + { + if(!caugh_missing_banks_percussion.count(bank)) + { + hooks.onDebugMessage(hooks.onDebugMessage_userData, "[%i] Playing missing melodic bank %i (patch %i)", channel, bank, midiins); + caugh_missing_banks_percussion.insert(bank); + } + } + } + } + + /* + if(MidCh%16 == 9 || (midiins != 32 && midiins != 46 && midiins != 48 && midiins != 50)) + break; // HACK + if(midiins == 46) vol = (vol*7)/10; // HACK + if(midiins == 48 || midiins == 50) vol /= 4; // HACK + */ + //if(midiins == 56) vol = vol*6/10; // HACK + + //int meta = banks[opl.AdlBank][midiins]; + const size_t meta = opl.GetAdlMetaNumber(midiins); + const adlinsdata &ains = opl.GetAdlMetaIns(meta); + int16_t tone = note; + + if(ains.tone) + { + /*if(ains.tone < 20) + tone += ains.tone; + else*/ + if(ains.tone < 128) + tone = ains.tone; + else + tone -= ains.tone - 128; + } + + //uint16_t i[2] = { ains.adlno1, ains.adlno2 }; + bool pseudo_4op = ains.flags & adlinsdata::Flag_Pseudo4op; + MIDIchannel::NoteInfo::Phys voices[2] = + { + {ains.adlno1, false}, + {ains.adlno2, pseudo_4op} + }; + + if((opl.AdlPercussionMode == 1) && PercussionMap[midiins & 0xFF]) + voices[1] = voices[0];//i[1] = i[0]; + + if(hooks.onDebugMessage) + { + if(!caugh_missing_instruments.count(static_cast(midiins)) && (ains.flags & adlinsdata::Flag_NoSound)) + { + hooks.onDebugMessage(hooks.onDebugMessage_userData, "[%i] Playing missing instrument %i", channel, midiins); + caugh_missing_instruments.insert(static_cast(midiins)); + } + } + + // Allocate AdLib channel (the physical sound channel for the note) + int32_t adlchannel[2] = { -1, -1 }; + + for(uint32_t ccount = 0; ccount < 2; ++ccount) + { + if(ccount == 1) + { + if(voices[0] == voices[1]) + break; // No secondary channel + if(adlchannel[0] == -1) + break; // No secondary if primary failed + } + + int32_t c = -1; + int32_t bs = -0x7FFFFFFFl; + + for(size_t a = 0; a < (size_t)opl.NumChannels; ++a) + { + if(ccount == 1 && static_cast(a) == adlchannel[0]) continue; + // ^ Don't use the same channel for primary&secondary + + if(voices[0].insId == voices[1].insId || pseudo_4op/*i[0] == i[1] || pseudo_4op*/) + { + // Only use regular channels + uint8_t expected_mode = 0; + + if(opl.AdlPercussionMode == 1) + { + if(cmf_percussion_mode) + expected_mode = channel < 11 ? 0 : (3 + channel - 11); // CMF + else + expected_mode = PercussionMap[midiins & 0xFF]; + } + + if(opl.four_op_category[a] != expected_mode) + continue; + } + else + { + if(ccount == 0) + { + // Only use four-op master channels + if(opl.four_op_category[a] != 1) + continue; + } + else + { + // The secondary must be played on a specific channel. + if(a != static_cast(adlchannel[0]) + 3) + continue; + } + } + + int64_t s = CalculateAdlChannelGoodness(a, voices[ccount], channel); + if(s > bs) + { + bs = (int32_t)s; // Best candidate wins + c = static_cast(a); + } + } + + if(c < 0) + { + if(hooks.onDebugMessage) + hooks.onDebugMessage(hooks.onDebugMessage_userData, + "ignored unplaceable note [bank %i, inst %i, note %i, MIDI channel %i]", + bank, Ch[channel].patch, note, channel); + continue; // Could not play this note. Ignore it. + } + + PrepareAdlChannelForNewNote(static_cast(c), voices[ccount]); + adlchannel[ccount] = c; + } + + if(adlchannel[0] < 0 && adlchannel[1] < 0) + { + // The note could not be played, at all. + return false; + } + + //if(hooks.onDebugMessage) + // hooks.onDebugMessage(hooks.onDebugMessage_userData, "i1=%d:%d, i2=%d:%d", i[0],adlchannel[0], i[1],adlchannel[1]); + + // Allocate active note for MIDI channel + std::pair + ir = Ch[channel].activenotes.insert(std::make_pair(note, MIDIchannel::NoteInfo())); + ir.first->second.vol = velocity; + ir.first->second.tone = tone; + ir.first->second.midiins = midiins; + ir.first->second.insmeta = meta; + + for(unsigned ccount = 0; ccount < 2; ++ccount) + { + int32_t c = adlchannel[ccount]; + if(c < 0) + continue; + uint16_t chipChan = static_cast(adlchannel[ccount]); + ir.first->second.phys[chipChan] = voices[ccount]; + } + NoteUpdate(channel, ir.first, Upd_All | Upd_Patch); + return true; +} + +void MIDIplay::realTime_NoteOff(uint8_t channel, uint8_t note) +{ + channel = channel % 16; + NoteOff(channel, note); +} + +void MIDIplay::realTime_NoteAfterTouch(uint8_t channel, uint8_t note, uint8_t atVal) +{ + channel = channel % 16; + MIDIchannel::activenoteiterator + i = Ch[channel].activenotes.find(note); + if(i == Ch[channel].activenotes.end()) + { + // Ignore touch if note is not active + return; + } + i->second.vol = 127 - atVal; + NoteUpdate(channel, i, Upd_Volume); +} + +void MIDIplay::realTime_ChannelAfterTouch(uint8_t channel, uint8_t atVal) +{ + // TODO: Verify, is this correct action? + channel = channel % 16; + for(MIDIchannel::activenoteiterator + i = Ch[channel].activenotes.begin(); + i != Ch[channel].activenotes.end(); + ++i) + { + // Set this pressure to all active notes on the channel + i->second.vol = 127 - atVal; + } + + NoteUpdate_All(channel, Upd_Volume); +} + +void MIDIplay::realTime_Controller(uint8_t channel, uint8_t type, uint8_t value) +{ + channel = channel % 16; + switch(type) + { + case 1: // Adjust vibrato + //UI.PrintLn("%u:vibrato %d", MidCh,value); + Ch[channel].vibrato = value; + break; + + case 0: // Set bank msb (GM bank) + Ch[channel].bank_msb = value; + Ch[channel].is_xg_percussion = isXgPercChannel(Ch[channel].bank_msb, Ch[channel].bank_lsb); + break; + + case 32: // Set bank lsb (XG bank) + Ch[channel].bank_lsb = value; + Ch[channel].is_xg_percussion = isXgPercChannel(Ch[channel].bank_msb, Ch[channel].bank_lsb); + break; + + case 5: // Set portamento msb + Ch[channel].portamento = static_cast((Ch[channel].portamento & 0x7F) | (value << 7)); + //UpdatePortamento(MidCh); + break; + + case 37: // Set portamento lsb + Ch[channel].portamento = (Ch[channel].portamento & 0x3F80) | (value); + //UpdatePortamento(MidCh); + break; + + case 65: // Enable/disable portamento + // value >= 64 ? enabled : disabled + //UpdatePortamento(MidCh); + break; + + case 7: // Change volume + Ch[channel].volume = value; + NoteUpdate_All(channel, Upd_Volume); + break; + + case 74: // Change brightness + Ch[channel].brightness = value; + NoteUpdate_All(channel, Upd_Volume); + break; + + case 64: // Enable/disable sustain + Ch[channel].sustain = value; + if(!value) KillSustainingNotes(channel); + break; + + case 11: // Change expression (another volume factor) + Ch[channel].expression = value; + NoteUpdate_All(channel, Upd_Volume); + break; + + case 10: // Change panning + Ch[channel].panning = 0x00; + if(value < 64 + 32) Ch[channel].panning |= 0x10; + if(value >= 64 - 32) Ch[channel].panning |= 0x20; + + NoteUpdate_All(channel, Upd_Pan); + break; + + case 121: // Reset all controllers + Ch[channel].bend = 0; + Ch[channel].volume = 100; + Ch[channel].expression = 127; + Ch[channel].sustain = 0; + Ch[channel].vibrato = 0; + Ch[channel].vibspeed = 2 * 3.141592653 * 5.0; + Ch[channel].vibdepth = 0.5 / 127; + Ch[channel].vibdelay = 0; + Ch[channel].panning = 0x30; + Ch[channel].portamento = 0; + Ch[channel].brightness = 127; + //UpdatePortamento(MidCh); + NoteUpdate_All(channel, Upd_Pan + Upd_Volume + Upd_Pitch); + // Kill all sustained notes + KillSustainingNotes(channel); + break; + + case 123: // All notes off + NoteUpdate_All(channel, Upd_Off); + break; + + case 91: + break; // Reverb effect depth. We don't do per-channel reverb. + + case 92: + break; // Tremolo effect depth. We don't do... + + case 93: + break; // Chorus effect depth. We don't do. + + case 94: + break; // Celeste effect depth. We don't do. + + case 95: + break; // Phaser effect depth. We don't do. + + case 98: + Ch[channel].lastlrpn = value; + Ch[channel].nrpn = true; + break; + + case 99: + Ch[channel].lastmrpn = value; + Ch[channel].nrpn = true; + break; + + case 100: + Ch[channel].lastlrpn = value; + Ch[channel].nrpn = false; + break; + + case 101: + Ch[channel].lastmrpn = value; + Ch[channel].nrpn = false; + break; + + case 113: + break; // Related to pitch-bender, used by missimp.mid in Duke3D + + case 6: + SetRPN(channel, value, true); + break; + + case 38: + SetRPN(channel, value, false); + break; + + case 103: + cmf_percussion_mode = (value != 0); + break; // CMF (ctrl 0x67) rhythm mode + + default: + break; + //UI.PrintLn("Ctrl %d <- %d (ch %u)", ctrlno, value, MidCh); + } +} + +void MIDIplay::realTime_PatchChange(uint8_t channel, uint8_t patch) +{ + channel = channel % 16; + Ch[channel].patch = patch; +} + +void MIDIplay::realTime_PitchBend(uint8_t channel, uint16_t pitch) +{ + channel = channel % 16; + Ch[channel].bend = (uint32_t(pitch) - 8192) * Ch[channel].bendsense; + NoteUpdate_All(channel, Upd_Pitch); +} + +void MIDIplay::realTime_PitchBend(uint8_t channel, uint8_t msb, uint8_t lsb) +{ + channel = channel % 16; + Ch[channel].bend = (int(lsb) + int(msb) * 128 - 8192) * Ch[channel].bendsense; + NoteUpdate_All(channel, Upd_Pitch); +} + +void MIDIplay::realTime_BankChangeLSB(uint8_t channel, uint8_t lsb) +{ + channel = channel % 16; + Ch[channel].bank_lsb = lsb; +} + +void MIDIplay::realTime_BankChangeMSB(uint8_t channel, uint8_t msb) +{ + channel = channel % 16; + Ch[channel].bank_msb = msb; +} + +void MIDIplay::realTime_BankChange(uint8_t channel, uint16_t bank) +{ + channel = channel % 16; + Ch[channel].bank_lsb = uint8_t(bank & 0xFF); + Ch[channel].bank_msb = uint8_t((bank >> 8) & 0xFF); +} + +void MIDIplay::realTime_panic() +{ + Panic(); + KillSustainingNotes(-1, -1); +} + + +void MIDIplay::NoteUpdate(uint16_t MidCh, + MIDIplay::MIDIchannel::activenoteiterator i, + unsigned props_mask, + int32_t select_adlchn) +{ + MIDIchannel::NoteInfo &info = i->second; + const int16_t tone = info.tone; + const uint8_t vol = info.vol; + const int midiins = info.midiins; + const size_t insmeta = info.insmeta; + const adlinsdata &ains = opl.GetAdlMetaIns(insmeta); + AdlChannel::Location my_loc; + my_loc.MidCh = MidCh; + my_loc.note = i->first; + + for(MIDIchannel::NoteInfo::PhysMap::iterator + jnext = info.phys.begin(); + jnext != info.phys.end(); + ) + { + MIDIchannel::NoteInfo::PhysMap::iterator j(jnext++); + uint16_t c = j->first; + const MIDIchannel::NoteInfo::Phys &ins = j->second; + + if(select_adlchn >= 0 && c != select_adlchn) continue; + + if(props_mask & Upd_Patch) + { + opl.Patch(c, ins.insId); + AdlChannel::LocationData &d = ch[c].users[my_loc]; + d.sustained = false; // inserts if necessary + d.vibdelay = 0; + d.kon_time_until_neglible = ains.ms_sound_kon; + d.ins = ins; + } + } + + for(MIDIchannel::NoteInfo::PhysMap::iterator + jnext = info.phys.begin(); + jnext != info.phys.end(); + ) + { + MIDIchannel::NoteInfo::PhysMap::iterator j(jnext++); + uint16_t c = j->first; + const MIDIchannel::NoteInfo::Phys &ins = j->second; + + if(select_adlchn >= 0 && c != select_adlchn) continue; + + if(props_mask & Upd_Off) // note off + { + if(Ch[MidCh].sustain == 0) + { + AdlChannel::users_t::iterator k = ch[c].users.find(my_loc); + + if(k != ch[c].users.end()) + ch[c].users.erase(k); + + if(hooks.onNote) + hooks.onNote(hooks.onNote_userData, c, tone, midiins, 0, 0.0); + + if(ch[c].users.empty()) + { + opl.NoteOff(c); + ch[c].koff_time_until_neglible = + ains.ms_sound_koff; + } + } + else + { + // Sustain: Forget about the note, but don't key it off. + // Also will avoid overwriting it very soon. + AdlChannel::LocationData &d = ch[c].users[my_loc]; + d.sustained = true; // note: not erased! + if(hooks.onNote) + hooks.onNote(hooks.onNote_userData, c, tone, midiins, -1, 0.0); + } + + info.phys.erase(j); + continue; + } + + if(props_mask & Upd_Pan) + opl.Pan(c, Ch[MidCh].panning); + + if(props_mask & Upd_Volume) + { + uint32_t volume; + bool is_percussion = (MidCh == 9) || Ch[MidCh].is_xg_percussion; + uint8_t brightness = is_percussion ? 127 : Ch[MidCh].brightness; + + switch(opl.m_volumeScale) + { + case OPL3::VOLUME_Generic: + case OPL3::VOLUME_CMF: + { + volume = vol * Ch[MidCh].volume * Ch[MidCh].expression; + + /* If the channel has arpeggio, the effective volume of + * *this* instrument is actually lower due to timesharing. + * To compensate, add extra volume that corresponds to the + * time this note is *not* heard. + * Empirical tests however show that a full equal-proportion + * increment sounds wrong. Therefore, using the square root. + */ + //volume = (int)(volume * std::sqrt( (double) ch[c].users.size() )); + + if(opl.LogarithmicVolumes) + volume = volume * 127 / (127 * 127 * 127) / 2; + else + { + // The formula below: SOLVE(V=127^3 * 2^( (A-63.49999) / 8), A) + volume = volume > 8725 ? static_cast(std::log(static_cast(volume)) * 11.541561 + (0.5 - 104.22845)) : 0; + // The incorrect formula below: SOLVE(V=127^3 * (2^(A/63)-1), A) + //opl.Touch_Real(c, volume>11210 ? 91.61112 * std::log(4.8819E-7*volume + 1.0)+0.5 : 0); + } + opl.Touch_Real(c, volume, brightness); + //opl.Touch(c, volume); + } + break; + + case OPL3::VOLUME_DMX: + { + volume = 2 * ((Ch[MidCh].volume * Ch[MidCh].expression) * 127 / 16129) + 1; + //volume = 2 * (Ch[MidCh].volume) + 1; + volume = (DMX_volume_mapping_table[vol] * volume) >> 9; + opl.Touch_Real(c, volume, brightness); + } + break; + + case OPL3::VOLUME_APOGEE: + { + volume = ((Ch[MidCh].volume * Ch[MidCh].expression) * 127 / 16129); + volume = ((64 * (vol + 0x80)) * volume) >> 15; + //volume = ((63 * (vol + 0x80)) * Ch[MidCh].volume) >> 15; + opl.Touch_Real(c, volume, brightness); + } + break; + + case OPL3::VOLUME_9X: + { + //volume = 63 - W9X_volume_mapping_table[(((vol * Ch[MidCh].volume /** Ch[MidCh].expression*/) * 127 / 16129 /*2048383*/) >> 2)]; + volume = 63 - W9X_volume_mapping_table[(((vol * Ch[MidCh].volume * Ch[MidCh].expression) * 127 / 2048383) >> 2)]; + //volume = W9X_volume_mapping_table[vol >> 2] + volume; + opl.Touch_Real(c, volume, brightness); + } + break; + } + + /* DEBUG ONLY!!! + static uint32_t max = 0; + + if(volume == 0) + max = 0; + + if(volume > max) + max = volume; + + printf("%d\n", max); + fflush(stdout); + */ + } + + if(props_mask & Upd_Pitch) + { + AdlChannel::LocationData &d = ch[c].users[my_loc]; + + // Don't bend a sustained note + if(!d.sustained) + { + double bend = Ch[MidCh].bend + opl.GetAdlIns(ins.insId).finetune; + double phase = 0.0; + + if((ains.flags & adlinsdata::Flag_Pseudo4op) && ins.pseudo4op) + { + phase = ains.voice2_fine_tune;//0.125; // Detune the note slightly (this is what Doom does) + } + + if(Ch[MidCh].vibrato && d.vibdelay >= Ch[MidCh].vibdelay) + bend += Ch[MidCh].vibrato * Ch[MidCh].vibdepth * std::sin(Ch[MidCh].vibpos); + + #ifdef ADLMIDI_USE_DOSBOX_OPL +#define BEND_COEFFICIENT 172.00093 + #else +#define BEND_COEFFICIENT 172.4387 + #endif + opl.NoteOn(c, BEND_COEFFICIENT * std::exp(0.057762265 * (tone + bend + phase))); +#undef BEND_COEFFICIENT + if(hooks.onNote) + hooks.onNote(hooks.onNote_userData, c, tone, midiins, vol, Ch[MidCh].bend); + } + } + } + + if(info.phys.empty()) + Ch[MidCh].activenotes.erase(i); +} + + +bool MIDIplay::ProcessEventsNew(bool isSeek) +{ + if(CurrentPositionNew.track.size() == 0) + atEnd = true;//No MIDI track data to play + if(atEnd) + return false;//No more events in the queue + + loopEnd = false; + const size_t TrackCount = CurrentPositionNew.track.size(); + const PositionNew RowBeginPosition(CurrentPositionNew); + + #ifdef DEBUG_TIME_CALCULATION + double maxTime = 0.0; + #endif + + for(size_t tk = 0; tk < TrackCount; ++tk) + { + PositionNew::TrackInfo &track = CurrentPositionNew.track[tk]; + if((track.status >= 0) && (track.delay <= 0)) + { + //Check is an end of track has been reached + if(track.pos == trackDataNew[tk].end()) + { + track.status = -1; + break; + } + + // Handle event + for(size_t i = 0; i < track.pos->events.size(); i++) + { + const MidiEvent &evt = track.pos->events[i]; + #ifdef ENABLE_BEGIN_SILENCE_SKIPPING + if(!CurrentPositionNew.began && (evt.type == MidiEvent::T_NOTEON)) + CurrentPositionNew.began = true; + #endif + if(isSeek && (evt.type == MidiEvent::T_NOTEON)) + continue; + HandleEvent(tk, evt, track.status); + if(loopEnd) + break;//Stop event handling on catching loopEnd event! + } + + #ifdef DEBUG_TIME_CALCULATION + if(maxTime < track.pos->time) + maxTime = track.pos->time; + #endif + // Read next event time (unless the track just ended) + if(track.status >= 0) + { + track.delay += track.pos->delay; + track.pos++; + } + } + } + + #ifdef DEBUG_TIME_CALCULATION + std::fprintf(stdout, " \r"); + std::fprintf(stdout, "Time: %10f; Audio: %10f\r", maxTime, CurrentPositionNew.absTimePosition); + std::fflush(stdout); + #endif + + // Find shortest delay from all track + uint64_t shortest = 0; + bool shortest_no = true; + + for(size_t tk = 0; tk < TrackCount; ++tk) + { + PositionNew::TrackInfo &track = CurrentPositionNew.track[tk]; + if((track.status >= 0) && (shortest_no || track.delay < shortest)) + { + shortest = track.delay; + shortest_no = false; + } + } + + //if(shortest > 0) UI.PrintLn("shortest: %ld", shortest); + + // Schedule the next playevent to be processed after that delay + for(size_t tk = 0; tk < TrackCount; ++tk) + CurrentPositionNew.track[tk].delay -= shortest; + + fraction t = shortest * Tempo; + + #ifdef ENABLE_BEGIN_SILENCE_SKIPPING + if(CurrentPositionNew.began) + #endif + CurrentPositionNew.wait += t.value(); + + //if(shortest > 0) UI.PrintLn("Delay %ld (%g)", shortest, (double)t.valuel()); + if(loopStart) + { + LoopBeginPositionNew = RowBeginPosition; + loopStart = false; + } + + if(shortest_no || loopEnd) + { + //Loop if song end or loop end point has reached + loopEnd = false; + shortest = 0; + if(!m_setup.loopingIsEnabled) + { + atEnd = true; //Don't handle events anymore + CurrentPositionNew.wait += postSongWaitDelay;//One second delay until stop playing + return true;//We have caugh end here! + } + CurrentPositionNew = LoopBeginPositionNew; + } + + return true;//Has events in queue +} + +MIDIplay::MidiEvent MIDIplay::parseEvent(uint8_t **pptr, uint8_t *end, int &status) +{ + uint8_t *&ptr = *pptr; + MIDIplay::MidiEvent evt; + + if(ptr + 1 > end) + { + //When track doesn't ends on the middle of event data, it's must be fine + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_ENDTRACK; + return evt; + } + + unsigned char byte = *(ptr++); + bool ok = false; + + if(byte == MidiEvent::T_SYSEX || byte == MidiEvent::T_SYSEX2)// Ignore SysEx + { + uint64_t length = ReadVarLenEx(pptr, end, ok); + if(!ok || (ptr + length > end)) + { + errorString += "parseEvent: Can't read SysEx event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + ptr += (size_t)length; + return evt; + } + + if(byte == MidiEvent::T_SPECIAL) + { + // Special event FF + uint8_t evtype = *(ptr++); + uint64_t length = ReadVarLenEx(pptr, end, ok); + if(!ok || (ptr + length > end)) + { + errorString += "parseEvent: Can't read Special event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + std::string data(length ? (const char *)ptr : 0, (size_t)length); + ptr += (size_t)length; + + evt.type = byte; + evt.subtype = evtype; + evt.data.insert(evt.data.begin(), data.begin(), data.end()); + + /* TODO: Store those meta-strings separately and give ability to read them + * by external functions (to display song title and copyright in the player) */ + if(evt.subtype == MidiEvent::ST_COPYRIGHT) + { + if(musCopyright.empty()) + { + musCopyright = std::string((const char *)evt.data.data(), evt.data.size()); + if(hooks.onDebugMessage) + hooks.onDebugMessage(hooks.onDebugMessage_userData, "Music copyright: %s", musCopyright.c_str()); + } + else if(hooks.onDebugMessage) + { + std::string str((const char *)evt.data.data(), evt.data.size()); + hooks.onDebugMessage(hooks.onDebugMessage_userData, "Extra copyright event: %s", str.c_str()); + } + } + else if(evt.subtype == MidiEvent::ST_SQTRKTITLE) + { + if(musTitle.empty()) + { + musTitle = std::string((const char *)evt.data.data(), evt.data.size()); + if(hooks.onDebugMessage) + hooks.onDebugMessage(hooks.onDebugMessage_userData, "Music title: %s", musTitle.c_str()); + } + else if(hooks.onDebugMessage) + { + //TODO: Store track titles and associate them with each track and make API to retreive them + std::string str((const char *)evt.data.data(), evt.data.size()); + musTrackTitles.push_back(str); + hooks.onDebugMessage(hooks.onDebugMessage_userData, "Track title: %s", str.c_str()); + } + } + else if(evt.subtype == MidiEvent::ST_INSTRTITLE) + { + if(hooks.onDebugMessage) + { + std::string str((const char *)evt.data.data(), evt.data.size()); + hooks.onDebugMessage(hooks.onDebugMessage_userData, "Instrument: %s", str.c_str()); + } + } + else if(evt.subtype == MidiEvent::ST_MARKER) + { + //To lower + for(size_t i = 0; i < data.size(); i++) + { + if(data[i] <= 'Z' && data[i] >= 'A') + data[i] = data[i] - ('Z' - 'z'); + } + + if(data == "loopstart") + { + //Return a custom Loop Start event instead of Marker + evt.subtype = MidiEvent::ST_LOOPSTART; + evt.data.clear();//Data is not needed + return evt; + } + + if(data == "loopend") + { + //Return a custom Loop End event instead of Marker + evt.subtype = MidiEvent::ST_LOOPEND; + evt.data.clear();//Data is not needed + return evt; + } + } + + if(evtype == MidiEvent::ST_ENDTRACK) + status = -1;//Finalize track + + return evt; + } + + // Any normal event (80..EF) + if(byte < 0x80) + { + byte = static_cast(status | 0x80); + ptr--; + } + + //Sys Com Song Select(Song #) [0-127] + if(byte == MidiEvent::T_SYSCOMSNGSEL) + { + if(ptr + 1 > end) + { + errorString += "parseEvent: Can't read System Command Song Select event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + evt.type = byte; + evt.data.push_back(*(ptr++)); + return evt; + } + + //Sys Com Song Position Pntr [LSB, MSB] + if(byte == MidiEvent::T_SYSCOMSPOSPTR) + { + if(ptr + 2 > end) + { + errorString += "parseEvent: Can't read System Command Position Pointer event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + evt.type = byte; + evt.data.push_back(*(ptr++)); + evt.data.push_back(*(ptr++)); + return evt; + } + + uint8_t midCh = byte & 0x0F, evType = (byte >> 4) & 0x0F; + status = byte; + evt.channel = midCh; + evt.type = evType; + + switch(evType) + { + case MidiEvent::T_NOTEOFF://2 byte length + case MidiEvent::T_NOTEON: + case MidiEvent::T_NOTETOUCH: + case MidiEvent::T_CTRLCHANGE: + case MidiEvent::T_WHEEL: + if(ptr + 2 > end) + { + errorString += "parseEvent: Can't read regular 2-byte event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + + evt.data.push_back(*(ptr++)); + evt.data.push_back(*(ptr++)); + + if((evType == MidiEvent::T_NOTEON) && (evt.data[1] == 0)) + evt.type = MidiEvent::T_NOTEOFF; // Note ON with zero velocity is Note OFF! + //111'th loopStart controller (RPG Maker and others) + else if((evType == MidiEvent::T_CTRLCHANGE) && (evt.data[0] == 111)) + { + //Change event type to custom Loop Start event and clear data + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_LOOPSTART; + evt.data.clear(); + } + + return evt; + case MidiEvent::T_PATCHCHANGE://1 byte length + case MidiEvent::T_CHANAFTTOUCH: + if(ptr + 1 > end) + { + errorString += "parseEvent: Can't read regular 1-byte event - Unexpected end of track data.\n"; + evt.isValid = 0; + return evt; + } + evt.data.push_back(*(ptr++)); + return evt; + } + + return evt; +} + +const std::string &MIDIplay::getErrorString() +{ + return errorStringOut; +} + +void MIDIplay::setErrorString(const std::string &err) +{ + errorStringOut = err; +} + + +void MIDIplay::HandleEvent(size_t tk, const MIDIplay::MidiEvent &evt, int &status) +{ + if(hooks.onEvent) + { + hooks.onEvent(hooks.onEvent_userData, + evt.type, + evt.subtype, + evt.channel, + evt.data.data(), + evt.data.size()); + } + + if(evt.type == MidiEvent::T_SYSEX || evt.type == MidiEvent::T_SYSEX2) // Ignore SysEx + { + //std::string data( length?(const char*) &TrackData[tk][CurrentPosition.track[tk].ptr]:0, length ); + //UI.PrintLn("SysEx %02X: %u bytes", byte, length/*, data.c_str()*/); + return; + } + + if(evt.type == MidiEvent::T_SPECIAL) + { + // Special event FF + uint8_t evtype = evt.subtype; + uint64_t length = (uint64_t)evt.data.size(); + std::string data(length ? (const char *)evt.data.data() : 0, (size_t)length); + + if(evtype == MidiEvent::ST_ENDTRACK)//End Of Track + { + status = -1; + return; + } + + if(evtype == MidiEvent::ST_TEMPOCHANGE)//Tempo change + { + Tempo = InvDeltaTicks * fraction(ReadBEint(evt.data.data(), evt.data.size())); + return; + } + + if(evtype == MidiEvent::ST_MARKER)//Meta event + { + //Do nothing! :-P + return; + } + + if(evtype == MidiEvent::ST_DEVICESWITCH) + { + current_device[tk] = ChooseDevice(data); + return; + } + + //if(evtype >= 1 && evtype <= 6) + // UI.PrintLn("Meta %d: %s", evtype, data.c_str()); + + //Turn on Loop handling when loop is enabled + if(m_setup.loopingIsEnabled && !invalidLoop) + { + if(evtype == MidiEvent::ST_LOOPSTART) // Special non-spec ADLMIDI special for IMF playback: Direct poke to AdLib + { + loopStart = true; + return; + } + + if(evtype == MidiEvent::ST_LOOPEND) // Special non-spec ADLMIDI special for IMF playback: Direct poke to AdLib + { + loopEnd = true; + return; + } + } + + if(evtype == MidiEvent::ST_RAWOPL) // Special non-spec ADLMIDI special for IMF playback: Direct poke to AdLib + { + uint8_t i = static_cast(data[0]), v = static_cast(data[1]); + if((i & 0xF0) == 0xC0) + v |= 0x30; + //std::printf("OPL poke %02X, %02X\n", i, v); + //std::fflush(stdout); + opl.PokeN(0, i, v); + return; + } + + return; + } + + // Any normal event (80..EF) + // if(evt.type < 0x80) + // { + // byte = static_cast(CurrentPosition.track[tk].status | 0x80); + // CurrentPosition.track[tk].ptr--; + // } + + if(evt.type == MidiEvent::T_SYSCOMSNGSEL || + evt.type == MidiEvent::T_SYSCOMSPOSPTR) + return; + + /*UI.PrintLn("@%X Track %u: %02X %02X", + CurrentPosition.track[tk].ptr-1, (unsigned)tk, byte, + TrackData[tk][CurrentPosition.track[tk].ptr]);*/ + uint8_t midCh = evt.channel;//byte & 0x0F, EvType = byte >> 4; + midCh += (uint8_t)current_device[tk]; + status = evt.type; + + switch(evt.type) + { + case MidiEvent::T_NOTEOFF: // Note off + { + uint8_t note = evt.data[0]; + realTime_NoteOff(midCh, note); + break; + } + + case MidiEvent::T_NOTEON: // Note on + { + uint8_t note = evt.data[0]; + uint8_t vol = evt.data[1]; + /*if(*/ realTime_NoteOn(midCh, note, vol); /*)*/ + //CurrentPosition.began = true; + break; + } + + case MidiEvent::T_NOTETOUCH: // Note touch + { + uint8_t note = evt.data[0]; + uint8_t vol = evt.data[1]; + realTime_NoteAfterTouch(midCh, note, vol); + break; + } + + case MidiEvent::T_CTRLCHANGE: // Controller change + { + uint8_t ctrlno = evt.data[0]; + uint8_t value = evt.data[1]; + realTime_Controller(midCh, ctrlno, value); + break; + } + + case MidiEvent::T_PATCHCHANGE: // Patch change + realTime_PatchChange(midCh, evt.data[0]); + break; + + case MidiEvent::T_CHANAFTTOUCH: // Channel after-touch + { + // TODO: Verify, is this correct action? + uint8_t vol = evt.data[0]; + realTime_ChannelAfterTouch(midCh, vol); + break; + } + + case MidiEvent::T_WHEEL: // Wheel/pitch bend + { + uint8_t a = evt.data[0]; + uint8_t b = evt.data[1]; + realTime_PitchBend(midCh, b, a); + break; + } + } +} + +long MIDIplay::CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t) const +{ + long s = -ch[c].koff_time_until_neglible; + + // Same midi-instrument = some stability + //if(c == MidCh) s += 4; + for(AdlChannel::users_t::const_iterator + j = ch[c].users.begin(); + j != ch[c].users.end(); + ++j) + { + s -= 4000; + + if(!j->second.sustained) + s -= (long)j->second.kon_time_until_neglible; + else + s -= (long)(j->second.kon_time_until_neglible / 2); + + MIDIchannel::activenotemap_t::const_iterator + k = Ch[j->first.MidCh].activenotes.find(j->first.note); + + if(k != Ch[j->first.MidCh].activenotes.end()) + { + // Same instrument = good + if(j->second.ins == ins) + { + s += 300; + // Arpeggio candidate = even better + if(j->second.vibdelay < 70 + || j->second.kon_time_until_neglible > 20000) + s += 0; + } + + // Percussion is inferior to melody + s += 50 * (k->second.midiins / 128); + /* + if(k->second.midiins >= 25 + && k->second.midiins < 40 + && j->second.ins != ins) + { + s -= 14000; // HACK: Don't clobber the bass or the guitar + } + */ + } + + // If there is another channel to which this note + // can be evacuated to in the case of congestion, + // increase the score slightly. + unsigned n_evacuation_stations = 0; + + for(unsigned c2 = 0; c2 < opl.NumChannels; ++c2) + { + if(c2 == c) continue; + + if(opl.four_op_category[c2] + != opl.four_op_category[c]) continue; + + for(AdlChannel::users_t::const_iterator + m = ch[c2].users.begin(); + m != ch[c2].users.end(); + ++m) + { + if(m->second.sustained) continue; + if(m->second.vibdelay >= 200) continue; + if(m->second.ins != j->second.ins) continue; + n_evacuation_stations += 1; + } + } + + s += n_evacuation_stations * 4; + } + + return s; +} + + +void MIDIplay::PrepareAdlChannelForNewNote(size_t c, const MIDIchannel::NoteInfo::Phys &ins) +{ + if(ch[c].users.empty()) return; // Nothing to do + + //bool doing_arpeggio = false; + for(AdlChannel::users_t::iterator + jnext = ch[c].users.begin(); + jnext != ch[c].users.end(); + ) + { + AdlChannel::users_t::iterator j(jnext++); + + if(!j->second.sustained) + { + // Collision: Kill old note, + // UNLESS we're going to do arpeggio + MIDIchannel::activenoteiterator i + (Ch[j->first.MidCh].activenotes.find(j->first.note)); + + // Check if we can do arpeggio. + if((j->second.vibdelay < 70 + || j->second.kon_time_until_neglible > 20000) + && j->second.ins == ins) + { + // Do arpeggio together with this note. + //doing_arpeggio = true; + continue; + } + + KillOrEvacuate(c, j, i); + // ^ will also erase j from ch[c].users. + } + } + + // Kill all sustained notes on this channel + // Don't keep them for arpeggio, because arpeggio requires + // an intact "activenotes" record. This is a design flaw. + KillSustainingNotes(-1, static_cast(c)); + + // Keyoff the channel so that it can be retriggered, + // unless the new note will be introduced as just an arpeggio. + if(ch[c].users.empty()) + opl.NoteOff(c); +} + +void MIDIplay::KillOrEvacuate(size_t from_channel, AdlChannel::users_t::iterator j, MIDIplay::MIDIchannel::activenoteiterator i) +{ + // Before killing the note, check if it can be + // evacuated to another channel as an arpeggio + // instrument. This helps if e.g. all channels + // are full of strings and we want to do percussion. + // FIXME: This does not care about four-op entanglements. + for(uint32_t c = 0; c < opl.NumChannels; ++c) + { + uint16_t cs = static_cast(c); + + if(c > std::numeric_limits::max()) + break; + if(c == from_channel) + continue; + if(opl.four_op_category[c] != opl.four_op_category[from_channel]) + continue; + + for(AdlChannel::users_t::iterator + m = ch[c].users.begin(); + m != ch[c].users.end(); + ++m) + { + if(m->second.vibdelay >= 200 + && m->second.kon_time_until_neglible < 10000) continue; + if(m->second.ins != j->second.ins) + continue; + if(hooks.onNote) + { + hooks.onNote(hooks.onNote_userData, + (int)from_channel, + i->second.tone, + i->second.midiins, 0, 0.0); + hooks.onNote(hooks.onNote_userData, + (int)c, + i->second.tone, + i->second.midiins, + i->second.vol, 0.0); + } + + i->second.phys.erase(static_cast(from_channel)); + i->second.phys[cs] = j->second.ins; + ch[cs].users.insert(*j); + ch[from_channel].users.erase(j); + return; + } + } + + /*UI.PrintLn( + "collision @%u: [%ld] <- ins[%3u]", + c, + //ch[c].midiins<128?'M':'P', ch[c].midiins&127, + ch[c].age, //adlins[ch[c].insmeta].ms_sound_kon, + ins + );*/ + // Kill it + NoteUpdate(j->first.MidCh, + i, + Upd_Off, + static_cast(from_channel)); +} + +void MIDIplay::Panic() +{ + for(uint8_t chan = 0; chan < Ch.size(); chan++) + { + for(uint8_t note = 0; note < 128; note++) + realTime_NoteOff(chan, note); + } +} + +void MIDIplay::KillSustainingNotes(int32_t MidCh, int32_t this_adlchn) +{ + uint32_t first = 0, last = opl.NumChannels; + + if(this_adlchn >= 0) + { + first = static_cast(this_adlchn); + last = first + 1; + } + + for(unsigned c = first; c < last; ++c) + { + if(ch[c].users.empty()) continue; // Nothing to do + + for(AdlChannel::users_t::iterator + jnext = ch[c].users.begin(); + jnext != ch[c].users.end(); + ) + { + AdlChannel::users_t::iterator j(jnext++); + + if((MidCh < 0 || j->first.MidCh == MidCh) + && j->second.sustained) + { + int midiins = '?'; + if(hooks.onNote) + hooks.onNote(hooks.onNote_userData, (int)c, j->first.note, midiins, 0, 0.0); + ch[c].users.erase(j); + } + } + + // Keyoff the channel, if there are no users left. + if(ch[c].users.empty()) + opl.NoteOff(c); + } +} + +void MIDIplay::SetRPN(unsigned MidCh, unsigned value, bool MSB) +{ + bool nrpn = Ch[MidCh].nrpn; + unsigned addr = Ch[MidCh].lastmrpn * 0x100 + Ch[MidCh].lastlrpn; + + switch(addr + nrpn * 0x10000 + MSB * 0x20000) + { + case 0x0000 + 0*0x10000 + 1*0x20000: // Pitch-bender sensitivity + Ch[MidCh].bendsense = value / 8192.0; + break; + case 0x0108 + 1*0x10000 + 1*0x20000: // Vibrato speed + if(value == 64) Ch[MidCh].vibspeed = 1.0; + else if(value < 100) Ch[MidCh].vibspeed = 1.0 / (1.6e-2 * (value ? value : 1)); + else Ch[MidCh].vibspeed = 1.0 / (0.051153846 * value - 3.4965385); + Ch[MidCh].vibspeed *= 2 * 3.141592653 * 5.0; + break; + case 0x0109 + 1*0x10000 + 1*0x20000: // Vibrato depth + Ch[MidCh].vibdepth = ((value - 64) * 0.15) * 0.01; + break; + case 0x010A + 1*0x10000 + 1*0x20000: // Vibrato delay in millisecons + Ch[MidCh].vibdelay = value ? int64_t(0.2092 * std::exp(0.0795 * (double)value)) : 0; + break; + default:/* UI.PrintLn("%s %04X <- %d (%cSB) (ch %u)", + "NRPN"+!nrpn, addr, value, "LM"[MSB], MidCh);*/ + break; + } +} + +//void MIDIplay::UpdatePortamento(unsigned MidCh) +//{ +// // mt = 2^(portamento/2048) * (1.0 / 5000.0) +// /* +// double mt = std::exp(0.00033845077 * Ch[MidCh].portamento); +// NoteUpdate_All(MidCh, Upd_Pitch); +// */ +// //UI.PrintLn("Portamento %u: %u (unimplemented)", MidCh, Ch[MidCh].portamento); +//} + +void MIDIplay::NoteUpdate_All(uint16_t MidCh, unsigned props_mask) +{ + for(MIDIchannel::activenoteiterator + i = Ch[MidCh].activenotes.begin(); + i != Ch[MidCh].activenotes.end(); + ) + { + MIDIchannel::activenoteiterator j(i++); + NoteUpdate(MidCh, j, props_mask); + } +} + +void MIDIplay::NoteOff(uint16_t MidCh, uint8_t note) +{ + MIDIchannel::activenoteiterator + i = Ch[MidCh].activenotes.find(note); + + if(i != Ch[MidCh].activenotes.end()) + NoteUpdate(MidCh, i, Upd_Off); +} + + +void MIDIplay::UpdateVibrato(double amount) +{ + for(size_t a = 0, b = Ch.size(); a < b; ++a) + { + if(Ch[a].vibrato && !Ch[a].activenotes.empty()) + { + NoteUpdate_All(static_cast(a), Upd_Pitch); + Ch[a].vibpos += amount * Ch[a].vibspeed; + } + else + Ch[a].vibpos = 0.0; + } +} + + + + +uint64_t MIDIplay::ChooseDevice(const std::string &name) +{ + std::map::iterator i = devices.find(name); + + if(i != devices.end()) + return i->second; + + size_t n = devices.size() * 16; + devices.insert(std::make_pair(name, n)); + Ch.resize(n + 16); + return n; +} + +void MIDIplay::UpdateArpeggio(double) // amount = amount of time passed +{ + // If there is an adlib channel that has multiple notes + // simulated on the same channel, arpeggio them. + #if 0 + const unsigned desired_arpeggio_rate = 40; // Hz (upper limit) + #if 1 + static unsigned cache = 0; + amount = amount; // Ignore amount. Assume we get a constant rate. + cache += MaxSamplesAtTime * desired_arpeggio_rate; + + if(cache < PCM_RATE) return; + + cache %= PCM_RATE; + #else + static double arpeggio_cache = 0; + arpeggio_cache += amount * desired_arpeggio_rate; + + if(arpeggio_cache < 1.0) return; + + arpeggio_cache = 0.0; + #endif + #endif + static unsigned arpeggio_counter = 0; + ++arpeggio_counter; + + for(uint32_t c = 0; c < opl.NumChannels; ++c) + { +retry_arpeggio: + if(c > uint32_t(std::numeric_limits::max())) + break; + + size_t n_users = ch[c].users.size(); + + if(n_users > 1) + { + AdlChannel::users_t::const_iterator i = ch[c].users.begin(); + size_t rate_reduction = 3; + + if(n_users >= 3) + rate_reduction = 2; + + if(n_users >= 4) + rate_reduction = 1; + + std::advance(i, (arpeggio_counter / rate_reduction) % n_users); + + if(i->second.sustained == false) + { + if(i->second.kon_time_until_neglible <= 0l) + { + NoteUpdate( + i->first.MidCh, + Ch[ i->first.MidCh ].activenotes.find(i->first.note), + Upd_Off, + static_cast(c)); + goto retry_arpeggio; + } + + NoteUpdate( + i->first.MidCh, + Ch[ i->first.MidCh ].activenotes.find(i->first.note), + Upd_Pitch | Upd_Volume | Upd_Pan, + static_cast(c)); + } + } + } +} + + +#ifndef ADLMIDI_DISABLE_CPP_EXTRAS + +ADLMIDI_EXPORT AdlInstrumentTester::AdlInstrumentTester(ADL_MIDIPlayer *device) +{ + cur_gm = 0; + ins_idx = 0; + play = reinterpret_cast(device->adl_midiPlayer); + if(!play) + return; + opl = &play->opl; +} + +ADLMIDI_EXPORT AdlInstrumentTester::~AdlInstrumentTester() +{} + +ADLMIDI_EXPORT void AdlInstrumentTester::FindAdlList() +{ + const unsigned NumBanks = (unsigned)adl_getBanksCount(); + std::set adl_ins_set; + for(unsigned bankno = 0; bankno < NumBanks; ++bankno) + adl_ins_set.insert(banks[bankno][cur_gm]); + adl_ins_list.assign(adl_ins_set.begin(), adl_ins_set.end()); + ins_idx = 0; + NextAdl(0); + opl->Silence(); +} + + + +ADLMIDI_EXPORT void AdlInstrumentTester::Touch(unsigned c, unsigned volume) // Volume maxes at 127*127*127 +{ + if(opl->LogarithmicVolumes) + opl->Touch_Real(c, volume * 127 / (127 * 127 * 127) / 2); + else + { + // The formula below: SOLVE(V=127^3 * 2^( (A-63.49999) / 8), A) + opl->Touch_Real(c, volume > 8725 ? static_cast(std::log((double)volume) * 11.541561 + (0.5 - 104.22845)) : 0); + // The incorrect formula below: SOLVE(V=127^3 * (2^(A/63)-1), A) + //Touch_Real(c, volume>11210 ? 91.61112 * std::log(4.8819E-7*volume + 1.0)+0.5 : 0); + } +} + +ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note) +{ + if(adl_ins_list.empty()) FindAdlList(); + const unsigned meta = adl_ins_list[ins_idx]; + const adlinsdata &ains = opl->GetAdlMetaIns(meta); + + int tone = (cur_gm & 128) ? (cur_gm & 127) : (note + 50); + if(ains.tone) + { + /*if(ains.tone < 20) + tone += ains.tone; + else */ + if(ains.tone < 128) + tone = ains.tone; + else + tone -= ains.tone - 128; + } + double hertz = 172.00093 * std::exp(0.057762265 * (tone + 0.0)); + int i[2] = { ains.adlno1, ains.adlno2 }; + int32_t adlchannel[2] = { 0, 3 }; + if(i[0] == i[1]) + { + adlchannel[1] = -1; + adlchannel[0] = 6; // single-op + if(play->hooks.onDebugMessage) + { + play->hooks.onDebugMessage(play->hooks.onDebugMessage_userData, + "noteon at %d(%d) for %g Hz\n", adlchannel[0], i[0], hertz); + } + } + else + { + if(play->hooks.onDebugMessage) + { + play->hooks.onDebugMessage(play->hooks.onDebugMessage_userData, + "noteon at %d(%d) and %d(%d) for %g Hz\n", adlchannel[0], i[0], adlchannel[1], i[1], hertz); + } + } + + opl->NoteOff(0); + opl->NoteOff(3); + opl->NoteOff(6); + for(unsigned c = 0; c < 2; ++c) + { + if(adlchannel[c] < 0) continue; + opl->Patch((uint16_t)adlchannel[c], (uint16_t)i[c]); + opl->Touch_Real((uint16_t)adlchannel[c], 127 * 127 * 100); + opl->Pan((uint16_t)adlchannel[c], 0x30); + opl->NoteOn((uint16_t)adlchannel[c], hertz); + } +} + +ADLMIDI_EXPORT void AdlInstrumentTester::NextGM(int offset) +{ + cur_gm = (cur_gm + 256 + (uint32_t)offset) & 0xFF; + FindAdlList(); +} + +ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset) +{ + if(adl_ins_list.empty()) FindAdlList(); + const unsigned NumBanks = (unsigned)adl_getBanksCount(); + ins_idx = (uint32_t)((int32_t)ins_idx + (int32_t)adl_ins_list.size() + offset) % adl_ins_list.size(); + + #if 0 + UI.Color(15); + std::fflush(stderr); + std::printf("SELECTED G%c%d\t%s\n", + cur_gm < 128 ? 'M' : 'P', cur_gm < 128 ? cur_gm + 1 : cur_gm - 128, + "<-> select GM, ^v select ins, qwe play note"); + std::fflush(stdout); + UI.Color(7); + std::fflush(stderr); + #endif + + for(unsigned a = 0; a < adl_ins_list.size(); ++a) + { + const unsigned i = adl_ins_list[a]; + const adlinsdata &ains = opl->GetAdlMetaIns(i); + + char ToneIndication[8] = " "; + if(ains.tone) + { + /*if(ains.tone < 20) + std::sprintf(ToneIndication, "+%-2d", ains.tone); + else*/ + if(ains.tone < 128) + std::sprintf(ToneIndication, "=%-2d", ains.tone); + else + std::sprintf(ToneIndication, "-%-2d", ains.tone - 128); + } + std::printf("%s%s%s%u\t", + ToneIndication, + ains.adlno1 != ains.adlno2 ? "[2]" : " ", + (ins_idx == a) ? "->" : "\t", + i + ); + + for(unsigned bankno = 0; bankno < NumBanks; ++bankno) + if(banks[bankno][cur_gm] == i) + std::printf(" %u", bankno); + + std::printf("\n"); + } +} + +ADLMIDI_EXPORT bool AdlInstrumentTester::HandleInputChar(char ch) +{ + static const char notes[] = "zsxdcvgbhnjmq2w3er5t6y7ui9o0p"; + // c'd'ef'g'a'bC'D'EF'G'A'Bc'd'e + switch(ch) + { + case '/': + case 'H': + case 'A': + NextAdl(-1); + break; + case '*': + case 'P': + case 'B': + NextAdl(+1); + break; + case '-': + case 'K': + case 'D': + NextGM(-1); + break; + case '+': + case 'M': + case 'C': + NextGM(+1); + break; + case 3: + #if !((!defined(__WIN32__) || defined(__CYGWIN__)) && !defined(__DJGPP__)) + case 27: + #endif + return false; + default: + const char *p = std::strchr(notes, ch); + if(p && *p) + DoNote((int)(p - notes) - 12); + } + return true; +} + +#endif//ADLMIDI_DISABLE_CPP_EXTRAS diff --git a/src/sound/adlmidi/adlmidi_mus2mid.h b/src/sound/adlmidi/adlmidi_mus2mid.h new file mode 100644 index 000000000..cc41b87a1 --- /dev/null +++ b/src/sound/adlmidi/adlmidi_mus2mid.h @@ -0,0 +1,49 @@ +/* + * MUS2MIDI: DMX (DOOM) MUS to MIDI Library Header + * + * Copyright (C) 2014-2016 Bret Curtis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef MUSLIB_H +#define MUSLIB_H + +#include + +#ifdef __DJGPP__ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed long int32_t; +typedef unsigned long uint32_t; +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +int AdlMidi_mus2midi(uint8_t *in, uint32_t insize, + uint8_t **out, uint32_t *outsize, + uint16_t frequency); + +#ifdef __cplusplus +} +#endif + +#endif /* MUSLIB_H */ diff --git a/src/sound/adlmidi/adlmidi_opl3.cpp b/src/sound/adlmidi/adlmidi_opl3.cpp new file mode 100644 index 000000000..7ac8f309a --- /dev/null +++ b/src/sound/adlmidi/adlmidi_opl3.cpp @@ -0,0 +1,626 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "adlmidi_private.hpp" + +#ifdef ADLMIDI_HW_OPL +static const unsigned OPLBase = 0x388; +#endif + +#ifdef DISABLE_EMBEDDED_BANKS +/* + Dummy data which replaces adldata.cpp banks database +*/ + +const struct adldata adl[] = +{ + {0, 0, (unsigned char)'\0', (unsigned char)'\0', (unsigned char)'\0', 0} +}; + +const struct adlinsdata adlins[] = +{ + {0, 0, 0, 0, 0, 0, 0.0} +}; + +int maxAdlBanks() +{ + return 0; +} + +const unsigned short banks[][256] = {{0}}; +const char *const banknames[] = {""}; +const AdlBankSetup adlbanksetup[] = {{0, 1, 1, 0, 0}}; +#endif + +static const unsigned short Operators[23 * 2] = +{ + // Channels 0-2 + 0x000, 0x003, 0x001, 0x004, 0x002, 0x005, // operators 0, 3, 1, 4, 2, 5 + // Channels 3-5 + 0x008, 0x00B, 0x009, 0x00C, 0x00A, 0x00D, // operators 6, 9, 7,10, 8,11 + // Channels 6-8 + 0x010, 0x013, 0x011, 0x014, 0x012, 0x015, // operators 12,15, 13,16, 14,17 + // Same for second card + 0x100, 0x103, 0x101, 0x104, 0x102, 0x105, // operators 18,21, 19,22, 20,23 + 0x108, 0x10B, 0x109, 0x10C, 0x10A, 0x10D, // operators 24,27, 25,28, 26,29 + 0x110, 0x113, 0x111, 0x114, 0x112, 0x115, // operators 30,33, 31,34, 32,35 + // Channel 18 + 0x010, 0x013, // operators 12,15 + // Channel 19 + 0x014, 0xFFF, // operator 16 + // Channel 19 + 0x012, 0xFFF, // operator 14 + // Channel 19 + 0x015, 0xFFF, // operator 17 + // Channel 19 + 0x011, 0xFFF +}; // operator 13 + +static const unsigned short Channels[23] = +{ + 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, // 0..8 + 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, // 9..17 (secondary set) + 0x006, 0x007, 0x008, 0xFFF, 0xFFF +}; // <- hw percussions, 0xFFF = no support for pitch/pan + +/* + In OPL3 mode: + 0 1 2 6 7 8 9 10 11 16 17 18 + op0 op1 op2 op12 op13 op14 op18 op19 op20 op30 op31 op32 + op3 op4 op5 op15 op16 op17 op21 op22 op23 op33 op34 op35 + 3 4 5 13 14 15 + op6 op7 op8 op24 op25 op26 + op9 op10 op11 op27 op28 op29 + Ports: + +0 +1 +2 +10 +11 +12 +100 +101 +102 +110 +111 +112 + +3 +4 +5 +13 +14 +15 +103 +104 +105 +113 +114 +115 + +8 +9 +A +108 +109 +10A + +B +C +D +10B +10C +10D + + Percussion: + bassdrum = op(0): 0xBD bit 0x10, operators 12 (0x10) and 15 (0x13) / channels 6, 6b + snare = op(3): 0xBD bit 0x08, operators 16 (0x14) / channels 7b + tomtom = op(4): 0xBD bit 0x04, operators 14 (0x12) / channels 8 + cym = op(5): 0xBD bit 0x02, operators 17 (0x17) / channels 8b + hihat = op(2): 0xBD bit 0x01, operators 13 (0x11) / channels 7 + + + In OPTi mode ("extended FM" in 82C924, 82C925, 82C931 chips): + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + op0 op4 op6 op10 op12 op16 op18 op22 op24 op28 op30 op34 op36 op38 op40 op42 op44 op46 + op1 op5 op7 op11 op13 op17 op19 op23 op25 op29 op31 op35 op37 op39 op41 op43 op45 op47 + op2 op8 op14 op20 op26 op32 + op3 op9 op15 op21 op27 op33 for a total of 6 quad + 12 dual + Ports: ??? +*/ + + +const adlinsdata &OPL3::GetAdlMetaIns(size_t n) +{ + return (n & DynamicMetaInstrumentTag) ? + dynamic_metainstruments[n & ~DynamicMetaInstrumentTag] + : adlins[n]; +} + +size_t OPL3::GetAdlMetaNumber(size_t midiins) +{ + return (AdlBank == ~0u) ? + (midiins | DynamicMetaInstrumentTag) + : banks[AdlBank][midiins]; +} + +const adldata &OPL3::GetAdlIns(size_t insno) +{ + return (insno & DynamicInstrumentTag) + ? dynamic_instruments[insno & ~DynamicInstrumentTag] + : adl[insno]; +} + +void OPL3::setEmbeddedBank(unsigned int bank) +{ + AdlBank = bank; + //Embedded banks are supports 128:128 GM set only + dynamic_percussion_offset = 128; + dynamic_melodic_banks.clear(); + dynamic_percussion_banks.clear(); +} + + +OPL3::OPL3() : + dynamic_percussion_offset(128), + DynamicInstrumentTag(0x8000u), + DynamicMetaInstrumentTag(0x4000000u), + NumCards(1), + AdlBank(0), + NumFourOps(0), + HighTremoloMode(false), + HighVibratoMode(false), + AdlPercussionMode(false), + LogarithmicVolumes(false), + //CartoonersVolumes(false), + m_musicMode(MODE_MIDI), + m_volumeScale(VOLUME_Generic) +{} + +void OPL3::Poke(size_t card, uint32_t index, uint32_t value) +{ + #ifdef ADLMIDI_HW_OPL + (void)card; + unsigned o = index >> 8; + unsigned port = OPLBase + o * 2; + + #ifdef __DJGPP__ + outportb(port, index); + for(unsigned c = 0; c < 6; ++c) inportb(port); + outportb(port + 1, value); + for(unsigned c = 0; c < 35; ++c) inportb(port); + #endif//__DJGPP__ + + #ifdef __WATCOMC__ + outp(port, index); + for(uint16_t c = 0; c < 6; ++c) inp(port); + outp(port + 1, value); + for(uint16_t c = 0; c < 35; ++c) inp(port); + #endif//__WATCOMC__ + + #else//ADLMIDI_HW_OPL + + #ifdef ADLMIDI_USE_DOSBOX_OPL + cards[card].WriteReg(index, static_cast(value)); + #else + OPL3_WriteReg(&cards[card], static_cast(index), static_cast(value)); + #endif + + #endif//ADLMIDI_HW_OPL +} + +void OPL3::PokeN(size_t card, uint16_t index, uint8_t value) +{ + #ifdef ADLMIDI_HW_OPL + (void)card; + unsigned o = index >> 8; + unsigned port = OPLBase + o * 2; + + #ifdef __DJGPP__ + outportb(port, index); + for(unsigned c = 0; c < 6; ++c) inportb(port); + outportb(port + 1, value); + for(unsigned c = 0; c < 35; ++c) inportb(port); + #endif + + #ifdef __WATCOMC__ + outp(port, index); + for(uint16_t c = 0; c < 6; ++c) inp(port); + outp(port + 1, value); + for(uint16_t c = 0; c < 35; ++c) inp(port); + #endif//__WATCOMC__ + + #else + #ifdef ADLMIDI_USE_DOSBOX_OPL + cards[card].WriteReg(static_cast(index), value); + #else + OPL3_WriteReg(&cards[card], index, value); + #endif + #endif +} + + +void OPL3::NoteOff(size_t c) +{ + size_t card = c / 23, cc = c % 23; + + if(cc >= 18) + { + regBD[card] &= ~(0x10 >> (cc - 18)); + Poke(card, 0xBD, regBD[card]); + return; + } + + Poke(card, 0xB0 + Channels[cc], pit[c] & 0xDF); +} + +void OPL3::NoteOn(unsigned c, double hertz) // Hertz range: 0..131071 +{ + unsigned card = c / 23, cc = c % 23; + unsigned x = 0x2000; + + if(hertz < 0 || hertz > 131071) // Avoid infinite loop + return; + + while(hertz >= 1023.5) + { + hertz /= 2.0; // Calculate octave + x += 0x400; + } + + x += static_cast(hertz + 0.5); + unsigned chn = Channels[cc]; + + if(cc >= 18) + { + regBD[card] |= (0x10 >> (cc - 18)); + Poke(card, 0x0BD, regBD[card]); + x &= ~0x2000u; + //x |= 0x800; // for test + } + + if(chn != 0xFFF) + { + Poke(card, 0xA0 + chn, x & 0xFF); + Poke(card, 0xB0 + chn, pit[c] = static_cast(x >> 8)); + } +} + +void OPL3::Touch_Real(unsigned c, unsigned volume, uint8_t brightness) +{ + if(volume > 63) + volume = 63; + + size_t card = c / 23, cc = c % 23; + size_t i = ins[c]; + uint16_t o1 = Operators[cc * 2 + 0]; + uint16_t o2 = Operators[cc * 2 + 1]; + const adldata &adli = GetAdlIns(i); + uint8_t x = adli.modulator_40, y = adli.carrier_40; + uint16_t mode = 1; // 2-op AM + + if(four_op_category[c] == 0 || four_op_category[c] == 3) + { + mode = adli.feedconn & 1; // 2-op FM or 2-op AM + } + else if(four_op_category[c] == 1 || four_op_category[c] == 2) + { + size_t i0, i1; + + if(four_op_category[c] == 1) + { + i0 = i; + i1 = ins[c + 3]; + mode = 2; // 4-op xx-xx ops 1&2 + } + else + { + i0 = ins[c - 3]; + i1 = i; + mode = 6; // 4-op xx-xx ops 3&4 + } + + mode += (GetAdlIns(i0).feedconn & 1) + (GetAdlIns(i1).feedconn & 1) * 2; + } + + static const bool do_ops[10][2] = + { + { false, true }, /* 2 op FM */ + { true, true }, /* 2 op AM */ + { false, false }, /* 4 op FM-FM ops 1&2 */ + { true, false }, /* 4 op AM-FM ops 1&2 */ + { false, true }, /* 4 op FM-AM ops 1&2 */ + { true, false }, /* 4 op AM-AM ops 1&2 */ + { false, true }, /* 4 op FM-FM ops 3&4 */ + { false, true }, /* 4 op AM-FM ops 3&4 */ + { false, true }, /* 4 op FM-AM ops 3&4 */ + { true, true } /* 4 op AM-AM ops 3&4 */ + }; + + if(m_musicMode == MODE_RSXX) + { + Poke(card, 0x40 + o1, x); + if(o2 != 0xFFF) + Poke(card, 0x40 + o2, y - volume / 2); + } + else + { + bool do_modulator = do_ops[ mode ][ 0 ] || ScaleModulators; + bool do_carrier = do_ops[ mode ][ 1 ] || ScaleModulators; + + uint32_t modulator = do_modulator ? (x | 63) - volume + volume * (x & 63) / 63 : x; + uint32_t carrier = do_carrier ? (y | 63) - volume + volume * (y & 63) / 63 : y; + + if(brightness != 127) + { + brightness = static_cast(::round(127.0 * ::sqrt((static_cast(brightness)) * (1.0 / 127.0))) / 2.0); + if(!do_modulator) + modulator = (modulator | 63) - brightness + brightness * (modulator & 63) / 63; + if(!do_carrier) + carrier = (carrier | 63) - brightness + brightness * (carrier & 63) / 63; + } + + Poke(card, 0x40 + o1, modulator); + if(o2 != 0xFFF) + Poke(card, 0x40 + o2, carrier); + } + + // Correct formula (ST3, AdPlug): + // 63-((63-(instrvol))/63)*chanvol + // Reduces to (tested identical): + // 63 - chanvol + chanvol*instrvol/63 + // Also (slower, floats): + // 63 + chanvol * (instrvol / 63.0 - 1) +} + +/* +void OPL3::Touch(unsigned c, unsigned volume) // Volume maxes at 127*127*127 +{ + if(LogarithmicVolumes) + Touch_Real(c, volume * 127 / (127 * 127 * 127) / 2); + else + { + // The formula below: SOLVE(V=127^3 * 2^( (A-63.49999) / 8), A) + Touch_Real(c, volume > 8725 ? static_cast(std::log(volume) * 11.541561 + (0.5 - 104.22845)) : 0); + // The incorrect formula below: SOLVE(V=127^3 * (2^(A/63)-1), A) + //Touch_Real(c, volume>11210 ? 91.61112 * std::log(4.8819E-7*volume + 1.0)+0.5 : 0); + } +}*/ + +void OPL3::Patch(uint16_t c, size_t i) +{ + uint16_t card = c / 23, cc = c % 23; + static const uint8_t data[4] = {0x20, 0x60, 0x80, 0xE0}; + ins[c] = i; + uint16_t o1 = Operators[cc * 2 + 0]; + uint16_t o2 = Operators[cc * 2 + 1]; + const adldata &adli = GetAdlIns(i); + unsigned x = adli.modulator_E862, y = adli.carrier_E862; + + for(unsigned a = 0; a < 4; ++a, x >>= 8, y >>= 8) + { + Poke(card, data[a] + o1, x & 0xFF); + if(o2 != 0xFFF) + Poke(card, data[a] + o2, y & 0xFF); + } +} + +void OPL3::Pan(unsigned c, unsigned value) +{ + unsigned card = c / 23, cc = c % 23; + + if(Channels[cc] != 0xFFF) + Poke(card, 0xC0 + Channels[cc], GetAdlIns(ins[c]).feedconn | value); +} + +void OPL3::Silence() // Silence all OPL channels. +{ + for(unsigned c = 0; c < NumChannels; ++c) + { + NoteOff(c); + Touch_Real(c, 0); + } +} + +void OPL3::updateFlags() +{ + unsigned fours = NumFourOps; + + for(unsigned card = 0; card < NumCards; ++card) + { + Poke(card, 0x0BD, regBD[card] = (HighTremoloMode * 0x80 + + HighVibratoMode * 0x40 + + AdlPercussionMode * 0x20)); + unsigned fours_this_card = std::min(fours, 6u); + Poke(card, 0x104, (1 << fours_this_card) - 1); + fours -= fours_this_card; + } + + // Mark all channels that are reserved for four-operator function + if(AdlPercussionMode == 1) + for(unsigned a = 0; a < NumCards; ++a) + { + for(unsigned b = 0; b < 5; ++b) + four_op_category[a * 23 + 18 + b] = static_cast(b + 3); + for(unsigned b = 0; b < 3; ++b) + four_op_category[a * 23 + 6 + b] = 8; + } + + unsigned nextfour = 0; + + for(unsigned a = 0; a < NumFourOps; ++a) + { + four_op_category[nextfour ] = 1; + four_op_category[nextfour + 3] = 2; + + switch(a % 6) + { + case 0: + case 1: + nextfour += 1; + break; + case 2: + nextfour += 9 - 2; + break; + case 3: + case 4: + nextfour += 1; + break; + case 5: + nextfour += 23 - 9 - 2; + break; + } + } +} + +void OPL3::updateDeepFlags() +{ + for(unsigned card = 0; card < NumCards; ++card) + { + Poke(card, 0x0BD, regBD[card] = (HighTremoloMode * 0x80 + + HighVibratoMode * 0x40 + + AdlPercussionMode * 0x20)); + } +} + +void OPL3::ChangeVolumeRangesModel(ADLMIDI_VolumeModels volumeModel) +{ + switch(volumeModel) + { + case ADLMIDI_VolumeModel_AUTO://Do nothing until restart playing + break; + + case ADLMIDI_VolumeModel_Generic: + m_volumeScale = OPL3::VOLUME_Generic; + break; + + case ADLMIDI_VolumeModel_CMF: + LogarithmicVolumes = true; + m_volumeScale = OPL3::VOLUME_CMF; + break; + + case ADLMIDI_VolumeModel_DMX: + m_volumeScale = OPL3::VOLUME_DMX; + break; + + case ADLMIDI_VolumeModel_APOGEE: + m_volumeScale = OPL3::VOLUME_APOGEE; + break; + + case ADLMIDI_VolumeModel_9X: + m_volumeScale = OPL3::VOLUME_9X; + break; + } +} + +void OPL3::Reset(unsigned long PCM_RATE) +{ + #ifndef ADLMIDI_HW_OPL + #ifdef ADLMIDI_USE_DOSBOX_OPL + DBOPL::Handler emptyChip; //Constructors inside are will initialize necessary fields + #else + _opl3_chip emptyChip; + std::memset(&emptyChip, 0, sizeof(_opl3_chip)); + #endif + cards.clear(); + #endif + (void)PCM_RATE; + ins.clear(); + pit.clear(); + regBD.clear(); + #ifndef ADLMIDI_HW_OPL + cards.resize(NumCards, emptyChip); + #endif + NumChannels = NumCards * 23; + ins.resize(NumChannels, 189); + pit.resize(NumChannels, 0); + regBD.resize(NumCards, 0); + four_op_category.resize(NumChannels, 0); + + for(unsigned p = 0, a = 0; a < NumCards; ++a) + { + for(unsigned b = 0; b < 18; ++b) four_op_category[p++] = 0; + for(unsigned b = 0; b < 5; ++b) four_op_category[p++] = 8; + } + + static const uint16_t data[] = + { + 0x004, 96, 0x004, 128, // Pulse timer + 0x105, 0, 0x105, 1, 0x105, 0, // Pulse OPL3 enable + 0x001, 32, 0x105, 1 // Enable wave, OPL3 extensions + }; + unsigned fours = NumFourOps; + + for(unsigned card = 0; card < NumCards; ++card) + { + #ifndef ADLMIDI_HW_OPL + # ifdef ADLMIDI_USE_DOSBOX_OPL + cards[card].Init(PCM_RATE); + # else + OPL3_Reset(&cards[card], static_cast(PCM_RATE)); + # endif + #endif + + for(unsigned a = 0; a < 18; ++a) Poke(card, 0xB0 + Channels[a], 0x00); + for(unsigned a = 0; a < sizeof(data) / sizeof(*data); a += 2) + PokeN(card, data[a], static_cast(data[a + 1])); + Poke(card, 0x0BD, regBD[card] = (HighTremoloMode * 0x80 + + HighVibratoMode * 0x40 + + AdlPercussionMode * 0x20)); + unsigned fours_this_card = std::min(fours, 6u); + Poke(card, 0x104, (1 << fours_this_card) - 1); + //fprintf(stderr, "Card %u: %u four-ops.\n", card, fours_this_card); + fours -= fours_this_card; + } + + // Mark all channels that are reserved for four-operator function + if(AdlPercussionMode == 1) + { + for(unsigned a = 0; a < NumCards; ++a) + { + for(unsigned b = 0; b < 5; ++b) four_op_category[a * 23 + 18 + b] = static_cast(b + 3); + for(unsigned b = 0; b < 3; ++b) four_op_category[a * 23 + 6 + b] = 8; + } + } + unsigned nextfour = 0; + + for(unsigned a = 0; a < NumFourOps; ++a) + { + four_op_category[nextfour ] = 1; + four_op_category[nextfour + 3] = 2; + + switch(a % 6) + { + case 0: + case 1: + nextfour += 1; + break; + + case 2: + nextfour += 9 - 2; + break; + + case 3: + case 4: + nextfour += 1; + break; + + case 5: + nextfour += 23 - 9 - 2; + break; + } + } + + /**/ + /* + In two-op mode, channels 0..8 go as follows: + Op1[port] Op2[port] + Channel 0: 00 00 03 03 + Channel 1: 01 01 04 04 + Channel 2: 02 02 05 05 + Channel 3: 06 08 09 0B + Channel 4: 07 09 10 0C + Channel 5: 08 0A 11 0D + Channel 6: 12 10 15 13 + Channel 7: 13 11 16 14 + Channel 8: 14 12 17 15 + In four-op mode, channels 0..8 go as follows: + Op1[port] Op2[port] Op3[port] Op4[port] + Channel 0: 00 00 03 03 06 08 09 0B + Channel 1: 01 01 04 04 07 09 10 0C + Channel 2: 02 02 05 05 08 0A 11 0D + Channel 3: CHANNEL 0 SLAVE + Channel 4: CHANNEL 1 SLAVE + Channel 5: CHANNEL 2 SLAVE + Channel 6: 12 10 15 13 + Channel 7: 13 11 16 14 + Channel 8: 14 12 17 15 + Same goes principally for channels 9-17 respectively. + */ + Silence(); +} diff --git a/src/sound/adlmidi/adlmidi_private.cpp b/src/sound/adlmidi/adlmidi_private.cpp new file mode 100644 index 000000000..1f3cb7ddd --- /dev/null +++ b/src/sound/adlmidi/adlmidi_private.cpp @@ -0,0 +1,83 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "adlmidi_private.hpp" + +std::string ADLMIDI_ErrorString; + +int adlRefreshNumCards(ADL_MIDIPlayer *device) +{ + unsigned n_fourop[2] = {0, 0}, n_total[2] = {0, 0}; + MIDIplay *play = reinterpret_cast(device->adl_midiPlayer); + + //Automatically calculate how much 4-operator channels is necessary + if(play->opl.AdlBank == ~0u) + { + //For custom bank + for(size_t a = 0; a < play->opl.dynamic_metainstruments.size(); ++a) + { + size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0; + ++n_total[div]; + adlinsdata &ins = play->opl.dynamic_metainstruments[a]; + if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + ++n_fourop[div]; + } + + play->m_setup.NumFourOps = + (n_fourop[0] >= 128 * 7 / 8) ? play->m_setup.NumCards * 6 + : (n_fourop[0] < 128 * 1 / 8) ? (n_fourop[1] > 0 ? 4 : 0) + : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); + } + else + { + //For embedded bank + for(unsigned a = 0; a < 256; ++a) + { + unsigned insno = banks[play->m_setup.AdlBank][a]; + if(insno == 198) + continue; + ++n_total[a / 128]; + const adlinsdata &ins = adlins[insno]; + if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + ++n_fourop[a / 128]; + } + + play->m_setup.NumFourOps = + (n_fourop[0] >= (n_total[0] % 128) * 7 / 8) ? play->m_setup.NumCards * 6 + : (n_fourop[0] < (n_total[0] % 128) * 1 / 8) ? 0 + : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); + } + + play->opl.NumFourOps = play->m_setup.NumFourOps; + + if(n_fourop[0] >= n_total[0] * 15 / 16 && play->m_setup.NumFourOps == 0) + { + play->setErrorString("ERROR: You have selected a bank that consists almost exclusively of four-op patches.\n" + " The results (silence + much cpu load) would be probably\n" + " not what you want, therefore ignoring the request.\n"); + return -1; + } + + return 0; +} + diff --git a/src/sound/adlmidi/adlmidi_private.hpp b/src/sound/adlmidi/adlmidi_private.hpp new file mode 100644 index 000000000..70cd9e30e --- /dev/null +++ b/src/sound/adlmidi/adlmidi_private.hpp @@ -0,0 +1,996 @@ +/* + * libADLMIDI is a free MIDI to WAV conversion library with OPL3 emulation + * + * Original ADLMIDI code: Copyright (c) 2010-2014 Joel Yliluoma + * ADLMIDI Library API: Copyright (c) 2015-2018 Vitaly Novichkov + * + * Library is based on the ADLMIDI, a MIDI player for Linux and Windows with OPL3 emulation: + * http://iki.fi/bisqwit/source/adlmidi.html + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ADLMIDI_PRIVATE_HPP +#define ADLMIDI_PRIVATE_HPP + +// Setup compiler defines useful for exporting required public API symbols in gme.cpp +#ifndef ADLMIDI_EXPORT +# if defined (_WIN32) && defined(ADLMIDI_BUILD_DLL) +# define ADLMIDI_EXPORT __declspec(dllexport) +# elif defined (LIBADLMIDI_VISIBILITY) +# define ADLMIDI_EXPORT __attribute__((visibility ("default"))) +# else +# define ADLMIDI_EXPORT +# endif +#endif + +#ifdef _WIN32 +#define NOMINMAX +#endif + +#if defined(_WIN32) && !defined(__WATCOMC__) +# undef NO_OLDNAMES +# include +# ifdef _MSC_VER +# ifdef _WIN64 +typedef __int64 ssize_t; +# else +typedef __int32 ssize_t; +# endif +# define NOMINMAX //Don't override std::min and std::max +# else +# ifdef _WIN64 +typedef int64_t ssize_t; +# else +typedef int32_t ssize_t; +# endif +# endif +# include +#endif + +#if defined(__DJGPP__) || (defined(__WATCOMC__) && (defined(__DOS__) || defined(__DOS4G__) || defined(__DOS4GNZ__))) +#define ADLMIDI_HW_OPL +#include +#ifdef __DJGPP__ +#include +#include +#include +#include +#include +#endif + +#endif + +#include +#include +#include +//#ifdef __WATCOMC__ +//#include //TODO: Implemnet a workaround for OpenWatcom to fix a crash while using those containers +//#include +//#else +#include +#include +//#endif +#include +#include +#include +#include +#include +#include // vector +#include // deque +#include // exp, log, ceil +#if defined(__WATCOMC__) +#include // round, sqrt +#endif +#include +#include +#include // numeric_limit + +#ifndef _WIN32 +#include +#endif + +#include +#include + +#ifdef _MSC_VER +#pragma warning(disable:4319) +#pragma warning(disable:4267) +#pragma warning(disable:4244) +#pragma warning(disable:4146) +#endif + +#include "fraction.hpp" + +#ifndef ADLMIDI_HW_OPL +#ifdef ADLMIDI_USE_DOSBOX_OPL +#include "dbopl.h" +#else +#include "nukedopl3.h" +#endif +#endif + +#include "adldata.hh" +#include "adlmidi.h" //Main API +#ifndef ADLMIDI_DISABLE_CPP_EXTRAS +#include "adlmidi.hpp" //Extra C++ API +#endif + +#define ADL_UNUSED(x) (void)x + +extern std::string ADLMIDI_ErrorString; + +/* + Smart pointer for C heaps, created with malloc() call. + FAQ: Why not std::shared_ptr? Because of Android NDK now doesn't supports it +*/ +template +class AdlMIDI_CPtr +{ + PTR *m_p; +public: + AdlMIDI_CPtr() : m_p(NULL) {} + ~AdlMIDI_CPtr() + { + reset(NULL); + } + + void reset(PTR *p = NULL) + { + if(m_p) + free(m_p); + m_p = p; + } + + PTR *get() + { + return m_p; + } + PTR &operator*() + { + return *m_p; + } + PTR *operator->() + { + return m_p; + } +}; + +class MIDIplay; +struct ADL_MIDIPlayer; +class OPL3 +{ +public: + friend class MIDIplay; + friend class AdlInstrumentTester; + uint32_t NumChannels; + char ____padding[4]; + ADL_MIDIPlayer *_parent; +#ifndef ADLMIDI_HW_OPL +# ifdef ADLMIDI_USE_DOSBOX_OPL + std::vector cards; +# else + std::vector<_opl3_chip> cards; +# endif +#endif +private: + std::vector ins; // index to adl[], cached, needed by Touch() + std::vector pit; // value poked to B0, cached, needed by NoteOff)( + std::vector regBD; + + friend int adlRefreshNumCards(ADL_MIDIPlayer *device); + //! Meta information about every instrument + std::vector dynamic_metainstruments; // Replaces adlins[] when CMF file + //! Raw instrument data ready to be sent to the chip + std::vector dynamic_instruments; // Replaces adl[] when CMF file + size_t dynamic_percussion_offset; + + typedef std::map BankMap; + BankMap dynamic_melodic_banks; + BankMap dynamic_percussion_banks; + const unsigned DynamicInstrumentTag /* = 0x8000u*/, + DynamicMetaInstrumentTag /* = 0x4000000u*/; + const adlinsdata &GetAdlMetaIns(size_t n); + size_t GetAdlMetaNumber(size_t midiins); + const adldata &GetAdlIns(size_t insno); +public: + void setEmbeddedBank(unsigned int bank); + + //! Total number of running concurrent emulated chips + unsigned int NumCards; + //! Currently running embedded bank number. "~0" means usign of the custom bank. + unsigned int AdlBank; + //! Total number of needed four-operator channels in all running chips + unsigned int NumFourOps; + //! Turn global Deep Tremolo mode on + bool HighTremoloMode; + //! Turn global Deep Vibrato mode on + bool HighVibratoMode; + //! Use AdLib percussion mode + bool AdlPercussionMode; + //! Carriers-only are scaled by default by volume level. This flag will tell to scale modulators too. + bool ScaleModulators; + //! Required to play CMF files. Can be turned on by using of "CMF" volume model + bool LogarithmicVolumes; + // ! Required to play EA-MUS files [REPLACED WITH "m_musicMode", DEPRECATED!!!] + //bool CartoonersVolumes; + enum MusicMode + { + MODE_MIDI, + MODE_IMF, + MODE_CMF, + MODE_RSXX + } m_musicMode; + //! Just a padding. Reserved. + char ___padding2[3]; + //! Volume models enum + enum VolumesScale + { + VOLUME_Generic, + VOLUME_CMF, + VOLUME_DMX, + VOLUME_APOGEE, + VOLUME_9X + } m_volumeScale; + + OPL3(); + char ____padding3[8]; + std::vector four_op_category; // 1 = quad-master, 2 = quad-slave, 0 = regular + // 3 = percussion BassDrum + // 4 = percussion Snare + // 5 = percussion Tom + // 6 = percussion Crash cymbal + // 7 = percussion Hihat + // 8 = percussion slave + + void Poke(size_t card, uint32_t index, uint32_t value); + void PokeN(size_t card, uint16_t index, uint8_t value); + + void NoteOff(size_t c); + void NoteOn(unsigned c, double hertz); + void Touch_Real(unsigned c, unsigned volume, uint8_t brightness = 127); + //void Touch(unsigned c, unsigned volume) + + void Patch(uint16_t c, size_t i); + void Pan(unsigned c, unsigned value); + void Silence(); + void updateFlags(); + void updateDeepFlags(); + void ChangeVolumeRangesModel(ADLMIDI_VolumeModels volumeModel); + void Reset(unsigned long PCM_RATE); +}; + + +/** + * @brief Hooks of the internal events + */ +struct MIDIEventHooks +{ + MIDIEventHooks() : + onEvent(NULL), + onEvent_userData(NULL), + onNote(NULL), + onNote_userData(NULL), + onDebugMessage(NULL), + onDebugMessage_userData(NULL) + {} + //! Raw MIDI event hook + typedef void (*RawEventHook)(void *userdata, uint8_t type, uint8_t subtype, uint8_t channel, const uint8_t *data, size_t len); + RawEventHook onEvent; + void *onEvent_userData; + + //! Note on/off hooks + typedef void (*NoteHook)(void *userdata, int adlchn, int note, int ins, int pressure, double bend); + NoteHook onNote; + void *onNote_userData; + + //! Library internal debug messages + typedef void (*DebugMessageHook)(void *userdata, const char *fmt, ...); + DebugMessageHook onDebugMessage; + void *onDebugMessage_userData; +}; + + +class MIDIplay +{ + friend void adl_reset(struct ADL_MIDIPlayer*); +public: + MIDIplay(unsigned long sampleRate = 22050); + + ~MIDIplay() + {} + + void applySetup(); + + /**********************Internal structures and classes**********************/ + + /** + * @brief A little class gives able to read filedata from disk and also from a memory segment + */ + class fileReader + { + public: + enum relTo + { + SET = 0, + CUR = 1, + END = 2 + }; + + fileReader() + { + fp = NULL; + mp = NULL; + mp_size = 0; + mp_tell = 0; + } + ~fileReader() + { + close(); + } + + void openFile(const char *path) + { + #if !defined(_WIN32) || defined(__WATCOMC__) + fp = std::fopen(path, "rb"); + #else + wchar_t widePath[MAX_PATH]; + int size = MultiByteToWideChar(CP_UTF8, 0, path, (int)std::strlen(path), widePath, MAX_PATH); + widePath[size] = '\0'; + fp = _wfopen(widePath, L"rb"); + #endif + _fileName = path; + mp = NULL; + mp_size = 0; + mp_tell = 0; + } + + void openData(const void *mem, size_t lenght) + { + fp = NULL; + mp = mem; + mp_size = lenght; + mp_tell = 0; + } + + void seek(long pos, int rel_to) + { + if(fp) + std::fseek(fp, pos, rel_to); + else + { + switch(rel_to) + { + case SET: + mp_tell = static_cast(pos); + break; + + case END: + mp_tell = mp_size - static_cast(pos); + break; + + case CUR: + mp_tell = mp_tell + static_cast(pos); + break; + } + + if(mp_tell > mp_size) + mp_tell = mp_size; + } + } + + inline void seeku(uint64_t pos, int rel_to) + { + seek(static_cast(pos), rel_to); + } + + size_t read(void *buf, size_t num, size_t size) + { + if(fp) + return std::fread(buf, num, size, fp); + else + { + size_t pos = 0; + size_t maxSize = static_cast(size * num); + + while((pos < maxSize) && (mp_tell < mp_size)) + { + reinterpret_cast(buf)[pos] = reinterpret_cast(mp)[mp_tell]; + mp_tell++; + pos++; + } + + return pos; + } + } + + int getc() + { + if(fp) + return std::getc(fp); + else + { + if(mp_tell >= mp_size) return -1; + int x = reinterpret_cast(mp)[mp_tell]; + mp_tell++; + return x; + } + } + + size_t tell() + { + if(fp) + return static_cast(std::ftell(fp)); + else + return mp_tell; + } + + void close() + { + if(fp) std::fclose(fp); + + fp = NULL; + mp = NULL; + mp_size = 0; + mp_tell = 0; + } + + bool isValid() + { + return (fp) || (mp); + } + + bool eof() + { + if(fp) + return std::feof(fp); + else + return mp_tell >= mp_size; + } + std::string _fileName; + std::FILE *fp; + const void *mp; + size_t mp_size; + size_t mp_tell; + }; + + // Persistent settings for each MIDI channel + struct MIDIchannel + { + uint16_t portamento; + uint8_t bank_lsb, bank_msb; + uint8_t patch; + uint8_t volume, expression; + uint8_t panning, vibrato, sustain; + char ____padding[6]; + double bend, bendsense; + double vibpos, vibspeed, vibdepth; + int64_t vibdelay; + uint8_t lastlrpn, lastmrpn; + bool nrpn; + uint8_t brightness; + bool is_xg_percussion; + struct NoteInfo + { + // Current pressure + uint8_t vol; + char ____padding[1]; + // Tone selected on noteon: + int16_t tone; + char ____padding2[4]; + // Patch selected on noteon; index to banks[AdlBank][] + size_t midiins; + // Index to physical adlib data structure, adlins[] + size_t insmeta; + struct Phys + { + //! ins, inde to adl[] + size_t insId; + //! Is this voice must be detunable? + bool pseudo4op; + + bool operator==(const Phys &oth) const + { + return (insId == oth.insId) && (pseudo4op == oth.pseudo4op); + } + bool operator!=(const Phys &oth) const + { + return !operator==(oth); + } + }; + typedef std::map PhysMap; + // List of OPL3 channels it is currently occupying. + std::map phys; + }; + typedef std::map activenotemap_t; + typedef activenotemap_t::iterator activenoteiterator; + char ____padding2[5]; + activenotemap_t activenotes; + void reset() + { + portamento = 0; + bank_lsb = 0; + bank_msb = 0; + patch = 0; + volume = 100; + expression = 127; + panning = 0x30; + vibrato = 0; + sustain = 0; + bend = 0.0; + bendsense = 2 / 8192.0; + vibpos = 0; + vibspeed = 2 * 3.141592653 * 5.0; + vibdepth = 0.5 / 127; + vibdelay = 0; + lastlrpn = 0; + lastmrpn = 0; + nrpn = false; + brightness = 127; + is_xg_percussion = false; + } + MIDIchannel() + : activenotes() + { + reset(); + } + }; + + // Additional information about OPL3 channels + struct AdlChannel + { + // For collisions + struct Location + { + uint16_t MidCh; + uint8_t note; + bool operator==(const Location &b) const + { + return MidCh == b.MidCh && note == b.note; + } + bool operator< (const Location &b) const + { + return MidCh < b.MidCh || (MidCh == b.MidCh && note < b.note); + } + char ____padding[1]; + }; + struct LocationData + { + bool sustained; + char ____padding[7]; + MIDIchannel::NoteInfo::Phys ins; // a copy of that in phys[] + int64_t kon_time_until_neglible; + int64_t vibdelay; + }; + typedef std::map users_t; + users_t users; + + // If the channel is keyoff'd + int64_t koff_time_until_neglible; + // For channel allocation: + AdlChannel(): users(), koff_time_until_neglible(0) { } + void AddAge(int64_t ms); + }; + + /** + * @brief MIDI Event utility container + */ + class MidiEvent + { + public: + MidiEvent(); + + enum Types + { + T_UNKNOWN = 0x00, + T_NOTEOFF = 0x08,//size == 2 + T_NOTEON = 0x09,//size == 2 + T_NOTETOUCH = 0x0A,//size == 2 + T_CTRLCHANGE = 0x0B,//size == 2 + T_PATCHCHANGE = 0x0C,//size == 1 + T_CHANAFTTOUCH = 0x0D,//size == 1 + T_WHEEL = 0x0E,//size == 2 + + T_SYSEX = 0xF0,//size == len + T_SYSCOMSPOSPTR = 0xF2,//size == 2 + T_SYSCOMSNGSEL = 0xF3,//size == 1 + T_SYSEX2 = 0xF7,//size == len + T_SPECIAL = 0xFF + }; + enum SubTypes + { + ST_SEQNUMBER = 0x00,//size == 2 + ST_TEXT = 0x01,//size == len + ST_COPYRIGHT = 0x02,//size == len + ST_SQTRKTITLE = 0x03,//size == len + ST_INSTRTITLE = 0x04,//size == len + ST_LYRICS = 0x05,//size == len + ST_MARKER = 0x06,//size == len + ST_CUEPOINT = 0x07,//size == len + ST_DEVICESWITCH = 0x09,//size == len + ST_MIDICHPREFIX = 0x20,//size == 1 + + ST_ENDTRACK = 0x2F,//size == 0 + ST_TEMPOCHANGE = 0x51,//size == 3 + ST_SMPTEOFFSET = 0x54,//size == 5 + ST_TIMESIGNATURE = 0x55, //size == 4 + ST_KEYSIGNATURE = 0x59,//size == 2 + ST_SEQUENCERSPEC = 0x7F, //size == len + + /* Non-standard, internal ADLMIDI usage only */ + ST_LOOPSTART = 0xE1,//size == 0 + ST_LOOPEND = 0xE2,//size == 0 + ST_RAWOPL = 0xE3//size == 0 + }; + //! Main type of event + uint8_t type; + //! Sub-type of the event + uint8_t subtype; + //! Targeted MIDI channel + uint8_t channel; + //! Is valid event + uint8_t isValid; + //! Reserved 5 bytes padding + uint8_t __padding[4]; + //! Absolute tick position (Used for the tempo calculation only) + uint64_t absPosition; + //! Raw data of this event + std::vector data; + }; + + /** + * @brief A track position event contains a chain of MIDI events until next delay value + * + * Created with purpose to sort events by type in the same position + * (for example, to keep controllers always first than note on events or lower than note-off events) + */ + class MidiTrackRow + { + public: + MidiTrackRow(); + void reset(); + //! Absolute time position in seconds + double time; + //! Delay to next event in ticks + uint64_t delay; + //! Absolute position in ticks + uint64_t absPos; + //! Delay to next event in seconds + double timeDelay; + std::vector events; + /** + * @brief Sort events in this position + */ + void sortEvents(bool *noteStates = NULL); + }; + + /** + * @brief Tempo change point entry. Used in the MIDI data building function only. + */ + struct TempoChangePoint + { + uint64_t absPos; + fraction tempo; + }; + //P.S. I declared it here instead of local in-function because C++99 can't process templates with locally-declared structures + + typedef std::list MidiTrackQueue; + + // Information about each track + struct PositionNew + { + bool began; + char padding[7]; + double wait; + double absTimePosition; + struct TrackInfo + { + size_t ptr; + uint64_t delay; + int status; + char padding2[4]; + MidiTrackQueue::iterator pos; + TrackInfo(): ptr(0), delay(0), status(0) {} + }; + std::vector track; + PositionNew(): began(false), wait(0.0), absTimePosition(0.0), track() + {} + }; + + struct Setup + { + unsigned int AdlBank; + unsigned int NumFourOps; + unsigned int NumCards; + int HighTremoloMode; + int HighVibratoMode; + int AdlPercussionMode; + bool LogarithmicVolumes; + int VolumeModel; + //unsigned int SkipForward; + bool loopingIsEnabled; + int ScaleModulators; + + double delay; + double carry; + + /* The lag between visual content and audio content equals */ + /* the sum of these two buffers. */ + double mindelay; + double maxdelay; + + /* For internal usage */ + ssize_t tick_skip_samples_delay; /* Skip tick processing after samples count. */ + /* For internal usage */ + + unsigned long PCM_RATE; + }; + + struct MIDI_MarkerEntry + { + std::string label; + double pos_time; + uint64_t pos_ticks; + }; + + std::vector Ch; + bool cmf_percussion_mode; + + MIDIEventHooks hooks; + +private: + std::map devices; + std::map current_device; + + //Padding to fix CLanc code model's warning + char ____padding[7]; + + std::vector ch; + std::vector > TrackData; + + PositionNew CurrentPositionNew, LoopBeginPositionNew, trackBeginPositionNew; + + //! Full song length in seconds + double fullSongTimeLength; + //! Delay after song playd before rejecting the output stream requests + double postSongWaitDelay; + + //! Loop start time + double loopStartTime; + //! Loop end time + double loopEndTime; + //! Local error string + std::string errorString; + //! Local error string + std::string errorStringOut; + + //! Pre-processed track data storage + std::vector trackDataNew; + + //! Missing instruments catches + std::set caugh_missing_instruments; + //! Missing melodic banks catches + std::set caugh_missing_banks_melodic; + //! Missing percussion banks catches + std::set caugh_missing_banks_percussion; + + /** + * @brief Build MIDI track data from the raw track data storage + * @return true if everything successfully processed, or false on any error + */ + bool buildTrackData(); + + /** + * @brief Parse one event from raw MIDI track stream + * @param [_inout] ptr pointer to pointer to current position on the raw data track + * @param [_in] end address to end of raw track data, needed to validate position and size + * @param [_inout] status status of the track processing + * @return Parsed MIDI event entry + */ + MidiEvent parseEvent(uint8_t **ptr, uint8_t *end, int &status); + +public: + + const std::string &getErrorString(); + void setErrorString(const std::string &err); + + std::string musTitle; + std::string musCopyright; + std::vector musTrackTitles; + std::vector musMarkers; + + fraction InvDeltaTicks, Tempo; + //! Tempo multiplier + double tempoMultiplier; + bool atEnd, + loopStart, + loopEnd, + invalidLoop; /*Loop points are invalid (loopStart after loopEnd or loopStart and loopEnd are on same place)*/ + char ____padding2[2]; + OPL3 opl; + + int16_t outBuf[1024]; + + Setup m_setup; + + static uint64_t ReadBEint(const void *buffer, size_t nbytes); + static uint64_t ReadLEint(const void *buffer, size_t nbytes); + + /** + * @brief Standard MIDI Variable-Length numeric value parser without of validation + * @param [_inout] ptr Pointer to memory block that contains begin of variable-length value + * @return Unsigned integer that conains parsed variable-length value + */ + uint64_t ReadVarLen(uint8_t **ptr); + /** + * @brief Secure Standard MIDI Variable-Length numeric value parser with anti-out-of-range protection + * @param [_inout] ptr Pointer to memory block that contains begin of variable-length value, will be iterated forward + * @param [_in end Pointer to end of memory block where variable-length value is stored (after end of track) + * @param [_out] ok Reference to boolean which takes result of variable-length value parsing + * @return Unsigned integer that conains parsed variable-length value + */ + uint64_t ReadVarLenEx(uint8_t **ptr, uint8_t *end, bool &ok); + + bool LoadBank(const std::string &filename); + bool LoadBank(const void *data, size_t size); + bool LoadBank(fileReader &fr); + + bool LoadMIDI(const std::string &filename); + bool LoadMIDI(const void *data, size_t size); + bool LoadMIDI(fileReader &fr); + + /** + * @brief Periodic tick handler. + * @param s seconds since last call + * @param granularity don't expect intervals smaller than this, in seconds + * @return desired number of seconds until next call + */ + double Tick(double s, double granularity); + + /** + * @brief Process extra iterators like vibrato or arpeggio + * @param s seconds since last call + */ + void TickIteratos(double s); + + /** + * @brief Change current position to specified time position in seconds + * @param seconds Absolute time position in seconds + */ + void seek(double seconds); + + /** + * @brief Gives current time position in seconds + * @return Current time position in seconds + */ + double tell(); + + /** + * @brief Gives time length of current song in seconds + * @return Time length of current song in seconds + */ + double timeLength(); + + /** + * @brief Gives loop start time position in seconds + * @return Loop start time position in seconds or -1 if song has no loop points + */ + double getLoopStart(); + + /** + * @brief Gives loop end time position in seconds + * @return Loop end time position in seconds or -1 if song has no loop points + */ + double getLoopEnd(); + + /** + * @brief Return to begin of current song + */ + void rewind(); + + /** + * @brief Set tempo multiplier + * @param tempo Tempo multiplier: 1.0 - original tempo. >1 - faster, <1 - slower + */ + void setTempo(double tempo); + + /* RealTime event triggers */ + void realTime_ResetState(); + + bool realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity); + void realTime_NoteOff(uint8_t channel, uint8_t note); + + void realTime_NoteAfterTouch(uint8_t channel, uint8_t note, uint8_t atVal); + void realTime_ChannelAfterTouch(uint8_t channel, uint8_t atVal); + + void realTime_Controller(uint8_t channel, uint8_t type, uint8_t value); + + void realTime_PatchChange(uint8_t channel, uint8_t patch); + + void realTime_PitchBend(uint8_t channel, uint16_t pitch); + void realTime_PitchBend(uint8_t channel, uint8_t msb, uint8_t lsb); + + void realTime_BankChangeLSB(uint8_t channel, uint8_t lsb); + void realTime_BankChangeMSB(uint8_t channel, uint8_t msb); + void realTime_BankChange(uint8_t channel, uint16_t bank); + + void realTime_panic(); + +private: + enum + { + Upd_Patch = 0x1, + Upd_Pan = 0x2, + Upd_Volume = 0x4, + Upd_Pitch = 0x8, + Upd_All = Upd_Pan + Upd_Volume + Upd_Pitch, + Upd_Off = 0x20 + }; + + void NoteUpdate(uint16_t MidCh, + MIDIchannel::activenoteiterator i, + unsigned props_mask, + int32_t select_adlchn = -1); + bool ProcessEventsNew(bool isSeek = false); + void HandleEvent(size_t tk, const MidiEvent &evt, int &status); + + // Determine how good a candidate this adlchannel + // would be for playing a note from this instrument. + long CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t /*MidCh*/) const; + + // A new note will be played on this channel using this instrument. + // Kill existing notes on this channel (or don't, if we do arpeggio) + void PrepareAdlChannelForNewNote(size_t c, const MIDIchannel::NoteInfo::Phys &ins); + + void KillOrEvacuate( + size_t from_channel, + AdlChannel::users_t::iterator j, + MIDIchannel::activenoteiterator i); + void Panic(); + void KillSustainingNotes(int32_t MidCh = -1, int32_t this_adlchn = -1); + void SetRPN(unsigned MidCh, unsigned value, bool MSB); + //void UpdatePortamento(unsigned MidCh) + void NoteUpdate_All(uint16_t MidCh, unsigned props_mask); + void NoteOff(uint16_t MidCh, uint8_t note); + + void UpdateVibrato(double amount); + void UpdateArpeggio(double /*amount*/); + +public: + uint64_t ChooseDevice(const std::string &name); +}; + +// I think, this is useless inside of Library +/* +struct FourChars +{ + char ret[4]; + + FourChars(const char *s) + { + for(unsigned c = 0; c < 4; ++c) + ret[c] = s[c]; + } + FourChars(unsigned w) // Little-endian + { + for(unsigned c = 0; c < 4; ++c) + ret[c] = static_cast((w >>(c * 8)) & 0xFF); + } +}; +*/ + +extern int adlRefreshNumCards(ADL_MIDIPlayer *device); + + +#endif // ADLMIDI_PRIVATE_HPP diff --git a/src/sound/adlmidi/adlmidi_xmi2mid.h b/src/sound/adlmidi/adlmidi_xmi2mid.h new file mode 100644 index 000000000..950d58ca6 --- /dev/null +++ b/src/sound/adlmidi/adlmidi_xmi2mid.h @@ -0,0 +1,60 @@ +/* + * XMIDI: Miles XMIDI to MID Library Header + * + * Copyright (C) 2001 Ryan Nunn + * Copyright (C) 2014-2016 Bret Curtis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* XMIDI Converter */ + +#ifndef XMIDILIB_H +#define XMIDILIB_H + +#include + +#ifdef __DJGPP__ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed long int32_t; +typedef unsigned long uint32_t; +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Conversion types for Midi files */ +#define XMIDI_CONVERT_NOCONVERSION 0x00 +#define XMIDI_CONVERT_MT32_TO_GM 0x01 +#define XMIDI_CONVERT_MT32_TO_GS 0x02 +#define XMIDI_CONVERT_MT32_TO_GS127 0x03 /* This one is broken, don't use */ +#define XMIDI_CONVERT_MT32_TO_GS127DRUM 0x04 /* This one is broken, don't use */ +#define XMIDI_CONVERT_GS127_TO_GS 0x05 + +int AdlMidi_xmi2midi(uint8_t *in, uint32_t insize, + uint8_t **out, uint32_t *outsize, + uint32_t convert_type); + +#ifdef __cplusplus +} +#endif + +#endif /* XMIDILIB_H */ diff --git a/src/sound/adlmidi/dbopl.cpp b/src/sound/adlmidi/dbopl.cpp new file mode 100644 index 000000000..fb28e207d --- /dev/null +++ b/src/sound/adlmidi/dbopl.cpp @@ -0,0 +1,2045 @@ +#ifdef ADLMIDI_USE_DOSBOX_OPL + +#ifdef __MINGW32__ +typedef struct vswprintf {} swprintf; +#endif +/* + * Copyright (C) 2002-2010 The DOSBox Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + DOSBox implementation of a combined Yamaha YMF262 and Yamaha YM3812 emulator. + Enabling the opl3 bit will switch the emulator to stereo opl3 output instead of regular mono opl2 + Except for the table generation it's all integer math + Can choose different types of generators, using muls and bigger tables, try different ones for slower platforms + The generation was based on the MAME implementation but tried to have it use less memory and be faster in general + MAME uses much bigger envelope tables and this will be the biggest cause of it sounding different at times + + //TODO Don't delay first operator 1 sample in opl3 mode + //TODO Maybe not use class method pointers but a regular function pointers with operator as first parameter + //TODO Fix panning for the Percussion channels, would any opl3 player use it and actually really change it though? + //TODO Check if having the same accuracy in all frequency multipliers sounds better or not + + //DUNNO Keyon in 4op, switch to 2op without keyoff. +*/ + +/* $Id: dbopl.cpp,v 1.10 2009-06-10 19:54:51 harekiet Exp $ */ + + +#include +#include +#include +#include "dbopl.h" + +#define DB_MAX(x, y) ((x) > (y) ? (x) : (y)) +#define DB_MIN(x, y) ((x) < (y) ? (x) : (y)) + +#define DBOPL_CLAMP(V, MIN, MAX) DB_MAX(DB_MIN(V, (MAX)), (MIN)) + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +namespace DBOPL +{ + +#define OPLRATE ((double)(14318180.0 / 288.0)) +#define TREMOLO_TABLE 52 + + //Try to use most precision for frequencies + //Else try to keep different waves in synch + //#define WAVE_PRECISION 1 + #ifndef WAVE_PRECISION + //Wave bits available in the top of the 32bit range + //Original adlib uses 10.10, we use 10.22 +#define WAVE_BITS 10 + #else + //Need some extra bits at the top to have room for octaves and frequency multiplier + //We support to 8 times lower rate + //128 * 15 * 8 = 15350, 2^13.9, so need 14 bits +#define WAVE_BITS 14 + #endif +#define WAVE_SH ( 32 - WAVE_BITS ) +#define WAVE_MASK ( ( 1 << WAVE_SH ) - 1 ) + + //Use the same accuracy as the waves +#define LFO_SH ( WAVE_SH - 10 ) + //LFO is controlled by our tremolo 256 sample limit +#define LFO_MAX ( 256 << ( LFO_SH ) ) + + + //Maximum amount of attenuation bits + //Envelope goes to 511, 9 bits + #if (DBOPL_WAVE == WAVE_TABLEMUL ) + //Uses the value directly +#define ENV_BITS ( 9 ) + #else + //Add 3 bits here for more accuracy and would have to be shifted up either way +#define ENV_BITS ( 9 ) + #endif + //Limits of the envelope with those bits and when the envelope goes silent +#define ENV_MIN 0 +#define ENV_EXTRA ( ENV_BITS - 9 ) +#define ENV_MAX ( 511 << ENV_EXTRA ) +#define ENV_LIMIT ( ( 12 * 256) >> ( 3 - ENV_EXTRA ) ) +#define ENV_SILENT( _X_ ) ( (_X_) >= ENV_LIMIT ) + + //Attack/decay/release rate counter shift +#define RATE_SH 24 +#define RATE_MASK ( ( 1 << RATE_SH ) - 1 ) + //Has to fit within 16bit lookuptable +#define MUL_SH 16 + + //Check some ranges + #if ENV_EXTRA > 3 +#error Too many envelope bits + #endif + + + //How much to substract from the base value for the final attenuation + static const Bit8u KslCreateTable[16] = + { + //0 will always be be lower than 7 * 8 + 64, 32, 24, 19, + 16, 12, 11, 10, + 8, 6, 5, 4, + 3, 2, 1, 0, + }; + +#define M(_X_) ((Bit8u)( (_X_) * 2)) + static const Bit8u FreqCreateTable[16] = + { + M(0.5), M(1), M(2), M(3), M(4), M(5), M(6), M(7), + M(8), M(9), M(10), M(10), M(12), M(12), M(15), M(15) + }; +#undef M + + //We're not including the highest attack rate, that gets a special value + static const Bit8u AttackSamplesTable[13] = + { + 69, 55, 46, 40, + 35, 29, 23, 20, + 19, 15, 11, 10, + 9 + }; + //On a real opl these values take 8 samples to reach and are based upon larger tables + static const Bit8u EnvelopeIncreaseTable[13] = + { + 4, 5, 6, 7, + 8, 10, 12, 14, + 16, 20, 24, 28, + 32, + }; + + #if ( DBOPL_WAVE == WAVE_HANDLER ) || ( DBOPL_WAVE == WAVE_TABLELOG ) + static Bit16u ExpTable[ 256 ]; + #endif + + #if ( DBOPL_WAVE == WAVE_HANDLER ) + //PI table used by WAVEHANDLER + static Bit16u SinTable[ 512 ]; + #endif + + #if ( DBOPL_WAVE > WAVE_HANDLER ) + //Layout of the waveform table in 512 entry intervals + //With overlapping waves we reduce the table to half it's size + + // | |//\\|____|WAV7|//__|/\ |____|/\/\| + // |\\//| | |WAV7| | \/| | | + // |06 |0126|17 |7 |3 |4 |4 5 |5 | + + //6 is just 0 shifted and masked + + static Bit16s WaveTable[ 8 * 512 ]; + //Distance into WaveTable the wave starts + static const Bit16u WaveBaseTable[8] = + { + 0x000, 0x200, 0x200, 0x800, + 0xa00, 0xc00, 0x100, 0x400, + + }; + //Mask the counter with this + static const Bit16u WaveMaskTable[8] = + { + 1023, 1023, 511, 511, + 1023, 1023, 512, 1023, + }; + + //Where to start the counter on at keyon + static const Bit16u WaveStartTable[8] = + { + 512, 0, 0, 0, + 0, 512, 512, 256, + }; + #endif + + #if ( DBOPL_WAVE == WAVE_TABLEMUL ) + static Bit16u MulTable[ 384 ]; + #endif + + static Bit8u KslTable[ 8 * 16 ]; + static Bit8u TremoloTable[ TREMOLO_TABLE ]; + //Start of a channel behind the chip struct start + static Bit16u ChanOffsetTable[32]; + //Start of an operator behind the chip struct start + static Bit16u OpOffsetTable[64]; + + //The lower bits are the shift of the operator vibrato value + //The highest bit is right shifted to generate -1 or 0 for negation + //So taking the highest input value of 7 this gives 3, 7, 3, 0, -3, -7, -3, 0 + static const Bit8s VibratoTable[ 8 ] = + { + 1 - 0x00, 0 - 0x00, 1 - 0x00, 30 - 0x00, + 1 - 0x80, 0 - 0x80, 1 - 0x80, 30 - 0x80 + }; + + //Shift strength for the ksl value determined by ksl strength + static const Bit8u KslShiftTable[4] = + { + 31, 1, 2, 0 + }; + + //Generate a table index and table shift value using input value from a selected rate + static void EnvelopeSelect(Bit8u val, Bit8u &index, Bit8u &shift) + { + if(val < 13 * 4) //Rate 0 - 12 + { + shift = 12 - (val >> 2); + index = val & 3; + } + else if(val < 15 * 4) //rate 13 - 14 + { + shift = 0; + index = val - 12 * 4; + } + else //rate 15 and up + { + shift = 0; + index = 12; + } + } + + #if ( DBOPL_WAVE == WAVE_HANDLER ) + /* + Generate the different waveforms out of the sine/exponetial table using handlers + */ + static inline Bits MakeVolume(Bitu wave, Bitu volume) + { + Bitu total = wave + volume; + Bitu index = total & 0xff; + Bitu sig = ExpTable[ index ]; + Bitu exp = total >> 8; + #if 0 + + //Check if we overflow the 31 shift limit + if(exp >= 32) + LOG_MSG("WTF %d %d", total, exp); + + #endif + return (sig >> exp); + }; + + static Bits DB_FASTCALL WaveForm0(Bitu i, Bitu volume) + { + Bits neg = 0 - ((i >> 9) & 1); //Create ~0 or 0 + Bitu wave = SinTable[i & 511]; + return (MakeVolume(wave, volume) ^ neg) - neg; + } + static Bits DB_FASTCALL WaveForm1(Bitu i, Bitu volume) + { + Bit32u wave = SinTable[i & 511]; + wave |= (((i ^ 512) & 512) - 1) >> (32 - 12); + return MakeVolume(wave, volume); + } + static Bits DB_FASTCALL WaveForm2(Bitu i, Bitu volume) + { + Bitu wave = SinTable[i & 511]; + return MakeVolume(wave, volume); + } + static Bits DB_FASTCALL WaveForm3(Bitu i, Bitu volume) + { + Bitu wave = SinTable[i & 255]; + wave |= (((i ^ 256) & 256) - 1) >> (32 - 12); + return MakeVolume(wave, volume); + } + static Bits DB_FASTCALL WaveForm4(Bitu i, Bitu volume) + { + //Twice as fast + i <<= 1; + Bits neg = 0 - ((i >> 9) & 1); //Create ~0 or 0 + Bitu wave = SinTable[i & 511]; + wave |= (((i ^ 512) & 512) - 1) >> (32 - 12); + return (MakeVolume(wave, volume) ^ neg) - neg; + } + static Bits DB_FASTCALL WaveForm5(Bitu i, Bitu volume) + { + //Twice as fast + i <<= 1; + Bitu wave = SinTable[i & 511]; + wave |= (((i ^ 512) & 512) - 1) >> (32 - 12); + return MakeVolume(wave, volume); + } + static Bits DB_FASTCALL WaveForm6(Bitu i, Bitu volume) + { + Bits neg = 0 - ((i >> 9) & 1); //Create ~0 or 0 + return (MakeVolume(0, volume) ^ neg) - neg; + } + static Bits DB_FASTCALL WaveForm7(Bitu i, Bitu volume) + { + //Negative is reversed here + Bits neg = ((i >> 9) & 1) - 1; + Bitu wave = (i << 3); + //When negative the volume also runs backwards + wave = ((wave ^ neg) - neg) & 4095; + return (MakeVolume(wave, volume) ^ neg) - neg; + } + + static const WaveHandler WaveHandlerTable[8] = + { + WaveForm0, WaveForm1, WaveForm2, WaveForm3, + WaveForm4, WaveForm5, WaveForm6, WaveForm7 + }; + + #endif + + /* + Operator + */ + + //We zero out when rate == 0 + inline void Operator::UpdateAttack(const Chip *chip) + { + Bit8u rate = reg60 >> 4; + + if(rate) + { + Bit8u val = (rate << 2) + ksr; + attackAdd = chip->attackRates[ val ]; + rateZero &= ~(1 << ATTACK); + } + else + { + attackAdd = 0; + rateZero |= (1 << ATTACK); + } + } + inline void Operator::UpdateDecay(const Chip *chip) + { + Bit8u rate = reg60 & 0xf; + + if(rate) + { + Bit8u val = (rate << 2) + ksr; + decayAdd = chip->linearRates[ val ]; + rateZero &= ~(1 << DECAY); + } + else + { + decayAdd = 0; + rateZero |= (1 << DECAY); + } + } + inline void Operator::UpdateRelease(const Chip *chip) + { + Bit8u rate = reg80 & 0xf; + + if(rate) + { + Bit8u val = (rate << 2) + ksr; + releaseAdd = chip->linearRates[ val ]; + rateZero &= ~(1 << RELEASE); + + if(!(reg20 & MASK_SUSTAIN)) + rateZero &= ~(1 << SUSTAIN); + } + else + { + rateZero |= (1 << RELEASE); + releaseAdd = 0; + + if(!(reg20 & MASK_SUSTAIN)) + rateZero |= (1 << SUSTAIN); + } + } + + inline void Operator::UpdateAttenuation() + { + Bit8u kslBase = (Bit8u)((chanData >> SHIFT_KSLBASE) & 0xff); + Bit32u tl = reg40 & 0x3f; + Bit8u kslShift = KslShiftTable[ reg40 >> 6 ]; + //Make sure the attenuation goes to the right bits + totalLevel = tl << (ENV_BITS - 7); //Total level goes 2 bits below max + totalLevel += (kslBase << ENV_EXTRA) >> kslShift; + } + + void Operator::UpdateFrequency() + { + Bit32u freq = chanData & ((1 << 10) - 1); + Bit32u block = (chanData >> 10) & 0xff; + #ifdef WAVE_PRECISION + block = 7 - block; + waveAdd = (freq * freqMul) >> block; + #else + waveAdd = (freq << block) * freqMul; + #endif + + if(reg20 & MASK_VIBRATO) + { + vibStrength = (Bit8u)(freq >> 7); + #ifdef WAVE_PRECISION + vibrato = (vibStrength * freqMul) >> block; + #else + vibrato = (vibStrength << block) * freqMul; + #endif + } + else + { + vibStrength = 0; + vibrato = 0; + } + } + + void Operator::UpdateRates(const Chip *chip) + { + //Mame seems to reverse this where enabling ksr actually lowers + //the rate, but pdf manuals says otherwise? + Bit8u newKsr = (Bit8u)((chanData >> SHIFT_KEYCODE) & 0xff); + + if(!(reg20 & MASK_KSR)) + newKsr >>= 2; + + if(ksr == newKsr) + return; + + ksr = newKsr; + UpdateAttack(chip); + UpdateDecay(chip); + UpdateRelease(chip); + } + + INLINE Bit32s Operator::RateForward(Bit32u add) + { + rateIndex += add; + Bit32s ret = rateIndex >> RATE_SH; + rateIndex = rateIndex & RATE_MASK; + return ret; + } + + template< Operator::State yes> + Bits Operator::TemplateVolume() + { + Bit32s vol = volume; + Bit32s change; + + switch(yes) + { + case OFF: + return ENV_MAX; + + case ATTACK: + change = RateForward(attackAdd); + + if(!change) + return vol; + + vol += ((~vol) * change) >> 3; + + if(vol < ENV_MIN) + { + volume = ENV_MIN; + rateIndex = 0; + SetState(DECAY); + return ENV_MIN; + } + + break; + + case DECAY: + vol += RateForward(decayAdd); + + if(GCC_UNLIKELY(vol >= sustainLevel)) + { + //Check if we didn't overshoot max attenuation, then just go off + if(GCC_UNLIKELY(vol >= ENV_MAX)) + { + volume = ENV_MAX; + SetState(OFF); + return ENV_MAX; + } + + //Continue as sustain + rateIndex = 0; + SetState(SUSTAIN); + } + + break; + + case SUSTAIN: + if(reg20 & MASK_SUSTAIN) + return vol; + + //In sustain phase, but not sustaining, do regular release + case RELEASE: + vol += RateForward(releaseAdd);; + + if(GCC_UNLIKELY(vol >= ENV_MAX)) + { + volume = ENV_MAX; + SetState(OFF); + return ENV_MAX; + } + + break; + } + + volume = vol; + return vol; + } + + static const VolumeHandler VolumeHandlerTable[5] = + { + &Operator::TemplateVolume< Operator::OFF >, + &Operator::TemplateVolume< Operator::RELEASE >, + &Operator::TemplateVolume< Operator::SUSTAIN >, + &Operator::TemplateVolume< Operator::DECAY >, + &Operator::TemplateVolume< Operator::ATTACK > + }; + + INLINE Bitu Operator::ForwardVolume() + { + return currentLevel + (this->*volHandler)(); + } + + + INLINE Bitu Operator::ForwardWave() + { + waveIndex += waveCurrent; + return waveIndex >> WAVE_SH; + } + + void Operator::Write20(const Chip *chip, Bit8u val) + { + Bit8u change = (reg20 ^ val); + + if(!change) + return; + + reg20 = val; + //Shift the tremolo bit over the entire register, saved a branch, YES! + tremoloMask = (Bit8s)(val) >> 7; + tremoloMask &= ~((1 << ENV_EXTRA) - 1); + + //Update specific features based on changes + if(change & MASK_KSR) + UpdateRates(chip); + + //With sustain enable the volume doesn't change + if(reg20 & MASK_SUSTAIN || (!releaseAdd)) + rateZero |= (1 << SUSTAIN); + else + rateZero &= ~(1 << SUSTAIN); + + //Frequency multiplier or vibrato changed + if(change & (0xf | MASK_VIBRATO)) + { + freqMul = chip->freqMul[ val & 0xf ]; + UpdateFrequency(); + } + } + + void Operator::Write40(const Chip * /*chip*/, Bit8u val) + { + if(!(reg40 ^ val)) + return; + + reg40 = val; + UpdateAttenuation(); + } + + void Operator::Write60(const Chip *chip, Bit8u val) + { + Bit8u change = reg60 ^ val; + reg60 = val; + + if(change & 0x0f) + UpdateDecay(chip); + + if(change & 0xf0) + UpdateAttack(chip); + } + + void Operator::Write80(const Chip *chip, Bit8u val) + { + Bit8u change = (reg80 ^ val); + + if(!change) + return; + + reg80 = val; + Bit8u sustain = val >> 4; + //Turn 0xf into 0x1f + sustain |= (sustain + 1) & 0x10; + sustainLevel = sustain << (ENV_BITS - 5); + + if(change & 0x0f) + UpdateRelease(chip); + } + + void Operator::WriteE0(const Chip *chip, Bit8u val) + { + if(!(regE0 ^ val)) + return; + + //in opl3 mode you can always selet 7 waveforms regardless of waveformselect + Bit8u waveForm = val & ((0x3 & chip->waveFormMask) | (0x7 & chip->opl3Active)); + regE0 = val; + #if ( DBOPL_WAVE == WAVE_HANDLER ) + waveHandler = WaveHandlerTable[ waveForm ]; + #else + waveBase = WaveTable + WaveBaseTable[ waveForm ]; + waveStart = WaveStartTable[ waveForm ] << WAVE_SH; + waveMask = WaveMaskTable[ waveForm ]; + #endif + } + + INLINE void Operator::SetState(Bit8u s) + { + state = s; + volHandler = VolumeHandlerTable[ s ]; + } + + INLINE bool Operator::Silent() const + { + if(!ENV_SILENT(totalLevel + volume)) + return false; + + if(!(rateZero & (1 << state))) + return false; + + return true; + } + + INLINE void Operator::Prepare(const Chip *chip) + { + currentLevel = totalLevel + (chip->tremoloValue & tremoloMask); + waveCurrent = waveAdd; + + if(vibStrength >> chip->vibratoShift) + { + Bit32s add = vibrato >> chip->vibratoShift; + //Sign extend over the shift value + Bit32s neg = chip->vibratoSign; + //Negate the add with -1 or 0 + add = (add ^ neg) - neg; + waveCurrent += add; + } + } + + void Operator::KeyOn(Bit8u mask) + { + if(!keyOn) + { + //Restart the frequency generator + #if ( DBOPL_WAVE > WAVE_HANDLER ) + waveIndex = waveStart; + #else + waveIndex = 0; + #endif + rateIndex = 0; + SetState(ATTACK); + } + + keyOn |= mask; + } + + void Operator::KeyOff(Bit8u mask) + { + keyOn &= ~mask; + + if(!keyOn) + { + if(state != OFF) + SetState(RELEASE); + } + } + + INLINE Bits Operator::GetWave(Bitu index, Bitu vol) + { + #if ( DBOPL_WAVE == WAVE_HANDLER ) + return waveHandler(index, vol << (3 - ENV_EXTRA)); + #elif ( DBOPL_WAVE == WAVE_TABLEMUL ) + return (waveBase[ index & waveMask ] * MulTable[ vol >> ENV_EXTRA ]) >> MUL_SH; + #elif ( DBOPL_WAVE == WAVE_TABLELOG ) + Bit32s wave = waveBase[ index & waveMask ]; + Bit32u total = (wave & 0x7fff) + vol << (3 - ENV_EXTRA); + Bit32s sig = ExpTable[ total & 0xff ]; + Bit32u exp = total >> 8; + Bit32s neg = wave >> 16; + return ((sig ^ neg) - neg) >> exp; + #else +#error "No valid wave routine" + #endif + } + + Bits INLINE Operator::GetSample(Bits modulation) + { + Bitu vol = ForwardVolume(); + + if(ENV_SILENT(vol)) + { + //Simply forward the wave + waveIndex += waveCurrent; + return 0; + } + else + { + Bitu index = ForwardWave(); + index += modulation; + return GetWave(index, vol); + } + } + + Operator::Operator() + { + chanData = 0; + freqMul = 0; + waveIndex = 0; + waveAdd = 0; + waveCurrent = 0; + keyOn = 0; + ksr = 0; + reg20 = 0; + reg40 = 0; + reg60 = 0; + reg80 = 0; + regE0 = 0; + SetState(OFF); + rateZero = (1 << OFF); + sustainLevel = ENV_MAX; + currentLevel = ENV_MAX; + totalLevel = ENV_MAX; + volume = ENV_MAX; + releaseAdd = 0; + } + + /* + Channel + */ + + Channel::Channel() + { + old[0] = old[1] = 0; + chanData = 0; + regB0 = 0; + regC0 = 0; + maskLeft = -1; + maskRight = -1; + feedback = 31; + fourMask = 0; + synthHandler = &Channel::BlockTemplate< sm2FM >; + } + + void Channel::SetChanData(const Chip *chip, Bit32u data) + { + Bit32u change = chanData ^ data; + chanData = data; + Op(0)->chanData = data; + Op(1)->chanData = data; + //Since a frequency update triggered this, always update frequency + Op(0)->UpdateFrequency(); + Op(1)->UpdateFrequency(); + + if(change & (0xff << SHIFT_KSLBASE)) + { + Op(0)->UpdateAttenuation(); + Op(1)->UpdateAttenuation(); + } + + if(change & (0xff << SHIFT_KEYCODE)) + { + Op(0)->UpdateRates(chip); + Op(1)->UpdateRates(chip); + } + } + + void Channel::UpdateFrequency(const Chip *chip, Bit8u fourOp) + { + //Extrace the frequency bits + Bit32u data = chanData & 0xffff; + Bit32u kslBase = KslTable[ data >> 6 ]; + Bit32u keyCode = (data & 0x1c00) >> 9; + + if(chip->reg08 & 0x40) + { + keyCode |= (data & 0x100) >> 8; /* notesel == 1 */ + } + else + { + keyCode |= (data & 0x200) >> 9; /* notesel == 0 */ + } + + //Add the keycode and ksl into the highest bits of chanData + data |= (keyCode << SHIFT_KEYCODE) | (kslBase << SHIFT_KSLBASE); + (this + 0)->SetChanData(chip, data); + + if(fourOp & 0x3f) + (this + 1)->SetChanData(chip, data); + } + + void Channel::WriteA0(const Chip *chip, Bit8u val) + { + Bit8u fourOp = chip->reg104 & chip->opl3Active & fourMask; + + //Don't handle writes to silent fourop channels + if(fourOp > 0x80) + return; + + Bit32u change = (chanData ^ val) & 0xff; + + if(change) + { + chanData ^= change; + UpdateFrequency(chip, fourOp); + } + } + + void Channel::WriteB0(const Chip *chip, Bit8u val) + { + Bit8u fourOp = chip->reg104 & chip->opl3Active & fourMask; + + //Don't handle writes to silent fourop channels + if(fourOp > 0x80) + return; + + Bitu change = (chanData ^ (val << 8)) & 0x1f00; + + if(change) + { + chanData ^= change; + UpdateFrequency(chip, fourOp); + } + + //Check for a change in the keyon/off state + if(!((val ^ regB0) & 0x20)) + return; + + regB0 = val; + + if(val & 0x20) + { + Op(0)->KeyOn(0x1); + Op(1)->KeyOn(0x1); + + if(fourOp & 0x3f) + { + (this + 1)->Op(0)->KeyOn(1); + (this + 1)->Op(1)->KeyOn(1); + } + } + else + { + Op(0)->KeyOff(0x1); + Op(1)->KeyOff(0x1); + + if(fourOp & 0x3f) + { + (this + 1)->Op(0)->KeyOff(1); + (this + 1)->Op(1)->KeyOff(1); + } + } + } + + void Channel::WriteC0(const Chip *chip, Bit8u val) + { + Bit8u change = val ^ regC0; + + if(!change) + return; + + regC0 = val; + feedback = (val >> 1) & 7; + + if(feedback) + { + //We shift the input to the right 10 bit wave index value + feedback = 9 - feedback; + } + else + feedback = 31; + + //Select the new synth mode + if(chip->opl3Active) + { + //4-op mode enabled for this channel + if((chip->reg104 & fourMask) & 0x3f) + { + Channel *chan0, *chan1; + + //Check if it's the 2nd channel in a 4-op + if(!(fourMask & 0x80)) + { + chan0 = this; + chan1 = this + 1; + } + else + { + chan0 = this - 1; + chan1 = this; + } + + Bit8u synth = ((chan0->regC0 & 1) << 0) | ((chan1->regC0 & 1) << 1); + + switch(synth) + { + case 0: + chan0->synthHandler = &Channel::BlockTemplate< sm3FMFM >; + break; + + case 1: + chan0->synthHandler = &Channel::BlockTemplate< sm3AMFM >; + break; + + case 2: + chan0->synthHandler = &Channel::BlockTemplate< sm3FMAM >; + break; + + case 3: + chan0->synthHandler = &Channel::BlockTemplate< sm3AMAM >; + break; + } + + //Disable updating percussion channels + } + else if((fourMask & 0x40) && (chip->regBD & 0x20)) + { + //Regular dual op, am or fm + } + else if(val & 1) + synthHandler = &Channel::BlockTemplate< sm3AM >; + else + synthHandler = &Channel::BlockTemplate< sm3FM >; + + maskLeft = (val & 0x10) ? -1 : 0; + maskRight = (val & 0x20) ? -1 : 0; + //opl2 active + } + else + { + //Disable updating percussion channels + if((fourMask & 0x40) && (chip->regBD & 0x20)) + { + //Regular dual op, am or fm + } + else if(val & 1) + synthHandler = &Channel::BlockTemplate< sm2AM >; + else + synthHandler = &Channel::BlockTemplate< sm2FM >; + } + } + + void Channel::ResetC0(const Chip *chip) + { + Bit8u val = regC0; + regC0 ^= 0xff; + WriteC0(chip, val); + } + + template< bool opl3Mode> + INLINE void Channel::GeneratePercussion(Chip *chip, Bit32s *output) + { + Channel *chan = this; + //BassDrum + Bit32s mod = (Bit32u)((old[0] + old[1])) >> feedback; + old[0] = old[1]; + old[1] = Op(0)->GetSample(mod); + + //When bassdrum is in AM mode first operator is ignoed + if(chan->regC0 & 1) + mod = 0; + else + mod = old[0]; + + Bit32s sample = Op(1)->GetSample(mod); + //Precalculate stuff used by other outputs + Bit32u noiseBit = chip->ForwardNoise() & 0x1; + Bit32u c2 = Op(2)->ForwardWave(); + Bit32u c5 = Op(5)->ForwardWave(); + Bit32u phaseBit = (((c2 & 0x88) ^ ((c2 << 5) & 0x80)) | ((c5 ^ (c5 << 2)) & 0x20)) ? 0x02 : 0x00; + //Hi-Hat + Bit32u hhVol = Op(2)->ForwardVolume(); + + if(!ENV_SILENT(hhVol)) + { + Bit32u hhIndex = (phaseBit << 8) | (0x34 << (phaseBit ^ (noiseBit << 1))); + sample += Op(2)->GetWave(hhIndex, hhVol); + } + + //Snare Drum + Bit32u sdVol = Op(3)->ForwardVolume(); + + if(!ENV_SILENT(sdVol)) + { + Bit32u sdIndex = (0x100 + (c2 & 0x100)) ^ (noiseBit << 8); + sample += Op(3)->GetWave(sdIndex, sdVol); + } + + //Tom-tom + sample += Op(4)->GetSample(0); + //Top-Cymbal + Bit32u tcVol = Op(5)->ForwardVolume(); + + if(!ENV_SILENT(tcVol)) + { + Bit32u tcIndex = (1 + phaseBit) << 8; + sample += Op(5)->GetWave(tcIndex, tcVol); + } + + sample <<= 1; + + if(opl3Mode) + { + output[0] += sample; + output[1] += sample; + } + else + output[0] += sample; + } + + template + Channel *Channel::BlockTemplate(Chip *chip, Bit32u samples, Bit32s *output) + { + switch(mode) + { + case sm2AM: + case sm3AM: + if(Op(0)->Silent() && Op(1)->Silent()) + { + old[0] = old[1] = 0; + return (this + 1); + } + + break; + + case sm2FM: + case sm3FM: + if(Op(1)->Silent()) + { + old[0] = old[1] = 0; + return (this + 1); + } + + break; + + case sm3FMFM: + if(Op(3)->Silent()) + { + old[0] = old[1] = 0; + return (this + 2); + } + + break; + + case sm3AMFM: + if(Op(0)->Silent() && Op(3)->Silent()) + { + old[0] = old[1] = 0; + return (this + 2); + } + + break; + + case sm3FMAM: + if(Op(1)->Silent() && Op(3)->Silent()) + { + old[0] = old[1] = 0; + return (this + 2); + } + + break; + + case sm3AMAM: + if(Op(0)->Silent() && Op(2)->Silent() && Op(3)->Silent()) + { + old[0] = old[1] = 0; + return (this + 2); + } + + break; + + default: + break; + } + + //Init the operators with the the current vibrato and tremolo values + Op(0)->Prepare(chip); + Op(1)->Prepare(chip); + + if(mode > sm4Start) + { + Op(2)->Prepare(chip); + Op(3)->Prepare(chip); + } + + if(mode > sm6Start) + { + Op(4)->Prepare(chip); + Op(5)->Prepare(chip); + } + + for(Bitu i = 0; i < samples; i++) + { + //Early out for percussion handlers + if(mode == sm2Percussion) + { + GeneratePercussion(chip, output + i); + continue; //Prevent some unitialized value bitching + } + else if(mode == sm3Percussion) + { + GeneratePercussion(chip, output + i * 2); + continue; //Prevent some unitialized value bitching + } + + //Do unsigned shift so we can shift out all bits but still stay in 10 bit range otherwise + Bit32s mod = (Bit32u)((old[0] + old[1])) >> feedback; + old[0] = old[1]; + old[1] = Op(0)->GetSample(mod); + Bit32s sample; + Bit32s out0 = old[0]; + + if(mode == sm2AM || mode == sm3AM) + sample = out0 + Op(1)->GetSample(0); + else if(mode == sm2FM || mode == sm3FM) + sample = Op(1)->GetSample(out0); + else if(mode == sm3FMFM) + { + Bits next = Op(1)->GetSample(out0); + next = Op(2)->GetSample(next); + sample = Op(3)->GetSample(next); + } + else if(mode == sm3AMFM) + { + sample = out0; + Bits next = Op(1)->GetSample(0); + next = Op(2)->GetSample(next); + sample += Op(3)->GetSample(next); + } + else if(mode == sm3FMAM) + { + sample = Op(1)->GetSample(out0); + Bits next = Op(2)->GetSample(0); + sample += Op(3)->GetSample(next); + } + else if(mode == sm3AMAM) + { + sample = out0; + Bits next = Op(1)->GetSample(0); + sample += Op(2)->GetSample(next); + sample += Op(3)->GetSample(0); + } + + switch(mode) + { + case sm2AM: + case sm2FM: + output[ i ] += sample; + break; + + case sm3AM: + case sm3FM: + case sm3FMFM: + case sm3AMFM: + case sm3FMAM: + case sm3AMAM: + output[ i * 2 + 0 ] += sample & maskLeft; + output[ i * 2 + 1 ] += sample & maskRight; + break; + + default: + break; + } + } + + switch(mode) + { + case sm2AM: + case sm2FM: + case sm3AM: + case sm3FM: + return (this + 1); + + case sm3FMFM: + case sm3AMFM: + case sm3FMAM: + case sm3AMAM: + return(this + 2); + + case sm2Percussion: + case sm3Percussion: + return(this + 3); + } + + return 0; + } + + /* + Chip + */ + + Chip::Chip() + { + reg08 = 0; + reg04 = 0; + regBD = 0; + reg104 = 0; + opl3Active = 0; + //Extra zeros! + vibratoIndex = 0; + tremoloIndex = 0; + vibratoSign = 0; + vibratoShift = 0; + tremoloValue = 0; + vibratoStrength = 0; + tremoloStrength = 0; + waveFormMask = 0; + lfoCounter = 0; + lfoAdd = 0; + noiseCounter = 0; + noiseAdd = 0; + noiseValue = 0; + memset(freqMul, 0, sizeof(Bit32u) * 16); + memset(linearRates, 0, sizeof(Bit32u) * 76); + memset(attackRates, 0, sizeof(Bit32u) * 76); + } + + INLINE Bit32u Chip::ForwardNoise() + { + noiseCounter += noiseAdd; + Bitu count = noiseCounter >> LFO_SH; + noiseCounter &= WAVE_MASK; + + for(; count > 0; --count) + { + //Noise calculation from mame + noiseValue ^= (0x800302) & (0 - (noiseValue & 1)); + noiseValue >>= 1; + } + + return noiseValue; + } + + INLINE Bit32u Chip::ForwardLFO(Bit32u samples) + { + //Current vibrato value, runs 4x slower than tremolo + vibratoSign = (VibratoTable[ vibratoIndex >> 2]) >> 7; + vibratoShift = (VibratoTable[ vibratoIndex >> 2] & 7) + vibratoStrength; + tremoloValue = TremoloTable[ tremoloIndex ] >> tremoloStrength; + //Check hom many samples there can be done before the value changes + Bit32u todo = LFO_MAX - lfoCounter; + Bit32u count = (todo + lfoAdd - 1) / lfoAdd; + + if(count > samples) + { + count = samples; + lfoCounter += count * lfoAdd; + } + else + { + lfoCounter += count * lfoAdd; + lfoCounter &= (LFO_MAX - 1); + //Maximum of 7 vibrato value * 4 + vibratoIndex = (vibratoIndex + 1) & 31; + + //Clip tremolo to the the table size + if(tremoloIndex + 1 < TREMOLO_TABLE) + ++tremoloIndex; + else + tremoloIndex = 0; + } + + return count; + } + + + void Chip::WriteBD(Bit8u val) + { + Bit8u change = regBD ^ val; + + if(!change) + return; + + regBD = val; + //TODO could do this with shift and xor? + vibratoStrength = (val & 0x40) ? 0x00 : 0x01; + tremoloStrength = (val & 0x80) ? 0x00 : 0x02; + + if(val & 0x20) + { + //Drum was just enabled, make sure channel 6 has the right synth + if(change & 0x20) + { + if(opl3Active) + chan[6].synthHandler = &Channel::BlockTemplate< sm3Percussion >; + else + chan[6].synthHandler = &Channel::BlockTemplate< sm2Percussion >; + } + + //Bass Drum + if(val & 0x10) + { + chan[6].op[0].KeyOn(0x2); + chan[6].op[1].KeyOn(0x2); + } + else + { + chan[6].op[0].KeyOff(0x2); + chan[6].op[1].KeyOff(0x2); + } + + //Hi-Hat + if(val & 0x1) + chan[7].op[0].KeyOn(0x2); + else + chan[7].op[0].KeyOff(0x2); + + //Snare + if(val & 0x8) + chan[7].op[1].KeyOn(0x2); + else + chan[7].op[1].KeyOff(0x2); + + //Tom-Tom + if(val & 0x4) + chan[8].op[0].KeyOn(0x2); + else + chan[8].op[0].KeyOff(0x2); + + //Top Cymbal + if(val & 0x2) + chan[8].op[1].KeyOn(0x2); + else + chan[8].op[1].KeyOff(0x2); + + //Toggle keyoffs when we turn off the percussion + } + else if(change & 0x20) + { + //Trigger a reset to setup the original synth handler + chan[6].ResetC0(this); + chan[6].op[0].KeyOff(0x2); + chan[6].op[1].KeyOff(0x2); + chan[7].op[0].KeyOff(0x2); + chan[7].op[1].KeyOff(0x2); + chan[8].op[0].KeyOff(0x2); + chan[8].op[1].KeyOff(0x2); + } + } + + +#define REGOP( _FUNC_ ) \ + index = ( ( reg >> 3) & 0x20 ) | ( reg & 0x1f ); \ + if ( OpOffsetTable[ index ] ) { \ + Operator* regOp = (Operator*)( ((char *)this ) + OpOffsetTable[ index ] ); \ + regOp->_FUNC_( this, val ); \ + } + +#define REGCHAN( _FUNC_ ) \ + index = ( ( reg >> 4) & 0x10 ) | ( reg & 0xf ); \ + if ( ChanOffsetTable[ index ] ) { \ + Channel* regChan = (Channel*)( ((char *)this ) + ChanOffsetTable[ index ] ); \ + regChan->_FUNC_( this, val ); \ + } + + void Chip::WriteReg(Bit32u reg, Bit8u val) + { + Bitu index = 0; + + switch((reg & 0xf0) >> 4) + { + case 0x00 >> 4: + if(reg == 0x01) + waveFormMask = (val & 0x20) ? 0x7 : 0x0; + else if(reg == 0x104) + { + //Only detect changes in lowest 6 bits + if(!((reg104 ^ val) & 0x3f)) + return; + + //Always keep the highest bit enabled, for checking > 0x80 + reg104 = 0x80 | (val & 0x3f); + } + else if(reg == 0x105) + { + //MAME says the real opl3 doesn't reset anything on opl3 disable/enable till the next write in another register + if(!((opl3Active ^ val) & 1)) + return; + + opl3Active = (val & 1) ? 0xff : 0; + + //Update the 0xc0 register for all channels to signal the switch to mono/stereo handlers + for(int i = 0; i < 18; i++) + chan[i].ResetC0(this); + } + else if(reg == 0x08) + reg08 = val; + + case 0x10 >> 4: + break; + + case 0x20 >> 4: + case 0x30 >> 4: + REGOP(Write20); + break; + + case 0x40 >> 4: + case 0x50 >> 4: + REGOP(Write40); + break; + + case 0x60 >> 4: + case 0x70 >> 4: + REGOP(Write60); + break; + + case 0x80 >> 4: + case 0x90 >> 4: + REGOP(Write80); + break; + + case 0xa0 >> 4: + REGCHAN(WriteA0); + break; + + case 0xb0 >> 4: + if(reg == 0xbd) + WriteBD(val); + else + REGCHAN(WriteB0); + + break; + + case 0xc0 >> 4: + REGCHAN(WriteC0); + + case 0xd0 >> 4: + break; + + case 0xe0 >> 4: + case 0xf0 >> 4: + REGOP(WriteE0); + break; + } + } + + + Bit32u Chip::WriteAddr(Bit32u port, Bit8u val) + { + switch(port & 3) + { + case 0: + return val; + + case 2: + if(opl3Active || (val == 0x05)) + return 0x100 | val; + else + return val; + } + + return 0; + } + + void Chip::GenerateBlock2(Bitu total, Bit32s *output) + { + while(total > 0) + { + Bit32u samples = ForwardLFO(total); + memset(output, 0, sizeof(Bit32s) * samples); + int count = 0; + + for(Channel *ch = chan; ch < chan + 9;) + { + count++; + ch = (ch->*(ch->synthHandler))(this, samples, output); + } + + total -= samples; + output += samples; + } + } + + void Chip::GenerateBlock3(Bitu total, Bit32s *output) + { + while(total > 0) + { + Bit32u samples = ForwardLFO((Bit32u)total); + memset(output, 0, sizeof(Bit32s) * samples * 2); + int count = 0; + + for(Channel *ch = chan; ch < chan + 18;) + { + count++; + ch = (ch->*(ch->synthHandler))(this, samples, output); + } + + total -= samples; + output += samples * 2; + } + } + + void Chip::GenerateBlock2_Mix(Bitu total, Bit32s *output) + { + while(total > 0) + { + Bit32u samples = ForwardLFO((Bit32u)total); + int count = 0; + for(Channel *ch = chan; ch < chan + 9;) + { + count++; + ch = (ch->*(ch->synthHandler))(this, samples, output); + } + + total -= samples; + output += samples; + } + } + + void Chip::GenerateBlock3_Mix(Bitu total, Bit32s *output) + { + while(total > 0) + { + Bit32u samples = ForwardLFO(total); + int count = 0; + for(Channel *ch = chan; ch < chan + 18;) + { + count++; + ch = (ch->*(ch->synthHandler))(this, samples, output); + } + total -= samples; + output += samples * 2; + } + } + + void Chip::Setup(Bit32u rate) + { + double original = OPLRATE; + // double original = rate; + double scale = original / (double)rate; + //Noise counter is run at the same precision as general waves + noiseAdd = (Bit32u)(0.5 + scale * (1 << LFO_SH)); + noiseCounter = 0; + noiseValue = 1; //Make sure it triggers the noise xor the first time + //The low frequency oscillation counter + //Every time his overflows vibrato and tremoloindex are increased + lfoAdd = (Bit32u)(0.5 + scale * (1 << LFO_SH)); + lfoCounter = 0; + vibratoIndex = 0; + tremoloIndex = 0; + //With higher octave this gets shifted up + //-1 since the freqCreateTable = *2 + #ifdef WAVE_PRECISION + double freqScale = (1 << 7) * scale * (1 << (WAVE_SH - 1 - 10)); + + for(int i = 0; i < 16; i++) + freqMul[i] = (Bit32u)(0.5 + freqScale * FreqCreateTable[ i ]); + + #else + Bit32u freqScale = (Bit32u)(0.5 + scale * (1 << (WAVE_SH - 1 - 10))); + + for(int i = 0; i < 16; i++) + freqMul[i] = freqScale * FreqCreateTable[ i ]; + + #endif + + //-3 since the real envelope takes 8 steps to reach the single value we supply + for(Bit8u i = 0; i < 76; i++) + { + Bit8u index, shift; + EnvelopeSelect(i, index, shift); + linearRates[i] = (Bit32u)(scale * (EnvelopeIncreaseTable[ index ] << (RATE_SH + ENV_EXTRA - shift - 3))); + } + + if(rate == 48000) + { + /* BISQWIT ADD: Use precalculated table for this common sample-rate. + * Because the actual generation code, below, is MOLASSES SLOW on DOS. + */ + static const Bit32u precalculated_table[62] = + { + 2152, 2700, 3228, 3712, 4304, 5399, 6456, 7424, 8608, 10799, 12912, 14849, 17216, 21598, + 25824, 29698, 34432, 43196, 51650, 59398, 68864, 86392, 103310, 118795, 137746, 172847, + 206619, 237693, 275559, 345774, 413238, 475500, 543030, 678787, 814545, 950302, 1086060, + 1357575, 1629090, 1900605, 2172120, 2715151, 3258181, 3801211, 4344241, 5430302, + 6516362, 7602423, 8688483, 10860604, 13032725, 15204846, 17376967, 21721209, 26065451, + 30409693, 34753934, 43442418, 52130902, 60819386, 69507869, 69507869 + }; + + for(Bit8u i = 0; i < 62; i++) + attackRates[i] = precalculated_table[i]; + } + else if(rate == 44100) + { + static const Bit32u precalculated_table[62] = + { + 2342, 2939, 3513, 4040, 4685, 5877, 7027, 8081, 9369, 11754, 14054, 16162, 18738, 23508, + 28108, 32325, 37478, 47018, 56219, 64649, 74965, 94044, 112448, 129292, 149929, 188132, + 224945, 258713, 300002, 376263, 449999, 517550, 591053, 738816, 886579, 1034343, 1182106, + 1477633, 1773159, 2068686, 2364213, 2955266, 3546319, 4137373, 4728426, 5910533, + 7092639, 8274746, 9456853, 11821066, 14185279, 16549492, 18913706, 23642132, 28370559, + 33098985, 37827412, 47284265, 56741118, 66197971, 75654824, 75654824 + }; + + for(Bit8u i = 0; i < 62; i++) + attackRates[i] = precalculated_table[i]; + } + else if(rate == 22050) + { + static const Bit32u precalculated_table[62] = + { + 4685, 5877, 7027, 8081, 9369, 11754, 14054, 16162, 18738, 23508, 28108, 32325, 37478, + 47018, 56219, 64649, 74965, 94044, 112448, 129292, 149929, 188132, 224945, 258713, 300002, + 376263, 449999, 517550, 591053, 738816, 886579, 1034343, 1182106, 1477633, 1773159, + 2068686, 2364213, 2955266, 3546319, 4137373, 4728426, 5910533, 7092639, 8274746, + 9456853, 11821066, 14185279, 16549492, 18913706, 23642132, 28370559, 33098985, + 37827412, 47284265, 56741118, 66197971, 75654824, 94568530, 113482236, 132395942, + 151309648, 151309648 + }; + + for(Bit8u i = 0; i < 62; i++) + attackRates[i] = precalculated_table[i]; + } + //Generate the best matching attack rate + else for(Bit8u i = 0; i < 62; i++) + { + Bit8u index, shift; + EnvelopeSelect(i, index, shift); + //Original amount of samples the attack would take + Bit32s original = (Bit32u)((AttackSamplesTable[ index ] << shift) / scale); + Bit32s guessAdd = (Bit32u)(scale * (EnvelopeIncreaseTable[ index ] << (RATE_SH - shift - 3))); + Bit32s bestAdd = guessAdd; + Bit32u bestDiff = 1 << 30; + + for(Bit32u passes = 0; passes < 16; passes ++) + { + Bit32s volume = ENV_MAX; + Bit32s samples = 0; + Bit32u count = 0; + + while(volume > 0 && samples < original * 2) + { + count += guessAdd; + Bit32s change = count >> RATE_SH; + count &= RATE_MASK; + + if(GCC_UNLIKELY(change)) // less than 1 % + volume += (~volume * change) >> 3; + + samples++; + } + + Bit32s diff = original - samples; + Bit32u lDiff = labs(diff); + + //Init last on first pass + if(lDiff < bestDiff) + { + bestDiff = lDiff; + bestAdd = guessAdd; + + if(!bestDiff) + break; + } + + //Below our target + if(diff < 0) + { + //Better than the last time + Bit32s mul = ((original - diff) << 12) / original; + guessAdd = ((guessAdd * mul) >> 12); + guessAdd++; + } + else if(diff > 0) + { + Bit32s mul = ((original - diff) << 12) / original; + guessAdd = (guessAdd * mul) >> 12; + guessAdd--; + } + } + + attackRates[i] = bestAdd; + } + + /*fprintf(stderr, "attack rate table: "); + for ( Bit8u i = 0; i < 62; i++ ) + fprintf(stderr, ",%u", attackRates[i]); + fprintf(stderr, "\n");*/ + + for(Bit8u i = 62; i < 76; i++) + { + //This should provide instant volume maximizing + attackRates[i] = 8 << RATE_SH; + } + + //Setup the channels with the correct four op flags + //Channels are accessed through a table so they appear linear here + chan[ 0].fourMask = 0x00 | (1 << 0); + chan[ 1].fourMask = 0x80 | (1 << 0); + chan[ 2].fourMask = 0x00 | (1 << 1); + chan[ 3].fourMask = 0x80 | (1 << 1); + chan[ 4].fourMask = 0x00 | (1 << 2); + chan[ 5].fourMask = 0x80 | (1 << 2); + chan[ 9].fourMask = 0x00 | (1 << 3); + chan[10].fourMask = 0x80 | (1 << 3); + chan[11].fourMask = 0x00 | (1 << 4); + chan[12].fourMask = 0x80 | (1 << 4); + chan[13].fourMask = 0x00 | (1 << 5); + chan[14].fourMask = 0x80 | (1 << 5); + //mark the percussion channels + chan[ 6].fourMask = 0x40; + chan[ 7].fourMask = 0x40; + chan[ 8].fourMask = 0x40; + //Clear Everything in opl3 mode + WriteReg(0x105, 0x1); + + for(int i = 0; i < 512; i++) + { + if(i == 0x105) + continue; + + WriteReg(i, 0xff); + WriteReg(i, 0x0); + } + + WriteReg(0x105, 0x0); + + //Clear everything in opl2 mode + for(int i = 0; i < 255; i++) + { + WriteReg(i, 0xff); + WriteReg(i, 0x0); + } + } + + static bool doneTables = false; + void InitTables(void) + { + if(doneTables) + return; + + doneTables = true; + #if ( DBOPL_WAVE == WAVE_HANDLER ) || ( DBOPL_WAVE == WAVE_TABLELOG ) + + //Exponential volume table, same as the real adlib + for(int i = 0; i < 256; i++) + { + //Save them in reverse + ExpTable[i] = (int)(0.5 + (pow(2.0, (255 - i) * (1.0 / 256)) - 1) * 1024); + ExpTable[i] += 1024; //or remove the -1 oh well :) + //Preshift to the left once so the final volume can shift to the right + ExpTable[i] *= 2; + } + + #endif + #if ( DBOPL_WAVE == WAVE_HANDLER ) + + //Add 0.5 for the trunc rounding of the integer cast + //Do a PI sinetable instead of the original 0.5 PI + for(int i = 0; i < 512; i++) + SinTable[i] = (Bit16s)(0.5 - log10(sin((i + 0.5) * (PI / 512.0))) / log10(2.0) * 256); + + #endif + #if ( DBOPL_WAVE == WAVE_TABLEMUL ) + + //Multiplication based tables + for(int i = 0; i < 384; i++) + { + int s = i * 8; + //TODO maybe keep some of the precision errors of the original table? + double val = (0.5 + (pow(2.0, -1.0 + (255 - s) * (1.0 / 256))) * (1 << MUL_SH)); + MulTable[i] = (Bit16u)(val); + } + + //Sine Wave Base + for(int i = 0; i < 512; i++) + { + WaveTable[ 0x0200 + i ] = (Bit16s)(sin((i + 0.5) * (PI / 512.0)) * 4084); + WaveTable[ 0x0000 + i ] = -WaveTable[ 0x200 + i ]; + } + + //Exponential wave + for(int i = 0; i < 256; i++) + { + WaveTable[ 0x700 + i ] = (Bit16s)(0.5 + (pow(2.0, -1.0 + (255 - i * 8) * (1.0 / 256))) * 4085); + WaveTable[ 0x6ff - i ] = -WaveTable[ 0x700 + i ]; + } + + #endif + #if ( DBOPL_WAVE == WAVE_TABLELOG ) + + //Sine Wave Base + for(int i = 0; i < 512; i++) + { + WaveTable[ 0x0200 + i ] = (Bit16s)(0.5 - log10(sin((i + 0.5) * (PI / 512.0))) / log10(2.0) * 256); + WaveTable[ 0x0000 + i ] = ((Bit16s)0x8000) | WaveTable[ 0x200 + i]; + } + + //Exponential wave + for(int i = 0; i < 256; i++) + { + WaveTable[ 0x700 + i ] = i * 8; + WaveTable[ 0x6ff - i ] = ((Bit16s)0x8000) | i * 8; + } + + #endif + // | |//\\|____|WAV7|//__|/\ |____|/\/\| + // |\\//| | |WAV7| | \/| | | + // |06 |0126|27 |7 |3 |4 |4 5 |5 | + #if (( DBOPL_WAVE == WAVE_TABLELOG ) || ( DBOPL_WAVE == WAVE_TABLEMUL )) + + for(int i = 0; i < 256; i++) + { + //Fill silence gaps + WaveTable[ 0x400 + i ] = WaveTable[0]; + WaveTable[ 0x500 + i ] = WaveTable[0]; + WaveTable[ 0x900 + i ] = WaveTable[0]; + WaveTable[ 0xc00 + i ] = WaveTable[0]; + WaveTable[ 0xd00 + i ] = WaveTable[0]; + //Replicate sines in other pieces + WaveTable[ 0x800 + i ] = WaveTable[ 0x200 + i ]; + //double speed sines + WaveTable[ 0xa00 + i ] = WaveTable[ 0x200 + i * 2 ]; + WaveTable[ 0xb00 + i ] = WaveTable[ 0x000 + i * 2 ]; + WaveTable[ 0xe00 + i ] = WaveTable[ 0x200 + i * 2 ]; + WaveTable[ 0xf00 + i ] = WaveTable[ 0x200 + i * 2 ]; + } + + #endif + + //Create the ksl table + for(int oct = 0; oct < 8; oct++) + { + int base = oct * 8; + + for(int i = 0; i < 16; i++) + { + int val = base - KslCreateTable[i]; + + if(val < 0) + val = 0; + + //*4 for the final range to match attenuation range + KslTable[ oct * 16 + i ] = val * 4; + } + } + + //Create the Tremolo table, just increase and decrease a triangle wave + for(Bit8u i = 0; i < TREMOLO_TABLE / 2; i++) + { + Bit8u val = i << ENV_EXTRA; + TremoloTable[i] = val; + TremoloTable[TREMOLO_TABLE - 1 - i] = val; + } + + //Create a table with offsets of the channels from the start of the chip + DBOPL::Chip *chip = 0; + + for(Bitu i = 0; i < 32; i++) + { + Bitu index = i & 0xf; + + if(index >= 9) + { + ChanOffsetTable[i] = 0; + continue; + } + + //Make sure the four op channels follow eachother + if(index < 6) + index = (index % 3) * 2 + (index / 3); + + //Add back the bits for highest ones + if(i >= 16) + index += 9; + + Bitu blah = reinterpret_cast(&(chip->chan[ index ])); + ChanOffsetTable[i] = blah; + } + + //Same for operators + for(Bitu i = 0; i < 64; i++) + { + if(i % 8 >= 6 || ((i / 8) % 4 == 3)) + { + OpOffsetTable[i] = 0; + continue; + } + + Bitu chNum = (i / 8) * 3 + (i % 8) % 3; + + //Make sure we use 16 and up for the 2nd range to match the chanoffset gap + if(chNum >= 12) + chNum += 16 - 12; + + Bitu opNum = (i % 8) / 3; + DBOPL::Channel *chan = 0; + Bitu blah = reinterpret_cast(&(chan->op[opNum])); + OpOffsetTable[i] = ChanOffsetTable[ chNum ] + blah; + } + + #if 0 + + //Stupid checks if table's are correct + for(Bitu i = 0; i < 18; i++) + { + Bit32u find = (Bit16u)(&(chip->chan[ i ])); + + for(Bitu c = 0; c < 32; c++) + { + if(ChanOffsetTable[c] == find) + { + find = 0; + break; + } + } + + if(find) + find = find; + } + + for(Bitu i = 0; i < 36; i++) + { + Bit32u find = (Bit16u)(&(chip->chan[ i / 2 ].op[i % 2])); + + for(Bitu c = 0; c < 64; c++) + { + if(OpOffsetTable[c] == find) + { + find = 0; + break; + } + } + + if(find) + find = find; + } + + #endif + } + + Bit32u Handler::WriteAddr(Bit32u port, Bit8u val) + { + return chip.WriteAddr(port, val); + } + void Handler::WriteReg(Bit32u addr, Bit8u val) + { + chip.WriteReg(addr, val); + } + + void Handler::Generate(void(*AddSamples_m32)(Bitu, Bit32s *), + void(*AddSamples_s32)(Bitu, Bit32s *), + Bitu samples) + { + Bit32s buffer[ 512 * 2 ]; + + if(GCC_UNLIKELY(samples > 512)) + samples = 512; + + if(!chip.opl3Active) + { + chip.GenerateBlock2(samples, buffer); + AddSamples_m32(samples, buffer); + } + else + { + chip.GenerateBlock3(samples, buffer); + AddSamples_s32(samples, buffer); + } + } + + void Handler::GenerateArr(Bit32s *out, Bitu *samples) + { + if(GCC_UNLIKELY(*samples > 512)) + *samples = 512; + + if(!chip.opl3Active) + chip.GenerateBlock2(*samples, out); + else + chip.GenerateBlock3(*samples, out); + } + + void Handler::GenerateArr(Bit32s *out, ssize_t *samples) + { + if(GCC_UNLIKELY(*samples > 512)) + *samples = 512; + + if(!chip.opl3Active) + chip.GenerateBlock2(static_cast(*samples), out); + else + chip.GenerateBlock3(static_cast(*samples), out); + } + + void Handler::GenerateArr(Bit16s *out, ssize_t *samples) + { + Bit32s out32[1024]; + if(GCC_UNLIKELY(*samples > 512)) + *samples = 512; + memset(out32, 0, sizeof(Bit32s) * 1024); + if(!chip.opl3Active) + chip.GenerateBlock2(static_cast(*samples), out32); + else + chip.GenerateBlock3(static_cast(*samples), out32); + ssize_t sz = *samples * 2; + for(ssize_t i = 0; i < sz; i++) + out[i] = static_cast(DBOPL_CLAMP(out32[i], static_cast(INT16_MIN), static_cast(INT16_MAX))); + } + + void Handler::GenerateArrMix(Bit32s *out, ssize_t *samples) + { + if(GCC_UNLIKELY(*samples > 512)) + *samples = 512; + if(!chip.opl3Active) + chip.GenerateBlock2_Mix(static_cast(*samples), out); + else + chip.GenerateBlock3_Mix(static_cast(*samples), out); + } + + void Handler::GenerateArrMix(Bit16s *out, ssize_t *samples) + { + Bit32s out32[1024]; + if(GCC_UNLIKELY(*samples > 512)) + *samples = 512; + memset(out32, 0, sizeof(Bit32s) * 1024); + if(!chip.opl3Active) + chip.GenerateBlock2(static_cast(*samples), out32); + else + chip.GenerateBlock3(static_cast(*samples), out32); + ssize_t sz = *samples * 2; + for(ssize_t i = 0; i < sz; i++) + out[i] += static_cast(DBOPL_CLAMP(out32[i], static_cast(INT16_MIN), static_cast(INT16_MAX))); + } + + + void Handler::Init(Bitu rate) + { + InitTables(); + chip.Setup((Bit32u)rate); + } + + +} //Namespace DBOPL + +#endif //ADLMIDI_USE_DOSBOX_OPL diff --git a/src/sound/adlmidi/dbopl.h b/src/sound/adlmidi/dbopl.h new file mode 100644 index 000000000..b5b2ba10d --- /dev/null +++ b/src/sound/adlmidi/dbopl.h @@ -0,0 +1,314 @@ +/* + * Copyright (C) 2002-2010 The DOSBox Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +/* BEGIN MIDIPLAY GLUE */ +#include +#include +typedef unsigned long Bitu; +typedef signed long Bits; +typedef unsigned Bit32u; +typedef int Bit32s; +typedef unsigned short Bit16u; +typedef signed short Bit16s; +typedef unsigned char Bit8u; +typedef signed char Bit8s; +#define INLINE inline +#ifdef _MSC_VER +#define GCC_UNLIKELY(x) (!!(x) == 0) +#define GCC_LIKELY(x) (!!(x) == 1) +#else +#define GCC_UNLIKELY(x) __builtin_expect((x),0) +#define GCC_LIKELY(x) __builtin_expect((x),1) +#endif +/* END MIDIPLAY GLUE */ + +//Use 8 handlers based on a small logatirmic wavetabe and an exponential table for volume +#define WAVE_HANDLER 10 +//Use a logarithmic wavetable with an exponential table for volume +#define WAVE_TABLELOG 11 +//Use a linear wavetable with a multiply table for volume +#define WAVE_TABLEMUL 12 + +//Select the type of wave generator routine +#define DBOPL_WAVE WAVE_TABLEMUL + +#ifdef _WIN32 +# ifdef _MSC_VER +# ifdef _WIN64 +typedef __int64 ssize_t; +# else +typedef __int32 ssize_t; +# endif +# else +# ifdef _WIN64 +typedef int64_t ssize_t; +# else +typedef int32_t ssize_t; +# endif +# endif +#endif + +namespace DBOPL +{ + + struct Chip; + struct Operator; + struct Channel; + +#if (DBOPL_WAVE == WAVE_HANDLER) + typedef Bits(DB_FASTCALL *WaveHandler)(Bitu i, Bitu volume); +#endif + + typedef Bits(DBOPL::Operator::*VolumeHandler)(); + typedef Channel *(DBOPL::Channel::*SynthHandler)(Chip *chip, Bit32u samples, Bit32s *output); + + //Different synth modes that can generate blocks of data + typedef enum + { + sm2AM, + sm2FM, + sm3AM, + sm3FM, + sm4Start, + sm3FMFM, + sm3AMFM, + sm3FMAM, + sm3AMAM, + sm6Start, + sm2Percussion, + sm3Percussion + } SynthMode; + + //Shifts for the values contained in chandata variable + enum + { + SHIFT_KSLBASE = 16, + SHIFT_KEYCODE = 24 + }; + + struct Operator + { + public: + //Masks for operator 20 values + enum + { + MASK_KSR = 0x10, + MASK_SUSTAIN = 0x20, + MASK_VIBRATO = 0x40, + MASK_TREMOLO = 0x80 + }; + + typedef enum + { + OFF, + RELEASE, + SUSTAIN, + DECAY, + ATTACK + } State; + + VolumeHandler volHandler; + +#if (DBOPL_WAVE == WAVE_HANDLER) + WaveHandler waveHandler; //Routine that generate a wave +#else + Bit16s *waveBase; + Bit32u waveMask; + Bit32u waveStart; +#endif + Bit32u waveIndex; //WAVE_BITS shifted counter of the frequency index + Bit32u waveAdd; //The base frequency without vibrato + Bit32u waveCurrent; //waveAdd + vibratao + + Bit32u chanData; //Frequency/octave and derived data coming from whatever channel controls this + Bit32u freqMul; //Scale channel frequency with this, TODO maybe remove? + Bit32u vibrato; //Scaled up vibrato strength + Bit32s sustainLevel; //When stopping at sustain level stop here + Bit32s totalLevel; //totalLevel is added to every generated volume + Bit32u currentLevel; //totalLevel + tremolo + Bit32s volume; //The currently active volume + + Bit32u attackAdd; //Timers for the different states of the envelope + Bit32u decayAdd; + Bit32u releaseAdd; + Bit32u rateIndex; //Current position of the evenlope + + Bit8u rateZero; //Bits for the different states of the envelope having no changes + Bit8u keyOn; //Bitmask of different values that can generate keyon + //Registers, also used to check for changes + Bit8u reg20, reg40, reg60, reg80, regE0; + //Active part of the envelope we're in + Bit8u state; + //0xff when tremolo is enabled + Bit8u tremoloMask; + //Strength of the vibrato + Bit8u vibStrength; + //Keep track of the calculated KSR so we can check for changes + Bit8u ksr; + private: + void SetState(Bit8u s); + void UpdateAttack(const Chip *chip); + void UpdateRelease(const Chip *chip); + void UpdateDecay(const Chip *chip); + public: + void UpdateAttenuation(); + void UpdateRates(const Chip *chip); + void UpdateFrequency(); + + void Write20(const Chip *chip, Bit8u val); + void Write40(const Chip *chip, Bit8u val); + void Write60(const Chip *chip, Bit8u val); + void Write80(const Chip *chip, Bit8u val); + void WriteE0(const Chip *chip, Bit8u val); + + bool Silent() const; + void Prepare(const Chip *chip); + + void KeyOn(Bit8u mask); + void KeyOff(Bit8u mask); + + template< State state> + Bits TemplateVolume(); + + Bit32s RateForward(Bit32u add); + Bitu ForwardWave(); + Bitu ForwardVolume(); + + Bits GetSample(Bits modulation); + Bits GetWave(Bitu index, Bitu vol); + public: + Operator(); + char ____padding[5]; + }; + + struct Channel + { + Operator op[2]; + inline Operator *Op(Bitu index) + { + return &((this + (index >> 1))->op[ index & 1 ]); + } + SynthHandler synthHandler; + Bit32u chanData; //Frequency/octave and derived values + Bit32s old[2]; //Old data for feedback + + Bit8u feedback; //Feedback shift + Bit8u regB0; //Register values to check for changes + Bit8u regC0; + //This should correspond with reg104, bit 6 indicates a Percussion channel, bit 7 indicates a silent channel + Bit8u fourMask; + Bit8s maskLeft; //Sign extended values for both channel's panning + Bit8s maskRight; + + //Forward the channel data to the operators of the channel + void SetChanData(const Chip *chip, Bit32u data); + //Change in the chandata, check for new values and if we have to forward to operators + void UpdateFrequency(const Chip *chip, Bit8u fourOp); + void WriteA0(const Chip *chip, Bit8u val); + void WriteB0(const Chip *chip, Bit8u val); + void WriteC0(const Chip *chip, Bit8u val); + void ResetC0(const Chip *chip); + + //call this for the first channel + template< bool opl3Mode > + void GeneratePercussion(Chip *chip, Bit32s *output); + + //Generate blocks of data in specific modes + template + Channel *BlockTemplate(Chip *chip, Bit32u samples, Bit32s *output); + Channel(); + char ____padding[6]; + }; + + struct Chip + { + //This is used as the base counter for vibrato and tremolo + Bit32u lfoCounter; + Bit32u lfoAdd; + + + Bit32u noiseCounter; + Bit32u noiseAdd; + Bit32u noiseValue; + + //Frequency scales for the different multiplications + Bit32u freqMul[16]; + //Rates for decay and release for rate of this chip + Bit32u linearRates[76]; + //Best match attack rates for the rate of this chip + Bit32u attackRates[76]; + + //18 channels with 2 operators each + Channel chan[18]; + + Bit8u reg104; + Bit8u reg08; + Bit8u reg04; + Bit8u regBD; + Bit8u vibratoIndex; + Bit8u tremoloIndex; + Bit8s vibratoSign; + Bit8u vibratoShift; + Bit8u tremoloValue; + Bit8u vibratoStrength; + Bit8u tremoloStrength; + //Mask for allowed wave forms + Bit8u waveFormMask; + //0 or -1 when enabled + Bit8s opl3Active; + + //Return the maximum amount of samples before and LFO change + Bit32u ForwardLFO(Bit32u samples); + Bit32u ForwardNoise(); + + void WriteBD(Bit8u val); + void WriteReg(Bit32u reg, Bit8u val); + + Bit32u WriteAddr(Bit32u port, Bit8u val); + + void GenerateBlock2(Bitu samples, Bit32s *output); + void GenerateBlock3(Bitu samples, Bit32s *output); + + void GenerateBlock2_Mix(Bitu samples, Bit32s *output); + void GenerateBlock3_Mix(Bitu samples, Bit32s *output); + + void Generate(Bit32u samples); + void Setup(Bit32u r); + + Chip(); + }; + + struct Handler + { + DBOPL::Chip chip; + Bit32u WriteAddr(Bit32u port, Bit8u val); + void WriteReg(Bit32u addr, Bit8u val); + void Generate(void(*AddSamples_m32)(Bitu, Bit32s *), + void(*AddSamples_s32)(Bitu, Bit32s *), + Bitu samples); + void GenerateArr(Bit32s *out, Bitu *samples); + void GenerateArr(Bit32s *out, ssize_t *samples); + void GenerateArr(Bit16s *out, ssize_t *samples); + void GenerateArrMix(Bit32s *out, ssize_t *samples); + void GenerateArrMix(Bit16s *out, ssize_t *samples); + void Init(Bitu rate); + }; + + +} //Namespace diff --git a/src/sound/adlmidi/fraction.hpp b/src/sound/adlmidi/fraction.hpp new file mode 100644 index 000000000..1ec10ab57 --- /dev/null +++ b/src/sound/adlmidi/fraction.hpp @@ -0,0 +1,206 @@ +#ifndef bqw_fraction_h +#define bqw_fraction_h + +#include +#include + +/* Fraction number handling. + * Copyright (C) 1992,2001 Bisqwit (http://iki.fi/bisqwit/) + */ + +template +class fraction +{ + inttype num1, num2; + typedef fraction self; + void Optim(); + + #if 1 + inline void Debug(char, const self &) { } + #else + inline void Debug(char op, const self &b) + { + cerr << nom() << '/' << denom() << ' ' << op + << ' ' << b.nom() << '/' << denom() + << ":\n"; + } + #endif +public: + void set(inttype n, inttype d) { num1=n; num2=d; Optim(); } + + fraction() : num1(0), num2(1) { } + fraction(inttype value) : num1(value), num2(1) { } + fraction(inttype n, inttype d) : num1(n), num2(d) { } + fraction(int value) : num1(value), num2(1) { } + template + explicit fraction(const floattype value) { operator= (value); } + inline double value() const {return nom() / (double)denom(); } + inline long double valuel() const {return nom() / (long double)denom(); } + self &operator+= (const inttype &value) { num1+=value*denom(); Optim(); return *this; } + self &operator-= (const inttype &value) { num1-=value*denom(); Optim(); return *this; } + self &operator*= (const inttype &value) { num1*=value; Optim(); return *this; } + self &operator/= (const inttype &value) { num2*=value; Optim(); return *this; } + self &operator+= (const self &b); + self &operator-= (const self &b); + self &operator*= (const self &b) { Debug('*',b);num1*=b.nom(); num2*=b.denom(); Optim(); return *this; } + self &operator/= (const self &b) { Debug('/',b);num1*=b.denom(); num2*=b.nom(); Optim(); return *this; } + self operator- () const { return self(-num1, num2); } + +#define fraction_blah_func(op1, op2) \ + self operator op1 (const self &b) const { self tmp(*this); tmp op2 b; return tmp; } + + fraction_blah_func( +, += ) + fraction_blah_func( -, -= ) + fraction_blah_func( /, /= ) + fraction_blah_func( *, *= ) + +#undef fraction_blah_func +#define fraction_blah_func(op) \ + bool operator op(const self &b) const { return value() op b.value(); } \ + bool operator op(inttype b) const { return value() op b; } + + fraction_blah_func( < ) + fraction_blah_func( > ) + fraction_blah_func( <= ) + fraction_blah_func( >= ) + +#undef fraction_blah_func + + const inttype &nom() const { return num1; } + const inttype &denom() const { return num2; } + inline bool operator == (inttype b) const { return denom() == 1 && nom() == b; } + inline bool operator != (inttype b) const { return denom() != 1 || nom() != b; } + inline bool operator == (const self &b) const { return denom()==b.denom() && nom()==b.nom(); } + inline bool operator != (const self &b) const { return denom()!=b.denom() || nom()!=b.nom(); } + //operator bool () const { return nom() != 0; } + inline bool negative() const { return (nom() < 0) ^ (denom() < 0); } + + self &operator= (const inttype value) { num2=1; num1=value; return *this; } + //self &operator= (int value) { num2=1; num1=value; return *this; } + + self &operator= (double orig) { return *this = (long double)orig; } + self &operator= (long double orig); +}; + +template +void fraction::Optim() +{ + /* Euclidean algorithm */ + inttype n1, n2, nn1, nn2; + + nn1 = std::numeric_limits::is_signed ? (num1 >= 0 ? num1 : -num1) : num1; + nn2 = std::numeric_limits::is_signed ? (num2 >= 0 ? num2 : -num2) : num2; + + if(nn1 < nn2) + n1 = num1, n2 = num2; + else + n1 = num2, n2 = num1; + + if(!num1) { num2 = 1; return; } + for(;;) + { + //fprintf(stderr, "%d/%d: n1=%d,n2=%d\n", nom(),denom(),n1,n2); + inttype tmp = n2 % n1; + if(!tmp)break; + n2 = n1; + n1 = tmp; + } + num1 /= n1; + num2 /= n1; + //fprintf(stderr, "result: %d/%d\n\n", nom(), denom()); +} + +template +inline const fraction abs(const fraction &f) +{ + return fraction(abs(f.nom()), abs(f.denom())); +} + +#define fraction_blah_func(op) \ + template \ + fraction operator op \ + (const inttype bla, const fraction &b) \ + { return fraction (bla) op b; } +fraction_blah_func( + ) +fraction_blah_func( - ) +fraction_blah_func( * ) +fraction_blah_func( / ) +#undef fraction_blah_func + +#define fraction_blah_func(op1, op2) \ + template \ + fraction &fraction::operator op2 (const fraction &b) \ + { \ + inttype newnom = nom()*b.denom() op1 denom()*b.nom(); \ + num2 *= b.denom(); \ + num1 = newnom; \ + Optim(); \ + return *this; \ + } +fraction_blah_func( +, += ) +fraction_blah_func( -, -= ) +#undef fraction_blah_func + +template +fraction &fraction::operator= (long double orig) +{ + if(orig == 0.0) + { + set(0, 0); + return *this; + } + + inttype cf[25]; + for(int maxdepth=1; maxdepth<25; ++maxdepth) + { + inttype u,v; + long double virhe, a=orig; + int i, viim; + + for(i = 0; i < maxdepth; ++i) + { + cf[i] = (inttype)a; + if(cf[i]-1 > cf[i])break; + a = 1.0 / (a - cf[i]); + } + + for(viim=i-1; i < maxdepth; ++i) + cf[i] = 0; + + u = cf[viim]; + v = 1; + for(i = viim-1; i >= 0; --i) + { + inttype w = cf[i] * u + v; + v = u; + u = w; + } + + virhe = (orig - (u / (long double)v)) / orig; + + set(u, v); + //if(verbose > 4) + // cerr << "Guess: " << *this << " - error = " << virhe*100 << "%\n"; + + if(virhe < 1e-8 && virhe > -1e-8)break; + } + + //if(verbose > 4) + //{ + // cerr << "Fraction=" << orig << ": " << *this << endl; + //} + + return *this; +} + + +/* +template +ostream &operator << (ostream &dest, const fraction &m) +{ + if(m.denom() == (inttype)1) return dest << m.nom(); + return dest << m.nom() << '/' << m.denom(); +} +*/ + +#endif diff --git a/src/sound/adlmidi/nukedopl3.c b/src/sound/adlmidi/nukedopl3.c new file mode 100644 index 000000000..6ae1eb76e --- /dev/null +++ b/src/sound/adlmidi/nukedopl3.c @@ -0,0 +1,1391 @@ +/* + * Copyright (C) 2013-2016 Alexey Khokholov (Nuke.YKT) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Nuked OPL3 emulator. + * Thanks: + * MAME Development Team(Jarek Burczynski, Tatsuyuki Satoh): + * Feedback and Rhythm part calculation information. + * forums.submarine.org.uk(carbon14, opl3): + * Tremolo and phase generator calculation information. + * OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): + * OPL2 ROMs. + * + * version: 1.7.4 + */ + +#include +#include +#include +#include "nukedopl3.h" + +#define RSM_FRAC 10 + +/* Channel types */ + +enum { + ch_2op = 0, + ch_4op = 1, + ch_4op2 = 2, + ch_drum = 3 +}; + +/* Envelope key types */ + +enum { + egk_norm = 0x01, + egk_drum = 0x02 +}; + + +/* + * logsin table + */ + +static const Bit16u logsinrom[512] = { + 0x859, 0x6c3, 0x607, 0x58b, 0x52e, 0x4e4, 0x4a6, 0x471, + 0x443, 0x41a, 0x3f5, 0x3d3, 0x3b5, 0x398, 0x37e, 0x365, + 0x34e, 0x339, 0x324, 0x311, 0x2ff, 0x2ed, 0x2dc, 0x2cd, + 0x2bd, 0x2af, 0x2a0, 0x293, 0x286, 0x279, 0x26d, 0x261, + 0x256, 0x24b, 0x240, 0x236, 0x22c, 0x222, 0x218, 0x20f, + 0x206, 0x1fd, 0x1f5, 0x1ec, 0x1e4, 0x1dc, 0x1d4, 0x1cd, + 0x1c5, 0x1be, 0x1b7, 0x1b0, 0x1a9, 0x1a2, 0x19b, 0x195, + 0x18f, 0x188, 0x182, 0x17c, 0x177, 0x171, 0x16b, 0x166, + 0x160, 0x15b, 0x155, 0x150, 0x14b, 0x146, 0x141, 0x13c, + 0x137, 0x133, 0x12e, 0x129, 0x125, 0x121, 0x11c, 0x118, + 0x114, 0x10f, 0x10b, 0x107, 0x103, 0x0ff, 0x0fb, 0x0f8, + 0x0f4, 0x0f0, 0x0ec, 0x0e9, 0x0e5, 0x0e2, 0x0de, 0x0db, + 0x0d7, 0x0d4, 0x0d1, 0x0cd, 0x0ca, 0x0c7, 0x0c4, 0x0c1, + 0x0be, 0x0bb, 0x0b8, 0x0b5, 0x0b2, 0x0af, 0x0ac, 0x0a9, + 0x0a7, 0x0a4, 0x0a1, 0x09f, 0x09c, 0x099, 0x097, 0x094, + 0x092, 0x08f, 0x08d, 0x08a, 0x088, 0x086, 0x083, 0x081, + 0x07f, 0x07d, 0x07a, 0x078, 0x076, 0x074, 0x072, 0x070, + 0x06e, 0x06c, 0x06a, 0x068, 0x066, 0x064, 0x062, 0x060, + 0x05e, 0x05c, 0x05b, 0x059, 0x057, 0x055, 0x053, 0x052, + 0x050, 0x04e, 0x04d, 0x04b, 0x04a, 0x048, 0x046, 0x045, + 0x043, 0x042, 0x040, 0x03f, 0x03e, 0x03c, 0x03b, 0x039, + 0x038, 0x037, 0x035, 0x034, 0x033, 0x031, 0x030, 0x02f, + 0x02e, 0x02d, 0x02b, 0x02a, 0x029, 0x028, 0x027, 0x026, + 0x025, 0x024, 0x023, 0x022, 0x021, 0x020, 0x01f, 0x01e, + 0x01d, 0x01c, 0x01b, 0x01a, 0x019, 0x018, 0x017, 0x017, + 0x016, 0x015, 0x014, 0x014, 0x013, 0x012, 0x011, 0x011, + 0x010, 0x00f, 0x00f, 0x00e, 0x00d, 0x00d, 0x00c, 0x00c, + 0x00b, 0x00a, 0x00a, 0x009, 0x009, 0x008, 0x008, 0x007, + 0x007, 0x007, 0x006, 0x006, 0x005, 0x005, 0x005, 0x004, + 0x004, 0x004, 0x003, 0x003, 0x003, 0x002, 0x002, 0x002, + 0x002, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x002, + 0x002, 0x002, 0x002, 0x003, 0x003, 0x003, 0x004, 0x004, + 0x004, 0x005, 0x005, 0x005, 0x006, 0x006, 0x007, 0x007, + 0x007, 0x008, 0x008, 0x009, 0x009, 0x00a, 0x00a, 0x00b, + 0x00c, 0x00c, 0x00d, 0x00d, 0x00e, 0x00f, 0x00f, 0x010, + 0x011, 0x011, 0x012, 0x013, 0x014, 0x014, 0x015, 0x016, + 0x017, 0x017, 0x018, 0x019, 0x01a, 0x01b, 0x01c, 0x01d, + 0x01e, 0x01f, 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, + 0x026, 0x027, 0x028, 0x029, 0x02a, 0x02b, 0x02d, 0x02e, + 0x02f, 0x030, 0x031, 0x033, 0x034, 0x035, 0x037, 0x038, + 0x039, 0x03b, 0x03c, 0x03e, 0x03f, 0x040, 0x042, 0x043, + 0x045, 0x046, 0x048, 0x04a, 0x04b, 0x04d, 0x04e, 0x050, + 0x052, 0x053, 0x055, 0x057, 0x059, 0x05b, 0x05c, 0x05e, + 0x060, 0x062, 0x064, 0x066, 0x068, 0x06a, 0x06c, 0x06e, + 0x070, 0x072, 0x074, 0x076, 0x078, 0x07a, 0x07d, 0x07f, + 0x081, 0x083, 0x086, 0x088, 0x08a, 0x08d, 0x08f, 0x092, + 0x094, 0x097, 0x099, 0x09c, 0x09f, 0x0a1, 0x0a4, 0x0a7, + 0x0a9, 0x0ac, 0x0af, 0x0b2, 0x0b5, 0x0b8, 0x0bb, 0x0be, + 0x0c1, 0x0c4, 0x0c7, 0x0ca, 0x0cd, 0x0d1, 0x0d4, 0x0d7, + 0x0db, 0x0de, 0x0e2, 0x0e5, 0x0e9, 0x0ec, 0x0f0, 0x0f4, + 0x0f8, 0x0fb, 0x0ff, 0x103, 0x107, 0x10b, 0x10f, 0x114, + 0x118, 0x11c, 0x121, 0x125, 0x129, 0x12e, 0x133, 0x137, + 0x13c, 0x141, 0x146, 0x14b, 0x150, 0x155, 0x15b, 0x160, + 0x166, 0x16b, 0x171, 0x177, 0x17c, 0x182, 0x188, 0x18f, + 0x195, 0x19b, 0x1a2, 0x1a9, 0x1b0, 0x1b7, 0x1be, 0x1c5, + 0x1cd, 0x1d4, 0x1dc, 0x1e4, 0x1ec, 0x1f5, 0x1fd, 0x206, + 0x20f, 0x218, 0x222, 0x22c, 0x236, 0x240, 0x24b, 0x256, + 0x261, 0x26d, 0x279, 0x286, 0x293, 0x2a0, 0x2af, 0x2bd, + 0x2cd, 0x2dc, 0x2ed, 0x2ff, 0x311, 0x324, 0x339, 0x34e, + 0x365, 0x37e, 0x398, 0x3b5, 0x3d3, 0x3f5, 0x41a, 0x443, + 0x471, 0x4a6, 0x4e4, 0x52e, 0x58b, 0x607, 0x6c3, 0x859 +}; + +/* + * exp table + */ + +static const Bit16u exprom[256] = { + 0xff4, 0xfea, 0xfde, 0xfd4, 0xfc8, 0xfbe, 0xfb4, 0xfa8, + 0xf9e, 0xf92, 0xf88, 0xf7e, 0xf72, 0xf68, 0xf5c, 0xf52, + 0xf48, 0xf3e, 0xf32, 0xf28, 0xf1e, 0xf14, 0xf08, 0xefe, + 0xef4, 0xeea, 0xee0, 0xed4, 0xeca, 0xec0, 0xeb6, 0xeac, + 0xea2, 0xe98, 0xe8e, 0xe84, 0xe7a, 0xe70, 0xe66, 0xe5c, + 0xe52, 0xe48, 0xe3e, 0xe34, 0xe2a, 0xe20, 0xe16, 0xe0c, + 0xe04, 0xdfa, 0xdf0, 0xde6, 0xddc, 0xdd2, 0xdca, 0xdc0, + 0xdb6, 0xdac, 0xda4, 0xd9a, 0xd90, 0xd88, 0xd7e, 0xd74, + 0xd6a, 0xd62, 0xd58, 0xd50, 0xd46, 0xd3c, 0xd34, 0xd2a, + 0xd22, 0xd18, 0xd10, 0xd06, 0xcfe, 0xcf4, 0xcec, 0xce2, + 0xcda, 0xcd0, 0xcc8, 0xcbe, 0xcb6, 0xcae, 0xca4, 0xc9c, + 0xc92, 0xc8a, 0xc82, 0xc78, 0xc70, 0xc68, 0xc60, 0xc56, + 0xc4e, 0xc46, 0xc3c, 0xc34, 0xc2c, 0xc24, 0xc1c, 0xc12, + 0xc0a, 0xc02, 0xbfa, 0xbf2, 0xbea, 0xbe0, 0xbd8, 0xbd0, + 0xbc8, 0xbc0, 0xbb8, 0xbb0, 0xba8, 0xba0, 0xb98, 0xb90, + 0xb88, 0xb80, 0xb78, 0xb70, 0xb68, 0xb60, 0xb58, 0xb50, + 0xb48, 0xb40, 0xb38, 0xb32, 0xb2a, 0xb22, 0xb1a, 0xb12, + 0xb0a, 0xb02, 0xafc, 0xaf4, 0xaec, 0xae4, 0xade, 0xad6, + 0xace, 0xac6, 0xac0, 0xab8, 0xab0, 0xaa8, 0xaa2, 0xa9a, + 0xa92, 0xa8c, 0xa84, 0xa7c, 0xa76, 0xa6e, 0xa68, 0xa60, + 0xa58, 0xa52, 0xa4a, 0xa44, 0xa3c, 0xa36, 0xa2e, 0xa28, + 0xa20, 0xa18, 0xa12, 0xa0c, 0xa04, 0x9fe, 0x9f6, 0x9f0, + 0x9e8, 0x9e2, 0x9da, 0x9d4, 0x9ce, 0x9c6, 0x9c0, 0x9b8, + 0x9b2, 0x9ac, 0x9a4, 0x99e, 0x998, 0x990, 0x98a, 0x984, + 0x97c, 0x976, 0x970, 0x96a, 0x962, 0x95c, 0x956, 0x950, + 0x948, 0x942, 0x93c, 0x936, 0x930, 0x928, 0x922, 0x91c, + 0x916, 0x910, 0x90a, 0x904, 0x8fc, 0x8f6, 0x8f0, 0x8ea, + 0x8e4, 0x8de, 0x8d8, 0x8d2, 0x8cc, 0x8c6, 0x8c0, 0x8ba, + 0x8b4, 0x8ae, 0x8a8, 0x8a2, 0x89c, 0x896, 0x890, 0x88a, + 0x884, 0x87e, 0x878, 0x872, 0x86c, 0x866, 0x860, 0x85a, + 0x854, 0x850, 0x84a, 0x844, 0x83e, 0x838, 0x832, 0x82c, + 0x828, 0x822, 0x81c, 0x816, 0x810, 0x80c, 0x806, 0x800 +}; + +/* + * freq mult table multiplied by 2 + * + * 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 12, 12, 15, 15 + */ + +static const Bit8u mt[16] = { + 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 20, 24, 24, 30, 30 +}; + +/* + * ksl table + */ + +static const Bit8u kslrom[16] = { + 0, 32, 40, 45, 48, 51, 53, 55, 56, 58, 59, 60, 61, 62, 63, 64 +}; + +static const Bit8u kslshift[4] = { + 8, 1, 2, 0 +}; + +/* + * envelope generator constants + */ + +static const Bit8u eg_incstep[3][4][8] = { + { + { 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, 1, 0, 1, 0, 1, 0, 1 }, + { 0, 1, 0, 1, 1, 1, 0, 1 }, + { 0, 1, 1, 1, 0, 1, 1, 1 }, + { 0, 1, 1, 1, 1, 1, 1, 1 } + }, + { + { 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 1, 1, 2, 2, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 1, 1 } + } +}; + +static const Bit8u eg_incdesc[16] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 +}; + +static const Bit8s eg_incsh[16] = { + 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2 +}; + +/* + * address decoding + */ + +static const Bit8s ad_slot[0x20] = { + 0, 1, 2, 3, 4, 5, -1, -1, 6, 7, 8, 9, 10, 11, -1, -1, + 12, 13, 14, 15, 16, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + +static const Bit8u ch_slot[18] = { + 0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20, 24, 25, 26, 30, 31, 32 +}; + +/* + * Envelope generator + */ + +static void OPL3_EnvelopeGenOff(opl3_slot *slot); +static void OPL3_EnvelopeGenAttack(opl3_slot *slot); +static void OPL3_EnvelopeGenDecay(opl3_slot *slot); +static void OPL3_EnvelopeGenSustain(opl3_slot *slot); +static void OPL3_EnvelopeGenRelease(opl3_slot *slot); + +typedef void(*envelope_genfunc)(opl3_slot *slot); + +envelope_genfunc envelope_gen[5] = { + OPL3_EnvelopeGenOff, + OPL3_EnvelopeGenAttack, + OPL3_EnvelopeGenDecay, + OPL3_EnvelopeGenSustain, + OPL3_EnvelopeGenRelease +}; + +enum envelope_gen_num +{ + envelope_gen_num_off = 0, + envelope_gen_num_attack = 1, + envelope_gen_num_decay = 2, + envelope_gen_num_sustain = 3, + envelope_gen_num_release = 4 +}; + +static Bit8u OPL3_EnvelopeCalcRate(opl3_slot *slot, Bit8u reg_rate) +{ + Bit8u rate; + if (reg_rate == 0x00) + { + return 0x00; + } + rate = (reg_rate << 2) + + (slot->reg_ksr ? slot->channel->ksv : (slot->channel->ksv >> 2)); + if (rate > 0x3c) + { + rate = 0x3c; + } + return rate; +} + +static void OPL3_EnvelopeUpdateKSL(opl3_slot *slot) +{ + Bit16s ksl = (kslrom[slot->channel->f_num >> 6] << 2) + - ((0x08 - slot->channel->block) << 5); + if (ksl < 0) + { + ksl = 0; + } + slot->eg_ksl = (Bit8u)ksl; +} + +static void OPL3_EnvelopeUpdateRate(opl3_slot *slot) +{ + switch (slot->eg_gen) + { + case envelope_gen_num_off: + case envelope_gen_num_attack: + slot->eg_rate = OPL3_EnvelopeCalcRate(slot, slot->reg_ar); + break; + case envelope_gen_num_decay: + slot->eg_rate = OPL3_EnvelopeCalcRate(slot, slot->reg_dr); + break; + case envelope_gen_num_sustain: + case envelope_gen_num_release: + slot->eg_rate = OPL3_EnvelopeCalcRate(slot, slot->reg_rr); + break; + } +} + +static void OPL3_EnvelopeGenOff(opl3_slot *slot) +{ + slot->eg_rout = 0x1ff; +} + +static void OPL3_EnvelopeGenAttack(opl3_slot *slot) +{ + if (slot->eg_rout == 0x00) + { + slot->eg_gen = envelope_gen_num_decay; + OPL3_EnvelopeUpdateRate(slot); + return; + } + slot->eg_rout += ((~slot->eg_rout) * slot->eg_inc) >> 3; + if (slot->eg_rout < 0x00) + { + slot->eg_rout = 0x00; + } +} + +static void OPL3_EnvelopeGenDecay(opl3_slot *slot) +{ + if (slot->eg_rout >= slot->reg_sl << 4) + { + slot->eg_gen = envelope_gen_num_sustain; + OPL3_EnvelopeUpdateRate(slot); + return; + } + slot->eg_rout += slot->eg_inc; +} + +static void OPL3_EnvelopeGenSustain(opl3_slot *slot) +{ + if (!slot->reg_type) + { + OPL3_EnvelopeGenRelease(slot); + } +} + +static void OPL3_EnvelopeGenRelease(opl3_slot *slot) +{ + if (slot->eg_rout >= 0x1ff) + { + slot->eg_gen = envelope_gen_num_off; + slot->eg_rout = 0x1ff; + OPL3_EnvelopeUpdateRate(slot); + return; + } + slot->eg_rout += slot->eg_inc; +} + +static void OPL3_EnvelopeCalc(opl3_slot *slot) +{ + Bit8u rate_h, rate_l; + Bit8u inc = 0; + rate_h = slot->eg_rate >> 2; + rate_l = slot->eg_rate & 3; + if (eg_incsh[rate_h] > 0) + { + if ((slot->chip->timer & ((1 << eg_incsh[rate_h]) - 1)) == 0) + { + inc = eg_incstep[eg_incdesc[rate_h]][rate_l] + [((slot->chip->timer)>> eg_incsh[rate_h]) & 0x07]; + } + } + else + { + inc = eg_incstep[eg_incdesc[rate_h]][rate_l] + [slot->chip->timer & 0x07] << (-eg_incsh[rate_h]); + } + slot->eg_inc = inc; + slot->eg_out = slot->eg_rout + (slot->reg_tl << 2) + + (slot->eg_ksl >> kslshift[slot->reg_ksl]) + *slot->trem; + if (slot->eg_out > 0x1ff) /* TODO: Remove this if possible */ + { + slot->eg_out = 0x1ff; + } + slot->eg_out <<= 3; + + envelope_gen[slot->eg_gen](slot); +} + +static void OPL3_EnvelopeKeyOn(opl3_slot *slot, Bit8u type) +{ + if (!slot->key) + { + slot->eg_gen = envelope_gen_num_attack; + OPL3_EnvelopeUpdateRate(slot); + if ((slot->eg_rate >> 2) == 0x0f) + { + slot->eg_gen = envelope_gen_num_decay; + OPL3_EnvelopeUpdateRate(slot); + slot->eg_rout = 0x00; + } + slot->pg_phase = 0x00; + } + slot->key |= type; +} + +static void OPL3_EnvelopeKeyOff(opl3_slot *slot, Bit8u type) +{ + if (slot->key) + { + slot->key &= (~type); + if (!slot->key) + { + slot->eg_gen = envelope_gen_num_release; + OPL3_EnvelopeUpdateRate(slot); + } + } +} + +/* + * Phase Generator + */ + +static void OPL3_PhaseGenerate(opl3_slot *slot) +{ + Bit16u f_num; + Bit32u basefreq; + + f_num = slot->channel->f_num; + if (slot->reg_vib) + { + Bit8s range; + Bit8u vibpos; + + range = (f_num >> 7) & 7; + vibpos = slot->chip->vibpos; + + if (!(vibpos & 3)) + { + range = 0; + } + else if (vibpos & 1) + { + range >>= 1; + } + range >>= slot->chip->vibshift; + + if (vibpos & 4) + { + range = -range; + } + f_num += range; + } + basefreq = (f_num << slot->channel->block) >> 1; + slot->pg_phase += (basefreq * mt[slot->reg_mult]) >> 1; +} + +/* + * Noise Generator + */ + +static void OPL3_NoiseGenerate(opl3_chip *chip) +{ + if (chip->noise & 0x01) + { + chip->noise ^= 0x800302; + } + chip->noise >>= 1; +} + +/* + * Slot + */ + +static void OPL3_SlotWrite20(opl3_slot *slot, Bit8u data) +{ + if ((data >> 7) & 0x01) + { + slot->trem = &slot->chip->tremolo; + } + else + { + slot->trem = (Bit8u*)&slot->chip->zeromod; + } + slot->reg_vib = (data >> 6) & 0x01; + slot->reg_type = (data >> 5) & 0x01; + slot->reg_ksr = (data >> 4) & 0x01; + slot->reg_mult = data & 0x0f; + OPL3_EnvelopeUpdateRate(slot); +} + +static void OPL3_SlotWrite40(opl3_slot *slot, Bit8u data) +{ + slot->reg_ksl = (data >> 6) & 0x03; + slot->reg_tl = data & 0x3f; + OPL3_EnvelopeUpdateKSL(slot); +} + +static void OPL3_SlotWrite60(opl3_slot *slot, Bit8u data) +{ + slot->reg_ar = (data >> 4) & 0x0f; + slot->reg_dr = data & 0x0f; + OPL3_EnvelopeUpdateRate(slot); +} + +static void OPL3_SlotWrite80(opl3_slot *slot, Bit8u data) +{ + slot->reg_sl = (data >> 4) & 0x0f; + if (slot->reg_sl == 0x0f) + { + slot->reg_sl = 0x1f; + } + slot->reg_rr = data & 0x0f; + OPL3_EnvelopeUpdateRate(slot); +} + +static void OPL3_SlotWriteE0(opl3_slot *slot, Bit8u data) +{ + slot->reg_wf = data & 0x07; + if (slot->chip->newm == 0x00) + { + slot->reg_wf &= 0x03; + } + + switch (slot->reg_wf) + { + case 1: + case 4: + case 5: + slot->maskzero = 0x200; + break; + case 3: + slot->maskzero = 0x100; + break; + default: + slot->maskzero = 0; + break; + } + + switch (slot->reg_wf) + { + case 4: + slot->signpos = (31-8); /* sigext of (phase & 0x100) */ + break; + case 0: + case 6: + case 7: + slot->signpos = (31-9); /* sigext of (phase & 0x200) */ + break; + default: + slot->signpos = (31-16); /* set "neg" to zero */ + break; + } + + switch (slot->reg_wf) + { + case 4: + case 5: + slot->phaseshift = 1; + break; + case 6: + slot->phaseshift = 16; /* set phase to zero and flag for non-sin wave */ + break; + case 7: + slot->phaseshift = 32; /* no shift (work by mod 32), but flag for non-sin wave */ + break; + default: + slot->phaseshift = 0; + break; + } +} + +static void OPL3_SlotGeneratePhase(opl3_slot *slot, Bit16u phase) +{ + Bit32u neg, level; + Bit8u phaseshift; + + /* Fast paths for mute segments */ + if (phase & slot->maskzero) + { + slot->out = 0; + return; + } + + neg = (Bit32s)((Bit32u)phase << slot->signpos) >> 31; + phaseshift = slot->phaseshift; + level = slot->eg_out; + + phase <<= phaseshift; + if (phaseshift <= 1) + { + level += logsinrom[phase & 0x1ff]; + } + else + { + level += ((phase ^ neg) & 0x3ff) << 3; + } + slot->out = exprom[level & 0xff] >> (level >> 8) ^ neg; +} + +static void OPL3_SlotGenerate(opl3_slot *slot) +{ + OPL3_SlotGeneratePhase(slot, (Bit16u)(slot->pg_phase >> 9) + *slot->mod); +} + +static void OPL3_SlotGenerateZM(opl3_slot *slot) +{ + OPL3_SlotGeneratePhase(slot, (Bit16u)(slot->pg_phase >> 9)); +} + +static void OPL3_SlotCalcFB(opl3_slot *slot) +{ + if (slot->channel->fb != 0x00) + { + slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->channel->fb); + } + else + { + slot->fbmod = 0; + } + slot->prout = slot->out; +} + +/* + * Channel + */ + +static void OPL3_ChannelSetupAlg(opl3_channel *channel); + +static void OPL3_ChannelUpdateRhythm(opl3_chip *chip, Bit8u data) +{ + opl3_channel *channel6; + opl3_channel *channel7; + opl3_channel *channel8; + Bit8u chnum; + + chip->rhy = data & 0x3f; + if (chip->rhy & 0x20) + { + channel6 = &chip->channel[6]; + channel7 = &chip->channel[7]; + channel8 = &chip->channel[8]; + channel6->out[0] = &channel6->slots[1]->out; + channel6->out[1] = &channel6->slots[1]->out; + channel6->out[2] = &chip->zeromod; + channel6->out[3] = &chip->zeromod; + channel7->out[0] = &channel7->slots[0]->out; + channel7->out[1] = &channel7->slots[0]->out; + channel7->out[2] = &channel7->slots[1]->out; + channel7->out[3] = &channel7->slots[1]->out; + channel8->out[0] = &channel8->slots[0]->out; + channel8->out[1] = &channel8->slots[0]->out; + channel8->out[2] = &channel8->slots[1]->out; + channel8->out[3] = &channel8->slots[1]->out; + for (chnum = 6; chnum < 9; chnum++) + { + chip->channel[chnum].chtype = ch_drum; + } + OPL3_ChannelSetupAlg(channel6); + /*hh*/ + if (chip->rhy & 0x01) + { + OPL3_EnvelopeKeyOn(channel7->slots[0], egk_drum); + } + else + { + OPL3_EnvelopeKeyOff(channel7->slots[0], egk_drum); + } + /*tc*/ + if (chip->rhy & 0x02) + { + OPL3_EnvelopeKeyOn(channel8->slots[1], egk_drum); + } + else + { + OPL3_EnvelopeKeyOff(channel8->slots[1], egk_drum); + } + /*tom*/ + if (chip->rhy & 0x04) + { + OPL3_EnvelopeKeyOn(channel8->slots[0], egk_drum); + } + else + { + OPL3_EnvelopeKeyOff(channel8->slots[0], egk_drum); + } + /*sd*/ + if (chip->rhy & 0x08) + { + OPL3_EnvelopeKeyOn(channel7->slots[1], egk_drum); + } + else + { + OPL3_EnvelopeKeyOff(channel7->slots[1], egk_drum); + } + /*bd*/ + if (chip->rhy & 0x10) + { + OPL3_EnvelopeKeyOn(channel6->slots[0], egk_drum); + OPL3_EnvelopeKeyOn(channel6->slots[1], egk_drum); + } + else + { + OPL3_EnvelopeKeyOff(channel6->slots[0], egk_drum); + OPL3_EnvelopeKeyOff(channel6->slots[1], egk_drum); + } + } + else + { + for (chnum = 6; chnum < 9; chnum++) + { + chip->channel[chnum].chtype = ch_2op; + OPL3_ChannelSetupAlg(&chip->channel[chnum]); + OPL3_EnvelopeKeyOff(chip->channel[chnum].slots[0], egk_drum); + OPL3_EnvelopeKeyOff(chip->channel[chnum].slots[1], egk_drum); + } + } +} + +static void OPL3_ChannelWriteA0(opl3_channel *channel, Bit8u data) +{ + if (channel->chip->newm && channel->chtype == ch_4op2) + { + return; + } + channel->f_num = (channel->f_num & 0x300) | data; + channel->ksv = (channel->block << 1) + | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); + OPL3_EnvelopeUpdateKSL(channel->slots[0]); + OPL3_EnvelopeUpdateKSL(channel->slots[1]); + OPL3_EnvelopeUpdateRate(channel->slots[0]); + OPL3_EnvelopeUpdateRate(channel->slots[1]); + if (channel->chip->newm && channel->chtype == ch_4op) + { + channel->pair->f_num = channel->f_num; + channel->pair->ksv = channel->ksv; + OPL3_EnvelopeUpdateKSL(channel->pair->slots[0]); + OPL3_EnvelopeUpdateKSL(channel->pair->slots[1]); + OPL3_EnvelopeUpdateRate(channel->pair->slots[0]); + OPL3_EnvelopeUpdateRate(channel->pair->slots[1]); + } +} + +static void OPL3_ChannelWriteB0(opl3_channel *channel, Bit8u data) +{ + if (channel->chip->newm && channel->chtype == ch_4op2) + { + return; + } + channel->f_num = (channel->f_num & 0xff) | ((data & 0x03) << 8); + channel->block = (data >> 2) & 0x07; + channel->ksv = (channel->block << 1) + | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); + OPL3_EnvelopeUpdateKSL(channel->slots[0]); + OPL3_EnvelopeUpdateKSL(channel->slots[1]); + OPL3_EnvelopeUpdateRate(channel->slots[0]); + OPL3_EnvelopeUpdateRate(channel->slots[1]); + if (channel->chip->newm && channel->chtype == ch_4op) + { + channel->pair->f_num = channel->f_num; + channel->pair->block = channel->block; + channel->pair->ksv = channel->ksv; + OPL3_EnvelopeUpdateKSL(channel->pair->slots[0]); + OPL3_EnvelopeUpdateKSL(channel->pair->slots[1]); + OPL3_EnvelopeUpdateRate(channel->pair->slots[0]); + OPL3_EnvelopeUpdateRate(channel->pair->slots[1]); + } +} + +static void OPL3_ChannelSetupAlg(opl3_channel *channel) +{ + if (channel->chtype == ch_drum) + { + switch (channel->alg & 0x01) + { + case 0x00: + channel->slots[0]->mod = &channel->slots[0]->fbmod; + channel->slots[1]->mod = &channel->slots[0]->out; + break; + case 0x01: + channel->slots[0]->mod = &channel->slots[0]->fbmod; + channel->slots[1]->mod = &channel->chip->zeromod; + break; + } + return; + } + if (channel->alg & 0x08) + { + return; + } + if (channel->alg & 0x04) + { + channel->pair->out[0] = &channel->chip->zeromod; + channel->pair->out[1] = &channel->chip->zeromod; + channel->pair->out[2] = &channel->chip->zeromod; + channel->pair->out[3] = &channel->chip->zeromod; + switch (channel->alg & 0x03) + { + case 0x00: + channel->pair->slots[0]->mod = &channel->pair->slots[0]->fbmod; + channel->pair->slots[1]->mod = &channel->pair->slots[0]->out; + channel->slots[0]->mod = &channel->pair->slots[1]->out; + channel->slots[1]->mod = &channel->slots[0]->out; + channel->out[0] = &channel->slots[1]->out; + channel->out[1] = &channel->chip->zeromod; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; + break; + case 0x01: + channel->pair->slots[0]->mod = &channel->pair->slots[0]->fbmod; + channel->pair->slots[1]->mod = &channel->pair->slots[0]->out; + channel->slots[0]->mod = &channel->chip->zeromod; + channel->slots[1]->mod = &channel->slots[0]->out; + channel->out[0] = &channel->pair->slots[1]->out; + channel->out[1] = &channel->slots[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; + break; + case 0x02: + channel->pair->slots[0]->mod = &channel->pair->slots[0]->fbmod; + channel->pair->slots[1]->mod = &channel->chip->zeromod; + channel->slots[0]->mod = &channel->pair->slots[1]->out; + channel->slots[1]->mod = &channel->slots[0]->out; + channel->out[0] = &channel->pair->slots[0]->out; + channel->out[1] = &channel->slots[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; + break; + case 0x03: + channel->pair->slots[0]->mod = &channel->pair->slots[0]->fbmod; + channel->pair->slots[1]->mod = &channel->chip->zeromod; + channel->slots[0]->mod = &channel->pair->slots[1]->out; + channel->slots[1]->mod = &channel->chip->zeromod; + channel->out[0] = &channel->pair->slots[0]->out; + channel->out[1] = &channel->slots[0]->out; + channel->out[2] = &channel->slots[1]->out; + channel->out[3] = &channel->chip->zeromod; + break; + } + } + else + { + switch (channel->alg & 0x01) + { + case 0x00: + channel->slots[0]->mod = &channel->slots[0]->fbmod; + channel->slots[1]->mod = &channel->slots[0]->out; + channel->out[0] = &channel->slots[1]->out; + channel->out[1] = &channel->chip->zeromod; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; + break; + case 0x01: + channel->slots[0]->mod = &channel->slots[0]->fbmod; + channel->slots[1]->mod = &channel->chip->zeromod; + channel->out[0] = &channel->slots[0]->out; + channel->out[1] = &channel->slots[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; + break; + } + } +} + +static void OPL3_ChannelWriteC0(opl3_channel *channel, Bit8u data) +{ + channel->fb = (data & 0x0e) >> 1; + channel->con = data & 0x01; + channel->alg = channel->con; + if (channel->chip->newm) + { + if (channel->chtype == ch_4op) + { + channel->pair->alg = 0x04 | (channel->con << 1) | (channel->pair->con); + channel->alg = 0x08; + OPL3_ChannelSetupAlg(channel->pair); + } + else if (channel->chtype == ch_4op2) + { + channel->alg = 0x04 | (channel->pair->con << 1) | (channel->con); + channel->pair->alg = 0x08; + OPL3_ChannelSetupAlg(channel); + } + else + { + OPL3_ChannelSetupAlg(channel); + } + } + else + { + OPL3_ChannelSetupAlg(channel); + } + if (channel->chip->newm) + { + channel->cha = ((data >> 4) & 0x01) ? ~0 : 0; + channel->chb = ((data >> 5) & 0x01) ? ~0 : 0; + } + else + { + channel->cha = channel->chb = ~0; + } +} + +static void OPL3_ChannelKeyOn(opl3_channel *channel) +{ + if (channel->chip->newm) + { + if (channel->chtype == ch_4op) + { + OPL3_EnvelopeKeyOn(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slots[1], egk_norm); + OPL3_EnvelopeKeyOn(channel->pair->slots[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->pair->slots[1], egk_norm); + } + else if (channel->chtype == ch_2op || channel->chtype == ch_drum) + { + OPL3_EnvelopeKeyOn(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slots[1], egk_norm); + } + } + else + { + OPL3_EnvelopeKeyOn(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slots[1], egk_norm); + } +} + +static void OPL3_ChannelKeyOff(opl3_channel *channel) +{ + if (channel->chip->newm) + { + if (channel->chtype == ch_4op) + { + OPL3_EnvelopeKeyOff(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slots[1], egk_norm); + OPL3_EnvelopeKeyOff(channel->pair->slots[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->pair->slots[1], egk_norm); + } + else if (channel->chtype == ch_2op || channel->chtype == ch_drum) + { + OPL3_EnvelopeKeyOff(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slots[1], egk_norm); + } + } + else + { + OPL3_EnvelopeKeyOff(channel->slots[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slots[1], egk_norm); + } +} + +static void OPL3_ChannelSet4Op(opl3_chip *chip, Bit8u data) +{ + Bit8u bit; + Bit8u chnum; + for (bit = 0; bit < 6; bit++) + { + chnum = bit; + if (bit >= 3) + { + chnum += 9 - 3; + } + if ((data >> bit) & 0x01) + { + chip->channel[chnum].chtype = ch_4op; + chip->channel[chnum + 3].chtype = ch_4op2; + } + else + { + chip->channel[chnum].chtype = ch_2op; + chip->channel[chnum + 3].chtype = ch_2op; + } + } +} + +static Bit16s OPL3_ClipSample(Bit32s sample) +{ + if (sample > 32767) + { + sample = 32767; + } + else if (sample < -32768) + { + sample = -32768; + } + return (Bit16s)sample; +} + +static void OPL3_GenerateRhythm1(opl3_chip *chip) +{ + opl3_channel *channel6; + opl3_channel *channel7; + opl3_channel *channel8; + Bit16u phase14; + Bit16u phase17; + Bit16u phase; + Bit16u phasebit; + + channel6 = &chip->channel[6]; + channel7 = &chip->channel[7]; + channel8 = &chip->channel[8]; + OPL3_SlotGenerate(channel6->slots[0]); + phase14 = (channel7->slots[0]->pg_phase >> 9) & 0x3ff; + phase17 = (channel8->slots[1]->pg_phase >> 9) & 0x3ff; + phase = 0x00; + /*hh tc phase bit*/ + phasebit = ((phase14 & 0x08) | (((phase14 >> 5) ^ phase14) & 0x04) + | (((phase17 >> 2) ^ phase17) & 0x08)) ? 0x01 : 0x00; + /*hh*/ + phase = (phasebit << 9) + | (0x34 << ((phasebit ^ (chip->noise & 0x01)) << 1)); + OPL3_SlotGeneratePhase(channel7->slots[0], phase); + /*tt*/ + OPL3_SlotGenerateZM(channel8->slots[0]); +} + +static void OPL3_GenerateRhythm2(opl3_chip *chip) +{ + opl3_channel *channel6; + opl3_channel *channel7; + opl3_channel *channel8; + Bit16u phase14; + Bit16u phase17; + Bit16u phase; + Bit16u phasebit; + + channel6 = &chip->channel[6]; + channel7 = &chip->channel[7]; + channel8 = &chip->channel[8]; + OPL3_SlotGenerate(channel6->slots[1]); + phase14 = (channel7->slots[0]->pg_phase >> 9) & 0x3ff; + phase17 = (channel8->slots[1]->pg_phase >> 9) & 0x3ff; + phase = 0x00; + /*hh tc phase bit*/ + phasebit = ((phase14 & 0x08) | (((phase14 >> 5) ^ phase14) & 0x04) + | (((phase17 >> 2) ^ phase17) & 0x08)) ? 0x01 : 0x00; + /*sd*/ + phase = (0x100 << ((phase14 >> 8) & 0x01)) ^ ((chip->noise & 0x01) << 8); + OPL3_SlotGeneratePhase(channel7->slots[1], phase); + /*tc*/ + phase = 0x100 | (phasebit << 9); + OPL3_SlotGeneratePhase(channel8->slots[1], phase); +} + +void OPL3_Generate(opl3_chip *chip, Bit16s *buf) +{ + Bit8u ii; + Bit8u jj; + Bit16s accm; + + buf[1] = OPL3_ClipSample(chip->mixbuff[1]); + + for (ii = 0; ii < 12; ii++) + { + OPL3_SlotCalcFB(&chip->chipslot[ii]); + OPL3_PhaseGenerate(&chip->chipslot[ii]); + OPL3_EnvelopeCalc(&chip->chipslot[ii]); + OPL3_SlotGenerate(&chip->chipslot[ii]); + } + + for (ii = 12; ii < 15; ii++) + { + OPL3_SlotCalcFB(&chip->chipslot[ii]); + OPL3_PhaseGenerate(&chip->chipslot[ii]); + OPL3_EnvelopeCalc(&chip->chipslot[ii]); + } + + if (chip->rhy & 0x20) + { + OPL3_GenerateRhythm1(chip); + } + else + { + OPL3_SlotGenerate(&chip->chipslot[12]); + OPL3_SlotGenerate(&chip->chipslot[13]); + OPL3_SlotGenerate(&chip->chipslot[14]); + } + + chip->mixbuff[0] = 0; + for (ii = 0; ii < 18; ii++) + { + accm = 0; + for (jj = 0; jj < 4; jj++) + { + accm += *chip->channel[ii].out[jj]; + } + chip->mixbuff[0] += (Bit16s)(accm & chip->channel[ii].cha); + } + + for (ii = 15; ii < 18; ii++) + { + OPL3_SlotCalcFB(&chip->chipslot[ii]); + OPL3_PhaseGenerate(&chip->chipslot[ii]); + OPL3_EnvelopeCalc(&chip->chipslot[ii]); + } + + if (chip->rhy & 0x20) + { + OPL3_GenerateRhythm2(chip); + } + else + { + OPL3_SlotGenerate(&chip->chipslot[15]); + OPL3_SlotGenerate(&chip->chipslot[16]); + OPL3_SlotGenerate(&chip->chipslot[17]); + } + + buf[0] = OPL3_ClipSample(chip->mixbuff[0]); + + for (ii = 18; ii < 33; ii++) + { + OPL3_SlotCalcFB(&chip->chipslot[ii]); + OPL3_PhaseGenerate(&chip->chipslot[ii]); + OPL3_EnvelopeCalc(&chip->chipslot[ii]); + OPL3_SlotGenerate(&chip->chipslot[ii]); + } + + chip->mixbuff[1] = 0; + for (ii = 0; ii < 18; ii++) + { + accm = 0; + for (jj = 0; jj < 4; jj++) + { + accm += *chip->channel[ii].out[jj]; + } + chip->mixbuff[1] += (Bit16s)(accm & chip->channel[ii].chb); + } + + for (ii = 33; ii < 36; ii++) + { + OPL3_SlotCalcFB(&chip->chipslot[ii]); + OPL3_PhaseGenerate(&chip->chipslot[ii]); + OPL3_EnvelopeCalc(&chip->chipslot[ii]); + OPL3_SlotGenerate(&chip->chipslot[ii]); + } + + OPL3_NoiseGenerate(chip); + + if ((chip->timer & 0x3f) == 0x3f) + { + chip->tremolopos = (chip->tremolopos + 1) % 210; + } + if (chip->tremolopos < 105) + { + chip->tremolo = chip->tremolopos >> chip->tremoloshift; + } + else + { + chip->tremolo = (210 - chip->tremolopos) >> chip->tremoloshift; + } + + if ((chip->timer & 0x3ff) == 0x3ff) + { + chip->vibpos = (chip->vibpos + 1) & 7; + } + + chip->timer++; + + while (chip->writebuf[chip->writebuf_cur].time <= chip->writebuf_samplecnt) + { + if (!(chip->writebuf[chip->writebuf_cur].reg & 0x200)) + { + break; + } + chip->writebuf[chip->writebuf_cur].reg &= 0x1ff; + OPL3_WriteReg(chip, chip->writebuf[chip->writebuf_cur].reg, + chip->writebuf[chip->writebuf_cur].data); + chip->writebuf_cur = (chip->writebuf_cur + 1) % OPL_WRITEBUF_SIZE; + } + chip->writebuf_samplecnt++; +} + +void OPL3_GenerateResampled(opl3_chip *chip, Bit16s *buf) +{ + while (chip->samplecnt >= chip->rateratio) + { + chip->oldsamples[0] = chip->samples[0]; + chip->oldsamples[1] = chip->samples[1]; + OPL3_Generate(chip, chip->samples); + chip->samplecnt -= chip->rateratio; + } + buf[0] = (Bit16s)((chip->oldsamples[0] * (chip->rateratio - chip->samplecnt) + + chip->samples[0] * chip->samplecnt) / chip->rateratio); + buf[1] = (Bit16s)((chip->oldsamples[1] * (chip->rateratio - chip->samplecnt) + + chip->samples[1] * chip->samplecnt) / chip->rateratio); + chip->samplecnt += 1 << RSM_FRAC; +} + +void OPL3_Reset(opl3_chip *chip, Bit32u samplerate) +{ + Bit8u slotnum; + Bit8u channum; + + memset(chip, 0, sizeof(opl3_chip)); + for (slotnum = 0; slotnum < 36; slotnum++) + { + chip->chipslot[slotnum].chip = chip; + chip->chipslot[slotnum].mod = &chip->zeromod; + chip->chipslot[slotnum].eg_rout = 0x1ff; + chip->chipslot[slotnum].eg_out = 0x1ff << 3; + chip->chipslot[slotnum].eg_gen = envelope_gen_num_off; + chip->chipslot[slotnum].trem = (Bit8u*)&chip->zeromod; + chip->chipslot[slotnum].signpos = (31-9); /* for wf=0 need use sigext of (phase & 0x200) */ + } + for (channum = 0; channum < 18; channum++) + { + chip->channel[channum].slots[0] = &chip->chipslot[ch_slot[channum]]; + chip->channel[channum].slots[1] = &chip->chipslot[ch_slot[channum] + 3]; + chip->chipslot[ch_slot[channum]].channel = &chip->channel[channum]; + chip->chipslot[ch_slot[channum] + 3].channel = &chip->channel[channum]; + if ((channum % 9) < 3) + { + chip->channel[channum].pair = &chip->channel[channum + 3]; + } + else if ((channum % 9) < 6) + { + chip->channel[channum].pair = &chip->channel[channum - 3]; + } + chip->channel[channum].chip = chip; + chip->channel[channum].out[0] = &chip->zeromod; + chip->channel[channum].out[1] = &chip->zeromod; + chip->channel[channum].out[2] = &chip->zeromod; + chip->channel[channum].out[3] = &chip->zeromod; + chip->channel[channum].chtype = ch_2op; + chip->channel[channum].cha = ~0; + chip->channel[channum].chb = ~0; + OPL3_ChannelSetupAlg(&chip->channel[channum]); + } + chip->noise = 0x306600; + chip->rateratio = (samplerate << RSM_FRAC) / 49716; + chip->tremoloshift = 4; + chip->vibshift = 1; +} + +void OPL3_WriteReg(opl3_chip *chip, Bit16u reg, Bit8u v) +{ + Bit8u high = (reg >> 8) & 0x01; + Bit8u regm = reg & 0xff; + switch (regm & 0xf0) + { + case 0x00: + if (high) + { + switch (regm & 0x0f) + { + case 0x04: + OPL3_ChannelSet4Op(chip, v); + break; + case 0x05: + chip->newm = v & 0x01; + break; + } + } + else + { + switch (regm & 0x0f) + { + case 0x08: + chip->nts = (v >> 6) & 0x01; + break; + } + } + break; + case 0x20: + case 0x30: + if (ad_slot[regm & 0x1f] >= 0) + { + OPL3_SlotWrite20(&chip->chipslot[18 * high + ad_slot[regm & 0x1f]], v); + } + break; + case 0x40: + case 0x50: + if (ad_slot[regm & 0x1f] >= 0) + { + OPL3_SlotWrite40(&chip->chipslot[18 * high + ad_slot[regm & 0x1f]], v); + } + break; + case 0x60: + case 0x70: + if (ad_slot[regm & 0x1f] >= 0) + { + OPL3_SlotWrite60(&chip->chipslot[18 * high + ad_slot[regm & 0x1f]], v); + } + break; + case 0x80: + case 0x90: + if (ad_slot[regm & 0x1f] >= 0) + { + OPL3_SlotWrite80(&chip->chipslot[18 * high + ad_slot[regm & 0x1f]], v); + } + break; + case 0xe0: + case 0xf0: + if (ad_slot[regm & 0x1f] >= 0) + { + OPL3_SlotWriteE0(&chip->chipslot[18 * high + ad_slot[regm & 0x1f]], v); + } + break; + case 0xa0: + if ((regm & 0x0f) < 9) + { + OPL3_ChannelWriteA0(&chip->channel[9 * high + (regm & 0x0f)], v); + } + break; + case 0xb0: + if (regm == 0xbd && !high) + { + chip->tremoloshift = (((v >> 7) ^ 1) << 1) + 2; + chip->vibshift = ((v >> 6) & 0x01) ^ 1; + OPL3_ChannelUpdateRhythm(chip, v); + } + else if ((regm & 0x0f) < 9) + { + OPL3_ChannelWriteB0(&chip->channel[9 * high + (regm & 0x0f)], v); + if (v & 0x20) + { + OPL3_ChannelKeyOn(&chip->channel[9 * high + (regm & 0x0f)]); + } + else + { + OPL3_ChannelKeyOff(&chip->channel[9 * high + (regm & 0x0f)]); + } + } + break; + case 0xc0: + if ((regm & 0x0f) < 9) + { + OPL3_ChannelWriteC0(&chip->channel[9 * high + (regm & 0x0f)], v); + } + break; + } +} + +void OPL3_WriteRegBuffered(opl3_chip *chip, Bit16u reg, Bit8u v) +{ + Bit64u time1, time2; + + if (chip->writebuf[chip->writebuf_last].reg & 0x200) + { + OPL3_WriteReg(chip, chip->writebuf[chip->writebuf_last].reg & 0x1ff, + chip->writebuf[chip->writebuf_last].data); + + chip->writebuf_cur = (chip->writebuf_last + 1) % OPL_WRITEBUF_SIZE; + chip->writebuf_samplecnt = chip->writebuf[chip->writebuf_last].time; + } + + chip->writebuf[chip->writebuf_last].reg = reg | 0x200; + chip->writebuf[chip->writebuf_last].data = v; + time1 = chip->writebuf_lasttime + OPL_WRITEBUF_DELAY; + time2 = chip->writebuf_samplecnt; + + if (time1 < time2) + { + time1 = time2; + } + + chip->writebuf[chip->writebuf_last].time = time1; + chip->writebuf_lasttime = time1; + chip->writebuf_last = (chip->writebuf_last + 1) % OPL_WRITEBUF_SIZE; +} + +void OPL3_GenerateStream(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples) +{ + Bit32u i; + + for(i = 0; i < numsamples; i++) + { + OPL3_GenerateResampled(chip, sndptr); + sndptr += 2; + } +} + +#define OPL3_MIN(A, B) (((A) > (B)) ? (B) : (A)) +#define OPL3_MAX(A, B) (((A) < (B)) ? (B) : (A)) +#define OPL3_CLAMP(V, MIN, MAX) OPL3_MAX(OPL3_MIN(V, MAX), MIN) + +void OPL3_GenerateStreamMix(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples) +{ + Bit32u i; + Bit16s sample[2]; + Bit32s mix[2]; + + for(i = 0; i < numsamples; i++) + { + OPL3_GenerateResampled(chip, sample); + mix[0] = sndptr[0] + sample[0]; + mix[1] = sndptr[1] + sample[1]; + sndptr[0] = OPL3_CLAMP(mix[0], INT16_MIN, INT16_MAX); + sndptr[1] = OPL3_CLAMP(mix[1], INT16_MIN, INT16_MAX); + sndptr += 2; + } +} + diff --git a/src/sound/adlmidi/nukedopl3.h b/src/sound/adlmidi/nukedopl3.h new file mode 100644 index 000000000..254f27584 --- /dev/null +++ b/src/sound/adlmidi/nukedopl3.h @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2013-2016 Alexey Khokholov (Nuke.YKT) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Nuked OPL3 emulator. + * Thanks: + * MAME Development Team(Jarek Burczynski, Tatsuyuki Satoh): + * Feedback and Rhythm part calculation information. + * forums.submarine.org.uk(carbon14, opl3): + * Tremolo and phase generator calculation information. + * OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): + * OPL2 ROMs. + * + * version: 1.7.4 + */ + +#ifndef OPL_OPL3_H +#define OPL_OPL3_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#define OPL_WRITEBUF_SIZE 1024 +#define OPL_WRITEBUF_DELAY 2 + +typedef uintptr_t Bitu; +typedef intptr_t Bits; +typedef uint64_t Bit64u; +typedef int64_t Bit64s; +typedef uint32_t Bit32u; +typedef int32_t Bit32s; +typedef uint16_t Bit16u; +typedef int16_t Bit16s; +typedef uint8_t Bit8u; +typedef int8_t Bit8s; + +typedef struct _opl3_slot opl3_slot; +typedef struct _opl3_channel opl3_channel; +typedef struct _opl3_chip opl3_chip; + +struct _opl3_slot { + opl3_channel *channel; + opl3_chip *chip; + Bit16s out; + Bit16s fbmod; + Bit16s *mod; + Bit16s prout; + Bit16s eg_rout; + Bit16s eg_out; + Bit8u eg_inc; + Bit8u eg_gen; + Bit8u eg_rate; + Bit8u eg_ksl; + Bit8u *trem; + Bit8u reg_vib; + Bit8u reg_type; + Bit8u reg_ksr; + Bit8u reg_mult; + Bit8u reg_ksl; + Bit8u reg_tl; + Bit8u reg_ar; + Bit8u reg_dr; + Bit8u reg_sl; + Bit8u reg_rr; + Bit8u reg_wf; + Bit8u key; + Bit32u pg_phase; + Bit32u timer; + + Bit16u maskzero; + Bit8u signpos; + Bit8u phaseshift; +}; + +struct _opl3_channel { + opl3_slot *slots[2]; + opl3_channel *pair; + opl3_chip *chip; + Bit16s *out[4]; + Bit8u chtype; + Bit16u f_num; + Bit8u block; + Bit8u fb; + Bit8u con; + Bit8u alg; + Bit8u ksv; + Bit16u cha, chb; +}; + +typedef struct _opl3_writebuf { + Bit64u time; + Bit16u reg; + Bit8u data; +} opl3_writebuf; + +struct _opl3_chip { + opl3_channel channel[18]; + opl3_slot chipslot[36]; + Bit16u timer; + Bit8u newm; + Bit8u nts; + Bit8u rhy; + Bit8u vibpos; + Bit8u vibshift; + Bit8u tremolo; + Bit8u tremolopos; + Bit8u tremoloshift; + Bit32u noise; + Bit16s zeromod; + Bit32s mixbuff[2]; + /* OPL3L */ + Bit32s rateratio; + Bit32s samplecnt; + Bit16s oldsamples[2]; + Bit16s samples[2]; + + Bit64u writebuf_samplecnt; + Bit32u writebuf_cur; + Bit32u writebuf_last; + Bit64u writebuf_lasttime; + opl3_writebuf writebuf[OPL_WRITEBUF_SIZE]; +}; + +void OPL3_Generate(opl3_chip *chip, Bit16s *buf); +void OPL3_GenerateResampled(opl3_chip *chip, Bit16s *buf); +void OPL3_Reset(opl3_chip *chip, Bit32u samplerate); +void OPL3_WriteReg(opl3_chip *chip, Bit16u reg, Bit8u v); +void OPL3_WriteRegBuffered(opl3_chip *chip, Bit16u reg, Bit8u v); +void OPL3_GenerateStream(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples); +void OPL3_GenerateStreamMix(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/sound/i_musicinterns.h b/src/sound/i_musicinterns.h index 544bfd188..40fe208cb 100644 --- a/src/sound/i_musicinterns.h +++ b/src/sound/i_musicinterns.h @@ -299,6 +299,26 @@ protected: #endif }; + +class ADLMIDIDevice : public SoftSynthMIDIDevice +{ + struct ADL_MIDIPlayer *Renderer; + TArray shortbuffer; +public: + ADLMIDIDevice(const char *args); + ~ADLMIDIDevice(); + + int Open(MidiCallback, void *userdata); + int GetDeviceType() const override { return MDEV_OPL; } + +protected: + + void HandleEvent(int status, int parm1, int parm2); + void HandleLongEvent(const uint8_t *data, int len); + void ComputeOutput(float *buffer, int len); +}; + + // Base class for streaming MUS and MIDI files ------------------------------ enum diff --git a/src/sound/mididevices/music_adlmidi_mididevice.cpp b/src/sound/mididevices/music_adlmidi_mididevice.cpp new file mode 100644 index 000000000..9924ed1c6 --- /dev/null +++ b/src/sound/mididevices/music_adlmidi_mididevice.cpp @@ -0,0 +1,180 @@ +/* +** music_timidity_mididevice.cpp +** Provides access to TiMidity as a generic MIDI device. +** +**--------------------------------------------------------------------------- +** Copyright 2008 Randy Heit +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +// HEADER FILES ------------------------------------------------------------ + +#include "i_musicinterns.h" +#include "templates.h" +#include "doomdef.h" +#include "m_swap.h" +#include "w_wad.h" +#include "v_text.h" +#include "adlmidi/adlmidi.h" +#include + +enum +{ + ME_NOTEOFF = 0x80, + ME_NOTEON = 0x90, + ME_KEYPRESSURE = 0xA0, + ME_CONTROLCHANGE = 0xB0, + ME_PROGRAM = 0xC0, + ME_CHANNELPRESSURE = 0xD0, + ME_PITCHWHEEL = 0xE0 +}; + +//========================================================================== +// +// ADLMIDIDevice Constructor +// +//========================================================================== + +ADLMIDIDevice::ADLMIDIDevice(const char *args) +{ + Renderer = adl_init(44100); // todo: make it configurable + if (Renderer != nullptr) + { + adl_setBank(Renderer, 14); + } +} + +//========================================================================== +// +// ADLMIDIDevice Destructor +// +//========================================================================== + +ADLMIDIDevice::~ADLMIDIDevice() +{ + Close(); + if (Renderer != nullptr) + { + adl_close(Renderer); + } +} + +//========================================================================== +// +// ADLMIDIDevice :: Open +// +// Returns 0 on success. +// +//========================================================================== + +int ADLMIDIDevice::Open(MidiCallback callback, void *userdata) +{ + int ret = OpenStream(2, 0, callback, userdata); + if (ret == 0) + { + adl_rt_resetState(Renderer); + } + return ret; +} + +//========================================================================== +// +// ADLMIDIDevice :: HandleEvent +// +//========================================================================== + +void ADLMIDIDevice::HandleEvent(int status, int parm1, int parm2) +{ + int command = status & 0xF0; + int chan = status & 0x0F; + + switch (command) + { + case ME_NOTEON: + adl_rt_noteOn(Renderer, chan, parm1, parm2); + break; + + case ME_NOTEOFF: + adl_rt_noteOff(Renderer, chan, parm1); + break; + + case ME_KEYPRESSURE: + adl_rt_noteAfterTouch(Renderer, chan, parm1, parm2); + break; + + case ME_CONTROLCHANGE: + adl_rt_controllerChange(Renderer, chan, parm1, parm2); + break; + + case ME_PROGRAM: + adl_rt_bankChange(Renderer, chan, parm1); + break; + + case ME_CHANNELPRESSURE: + adl_rt_channelAfterTouch(Renderer, chan, parm1); + break; + + case ME_PITCHWHEEL: + adl_rt_pitchBend(Renderer, chan, parm1 | (parm2 << 7)); + break; + } +} + +//========================================================================== +// +// ADLMIDIDevice :: HandleLongEvent +// +//========================================================================== + +void ADLMIDIDevice::HandleLongEvent(const uint8_t *data, int len) +{ +} + +//========================================================================== +// +// ADLMIDIDevice :: ComputeOutput +// +//========================================================================== + +void ADLMIDIDevice::ComputeOutput(float *buffer, int len) +{ + if (shortbuffer.Size() < len*2) shortbuffer.Resize(len*2); + auto result = adl_generate(Renderer, len, &shortbuffer[0]); + for(int i=0; i