More like Chie SatURNaka

This commit is contained in:
nattthebear 2017-06-04 14:25:21 -04:00
parent 0c9925a369
commit b9ab41a4da
105 changed files with 110216 additions and 4 deletions

View File

@ -22,6 +22,7 @@ using BizHawk.Emulation.Cores.Sony.PSX;
using BizHawk.Emulation.DiscSystem;
using GPGX64 = BizHawk.Emulation.Cores.Consoles.Sega.gpgx64;
using BizHawk.Emulation.Cores.Consoles.Sega.Saturn;
namespace BizHawk.Client.Common
{
@ -499,7 +500,8 @@ namespace BizHawk.Client.Common
break;
case "SAT":
nextEmulator = new Yabause(nextComm, disc, GetCoreSyncSettings<Yabause>());
//nextEmulator = new Yabause(nextComm, disc, GetCoreSyncSettings<Yabause>());
nextEmulator = new Saturnus(nextComm, new[] { disc });
break;
case "PSP":
nextEmulator = new PSP(nextComm, file.Name);

View File

@ -1147,7 +1147,9 @@
<Compile Include="Consoles\Sega\gpgx64\GPGXControlConverter.cs" />
<Compile Include="Consoles\Sega\gpgx64\LibGPGX.cs" />
<Compile Include="Consoles\Sega\Saturn\FilePiping.cs" />
<Compile Include="Consoles\Sega\Saturn\LibSaturnus.cs" />
<Compile Include="Consoles\Sega\Saturn\LibYabause.cs" />
<Compile Include="Consoles\Sega\Saturn\Saturnus.cs" />
<Compile Include="Consoles\Sega\Saturn\Yabause.cs" />
<Compile Include="Consoles\Sega\Saturn\Yabause.IDriveLight.cs">
<DependentUpon>Yabause.cs</DependentUpon>

View File

@ -40,8 +40,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
_cablediscosignal = cablediscosignalNew;
Frame++;
L.FrameAdvancePrep(controller);
R.FrameAdvancePrep(controller);
L.FrameAdvancePrep(LCont);
R.FrameAdvancePrep(RCont);
unsafe
{

View File

@ -0,0 +1,80 @@
using BizHawk.Common.BizInvoke;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn
{
public abstract class LibSaturnus
{
// some of the internal code uses wizardry by which certain pointers in ss.wbx[.text]
// must be greater than or equal to this address, but less than 4GB bigger than it
public const ulong StartAddress = 0x36d00000000;
const CallingConvention CC = CallingConvention.Cdecl;
[StructLayout(LayoutKind.Sequential)]
public class TOC
{
public int FirstTrack;
public int LastTrack;
public int DiskType;
[StructLayout(LayoutKind.Sequential)]
public struct Track
{
public int Address;
public int Control;
public int Lba;
public int Valid;
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 101)]
public Track[] Tracks;
}
[StructLayout(LayoutKind.Explicit)]
public class FrameAdvanceInfo
{
[FieldOffset(0)]
public IntPtr SoundBuf;
[FieldOffset(8)]
public IntPtr Pixels;
[FieldOffset(16)]
public long MasterCycles;
[FieldOffset(24)]
public int SoundBufMaxSize;
[FieldOffset(28)]
public int SoundBufSize;
[FieldOffset(32)]
public int Width;
[FieldOffset(36)]
public int Height;
};
[UnmanagedFunctionPointer(CC)]
public delegate int FirmwareSizeCallback(string filename);
[UnmanagedFunctionPointer(CC)]
public delegate void FirmwareDataCallback(string filename, IntPtr dest);
[UnmanagedFunctionPointer(CC)]
public delegate void CDTOCCallback(int disk, [In, Out]TOC toc);
[UnmanagedFunctionPointer(CC)]
public delegate void CDSectorCallback(int disk, int lba, IntPtr dest);
[BizImport(CC)]
public abstract void SetFirmwareCallbacks(FirmwareSizeCallback sizecallback, FirmwareDataCallback datacallback);
[BizImport(CC)]
public abstract void SetCDCallbacks(CDTOCCallback toccallback, CDSectorCallback sectorcallback);
[BizImport(CC)]
public abstract bool Init(int numDisks);
[BizImport(CC)]
public abstract void HardReset();
[BizImport(CC)]
public abstract void SetDisk(int disk, bool open);
[BizImport(CC)]
public abstract void FrameAdvance([In, Out]FrameAdvanceInfo f);
}
}

View File

@ -0,0 +1,252 @@
using BizHawk.Common.BizInvoke;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Waterbox;
using BizHawk.Emulation.DiscSystem;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace BizHawk.Emulation.Cores.Consoles.Sega.Saturn
{
[CoreAttributes("Saturnus", "Ryphecha", true, false, "0.9.44.1",
"https://mednafen.github.io/releases/", false)]
public class Saturnus : IEmulator, IVideoProvider, ISoundProvider, IInputPollable
{
private PeRunner _exe;
private LibSaturnus _core;
private Disc[] _disks;
private DiscSectorReader[] _diskReaders;
private bool _isPal;
public Saturnus(CoreComm comm, IEnumerable<Disc> disks)
{
ServiceProvider = new BasicServiceProvider(this);
CoreComm = comm;
_disks = disks.ToArray();
_diskReaders = disks.Select(d => new DiscSectorReader(d)).ToArray();
InitCallbacks();
_exe = new PeRunner(new PeRunnerOptions
{
Path = comm.CoreFileProvider.DllPath(),
Filename = "ss.wbx",
SbrkHeapSizeKB = 32 * 1024,
SealedHeapSizeKB = 32 * 1024,
InvisibleHeapSizeKB = 32 * 1024,
MmapHeapSizeKB = 32 * 1024,
PlainHeapSizeKB = 32 * 1024,
StartAddress = LibSaturnus.StartAddress
});
_core = BizInvoker.GetInvoker<LibSaturnus>(_exe, _exe);
SetFirmwareCallbacks();
SetCdCallbacks();
if (!_core.Init(_disks.Length))
throw new InvalidOperationException("Core rejected the disks!");
ClearAllCallbacks();
_exe.Seal();
SetCdCallbacks();
_core.SetDisk(0, false);
}
public unsafe void FrameAdvance(IController controller, bool render, bool rendersound = true)
{
fixed (short* _sp = _soundBuffer)
fixed (int* _vp = _videoBuffer)
{
var info = new LibSaturnus.FrameAdvanceInfo
{
SoundBuf = (IntPtr)_sp,
SoundBufMaxSize = _soundBuffer.Length / 2,
Pixels = (IntPtr)_vp
};
_core.FrameAdvance(info);
Frame++;
_numSamples = info.SoundBufSize;
BufferWidth = info.Width;
BufferHeight = info.Height;
}
}
private bool _disposed = false;
public void Dispose()
{
if (!_disposed)
{
_exe.Dispose();
_exe = null;
_core = null;
_disposed = true;
}
}
public int Frame { get; private set; }
public int LagCount { get; set; }
public bool IsLagFrame { get; set; }
public IInputCallbackSystem InputCallbacks { get; } = new InputCallbackSystem();
public void ResetCounters()
{
Frame = 0;
}
public IEmulatorServiceProvider ServiceProvider { get; private set; }
public string SystemId { get { return "SAT"; } }
public bool DeterministicEmulation { get; private set; }
public CoreComm CoreComm { get; }
public ControllerDefinition ControllerDefinition => NullController.Instance.Definition;
#region Callbacks
private LibSaturnus.FirmwareSizeCallback _firmwareSizeCallback;
private LibSaturnus.FirmwareDataCallback _firmwareDataCallback;
private LibSaturnus.CDTOCCallback _cdTocCallback;
private LibSaturnus.CDSectorCallback _cdSectorCallback;
private void InitCallbacks()
{
_firmwareSizeCallback = FirmwareSize;
_firmwareDataCallback = FirmwareData;
_cdTocCallback = CDTOCCallback;
_cdSectorCallback = CDSectorCallback;
}
private void SetFirmwareCallbacks()
{
_core.SetFirmwareCallbacks(_firmwareSizeCallback, _firmwareDataCallback);
}
private void SetCdCallbacks()
{
_core.SetCDCallbacks(_cdTocCallback, _cdSectorCallback);
}
private void ClearAllCallbacks()
{
_core.SetFirmwareCallbacks(null, null);
_core.SetCDCallbacks(null, null);
}
private string TranslateFirmwareName(string filename)
{
switch (filename)
{
case "ss.cart.kof95_path":
case "ss.cart.ultraman_path":
// this may be moved to an xmlloader thing, and not the firmware interface
throw new NotImplementedException();
case "BIOS_J":
case "BIOS_A":
return "J";
case "BIOS_E":
_isPal = true;
return "E";
case "BIOS_U":
return "U";
default:
throw new InvalidOperationException("Unknown BIOS file");
}
}
private byte[] GetFirmware(string filename)
{
return CoreComm.CoreFileProvider.GetFirmware("SAT", TranslateFirmwareName(filename), true);
}
private int FirmwareSize(string filename)
{
return GetFirmware(filename).Length;
}
private void FirmwareData(string filename, IntPtr dest)
{
var data = GetFirmware(filename);
Marshal.Copy(data, 0, dest, data.Length);
}
private void CDTOCCallback(int disk, [In, Out]LibSaturnus.TOC t)
{
// everything that's not commented, we're sure about
var tin = _disks[disk].TOC;
t.FirstTrack = tin.FirstRecordedTrackNumber;
t.LastTrack = tin.LastRecordedTrackNumber;
t.DiskType = (int)tin.Session1Format;
for (int i = 0; i < 101; i++)
{
t.Tracks[i].Address = 1; // ????
t.Tracks[i].Lba = tin.TOCItems[i].LBA;
t.Tracks[i].Control = (int)tin.TOCItems[i].Control;
t.Tracks[i].Valid = tin.TOCItems[i].Exists ? 1 : 0;
}
}
private void CDSectorCallback(int disk, int lba, IntPtr dest)
{
var buff = new byte[2448];
_diskReaders[disk].ReadLBA_2448(lba, buff, 0);
Marshal.Copy(buff, 0, dest, 2448);
}
#endregion
#region IVideoProvider
private int[] _videoBuffer = new int[1024 * 1024];
public int[] GetVideoBuffer()
{
return _videoBuffer;
}
private const int PalFpsNum = 1734687500;
private const int PalFpsDen = 61 * 455 * 1251;
private const int NtscFpsNum = 1746818182; // 1746818181.8
private const int NtscFpsDen = 61 * 455 * 1051;
public int VirtualWidth => BufferWidth; // TODO
public int VirtualHeight => BufferHeight; // TODO
public int BufferWidth { get; private set; } = 320;
public int BufferHeight { get; private set; } = 240;
public int VsyncNumerator => _isPal ? PalFpsNum : NtscFpsNum;
public int VsyncDenominator => _isPal ? PalFpsDen : NtscFpsDen;
public int BackgroundColor => unchecked((int)0xff000000);
#endregion
#region ISoundProvider
private short[] _soundBuffer = new short[16384];
private int _numSamples;
public void SetSyncMode(SyncSoundMode mode)
{
if (mode == SyncSoundMode.Async)
{
throw new NotSupportedException("Async mode is not supported.");
}
}
public void GetSamplesSync(out short[] samples, out int nsamp)
{
samples = _soundBuffer;
nsamp = _numSamples;
}
public void GetSamplesAsync(short[] samples)
{
throw new InvalidOperationException("Async mode is not supported.");
}
public void DiscardSamples()
{
}
public bool CanProvideAsync => false;
public SyncSoundMode SyncMode => SyncSoundMode.Sync;
#endregion
}
}

View File

@ -709,9 +709,9 @@ namespace BizHawk.Emulation.Cores.Waterbox
_syscalls.Init();
Console.WriteLine("About to enter unmanaged code");
if (System.Diagnostics.Debugger.IsAttached)
{
Console.WriteLine("About to enter unmanaged code");
System.Diagnostics.Debugger.Break();
}

51
waterbox/ss/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,51 @@
{
"files.associations": {
"iosfwd": "cpp",
"xstring": "cpp",
"xutility": "cpp",
"system_error": "cpp",
"xlocale": "cpp",
"*.inc": "cpp",
"algorithm": "cpp",
"array": "cpp",
"atomic": "cpp",
"bitset": "cpp",
"cmath": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"cwchar": "cpp",
"deque": "cpp",
"exception": "cpp",
"initializer_list": "cpp",
"ios": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"ostream": "cpp",
"queue": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"string": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"utility": "cpp",
"vector": "cpp",
"xfacet": "cpp",
"xiosbase": "cpp",
"xlocinfo": "cpp",
"xlocnum": "cpp",
"xmemory": "cpp",
"xmemory0": "cpp",
"xstddef": "cpp",
"xtr1common": "cpp"
},
"editor.insertSpaces": false,
"editor.tabSize": 4,
"editor.detectIndentation": false
}

44
waterbox/ss/Makefile Normal file
View File

@ -0,0 +1,44 @@
CC = x86_64-nt64-midipix-g++
CCFLAGS:= -I. -I../emulibc \
-Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=implicit-function-declaration \
-std=c++0x -fomit-frame-pointer -fvisibility=hidden -fno-exceptions -fno-rtti \
-DLSB_FIRST \
-O1 -g
TARGET = ss.wbx
LDFLAGS = -Wl,--dynamicbase,--export-all-symbols
ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.cpp')
OBJ_DIR:=$(ROOT_DIR)/obj
_OBJS:=$(SRCS:.cpp=.o)
OBJS:=$(patsubst $(ROOT_DIR)%,$(OBJ_DIR)%,$(_OBJS))
$(OBJ_DIR)/%.o: %.cpp
@mkdir -p $(@D)
@$(CC) -c -o $@ $< $(CCFLAGS)
all: $(TARGET)
.PHONY: clean all
$(TARGET).in: $(OBJS)
@$(CC) -o $@ $(LDFLAGS) $(CCFLAGS) $(OBJS) ../emulibc/libemuhost.so
$(TARGET): $(TARGET).in
# strip $< -o $@ -R /4 -R /14 -R /29 -R /41 -R /55 -R /67 -R /78 -R /89 -R /104
cp $< $@
clean:
rm -rf $(OBJ_DIR)
rm -f $(TARGET).in
rm -f $(TARGET)
print-%:
@echo $* = $($*)
#install:
# $(CP) $(TARGET) $(DEST_$(ARCH))

365
waterbox/ss/bizhawk.cpp Normal file
View File

@ -0,0 +1,365 @@
#include "ss.h"
#include "stream/MemoryStream.h"
#include <memory>
#include "cdrom/cdromif.h"
#include "cdb.h"
#include "smpc.h"
#include "cart.h"
#define EXPORT extern "C" ECL_EXPORT
using namespace MDFN_IEN_SS;
static int32 (*FirmwareSizeCallback)(const char* filename);
static void (*FirmwareDataCallback)(const char* filename, uint8* dest);
std::unique_ptr<MemoryStream> GetFirmware(const char* filename)
{
int32 length = FirmwareSizeCallback(filename);
auto buffer = new uint8[length];
FirmwareDataCallback(filename, buffer);
auto ms = std::unique_ptr<MemoryStream>(new MemoryStream(length, true));
ms->write(buffer, length);
ms->seek(0, SEEK_SET);
delete[] buffer;
return ms;
}
EXPORT void SetFirmwareCallbacks(int32 (*sizecallback)(const char *filename), void (*datacallback)(const char* filename, uint8* dest))
{
FirmwareSizeCallback = sizecallback;
FirmwareDataCallback = datacallback;
}
struct FrontendTOC
{
int32 FirstTrack;
int32 LastTrack;
int32 DiskType;
struct
{
int32 Address;
int32 Control;
int32 Lba;
int32 Valid;
} Tracks[101];
};
static void (*ReadTOCCallback)(int disk, FrontendTOC *dest);
static void (*ReadSector2448Callback)(int disk, int lba, uint8 *dest);
EXPORT void SetCDCallbacks(void (*toccallback)(int disk, FrontendTOC *dest), void (*sectorcallback)(int disk, int lba, uint8 *dest))
{
ReadTOCCallback = toccallback;
ReadSector2448Callback = sectorcallback;
}
class MyCDIF : public CDIF
{
private:
int disk;
public:
MyCDIF(int disk) : disk(disk)
{
FrontendTOC t;
ReadTOCCallback(disk, &t);
disc_toc.first_track = t.FirstTrack;
disc_toc.last_track = t.LastTrack;
disc_toc.disc_type = t.DiskType;
for (int i = 0; i < 101; i++)
{
disc_toc.tracks[i].adr = t.Tracks[i].Address;
disc_toc.tracks[i].control = t.Tracks[i].Control;
disc_toc.tracks[i].lba = t.Tracks[i].Lba;
disc_toc.tracks[i].valid = t.Tracks[i].Valid;
}
}
virtual void HintReadSector(int32 lba) {}
virtual bool ReadRawSector(uint8 *buf, int32 lba)
{
ReadSector2448Callback(disk, lba, buf);
return true;
}
virtual bool ReadRawSectorPWOnly(uint8 *pwbuf, int32 lba, bool hint_fullread)
{
uint8 buff[2448];
ReadSector2448Callback(disk, lba, buff);
memcpy(pwbuf, buff + 2352, 96);
return true;
}
};
static std::vector<CDIF *> CDInterfaces;
static uint32* FrameBuffer;
static uint8 IsResetPushed; // 1 or 0
namespace MDFN_IEN_SS
{
extern bool LoadCD(std::vector<CDIF *> *CDInterfaces);
}
EXPORT bool Init(int numDisks)
{
FrameBuffer = (uint32*)alloc_invisible(1024 * 1024);
for (int i = 0; i < numDisks; i++)
CDInterfaces.push_back(new MyCDIF(i));
auto ret = LoadCD(&CDInterfaces);
if (ret)
SMPC_SetInput(12, nullptr, &IsResetPushed);
return ret;
}
EXPORT void HardReset()
{
// soft reset is handled as a normal button
SS_Reset(true);
}
EXPORT void SetDisk(int disk, bool open)
{
CDB_SetDisc(open, disk < 0 ? nullptr : CDInterfaces[disk]);
}
int setting_ss_slstartp = 0;
int setting_ss_slendp = 255;
int setting_ss_slstart = 0;
int setting_ss_slend = 239;
int setting_ss_region_default = SMPC_AREA_JP;
int setting_ss_cart = CART_NONE;
bool setting_ss_correct_aspect = true;
bool setting_ss_h_blend = false;
bool setting_ss_h_overscan = true;
bool setting_ss_region_autodetect = true;
bool setting_ss_input_sport1_multitap = false;
bool setting_ss_input_sport0_multitap = false;
namespace MDFN_IEN_SS
{
extern void Emulate(EmulateSpecStruct *espec_arg);
}
struct FrameAdvanceInfo
{
int16* SoundBuf;
uint32* Pixels;
int64 MasterCycles;
int32 SoundBufMaxSize;
int32 SoundBufSize;
int32 Width;
int32 Height;
// Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size
// of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure
// is ignored while drawing the image.
// int32 x, y, h;
// Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and
// only every other line in surface (with the start line defined by InterlacedField) has valid data
// (it's up to internal Mednafen code to deinterlace it).
// bool InterlaceOn;
// bool InterlaceField;
};
EXPORT void FrameAdvance(FrameAdvanceInfo& f)
{
EmulateSpecStruct e;
int32 LineWidths[1024];
e.pixels = FrameBuffer;
e.pitch32 = 1024;
e.LineWidths = LineWidths;
e.SoundBuf = f.SoundBuf;
e.SoundBufMaxSize = f.SoundBufMaxSize;
Emulate(&e);
f.SoundBufSize = e.SoundBufSize;
f.MasterCycles = e.MasterCycles;
int w = 256;
for (int i = 0; i < e.h; i++)
w = std::max(w, LineWidths[i]);
const uint32* src = FrameBuffer;
uint32* dst = f.Pixels;
const int srcp = 1024;
const int dstp = w;
src += e.y * srcp + e.x;
for (int j = 0; j < e.h; j++, src += srcp, dst += dstp)
{
memcpy(dst, src, LineWidths[j + e.y] * sizeof(*dst));
}
f.Width = w;
f.Height = e.h;
}
/*void VDP2REND_SetGetVideoParams(MDFNGI* gi, const bool caspect, const int sls, const int sle, const bool show_h_overscan, const bool dohblend)
{
CorrectAspect = caspect;
ShowHOverscan = show_h_overscan;
DoHBlend = dohblend;
LineVisFirst = sls;
LineVisLast = sle;
//
//
//
gi->fb_width = 704;
if(PAL)
{
gi->nominal_width = (ShowHOverscan ? 365 : 354);
gi->fb_height = 576;
}
else
{
gi->nominal_width = (ShowHOverscan ? 302 : 292);
gi->fb_height = 480;
}
gi->nominal_height = LineVisLast + 1 - LineVisFirst;
gi->lcm_width = (ShowHOverscan? 10560 : 10240);
gi->lcm_height = (LineVisLast + 1 - LineVisFirst) * 2;
//
//
//
if(!CorrectAspect)
{
gi->nominal_width = (ShowHOverscan ? 352 : 341);
gi->lcm_width = gi->nominal_width * 2;
}
}
void SetGetVideoParams(MDFNGI* gi, const bool caspect, const int sls, const int sle, const bool show_h_overscan, const bool dohblend)
{
if(PAL)
gi->fps = 65536 * 256 * (1734687500.0 / 61 / 4 / 455 / ((313 + 312.5) / 2.0));
else
gi->fps = 65536 * 256 * (1746818181.8 / 61 / 4 / 455 / ((263 + 262.5) / 2.0));
VDP2REND_SetGetVideoParams(gi, caspect, sls, sle, show_h_overscan, dohblend);
}*/
// if (BackupRAM_Dirty)SaveBackupRAM();
// if (CART_GetClearNVDirty())SaveCartNV();
/*static MDFN_COLD bool IsSaturnDisc(const uint8 *sa32k)
{
//if(sha256(&sa32k[0x100], 0xD00) != "96b8ea48819cfa589f24c40aa149c224c420dccf38b730f00156efe25c9bbc8f"_sha256)
// return false;
if (memcmp(&sa32k[0], "SEGA SEGASATURN ", 16))
return false;
return true;
}*/
/*static MDFN_COLD bool TestMagicCD(std::vector<CDIF *> *CDInterfaces)
{
std::unique_ptr<uint8[]> buf(new uint8[2048 * 16]);
if ((*CDInterfaces)[0]->ReadSector(&buf[0], 0, 16, true) != 0x1)
return false;
return IsSaturnDisc(&buf[0]);
}*/
/*static MDFN_COLD void CloseGame(void)
{
try { SaveBackupRAM(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); }
try { SaveCartNV(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); }
try { SaveRTC(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); }
Cleanup();
}*/
/*static MDFN_COLD void SaveBackupRAM(void)
{
FileStream brs(MDFN_MakeFName(MDFNMKF_SAV, 0, "bkr"), FileStream::MODE_WRITE_INPLACE);
brs.write(BackupRAM, sizeof(BackupRAM));
brs.close();
}
static MDFN_COLD void LoadBackupRAM(void)
{
FileStream brs(MDFN_MakeFName(MDFNMKF_SAV, 0, "bkr"), FileStream::MODE_READ);
brs.read(BackupRAM, sizeof(BackupRAM));
}
static MDFN_COLD void BackupBackupRAM(void)
{
MDFN_BackupSavFile(10, "bkr");
}
static MDFN_COLD void BackupCartNV(void)
{
const char* ext = nullptr;
void* nv_ptr = nullptr;
uint64 nv_size = 0;
CART_GetNVInfo(&ext, &nv_ptr, &nv_size);
if(ext)
MDFN_BackupSavFile(10, ext);
}*/
/*static MDFN_COLD void LoadCartNV(void)
{
const char* ext = nullptr;
void* nv_ptr = nullptr;
uint64 nv_size = 0;
CART_GetNVInfo(&ext, &nv_ptr, &nv_size);
if(ext)
{
//FileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), FileStream::MODE_READ);
GZFileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), GZFileStream::MODE::READ);
nvs.read(nv_ptr, nv_size);
}
}
static MDFN_COLD void SaveCartNV(void)
{
const char* ext = nullptr;
void* nv_ptr = nullptr;
uint64 nv_size = 0;
CART_GetNVInfo(&ext, &nv_ptr, &nv_size);
if(ext)
{
//FileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), FileStream::MODE_WRITE_INPLACE);
GZFileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), GZFileStream::MODE::WRITE);
nvs.write(nv_ptr, nv_size);
nvs.close();
}
}*/
/*static MDFN_COLD void SaveRTC(void)
{
FileStream sds(MDFN_MakeFName(MDFNMKF_SAV, 0, "smpc"), FileStream::MODE_WRITE_INPLACE);
SMPC_SaveNV(&sds);
sds.close();
}
static MDFN_COLD void LoadRTC(void)
{
FileStream sds(MDFN_MakeFName(MDFNMKF_SAV, 0, "smpc"), FileStream::MODE_READ);
SMPC_LoadNV(&sds);
}*/
int main()
{
return 0;
}

173
waterbox/ss/cart.cpp Normal file
View File

@ -0,0 +1,173 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* cart.cpp - Expansion cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "cart.h"
#include "cart/backup.h"
#include "cart/cs1ram.h"
#include "cart/debug.h"
#include "cart/extram.h"
//#include "cart/nlmodem.h"
#include "cart/rom.h"
namespace MDFN_IEN_SS
{
CartInfo Cart;
template<typename T>
static MDFN_HOT void DummyRead(uint32 A, uint16* DB)
{
// Don't set *DB here.
SS_DBG(SS_DBG_WARNING, "[CART] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A);
}
template<typename T>
static MDFN_HOT void DummyWrite(uint32 A, uint16* DB)
{
SS_DBG(SS_DBG_WARNING, "[CART] Unknown %zu-byte write to 0x%08x(DB=0x%04x)\n", sizeof(T), A, *DB);
}
static sscpu_timestamp_t DummyUpdate(sscpu_timestamp_t timestamp)
{
return SS_EVENT_DISABLED_TS;
}
static void DummyAdjustTS(const int32 delta)
{
}
static void DummySetCPUClock(const int32 master_clock, const int32 divider)
{
}
static MDFN_COLD void DummyReset(bool powering_up)
{
}
static MDFN_COLD bool DummyGetClearNVDirty(void)
{
return false;
}
static MDFN_COLD void DummyGetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size)
{
*ext = nullptr;
*nv_ptr = nullptr;
*nv_size = 0;
}
void CartInfo::CS01_SetRW8W16(uint32 Astart, uint32 Aend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB), void (*w16)(uint32 A, uint16* DB))
{
assert(Astart >= 0x02000000 && Aend <= 0x04FFFFFF);
assert(!(Astart & ((1U << 20) - 1)));
assert(!((Aend + 1) & ((1U << 20) - 1)));
for(unsigned i = (Astart - 0x02000000) >> 20; i <= (Aend - 0x02000000) >> 20; i++)
{
auto& rw = Cart.CS01_RW[i];
if(r16) rw.Read16 = r16;
if(w8) rw.Write8 = w8;
if(w16) rw.Write16 = w16;
}
}
void CartInfo::CS2M_SetRW8W16(uint8 Ostart, uint8 Oend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB), void (*w16)(uint32 A, uint16* DB))
{
assert(!(Ostart & 0x1));
assert(Oend & 0x1);
assert(Ostart < 0x40);
assert(Oend < 0x40);
for(int i = Ostart >> 1; i <= Oend >> 1; i++)
{
auto& rw = Cart.CS2M_RW[i];
if(r16) rw.Read16 = r16;
if(w8) rw.Write8 = w8;
if(w16) rw.Write16 = w16;
}
}
void CART_Init(const int cart_type)
{
Cart.CS01_SetRW8W16(0x02000000, 0x04FFFFFF, DummyRead<uint16>, DummyWrite<uint8>, DummyWrite<uint16>);
Cart.CS2M_SetRW8W16(0x00, 0x3F, DummyRead<uint16>, DummyWrite<uint8>, DummyWrite<uint16>);
Cart.Reset = DummyReset;
Cart.GetNVInfo = DummyGetNVInfo;
Cart.GetClearNVDirty = DummyGetClearNVDirty;
Cart.EventHandler = DummyUpdate;
Cart.AdjustTS = DummyAdjustTS;
Cart.SetCPUClock = DummySetCPUClock;
switch(cart_type)
{
default:
case CART_NONE:
break;
case CART_BACKUP_MEM:
CART_Backup_Init(&Cart);
break;
case CART_EXTRAM_1M:
case CART_EXTRAM_4M:
CART_ExtRAM_Init(&Cart, cart_type == CART_EXTRAM_4M);
break;
case CART_KOF95:
case CART_ULTRAMAN:
{
auto fp = GetFirmware(cart_type == CART_KOF95 ? "ss.cart.kof95_path" : "ss.cart.ultraman_path");
CART_ROM_Init(&Cart, fp.get());
}
break;
case CART_CS1RAM_16M:
CART_CS1RAM_Init(&Cart);
break;
case CART_MDFN_DEBUG:
CART_Debug_Init(&Cart);
break;
// case CART_NLMODEM:
// CART_NLModem_Init(&Cart);
// break;
}
for(auto& m : Cart.CS01_RW)
assert(m.Read16 != nullptr && m.Write8 != nullptr && m.Write16 != nullptr);
for(auto& m : Cart.CS2M_RW)
assert(m.Read16 != nullptr && m.Write8 != nullptr && m.Write16 != nullptr);
}
}

95
waterbox/ss/cart.h Normal file
View File

@ -0,0 +1,95 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* cart.h - Expansion cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_H
#define __MDFN_SS_CART_H
namespace MDFN_IEN_SS
{
struct CartInfo
{
void (*Reset)(bool powering_up);
void (*GetNVInfo)(const char** ext, void** nv_ptr, uint64* nv_size);
bool (*GetClearNVDirty)(void);
void (*AdjustTS)(const int32 delta);
// For calculating clock ratios.
void (*SetCPUClock)(const int32 master_clock, const int32 cpu_divider);
ss_event_handler EventHandler;
// A >> 20
struct
{
void (*Read16)(uint32 A, uint16* DB);
void (*Write8)(uint32 A, uint16* DB);
void (*Write16)(uint32 A, uint16* DB);
} CS01_RW[0x30];
struct
{
void (*Read16)(uint32 A, uint16* DB);
void (*Write8)(uint32 A, uint16* DB);
void (*Write16)(uint32 A, uint16* DB);
} CS2M_RW[0x20];
void CS01_SetRW8W16(uint32 Astart, uint32 Aend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB) = nullptr, void (*w16)(uint32 A, uint16* DB) = nullptr);
void CS2M_SetRW8W16(uint8 Ostart, uint8 Oend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB) = nullptr, void (*w16)(uint32 A, uint16* DB) = nullptr);
};
static INLINE void CART_CS01_Read16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Read16 (A, DB); }
static INLINE void CART_CS01_Write8_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Write8 (A, DB); }
static INLINE void CART_CS01_Write16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Write16(A, DB); }
static INLINE void CART_CS2_Read16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Read16 (A, DB); }
static INLINE void CART_CS2_Write8_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Write8 (A, DB); }
static INLINE void CART_CS2_Write16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Write16(A, DB); }
enum
{
CART__RESERVED = -1,
CART_NONE = 0,
CART_BACKUP_MEM,
CART_EXTRAM_1M,
CART_EXTRAM_4M,
CART_KOF95,
CART_ULTRAMAN,
CART_CS1RAM_16M,
CART_NLMODEM,
CART_MDFN_DEBUG
};
void CART_Init(const int cart_type) MDFN_COLD;
static INLINE ss_event_handler CART_GetEventHandler(void) { extern CartInfo Cart; return Cart.EventHandler; }
static INLINE void CART_AdjustTS(const int32 delta) { extern CartInfo Cart; Cart.AdjustTS(delta); }
static INLINE void CART_SetCPUClock(const int32 master_clock, const int32 cpu_divider) { extern CartInfo Cart; Cart.SetCPUClock(master_clock, cpu_divider); }
static INLINE void CART_GetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size) { extern CartInfo Cart; Cart.GetNVInfo(ext, nv_ptr, nv_size); }
static INLINE bool CART_GetClearNVDirty(void) { extern CartInfo Cart; return Cart.GetClearNVDirty(); }
static INLINE void CART_Reset(bool powering_up) { extern CartInfo Cart; Cart.Reset(powering_up); }
}
#endif

View File

@ -0,0 +1,89 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* backup.cpp - Backup memory(512KiB) cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "backup.h"
namespace MDFN_IEN_SS
{
static uint8 ExtBackupRAM[0x80000];
static bool ExtBackupRAM_Dirty;
// TODO: Check mirroring.
template<typename T, bool IsWrite>
static MDFN_HOT void ExtBackupRAM_RW_DB(uint32 A, uint16* DB)
{
uint8* const ptr = ExtBackupRAM + ((A >> 1) & 0x7FFFF);
if(IsWrite)
{
if(A & 1)
{
ExtBackupRAM_Dirty = true;
*ptr = *DB;
}
}
else
{
*DB = (*ptr << 0) | 0xFF00;
if((A & ~1) == 0x04FFFFFE)
*DB = 0x21;
}
}
static MDFN_COLD bool GetClearNVDirty(void)
{
bool ret = ExtBackupRAM_Dirty;
ExtBackupRAM_Dirty = false;
return ret;
}
static MDFN_COLD void GetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size)
{
*ext = "bcr";
*nv_ptr = ExtBackupRAM;
*nv_size = sizeof(ExtBackupRAM);
}
void CART_Backup_Init(CartInfo* c)
{
static const uint8 init[0x10] = { 0x42, 0x61, 0x63, 0x6B, 0x55, 0x70, 0x52, 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74 };
memset(ExtBackupRAM, 0x00, sizeof(ExtBackupRAM));
for(unsigned i = 0; i < 0x200; i += 0x10)
memcpy(ExtBackupRAM + i, init, 0x10);
ExtBackupRAM_Dirty = false;
c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF,
ExtBackupRAM_RW_DB<uint16, false>,
ExtBackupRAM_RW_DB<uint8, true>,
ExtBackupRAM_RW_DB<uint16, true>);
c->GetClearNVDirty = GetClearNVDirty;
c->GetNVInfo = GetNVInfo;
}
}

30
waterbox/ss/cart/backup.h Normal file
View File

@ -0,0 +1,30 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* backup.h - Backup memory(512KiB) cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_BACKUP_H
#define __MDFN_SS_CART_BACKUP_H
namespace MDFN_IEN_SS
{
void CART_Backup_Init(CartInfo* c) MDFN_COLD;
}
#endif

View File

@ -0,0 +1,3 @@
#include "../ss.h"
#include "../cart.h"

View File

@ -0,0 +1,60 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* cs1ram.cpp - CS1 RAM(16MiB) cart emulation
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "cs1ram.h"
namespace MDFN_IEN_SS
{
static uint16* CS1RAM = nullptr;
template<typename T, bool IsWrite>
static MDFN_HOT void CS1RAM_RW_DB(uint32 A, uint16* DB)
{
const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3));
uint16* const ptr = (uint16*)((uint8*)CS1RAM + (A & 0x00FFFFFE));
if(IsWrite)
*ptr = (*ptr & ~mask) | (*DB & mask);
else
*DB = *ptr;
}
static MDFN_COLD void Reset(bool powering_up)
{
if(powering_up)
memset(CS1RAM, 0, 0x1000000);
}
void CART_CS1RAM_Init(CartInfo* c)
{
CS1RAM = new uint16[0x1000000 / sizeof(uint16)];
SS_SetPhysMemMap (0x04000000, 0x04FFFFFF, CS1RAM, 0x1000000, true);
c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF,
CS1RAM_RW_DB<uint16, false>,
CS1RAM_RW_DB<uint8, true>,
CS1RAM_RW_DB<uint16, true>);
c->Reset = Reset;
}
}

30
waterbox/ss/cart/cs1ram.h Normal file
View File

@ -0,0 +1,30 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* cs1ram.h - CS1 RAM(16MiB) cart emulation
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_CS1RAM_H
#define __MDFN_SS_CART_CS1RAM_H
namespace MDFN_IEN_SS
{
void CART_CS1RAM_Init(CartInfo* c) MDFN_COLD;
}
#endif

View File

@ -0,0 +1,60 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* debug.cpp - Mednafen debug cart emulation
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "debug.h"
namespace MDFN_IEN_SS
{
template<typename T, bool IsWrite>
static void Debug_RW_DB(uint32 A, uint16* DB)
{
//
// printf-related debugging
//
if((A &~ 0x3) == 0x02100000)
{
if(IsWrite)
{
if(A == 0x02100001)
{
fputc(*DB, stderr);
fflush(stderr);
}
}
else
*DB = 0;
return;
}
}
void CART_Debug_Init(CartInfo* c)
{
c->CS01_SetRW8W16(0x02100000, /*0x02100001*/ 0x021FFFFF,
Debug_RW_DB<uint16, false>,
Debug_RW_DB<uint8, true>,
Debug_RW_DB<uint16, true>);
}
}

30
waterbox/ss/cart/debug.h Normal file
View File

@ -0,0 +1,30 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* debug.h - Mednafen debug cart emulation
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_DEBUG_H
#define __MDFN_SS_CART_DEBUG_H
namespace MDFN_IEN_SS
{
void CART_Debug_Init(CartInfo* c) MDFN_COLD;
}
#endif

View File

@ -0,0 +1,83 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* extram.cpp - Extended RAM(1MiB and 4MiB) cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "extram.h"
namespace MDFN_IEN_SS
{
static uint16 ExtRAM[0x200000];
static size_t ExtRAM_Mask;
static uint8 Cart_ID;
template<typename T, bool IsWrite>
static MDFN_HOT void ExtRAM_RW_DB(uint32 A, uint16* DB)
{
const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3));
uint16* const ptr = (uint16*)((uint8*)ExtRAM + (A & ExtRAM_Mask));
//printf("Barf %zu %d: %08x\n", sizeof(T), IsWrite, A);
if(IsWrite)
*ptr = (*ptr & ~mask) | (*DB & mask);
else
*DB = *ptr;
}
static MDFN_HOT void CartID_Read_DB(uint32 A, uint16* DB)
{
if((A & ~1) == 0x04FFFFFE)
*DB = Cart_ID;
}
static MDFN_COLD void Reset(bool powering_up)
{
if(powering_up)
memset(ExtRAM, 0, sizeof(ExtRAM)); // TODO: Test.
}
void CART_ExtRAM_Init(CartInfo* c, bool R4MiB)
{
if(R4MiB)
{
Cart_ID = 0x5C;
ExtRAM_Mask = 0x3FFFFE;
}
else
{
Cart_ID = 0x5A;
ExtRAM_Mask = 0x27FFFE;
}
SS_SetPhysMemMap(0x02400000, 0x025FFFFF, ExtRAM + (0x000000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true);
SS_SetPhysMemMap(0x02600000, 0x027FFFFF, ExtRAM + (0x200000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true);
c->CS01_SetRW8W16(0x02400000, 0x027FFFFF,
ExtRAM_RW_DB<uint16, false>,
ExtRAM_RW_DB<uint8, true>,
ExtRAM_RW_DB<uint16, true>);
c->CS01_SetRW8W16(/*0x04FFFFFE*/0x04F00000, 0x04FFFFFF, CartID_Read_DB);
c->Reset = Reset;
}
}

30
waterbox/ss/cart/extram.h Normal file
View File

@ -0,0 +1,30 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* extram.h - Extended RAM(1MiB and 4MiB) cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_EXTRAM_H
#define __MDFN_SS_CART_EXTRAM_H
namespace MDFN_IEN_SS
{
void CART_ExtRAM_Init(CartInfo* c, bool R4MiB) MDFN_COLD;
}
#endif

50
waterbox/ss/cart/rom.cpp Normal file
View File

@ -0,0 +1,50 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* rom.cpp - ROM cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "rom.h"
namespace MDFN_IEN_SS
{
static uint16 ROM[0x100000];
static MDFN_HOT void ROM_Read(uint32 A, uint16* DB)
{
// TODO: Check mirroring.
//printf("ROM: %08x\n", A);
*DB = *(uint16*)((uint8*)ROM + (A & 0x1FFFFE));
}
void CART_ROM_Init(CartInfo* c, Stream* str)
{
str->read(ROM, 0x200000);
for(unsigned i = 0; i < 0x100000; i++)
{
ROM[i] = MDFN_de16msb<true>(&ROM[i]);
}
SS_SetPhysMemMap (0x02000000, 0x03FFFFFF, ROM, 0x200000, false);
c->CS01_SetRW8W16(0x02000000, 0x03FFFFFF, ROM_Read);
}
}

30
waterbox/ss/cart/rom.h Normal file
View File

@ -0,0 +1,30 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* rom.h - ROM cart emulation
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CART_ROM_H
#define __MDFN_SS_CART_ROM_H
namespace MDFN_IEN_SS
{
void CART_ROM_Init(CartInfo* c, Stream* str) MDFN_COLD;
}
#endif

3630
waterbox/ss/cdb.cpp Normal file

File diff suppressed because it is too large Load Diff

51
waterbox/ss/cdb.h Normal file
View File

@ -0,0 +1,51 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* cdb.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_CDB_H
#define __MDFN_SS_CDB_H
class CDIF;
namespace MDFN_IEN_SS
{
void CDB_Init(void) MDFN_COLD;
void CDB_SetDisc(bool tray_open, CDIF *cdif) MDFN_COLD;
void CDB_Write_DBM(uint32 offset, uint16 DB, uint16 mask) MDFN_HOT;
uint16 CDB_Read(uint32 offset) MDFN_HOT;
void CDB_Reset(bool powering_up) MDFN_COLD;
sscpu_timestamp_t CDB_Update(sscpu_timestamp_t timestamp);
void CDB_ResetTS(void);
void CDB_GetCDDA(uint16* outbuf); // writes to outbuf[0] and outbuf[1]
void CDB_SetClockRatio(uint32 ratio);
void CDB_ResetCD(void);
void CDB_SetCDActive(bool active);
}
#endif

View File

@ -0,0 +1,430 @@
/* Mednafen - Multi-system Emulator
*
* Subchannel Q CRC Code: Copyright (C) 1998 Andreas Mueller <mueller@daneb.ping.de>
*
* 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
*/
#include "defs.h"
#include "CDUtility.h"
#include "dvdisaster.h"
#include "lec.h"
#include <assert.h>
namespace CDUtility
{
// lookup table for crc calculation
static uint16 subq_crctab[256] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108,
0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210,
0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B,
0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401,
0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE,
0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6,
0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D,
0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5,
0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC,
0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4,
0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD,
0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13,
0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A,
0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E,
0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1,
0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB,
0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0,
0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8,
0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657,
0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9,
0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882,
0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E,
0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07,
0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D,
0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74,
0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
static uint8 scramble_table[2352 - 12];
static bool CDUtility_Inited = false;
static void InitScrambleTable(void)
{
unsigned cv = 1;
for(unsigned i = 12; i < 2352; i++)
{
unsigned char z = 0;
for(int b = 0; b < 8; b++)
{
z |= (cv & 1) << b;
int feedback = ((cv >> 1) & 1) ^ (cv & 1);
cv = (cv >> 1) | (feedback << 14);
}
scramble_table[i - 12] = z;
}
//for(int i = 0; i < 2352 - 12; i++)
// printf("0x%02x, ", scramble_table[i]);
}
void CDUtility_Init(void)
{
if(!CDUtility_Inited)
{
//Init_LEC_Correct();
InitScrambleTable();
CDUtility_Inited = true;
}
}
void encode_mode0_sector(uint32 aba, uint8 *sector_data)
{
CDUtility_Init();
lec_encode_mode0_sector(aba, sector_data);
}
void encode_mode1_sector(uint32 aba, uint8 *sector_data)
{
CDUtility_Init();
lec_encode_mode1_sector(aba, sector_data);
}
void encode_mode2_sector(uint32 aba, uint8 *sector_data)
{
CDUtility_Init();
lec_encode_mode2_sector(aba, sector_data);
}
void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data)
{
CDUtility_Init();
lec_encode_mode2_form1_sector(aba, sector_data);
}
void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data)
{
CDUtility_Init();
lec_encode_mode2_form2_sector(aba, sector_data);
}
bool edc_check(const uint8 *sector_data, bool xa)
{
CDUtility_Init();
return(CheckEDC(sector_data, xa));
}
bool edc_lec_check_and_correct(uint8 *sector_data, bool xa)
{
CDUtility_Init();
return(ValidateRawSector(sector_data, xa));
}
bool subq_check_checksum(const uint8 *SubQBuf)
{
uint16 crc = 0;
uint16 stored_crc = 0;
stored_crc = SubQBuf[0xA] << 8;
stored_crc |= SubQBuf[0xB];
for(int i = 0; i < 0xA; i++)
crc = subq_crctab[(crc >> 8) ^ SubQBuf[i]] ^ (crc << 8);
crc = ~crc;
return(crc == stored_crc);
}
void subq_generate_checksum(uint8 *buf)
{
uint16 crc = 0;
for(int i = 0; i < 0xA; i++)
crc = subq_crctab[(crc >> 8) ^ buf[i]] ^ (crc << 8);
// Checksum
buf[0xa] = ~(crc >> 8);
buf[0xb] = ~(crc);
}
void subq_deinterleave(const uint8 *SubPWBuf, uint8 *qbuf)
{
memset(qbuf, 0, 0xC);
for(int i = 0; i < 96; i++)
{
qbuf[i >> 3] |= ((SubPWBuf[i] >> 6) & 0x1) << (7 - (i & 0x7));
}
}
// Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data.
void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf)
{
assert(in_buf != out_buf);
memset(out_buf, 0, 96);
for(unsigned ch = 0; ch < 8; ch++)
{
for(unsigned i = 0; i < 96; i++)
{
out_buf[(ch * 12) + (i >> 3)] |= ((in_buf[i] >> (7 - ch)) & 0x1) << (7 - (i & 0x7));
}
}
}
// Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data.
void subpw_interleave(const uint8 *in_buf, uint8 *out_buf)
{
assert(in_buf != out_buf);
for(unsigned d = 0; d < 12; d++)
{
for(unsigned bitpoodle = 0; bitpoodle < 8; bitpoodle++)
{
uint8 rawb = 0;
for(unsigned ch = 0; ch < 8; ch++)
{
rawb |= ((in_buf[ch * 12 + d] >> (7 - bitpoodle)) & 1) << (7 - ch);
}
out_buf[(d << 3) + bitpoodle] = rawb;
}
}
}
// NOTES ON LEADOUT AREA SYNTHESIS
//
// I'm not trusting that the "control" field for the TOC leadout entry will always be set properly, so | the control fields for the last track entry
// and the leadout entry together before extracting the D2 bit. Audio track->data leadout is fairly benign though maybe noisy(especially if we ever implement
// data scrambling properly), but data track->audio leadout could break things in an insidious manner for the more accurate drive emulation code).
//
void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf)
{
uint8 buf[0xC];
uint32 lba_relative;
uint32 ma, sa, fa;
uint32 m, s, f;
lba_relative = lba - toc.tracks[100].lba;
f = (lba_relative % 75);
s = ((lba_relative / 75) % 60);
m = (lba_relative / 75 / 60);
fa = (lba + 150) % 75;
sa = ((lba + 150) / 75) % 60;
ma = ((lba + 150) / 75 / 60);
uint8 adr = 0x1; // Q channel data encodes position
uint8 control = toc.tracks[100].control;
if(toc.tracks[toc.last_track].valid)
control |= toc.tracks[toc.last_track].control & 0x4;
else if(toc.disc_type == DISC_TYPE_CD_I)
control |= 0x4;
memset(buf, 0, 0xC);
buf[0] = (adr << 0) | (control << 4);
buf[1] = 0xAA;
buf[2] = 0x01;
// Track relative MSF address
buf[3] = U8_to_BCD(m);
buf[4] = U8_to_BCD(s);
buf[5] = U8_to_BCD(f);
buf[6] = 0; // Zerroooo
// Absolute MSF address
buf[7] = U8_to_BCD(ma);
buf[8] = U8_to_BCD(sa);
buf[9] = U8_to_BCD(fa);
subq_generate_checksum(buf);
for(int i = 0; i < 96; i++)
SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80;
}
void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf)
{
memset(out_buf, 0, 2352 + 96);
subpw_synth_leadout_lba(toc, lba, out_buf + 2352);
if(out_buf[2352 + 1] & 0x40)
{
if(mode == 0xFF)
{
if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I)
mode = 0x02;
else
mode = 0x01;
}
switch(mode)
{
default:
encode_mode0_sector(LBA_to_ABA(lba), out_buf);
break;
case 0x01:
encode_mode1_sector(LBA_to_ABA(lba), out_buf);
break;
case 0x02:
out_buf[12 + 6] = 0x20;
out_buf[12 + 10] = 0x20;
encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf);
break;
}
}
}
// ISO/IEC 10149:1995 (E): 20.2
//
void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf)
{
uint8 buf[0xC];
uint32 lba_relative;
uint32 ma, sa, fa;
uint32 m, s, f;
if(lba < -150 || lba >= 0)
printf("[BUG] subpw_synth_udapp_lba() lba out of range --- %d\n", lba);
{
int32 lba_tmp = lba + lba_subq_relative_offs;
if(lba_tmp < 0)
lba_relative = 0 - 1 - lba_tmp;
else
lba_relative = lba_tmp - 0;
}
f = (lba_relative % 75);
s = ((lba_relative / 75) % 60);
m = (lba_relative / 75 / 60);
fa = (lba + 150) % 75;
sa = ((lba + 150) / 75) % 60;
ma = ((lba + 150) / 75 / 60);
uint8 adr = 0x1; // Q channel data encodes position
uint8 control;
if(toc.disc_type == DISC_TYPE_CD_I && toc.first_track > 1)
control = 0x4;
else if(toc.tracks[toc.first_track].valid)
control = toc.tracks[toc.first_track].control;
else
control = 0x0;
memset(buf, 0, 0xC);
buf[0] = (adr << 0) | (control << 4);
buf[1] = U8_to_BCD(toc.first_track);
buf[2] = U8_to_BCD(0x00);
// Track relative MSF address
buf[3] = U8_to_BCD(m);
buf[4] = U8_to_BCD(s);
buf[5] = U8_to_BCD(f);
buf[6] = 0; // Zerroooo
// Absolute MSF address
buf[7] = U8_to_BCD(ma);
buf[8] = U8_to_BCD(sa);
buf[9] = U8_to_BCD(fa);
subq_generate_checksum(buf);
for(int i = 0; i < 96; i++)
SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80;
}
void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf)
{
memset(out_buf, 0, 2352 + 96);
subpw_synth_udapp_lba(toc, lba, lba_subq_relative_offs, out_buf + 2352);
if(out_buf[2352 + 1] & 0x40)
{
if(mode == 0xFF)
{
if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I)
mode = 0x02;
else
mode = 0x01;
}
switch(mode)
{
default:
encode_mode0_sector(LBA_to_ABA(lba), out_buf);
break;
case 0x01:
encode_mode1_sector(LBA_to_ABA(lba), out_buf);
break;
case 0x02:
out_buf[12 + 6] = 0x20;
out_buf[12 + 10] = 0x20;
encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf);
break;
}
}
}
#if 0
bool subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output)
{
assert(subq_check_checksum(subq_input));
subq_generate_checksum(subq_output);
}
#endif
void scrambleize_data_sector(uint8 *sector_data)
{
for(unsigned i = 12; i < 2352; i++)
sector_data[i] ^= scramble_table[i - 12];
}
}

View File

@ -0,0 +1,237 @@
#ifndef __MDFN_CDROM_CDUTILITY_H
#define __MDFN_CDROM_CDUTILITY_H
namespace CDUtility
{
// Call once at app startup before creating any threads that could potentially cause re-entrancy to these functions.
// It will also be called automatically if needed for the first time a function in this namespace that requires
// the initialization function to be called is called, for potential
// usage in constructors of statically-declared objects.
void CDUtility_Init(void) MDFN_COLD;
// Quick definitions here:
//
// ABA - Absolute block address, synonymous to absolute MSF
// aba = (m_a * 60 * 75) + (s_a * 75) + f_a
//
// LBA - Logical block address(related: data CDs are required to have a pregap of 2 seconds, IE 150 frames/sectors)
// lba = aba - 150
enum
{
ADR_NOQINFO = 0x00,
ADR_CURPOS = 0x01,
ADR_MCN = 0x02,
ADR_ISRC = 0x03
};
struct TOC_Track
{
uint8 adr;
uint8 control;
uint32 lba;
bool valid; // valid/present; oh CD-i...
};
// SubQ control field flags.
enum
{
SUBQ_CTRLF_PRE = 0x01, // With 50/15us pre-emphasis.
SUBQ_CTRLF_DCP = 0x02, // Digital copy permitted.
SUBQ_CTRLF_DATA = 0x04, // Data track.
SUBQ_CTRLF_4CH = 0x08, // 4-channel CD-DA.
};
enum
{
DISC_TYPE_CDDA_OR_M1 = 0x00,
DISC_TYPE_CD_I = 0x10,
DISC_TYPE_CD_XA = 0x20
};
struct TOC
{
INLINE TOC()
{
Clear();
}
INLINE void Clear(void)
{
first_track = last_track = 0;
disc_type = 0;
memset(tracks, 0, sizeof(tracks)); // FIXME if we change TOC_Track to non-POD type.
}
INLINE int FindTrackByLBA(uint32 LBA) const
{
int32 lvt = 0;
for(int32 track = 1; track <= 100; track++)
{
if(!tracks[track].valid)
continue;
if(LBA < tracks[track].lba)
break;
lvt = track;
}
return(lvt);
}
uint8 first_track;
uint8 last_track;
uint8 disc_type;
TOC_Track tracks[100 + 1]; // [0] is unused, [100] is for the leadout track.
};
//
// Address conversion functions.
//
static INLINE uint32 AMSF_to_ABA(int32 m_a, int32 s_a, int32 f_a)
{
return(f_a + 75 * s_a + 75 * 60 * m_a);
}
static INLINE void ABA_to_AMSF(uint32 aba, uint8 *m_a, uint8 *s_a, uint8 *f_a)
{
*m_a = aba / 75 / 60;
*s_a = (aba - *m_a * 75 * 60) / 75;
*f_a = aba - (*m_a * 75 * 60) - (*s_a * 75);
}
static INLINE int32 ABA_to_LBA(uint32 aba)
{
return(aba - 150);
}
static INLINE uint32 LBA_to_ABA(int32 lba)
{
return(lba + 150);
}
static INLINE int32 AMSF_to_LBA(uint8 m_a, uint8 s_a, uint8 f_a)
{
return(ABA_to_LBA(AMSF_to_ABA(m_a, s_a, f_a)));
}
static INLINE void LBA_to_AMSF(int32 lba, uint8 *m_a, uint8 *s_a, uint8 *f_a)
{
ABA_to_AMSF(LBA_to_ABA(lba), m_a, s_a, f_a);
}
//
// BCD conversion functions
//
static INLINE bool BCD_is_valid(uint8 bcd_number)
{
if((bcd_number & 0xF0) >= 0xA0)
return(false);
if((bcd_number & 0x0F) >= 0x0A)
return(false);
return(true);
}
static INLINE uint8 BCD_to_U8(uint8 bcd_number)
{
return( ((bcd_number >> 4) * 10) + (bcd_number & 0x0F) );
}
static INLINE uint8 U8_to_BCD(uint8 num)
{
return( ((num / 10) << 4) + (num % 10) );
}
// should always perform the conversion, even if the bcd number is invalid.
static INLINE bool BCD_to_U8_check(uint8 bcd_number, uint8 *out_number)
{
*out_number = BCD_to_U8(bcd_number);
if(!BCD_is_valid(bcd_number))
return(false);
return(true);
}
//
// Sector data encoding functions(to full 2352 bytes raw sector).
//
// sector_data must be able to contain at least 2352 bytes.
void encode_mode0_sector(uint32 aba, uint8 *sector_data);
void encode_mode1_sector(uint32 aba, uint8 *sector_data); // 2048 bytes of user data at offset 16
void encode_mode2_sector(uint32 aba, uint8 *sector_data); // 2336 bytes of user data at offset 16
void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data); // 2048+8 bytes of user data at offset 16
void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data); // 2324+8 bytes of user data at offset 16
// User data area pre-pause(MSF 00:00:00 through 00:01:74), lba -150 through -1
// out_buf must be able to contain 2352+96 bytes.
// "mode" is not used if the area is to be encoded as audio.
// pass 0xFF for "mode" for "don't know", and to make guess based on the TOC.
void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf);
void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf);
// out_buf must be able to contain 2352+96 bytes.
// "mode" is not used if the area is to be encoded as audio.
// pass 0xFF for "mode" for "don't know", and to make guess based on the TOC.
void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf);
void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf);
//
// User data error detection and correction
//
// Check EDC of a mode 1 or mode 2 form 1 sector.
// Returns "true" if checksum is ok(matches).
// Returns "false" if checksum mismatch.
// sector_data should contain 2352 bytes of raw sector data.
bool edc_check(const uint8 *sector_data, bool xa);
// Check EDC and L-EC data of a mode 1 or mode 2 form 1 sector, and correct bit errors if any exist.
// Returns "true" if errors weren't detected, or they were corrected succesfully.
// Returns "false" if errors couldn't be corrected.
// sector_data should contain 2352 bytes of raw sector data.
//
// Note: mode 2 form 1 L-EC data can't correct errors in the 4-byte sector header(address + mode),
// but the error(s) will still be detected by EDC.
bool edc_lec_check_and_correct(uint8 *sector_data, bool xa);
//
// Subchannel(Q in particular) functions
//
// Returns false on checksum mismatch, true on match.
bool subq_check_checksum(const uint8 *subq_buf);
// Calculates the checksum of Q subchannel data(not including the checksum bytes of course ;)) from subq_buf, and stores it into the appropriate position
// in subq_buf.
void subq_generate_checksum(uint8 *subq_buf);
// Deinterleaves 12 bytes of subchannel Q data from 96 bytes of interleaved subchannel PW data.
void subq_deinterleave(const uint8 *subpw_buf, uint8 *subq_buf);
// Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data.
void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf);
// Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data.
void subpw_interleave(const uint8 *in_buf, uint8 *out_buf);
// Extrapolates Q subchannel current position data from subq_input, with frame/sector delta position_delta, and writes to subq_output.
// Only valid for ADR_CURPOS.
// subq_input must pass subq_check_checksum().
// TODO
//void subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output);
// (De)Scrambles data sector.
void scrambleize_data_sector(uint8 *sector_data);
}
#endif

View File

@ -0,0 +1,131 @@
/* Mednafen - Multi-system Emulator
*
* 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
*/
#include "ss.h"
#include <string.h>
#include <sys/types.h>
#include "cdromif.h"
//#include "CDAccess.h"
//#include "../general.h"
#include <algorithm>
using namespace CDUtility;
enum
{
// Status/Error messages
CDIF_MSG_DONE = 0, // Read -> emu. args: No args.
CDIF_MSG_INFO, // Read -> emu. args: str_message
CDIF_MSG_FATAL_ERROR, // Read -> emu. args: *TODO ARGS*
//
// Command messages.
//
CDIF_MSG_DIEDIEDIE, // Emu -> read
CDIF_MSG_READ_SECTOR, /* Emu -> read
args[0] = lba
*/
};
typedef struct
{
bool valid;
bool error;
int32 lba;
uint8 data[2352 + 96];
} CDIF_Sector_Buffer;
CDIF::CDIF() : UnrecoverableError(false)
{
}
CDIF::~CDIF()
{
}
bool CDIF::ValidateRawSector(uint8 *buf)
{
int mode = buf[12 + 3];
if(mode != 0x1 && mode != 0x2)
return(false);
if(!edc_lec_check_and_correct(buf, mode == 2))
return(false);
return(true);
}
int CDIF::ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message)
{
int ret = 0;
if(UnrecoverableError)
return(false);
while(sector_count--)
{
uint8 tmpbuf[2352 + 96];
if(!ReadRawSector(tmpbuf, lba))
{
puts("CDIF Raw Read error");
return(FALSE);
}
if(!ValidateRawSector(tmpbuf))
{
/*if(!suppress_uncorrectable_message)
{
MDFN_DispMessage(_("Uncorrectable data at sector %d"), lba);
MDFN_PrintError(_("Uncorrectable data at sector %d"), lba);
}*/
return(false);
}
const int mode = tmpbuf[12 + 3];
if(!ret)
ret = mode;
if(mode == 1)
{
memcpy(buf, &tmpbuf[12 + 4], 2048);
}
else if(mode == 2)
{
memcpy(buf, &tmpbuf[12 + 4 + 8], 2048);
}
else
{
printf("CDIF_ReadSector() invalid sector type at LBA=%u\n", (unsigned int)lba);
return(false);
}
buf += 2048;
lba++;
}
return(ret);
}

View File

@ -0,0 +1,64 @@
/* Mednafen - Multi-system Emulator
*
* 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
*/
#ifndef __MDFN_CDROM_CDROMIF_H
#define __MDFN_CDROM_CDROMIF_H
#include "CDUtility.h"
#include "stream/Stream.h"
#include <queue>
typedef CDUtility::TOC CD_TOC;
class CDIF
{
public:
CDIF();
virtual ~CDIF();
static const int32 LBA_Read_Minimum = -150;
static const int32 LBA_Read_Maximum = 449849; // 100 * 75 * 60 - 150 - 1
inline void ReadTOC(CDUtility::TOC *read_target)
{
*read_target = disc_toc;
}
virtual void HintReadSector(int32 lba) = 0;
virtual bool ReadRawSector(uint8 *buf, int32 lba) = 0; // Reads 2352+96 bytes of data into buf.
virtual bool ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread) = 0; // Reads 96 bytes(of raw subchannel PW data) into pwbuf.
// Call for mode 1 or mode 2 form 1 only.
bool ValidateRawSector(uint8 *buf);
// Utility/Wrapped functions
// Reads mode 1 and mode2 form 1 sectors(2048 bytes per sector returned)
// Will return the type(1, 2) of the first sector read to the buffer supplied, 0 on error
int ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message = false);
// For Mode 1, or Mode 2 Form 1.
// No reference counting or whatever is done, so if you destroy the CDIF object before you destroy the returned Stream, things will go BOOM.
Stream *MakeStream(int32 lba, uint32 sector_count);
protected:
bool UnrecoverableError;
CDUtility::TOC disc_toc;
};
#endif

130
waterbox/ss/cdrom/crc32.cpp Normal file
View File

@ -0,0 +1,130 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* CRC32 code based upon public domain code by Ross Williams (see notes below)
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#include "dvdisaster.h"
/***
*** EDC checksum used in CDROM sectors
***/
/*****************************************************************/
/* */
/* CRC LOOKUP TABLE */
/* ================ */
/* The following CRC lookup table was generated automagically */
/* by the Rocksoft^tm Model CRC Algorithm Table Generation */
/* Program V1.0 using the following model parameters: */
/* */
/* Width : 4 bytes. */
/* Poly : 0x8001801BL */
/* Reverse : TRUE. */
/* */
/* For more information on the Rocksoft^tm Model CRC Algorithm, */
/* see the document titled "A Painless Guide to CRC Error */
/* Detection Algorithms" by Ross Williams */
/* (ross@guest.adelaide.edu.au.). This document is likely to be */
/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */
/* */
/*****************************************************************/
static const unsigned long edctable[256] =
{
0x00000000L, 0x90910101L, 0x91210201L, 0x01B00300L,
0x92410401L, 0x02D00500L, 0x03600600L, 0x93F10701L,
0x94810801L, 0x04100900L, 0x05A00A00L, 0x95310B01L,
0x06C00C00L, 0x96510D01L, 0x97E10E01L, 0x07700F00L,
0x99011001L, 0x09901100L, 0x08201200L, 0x98B11301L,
0x0B401400L, 0x9BD11501L, 0x9A611601L, 0x0AF01700L,
0x0D801800L, 0x9D111901L, 0x9CA11A01L, 0x0C301B00L,
0x9FC11C01L, 0x0F501D00L, 0x0EE01E00L, 0x9E711F01L,
0x82012001L, 0x12902100L, 0x13202200L, 0x83B12301L,
0x10402400L, 0x80D12501L, 0x81612601L, 0x11F02700L,
0x16802800L, 0x86112901L, 0x87A12A01L, 0x17302B00L,
0x84C12C01L, 0x14502D00L, 0x15E02E00L, 0x85712F01L,
0x1B003000L, 0x8B913101L, 0x8A213201L, 0x1AB03300L,
0x89413401L, 0x19D03500L, 0x18603600L, 0x88F13701L,
0x8F813801L, 0x1F103900L, 0x1EA03A00L, 0x8E313B01L,
0x1DC03C00L, 0x8D513D01L, 0x8CE13E01L, 0x1C703F00L,
0xB4014001L, 0x24904100L, 0x25204200L, 0xB5B14301L,
0x26404400L, 0xB6D14501L, 0xB7614601L, 0x27F04700L,
0x20804800L, 0xB0114901L, 0xB1A14A01L, 0x21304B00L,
0xB2C14C01L, 0x22504D00L, 0x23E04E00L, 0xB3714F01L,
0x2D005000L, 0xBD915101L, 0xBC215201L, 0x2CB05300L,
0xBF415401L, 0x2FD05500L, 0x2E605600L, 0xBEF15701L,
0xB9815801L, 0x29105900L, 0x28A05A00L, 0xB8315B01L,
0x2BC05C00L, 0xBB515D01L, 0xBAE15E01L, 0x2A705F00L,
0x36006000L, 0xA6916101L, 0xA7216201L, 0x37B06300L,
0xA4416401L, 0x34D06500L, 0x35606600L, 0xA5F16701L,
0xA2816801L, 0x32106900L, 0x33A06A00L, 0xA3316B01L,
0x30C06C00L, 0xA0516D01L, 0xA1E16E01L, 0x31706F00L,
0xAF017001L, 0x3F907100L, 0x3E207200L, 0xAEB17301L,
0x3D407400L, 0xADD17501L, 0xAC617601L, 0x3CF07700L,
0x3B807800L, 0xAB117901L, 0xAAA17A01L, 0x3A307B00L,
0xA9C17C01L, 0x39507D00L, 0x38E07E00L, 0xA8717F01L,
0xD8018001L, 0x48908100L, 0x49208200L, 0xD9B18301L,
0x4A408400L, 0xDAD18501L, 0xDB618601L, 0x4BF08700L,
0x4C808800L, 0xDC118901L, 0xDDA18A01L, 0x4D308B00L,
0xDEC18C01L, 0x4E508D00L, 0x4FE08E00L, 0xDF718F01L,
0x41009000L, 0xD1919101L, 0xD0219201L, 0x40B09300L,
0xD3419401L, 0x43D09500L, 0x42609600L, 0xD2F19701L,
0xD5819801L, 0x45109900L, 0x44A09A00L, 0xD4319B01L,
0x47C09C00L, 0xD7519D01L, 0xD6E19E01L, 0x46709F00L,
0x5A00A000L, 0xCA91A101L, 0xCB21A201L, 0x5BB0A300L,
0xC841A401L, 0x58D0A500L, 0x5960A600L, 0xC9F1A701L,
0xCE81A801L, 0x5E10A900L, 0x5FA0AA00L, 0xCF31AB01L,
0x5CC0AC00L, 0xCC51AD01L, 0xCDE1AE01L, 0x5D70AF00L,
0xC301B001L, 0x5390B100L, 0x5220B200L, 0xC2B1B301L,
0x5140B400L, 0xC1D1B501L, 0xC061B601L, 0x50F0B700L,
0x5780B800L, 0xC711B901L, 0xC6A1BA01L, 0x5630BB00L,
0xC5C1BC01L, 0x5550BD00L, 0x54E0BE00L, 0xC471BF01L,
0x6C00C000L, 0xFC91C101L, 0xFD21C201L, 0x6DB0C300L,
0xFE41C401L, 0x6ED0C500L, 0x6F60C600L, 0xFFF1C701L,
0xF881C801L, 0x6810C900L, 0x69A0CA00L, 0xF931CB01L,
0x6AC0CC00L, 0xFA51CD01L, 0xFBE1CE01L, 0x6B70CF00L,
0xF501D001L, 0x6590D100L, 0x6420D200L, 0xF4B1D301L,
0x6740D400L, 0xF7D1D501L, 0xF661D601L, 0x66F0D700L,
0x6180D800L, 0xF111D901L, 0xF0A1DA01L, 0x6030DB00L,
0xF3C1DC01L, 0x6350DD00L, 0x62E0DE00L, 0xF271DF01L,
0xEE01E001L, 0x7E90E100L, 0x7F20E200L, 0xEFB1E301L,
0x7C40E400L, 0xECD1E501L, 0xED61E601L, 0x7DF0E700L,
0x7A80E800L, 0xEA11E901L, 0xEBA1EA01L, 0x7B30EB00L,
0xE8C1EC01L, 0x7850ED00L, 0x79E0EE00L, 0xE971EF01L,
0x7700F000L, 0xE791F101L, 0xE621F201L, 0x76B0F300L,
0xE541F401L, 0x75D0F500L, 0x7460F600L, 0xE4F1F701L,
0xE381F801L, 0x7310F900L, 0x72A0FA00L, 0xE231FB01L,
0x71C0FC00L, 0xE151FD01L, 0xE0E1FE01L, 0x7070FF00L
};
/*
* CDROM EDC calculation
*/
uint32 EDCCrc32(const unsigned char *data, int len)
{
uint32 crc = 0;
while(len--)
crc = edctable[(crc ^ *data++) & 0xFF] ^ (crc >> 8);
return crc;
}

View File

@ -0,0 +1,171 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#ifndef DVDISASTER_H
#define DVDISASTER_H
/* "Dare to be gorgeous and unique.
* But don't ever be cryptic or otherwise unfathomable.
* Make it unforgettably great."
*
* From "A Final Note on Style",
* Amiga Intuition Reference Manual, 1986, p. 231
*/
/***
*** I'm too lazy to mess with #include dependencies.
*** Everything #includeable is rolled up herein...
*/
#include "ss.h"
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/***
*** dvdisaster.c
***/
void PrepareDeadSector(void);
void CreateEcc(void);
void FixEcc(void);
void Verify(void);
uint32 EDCCrc32(const unsigned char*, int);
/***
*** galois.c
***
* This is currently the hardcoded GF(2**8).
* int32 gives abundant space for the GF.
* Squeezing it down to uint8 won't probably gain much,
* so we implement this defensively here.
*
* Note that some performance critical stuff needs to
* be #included from galois-inlines.h
*/
/* Galois field parameters for 8bit symbol Reed-Solomon code */
#define GF_SYMBOLSIZE 8
#define GF_FIELDSIZE (1<<GF_SYMBOLSIZE)
#define GF_FIELDMAX (GF_FIELDSIZE-1)
#define GF_ALPHA0 GF_FIELDMAX
/* Lookup tables for Galois field arithmetic */
typedef struct _GaloisTables
{ int32 gfGenerator; /* GF generator polynomial */
int32 *indexOf; /* log */
int32 *alphaTo; /* inverse log */
int32 *encAlphaTo; /* inverse log optimized for encoder */
} GaloisTables;
/* Lookup and working tables for the ReedSolomon codecs */
typedef struct _ReedSolomonTables
{ GaloisTables *gfTables;/* from above */
int32 *gpoly; /* RS code generator polynomial */
int32 fcr; /* first consecutive root of RS generator polynomial */
int32 primElem; /* primitive field element */
int32 nroots; /* degree of RS generator polynomial */
int32 ndata; /* data bytes per ecc block */
} ReedSolomonTables;
GaloisTables* CreateGaloisTables(int32);
void FreeGaloisTables(GaloisTables*);
ReedSolomonTables *CreateReedSolomonTables(GaloisTables*, int32, int32, int);
void FreeReedSolomonTables(ReedSolomonTables*);
/***
*** l-ec.c
***/
#define N_P_VECTORS 86 /* 43 16bit p vectors */
#define P_VECTOR_SIZE 26 /* using RS(26,24) ECC */
#define N_Q_VECTORS 52 /* 26 16bit q vectors */
#define Q_VECTOR_SIZE 45 /* using RS(45,43) ECC */
#define P_PADDING 229 /* padding values for */
#define Q_PADDING 210 /* shortened RS code */
int PToByteIndex(int, int);
int QToByteIndex(int, int);
void ByteIndexToP(int, int*, int*);
void ByteIndexToQ(int, int*, int*);
void GetPVector(unsigned char*, unsigned char*, int);
void SetPVector(unsigned char*, unsigned char*, int);
void FillPVector(unsigned char*, unsigned char, int);
void AndPVector(unsigned char*, unsigned char, int);
void OrPVector(unsigned char*, unsigned char, int);
void GetQVector(unsigned char*, unsigned char*, int);
void SetQVector(unsigned char*, unsigned char*, int);
void FillQVector(unsigned char*, unsigned char, int);
void AndQVector(unsigned char*, unsigned char, int);
void OrQVector(unsigned char*, unsigned char, int);
int DecodePQ(ReedSolomonTables*, unsigned char*, int, int*, int);
int CountC2Errors(unsigned char*);
/***
*** misc.c
***/
char* sgettext(char*);
char* sgettext_utf8(char*);
int64 uchar_to_int64(unsigned char*);
void int64_to_uchar(unsigned char*, int64);
void CalcSectors(int64, int64*, int*);
/***
*** recover-raw.c
***/
#define CD_RAW_SECTOR_SIZE 2352
#define CD_RAW_C2_SECTOR_SIZE (2352+294) /* main channel plus C2 vector */
int CheckEDC(const unsigned char*, bool);
int CheckMSF(unsigned char*, int);
int ValidateRawSector(unsigned char *frame, bool xaMode);
bool Init_LEC_Correct(void);
#endif /* DVDISASTER_H */

View File

@ -0,0 +1,40 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* The Reed-Solomon error correction draws a lot of inspiration - and even code -
* from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#include "dvdisaster.h"
/*
* The following routine is performance critical.
*/
static inline int mod_fieldmax(int x)
{
while (x >= GF_FIELDMAX)
{
x -= GF_FIELDMAX;
x = (x >> GF_SYMBOLSIZE) + (x & GF_FIELDMAX);
}
return x;
}

View File

@ -0,0 +1,156 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* The Reed-Solomon error correction draws a lot of inspiration - and even code -
* from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#include "dvdisaster.h"
#include "galois-inlines.h"
/***
*** Galois field arithmetic.
***
* Calculations are done over the extension field GF(2**n).
* Be careful not to overgeneralize these arithmetics;
* they only work for the case of GF(p**n) with p being prime.
*/
/* Initialize the Galois field tables */
GaloisTables* CreateGaloisTables(int32 gf_generator)
{
GaloisTables *gt = (GaloisTables *)calloc(1, sizeof(GaloisTables));
int32 b,log;
/* Allocate the tables.
The encoder uses a special version of alpha_to which has the mod_fieldmax()
folded into the table. */
gt->gfGenerator = gf_generator;
gt->indexOf = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32));
gt->alphaTo = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32));
gt->encAlphaTo = (int32 *)calloc(2*GF_FIELDSIZE, sizeof(int32));
/* create the log/ilog values */
for(b=1, log=0; log<GF_FIELDMAX; log++)
{ gt->indexOf[b] = log;
gt->alphaTo[log] = b;
b = b << 1;
if(b & GF_FIELDSIZE)
b = b ^ gf_generator;
}
if(b!=1)
{
printf("Failed to create the Galois field log tables!\n");
exit(1);
}
/* we're even closed using infinity (makes things easier) */
gt->indexOf[0] = GF_ALPHA0; /* log(0) = inf */
gt->alphaTo[GF_ALPHA0] = 0; /* and the other way around */
for(b=0; b<2*GF_FIELDSIZE; b++)
gt->encAlphaTo[b] = gt->alphaTo[mod_fieldmax(b)];
return gt;
}
void FreeGaloisTables(GaloisTables *gt)
{
if(gt->indexOf) free(gt->indexOf);
if(gt->alphaTo) free(gt->alphaTo);
if(gt->encAlphaTo) free(gt->encAlphaTo);
free(gt);
}
/***
*** Create the the Reed-Solomon generator polynomial
*** and some auxiliary data structures.
*/
ReedSolomonTables *CreateReedSolomonTables(GaloisTables *gt,
int32 first_consecutive_root,
int32 prim_elem,
int nroots_in)
{ ReedSolomonTables *rt = (ReedSolomonTables *)calloc(1, sizeof(ReedSolomonTables));
int32 i,j,root;
rt->gfTables = gt;
rt->fcr = first_consecutive_root;
rt->primElem = prim_elem;
rt->nroots = nroots_in;
rt->ndata = GF_FIELDMAX - rt->nroots;
rt->gpoly = (int32 *)calloc((rt->nroots+1), sizeof(int32));
/* Create the RS code generator polynomial */
rt->gpoly[0] = 1;
for(i=0, root=first_consecutive_root*prim_elem; i<rt->nroots; i++, root+=prim_elem)
{ rt->gpoly[i+1] = 1;
/* Multiply gpoly by alpha**(root+x) */
for(j=i; j>0; j--)
{
if(rt->gpoly[j] != 0)
rt->gpoly[j] = rt->gpoly[j-1] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[j]] + root)];
else
rt->gpoly[j] = rt->gpoly[j-1];
}
rt->gpoly[0] = gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[0]] + root)];
}
/* Store the polynomials index for faster encoding */
for(i=0; i<=rt->nroots; i++)
rt->gpoly[i] = gt->indexOf[rt->gpoly[i]];
#if 0
/* for the precalculated unrolled loops only */
for(i=gt->nroots-1; i>0; i--)
PrintCLI(
" par_idx[((++spk)&%d)] ^= enc_alpha_to[feedback + %3d];\n",
nroots-1,gt->gpoly[i]);
PrintCLI(" par_idx[sp] = enc_alpha_to[feedback + %3d];\n",
gt->gpoly[0]);
#endif
return rt;
}
void FreeReedSolomonTables(ReedSolomonTables *rt)
{
if(rt->gpoly) free(rt->gpoly);
free(rt);
}

478
waterbox/ss/cdrom/l-ec.cpp Normal file
View File

@ -0,0 +1,478 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* The Reed-Solomon error correction draws a lot of inspiration - and even code -
* from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#include "dvdisaster.h"
#include "galois-inlines.h"
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
/***
*** Mapping between cd frame and parity vectors
***/
/*
* Mapping of frame bytes to P/Q Vectors
*/
int PToByteIndex(int p, int i)
{ return 12 + p + i*86;
}
void ByteIndexToP(int b, int *p, int *i)
{ *p = (b-12)%86;
*i = (b-12)/86;
}
int QToByteIndex(int q, int i)
{ int offset = 12 + (q & 1);
if(i == 43) return 2248+q;
if(i == 44) return 2300+q;
q&=~1;
return offset + (q*43 + i*88) % 2236;
}
void ByteIndexToQ(int b, int *q, int *i)
{ int x,y,offset;
if(b >= 2300)
{ *i = 44;
*q = (b-2300);
return;
}
if(b >= 2248)
{ *i = 43;
*q = (b-2248);
return;
}
offset = b&1;
b = (b-12)/2;
x = b/43;
y = (b-(x*43))%26;
*i = b-(x*43);
*q = 2*((x+26-y)%26)+offset;
}
/*
* There are 86 vectors of P-parity, yielding a RS(26,24) code.
*/
void GetPVector(unsigned char *frame, unsigned char *data, int n)
{ int i;
int w_idx = n+12;
for(i=0; i<26; i++, w_idx+=86)
data[i] = frame[w_idx];
}
void SetPVector(unsigned char *frame, unsigned char *data, int n)
{ int i;
int w_idx = n+12;
for(i=0; i<26; i++, w_idx+=86)
frame[w_idx] = data[i];
}
void FillPVector(unsigned char *frame, unsigned char data, int n)
{ int i;
int w_idx = n+12;
for(i=0; i<26; i++, w_idx+=86)
frame[w_idx] = data;
}
void OrPVector(unsigned char *frame, unsigned char value, int n)
{ int i;
int w_idx = n+12;
for(i=0; i<26; i++, w_idx+=86)
frame[w_idx] |= value;
}
void AndPVector(unsigned char *frame, unsigned char value, int n)
{ int i;
int w_idx = n+12;
for(i=0; i<26; i++, w_idx+=86)
frame[w_idx] &= value;
}
/*
* There are 52 vectors of Q-parity, yielding a RS(45,43) code.
*/
void GetQVector(unsigned char *frame, unsigned char *data, int n)
{ int offset = 12 + (n & 1);
int w_idx = (n&~1) * 43;
int i;
for(i=0; i<43; i++, w_idx+=88)
data[i] = frame[(w_idx % 2236) + offset];
data[43] = frame[2248 + n];
data[44] = frame[2300 + n];
}
void SetQVector(unsigned char *frame, unsigned char *data, int n)
{ int offset = 12 + (n & 1);
int w_idx = (n&~1) * 43;
int i;
for(i=0; i<43; i++, w_idx+=88)
frame[(w_idx % 2236) + offset] = data[i];
frame[2248 + n] = data[43];
frame[2300 + n] = data[44];
}
void FillQVector(unsigned char *frame, unsigned char data, int n)
{ int offset = 12 + (n & 1);
int w_idx = (n&~1) * 43;
int i;
for(i=0; i<43; i++, w_idx+=88)
frame[(w_idx % 2236) + offset] = data;
frame[2248 + n] = data;
frame[2300 + n] = data;
}
void OrQVector(unsigned char *frame, unsigned char data, int n)
{ int offset = 12 + (n & 1);
int w_idx = (n&~1) * 43;
int i;
for(i=0; i<43; i++, w_idx+=88)
frame[(w_idx % 2236) + offset] |= data;
frame[2248 + n] |= data;
frame[2300 + n] |= data;
}
void AndQVector(unsigned char *frame, unsigned char data, int n)
{ int offset = 12 + (n & 1);
int w_idx = (n&~1) * 43;
int i;
for(i=0; i<43; i++, w_idx+=88)
frame[(w_idx % 2236) + offset] &= data;
frame[2248 + n] &= data;
frame[2300 + n] &= data;
}
/***
*** C2 error counting
***/
int CountC2Errors(unsigned char *frame)
{ int i,count = 0;
frame += 2352;
for(i=0; i<294; i++, frame++)
{ if(*frame & 0x01) count++;
if(*frame & 0x02) count++;
if(*frame & 0x04) count++;
if(*frame & 0x08) count++;
if(*frame & 0x10) count++;
if(*frame & 0x20) count++;
if(*frame & 0x40) count++;
if(*frame & 0x80) count++;
}
return count;
}
/***
*** L-EC error correction for CD raw data sectors
***/
/*
* These could be used from ReedSolomonTables,
* but hardcoding them is faster.
*/
#define NROOTS 2
#define LEC_FIRST_ROOT 0 //GF_ALPHA0
#define LEC_PRIM_ELEM 1
#define LEC_PRIMTH_ROOT 1
/*
* Calculate the error syndrome
*/
int DecodePQ(ReedSolomonTables *rt, unsigned char *data, int padding,
int *erasure_list, int erasure_count)
{ GaloisTables *gt = rt->gfTables;
int syndrome[NROOTS];
int lambda[NROOTS+1];
int omega[NROOTS+1];
int b[NROOTS+1];
int reg[NROOTS+1];
int root[NROOTS];
int loc[NROOTS];
int syn_error;
int deg_lambda,lambda_roots;
int deg_omega;
int shortened_size = GF_FIELDMAX - padding;
int corrected = 0;
int i,j,k;
int r,el;
/*** Form the syndromes: Evaluate data(x) at roots of g(x) */
for(i=0; i<NROOTS; i++)
syndrome[i] = data[0];
for(j=1; j<shortened_size; j++)
for(i=0; i<NROOTS; i++)
if(syndrome[i] == 0)
syndrome[i] = data[j];
else syndrome[i] = data[j] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[syndrome[i]]
+ (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)];
/*** Convert syndrome to index form, check for nonzero condition. */
syn_error = 0;
for(i=0; i<NROOTS; i++)
{ syn_error |= syndrome[i];
syndrome[i] = gt->indexOf[syndrome[i]];
}
/*** If the syndrome is zero, everything is fine. */
if(!syn_error)
return 0;
/*** Initialize lambda to be the erasure locator polynomial */
lambda[0] = 1;
lambda[1] = lambda[2] = 0;
erasure_list[0] += padding;
erasure_list[1] += padding;
if(erasure_count > 2) /* sanity check */
erasure_count = 0;
if(erasure_count > 0)
{ lambda[1] = gt->alphaTo[mod_fieldmax(LEC_PRIM_ELEM*(GF_FIELDMAX-1-erasure_list[0]))];
for(i=1; i<erasure_count; i++)
{ int u = mod_fieldmax(LEC_PRIM_ELEM*(GF_FIELDMAX-1-erasure_list[i]));
for(j=i+1; j>0; j--)
{ int tmp = gt->indexOf[lambda[j-1]];
if(tmp != GF_ALPHA0)
lambda[j] ^= gt->alphaTo[mod_fieldmax(u + tmp)];
}
}
}
for(i=0; i<NROOTS+1; i++)
b[i] = gt->indexOf[lambda[i]];
/*** Berlekamp-Massey algorithm to determine error+erasure locator polynomial */
r = erasure_count; /* r is the step number */
el = erasure_count;
/* Compute discrepancy at the r-th step in poly-form */
while(++r <= NROOTS)
{ int discr_r = 0;
for(i=0; i<r; i++)
if((lambda[i] != 0) && (syndrome[r-i-1] != GF_ALPHA0))
discr_r ^= gt->alphaTo[mod_fieldmax(gt->indexOf[lambda[i]] + syndrome[r-i-1])];
discr_r = gt->indexOf[discr_r];
if(discr_r == GF_ALPHA0)
{ /* B(x) = x*B(x) */
memmove(b+1, b, NROOTS*sizeof(b[0]));
b[0] = GF_ALPHA0;
}
else
{ int t[NROOTS+1];
/* T(x) = lambda(x) - discr_r*x*b(x) */
t[0] = lambda[0];
for(i=0; i<NROOTS; i++)
{ if(b[i] != GF_ALPHA0)
t[i+1] = lambda[i+1] ^ gt->alphaTo[mod_fieldmax(discr_r + b[i])];
else t[i+1] = lambda[i+1];
}
if(2*el <= r+erasure_count-1)
{ el = r + erasure_count - el;
/* B(x) <-- inv(discr_r) * lambda(x) */
for(i=0; i<=NROOTS; i++)
b[i] = (lambda[i] == 0) ? GF_ALPHA0
: mod_fieldmax(gt->indexOf[lambda[i]] - discr_r + GF_FIELDMAX);
}
else
{ /* 2 lines below: B(x) <-- x*B(x) */
memmove(b+1, b, NROOTS*sizeof(b[0]));
b[0] = GF_ALPHA0;
}
memcpy(lambda, t, (NROOTS+1)*sizeof(t[0]));
}
}
/*** Convert lambda to index form and compute deg(lambda(x)) */
deg_lambda = 0;
for(i=0; i<NROOTS+1; i++)
{ lambda[i] = gt->indexOf[lambda[i]];
if(lambda[i] != GF_ALPHA0)
deg_lambda = i;
}
/*** Find roots of the error+erasure locator polynomial by Chien search */
memcpy(reg+1, lambda+1, NROOTS*sizeof(reg[0]));
lambda_roots = 0; /* Number of roots of lambda(x) */
for(i=1, k=LEC_PRIMTH_ROOT-1; i<=GF_FIELDMAX; i++, k=mod_fieldmax(k+LEC_PRIMTH_ROOT))
{ int q=1; /* lambda[0] is always 0 */
for(j=deg_lambda; j>0; j--)
{ if(reg[j] != GF_ALPHA0)
{ reg[j] = mod_fieldmax(reg[j] + j);
q ^= gt->alphaTo[reg[j]];
}
}
if(q != 0) continue; /* Not a root */
/* store root in index-form and the error location number */
root[lambda_roots] = i;
loc[lambda_roots] = k;
/* If we've already found max possible roots, abort the search to save time */
if(++lambda_roots == deg_lambda) break;
}
/* deg(lambda) unequal to number of roots => uncorrectable error detected
This is not reliable for very small numbers of roots, e.g. nroots = 2 */
if(deg_lambda != lambda_roots)
{ return -1;
}
/* Compute err+eras evaluator poly omega(x) = syn(x)*lambda(x)
(modulo x**nroots). in index form. Also find deg(omega). */
deg_omega = deg_lambda-1;
for(i=0; i<=deg_omega; i++)
{ int tmp = 0;
for(j=i; j>=0; j--)
{ if((syndrome[i - j] != GF_ALPHA0) && (lambda[j] != GF_ALPHA0))
tmp ^= gt->alphaTo[mod_fieldmax(syndrome[i - j] + lambda[j])];
}
omega[i] = gt->indexOf[tmp];
}
/* Compute error values in poly-form.
num1 = omega(inv(X(l))),
num2 = inv(X(l))**(FIRST_ROOT-1) and
den = lambda_pr(inv(X(l))) all in poly-form. */
for(j=lambda_roots-1; j>=0; j--)
{ int num1 = 0;
int num2;
int den;
int location = loc[j];
for(i=deg_omega; i>=0; i--)
{ if(omega[i] != GF_ALPHA0)
num1 ^= gt->alphaTo[mod_fieldmax(omega[i] + i * root[j])];
}
num2 = gt->alphaTo[mod_fieldmax(root[j] * (LEC_FIRST_ROOT - 1) + GF_FIELDMAX)];
den = 0;
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
for(i=MIN(deg_lambda, NROOTS-1) & ~1; i>=0; i-=2)
{ if(lambda[i+1] != GF_ALPHA0)
den ^= gt->alphaTo[mod_fieldmax(lambda[i+1] + i * root[j])];
}
/* Apply error to data */
if(num1 != 0 && location >= padding)
{
corrected++;
data[location-padding] ^= gt->alphaTo[mod_fieldmax(gt->indexOf[num1] + gt->indexOf[num2]
+ GF_FIELDMAX - gt->indexOf[den])];
/* If no erasures were given, at most one error was corrected.
Return its position in erasure_list[0]. */
if(!erasure_count)
erasure_list[0] = location-padding;
}
#if 1
else return -3;
#endif
}
/*** Form the syndromes: Evaluate data(x) at roots of g(x) */
for(i=0; i<NROOTS; i++)
syndrome[i] = data[0];
for(j=1; j<shortened_size; j++)
for(i=0; i<NROOTS; i++)
{ if(syndrome[i] == 0)
syndrome[i] = data[j];
else syndrome[i] = data[j] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[syndrome[i]]
+ (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)];
}
/*** Convert syndrome to index form, check for nonzero condition. */
#if 1
for(i=0; i<NROOTS; i++)
if(syndrome[i])
return -2;
#endif
return corrected;
}

691
waterbox/ss/cdrom/lec.cpp Normal file
View File

@ -0,0 +1,691 @@
/* cdrdao - write audio CD-Rs in disc-at-once mode
*
* Copyright (C) 1998-2002 Andreas Mueller <andreas@daneb.de>
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <assert.h>
#include <sys/types.h>
#include "lec.h"
#define GF8_PRIM_POLY 0x11d /* x^8 + x^4 + x^3 + x^2 + 1 */
#define EDC_POLY 0x8001801b /* (x^16 + x^15 + x^2 + 1) (x^16 + x^2 + x + 1) */
#define LEC_HEADER_OFFSET 12
#define LEC_DATA_OFFSET 16
#define LEC_MODE1_DATA_LEN 2048
#define LEC_MODE1_EDC_OFFSET 2064
#define LEC_MODE1_INTERMEDIATE_OFFSET 2068
#define LEC_MODE1_P_PARITY_OFFSET 2076
#define LEC_MODE1_Q_PARITY_OFFSET 2248
#define LEC_MODE2_FORM1_DATA_LEN (2048+8)
#define LEC_MODE2_FORM1_EDC_OFFSET 2072
#define LEC_MODE2_FORM2_DATA_LEN (2324+8)
#define LEC_MODE2_FORM2_EDC_OFFSET 2348
typedef u_int8_t gf8_t;
static u_int8_t GF8_LOG[256];
static gf8_t GF8_ILOG[256];
static const class Gf8_Q_Coeffs_Results_01 {
private:
u_int16_t table[43][256];
public:
Gf8_Q_Coeffs_Results_01();
~Gf8_Q_Coeffs_Results_01() {}
const u_int16_t *operator[] (int i) const { return &table[i][0]; }
operator const u_int16_t *() const { return &table[0][0]; }
} CF8_Q_COEFFS_RESULTS_01;
static const class CrcTable {
private:
u_int32_t table[256];
public:
CrcTable();
~CrcTable() {}
u_int32_t operator[](int i) const { return table[i]; }
operator const u_int32_t *() const { return table; }
} CRCTABLE;
static const class ScrambleTable {
private:
u_int8_t table[2340];
public:
ScrambleTable();
~ScrambleTable() {}
u_int8_t operator[](int i) const { return table[i]; }
operator const u_int8_t *() const { return table; }
} SCRAMBLE_TABLE;
/* Creates the logarithm and inverse logarithm table that is required
* for performing multiplication in the GF(8) domain.
*/
static void gf8_create_log_tables()
{
u_int8_t log;
u_int16_t b;
for (b = 0; b <= 255; b++) {
GF8_LOG[b] = 0;
GF8_ILOG[b] = 0;
}
b = 1;
for (log = 0; log < 255; log++) {
GF8_LOG[(u_int8_t)b] = log;
GF8_ILOG[log] = (u_int8_t)b;
b <<= 1;
if ((b & 0x100) != 0)
b ^= GF8_PRIM_POLY;
}
}
/* Addition in the GF(8) domain: just the XOR of the values.
*/
#define gf8_add(a, b) (a) ^ (b)
/* Multiplication in the GF(8) domain: add the logarithms (modulo 255)
* and return the inverse logarithm. Not used!
*/
#if 0
static gf8_t gf8_mult(gf8_t a, gf8_t b)
{
int16_t sum;
if (a == 0 || b == 0)
return 0;
sum = GF8_LOG[a] + GF8_LOG[b];
if (sum >= 255)
sum -= 255;
return GF8_ILOG[sum];
}
#endif
/* Division in the GF(8) domain: Like multiplication but logarithms a
* subtracted.
*/
static gf8_t gf8_div(gf8_t a, gf8_t b)
{
int16_t sum;
assert(b != 0);
if (a == 0)
return 0;
sum = GF8_LOG[a] - GF8_LOG[b];
if (sum < 0)
sum += 255;
return GF8_ILOG[sum];
}
Gf8_Q_Coeffs_Results_01::Gf8_Q_Coeffs_Results_01()
{
int i, j;
u_int16_t c;
gf8_t GF8_COEFFS_HELP[2][45];
u_int8_t GF8_Q_COEFFS[2][45];
gf8_create_log_tables();
/* build matrix H:
* 1 1 ... 1 1
* a^44 a^43 ... a^1 a^0
*
*
*/
for (j = 0; j < 45; j++) {
GF8_COEFFS_HELP[0][j] = 1; /* e0 */
GF8_COEFFS_HELP[1][j] = GF8_ILOG[44-j]; /* e1 */
}
/* resolve equation system for parity byte 0 and 1 */
/* e1' = e1 + e0 */
for (j = 0; j < 45; j++) {
GF8_Q_COEFFS[1][j] = gf8_add(GF8_COEFFS_HELP[1][j],
GF8_COEFFS_HELP[0][j]);
}
/* e1'' = e1' / (a^1 + 1) */
for (j = 0; j < 45; j++) {
GF8_Q_COEFFS[1][j] = gf8_div(GF8_Q_COEFFS[1][j], GF8_Q_COEFFS[1][43]);
}
/* e0' = e0 + e1 / a^1 */
for (j = 0; j < 45; j++) {
GF8_Q_COEFFS[0][j] = gf8_add(GF8_COEFFS_HELP[0][j],
gf8_div(GF8_COEFFS_HELP[1][j],
GF8_ILOG[1]));
}
/* e0'' = e0' / (1 + 1 / a^1) */
for (j = 0; j < 45; j++) {
GF8_Q_COEFFS[0][j] = gf8_div(GF8_Q_COEFFS[0][j], GF8_Q_COEFFS[0][44]);
}
/*
* Compute the products of 0..255 with all of the Q coefficients in
* advance. When building the scalar product between the data vectors
* and the P/Q vectors the individual products can be looked up in
* this table
*
* The P parity coefficients are just a subset of the Q coefficients so
* that we do not need to create a separate table for them.
*/
for (j = 0; j < 43; j++) {
table[j][0] = 0;
for (i = 1; i < 256; i++) {
c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[0][j]];
if (c >= 255) c -= 255;
table[j][i] = GF8_ILOG[c];
c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[1][j]];
if (c >= 255) c -= 255;
table[j][i] |= GF8_ILOG[c]<<8;
}
}
}
/* Reverses the bits in 'd'. 'bits' defines the bit width of 'd'.
*/
static u_int32_t mirror_bits(u_int32_t d, int bits)
{
int i;
u_int32_t r = 0;
for (i = 0; i < bits; i++) {
r <<= 1;
if ((d & 0x1) != 0)
r |= 0x1;
d >>= 1;
}
return r;
}
/* Build the CRC lookup table for EDC_POLY poly. The CRC is 32 bit wide
* and reversed (i.e. the bit stream is divided by the EDC_POLY with the
* LSB first order).
*/
CrcTable::CrcTable ()
{
u_int32_t i, j;
u_int32_t r;
for (i = 0; i < 256; i++) {
r = mirror_bits(i, 8);
r <<= 24;
for (j = 0; j < 8; j++) {
if ((r & 0x80000000) != 0) {
r <<= 1;
r ^= EDC_POLY;
}
else {
r <<= 1;
}
}
r = mirror_bits(r, 32);
table[i] = r;
}
}
/* Calculates the CRC of given data with given lengths based on the
* table lookup algorithm.
*/
static u_int32_t calc_edc(u_int8_t *data, int len)
{
u_int32_t crc = 0;
while (len--) {
crc = CRCTABLE[(int)(crc ^ *data++) & 0xff] ^ (crc >> 8);
}
return crc;
}
/* Build the scramble table as defined in the yellow book. The bytes
12 to 2351 of a sector will be XORed with the data of this table.
*/
ScrambleTable::ScrambleTable()
{
u_int16_t i, j;
u_int16_t reg = 1;
u_int8_t d;
for (i = 0; i < 2340; i++) {
d = 0;
for (j = 0; j < 8; j++) {
d >>= 1;
if ((reg & 0x1) != 0)
d |= 0x80;
if ((reg & 0x1) != ((reg >> 1) & 0x1)) {
reg >>= 1;
reg |= 0x4000; /* 15-bit register */
}
else {
reg >>= 1;
}
}
table[i] = d;
}
}
/* Calc EDC for a MODE 1 sector
*/
static void calc_mode1_edc(u_int8_t *sector)
{
u_int32_t crc = calc_edc(sector, LEC_MODE1_DATA_LEN + 16);
sector[LEC_MODE1_EDC_OFFSET] = crc & 0xffL;
sector[LEC_MODE1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL;
sector[LEC_MODE1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL;
sector[LEC_MODE1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL;
}
/* Calc EDC for a XA form 1 sector
*/
static void calc_mode2_form1_edc(u_int8_t *sector)
{
u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET,
LEC_MODE2_FORM1_DATA_LEN);
sector[LEC_MODE2_FORM1_EDC_OFFSET] = crc & 0xffL;
sector[LEC_MODE2_FORM1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL;
sector[LEC_MODE2_FORM1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL;
sector[LEC_MODE2_FORM1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL;
}
/* Calc EDC for a XA form 2 sector
*/
static void calc_mode2_form2_edc(u_int8_t *sector)
{
u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET,
LEC_MODE2_FORM2_DATA_LEN);
sector[LEC_MODE2_FORM2_EDC_OFFSET] = crc & 0xffL;
sector[LEC_MODE2_FORM2_EDC_OFFSET + 1] = (crc >> 8) & 0xffL;
sector[LEC_MODE2_FORM2_EDC_OFFSET + 2] = (crc >> 16) & 0xffL;
sector[LEC_MODE2_FORM2_EDC_OFFSET + 3] = (crc >> 24) & 0xffL;
}
/* Writes the sync pattern to the given sector.
*/
static void set_sync_pattern(u_int8_t *sector)
{
sector[0] = 0;
sector[1] = sector[2] = sector[3] = sector[4] = sector[5] =
sector[6] = sector[7] = sector[8] = sector[9] = sector[10] = 0xff;
sector[11] = 0;
}
static u_int8_t bin2bcd(u_int8_t b)
{
return (((b/10) << 4) & 0xf0) | ((b%10) & 0x0f);
}
/* Builds the sector header.
*/
static void set_sector_header(u_int8_t mode, u_int32_t adr, u_int8_t *sector)
{
sector[LEC_HEADER_OFFSET] = bin2bcd(adr / (60*75));
sector[LEC_HEADER_OFFSET + 1] = bin2bcd((adr / 75) % 60);
sector[LEC_HEADER_OFFSET + 2] = bin2bcd(adr % 75);
sector[LEC_HEADER_OFFSET + 3] = mode;
}
/* Calculate the P parities for the sector.
* The 43 P vectors of length 24 are combined with the GF8_P_COEFFS.
*/
static void calc_P_parity(u_int8_t *sector)
{
int i, j;
u_int16_t p01_msb, p01_lsb;
u_int8_t *p_lsb_start;
u_int8_t *p_lsb;
u_int8_t *p0, *p1;
u_int8_t d0,d1;
p_lsb_start = sector + LEC_HEADER_OFFSET;
p1 = sector + LEC_MODE1_P_PARITY_OFFSET;
p0 = sector + LEC_MODE1_P_PARITY_OFFSET + 2 * 43;
for (i = 0; i <= 42; i++) {
p_lsb = p_lsb_start;
p01_lsb = p01_msb = 0;
for (j = 19; j <= 42; j++) {
d0 = *p_lsb;
d1 = *(p_lsb+1);
p01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0];
p01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1];
p_lsb += 2 * 43;
}
*p0 = p01_lsb;
*(p0 + 1) = p01_msb;
*p1 = p01_lsb>>8;
*(p1 + 1) = p01_msb>>8;
p0 += 2;
p1 += 2;
p_lsb_start += 2;
}
}
/* Calculate the Q parities for the sector.
* The 26 Q vectors of length 43 are combined with the GF8_Q_COEFFS.
*/
static void calc_Q_parity(u_int8_t *sector)
{
int i, j;
u_int16_t q01_lsb, q01_msb;
u_int8_t *q_lsb_start;
u_int8_t *q_lsb;
u_int8_t *q0, *q1, *q_start;
u_int8_t d0,d1;
q_lsb_start = sector + LEC_HEADER_OFFSET;
q_start = sector + LEC_MODE1_Q_PARITY_OFFSET;
q1 = sector + LEC_MODE1_Q_PARITY_OFFSET;
q0 = sector + LEC_MODE1_Q_PARITY_OFFSET + 2 * 26;
for (i = 0; i <= 25; i++) {
q_lsb = q_lsb_start;
q01_lsb = q01_msb = 0;
for (j = 0; j <= 42; j++) {
d0 = *q_lsb;
d1 = *(q_lsb+1);
q01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0];
q01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1];
q_lsb += 2 * 44;
if (q_lsb >= q_start) {
q_lsb -= 2 * 1118;
}
}
*q0 = q01_lsb;
*(q0 + 1) = q01_msb;
*q1 = q01_lsb>>8;
*(q1 + 1) = q01_msb>>8;
q0 += 2;
q1 += 2;
q_lsb_start += 2 * 43;
}
}
/* Encodes a MODE 0 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide
*/
void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector)
{
u_int16_t i;
set_sync_pattern(sector);
set_sector_header(0, adr, sector);
sector += 16;
for (i = 0; i < 2336; i++)
*sector++ = 0;
}
/* Encodes a MODE 1 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2048 bytes user data at
* offset 16
*/
void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector)
{
set_sync_pattern(sector);
set_sector_header(1, adr, sector);
calc_mode1_edc(sector);
/* clear the intermediate field */
sector[LEC_MODE1_INTERMEDIATE_OFFSET] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 1] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 2] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 3] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 4] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 5] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 6] =
sector[LEC_MODE1_INTERMEDIATE_OFFSET + 7] = 0;
calc_P_parity(sector);
calc_Q_parity(sector);
}
/* Encodes a MODE 2 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2336 bytes user data at
* offset 16
*/
void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector)
{
set_sync_pattern(sector);
set_sector_header(2, adr, sector);
}
/* Encodes a XA form 1 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2048+8 bytes user data at
* offset 16
*/
void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector)
{
set_sync_pattern(sector);
calc_mode2_form1_edc(sector);
/* P/Q partiy must not contain the sector header so clear it */
sector[LEC_HEADER_OFFSET] =
sector[LEC_HEADER_OFFSET + 1] =
sector[LEC_HEADER_OFFSET + 2] =
sector[LEC_HEADER_OFFSET + 3] = 0;
calc_P_parity(sector);
calc_Q_parity(sector);
/* finally add the sector header */
set_sector_header(2, adr, sector);
}
/* Encodes a XA form 2 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2324+8 bytes user data at
* offset 16
*/
void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector)
{
set_sync_pattern(sector);
calc_mode2_form2_edc(sector);
set_sector_header(2, adr, sector);
}
/* Scrambles and byte swaps an encoded sector.
* 'sector' must be 2352 byte wide.
*/
void lec_scramble(u_int8_t *sector)
{
u_int16_t i;
const u_int8_t *stable = SCRAMBLE_TABLE;
u_int8_t *p = sector;
u_int8_t tmp;
for (i = 0; i < 6; i++) {
/* just swap bytes of sector sync */
tmp = *p;
*p = *(p + 1);
p++;
*p++ = tmp;
}
for (;i < (2352 / 2); i++) {
/* scramble and swap bytes */
tmp = *p ^ *stable++;
*p = *(p + 1) ^ *stable++;
p++;
*p++ = tmp;
}
}
#if 0
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char *infile;
char *outfile;
int fd_in, fd_out;
u_int8_t buffer1[2352];
u_int8_t buffer2[2352];
u_int32_t lba;
int i;
#if 0
for (i = 0; i < 2048; i++)
buffer1[i + 16] = 234;
lba = 150;
for (i = 0; i < 100000; i++) {
lec_encode_mode1_sector(lba, buffer1);
lec_scramble(buffer2);
lba++;
}
#else
if (argc != 3)
return 1;
infile = argv[1];
outfile = argv[2];
if ((fd_in = open(infile, O_RDONLY)) < 0) {
perror("Cannot open input file");
return 1;
}
if ((fd_out = open(outfile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
perror("Cannot open output file");
return 1;
}
lba = 150;
do {
if (read(fd_in, buffer1, 2352) != 2352)
break;
switch (*(buffer1 + 12 + 3)) {
case 1:
memcpy(buffer2 + 16, buffer1 + 16, 2048);
lec_encode_mode1_sector(lba, buffer2);
break;
case 2:
if ((*(buffer1 + 12 + 4 + 2) & 0x20) != 0) {
/* form 2 sector */
memcpy(buffer2 + 16, buffer1 + 16, 2324 + 8);
lec_encode_mode2_form2_sector(lba, buffer2);
}
else {
/* form 1 sector */
memcpy(buffer2 + 16, buffer1 + 16, 2048 + 8);
lec_encode_mode2_form1_sector(lba, buffer2);
}
break;
}
if (memcmp(buffer1, buffer2, 2352) != 0) {
printf("Verify error at lba %ld\n", lba);
}
lec_scramble(buffer2);
write(fd_out, buffer2, 2352);
lba++;
} while (1);
close(fd_in);
close(fd_out);
#endif
return 0;
}
#endif

77
waterbox/ss/cdrom/lec.h Normal file
View File

@ -0,0 +1,77 @@
/* cdrdao - write audio CD-Rs in disc-at-once mode
*
* Copyright (C) 1998-2002 Andreas Mueller <mueller@daneb.ping.de>
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __LEC_H__
#define __LEC_H__
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <sys/types.h>
#include <inttypes.h>
typedef uint32_t u_int32_t;
typedef uint16_t u_int16_t;
typedef uint8_t u_int8_t;
#ifndef TRUE
#define TRUE 1
#endif
/* Encodes a MODE 0 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide
*/
void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector);
/* Encodes a MODE 1 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2048 bytes user data at
* offset 16
*/
void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector);
/* Encodes a MODE 2 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2336 bytes user data at
* offset 16
*/
void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector);
/* Encodes a XA form 1 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2048+8 bytes user data at
* offset 16
*/
void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector);
/* Encodes a XA form 2 sector.
* 'adr' is the current physical sector address
* 'sector' must be 2352 byte wide containing 2324+8 bytes user data at
* offset 16
*/
void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector);
/* Scrambles and byte swaps an encoded sector.
* 'sector' must be 2352 byte wide.
*/
void lec_scramble(u_int8_t *sector);
#endif

View File

@ -0,0 +1,210 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2007 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
*
* 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,
* or direct your browser at http://www.gnu.org.
*/
#include "dvdisaster.h"
static GaloisTables *gt = NULL; /* for L-EC Reed-Solomon */
static ReedSolomonTables *rt = NULL;
bool Init_LEC_Correct(void)
{
gt = CreateGaloisTables(0x11d);
rt = CreateReedSolomonTables(gt, 0, 1, 10);
return(1);
}
/***
*** CD level CRC calculation
***/
/*
* Test raw sector against its 32bit CRC.
* Returns TRUE if frame is good.
*/
int CheckEDC(const unsigned char *cd_frame, bool xa_mode)
{
unsigned int expected_crc, real_crc;
unsigned int crc_base = xa_mode ? 2072 : 2064;
expected_crc = cd_frame[crc_base + 0] << 0;
expected_crc |= cd_frame[crc_base + 1] << 8;
expected_crc |= cd_frame[crc_base + 2] << 16;
expected_crc |= cd_frame[crc_base + 3] << 24;
if(xa_mode)
real_crc = EDCCrc32(cd_frame+16, 2056);
else
real_crc = EDCCrc32(cd_frame, 2064);
if(expected_crc == real_crc)
return(1);
else
{
//printf("Bad EDC CRC: Calculated: %08x, Recorded: %08x\n", real_crc, expected_crc);
return(0);
}
}
/***
*** A very simple L-EC error correction.
***
* Perform just one pass over the Q and P vectors to see if everything
* is okay respectively correct minor errors. This is pretty much the
* same stuff the drive is supposed to do in the final L-EC stage.
*/
static int simple_lec(unsigned char *frame)
{
unsigned char byte_state[2352];
unsigned char p_vector[P_VECTOR_SIZE];
unsigned char q_vector[Q_VECTOR_SIZE];
unsigned char p_state[P_VECTOR_SIZE];
int erasures[Q_VECTOR_SIZE], erasure_count;
int ignore[2];
int p_failures, q_failures;
int p_corrected, q_corrected;
int p,q;
/* Setup */
memset(byte_state, 0, 2352);
p_failures = q_failures = 0;
p_corrected = q_corrected = 0;
/* Perform Q-Parity error correction */
for(q=0; q<N_Q_VECTORS; q++)
{ int err;
/* We have no erasure information for Q vectors */
GetQVector(frame, q_vector, q);
err = DecodePQ(rt, q_vector, Q_PADDING, ignore, 0);
/* See what we've got */
if(err < 0) /* Uncorrectable. Mark bytes are erasure. */
{ q_failures++;
FillQVector(byte_state, 1, q);
}
else /* Correctable */
{ if(err == 1 || err == 2) /* Store back corrected vector */
{ SetQVector(frame, q_vector, q);
q_corrected++;
}
}
}
/* Perform P-Parity error correction */
for(p=0; p<N_P_VECTORS; p++)
{ int err,i;
/* Try error correction without erasure information */
GetPVector(frame, p_vector, p);
err = DecodePQ(rt, p_vector, P_PADDING, ignore, 0);
/* If unsuccessful, try again using erasures.
Erasure information is uncertain, so try this last. */
if(err < 0 || err > 2)
{ GetPVector(byte_state, p_state, p);
erasure_count = 0;
for(i=0; i<P_VECTOR_SIZE; i++)
if(p_state[i])
erasures[erasure_count++] = i;
if(erasure_count > 0 && erasure_count <= 2)
{ GetPVector(frame, p_vector, p);
err = DecodePQ(rt, p_vector, P_PADDING, erasures, erasure_count);
}
}
/* See what we've got */
if(err < 0) /* Uncorrectable. */
{ p_failures++;
}
else /* Correctable. */
{ if(err == 1 || err == 2) /* Store back corrected vector */
{ SetPVector(frame, p_vector, p);
p_corrected++;
}
}
}
/* Sum up */
if(q_failures || p_failures || q_corrected || p_corrected)
{
return 1;
}
return 0;
}
/***
*** Validate CD raw sector
***/
int ValidateRawSector(unsigned char *frame, bool xaMode)
{
int lec_did_sth = FALSE;
/* Do simple L-EC.
It seems that drives stop their internal L-EC as soon as the
EDC is okay, so we may see uncorrected errors in the parity bytes.
Since we are also interested in the user data only and doing the
L-EC is expensive, we skip our L-EC as well when the EDC is fine. */
if(!CheckEDC(frame, xaMode))
{
unsigned char header[4];
if(xaMode)
{
memcpy(header, frame + 12, 4);
memset(frame + 12, 0, 4);
}
lec_did_sth = simple_lec(frame);
if(xaMode)
memcpy(frame + 12, header, 4);
}
/* Test internal sector checksum again */
if(!CheckEDC(frame, xaMode))
{
/* EDC failure in RAW sector */
return FALSE;
}
return TRUE;
}

161
waterbox/ss/db.cpp Normal file
View File

@ -0,0 +1,161 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* db.cpp:
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "smpc.h"
#include "cart.h"
#include "db.h"
namespace MDFN_IEN_SS
{
bool DB_LookupRegionDB(const uint8* fd_id, unsigned* const region)
{
static const struct
{
uint8 id[16];
unsigned area;
} regiondb[] =
{
{ { 0x10, 0x8f, 0xe1, 0xaf, 0x55, 0x5a, 0x95, 0x42, 0x04, 0x85, 0x7e, 0x98, 0x8c, 0x53, 0x6a, 0x31, }, SMPC_AREA_EU_PAL }, // Preview Sega Saturn Vol. 1 (Europe)
{ { 0xed, 0x4c, 0x0b, 0x87, 0x35, 0x37, 0x86, 0x76, 0xa0, 0xf6, 0x32, 0xc6, 0xa4, 0xc3, 0x99, 0x88, }, SMPC_AREA_EU_PAL }, // Primal Rage (Europe) (En,Fr,De,Es,It,Pt)
{ { 0x15, 0xfc, 0x3a, 0x82, 0x16, 0xa9, 0x85, 0xa5, 0xa8, 0xad, 0x30, 0xaf, 0x9a, 0xff, 0x03, 0xa9, }, SMPC_AREA_JP }, // Race Drivin' (Japan) (2M)
{ { 0xe1, 0xdd, 0xfd, 0xa1, 0x8b, 0x47, 0x02, 0x21, 0x36, 0x1e, 0x5a, 0xae, 0x20, 0xc0, 0x59, 0x9f, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 1)
{ { 0xbf, 0x5f, 0xf8, 0x5f, 0xf2, 0x0c, 0x35, 0xf6, 0xc9, 0x8d, 0x03, 0xbc, 0x34, 0xd9, 0xda, 0x7f, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 2)
{ { 0x98, 0xb6, 0x6e, 0x09, 0xe6, 0xdc, 0x30, 0xe6, 0x55, 0xdb, 0x85, 0x01, 0x33, 0x0c, 0x0b, 0x9c, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 3)
{ { 0xa2, 0x34, 0xb0, 0xb9, 0xaa, 0x47, 0x74, 0x1f, 0xd4, 0x1e, 0x35, 0xda, 0x3d, 0xe7, 0x4d, 0xe3, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 4)
{ { 0xf7, 0xe9, 0x23, 0x0a, 0x9e, 0x92, 0xf1, 0x93, 0x16, 0x43, 0xf8, 0x6c, 0xe8, 0x21, 0x50, 0x66, }, SMPC_AREA_JP }, // Sega International Victory Goal (Japan) (5M)
{ { 0x64, 0x75, 0x25, 0x0c, 0xa1, 0x9b, 0x6c, 0x5e, 0x4e, 0xa0, 0x6d, 0x69, 0xd9, 0x0f, 0x32, 0xca, }, SMPC_AREA_EU_PAL }, // Virtua Racing (Europe)
{ { 0x0d, 0xe3, 0xfa, 0xfb, 0x2b, 0xb9, 0x6d, 0x79, 0xe0, 0x3a, 0xb7, 0x6d, 0xcc, 0xbf, 0xb0, 0x2c, }, SMPC_AREA_JP }, // Virtua Racing (Japan)
{ { 0x6b, 0x29, 0x33, 0xfc, 0xdd, 0xad, 0x8e, 0x0d, 0x95, 0x81, 0xa6, 0xee, 0xfd, 0x90, 0x4b, 0x43, }, SMPC_AREA_EU_PAL }, // Winter Heat (Europe) (Demo)
{ { 0x73, 0x91, 0x4b, 0xe1, 0xad, 0x4d, 0xaf, 0x69, 0xc3, 0xeb, 0xb8, 0x43, 0xee, 0x3e, 0xb5, 0x09, }, SMPC_AREA_EU_PAL }, // WWF WrestleMania - The Arcade Game (Europe) (Demo)
};
for(auto& re : regiondb)
{
if(!memcmp(re.id, fd_id, 16))
{
*region = re.area;
return true;
}
}
return false;
}
bool DB_LookupCartDB(const char* sgid, const uint8* fd_id, int* const cart_type)
{
// printf(" { \"%s\", CART_EXTRAM_1M },\n", sgid);
// printf(" { \"%s\", CART_EXTRAM_4M },\n", sgid);
// printf(" { \"%s\", CART_NONE },\n", sgid);
static const struct
{
const char* sgid;
int cart_type;
uint8 fd_id[16];
} cartdb[] =
{
#if 0
{ "T-19708G", CART_NONE }, // Pia Carrot e Youkoso
{ "T-32901G", CART_NONE }, // Silhouette Mirage
{ "MK-81086", CART_NONE }, // Tomb Raider (Europe)
{ "T-7910H", CART_NONE }, // Tomb Raider (USA)
{ "T-6010G", CART_NONE }, // Tomb Raiders
#endif
//
//
//
// NetLink Modem TODO:
{ "MK-81218", CART_NONE }, // Daytona USA CCE Net Link Edition
{ "MK-81071", CART_NONE }, // Duke Nukem 3D
{ "T-319-01H", CART_NONE }, // PlanetWeb Browser (multiple versions)
{ "MK-81070", CART_NONE }, // Saturn Bomberman
{ "MK-81215", CART_NONE }, // Sega Rally Championship Plus NetLink Edition
{ "MK-81072", CART_NONE }, // Virtual On NetLink Edition
//
//
// Japanese modem TODO:
{ "GS-7106", CART_NONE }, // Dennou Senki Virtual On (SegaNet)
{ "GS-7105", CART_NONE }, // Habitat II
{ "GS-7101", CART_NONE }, // Pad Nifty
{ "GS-7113", CART_NONE }, // Puzzle Bobble 3 (SegaNet)
{ "T-14305G", CART_NONE }, // Saturn Bomberman (SegaNet)
{ "T-31301G", CART_NONE }, // SegaSaturn Internet Vol. 1
//
//
//
{ "MK-81088", CART_KOF95 }, // The King of Fighters '95 (Europe)
{ "T-3101G", CART_KOF95 }, // The King of Fighters '95
{ "T-13308G", CART_ULTRAMAN },// Ultraman: Hikari no Kyojin Densetsu
//
//
//
{ "T-1521G", CART_EXTRAM_1M }, // Astra Superstars
{ "T-9904G", CART_EXTRAM_1M }, // Cotton 2
{ "T-1217G", CART_EXTRAM_1M }, // Cyberbots
{ "GS-9107", CART_EXTRAM_1M }, // Fighter's History Dynamite
{ "T-20109G", CART_EXTRAM_1M }, // Friends
{ "T-14411G", CART_EXTRAM_1M }, // Groove on Fight
{ "T-7032H-50", CART_EXTRAM_1M }, // Marvel Super Heroes (Europe)
{ "T-1215G", CART_EXTRAM_1M }, // Marvel Super Heroes (Japan)
{ "T-3111G", CART_EXTRAM_1M }, // Metal Slug
{ "T-22205G", CART_EXTRAM_1M }, // Noel 3
{ "T-22206G", CART_EXTRAM_1M }, // Noel 3 (TODO: Test)
{ "T-20114G", CART_EXTRAM_1M }, // Pia Carrot e Youkoso!! 2 (TODO: Test)
{ "T-20121M", CART_EXTRAM_1M }, // Pia Carrot e Youkoso!! 2 (TODO: Test)
{ "T-3105G", CART_EXTRAM_1M }, // Real Bout Garou Densetsu
{ "T-3119G", CART_EXTRAM_1M }, // Real Bout Garou Densetsu Special
{ "T-3116G", CART_EXTRAM_1M }, // Samurai Spirits - Amakusa Kourin
{ "T-3104G", CART_EXTRAM_1M }, // Samurai Spirits - Zankurou Musouken
{ "T-16509G", CART_EXTRAM_1M }, // Super Real Mahjong P7 (TODO: Test)
{ "T-16510G", CART_EXTRAM_1M }, // Super Real Mahjong P7 (TODO: Test)
{ "T-3108G", CART_EXTRAM_1M }, // The King of Fighters '96
{ "T-3121G", CART_EXTRAM_1M }, // The King of Fighters '97
{ "T-1515G", CART_EXTRAM_1M }, // Waku Waku 7
//
//
//
{ "T-1245G", CART_EXTRAM_4M }, // D&D Collection
{ "T-1248G", CART_EXTRAM_4M }, // Final Fight Revenge
{ "T-1238G", CART_EXTRAM_4M }, // Marvel Super Heroes vs. Street Fighter
{ "T-1230G", CART_EXTRAM_4M }, // Pocket Fighter
{ "T-1246G", CART_EXTRAM_4M }, // Street Fighter Zero 3
{ "T-1229G", CART_EXTRAM_4M }, // Vampire Savior
{ "T-1226G", CART_EXTRAM_4M }, // X-Men vs. Street Fighter
//
//
//
{ nullptr, CART_CS1RAM_16M, { 0x4a, 0xf9, 0xff, 0x30, 0xea, 0x54, 0xfe, 0x3a, 0x79, 0xa7, 0x68, 0x69, 0xae, 0xde, 0x55, 0xbb } }, // Heart of Darkness (Prototype)
};
for(auto& ca : cartdb)
{
if((ca.sgid && !strcmp(ca.sgid, sgid)) || (!ca.sgid && !memcmp(ca.fd_id, fd_id, 16)))
{
*cart_type = ca.cart_type;
return true;
}
}
return false;
}
}

15
waterbox/ss/db.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef __MDFN_SS_DB_H
#define __MDFN_SS_DB_H
namespace MDFN_IEN_SS
{
bool DB_LookupRegionDB(const uint8* fd_id, unsigned* const region);
bool DB_LookupCartDB(const char* sgid, const uint8* fd_id, int* const cart_type);
}
#endif

820
waterbox/ss/debug.inc Normal file
View File

@ -0,0 +1,820 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* debug.inc:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifdef WANT_DEBUGGER
static struct DBGS
{
enum { NUMBT = 24 };
struct
{
uint32 from;
uint32 to;
uint32 branch_count;
int exception; // -1 on no exception.
unsigned vecnum;
bool valid;
} BTEntries[2][NUMBT];
bool BTEnabled;
unsigned BTIndex[2];
struct SS_BPOINT
{
uint32 A[2];
};
std::vector<SS_BPOINT> BreakPointsRead, BreakPointsWrite, BreakPointsPC;
void (*CPUHook)(uint32, bool);
bool CPUHookContinuous;
bool FoundBPoint;
uint32 CurPC[2];
unsigned ActiveCPU;
} DBG;
static void DBG_Break(void)
{
DBG.FoundBPoint = true;
}
static void DBG_CheckReadBP(unsigned len, uint32 addr)
{
for(auto const& bp : DBG.BreakPointsRead)
{
for(uint32 ta = addr; ta != (addr + len); ta++) // TODO: Optimize
{
if(ta >= bp.A[0] && ta <= bp.A[1])
{
DBG.FoundBPoint = true;
return;
}
}
}
}
static void DBG_CheckWriteBP(unsigned len, uint32 addr)
{
for(auto const& bp : DBG.BreakPointsWrite)
{
for(uint32 ta = addr; ta != (addr + len); ta++) // TODO: Optimize
{
if(ta >= bp.A[0] && ta <= bp.A[1])
{
DBG.FoundBPoint = true;
return;
}
}
}
}
static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer)
{
if(!strcmp(name, "physical"))
{
while(Length--)
{
//Address &= 0xFFFFFFFF;
//*Buffer = CPU->PeekMem8(Address);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "workraml"))
{
while(Length--)
{
Address &= 0xFFFFF;
*Buffer = ne16_rbo_be<uint8>(WorkRAML, Address);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "workramh"))
{
while(Length--)
{
Address &= 0xFFFFF;
*Buffer = ne16_rbo_be<uint8>(WorkRAMH, Address);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "scspram"))
{
while(Length--)
{
Address &= 0x7FFFF;
*Buffer = SOUND_PeekRAM(Address);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "dspprog"))
{
while(Length--)
{
Address &= 0x3FF;
*Buffer = SCU_DSP_PeekProgRAM(Address >> 2) >> (((Address & 0x3) ^ 0x3) << 3);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "vdp1vram"))
{
while(Length--)
{
Address &= 0x7FFFF;
*Buffer = VDP1::PeekVRAM(Address);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "vdp2vram"))
{
while(Length--)
{
Address &= 0x7FFFF;
*Buffer = VDP2::PeekVRAM(Address);
Address++;
Buffer++;
}
}
}
static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer)
{
if(!strcmp(name, "physical"))
{
while(Length--)
{
//Address &= 0xFFFFFFFF;
//CPU->PokeMem8(Address, *Buffer);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "workramh"))
{
while(Length--)
{
Address &= 0xFFFFF;
ne16_wbo_be<uint8>(WorkRAMH, Address, *Buffer);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "scspram"))
{
while(Length--)
{
Address &= 0x7FFFF;
SOUND_PokeRAM(Address, *Buffer);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "vdp1vram"))
{
while(Length--)
{
Address &= 0x7FFFF;
VDP1::PokeVRAM(Address, *Buffer);
Address++;
Buffer++;
}
}
else if(!strcmp(name, "vdp2vram"))
{
while(Length--)
{
Address &= 0x7FFFF;
VDP2::PokeVRAM(Address, *Buffer);
Address++;
Buffer++;
}
}
}
static uint32 DBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical)
{
/*
uint32 ret = 0;
for(unsigned int i = 0; i < bsize; i++)
ret |= CPU->PeekMem8(A + i) << (i * 8);
return(ret);
*/
return 0xAA;
}
static MDFN_COLD void DBG_FlushBreakPoints(int type)
{
if(type == BPOINT_READ)
DBG.BreakPointsRead.clear();
else if(type == BPOINT_WRITE)
DBG.BreakPointsWrite.clear();
else if(type == BPOINT_PC)
DBG.BreakPointsPC.clear();
}
static MDFN_COLD void DBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical)
{
DBGS::SS_BPOINT tmp;
tmp.A[0] = A1;
tmp.A[1] = A2;
if(type == BPOINT_READ)
DBG.BreakPointsRead.push_back(tmp);
else if(type == BPOINT_WRITE)
DBG.BreakPointsWrite.push_back(tmp);
else if(type == BPOINT_PC)
DBG.BreakPointsPC.push_back(tmp);
}
static void DBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous)
{
DBG.CPUHook = callb;
DBG.CPUHookContinuous = continuous;
}
static void DBG_EnableBranchTrace(bool enable)
{
if((DBG.BTEnabled ^ enable) & DBG.BTEnabled)
{
for(unsigned which = 0; which < 2; which++)
for(unsigned i = 0; i < DBGS::NUMBT; i++)
DBG.BTEntries[which][i].valid = false;
}
DBG.BTEnabled = enable;
}
static void DBG_AddBranchTrace(unsigned which, uint32 to, int exception, unsigned vecnum = 0)
{
const uint32 from = DBG.CurPC[which];
auto *prevbt = &DBG.BTEntries[which][(DBG.BTIndex[which] + DBGS::NUMBT - 1) % DBGS::NUMBT];
//if(BTEntries[(BTIndex - 1) & 0xF] == PC) return;
if(prevbt->from == from && prevbt->to == to && prevbt->exception == exception && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid)
prevbt->branch_count++;
else
{
auto& bte = DBG.BTEntries[which][DBG.BTIndex[which]];
bte.from = from;
bte.to = to;
bte.exception = exception;
bte.vecnum = vecnum;
bte.branch_count = 1;
bte.valid = true;
DBG.BTIndex[which] = (DBG.BTIndex[which] + 1) % DBGS::NUMBT;
}
}
static std::vector<BranchTraceResult> DBG_GetBranchTrace(void)
{
std::vector<BranchTraceResult> ret;
BranchTraceResult tmp;
for(unsigned x = 0; x < DBGS::NUMBT; x++)
{
char estr[32];
const auto* bt = &DBG.BTEntries[DBG.ActiveCPU][(x + DBG.BTIndex[DBG.ActiveCPU]) % DBGS::NUMBT];
if(!bt->valid)
continue;
tmp.count = bt->branch_count;
trio_snprintf(tmp.from, sizeof(tmp.from), "%08x", bt->from);
trio_snprintf(tmp.to, sizeof(tmp.to), "%08x", bt->to);
trio_snprintf(estr, sizeof(estr), "UNK");
switch(bt->exception)
{
case -1:
estr[0] = 0;
break;
case SH7095::EXCEPTION_POWERON:
trio_snprintf(estr, sizeof(estr), "PRST");
break;
case SH7095::EXCEPTION_RESET:
trio_snprintf(estr, sizeof(estr), "MRST");
break;
case SH7095::EXCEPTION_ILLINSTR:
trio_snprintf(estr, sizeof(estr), "ILL");
break;
case SH7095::EXCEPTION_ILLSLOT:
trio_snprintf(estr, sizeof(estr), "ILLS");
break;
case SH7095::EXCEPTION_CPUADDR:
trio_snprintf(estr, sizeof(estr), "CPUA");
break;
case SH7095::EXCEPTION_DMAADDR:
trio_snprintf(estr, sizeof(estr), "DMAA");
break;
case SH7095::EXCEPTION_NMI:
trio_snprintf(estr, sizeof(estr), "NMI");
break;
case SH7095::EXCEPTION_BREAK:
trio_snprintf(estr, sizeof(estr), "BRK");
break;
case SH7095::EXCEPTION_TRAP:
trio_snprintf(estr, sizeof(estr), "TRAP%02X", bt->vecnum);
break;
case SH7095::EXCEPTION_INT:
trio_snprintf(estr, sizeof(estr), "INT%02X", bt->vecnum);
break;
}
trio_snprintf(tmp.code, sizeof(tmp.code), "%s", estr);
ret.push_back(tmp);
}
return(ret);
}
template<unsigned which>
static void DBG_CPUHandler(const sscpu_timestamp_t timestamp)
{
const uint32 PC = CPU[which].GetRegister(SH7095::GSREG_PC_ID, NULL, 0);
if(which != DBG.ActiveCPU)
{
DBG.CurPC[which] = PC;
return;
}
#if 0
if(LogFunc)
{
static const uint32 addr_mask[8] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
uint32 tpc = PC & addr_mask[PC >> 29];;
if(MDFN_UNLIKELY(tpc <= 0xC0))
{
if(tpc == 0xA0 || tpc == 0xB0 || tpc == 0xC0)
{
const uint32 function = CPU->GetRegister(PS_CPU::GSREG_GPR + 9, NULL, 0);
if(tpc != 0xB0 || function != 0x17)
{
char tmp[64];
trio_snprintf(tmp, sizeof(tmp), "0x%02x:0x%02x", PC & 0xFF, function);
LogFunc("BIOS", tmp);
}
}
}
}
#endif
for(auto& bp : DBG.BreakPointsPC)
{
if(PC >= bp.A[0] && PC <= bp.A[1])
{
DBG.FoundBPoint = true;
break;
}
}
CPU[which].CheckRWBreakpoints(DBG_CheckReadBP, DBG_CheckWriteBP);
//CPU->CheckBreakpoints(CheckCPUBPCallB, CPU->PeekMem32(PC));
DBG.CPUHookContinuous |= DBG.FoundBPoint;
if(DBG.CPUHookContinuous && DBG.CPUHook)
{
ForceEventUpdates(timestamp);
DBG.CPUHook(PC, DBG.FoundBPoint);
}
DBG.FoundBPoint = false;
//
//
// No, no, this isn't right for dual-CPUs(FIXME):
DBG.CurPC[which] = CPU[which].GetRegister(SH7095::GSREG_PC_ID, NULL, 0);
}
static bool DBG_NeedCPUHooks(void)
{
return DBG.BTEnabled || DBG.CPUHook || DBG.BreakPointsPC.size() || DBG.BreakPointsRead.size() || DBG.BreakPointsWrite.size();
}
// TODO: Standard peek functions
static INLINE uint16 DBG_DisPeek16(uint32 A)
{
return *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A);
}
static INLINE uint32 DBG_DisPeek32(uint32 A)
{
uint32 ret;
ret = *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A) << 16;
A |= 2;
ret |= *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A) << 0;
return ret;
}
static void DBG_Disassemble(uint32 &A, uint32 SpecialA, char *TextBuf)
{
if(A & 0x1)
{
strncpy(TextBuf, "UNALIGNED", 256);
A &= ~0x1;
}
else
{
uint16 instr;
if(A == CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PC_ID, NULL, 0))
instr = CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PID, NULL, 0);
else if(A == CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PC_IF, NULL, 0))
instr = CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PIF, NULL, 0);
else
instr = DBG_DisPeek16(A);
SH7095::Disassemble(instr, A + 4, TextBuf, DBG_DisPeek16, DBG_DisPeek32);
}
char* tlc = TextBuf;
while((uint8)*tlc != 0)
{
*tlc = tolower(*tlc);
tlc++;
}
A += 2;
}
static MDFN_COLD void DBG_ToggleSyntax(void)
{
// Right, "syntax". ;)
DBG.ActiveCPU = !DBG.ActiveCPU;
}
//
//
//
static const RegType DBG_Regs_CPU[] =
{
{ SH7095::GSREG_PC_ID, "PC", "PC (Effective)", 4 },
{ SH7095::GSREG_RPC, "RPC", "PC (Real)", 4 },
{ SH7095::GSREG_PID, "PID", "Pipeline ID Buffer", 4 },
{ SH7095::GSREG_PIF, "PIF", "Pipeline IF Buffer", 4 },
{ SH7095::GSREG_EP, "EP", "Exception Pending", 4 },
{ SH7095::GSREG_R0, "R0", "R0", 4 },
{ SH7095::GSREG_R1, "R1", "R1", 4 },
{ SH7095::GSREG_R2, "R2", "R2", 4 },
{ SH7095::GSREG_R3, "R3", "R3", 4 },
{ SH7095::GSREG_R4, "R4", "R4", 4 },
{ SH7095::GSREG_R5, "R5", "R5", 4 },
{ SH7095::GSREG_R6, "R6", "R6", 4 },
{ SH7095::GSREG_R7, "R7", "R7", 4 },
{ SH7095::GSREG_R8, "R8", "R8", 4 },
{ SH7095::GSREG_R9, "R9", "R9", 4 },
{ SH7095::GSREG_R10, "R10", "R10", 4 },
{ SH7095::GSREG_R11, "R11", "R11", 4 },
{ SH7095::GSREG_R12, "R12", "R12", 4 },
{ SH7095::GSREG_R13, "R13", "R13", 4 },
{ SH7095::GSREG_R14, "R14", "R14", 4 },
{ SH7095::GSREG_R15, "R15", "R15/Stack Pointer", 4 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_SR, "SR", "Status Register", 4 },
{ SH7095::GSREG_GBR, "GBR", "Global Base Register", 4 },
{ SH7095::GSREG_VBR, "VBR", "Vector Base Register", 4 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_MACH, "MACH", "Multiply-and-Accumulate High", 4 },
{ SH7095::GSREG_MACL, "MACL", "Multiply-and-Accumulate Low", 4 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_PR, "PR", "Procedure Register", 4 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_NMIL, "NMIL", "NMI Level(Input)", 1 },
{ SH7095::GSREG_IRL, "IRL", "Interrupt Level(Input)", 1 },
{ SH7095::GSREG_IPRA, "IPRA", "IPRA", 2 },
{ SH7095::GSREG_IPRB, "IPRB", "IPRB", 2 },
{ SH7095::GSREG_VCRWDT, "VCRWDT", "VCRWDT", 2 },
{ SH7095::GSREG_VCRA, "VCRA", "VCRA", 2 },
{ SH7095::GSREG_VCRB, "VCRB", "VCRB", 2 },
{ SH7095::GSREG_VCRC, "VCRC", "VCRC", 2 },
{ SH7095::GSREG_VCRD, "VCRD", "VCRD", 2 },
{ SH7095::GSREG_ICR, "ICR", "ICR", 2 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_DVSR, "DVSR", "Divisor", 4 },
{ SH7095::GSREG_DVDNT, "DVDNT", "DVDNT", 4 },
{ SH7095::GSREG_DVDNTH, "DVDNTH", "DVDNTH", 4 },
{ SH7095::GSREG_DVDNTL, "DVDNTL", "DVDNTL", 4 },
{ SH7095::GSREG_DVDNTHS, "DVDNTHS", "DVDNTH Shadow", 4 },
{ SH7095::GSREG_DVDNTLS, "DVDNTLS", "DVDNTL Shadow", 4 },
{ SH7095::GSREG_VCRDIV, "VCRDIV", "VCRDIV", 2 },
{ SH7095::GSREG_DVCR, "DVCR", "DVCR", 1 },
{ 0, "------", "", 0xFFFF },
{ SH7095::GSREG_WTCSR, "WTCSR", "WTCSR", 1 },
{ SH7095::GSREG_WTCSRM, "WTCSRM", "WTCSRM", 1 },
{ SH7095::GSREG_WTCNT, "WTCNT", "WTCNT", 1 },
{ SH7095::GSREG_RSTCSR, "RSTCSR", "RSTCSR", 1 },
{ SH7095::GSREG_RSTCSRM, "RSTCSRM", "RSTCSRM", 1 },
{ 0, "", "", 0 },
};
static const RegType DBG_Regs_CPUE[] =
{
{ SH7095::GSREG_DMAOR, "DMAOR", "DMAOR", 1 },
{ SH7095::GSREG_DMAORM, "DMAORM", "DMAORM", 1 },
{ 0, "--DMACH0:--", "", 0xFFFF },
{ SH7095::GSREG_DMA0_SAR, "SAR", "SAR", 4 },
{ SH7095::GSREG_DMA0_DAR, "DAR", "DAR", 4 },
{ SH7095::GSREG_DMA0_TCR, "TCR", "TCR", 4 },
{ SH7095::GSREG_DMA0_CHCR, "CHCR", "CHCR", 2 },
{ SH7095::GSREG_DMA0_CHCRM, "CHCRM", "CHCRM", 2 },
{ SH7095::GSREG_DMA0_VCR, "VCR", "VCR", 1 },
{ SH7095::GSREG_DMA0_DRCR, "DRCR", "DRCR", 1 },
{ 0, "--DMACH1:--", "", 0xFFFF },
{ SH7095::GSREG_DMA1_SAR, "SAR", "SAR", 4 },
{ SH7095::GSREG_DMA1_DAR, "DAR", "DAR", 4 },
{ SH7095::GSREG_DMA1_TCR, "TCR", "TCR", 4 },
{ SH7095::GSREG_DMA1_CHCR, "CHCR", "CHCR", 2 },
{ SH7095::GSREG_DMA1_CHCRM, "CHCRM", "CHCRM", 2 },
{ SH7095::GSREG_DMA1_VCR, "VCR", "VCR", 1 },
{ SH7095::GSREG_DMA1_DRCR, "DRCR", "DRCR", 1 },
{ 0, "-----------", "", 0xFFFF },
{ SH7095::GSREG_FRC, "FRC", "FRC", 2 },
{ SH7095::GSREG_OCR0, "OCRA", "OCRA", 2 },
{ SH7095::GSREG_OCR1, "OCRB", "OCRB", 2 },
{ SH7095::GSREG_FICR, "FICR", "FICR", 2 },
{ SH7095::GSREG_TIER, "TIER", "TIER", 1 },
{ SH7095::GSREG_FTCSR, "FTCSR", "FTCSR", 1 },
{ SH7095::GSREG_FTCSRM, "FTCSRM", "FTCSRM", 1 },
{ SH7095::GSREG_TCR, "TCR", "TCR", 1 },
{ SH7095::GSREG_TOCR, "TOCR", "TOCR", 1 },
{ SH7095::GSREG_RWT, "RWT", "R/W Temp", 1 },
{ 0, "", "", 0 },
};
static uint32 DBG_GetRegister_CPU(const unsigned int id, char* special, const uint32 special_len)
{
return CPU[DBG.ActiveCPU].GetRegister(id, special, special_len);
}
static MDFN_COLD void DBG_SetRegister_CPU(const unsigned int id, uint32 value)
{
CPU[DBG.ActiveCPU].SetRegister(id, value);
}
static const RegGroupType DBG_RegGroup_CPU =
{
NULL,
DBG_Regs_CPU,
DBG_GetRegister_CPU,
DBG_SetRegister_CPU
};
static const RegGroupType DBG_RegGroup_CPUE =
{
NULL,
DBG_Regs_CPUE,
DBG_GetRegister_CPU,
DBG_SetRegister_CPU
};
static const RegType DBG_Regs_SCU[] =
{
{ SCU_GSREG_ILEVEL, "ILevel", "IRL Output to SH2-M", 1 },
{ SCU_GSREG_IVEC, "IVec", "Pending IRQ Vector Number", 1 },
{ 0, "------", "", 0xFFFF },
{ SCU_GSREG_IASSERTED, "IAss", "Status of Input IRQ Lines", 4 },
{ SCU_GSREG_IPENDING, "IPend", "Pending IRQs", 4 },
{ SCU_GSREG_IMASK, "IMask", "IRQ Mask", 2 },
{ 0, "------", "", 0xFFFF },
{ SCU_GSREG_TENBL, "TENBL", "Timers Enable", 0x100 | 1 },
{ SCU_GSREG_T0CNT, "T0CNT", "Timer0 Counter", 0x100 | 10 },
{ SCU_GSREG_T0CMP, "T0CMP", "Timer0 Compare Value", 0x100 | 10 },
{ SCU_GSREG_T0MET, "T0MET", "Timer0 Met", 0x100 | 1 },
{ SCU_GSREG_T1RLV, "T1RLV", "Timer1 Reload Value", 0x100 | 9 },
{ SCU_GSREG_T1CNT, "T1CNT", "Timer1 Counter", 0x100 | 9 },
{ SCU_GSREG_T1MOD, "T1MOD", "Timer1 Mode", 0x100 | 1 },
{ SCU_GSREG_T1MET, "T1MET", "Timer1 Met", 0x100 | 1 },
{ 0, "--DSP:--", "", 0xFFFF },
{ SCU_GSREG_DSP_EXEC, "EXEC", "Executing", 0x100 | 1 },
{ SCU_GSREG_DSP_PAUSE, "PAUSE", "Paused", 0x100 | 1 },
{ SCU_GSREG_DSP_PC, "PC", "Program Counter", 1 },
{ SCU_GSREG_DSP_END, "END", "End Flag", 0x100 | 1 },
{ 0, "", "", 0 },
};
static const RegGroupType DBG_RegGroup_SCU =
{
NULL,
DBG_Regs_SCU,
SCU_GetRegister,
SCU_SetRegister
};
//
//
static const RegType DBG_Regs_VDP1_VDP2_SCSP[] =
{
{ 0, "------", "", 0xFFFF },
{ (1 << 16) | VDP2::GSREG_LINE, "Line", "Line", 2 },
{ (1 << 16) | VDP2::GSREG_DON, "DON", "Display On", 0x100 | 1 },
{ (1 << 16) | VDP2::GSREG_BM, "BM", "Border Mode", 0x100 | 1 },
{ (1 << 16) | VDP2::GSREG_IM, "IM", "Interlace Mode", 0x100 | 2 },
{ (1 << 16) | VDP2::GSREG_VRES, "VRES", "Vertical Resolution", 0x100 | 2 },
{ (1 << 16) | VDP2::GSREG_HRES, "HRES", "Horizontal Resolution", 0x100 | 3 },
{ 0, "------", "", 0xFFFF },
{ (2 << 16) | SS_SCSP::GSREG_MVOL, "MVOL", "Master Volume", 0x100 | 4 },
{ (2 << 16) | SS_SCSP::GSREG_DAC18B, "DAC18B", "18-bit DAC Enable", 0x100 | 1 },
{ (2 << 16) | SS_SCSP::GSREG_MEM4MB, "Mem4Mb", "4Mb Memory Enable", 0x100 | 1 },
{ (2 << 16) | SS_SCSP::GSREG_RBP, "RBP", "DSP Ringbuffer Base Address", 0x100 | 7 },
{ (2 << 16) | SS_SCSP::GSREG_RBL, "RBL", "DSP Ringbuffer Length", 0x100 | 2 },
{ (2 << 16) | SS_SCSP::GSREG_MSLC, "MSLC", "Slot to Monitor", 0x100 | 5 },
{ 0, "", "", 0 },
};
static uint32 VDP1_VDP2_SCSP_GetRegister(const unsigned id, char* const special, const uint32 special_len)
{
switch(id >> 16)
{
case 0: return 0; //return VDP1::GetRegister((uint16)id, special, special_len);
case 1: return VDP2::GetRegister((uint16)id, special, special_len);
case 2: return SOUND_GetSCSPRegister((uint16)id, special, special_len);
}
return 0;
}
static void VDP1_VDP2_SCSP_SetRegister(const unsigned id, const uint32 value)
{
switch(id >> 16)
{
case 0: break; //return VDP1::GetRegister((uint16)id, special, special_len);
case 1: VDP2::SetRegister((uint16)id, value); break;
case 2: SOUND_SetSCSPRegister((uint16)id, value); break;
}
}
static const RegGroupType DBG_RegGroup_VDP1_VDP2_SCSP =
{
NULL,
DBG_Regs_VDP1_VDP2_SCSP,
VDP1_VDP2_SCSP_GetRegister,
VDP1_VDP2_SCSP_SetRegister
};
//
//
//
static void DBG_Init(void) MDFN_COLD;
static void DBG_Init(void)
{
DBG.ActiveCPU = 0;
DBG.BTEnabled = false;
for(unsigned which = 0; which < 2; which++)
{
DBG.BTIndex[which] = 0;
for(unsigned i = 0; i < DBGS::NUMBT; i++)
DBG.BTEntries[which][i].valid = false;
}
DBG.CPUHook = NULL;
DBG.CPUHookContinuous = false;
DBG.FoundBPoint = false;
MDFNDBG_AddRegGroup(&DBG_RegGroup_CPU);
MDFNDBG_AddRegGroup(&DBG_RegGroup_CPUE);
MDFNDBG_AddRegGroup(&DBG_RegGroup_SCU);
MDFNDBG_AddRegGroup(&DBG_RegGroup_VDP1_VDP2_SCSP);
//
//
//
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "physical", "SH-2 Physical (TODO)", 27);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "workraml", "Low Work RAM", 20);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "workramh", "High Work RAM", 20);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "scspram", "SCSP RAM", 19);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "dspprog", "DSP Program RAM", 10);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "vdp1vram", "VDP1 VRAM", 19);
ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "vdp2vram", "VDP2 VRAM", 19);
}
static DebuggerInfoStruct DBGInfo
{
"SJIS",
2,
2,
32,
27,
0x06004000,
~0U,
DBG_MemPeek,
DBG_Disassemble,
DBG_ToggleSyntax,
NULL,
NULL,
DBG_FlushBreakPoints,
DBG_AddBreakPoint,
DBG_SetCPUCallback,
DBG_EnableBranchTrace,
DBG_GetBranchTrace,
NULL,
NULL,
NULL,
NULL,
};
#else
template<unsigned which>
static INLINE void DBG_CPUHandler(const sscpu_timestamp_t timestamp) { }
static INLINE void DBG_AddBranchTrace(unsigned which, uint32 to, int exception, unsigned vecnum = 0) { }
static INLINE bool DBG_NeedCPUHooks(void) { return false; }
static INLINE void DBG_Init(void) { }
#endif

319
waterbox/ss/defs.h Normal file
View File

@ -0,0 +1,319 @@
#pragma once
#include <cstdint>
#include <cstddef>
#include <algorithm>
#include <cassert>
#include <cstring>
#include <cstdlib>
#include <memory>
typedef uint8_t uint8;
typedef uint16_t uint16;
typedef uint32_t uint32;
typedef uint64_t uint64;
typedef int8_t int8;
typedef int16_t int16;
typedef int32_t int32;
typedef int64_t int64;
#define MDFN_FASTCALL
#define INLINE inline
#define MDFN_COLD
#define MDFN_HOT
#define NO_INLINE
#define NO_CLONE
#define MDFN_UNLIKELY(p) (p)
#define MDFN_LIKELY(p) (p)
//#define MDFN_ASSUME_ALIGNED(p, align) ((decltype(p))__builtin_assume_aligned((p), (align)))
#define MDFN_ASSUME_ALIGNED(p, align) (p)
#define trio_snprintf snprintf
#define trio_vprintf vprintf
#define trio_printf printf
#define trio_sprintf sprintf
#define TRUE true
#define FALSE false
#ifndef __alignas_is_defined
#define alignas(p)
#endif
#define override // remove for gcc 4.7
#define final
#define gettext_noop(s) (s)
#define MDFN_MASTERCLOCK_FIXED(n) ((int64)((double)(n) * (1LL << 32)))
typedef struct
{
// Pitch(32-bit) must be equal to width and >= the "fb_width" specified in the MDFNGI struct for the emulated system.
// Height must be >= to the "fb_height" specified in the MDFNGI struct for the emulated system.
// The framebuffer pointed to by surface->pixels is written to by the system emulation code.
uint32 *pixels;
int pitch32;
// Pointer to an array of int32, number of elements = fb_height, set by the driver code. Individual elements written
// to by system emulation code. If the emulated system doesn't support multiple screen widths per frame, or if you handle
// such a situation by outputting at a constant width-per-frame that is the least-common-multiple of the screen widths, then
// you can ignore this. If you do wish to use this, you must set all elements every frame.
int32 *LineWidths;
// Pointer to sound buffer, set by the driver code, that the emulation code should render sound to.
int16 *SoundBuf;
// Number of cycles that this frame consumed, using MDFNGI::MasterClock as a time base.
// Set by emulation code.
int64 MasterCycles;
// Maximum size of the sound buffer, in frames. Set by the driver code.
int32 SoundBufMaxSize;
// Number of frames currently in internal sound buffer. Set by the system emulation code, to be read by the driver code.
int32 SoundBufSize;
// Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size
// of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure
// is ignored while drawing the image.
int32 x, y, h;
// Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and
// only every other line in surface (with the start line defined by InterlacedField) has valid data
// (it's up to internal Mednafen code to deinterlace it).
bool InterlaceOn;
bool InterlaceField;
} EmulateSpecStruct;
#define MDFN_printf(...)
#define MDFN_PrintError(...)
#define MDFN_FORMATSTR(...)
#define require assert
enum InputDeviceInputType : uint8
{
IDIT_BUTTON, // 1-bit
IDIT_BUTTON_CAN_RAPID, // 1-bit
IDIT_SWITCH, // ceil(log2(n))-bit
// Current switch position(default 0).
// Persistent, and bidirectional communication(can be modified driver side, and Mednafen core and emulation module side)
IDIT_STATUS, // ceil(log2(n))-bit
// emulation module->driver communication
IDIT_X_AXIS, // (mouse) 16-bits, signed - in-screen/window range: [0.0, nominal_width)
IDIT_Y_AXIS, // (mouse) 16-bits, signed - in-screen/window range: [0.0, nominal_height)
IDIT_X_AXIS_REL, // (mouse) 32-bits, signed
IDIT_Y_AXIS_REL, // (mouse) 32-bits, signed
IDIT_BYTE_SPECIAL,
IDIT_RESET_BUTTON, // 1-bit
IDIT_BUTTON_ANALOG, // 16-bits, 0 - 32767
IDIT_RUMBLE, // 16-bits, lower 8 bits are weak rumble(0-255), next 8 bits are strong rumble(0-255), 0=no rumble, 255=max rumble. Somewhat subjective, too...
// It's a rather special case of game module->driver code communication.
};
#define IDIT_BUTTON_ANALOG_FLAG_SQLR 0x00000001 // Denotes analog data that may need to be scaled to ensure a more squareish logical range(for emulated
// analog sticks).
struct IDIIS_StatusState
{
const char *ShortName;
const char *Name;
int32 Color; // (msb)0RGB(lsb), -1 for unused.
};
struct InputDeviceInputInfoStruct
{
const char *SettingName; // No spaces, shouldbe all a-z0-9 and _. Definitely no ~!
const char *Name;
int ConfigOrder; // Configuration order during in-game config process, -1 for no config.
InputDeviceInputType Type;
const char *ExcludeName; // SettingName of a button that can't be pressed at the same time as this button
// due to physical limitations.
uint8 Flags;
uint8 BitSize;
uint16 BitOffset;
union {
struct
{
const char *const *SwitchPosName; //
uint32 SwitchNumPos;
};
struct
{
const IDIIS_StatusState *StatusStates;
uint32 StatusNumStates;
};
};
};
struct IDIISG : public std::vector<InputDeviceInputInfoStruct>
{
IDIISG()
{
InputByteSize = 0;
}
IDIISG(std::initializer_list<InputDeviceInputInfoStruct> l) : std::vector<InputDeviceInputInfoStruct>(l)
{
size_t bit_offset = 0;
for (auto &idii : *this)
{
size_t bit_size = 0;
size_t bit_align = 1;
switch (idii.Type)
{
default:
abort();
break;
case IDIT_BUTTON:
case IDIT_BUTTON_CAN_RAPID:
case IDIT_RESET_BUTTON:
bit_size = 1;
break;
case IDIT_SWITCH:
bit_size = ceil(log2(idii.SwitchNumPos));
break;
case IDIT_STATUS:
bit_size = ceil(log2(idii.StatusNumStates));
break;
case IDIT_X_AXIS:
case IDIT_Y_AXIS:
bit_size = 16;
bit_align = 8;
break;
case IDIT_X_AXIS_REL:
case IDIT_Y_AXIS_REL:
bit_size = 32;
bit_align = 8;
break;
case IDIT_BYTE_SPECIAL:
bit_size = 8;
bit_align = 8;
break;
case IDIT_BUTTON_ANALOG:
bit_size = 16;
bit_align = 8;
break;
case IDIT_RUMBLE:
bit_size = 16;
bit_align = 8;
break;
}
bit_offset = (bit_offset + (bit_align - 1)) & ~(bit_align - 1);
// printf("%s, %zu(%zu)\n", idii.SettingName, bit_offset, bit_offset / 8);
idii.BitSize = bit_size;
idii.BitOffset = bit_offset;
assert(idii.BitSize == bit_size);
assert(idii.BitOffset == bit_offset);
bit_offset += bit_size;
}
InputByteSize = (bit_offset + 7) / 8;
}
uint32 InputByteSize;
};
struct IDIIS_Switch : public InputDeviceInputInfoStruct
{
IDIIS_Switch(const char *sname, const char *name, int co, const char *const *spn, const uint32 spn_num)
{
SettingName = sname;
Name = name;
ConfigOrder = co;
Type = IDIT_SWITCH;
ExcludeName = NULL;
Flags = 0;
SwitchPosName = spn;
SwitchNumPos = spn_num;
}
};
struct IDIIS_Status : public InputDeviceInputInfoStruct
{
IDIIS_Status(const char *sname, const char *name, const IDIIS_StatusState *ss, const uint32 ss_num)
{
SettingName = sname;
Name = name;
ConfigOrder = -1;
Type = IDIT_STATUS;
ExcludeName = NULL;
Flags = 0;
StatusStates = ss;
StatusNumStates = ss_num;
}
};
struct InputDeviceInfoStruct
{
const char *ShortName;
const char *FullName;
const char *Description;
const IDIISG &IDII;
unsigned Flags;
enum
{
FLAG_KEYBOARD = (1U << 0)
};
};
struct InputPortInfoStruct
{
const char *ShortName;
const char *FullName;
const std::vector<InputDeviceInfoStruct> &DeviceInfo;
const char *DefaultDevice; // Default device for this port.
};
#include "endian.h"
inline char *strdup(const char *p)
{
char *ret = (char *)malloc(strlen(p) + 1);
if (ret)
strcpy(ret, p);
return ret;
}
#include "stream/Stream.h"
#include "stream/MemoryStream.h"
#include "math_ops.h"
#include <emulibc.h>
// returns a firmware file suitable for use by the core
std::unique_ptr<MemoryStream> GetFirmware(const char *filename);
extern int setting_ss_slstartp;
extern int setting_ss_slendp;
extern int setting_ss_slstart;
extern int setting_ss_slend;
extern int setting_ss_region_default;
extern int setting_ss_cart;
extern bool setting_ss_correct_aspect;
extern bool setting_ss_h_overscan;
extern bool setting_ss_h_blend;
extern bool setting_ss_region_autodetect;
extern bool setting_ss_input_sport1_multitap;
extern bool setting_ss_input_sport0_multitap;

494
waterbox/ss/endian.h Normal file
View File

@ -0,0 +1,494 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* endian.h:
** Copyright (C) 2006-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_ENDIAN_H
#define __MDFN_ENDIAN_H
void Endian_A16_Swap(void *src, uint32 nelements);
void Endian_A32_Swap(void *src, uint32 nelements);
void Endian_A64_Swap(void *src, uint32 nelements);
void Endian_A16_NE_LE(void *src, uint32 nelements);
void Endian_A32_NE_LE(void *src, uint32 nelements);
void Endian_A64_NE_LE(void *src, uint32 nelements);
void Endian_A16_NE_BE(void *src, uint32 nelements);
void Endian_A32_NE_BE(void *src, uint32 nelements);
void Endian_A64_NE_BE(void *src, uint32 nelements);
void Endian_V_NE_LE(void* p, size_t len);
void Endian_V_NE_BE(void* p, size_t len);
//
//
//
static INLINE uint32 BitsExtract(const uint8* ptr, const size_t bit_offset, const size_t bit_count)
{
uint32 ret = 0;
for(size_t x = 0; x < bit_count; x++)
{
size_t co = bit_offset + x;
bool b = (ptr[co >> 3] >> (co & 7)) & 1;
ret |= (uint64)b << x;
}
return ret;
}
static INLINE void BitsIntract(uint8* ptr, const size_t bit_offset, const size_t bit_count, uint32 value)
{
for(size_t x = 0; x < bit_count; x++)
{
size_t co = bit_offset + x;
bool b = (value >> x) & 1;
uint8 tmp = ptr[co >> 3];
tmp &= ~(1 << (co & 7));
tmp |= b << (co & 7);
ptr[co >> 3] = tmp;
}
}
/*
Regarding safety of calling MDFN_*sb<true> on dynamically-allocated memory with new uint8[], see C++ standard 3.7.3.1(i.e. it should be
safe provided the offsets into the memory are aligned/multiples of the MDFN_*sb access type). malloc()'d and calloc()'d
memory should be safe as well.
Statically-allocated arrays/memory should be unioned with a big POD type or C++11 "alignas"'d. (May need to audit code to ensure
this is being done).
*/
static INLINE uint16 MDFN_bswap16(uint16 v)
{
return (v << 8) | (v >> 8);
}
static INLINE uint32 MDFN_bswap32(uint32 v)
{
return (v << 24) | ((v & 0xFF00) << 8) | ((v >> 8) & 0xFF00) | (v >> 24);
}
static INLINE uint64 MDFN_bswap64(uint64 v)
{
return (v << 56) | (v >> 56) | ((v & 0xFF00) << 40) | ((v >> 40) & 0xFF00) | ((uint64)MDFN_bswap32(v >> 16) << 16);
}
#ifdef LSB_FIRST
#define MDFN_ENDIANH_IS_BIGENDIAN 0
#else
#define MDFN_ENDIANH_IS_BIGENDIAN 1
#endif
//
// X endian.
//
template<int isbigendian, typename T, bool aligned>
static INLINE T MDFN_deXsb(const void* ptr)
{
T tmp;
memcpy(&tmp, MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), sizeof(T));
if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN)
{
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins.");
if(sizeof(T) == 8)
return MDFN_bswap64(tmp);
else if(sizeof(T) == 4)
return MDFN_bswap32(tmp);
else if(sizeof(T) == 2)
return MDFN_bswap16(tmp);
}
return tmp;
}
//
// Native endian.
//
template<typename T, bool aligned = false>
static INLINE T MDFN_densb(const void* ptr)
{
return MDFN_deXsb<-1, T, aligned>(ptr);
}
//
// Little endian.
//
template<typename T, bool aligned = false>
static INLINE T MDFN_delsb(const void* ptr)
{
return MDFN_deXsb<0, T, aligned>(ptr);
}
template<bool aligned = false>
static INLINE uint16 MDFN_de16lsb(const void* ptr)
{
return MDFN_delsb<uint16, aligned>(ptr);
}
static INLINE uint32 MDFN_de24lsb(const void* ptr)
{
const uint8* ptr_u8 = (const uint8*)ptr;
return (ptr_u8[0] << 0) | (ptr_u8[1] << 8) | (ptr_u8[2] << 16);
}
template<bool aligned = false>
static INLINE uint32 MDFN_de32lsb(const void* ptr)
{
return MDFN_delsb<uint32, aligned>(ptr);
}
template<bool aligned = false>
static INLINE uint64 MDFN_de64lsb(const void* ptr)
{
return MDFN_delsb<uint64, aligned>(ptr);
}
//
// Big endian.
//
template<typename T, bool aligned = false>
static INLINE T MDFN_demsb(const void* ptr)
{
return MDFN_deXsb<1, T, aligned>(ptr);
}
template<bool aligned = false>
static INLINE uint16 MDFN_de16msb(const void* ptr)
{
return MDFN_demsb<uint16, aligned>(ptr);
}
static INLINE uint32 MDFN_de24msb(const void* ptr)
{
const uint8* ptr_u8 = (const uint8*)ptr;
return (ptr_u8[0] << 16) | (ptr_u8[1] << 8) | (ptr_u8[2] << 0);
}
template<bool aligned = false>
static INLINE uint32 MDFN_de32msb(const void* ptr)
{
return MDFN_demsb<uint32, aligned>(ptr);
}
template<bool aligned = false>
static INLINE uint64 MDFN_de64msb(const void* ptr)
{
return MDFN_demsb<uint64, aligned>(ptr);
}
//
//
//
//
//
//
//
//
//
// X endian.
//
template<int isbigendian, typename T, bool aligned>
static INLINE void MDFN_enXsb(void* ptr, T value)
{
T tmp = value;
if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN)
{
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins.");
if(sizeof(T) == 8)
tmp = MDFN_bswap64(value);
else if(sizeof(T) == 4)
tmp = MDFN_bswap32(value);
else if(sizeof(T) == 2)
tmp = MDFN_bswap16(value);
}
memcpy(MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), &tmp, sizeof(T));
}
//
// Native endian.
//
template<typename T, bool aligned = false>
static INLINE void MDFN_ennsb(void* ptr, T value)
{
MDFN_enXsb<-1, T, aligned>(ptr, value);
}
//
// Little endian.
//
template<typename T, bool aligned = false>
static INLINE void MDFN_enlsb(void* ptr, T value)
{
MDFN_enXsb<0, T, aligned>(ptr, value);
}
template<bool aligned = false>
static INLINE void MDFN_en16lsb(void* ptr, uint16 value)
{
MDFN_enlsb<uint16, aligned>(ptr, value);
}
static INLINE void MDFN_en24lsb(void* ptr, uint32 value)
{
uint8* ptr_u8 = (uint8*)ptr;
ptr_u8[0] = value >> 0;
ptr_u8[1] = value >> 8;
ptr_u8[2] = value >> 16;
}
template<bool aligned = false>
static INLINE void MDFN_en32lsb(void* ptr, uint32 value)
{
MDFN_enlsb<uint32, aligned>(ptr, value);
}
template<bool aligned = false>
static INLINE void MDFN_en64lsb(void* ptr, uint64 value)
{
MDFN_enlsb<uint64, aligned>(ptr, value);
}
//
// Big endian.
//
template<typename T, bool aligned = false>
static INLINE void MDFN_enmsb(void* ptr, T value)
{
MDFN_enXsb<1, T, aligned>(ptr, value);
}
template<bool aligned = false>
static INLINE void MDFN_en16msb(void* ptr, uint16 value)
{
MDFN_enmsb<uint16, aligned>(ptr, value);
}
static INLINE void MDFN_en24msb(void* ptr, uint32 value)
{
uint8* ptr_u8 = (uint8*)ptr;
ptr_u8[0] = value >> 16;
ptr_u8[1] = value >> 8;
ptr_u8[2] = value >> 0;
}
template<bool aligned = false>
static INLINE void MDFN_en32msb(void* ptr, uint32 value)
{
MDFN_enmsb<uint32, aligned>(ptr, value);
}
template<bool aligned = false>
static INLINE void MDFN_en64msb(void* ptr, uint64 value)
{
MDFN_enmsb<uint64, aligned>(ptr, value);
}
//
//
//
//
//
//
template<typename T, typename BT>
static INLINE uint8* ne16_ptr_be(BT* const base, const size_t byte_offset)
{
#ifdef MSB_FIRST
return (uint8*)base + (byte_offset &~ (sizeof(T) - 1));
#else
return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min<size_t>(2, sizeof(T)))));
#endif
}
template<typename T>
static INLINE void ne16_wbo_be(uint16* const base, const size_t byte_offset, const T value)
{
uint8* const ptr = ne16_ptr_be<T>(base, byte_offset);
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size");
if(sizeof(T) == 4)
{
uint16* const ptr16 = (uint16*)ptr;
ptr16[0] = value >> 16;
ptr16[1] = value;
}
else
*(T*)ptr = value;
}
template<typename T>
static INLINE T ne16_rbo_be(const uint16* const base, const size_t byte_offset)
{
uint8* const ptr = ne16_ptr_be<T>(base, byte_offset);
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size");
if(sizeof(T) == 4)
{
uint16* const ptr16 = (uint16*)ptr;
T tmp;
tmp = ptr16[0] << 16;
tmp |= ptr16[1];
return tmp;
}
else
return *(T*)ptr;
}
template<typename T, bool IsWrite>
static INLINE void ne16_rwbo_be(uint16* const base, const size_t byte_offset, T* value)
{
if(IsWrite)
ne16_wbo_be<T>(base, byte_offset, *value);
else
*value = ne16_rbo_be<T>(base, byte_offset);
}
//
//
//
template<typename T, typename BT>
static INLINE uint8* ne16_ptr_le(BT* const base, const size_t byte_offset)
{
#ifdef LSB_FIRST
return (uint8*)base + (byte_offset &~ (sizeof(T) - 1));
#else
return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min<size_t>(2, sizeof(T)))));
#endif
}
template<typename T>
static INLINE void ne16_wbo_le(uint16* const base, const size_t byte_offset, const T value)
{
uint8* const ptr = ne16_ptr_le<T>(base, byte_offset);
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size");
if(sizeof(T) == 4)
{
uint16* const ptr16 = (uint16*)ptr;
ptr16[0] = value;
ptr16[1] = value >> 16;
}
else
*(T*)ptr = value;
}
template<typename T>
static INLINE T ne16_rbo_le(const uint16* const base, const size_t byte_offset)
{
uint8* const ptr = ne16_ptr_le<T>(base, byte_offset);
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size");
if(sizeof(T) == 4)
{
uint16* const ptr16 = (uint16*)ptr;
T tmp;
tmp = ptr16[0];
tmp |= ptr16[1] << 16;
return tmp;
}
else
return *(T*)ptr;
}
template<typename T, bool IsWrite>
static INLINE void ne16_rwbo_le(uint16* const base, const size_t byte_offset, T* value)
{
if(IsWrite)
ne16_wbo_le<T>(base, byte_offset, *value);
else
*value = ne16_rbo_le<T>(base, byte_offset);
}
//
//
//
template<typename T>
static INLINE uint8* ne64_ptr_be(uint64* const base, const size_t byte_offset)
{
#ifdef MSB_FIRST
return (uint8*)base + (byte_offset &~ (sizeof(T) - 1));
#else
return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (8 - sizeof(T))));
#endif
}
template<typename T>
static INLINE void ne64_wbo_be(uint64* const base, const size_t byte_offset, const T value)
{
uint8* const ptr = ne64_ptr_be<T>(base, byte_offset);
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Unsupported type size");
memcpy(MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), &value, sizeof(T));
}
template<typename T>
static INLINE T ne64_rbo_be(uint64* const base, const size_t byte_offset)
{
uint8* const ptr = ne64_ptr_be<T>(base, byte_offset);
T ret;
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size");
memcpy(&ret, MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), sizeof(T));
return ret;
}
template<typename T, bool IsWrite>
static INLINE void ne64_rwbo_be(uint64* const base, const size_t byte_offset, T* value)
{
if(IsWrite)
ne64_wbo_be<T>(base, byte_offset, *value);
else
*value = ne64_rbo_be<T>(base, byte_offset);
}
#endif

176
waterbox/ss/input/3dpad.cpp Normal file
View File

@ -0,0 +1,176 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* 3dpad.cpp:
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "3dpad.h"
namespace MDFN_IEN_SS
{
IODevice_3DPad::IODevice_3DPad() : dbuttons(0), mode(false)
{
}
IODevice_3DPad::~IODevice_3DPad()
{
}
void IODevice_3DPad::Power(void)
{
phase = -1;
tl = true;
data_out = 0x01;
}
void IODevice_3DPad::UpdateInput(const uint8* data, const int32 time_elapsed)
{
const uint16 dtmp = MDFN_de16lsb(&data[0]);
dbuttons = (dbuttons & 0x8800) | (dtmp & 0x0FFF);
mode = (bool)(dtmp & 0x1000);
for(unsigned axis = 0; axis < 2; axis++)
{
int32 tmp = 32767 + MDFN_de16lsb(&data[0x2 + (axis << 2) + 2]) - MDFN_de16lsb(&data[0x2 + (axis << 2) + 0]);
if(tmp >= (32767 - 128) && tmp < 32767)
tmp = 32767;
tmp = (tmp * 255 + 32767) / 65534;
thumb[axis] = tmp;
}
for(unsigned w = 0; w < 2; w++)
{
shoulder[w] = (MDFN_de16lsb(&data[0xA + (w << 1)]) * 255 + 16383) / 32767;
// May not be right for digital mode, but shouldn't matter too much:
if(shoulder[w] <= 0x55)
dbuttons &= ~(0x0800 << (w << 2));
else if(shoulder[w] >= 0x8E)
dbuttons |= 0x0800 << (w << 2);
}
}
uint8 IODevice_3DPad::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
uint8 tmp;
if(smpc_out & 0x40)
{
phase = -1;
tl = true;
data_out = 0x01;
}
else
{
if((bool)(smpc_out & 0x20) != tl)
{
if(phase < 15)
{
tl = !tl;
phase++;
}
if(!phase)
{
if(mode)
{
buffer[ 0] = 0x1;
buffer[ 1] = 0x6;
buffer[ 2] = (((dbuttons >> 0) & 0xF) ^ 0xF);
buffer[ 3] = (((dbuttons >> 4) & 0xF) ^ 0xF);
buffer[ 4] = (((dbuttons >> 8) & 0xF) ^ 0xF);
buffer[ 5] = (((dbuttons >> 12) & 0xF) ^ 0xF);
buffer[ 6] = (thumb[0] >> 4) & 0xF;
buffer[ 7] = (thumb[0] >> 0) & 0xF;
buffer[ 8] = (thumb[1] >> 4) & 0xF;
buffer[ 9] = (thumb[1] >> 0) & 0xF;
buffer[10] = (shoulder[0] >> 4) & 0xF;
buffer[11] = (shoulder[0] >> 0) & 0xF;
buffer[12] = (shoulder[1] >> 4) & 0xF;
buffer[13] = (shoulder[1] >> 0) & 0xF;
buffer[14] = 0x0;
buffer[15] = 0x1;
}
else
{
phase = 8;
buffer[ 8] = 0x0;
buffer[ 9] = 0x2;
buffer[10] = (((dbuttons >> 0) & 0xF) ^ 0xF);
buffer[11] = (((dbuttons >> 4) & 0xF) ^ 0xF);
buffer[12] = (((dbuttons >> 8) & 0xF) ^ 0xF);
buffer[13] = (((dbuttons >> 12) & 0xF) ^ 0xF);
buffer[14] = 0x0;
buffer[15] = 0x1;
}
}
data_out = buffer[phase];
}
}
tmp = (tl << 4) | data_out;
return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted);
}
static const char* const ModeSwitchPositions[] =
{
gettext_noop("Digital(+)"),
gettext_noop("Analog(○)"),
};
IDIISG IODevice_3DPad_IDII =
{
{ "up", "D-Pad UP ↑", 0, IDIT_BUTTON, "down" },
{ "down", "D-Pad DOWN ↓", 1, IDIT_BUTTON, "up" },
{ "left", "D-Pad LEFT ←", 2, IDIT_BUTTON, "right" },
{ "right", "D-Pad RIGHT →", 3, IDIT_BUTTON, "left" },
{ "b", "B", 6, IDIT_BUTTON },
{ "c", "C", 7, IDIT_BUTTON },
{ "a", "A", 5, IDIT_BUTTON },
{ "start", "START", 4, IDIT_BUTTON },
{ "z", "Z", 10, IDIT_BUTTON },
{ "y", "Y", 9, IDIT_BUTTON },
{ "x", "X", 8, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
IDIIS_Switch("mode", "Mode", 17, ModeSwitchPositions, sizeof(ModeSwitchPositions) / sizeof(ModeSwitchPositions[0])),
{ "analog_left", "Analog LEFT ←", 15, IDIT_BUTTON_ANALOG },
{ "analog_right", "Analog RIGHT →", 16, IDIT_BUTTON_ANALOG },
{ "analog_up", "Analog UP ↑", 13, IDIT_BUTTON_ANALOG },
{ "analog_down", "Analog DOWN ↓", 14, IDIT_BUTTON_ANALOG },
{ "rs", "Right Shoulder (Analog)", 12, IDIT_BUTTON_ANALOG },
{ "ls", "Left Shoulder (Analog)", 11, IDIT_BUTTON_ANALOG },
};
}

56
waterbox/ss/input/3dpad.h Normal file
View File

@ -0,0 +1,56 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* 3dpad.h:
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_3DPAD_H
#define __MDFN_SS_INPUT_3DPAD_H
namespace MDFN_IEN_SS
{
class IODevice_3DPad final : public IODevice
{
public:
IODevice_3DPad() MDFN_COLD;
virtual ~IODevice_3DPad() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
uint16 dbuttons;
uint8 thumb[2];
uint8 shoulder[2];
uint8 buffer[0x10];
uint8 data_out;
bool tl;
int8 phase;
bool mode;
};
extern IDIISG IODevice_3DPad_IDII;
}
#endif

View File

@ -0,0 +1,2 @@
#include "../ss.h"
#include "../smpc.h"

View File

@ -0,0 +1,81 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* gamepad.cpp - Digital Gamepad Emulation
** Copyright (C) 2015-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "gamepad.h"
namespace MDFN_IEN_SS
{
IODevice_Gamepad::IODevice_Gamepad() : buttons(~3)
{
}
IODevice_Gamepad::~IODevice_Gamepad()
{
}
void IODevice_Gamepad::Power(void)
{
}
void IODevice_Gamepad::UpdateInput(const uint8* data, const int32 time_elapsed)
{
buttons = (~(data[0] | (data[1] << 8))) &~ 0x3000;
}
uint8 IODevice_Gamepad::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
uint8 tmp;
tmp = (buttons >> ((smpc_out >> 5) << 2)) & 0xF;
return 0x10 | (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted);
}
IDIISG IODevice_Gamepad_IDII =
{
{ "z", "Z", 10, IDIT_BUTTON },
{ "y", "Y", 9, IDIT_BUTTON },
{ "x", "X", 8, IDIT_BUTTON },
{ "rs", "Right Shoulder", 12, IDIT_BUTTON },
{ "up", "UP ↑", 0, IDIT_BUTTON, "down" },
{ "down", "DOWN ↓", 1, IDIT_BUTTON, "up" },
{ "left", "LEFT ←", 2, IDIT_BUTTON, "right" },
{ "right", "RIGHT →", 3, IDIT_BUTTON, "left" },
{ "b", "B", 6, IDIT_BUTTON },
{ "c", "C", 7, IDIT_BUTTON },
{ "a", "A", 5, IDIT_BUTTON },
{ "start", "START", 4, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ "ls", "Left Shoulder", 11, IDIT_BUTTON },
};
}

View File

@ -0,0 +1,48 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* gamepad.h:
** Copyright (C) 2015-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_GAMEPAD_H
#define __MDFN_SS_INPUT_GAMEPAD_H
namespace MDFN_IEN_SS
{
class IODevice_Gamepad final : public IODevice
{
public:
IODevice_Gamepad() MDFN_COLD;
virtual ~IODevice_Gamepad() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
uint16 buttons;
};
extern IDIISG IODevice_Gamepad_IDII;
}
#endif

View File

@ -0,0 +1,397 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* keyboard.cpp:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// TODO: Debouncing?
//
// PS/2 keyboard adapter seems to do PS/2 processing near/at the end of a Saturn-side read sequence, which creates about 1 frame of extra latency
// in practice. We handle things a bit differently here, to avoid the latency.
//
// Also, the PS/2 adapter seems to set the typematic delay to around 250ms, but we emulate it here as 400ms, as 250ms is
// a tad bit too short. It can be changed to 250ms by adjusting a single #if statement, though.
//
// During testing, a couple of early-1990s PS/2 keyboards malfunctioned and failed to work with the PS/2 adapter.
// Not sure why, maybe a power draw issue?
//
// The keyboard emulated doesn't have special Windows-keyboard keys, as they don't appear to work correctly with the PS/2 adapter
// (scancode field is updated, but no make nor break bits are set to 1), and it's good to have some non-shared keys for input grabbing toggling purposes...
//
//
// make and break bits should not both be set to 1 at the same time.
// pause is special
// new key press halts repeat of held key, and it doesn't restart even if new key is released.
//
#include "common.h"
#include "keyboard.h"
namespace MDFN_IEN_SS
{
IODevice_Keyboard::IODevice_Keyboard() : phys{0,0,0,0}
{
}
IODevice_Keyboard::~IODevice_Keyboard()
{
}
void IODevice_Keyboard::Power(void)
{
phase = -1;
tl = true;
data_out = 0x01;
simbutt = simbutt_pend = 0;
lock = lock_pend = 0;
mkbrk_pend = 0;
memset(buffer, 0, sizeof(buffer));
//memcpy(processed, phys, sizeof(processed));
memset(processed, 0, sizeof(processed));
memset(fifo, 0, sizeof(fifo));
fifo_rdp = 0;
fifo_wrp = 0;
fifo_cnt = 0;
rep_sc = -1;
rep_dcnt = 0;
}
void IODevice_Keyboard::UpdateInput(const uint8* data, const int32 time_elapsed)
{
phys[0] = MDFN_de64lsb(&data[0x00]);
phys[1] = MDFN_de64lsb(&data[0x08]);
phys[2] = MDFN_de16lsb(&data[0x10]);
phys[3] = 0;
//
if(rep_dcnt > 0)
rep_dcnt -= time_elapsed;
for(unsigned i = 0; i < 4; i++)
{
uint64 tmp = phys[i] ^ processed[i];
unsigned bp;
while((bp = (63 ^ MDFN_lzcount64(tmp))) < 64)
{
const uint64 mask = ((uint64)1 << bp);
const int sc = ((i << 6) + bp);
if(fifo_cnt >= (fifo_size - (sc == 0x82)))
goto fifo_oflow_abort;
if(phys[i] & mask)
{
rep_sc = sc;
#if 1
rep_dcnt = 400000;
#else
rep_dcnt = 250000;
#endif
fifo[fifo_wrp] = 0x800 | sc;
fifo_wrp = (fifo_wrp + 1) % fifo_size;
fifo_cnt++;
}
if(!(phys[i] & mask) == (sc != 0x82))
{
if(rep_sc == sc)
rep_sc = -1;
fifo[fifo_wrp] = 0x100 | sc;
fifo_wrp = (fifo_wrp + 1) % fifo_size;
fifo_cnt++;
}
processed[i] = (processed[i] & ~mask) | (phys[i] & mask);
tmp &= ~mask;
}
}
if(rep_sc >= 0)
{
while(rep_dcnt <= 0)
{
if(fifo_cnt >= fifo_size)
goto fifo_oflow_abort;
fifo[fifo_wrp] = 0x800 | rep_sc;
fifo_wrp = (fifo_wrp + 1) % fifo_size;
fifo_cnt++;
rep_dcnt += 33333;
}
}
fifo_oflow_abort:;
}
void IODevice_Keyboard::UpdateOutput(uint8* data)
{
data[0x12] = lock;
}
uint8 IODevice_Keyboard::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
if(smpc_out & 0x40)
{
phase = -1;
tl = true;
data_out = 0x01;
}
else
{
if((bool)(smpc_out & 0x20) != tl)
{
tl = !tl;
phase += (phase < 11);
if(!phase)
{
if(mkbrk_pend == (uint8)mkbrk_pend && fifo_cnt)
{
mkbrk_pend = fifo[fifo_rdp];
fifo_rdp = (fifo_rdp + 1) % fifo_size;
fifo_cnt--;
bool p = mkbrk_pend & 0x800;
switch(mkbrk_pend & 0xFF)
{
case 0x89: /* Up */ simbutt_pend = simbutt & ~(1 << 0); simbutt_pend &= ~(p << 1); simbutt_pend |= (p << 0); break;
case 0x8A: /*Down */ simbutt_pend = simbutt & ~(1 << 1); simbutt_pend &= ~(p << 0); simbutt_pend |= (p << 1); break;
case 0x86: /*Left */ simbutt_pend = simbutt & ~(1 << 2); simbutt_pend &= ~(p << 3); simbutt_pend |= (p << 2); break;
case 0x8D: /*Right*/ simbutt_pend = simbutt & ~(1 << 3); simbutt_pend &= ~(p << 2); simbutt_pend |= (p << 3); break;
case 0x22: /* X */ simbutt_pend = simbutt & ~(1 << 4); simbutt_pend |= (p << 4); break;
case 0x21: /* C */ simbutt_pend = simbutt & ~(1 << 5); simbutt_pend |= (p << 5); break;
case 0x1A: /* Z */ simbutt_pend = simbutt & ~(1 << 6); simbutt_pend |= (p << 6); break;
case 0x76: /* Esc */ simbutt_pend = simbutt & ~(1 << 7); simbutt_pend |= (p << 7); break;
case 0x23: /* D */ simbutt_pend = simbutt & ~(1 << 8); simbutt_pend |= (p << 8); break;
case 0x1B: /* S */ simbutt_pend = simbutt & ~(1 << 9); simbutt_pend |= (p << 9); break;
case 0x1C: /* A */ simbutt_pend = simbutt & ~(1 << 10); simbutt_pend |= (p << 10); break;
case 0x24: /* E */ simbutt_pend = simbutt & ~(1 << 11); simbutt_pend |= (p << 11); break;
case 0x15: /* Q */ simbutt_pend = simbutt & ~(1 << 15); simbutt_pend |= (p << 15); break;
case 0x7E: /* Scrl */ lock_pend = lock ^ (p ? LOCK_SCROLL : 0); break;
case 0x77: /* Num */ lock_pend = lock ^ (p ? LOCK_NUM : 0); break;
case 0x58: /* Caps */ lock_pend = lock ^ (p ? LOCK_CAPS : 0); break;
}
}
buffer[ 0] = 0x3;
buffer[ 1] = 0x4;
buffer[ 2] = (((simbutt_pend >> 0) ^ 0xF) & 0xF);
buffer[ 3] = (((simbutt_pend >> 4) ^ 0xF) & 0xF);
buffer[ 4] = (((simbutt_pend >> 8) ^ 0xF) & 0xF);
buffer[ 5] = (((simbutt_pend >> 12) ^ 0xF) & 0x8) | 0x0;
buffer[ 6] = lock_pend;
buffer[ 7] = ((mkbrk_pend >> 8) & 0xF) | 0x6;
buffer[ 8] = (mkbrk_pend >> 4) & 0xF;
buffer[ 9] = (mkbrk_pend >> 0) & 0xF;
buffer[10] = 0x0;
buffer[11] = 0x1;
}
if(phase == 9)
{
mkbrk_pend = (uint8)mkbrk_pend;
lock = lock_pend;
simbutt = simbutt_pend;
}
data_out = buffer[phase];
}
}
return (smpc_out & (smpc_out_asserted | 0xE0)) | (((tl << 4) | data_out) &~ smpc_out_asserted);
}
static const IDIIS_StatusState Lock_SS[] =
{
{ "off", gettext_noop("Off") },
{ "on", gettext_noop("On") },
};
const IDIISG IODevice_Keyboard_US101_IDII =
{
/* 0x00 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x01 */ { "f9", "F9", -1, IDIT_BUTTON },
/* 0x02 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x03 */ { "f5", "F5", -1, IDIT_BUTTON },
/* 0x04 */ { "f3", "F3", -1, IDIT_BUTTON },
/* 0x05 */ { "f1", "F1", -1, IDIT_BUTTON },
/* 0x06 */ { "f2", "F2", -1, IDIT_BUTTON },
/* 0x07 */ { "f12", "F12", -1, IDIT_BUTTON },
/* 0x08 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x09 */ { "f10", "F10", -1, IDIT_BUTTON },
/* 0x0A */ { "f8", "F8", -1, IDIT_BUTTON },
/* 0x0B */ { "f6", "F6", -1, IDIT_BUTTON },
/* 0x0C */ { "f4", "F4", -1, IDIT_BUTTON },
/* 0x0D */ { "tab", "Tab", -1, IDIT_BUTTON },
/* 0x0E */ { "grave", "Grave `", -1, IDIT_BUTTON },
/* 0x0F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x10 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x11 */ { "lalt", "Left Alt", -1, IDIT_BUTTON },
/* 0x12 */ { "lshift", "Left Shift", -1, IDIT_BUTTON },
/* 0x13 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x14 */ { "lctrl", "Left Ctrl", -1, IDIT_BUTTON },
/* 0x15 */ { "q", "Q", -1, IDIT_BUTTON },
/* 0x16 */ { "1", "1(One)", -1, IDIT_BUTTON },
/* 0x17 */ { "ralt", "Right Alt", -1, IDIT_BUTTON },
/* 0x18 */ { "rctrl", "Right Ctrl", -1, IDIT_BUTTON },
/* 0x19 */ { "kp_enter", "Keypad Enter", -1, IDIT_BUTTON },
/* 0x1A */ { "z", "Z", -1, IDIT_BUTTON },
/* 0x1B */ { "s", "S", -1, IDIT_BUTTON },
/* 0x1C */ { "a", "A", -1, IDIT_BUTTON },
/* 0x1D */ { "w", "W", -1, IDIT_BUTTON },
/* 0x1E */ { "2", "2", -1, IDIT_BUTTON },
/* 0x1F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x20 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x21 */ { "c", "C", -1, IDIT_BUTTON },
/* 0x22 */ { "x", "X", -1, IDIT_BUTTON },
/* 0x23 */ { "d", "D", -1, IDIT_BUTTON },
/* 0x24 */ { "e", "E", -1, IDIT_BUTTON },
/* 0x25 */ { "4", "4", -1, IDIT_BUTTON },
/* 0x26 */ { "3", "3", -1, IDIT_BUTTON },
/* 0x27 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x28 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x29 */ { "space", "Space", -1, IDIT_BUTTON },
/* 0x2A */ { "v", "V", -1, IDIT_BUTTON },
/* 0x2B */ { "f", "F", -1, IDIT_BUTTON },
/* 0x2C */ { "t", "T", -1, IDIT_BUTTON },
/* 0x2D */ { "r", "R", -1, IDIT_BUTTON },
/* 0x2E */ { "5", "5", -1, IDIT_BUTTON },
/* 0x2F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x30 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x31 */ { "n", "N", -1, IDIT_BUTTON },
/* 0x32 */ { "b", "B", -1, IDIT_BUTTON },
/* 0x33 */ { "h", "H", -1, IDIT_BUTTON },
/* 0x34 */ { "g", "G", -1, IDIT_BUTTON },
/* 0x35 */ { "y", "Y", -1, IDIT_BUTTON },
/* 0x36 */ { "6", "6", -1, IDIT_BUTTON },
/* 0x37 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x38 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x39 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x3A */ { "m", "M", -1, IDIT_BUTTON },
/* 0x3B */ { "j", "J", -1, IDIT_BUTTON },
/* 0x3C */ { "u", "U", -1, IDIT_BUTTON },
/* 0x3D */ { "7", "7", -1, IDIT_BUTTON },
/* 0x3E */ { "8", "8", -1, IDIT_BUTTON },
/* 0x3F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x40 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x41 */ { "comma", "Comma ,", -1, IDIT_BUTTON },
/* 0x42 */ { "k", "K", -1, IDIT_BUTTON },
/* 0x43 */ { "i", "I", -1, IDIT_BUTTON },
/* 0x44 */ { "o", "O", -1, IDIT_BUTTON },
/* 0x45 */ { "0", "0(Zero)", -1, IDIT_BUTTON },
/* 0x46 */ { "9", "9", -1, IDIT_BUTTON },
/* 0x47 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x48 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x49 */ { "period", "Period .", -1, IDIT_BUTTON },
/* 0x4A */ { "slash", "Slash /", -1, IDIT_BUTTON },
/* 0x4B */ { "l", "L", -1, IDIT_BUTTON },
/* 0x4C */ { "semicolon", "Semicolon ;", -1, IDIT_BUTTON },
/* 0x4D */ { "p", "P", -1, IDIT_BUTTON },
/* 0x4E */ { "Minus", "Minus -", -1, IDIT_BUTTON },
/* 0x4F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x50 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x51 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x52 */ { "quote", "Quote '", -1, IDIT_BUTTON },
/* 0x53 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x54 */ { "leftbracket", "Left Bracket [", -1, IDIT_BUTTON },
/* 0x55 */ { "equals", "Equals =", -1, IDIT_BUTTON },
/* 0x56 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x57 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x58 */ { "capslock", "Caps Lock", -1, IDIT_BUTTON },
/* 0x59 */ { "rshift", "Right Shift", -1, IDIT_BUTTON },
/* 0x5A */ { "enter", "Enter", -1, IDIT_BUTTON },
/* 0x5B */ { "rightbracket", "Right Bracket ]", -1, IDIT_BUTTON },
/* 0x5C */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x5D */ { "backslash", "Backslash \\", -1, IDIT_BUTTON },
/* 0x5E */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x5F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x60 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x61 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x62 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x63 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x64 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x65 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x66 */ { "backspace", "Backspace", -1, IDIT_BUTTON },
/* 0x67 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x68 */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x69 */ { "kp_end", "Keypad End/1", -1, IDIT_BUTTON },
/* 0x6A */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x6B */ { "kp_left", "Keypad Left/4", -1, IDIT_BUTTON },
/* 0x6C */ { "kp_home", "Keypad Home/7", -1, IDIT_BUTTON },
/* 0x6D */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x6E */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x6F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x70 */ { "kp_insert", "Keypad Insert/0", -1, IDIT_BUTTON },
/* 0x71 */ { "kp_delete", "Keypad Delete", -1, IDIT_BUTTON },
/* 0x72 */ { "kp_down", "Keypad Down/2", -1, IDIT_BUTTON },
/* 0x73 */ { "kp_center", "Keypad Center/5", -1, IDIT_BUTTON },
/* 0x74 */ { "kp_right", "Keypad Right/6", -1, IDIT_BUTTON },
/* 0x75 */ { "kp_up", "Keypad Up/8", -1, IDIT_BUTTON },
/* 0x76 */ { "esc", "Escape", -1, IDIT_BUTTON },
/* 0x77 */ { "numlock", "Num Lock", -1, IDIT_BUTTON },
/* 0x78 */ { "f11", "F11", -1, IDIT_BUTTON },
/* 0x79 */ { "kp_plus", "Keypad Plus", -1, IDIT_BUTTON },
/* 0x7A */ { "kp_pagedown", "Keypad Pagedown/3", -1, IDIT_BUTTON },
/* 0x7B */ { "kp_minus", "Keypad Minus", -1, IDIT_BUTTON },
/* 0x7C */ { "kp_asterisk", "Keypad Asterisk(Multiply)", -1, IDIT_BUTTON },
/* 0x7D */ { "kp_pageup", "Keypad Pageup/9", -1, IDIT_BUTTON },
/* 0x7E */ { "scrolllock", "Scroll Lock", -1, IDIT_BUTTON },
/* 0x7F */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x80 */ { "kp_slash", "Keypad Slash(Divide)", -1, IDIT_BUTTON },
/* 0x81 */ { "insert", "Insert", -1, IDIT_BUTTON },
/* 0x82 */ { "pause", "Pause", -1, IDIT_BUTTON },
/* 0x83 */ { "f7", "F7", -1, IDIT_BUTTON },
/* 0x84 */ { "printscreen", "Print Screen", -1, IDIT_BUTTON },
/* 0x85 */ { "delete", "Delete", -1, IDIT_BUTTON },
/* 0x86 */ { "left", "Cursor Left", -1, IDIT_BUTTON },
/* 0x87 */ { "home", "Home", -1, IDIT_BUTTON },
/* 0x88 */ { "end", "End", -1, IDIT_BUTTON },
/* 0x89 */ { "up", "Up", -1, IDIT_BUTTON },
/* 0x8A */ { "down", "Down", -1, IDIT_BUTTON },
/* 0x8B */ { "pageup", "Page Up", -1, IDIT_BUTTON },
/* 0x8C */ { "pagedown", "Page Down", -1, IDIT_BUTTON },
/* 0x8D */ { "right", "Right", -1, IDIT_BUTTON },
/* 0x8E */ { NULL, "empty", -1, IDIT_BUTTON },
/* 0x8F */ { NULL, "empty", -1, IDIT_BUTTON },
IDIIS_Status("scrolllock_status", "Scroll Lock", Lock_SS, sizeof(Lock_SS) / sizeof(Lock_SS[0])),
IDIIS_Status("numlock_status", "Num Lock", Lock_SS, sizeof(Lock_SS) / sizeof(Lock_SS[0])),
IDIIS_Status("capslock_status", "Caps Lock", Lock_SS, sizeof(Lock_SS) / sizeof(Lock_SS[0]))
};
}

View File

@ -0,0 +1,73 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* keyboard.h:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_KEYBOARD_H
#define __MDFN_SS_INPUT_KEYBOARD_H
namespace MDFN_IEN_SS
{
class IODevice_Keyboard final : public IODevice
{
public:
IODevice_Keyboard() MDFN_COLD;
virtual ~IODevice_Keyboard() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual void UpdateOutput(uint8* data) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
uint64 phys[4];
uint64 processed[4];
uint8 lock;
uint8 lock_pend;
uint16 simbutt;
uint16 simbutt_pend;
enum { fifo_size = 16 };
uint16 fifo[fifo_size];
uint8 fifo_rdp;
uint8 fifo_wrp;
uint8 fifo_cnt;
enum
{
LOCK_SCROLL = 0x01,
LOCK_NUM = 0x02,
LOCK_CAPS = 0x04
};
int16 rep_sc;
int32 rep_dcnt;
int16 mkbrk_pend;
uint8 buffer[12];
uint8 data_out;
bool tl;
int8 phase;
};
extern const IDIISG IODevice_Keyboard_US101_IDII;
}
#endif

View File

@ -0,0 +1,330 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* mission.cpp:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*
Real mission stick has bugs and quirks that aren't emulated here(like apparently latching/updating the physical input state at the end of the
read sequence instead of near the beginning like other controllers do, resulting in increased latency).
*/
#include "common.h"
#include "mission.h"
namespace MDFN_IEN_SS
{
IODevice_Mission::IODevice_Mission(const bool dual_) : dbuttons(0), afeswitches(0), afspeed(0), dual(dual_)
{
}
IODevice_Mission::~IODevice_Mission()
{
}
void IODevice_Mission::Power(void)
{
phase = -1;
tl = true;
data_out = 0x01;
// Power-on state not tested:
afcounter = 0;
afphase = false;
}
void IODevice_Mission::UpdateInput(const uint8* data, const int32 time_elapsed)
{
const uint32 dtmp = MDFN_de32lsb(&data[0]);
dbuttons = (dbuttons & 0xF) | ((dtmp & 0xFFF) << 4);
afeswitches = ((dtmp >> 12) & 0x8FF) << 4;
afspeed = (dtmp >> 20) & 0x7;
for(unsigned stick = 0; stick < (dual ? 2 : 1); stick++)
{
for(unsigned axis = 0; axis < 3; axis++)
{
int32 tmp = 32767 + MDFN_de16lsb(&data[0x3 + ((axis + (stick * 3)) * 4) + 2]) - MDFN_de16lsb(&data[0x3 + ((axis + (stick * 3)) * 4) + 0]);
axes[stick][axis] = (tmp * 255 + 32767) / 65534;
}
}
//printf("Update: %02x %02x %02x\n", axes[0][0], axes[0][1], axes[0][2]);
}
uint8 IODevice_Mission::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
uint8 tmp;
if(smpc_out & 0x40)
{
phase = -1;
tl = true;
data_out = 0x01;
}
else
{
if((bool)(smpc_out & 0x20) != tl)
{
if(phase < (dual ? 21 : 13))
{
tl = !tl;
phase++;
}
if(!phase)
{
unsigned dbaf = dbuttons & ((afphase - 1) | ~afeswitches);
unsigned c = 0;
// Digital Left
dbuttons |= ((axes[0][0] <= 0x56) ? 0x4 : 0);
dbuttons &= ~((axes[0][0] >= 0x6C) ? 0x4 : 0);
// Digital Right
dbuttons |= ((axes[0][0] >= 0xAB) ? 0x8 : 0);
dbuttons &= ~((axes[0][0] <= 0x95) ? 0x8 : 0);
// Digital Up
dbuttons |= ((axes[0][1] <= 0x54) ? 0x1 : 0);
dbuttons &= ~((axes[0][1] >= 0x6A) ? 0x1 : 0);
// Digital Down
dbuttons |= ((axes[0][1] >= 0xA9) ? 0x2 : 0);
dbuttons &= ~((axes[0][1] <= 0x94) ? 0x2 : 0);
if(!afcounter)
{
static const uint8 speedtab[7] = { 12, 8, 7, 5, 4, 4/* ? */, 1 };
afphase = !afphase;
afcounter = speedtab[afspeed];
}
afcounter--;
buffer[c++] = 0x1;
buffer[c++] = dual ? 0x9 : 0x5;
buffer[c++] = (((dbaf >> 0) & 0xF) ^ 0xF);
buffer[c++] = (((dbaf >> 4) & 0xF) ^ 0xF);
buffer[c++] = (((dbaf >> 8) & 0xF) ^ 0xF);
buffer[c++] = (((dbaf >> 12) & 0xF) ^ 0xF);
for(unsigned stick = 0; stick < (dual ? 2 : 1); stick++)
{
if(stick)
{
// Not sure, looks like something buggy.
buffer[c++] = 0x0;
buffer[c++] = 0x0;
}
buffer[c++] = (axes[stick][0] >> 4) & 0xF;
buffer[c++] = (axes[stick][0] >> 0) & 0xF;
buffer[c++] = (axes[stick][1] >> 4) & 0xF;
buffer[c++] = (axes[stick][1] >> 0) & 0xF;
buffer[c++] = (axes[stick][2] >> 4) & 0xF;
buffer[c++] = (axes[stick][2] >> 0) & 0xF;
}
buffer[c++] = 0x0;
buffer[c++] = 0x1;
}
data_out = buffer[phase];
}
}
tmp = (tl << 4) | data_out;
return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted);
}
static const char* const SpeedSwitchPositions[] =
{
gettext_noop("1/7"),
gettext_noop("2/7"),
gettext_noop("3/7"),
gettext_noop("4/7"),
gettext_noop("5/7"),
gettext_noop("6/7"),
gettext_noop("7/7")
};
static const char* const AFSwitchPositions[] =
{
gettext_noop("• (Off)"),
gettext_noop("•• (On)")
};
IDIISG IODevice_Mission_IDII =
{
// 0
{ "b", "B (Stick Left Button)", 6, IDIT_BUTTON },
{ "c", "C (Stick Right Button)", 8, IDIT_BUTTON },
{ "a", "A (Stick Trigger)", 7, IDIT_BUTTON },
{ "start", "START", 9, IDIT_BUTTON },
// 4
{ "z", "Z", 13, IDIT_BUTTON },
{ "y", "Y", 12, IDIT_BUTTON },
{ "x", "X", 11, IDIT_BUTTON },
{ "r", "R", 14, IDIT_BUTTON },
// 8
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ "l", "L", 10, IDIT_BUTTON },
// 12
IDIIS_Switch("afb", "B AF", 20, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afc", "C AF", 21, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afa", "A AF", 19, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
{ NULL, "empty", 0, IDIT_BUTTON },
// 16
IDIIS_Switch("afz", "Z AF", 17, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afy", "Y AF", 16, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afx", "X AF", 15, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afr", "R AF", 22, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
// 20
IDIIS_Switch("afspeed", "AF Speed", 23, SpeedSwitchPositions, sizeof(SpeedSwitchPositions) / sizeof(SpeedSwitchPositions[0])),
IDIIS_Switch("afl", "L AF", 18, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
// 24
{ "stick_left", "Stick LEFT ← (Analog)", 2, IDIT_BUTTON_ANALOG },
{ "stick_right", "Stick RIGHT → (Analog)", 3, IDIT_BUTTON_ANALOG },
{ "stick_fore", "Stick FORE ↑ (Analog)", 0, IDIT_BUTTON_ANALOG },
{ "stick_back", "Stick BACK ↓ (Analog)", 1, IDIT_BUTTON_ANALOG },
{ "throttle_down", "Throttle Down (Analog)", 5, IDIT_BUTTON_ANALOG },
{ "throttle_up", "Throttle Up (Analog)", 4, IDIT_BUTTON_ANALOG },
};
IDIISG IODevice_MissionNoAF_IDII =
{
// 0
{ "b", "B (Stick Left Button)", 6, IDIT_BUTTON },
{ "c", "C (Stick Right Button)", 8, IDIT_BUTTON },
{ "a", "A (Stick Trigger)", 7, IDIT_BUTTON },
{ "start", "START", 9, IDIT_BUTTON },
// 4
{ "z", "Z", 13, IDIT_BUTTON },
{ "y", "Y", 12, IDIT_BUTTON },
{ "x", "X", 11, IDIT_BUTTON },
{ "r", "R", 14, IDIT_BUTTON },
// 8
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ "l", "L", 10, IDIT_BUTTON },
// 12
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
// 16
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
// 20
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
// 24
{ "stick_left", "Stick LEFT ← (Analog)", 2, IDIT_BUTTON_ANALOG },
{ "stick_right", "Stick RIGHT → (Analog)", 3, IDIT_BUTTON_ANALOG },
{ "stick_fore", "Stick FORE ↑ (Analog)", 0, IDIT_BUTTON_ANALOG },
{ "stick_back", "Stick BACK ↓ (Analog)", 1, IDIT_BUTTON_ANALOG },
{ "throttle_down", "Throttle Down (Analog)", 5, IDIT_BUTTON_ANALOG },
{ "throttle_up", "Throttle Up (Analog)", 4, IDIT_BUTTON_ANALOG },
};
IDIISG IODevice_DualMission_IDII =
{
// 0
{ "b", "B (R Stick Left Button)", 15, IDIT_BUTTON },
{ "c", "C (R Stick Right Button)", 17, IDIT_BUTTON },
{ "a", "A (R Stick Trigger)", 16, IDIT_BUTTON },
{ "start", "START", 18, IDIT_BUTTON },
// 4
{ "z", "Z (L Stick Right Button)", 8, IDIT_BUTTON },
{ "y", "Y (L Stick Left Button)", 6, IDIT_BUTTON },
{ "x", "X (L Stick Trigger)", 7, IDIT_BUTTON },
{ "r", "R", 20, IDIT_BUTTON },
// 8
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ "l", "L", 19, IDIT_BUTTON },
// 12
IDIIS_Switch("afb", "B AF", 26, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afc", "C AF", 27, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afa", "A AF", 25, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
{ NULL, "empty", 0, IDIT_BUTTON },
// 16
IDIIS_Switch("afz", "Z AF", 23, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afy", "Y AF", 22, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afx", "X AF", 21, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
IDIIS_Switch("afr", "R AF", 28, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
// 20
IDIIS_Switch("afspeed", "Autofire Speed", 29, SpeedSwitchPositions, sizeof(SpeedSwitchPositions) / sizeof(SpeedSwitchPositions[0])),
IDIIS_Switch("afl", "L AF", 24, AFSwitchPositions, sizeof(AFSwitchPositions) / sizeof(AFSwitchPositions[0])),
// 24
{ "rstick_left", "R Stick LEFT ← (Analog)", 11, IDIT_BUTTON_ANALOG },
{ "rstick_right", "R Stick RIGHT → (Analog)", 12, IDIT_BUTTON_ANALOG },
{ "rstick_fore", "R Stick FORE ↑ (Analog)", 9, IDIT_BUTTON_ANALOG },
{ "rstick_back", "R Stick BACK ↓ (Analog)", 10, IDIT_BUTTON_ANALOG },
{ "rthrottle_down", "R Throttle Down (Analog)", 14, IDIT_BUTTON_ANALOG },
{ "rthrottle_up", "R Throttle Up (Analog)", 13, IDIT_BUTTON_ANALOG },
{ "lstick_left", "L Stick LEFT ← (Analog)", 2, IDIT_BUTTON_ANALOG },
{ "lstick_right", "L Stick RIGHT → (Analog)", 3, IDIT_BUTTON_ANALOG },
{ "lstick_fore", "L Stick FORE ↑ (Analog)", 0, IDIT_BUTTON_ANALOG },
{ "lstick_back", "L Stick BACK ↓ (Analog)", 1, IDIT_BUTTON_ANALOG },
{ "lthrottle_down", "L Throttle Down (Analog)", 5, IDIT_BUTTON_ANALOG },
{ "lthrottle_up", "L Throttle Up (Analog)", 4, IDIT_BUTTON_ANALOG },
};
}

View File

@ -0,0 +1,64 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* mission.h:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_MISSION_H
#define __MDFN_SS_INPUT_MISSION_H
namespace MDFN_IEN_SS
{
class IODevice_Mission final : public IODevice
{
public:
IODevice_Mission(const bool dual_) MDFN_COLD;
virtual ~IODevice_Mission() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
uint16 dbuttons;
uint16 afeswitches;
uint8 afspeed;
uint8 axes[2][3];
uint8 buffer[0x20];
uint8 data_out;
bool tl;
int8 phase;
uint8 afcounter;
bool afphase;
const bool dual;
};
extern IDIISG IODevice_Mission_IDII;
extern IDIISG IODevice_MissionNoAF_IDII;
extern IDIISG IODevice_DualMission_IDII;
}
#endif

143
waterbox/ss/input/mouse.cpp Normal file
View File

@ -0,0 +1,143 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* mouse.cpp:
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "mouse.h"
namespace MDFN_IEN_SS
{
IODevice_Mouse::IODevice_Mouse() : buttons(0)
{
}
IODevice_Mouse::~IODevice_Mouse()
{
}
void IODevice_Mouse::Power(void)
{
phase = -1;
tl = true;
data_out = 0x00;
accum_xdelta = 0;
accum_ydelta = 0;
}
void IODevice_Mouse::UpdateInput(const uint8* data, const int32 time_elapsed)
{
accum_xdelta += MDFN_de32lsb(&data[0]);
accum_ydelta -= MDFN_de32lsb(&data[4]);
buttons = data[8] & 0xF;
}
uint8 IODevice_Mouse::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
uint8 tmp;
if(smpc_out & 0x40)
{
if(smpc_out & 0x20)
{
if(!tl)
accum_xdelta = accum_ydelta = 0;
phase = -1;
tl = true;
data_out = 0x00;
}
else
{
if(tl)
tl = false;
}
}
else
{
if(phase < 0)
{
uint8 flags = 0;
if(accum_xdelta < 0)
flags |= 0x1;
if(accum_ydelta < 0)
flags |= 0x2;
if(accum_xdelta > 255 || accum_xdelta < -256)
{
flags |= 0x4;
accum_xdelta = (accum_xdelta < 0) ? -256 : 255;
}
if(accum_ydelta > 255 || accum_ydelta < -256)
{
flags |= 0x8;
accum_ydelta = (accum_ydelta < 0) ? -256 : 255;
}
buffer[0] = 0xB;
buffer[1] = 0xF;
buffer[2] = 0xF;
buffer[3] = flags;
buffer[4] = buttons;
buffer[5] = (accum_xdelta >> 4) & 0xF;
buffer[6] = (accum_xdelta >> 0) & 0xF;
buffer[7] = (accum_ydelta >> 4) & 0xF;
buffer[8] = (accum_ydelta >> 0) & 0xF;
for(int i = 9; i < 16; i++)
buffer[i] = buffer[8];
phase++;
}
if((bool)(smpc_out & 0x20) != tl)
{
phase = (phase + 1) & 0xF;
tl = !tl;
if(phase == 8)
accum_xdelta = accum_ydelta = 0;
}
data_out = buffer[phase];
}
tmp = (tl << 4) | data_out;
return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted);
}
IDIISG IODevice_Mouse_IDII =
{
{ "x_axis", "X Axis", -1, IDIT_X_AXIS_REL },
{ "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL },
{ "left", "Left Button", 0, IDIT_BUTTON },
{ "right", "Right Button", 2, IDIT_BUTTON },
{ "middle", "Middle Button", 1, IDIT_BUTTON },
{ "start", "Start", 3, IDIT_BUTTON },
};
}

55
waterbox/ss/input/mouse.h Normal file
View File

@ -0,0 +1,55 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* mouse.h:
** Copyright (C) 2016-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_MOUSE_H
#define __MDFN_SS_INPUT_MOUSE_H
namespace MDFN_IEN_SS
{
class IODevice_Mouse final : public IODevice
{
public:
IODevice_Mouse() MDFN_COLD;
virtual ~IODevice_Mouse() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
int32 accum_xdelta;
int32 accum_ydelta;
uint8 buttons;
uint8 buffer[0x10];
uint8 data_out;
bool tl;
int8 phase;
};
extern IDIISG IODevice_Mouse_IDII;
}
#endif

View File

@ -0,0 +1,209 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* multitap.cpp:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "multitap.h"
namespace MDFN_IEN_SS
{
IODevice_Multitap::IODevice_Multitap()
{
}
IODevice_Multitap::~IODevice_Multitap()
{
}
void IODevice_Multitap::Power(void)
{
phase = -2;
tl = true;
data_out = 0x01;
memset(tmp, 0x00, sizeof(tmp));
id1 = 0;
id2 = 0;
port_counter = 0;
read_counter = 0;
for(unsigned i = 0; i < 6; i++)
{
if(devices[i])
{
sub_state[i] = 0x60;
devices[i]->UpdateBus(sub_state[i], 0x60);
devices[i]->Power();
}
}
}
void IODevice_Multitap::SetSubDevice(unsigned sub_index, IODevice* device)
{
assert(sub_index < 6);
devices[sub_index] = device;
devices[sub_index]->UpdateBus(sub_state[sub_index], 0x60);
}
IODevice* IODevice_Multitap::GetSubDevice(unsigned sub_index)
{
assert(sub_index < 6);
return devices[sub_index];
}
enum { PhaseBias = __COUNTER__ + 1 };
#define WAIT_UNTIL(cond) { \
case __COUNTER__: \
if(!(cond)) \
{ \
phase = __COUNTER__ - PhaseBias - 1; \
goto BreakOut; \
} \
}
#define WR_NYB(v) { WAIT_UNTIL((bool)(smpc_out & 0x20) != tl); data_out = (v) & 0xF; tl = !tl; }
INLINE uint8 IODevice_Multitap::UASB(void)
{
return devices[port_counter]->UpdateBus(sub_state[port_counter], 0x60);
}
uint8 IODevice_Multitap::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
if(smpc_out & 0x40)
{
phase = -1;
tl = true;
data_out = 0x01;
}
else
{
switch(phase + PhaseBias)
{
for(;;)
{
default:
case __COUNTER__:
WAIT_UNTIL(phase == -1);
WR_NYB(0x4);
WR_NYB(0x1);
WR_NYB(0x6);
WR_NYB(0x0);
//
//
port_counter = 0;
do
{
sub_state[port_counter] = 0x60;
UASB();
// ...
tmp[0] = UASB();
id1 = ((((tmp[0] >> 3) | (tmp[0] >> 2)) & 1) << 3) | ((((tmp[0] >> 1) | (tmp[0] >> 0)) & 1) << 2);
sub_state[port_counter] = 0x20;
UASB();
// ...
tmp[1] = UASB();
id1 |= ((((tmp[1] >> 3) | (tmp[1] >> 2)) & 1) << 1) | ((((tmp[1] >> 1) | (tmp[1] >> 0)) & 1) << 0);
//printf("%d, %01x\n", port_counter, id1);
if(id1 == 0xB) // Digital pad
{
WR_NYB(0x0);
WR_NYB(0x2);
sub_state[port_counter] = 0x40;
UASB();
WR_NYB(tmp[1] & 0xF);
tmp[2] = UASB();
sub_state[port_counter] = 0x00;
UASB();
WR_NYB(tmp[2] & 0xF);
tmp[3] = UASB();
WR_NYB(tmp[3] & 0xF);
WR_NYB((tmp[0] & 0xF) | 0x7);
}
else if(id1 == 0x3 || id1 == 0x5) // Analog
{
sub_state[port_counter] = 0x00;
WAIT_UNTIL(!(UASB() & 0x10));
id2 = ((UASB() & 0xF) << 4);
sub_state[port_counter] = 0x20;
WAIT_UNTIL(UASB() & 0x10);
id2 |= ((UASB() & 0xF) << 0);
if(id1 == 0x3)
id2 = 0xE3;
WR_NYB(id2 >> 4);
WR_NYB(id2 >> 0);
read_counter = 0;
while(read_counter < (id2 & 0xF))
{
sub_state[port_counter] = 0x00;
WAIT_UNTIL(!(UASB() & 0x10));
WR_NYB(UASB() & 0xF);
sub_state[port_counter] = 0x20;
WAIT_UNTIL(UASB() & 0x10);
WR_NYB(UASB() & 0xF);
read_counter++;
}
}
else
{
WR_NYB(0xF);
WR_NYB(0xF);
}
sub_state[port_counter] = 0x60;
UASB();
} while(++port_counter < 6);
//
//
WR_NYB(0x0);
WR_NYB(0x1);
}
}
}
BreakOut:;
return (smpc_out & (smpc_out_asserted | 0xE0)) | (((tl << 4) | data_out) &~ smpc_out_asserted);
}
}

View File

@ -0,0 +1,59 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* multitap.h:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_MULTITAP_H
#define __MDFN_SS_INPUT_MULTITAP_H
namespace MDFN_IEN_SS
{
class IODevice_Multitap final : public IODevice
{
public:
IODevice_Multitap() MDFN_COLD;
virtual ~IODevice_Multitap() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
void SetSubDevice(unsigned sub_index, IODevice* device);
IODevice* GetSubDevice(unsigned sub_index);
private:
uint8 UASB(void);
IODevice* devices[6];
uint8 sub_state[6];
uint8 tmp[4];
uint8 id1;
uint8 id2;
uint8 data_out;
bool tl;
int32 phase;
uint8 port_counter;
uint8 read_counter;
};
}
#endif

141
waterbox/ss/input/wheel.cpp Normal file
View File

@ -0,0 +1,141 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* wheel.cpp:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "wheel.h"
namespace MDFN_IEN_SS
{
IODevice_Wheel::IODevice_Wheel() : dbuttons(0)
{
}
IODevice_Wheel::~IODevice_Wheel()
{
}
void IODevice_Wheel::Power(void)
{
phase = -1;
tl = true;
data_out = 0x01;
}
void IODevice_Wheel::UpdateInput(const uint8* data, const int32 time_elapsed)
{
dbuttons = (dbuttons & 0xC) | (MDFN_de16lsb(&data[0]) & 0x07F3);
//
{
int32 tmp = 32767 + MDFN_de16lsb(&data[0x2 + 2]) - MDFN_de16lsb(&data[0x2 + 0]);
wheel = 1 + tmp * 253 / 65534;
if(wheel >= 0x6F)
dbuttons &= ~0x4;
else if(wheel <= 0x67)
dbuttons |= 0x4;
if(wheel <= 0x8F)
dbuttons &= ~0x8;
else if(wheel >= 0x97)
dbuttons |= 0x8;
}
}
uint8 IODevice_Wheel::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted)
{
uint8 tmp;
if(smpc_out & 0x40)
{
phase = -1;
tl = true;
data_out = 0x01;
}
else
{
if((bool)(smpc_out & 0x20) != tl)
{
if(phase < 0)
{
buffer[ 0] = 0x1;
buffer[ 1] = 0x3;
buffer[ 2] = (((dbuttons >> 0) & 0xF) ^ 0xF);
buffer[ 3] = (((dbuttons >> 4) & 0xF) ^ 0xF);
buffer[ 4] = (((dbuttons >> 8) & 0xF) ^ 0xF);
buffer[ 5] = (((dbuttons >> 12) & 0xF) ^ 0xF);
buffer[ 6] = ((wheel >> 4) & 0xF);
buffer[ 7] = ((wheel >> 0) & 0xF);
buffer[ 8] = 0x0;
buffer[ 9] = 0x1;
buffer[10] = 0x1;
buffer[11] = ((wheel >> 0) & 0xF);
buffer[12] = 0x0;
buffer[13] = 0x1;
buffer[14] = 0x1;
buffer[15] = 0x1;
}
phase = (phase + 1) & 0xF;
data_out = buffer[phase];
tl = !tl;
}
}
tmp = (tl << 4) | data_out;
return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted);
}
IDIISG IODevice_Wheel_IDII =
{
{ "up", "L Gear Shift(Equiv. UP ↑)", 2, IDIT_BUTTON, "down" },
{ "down", "R Gear Shift(Equiv. DOWN ↓)", 3, IDIT_BUTTON, "up" },
{ NULL, "empty", 0, IDIT_BUTTON }, // left
{ NULL, "empty", 0, IDIT_BUTTON }, // right
{ "b", "B (R Group)", 9, IDIT_BUTTON },
{ "c", "C (R Group)", 10, IDIT_BUTTON },
{ "a", "A (R Group)", 8, IDIT_BUTTON },
{ "start", "START", 7, IDIT_BUTTON },
{ "z", "Z (L Group)", 4, IDIT_BUTTON },
{ "y", "Y (L Group)", 5, IDIT_BUTTON },
{ "x", "X (L Group)", 6, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ NULL, "empty", 0, IDIT_BUTTON },
{ "analog_left", "Analog LEFT ←", 0, IDIT_BUTTON_ANALOG },
{ "analog_right", "Analog RIGHT →", 1, IDIT_BUTTON_ANALOG },
};
}

54
waterbox/ss/input/wheel.h Normal file
View File

@ -0,0 +1,54 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* wheel.h:
** Copyright (C) 2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_INPUT_WHEEL_H
#define __MDFN_SS_INPUT_WHEEL_H
namespace MDFN_IEN_SS
{
class IODevice_Wheel final : public IODevice
{
public:
IODevice_Wheel() MDFN_COLD;
virtual ~IODevice_Wheel() override MDFN_COLD;
virtual void Power(void) override MDFN_COLD;
virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override;
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override;
private:
uint16 dbuttons;
uint8 wheel;
uint8 buffer[0x10];
uint8 data_out;
bool tl;
int8 phase;
};
extern IDIISG IODevice_Wheel_IDII;
}
#endif

2295
waterbox/ss/m68k/m68k.cpp Normal file

File diff suppressed because it is too large Load Diff

492
waterbox/ss/m68k/m68k.h Normal file
View File

@ -0,0 +1,492 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* m68k.h - Motorola 68000 CPU Emulator
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_M68K_H
#define __MDFN_M68K_H
#include "ss.h"
class M68K
{
public:
M68K(const bool rev_e = false) MDFN_COLD;
~M68K() MDFN_COLD;
void Run(int32 run_until_time);
void Step(void);
void Reset(bool powering_up) MDFN_COLD;
void SetIPL(uint8 ipl_new);
void SetExtHalted(bool state);
//
//
//
//
//
//
//
//
union
{
uint32 DA[16];
struct
{
uint32 D[8];
uint32 A[8];
};
};
int32 timestamp;
uint32 PC;
uint8 SRHB;
uint8 IPL;
bool Flag_Z, Flag_N;
bool Flag_X, Flag_C, Flag_V;
uint32 SP_Inactive;
uint32 XPending;
enum
{
XPENDING_MASK_INT = 0x0001,
XPENDING_MASK_NMI = 0x0002,
XPENDING_MASK_RESET = 0x0010,
XPENDING_MASK_STOPPED = 0x0100, // via STOP instruction
XPENDING_MASK_EXTHALTED= 0x1000
};
const bool Revision_E;
//private:
void RecalcInt(void);
template<typename T>
T Read(uint32 addr);
uint16 ReadOp(void);
template<typename T, bool long_dec = false>
void Write(uint32 addr, const T val);
template<typename T>
void Push(const T value);
template<typename T>
T Pull(void);
enum AddressMode
{
DATA_REG_DIR,
ADDR_REG_DIR,
ADDR_REG_INDIR,
ADDR_REG_INDIR_POST,
ADDR_REG_INDIR_PRE,
ADDR_REG_INDIR_DISP,
ADDR_REG_INDIR_INDX,
ABS_SHORT,
ABS_LONG,
PC_DISP,
PC_INDEX,
IMMEDIATE
};
//
// MOVE byte and word: instructions, 2 cycle penalty for source predecrement only
// 2 cycle penalty for (d8, An, Xn) for both source and dest ams
// 2 cycle penalty for (d8, PC, Xn) for dest am
//
//
// Careful on declaration order of HAM objects(needs to be source then dest).
//
template<typename T, M68K::AddressMode am>
struct HAM;
void SetC(bool val);
void SetV(bool val);
void SetZ(bool val);
void SetN(bool val);
void SetX(bool val);
bool GetC(void);
bool GetV(void);
bool GetZ(void);
bool GetN(void);
bool GetX(void);
void SetCX(bool val);
template<typename T, bool Z_OnlyClear = false>
void CalcZN(const T val);
template<typename T>
void CalcCX(const uint64& val);
uint8 GetCCR(void);
void SetCCR(uint8 val);
uint16 GetSR(void);
void SetSR(uint16 val);
uint8 GetIMask(void);
void SetIMask(uint8 val);
bool GetSVisor(void);
void SetSVisor(bool value);
bool GetTrace(void);
void SetTrace(bool value);
//
//
//
enum
{
VECNUM_RESET_SSP = 0,
VECNUM_RESET_PC = 1,
VECNUM_BUS_ERROR = 2,
VECNUM_ADDRESS_ERROR = 3,
VECNUM_ILLEGAL = 4,
VECNUM_ZERO_DIVIDE = 5,
VECNUM_CHK = 6,
VECNUM_TRAPV = 7,
VECNUM_PRIVILEGE = 8,
VECNUM_TRACE = 9,
VECNUM_LINEA = 10,
VECNUM_LINEF = 11,
VECNUM_UNINI_INT = 15,
VECNUM_SPURIOUS_INT = 24,
VECNUM_INT_BASE = 24,
VECNUM_TRAP_BASE = 32
};
enum
{
EXCEPTION_RESET = 0,
EXCEPTION_BUS_ERROR,
EXCEPTION_ADDRESS_ERROR,
EXCEPTION_ILLEGAL,
EXCEPTION_ZERO_DIVIDE,
EXCEPTION_CHK,
EXCEPTION_TRAPV,
EXCEPTION_PRIVILEGE,
EXCEPTION_TRACE,
EXCEPTION_INT,
EXCEPTION_TRAP
};
void NO_INLINE Exception(unsigned which, unsigned vecnum);
template<typename T, typename DT, M68K::AddressMode SAM, M68K::AddressMode DAM>
void ADD(HAM<T, SAM> &src, HAM<DT, DAM> &dst);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void ADDX(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<bool X_form, typename T, typename DT, M68K::AddressMode SAM, M68K::AddressMode DAM>
DT Subtract(HAM<T, SAM> &src, HAM<DT, DAM> &dst);
template<typename T, typename DT, M68K::AddressMode SAM, M68K::AddressMode DAM>
void SUB(HAM<T, SAM> &src, HAM<DT, DAM> &dst);
template<typename T, typename DT, M68K::AddressMode SAM, M68K::AddressMode DAM>
void SUBX(HAM<T, SAM> &src, HAM<DT, DAM> &dst);
template<typename DT, M68K::AddressMode DAM>
void NEG(HAM<DT, DAM> &dst);
template<typename DT, M68K::AddressMode DAM>
void NEGX(HAM<DT, DAM> &dst);
template<typename T, typename DT, M68K::AddressMode SAM, M68K::AddressMode DAM>
void CMP(HAM<T, SAM> &src, HAM<DT, DAM> &dst);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void CHK(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void OR(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void EOR(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void AND(HAM<T, SAM> &src, HAM<T, DAM> &dst);
void ORI_CCR(void);
void ORI_SR(void);
void ANDI_CCR(void);
void ANDI_SR(void);
void EORI_CCR(void);
void EORI_SR(void);
template<typename T, M68K::AddressMode SAM>
void MULU(HAM<T, SAM> &src, const unsigned dr);
template<typename T, M68K::AddressMode SAM>
void MULS(HAM<T, SAM> &src, const unsigned dr);
template<bool sdiv>
void Divide(uint16 divisor, const unsigned dr);
template<typename T, M68K::AddressMode SAM>
void DIVU(HAM<T, SAM> &src, const unsigned dr);
template<typename T, M68K::AddressMode SAM>
void DIVS(HAM<T, SAM> &src, const unsigned dr);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void ABCD(HAM<T, SAM> &src, HAM<T, DAM> &dst);
uint8 DecimalSubtractX(const uint8 src_data, const uint8 dst_data);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void SBCD(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode DAM>
void NBCD(HAM<T, DAM> &dst);
template<typename T, bool reg_to_mem>
void MOVEP(const unsigned ar, const unsigned dr);
template<typename T, M68K::AddressMode TAM>
void BTST(HAM<T, TAM> &targ, unsigned wb);
template<typename T, M68K::AddressMode TAM>
void BCHG(HAM<T, TAM> &targ, unsigned wb);
template<typename T, M68K::AddressMode TAM>
void BCLR(HAM<T, TAM> &targ, unsigned wb);
template<typename T, M68K::AddressMode TAM>
void BSET(HAM<T, TAM> &targ, unsigned wb);
template<typename T, M68K::AddressMode SAM, M68K::AddressMode DAM>
void MOVE(HAM<T, SAM> &src, HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode SAM>
void MOVEA(HAM<T, SAM> &src, const unsigned ar);
template<bool pseudo_predec, typename T, M68K::AddressMode DAM>
void MOVEM_to_MEM(const uint16 reglist, HAM<T, DAM> &dst);
template<bool pseudo_postinc, typename T, M68K::AddressMode SAM>
void MOVEM_to_REGS(HAM<T, SAM> &src, const uint16 reglist);
template<typename T, M68K::AddressMode TAM, bool Arithmetic, bool ShiftLeft>
void ShiftBase(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ASL(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ASR(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void LSL(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void LSR(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM, bool X_Form, bool ShiftLeft>
void RotateBase(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ROL(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ROR(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ROXL(HAM<T, TAM> &targ, unsigned count);
template<typename T, M68K::AddressMode TAM>
void ROXR(HAM<T, TAM> &targ, unsigned count);
#if 0
static uint8 TAS_Callback(uint8 data)
{
CalcZN<uint8>(data);
SetC(false);
SetV(false);
data |= 0x80;
return data;
}
#endif
template<typename T, M68K::AddressMode DAM>
void TAS(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode DAM>
void TST(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode DAM>
void CLR(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode DAM>
void NOT(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode DAM>
void EXT(HAM<T, DAM> &dst);
void SWAP(const unsigned dr);
void EXG(uint32* a, uint32* b);
template<unsigned cc>
bool TestCond(void);
template<unsigned cc>
void Bxx(uint32 disp);
template<unsigned cc>
void DBcc(const unsigned dr);
template<unsigned cc, typename T, M68K::AddressMode DAM>
void Scc(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode TAM>
void JSR(HAM<T, TAM> &targ);
template<typename T, M68K::AddressMode TAM>
void JMP(HAM<T, TAM> &targ);
template <typename T, M68K::AddressMode DAM>
void MOVE_from_SR(HAM<T, DAM> &dst);
template<typename T, M68K::AddressMode SAM>
void MOVE_to_CCR(HAM<T, SAM> &src);
template<typename T, M68K::AddressMode SAM>
void MOVE_to_SR(HAM<T, SAM> &src);
template<bool direction>
void MOVE_USP(const unsigned ar);
template<typename T, M68K::AddressMode SAM>
void LEA(HAM<T, SAM> &src, const unsigned ar);
template<typename T, M68K::AddressMode SAM>
void PEA(HAM<T, SAM> &src);
void UNLK(const unsigned ar);
void LINK(const unsigned ar);
void RTE(void);
void RTR(void);
void RTS(void);
void TRAP(const unsigned vf);
void TRAPV(void);
void ILLEGAL(const uint16 instr);
void LINEA(void);
void LINEF(void);
void NOP(void);
void RESET(void);
void STOP(void);
bool CheckPrivilege(void);
void InternalStep(void);
//
//
//
//
//
// These externally-provided functions should add >= 4 to M68K::timestamp per call:
enum { BUS_INT_ACK_AUTO = -1 };
uint16 (MDFN_FASTCALL *BusReadInstr)(uint32 A);
uint8 (MDFN_FASTCALL *BusRead8)(uint32 A);
uint16 (MDFN_FASTCALL *BusRead16)(uint32 A);
void (MDFN_FASTCALL *BusWrite8)(uint32 A, uint8 V);
void (MDFN_FASTCALL *BusWrite16)(uint32 A, uint16 V);
//
//
void (MDFN_FASTCALL *BusRMW)(uint32 A, uint8 (MDFN_FASTCALL *cb)(M68K*, uint8));
unsigned (MDFN_FASTCALL *BusIntAck)(uint8 level);
void (MDFN_FASTCALL *BusRESET)(bool state); // Optional; Calling Reset(false) from this callback *is* permitted.
//
//
//
void (*DBG_Warning)(const char* format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2);
void (*DBG_Verbose)(const char* format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2);
//
//
//
public:
enum
{
GSREG_D0 = 0,
GSREG_D1,
GSREG_D2,
GSREG_D3,
GSREG_D4,
GSREG_D5,
GSREG_D6,
GSREG_D7,
GSREG_A0 = 8,
GSREG_A1,
GSREG_A2,
GSREG_A3,
GSREG_A4,
GSREG_A5,
GSREG_A6,
GSREG_A7,
GSREG_PC = 16,
GSREG_SR,
GSREG_SSP,
GSREG_USP
};
uint32 GetRegister(unsigned which, char* special = nullptr, const uint32 special_len = 0);
void SetRegister(unsigned which, uint32 value);
INLINE void DupeState(const M68K* const src)
{
memcpy(DA, src->DA, 16 * sizeof(uint32));
timestamp = src->timestamp;
PC = src->PC;
SRHB = src->SRHB;
IPL = src->IPL;
Flag_Z = src->Flag_Z;
Flag_N = src->Flag_N;
Flag_X = src->Flag_X;
Flag_C = src->Flag_C;
Flag_V = src->Flag_V;
SP_Inactive = src->SP_Inactive;
XPending = src->XPending;
}
};
#endif

File diff suppressed because it is too large Load Diff

278
waterbox/ss/math_ops.h Normal file
View File

@ -0,0 +1,278 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* math_ops.h:
** Copyright (C) 2007-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*
** Some ideas from:
** blargg
** http://graphics.stanford.edu/~seander/bithacks.html
*/
#ifndef __MDFN_MATH_OPS_H
#define __MDFN_MATH_OPS_H
#if defined(_MSC_VER)
#include <intrin.h>
#endif
static INLINE unsigned MDFN_lzcount16_0UD(uint16 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return 15 ^ 31 ^ __builtin_clz(v);
#elif defined(_MSC_VER)
unsigned long idx;
_BitScanReverse(&idx, v);
return 15 ^ idx;
#else
unsigned ret = 0;
unsigned tmp;
tmp = !(v & 0xFF00) << 3; v <<= tmp; ret += tmp;
tmp = !(v & 0xF000) << 2; v <<= tmp; ret += tmp;
tmp = !(v & 0xC000) << 1; v <<= tmp; ret += tmp;
tmp = !(v & 0x8000) << 0; ret += tmp;
return(ret);
#endif
}
static INLINE unsigned MDFN_lzcount32_0UD(uint32 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return __builtin_clz(v);
#elif defined(_MSC_VER)
unsigned long idx;
_BitScanReverse(&idx, v);
return 31 ^ idx;
#else
unsigned ret = 0;
unsigned tmp;
tmp = !(v & 0xFFFF0000) << 4; v <<= tmp; ret += tmp;
tmp = !(v & 0xFF000000) << 3; v <<= tmp; ret += tmp;
tmp = !(v & 0xF0000000) << 2; v <<= tmp; ret += tmp;
tmp = !(v & 0xC0000000) << 1; v <<= tmp; ret += tmp;
tmp = !(v & 0x80000000) << 0; ret += tmp;
return(ret);
#endif
}
static INLINE unsigned MDFN_lzcount64_0UD(uint64 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return __builtin_clzll(v);
#elif defined(_MSC_VER)
#if defined(_WIN64)
unsigned long idx;
_BitScanReverse64(&idx, v);
return 63 ^ idx;
#else
unsigned long idx0;
unsigned long idx1;
_BitScanReverse(&idx1, v >> 0);
idx1 -= 32;
if(!_BitScanReverse(&idx0, v >> 32))
idx0 = idx1;
idx0 += 32;
return 63 ^ idx0;
#endif
#else
unsigned ret = 0;
unsigned tmp;
tmp = !(v & 0xFFFFFFFF00000000ULL) << 5; v <<= tmp; ret += tmp;
tmp = !(v & 0xFFFF000000000000ULL) << 4; v <<= tmp; ret += tmp;
tmp = !(v & 0xFF00000000000000ULL) << 3; v <<= tmp; ret += tmp;
tmp = !(v & 0xF000000000000000ULL) << 2; v <<= tmp; ret += tmp;
tmp = !(v & 0xC000000000000000ULL) << 1; v <<= tmp; ret += tmp;
tmp = !(v & 0x8000000000000000ULL) << 0; ret += tmp;
return(ret);
#endif
}
static INLINE unsigned MDFN_tzcount16_0UD(uint16 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return __builtin_ctz(v);
#elif defined(_MSC_VER)
unsigned long idx;
_BitScanForward(&idx, v);
return idx;
#else
unsigned ret = 0;
unsigned tmp;
tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp;
tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp;
tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp;
tmp = !(v & 0x0001) << 0; ret += tmp;
return ret;
#endif
}
static INLINE unsigned MDFN_tzcount32_0UD(uint32 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return __builtin_ctz(v);
#elif defined(_MSC_VER)
unsigned long idx;
_BitScanForward(&idx, v);
return idx;
#else
unsigned ret = 0;
unsigned tmp;
tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp;
tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp;
tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp;
tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp;
tmp = !(v & 0x0001) << 0; ret += tmp;
return ret;
#endif
}
static INLINE unsigned MDFN_tzcount64_0UD(uint64 v)
{
#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER)
return __builtin_ctzll(v);
#elif defined(_MSC_VER)
#if defined(_WIN64)
unsigned long idx;
_BitScanForward64(&idx, v);
return idx;
#else
unsigned long idx0, idx1;
_BitScanForward(&idx1, v >> 32);
idx1 += 32;
if(!_BitScanForward(&idx0, v))
idx0 = idx1;
return idx0;
#endif
#else
unsigned ret = 0;
unsigned tmp;
tmp = !((uint32)v) << 5; v >>= tmp; ret += tmp;
tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp;
tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp;
tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp;
tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp;
tmp = !(v & 0x0001) << 0; ret += tmp;
return ret;
#endif
}
//
// Result is defined for all possible inputs(including 0).
//
static INLINE unsigned MDFN_lzcount16(uint16 v) { return !v ? 16 : MDFN_lzcount16_0UD(v); }
static INLINE unsigned MDFN_lzcount32(uint32 v) { return !v ? 32 : MDFN_lzcount32_0UD(v); }
static INLINE unsigned MDFN_lzcount64(uint64 v) { return !v ? 64 : MDFN_lzcount64_0UD(v); }
static INLINE unsigned MDFN_tzcount16(uint16 v) { return !v ? 16 : MDFN_tzcount16_0UD(v); }
static INLINE unsigned MDFN_tzcount32(uint32 v) { return !v ? 32 : MDFN_tzcount32_0UD(v); }
static INLINE unsigned MDFN_tzcount64(uint64 v) { return !v ? 64 : MDFN_tzcount64_0UD(v); }
static INLINE unsigned MDFN_log2(uint32 v) { return 31 ^ MDFN_lzcount32_0UD(v | 1); }
static INLINE unsigned MDFN_log2(uint64 v) { return 63 ^ MDFN_lzcount64_0UD(v | 1); }
static INLINE unsigned MDFN_log2(int32 v) { return MDFN_log2((uint32)v); }
static INLINE unsigned MDFN_log2(int64 v) { return MDFN_log2((uint64)v); }
// Rounds up to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules).
// Returns 0 on overflow.
static INLINE uint64 round_up_pow2(uint32 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); }
static INLINE uint64 round_up_pow2(uint64 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); }
static INLINE uint64 round_up_pow2(int32 v) { return round_up_pow2((uint32)v); }
static INLINE uint64 round_up_pow2(int64 v) { return round_up_pow2((uint64)v); }
// Rounds to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules).
static INLINE uint64 round_nearest_pow2(uint32 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); }
static INLINE uint64 round_nearest_pow2(uint64 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); }
static INLINE uint64 round_nearest_pow2(int32 v, bool round_half_up = true) { return round_nearest_pow2((uint32)v, round_half_up); }
static INLINE uint64 round_nearest_pow2(int64 v, bool round_half_up = true) { return round_nearest_pow2((uint64)v, round_half_up); }
// Some compilers' optimizers and some platforms might fubar the generated code from these macros,
// so some tests are run in...tests.cpp
#define sign_8_to_s16(_value) ((int16)(int8)(_value))
#define sign_9_to_s16(_value) (((int16)((unsigned int)(_value) << 7)) >> 7)
#define sign_10_to_s16(_value) (((int16)((uint32)(_value) << 6)) >> 6)
#define sign_11_to_s16(_value) (((int16)((uint32)(_value) << 5)) >> 5)
#define sign_12_to_s16(_value) (((int16)((uint32)(_value) << 4)) >> 4)
#define sign_13_to_s16(_value) (((int16)((uint32)(_value) << 3)) >> 3)
#define sign_14_to_s16(_value) (((int16)((uint32)(_value) << 2)) >> 2)
#define sign_15_to_s16(_value) (((int16)((uint32)(_value) << 1)) >> 1)
// This obviously won't convert higher-than-32 bit numbers to signed 32-bit ;)
// Also, this shouldn't be used for 8-bit and 16-bit signed numbers, since you can
// convert those faster with typecasts...
#define sign_x_to_s32(_bits, _value) (((int32)((uint32)(_value) << (32 - _bits))) >> (32 - _bits))
static INLINE int32 clamp_to_u8(int32 i)
{
if(i & 0xFFFFFF00)
i = (((~i) >> 30) & 0xFF);
return(i);
}
static INLINE int32 clamp_to_u16(int32 i)
{
if(i & 0xFFFF0000)
i = (((~i) >> 31) & 0xFFFF);
return(i);
}
template<typename T, typename U, typename V> static INLINE void clamp(T *val, U minimum, V maximum)
{
if(*val < minimum)
{
//printf("Warning: clamping to minimum(%d)\n", (int)minimum);
*val = minimum;
}
if(*val > maximum)
{
//printf("Warning: clamping to maximum(%d)\n", (int)maximum);
*val = maximum;
}
}
#endif

View File

@ -0,0 +1,8 @@
M68000 Programmer's Reference Manual fifth edition (M68000UM/AD REV 4) (ISBN 0-13-541491-1)
M68000 User's Manual Eighth Edition (M68000UM/AD REV 7) (ISBN 0-13-541665-5)
http://bitsavers.informatik.uni-stuttgart.de/pdf/hitachi/superH/
http://ppcenter.webou.net/satcart/
http://dreamjam.co.uk/emuviews/saturn.php
http://koti.kapsi.fi/~antime/sega/
http://wiki.yabause.org/index.php5?title=CDBlock

180
waterbox/ss/notes/games.txt Normal file
View File

@ -0,0 +1,180 @@
GunBlaze-S:
Game does an excessively-large SCU DMA that runs off the end of VDP1 VRAM and into the VDP1 register area, causing the registers to be
overwritten with (what looks like) garbage.
Pocket Fighter - Interrupt handler interrupting other interrupt handler in the middle of a read,modify,write sequence of instructions. Same sort of issue as
Street Fighter Alpha 2.
16-bits var at 0x60443E2
INT42->
0x600D7C4
0x600D7D0
INT41->
0x600D738 (writes 0)
Independence Day
Batman Forever - Corrupt batmobile graphic during intro(timing issue maybe?).
Ultimate Mortal Kombat 3 - Major issues and no sound after defeating first opponent.
Panzer Dragon II - Quasi-illegal window settings.
Panzer Dragon Saga - Quasi-illegal window settings.
All-Star Baseball 97 - VDP1 glitchy issues
Space Jam
Langrisser V - Really sensitive about SMPC timing during startup apparently...
Street Fighter Alpha 2 -
Line counter @ 0x6050C2E
0 written to 0x6050C2E in VB Out irq handler @ PC=0x600F374
VB Out IRQ sometimes happens between PC 0x600F40E and 0x600F414...
Christmas Nights - Precision-related VDP1 bug, leading to horribly stretched something or another.
Magical Drop III - Missing intro graphics.
Golden Axe The Duel - Flickering title screen
Routine at PC=0x6093DA8, checks byte at 0x607D55C, and if != 0x1, skips writing...
@0x607423C = 0x8001 PC = 0x6093DC4
@0x607411C = 0x0001
@0x607D55C written at PC=0x60910DC
X-Men vs. Street Fighter - Sometimes locks up if skipping Capcom intro movie.
Thunderhawk II - Hangs reading from 25D00010, waiting for bit1 to be 1
Cyberbots - VDP1 timing issue. Hangs during startup.
Lunar - FMV issues(timing-related; DMA is a bit too fast), @PC=0x60D7C24
Nissan Presents Over Drivin' GT-R - SMPC problems
Break Point - Fails to boot.
Time Bokan - Freezes a few minutes into gameplay.
[M68K] Exception 9(vec=26) @PC=0x00001ae0 SR=0x2008 ---> PC=0x0000177a, SR=0x2208
[M68K] Exception 9(vec=26) @PC=0x00001ae4 SR=0x2000 ---> PC=0x0000177a, SR=0x2200
[M68K] Exception 9(vec=26) @PC=0x00001ae4 SR=0x2000 ---> PC=0x0000177a, SR=0x2200
[M68K] Exception 9(vec=26) @PC=0x00001af6 SR=0x2008 ---> PC=0x0000177a, SR=0x2208
Falcom Classics II - Ys 2 sometimes freezes during startup.
Virtua Fighter Kids - Wonky FMV.
data @ 0x60435B8 0x60435C0 -- 0x6043318
0x060CAAA2
0x060CAAE4
code @ 0x60CA1C6
PC=0x60BA1D2
x inc 0x060FFD38
(312,gbr)
Writes to 0x25F80000:
PC=0x20000572 (clock change?)
PC=0x06030AB6
Virtua Cop - Flickery 3D
Image Fight - uses RBG0 and RBG1 simultaneously during gameplay
Shienryu - VDP1 output rotation probably.
Taito Chase HQ - Indexes
Zero Divide: Bad DMAs?
----------------------------------------------------------
0x060FFC13 (@19,GBR) - SynchCount?
0x060FFCB0 (@176, GBR) - Resolution/screen mode?
Tilk Aoi Umi kara Kita Shoujo
Zero4 Champ
Yuukyuu Gensoukyoku (Japan)
Yuukyuu no Kobako Official Collection (Japan)
SD Gundam Century S - similar issue to Super Tempo?
Real Sound Kaze no Regret - similar issue to Super Tempo?
Super Tempo - mov.b @(19,gbr), r0 ... 0x060FFC13
Function pointer of some sort @ 0x60FFFCC
PC=0x0602C228: 0x0100 -> 0x060FFC12
PC=0x06020D0A: 0x5 -> 0x060FFC13
PC=0x06021CB8: 0x0 -> 0x060FFC13 (@0x060FFC12 - 1)
INT41:
PC=0x0602C174: 0x1 -> 0x060FFC13 (((@0x60FFCB0) & 0x10) >> 4) + 1)
PC=0x0602C184: 0x0 -> 0x060FFC13 (@0x060FFC13 - 1)
Break out of cmp/pz loop manually:
PC=0x06021DAE: 0x1 -> 0x060FFC13
What we want...(maybe)...or maybe we need INT4A
PC=0x0602C132 (branch taken)
PC=0x0602C17C
@0x06021CB8 mov.b r0,@(19,gbr)
Entry point: 0x6021CAC
Slave:
@PC=0x0602AB00: first read from 0xFFFFFE11
FTI by master @PC=0x0602C6A4
FTI by master @PC=0x06020CF0
FTI by master @PC=0x06021CDE
@PC=0x0602BB7A: read from 0xFFFFFE11
PC=0x06000600: slave entry
--------------------------------------------------------
Virtua Fighter spams SCU DMAs...
TODO: check SCU write throughput for sparse writes.
Resident Evil - Probably IM related. Fighting Vipers too
-----------------------
Alone in the Dark
Mr. Bones - PC= 25788C - other: 256D8C ... jumps to 0xC0000064?
Sega Saturn Choice Cuts - hangs on skipping video, hangs on playing video later.
Marvel Super Heroes vs. Street Fighter - Goes back to CD screen after winning battle?
-------------------
-------------------------------------
Probably vblank signal issue for a lot of these...
Arcade's Greatest Hits - Locks up near Digital Eclipse video.
Baku Baku - 600091A, Timer0 triggers an IRQ when the software isn't ready?
Father Christmas - icache or CPU timing related probably
Doom - Sound effect positioning seems off.
NBA Jam Extreme - [M68K] Exception 3 @PC=0x0000088e SR=0x2700 ---> PC=0x0000029e, SR=0x2700
Whizz - CDB?
Tenchi Muyou! Ryououki Gokuraku - CDB issues?
Layer Section - Gets confused and misprograms the CDB?
Tomb Raider:
Pastel Muses - Tries illegal DMA transfer in indirect mode.
Resident Evil - Almost same:
[SCU] DMA level 1 reading indirect table entries @ 0x060c8000
[SCU] Starting DMA level 1 transfer; ra=0x00000000 wa=0x05c00060 bc=0x0000001e - read_inc=1, write_inc=0x01 -- indirect=1 7
[SCU] Attempted DMA from illegal address 0x00000000
----------------------------------------------------------------------------------------------
Funky Fantasy:
[SCU] DMA level 1 reading indirect table entries @ 0x060c0000
[SCU] Starting DMA level 1 transfer; ra=0x00000000 wa=0x05c00060 bc=0x0000001e - read_inc=1, write_inc=0x01 -- indirect=1 7
[SCU] Attempted DMA from illegal address 0x00000000

View File

@ -0,0 +1,106 @@
// g++ -Wall -O2 -o gen_dsp gen_dsp.cpp && ./gen_dsp
#include <stdio.h>
#include <algorithm>
int main(int argc, char* argv[])
{
FILE* gen = fopen("../scu_dsp_gentab.inc", "wb");
FILE* misc = fopen("../scu_dsp_misctab.inc", "wb");
FILE* mvi = fopen("../scu_dsp_mvitab.inc", "wb");
FILE* dma = fopen("../scu_dsp_dmatab.inc", "wb");
FILE* jmp = fopen("../scu_dsp_jmptab.inc", "wb");
for(int looped = 0; looped < 2; looped++)
{
//
// General
//
fprintf(gen, "{ /* looped=%u */\n", looped);
for(int alu_op = 0; alu_op < 16; alu_op++)
{
fprintf(gen, " { /* alu_op=0x%02x */\n", alu_op);
for(int x_op = 0; x_op < 8; x_op++)
{
fprintf(gen, " { /* x_op=0x%02x */\n", x_op);
for(int y_op = 0; y_op < 8; y_op++)
{
fprintf(gen, " { /* y_op=0x%02x */\n ", y_op);
for(int d1_op_s = 0; d1_op_s < (4/* + 15*/); d1_op_s++)
{
static const unsigned alu_map[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x0F };
static const unsigned x_map[8] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
static const unsigned d1s_map[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00 };
const int d1_op = std::min<int>(3, d1_op_s);
const int d1_s = std::max<int>(0, d1_op_s - 3);
//char label_name[256];
//snprintf(label_name, sizeof(label_name), "gen_%01x%01x%01x%01x%01x", looped, alu_op, x_op, y_op, d1_op);
//printf("GENSIN(%s, %s, 0x%01x, 0x%01x, 0x%01x, 0x%01x)\n", label_name, looped ? "true" : "false", alu_op, x_op, y_op, d1_op);
//fprintf(stderr, "&&%s, ", label_name);
//fprintf(stderr, "GeneralInstr<%s, 0x%01x,0x%01x,0x%01x,0x%01x,0x%01x>, ", looped ? "true" : "false", alu_map[alu_op], x_map[x_op], y_op, d1_op, d1s_map[d1_s]);
fprintf(gen, "GeneralInstr<%s, 0x%01x,0x%01x,0x%01x,0x%01x>, ", looped ? "true" : "false", alu_map[alu_op], x_map[x_op], y_op, d1_op);
}
fprintf(gen, "\n },\n\n");
}
fprintf(gen, " },\n");
}
fprintf(gen, " },\n");
}
fprintf(gen, "},\n");
//
// MVI
//
fprintf(mvi, "{ /* looped=%u */\n", looped);
for(unsigned dest = 0; dest < 16; dest++)
{
fprintf(mvi, " {\n ");
for(unsigned cond = 0; cond < 128; cond++)
{
fprintf(mvi, "MVIInstr<%s, 0x%01x, 0x%02x>, ", looped ? "true" : "false", dest, (cond < 0x40) ? 0x00 : cond );
}
fprintf(mvi, "\n },\n");
}
fprintf(mvi, " },\n");
//
// DMA
//
fprintf(dma, "{ /* looped=%u */\n", looped);
for(unsigned hfd = 0; hfd < 8; hfd++)
{
fprintf(dma, " {\n ");
for(unsigned ram = 0; ram < 8; ram++)
{
fprintf(dma, "DMAInstr<%s, 0x%01x, 0x%01x, 0x%01x, 0x%02x>, ", looped ? "true" : "false", (hfd >> 2) & 0x1, (hfd >> 1) & 0x1, (hfd >> 0) & 0x1, ram);
}
fprintf(dma, "\n },\n");
}
fprintf(dma, " },\n");
//
// JMP
//
fprintf(jmp, "{ /* looped=%u */\n", looped);
for(unsigned cond = 0; cond < 128; cond++)
{
fprintf(jmp, "JMPInstr<%s, 0x%02x>, ", looped ? "true" : "false", (cond < 0x40) ? 0x00 : cond );
}
fprintf(jmp, " },\n");
//
// Misc
//
fprintf(misc, "{ /* looped=%u */ ", looped);
for(unsigned op = 0; op < 4; op++)
{
fprintf(misc, "MiscInstr<%s, %u>, ", looped ? "true" : "false", op);
}
fprintf(misc, " },\n");
}
fclose(jmp);
fclose(dma);
fclose(mvi);
fclose(misc);
fclose(gen);
return 0;
}

319
waterbox/ss/scsp.h Normal file
View File

@ -0,0 +1,319 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scsp.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
class SS_SCSP
{
public:
SS_SCSP() MDFN_COLD;
~SS_SCSP() MDFN_COLD;
void Reset(bool powering_up) MDFN_COLD;
void RunSample(int16* outlr);
template<typename T, bool IsWrite>
void RW(uint32 A, T& V); //, void (*time_sucker)();
INLINE uint16* GetEXTSPtr(void)
{
return EXTS;
}
INLINE uint16* GetRAMPtr(void)
{
return RAM;
}
enum
{
GSREG_MVOL = 0,
GSREG_DAC18B,
GSREG_MEM4MB,
GSREG_RBP,
GSREG_RBL,
GSREG_MSLC,
};
uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD;
void SetRegister(const unsigned id, const uint32 value) MDFN_COLD;
private:
void RecalcSoundInt(void);
void RecalcMainInt(void);
enum
{
ENV_PHASE_ATTACK = 0,
ENV_PHASE_DECAY1 = 1,
ENV_PHASE_DECAY2 = 2,
ENV_PHASE_RELEASE = 3
};
uint16 SlotRegs[0x20][0x10];
struct Slot
{
bool KeyBit;
uint32 StartAddr; // 20 bits, memory address.
uint16 LoopStart; // 16 bits, in samples.
uint16 LoopEnd; // 16 bits, in samples.
bool WF8Bit;
uint8 LoopMode;
enum
{
LOOP_DISABLED = 0,
LOOP_NORMAL = 1,
LOOP_REVERSE = 2,
LOOP_ALTERNATING = 3
};
uint8 SourceControl;
enum
{
SOURCE_MEMORY = 0,
SOURCE_NOISE = 1,
SOURCE_ZERO = 2,
SOURCE_UNDEFINED = 3
};
uint8 SBControl;
union
{
struct
{
uint8 AttackRate;
uint8 Decay1Rate;
uint8 Decay2Rate;
uint8 ReleaseRate;
};
uint8 EnvRates[4];
};
bool AttackHold;
bool AttackLoopLink;
uint8 DecayLevel;
uint8 KRS;
uint8 TotalLevel;
bool SoundDirect; // When true, bypass EG, TL, ALFO volume control
bool StackWriteInhibit;
uint8 ModLevel;
uint8 ModInputX;
uint8 ModInputY;
uint8 Octave;
uint16 FreqNum;
uint8 ALFOModLevel;
uint8 ALFOWaveform;
uint8 PLFOModLevel;
uint8 PLFOWaveform;
uint8 LFOFreq;
bool LFOReset;
// DSP mix stack
uint8 ToDSPSelect;
uint8 ToDSPLevel;
int16 DirectVolume[2]; // 1.14 fixed point, derived from DISDL and DIPAN
int16 EffectVolume[2]; // 1.14 fixed point, derived from EFSDL and EFPAN
//
//
uint32 PhaseWhacker;
uint16 CurrentAddr;
bool InLoop;
bool LoopSub;
bool WFAllowAccess;
uint32 EnvLevel; // 0 ... 0x3FF
uint8 EnvPhase; // ENV_PHASE_ATTACK ... ENV_PHASE_RELEASE (0...3)
bool EnvGCBTPrev;
uint8 LFOCounter;
int16 LFOTimeCounter;
} Slots[32];
uint16 EXTS[2];
void RunEG(Slot* s, const unsigned key_eg_scale);
uint8 GetALFO(Slot* s);
int GetPLFO(Slot* s);
void RunLFO(Slot* s);
uint16 SoundStack[0x40];
uint16 SoundStackDelayer[4];
uint16 MasterVolume; // 1.8 fixed point, derived from MVOL
uint8 MVOL;
bool DAC18bit;
bool Mem4Mb;
uint32 SlotMonitorWhich;
uint16 SlotMonitorData;
bool KeyExecute;
uint32 LFSR;
uint32 GlobalCounter;
//
//
enum
{
MIDIF_INPUT_EMPTY = 0x01,
MIDIF_INPUT_FULL = 0x02,
MIDIF_INPUT_OFLOW = 0x04,
MIDIF_OUTPUT_EMPTY= 0x08,
MIDIF_OUTPUT_FULL = 0x10
};
struct
{
uint8 InputFIFO[4];
uint8 InputRP, InputWP, InputCount;
uint8 OutputFIFO[4];
uint8 OutputRP, OutputWP, OutputCount;
uint8 Flags;
//
INLINE uint8 ReadInput(void)
{
uint8 ret = InputFIFO[InputRP]; // May not be correct for InputCount == 0; test.
if(InputCount)
{
InputRP = (InputRP + 1) & 0x3;
InputCount--;
Flags &= ~MIDIF_INPUT_FULL;
if(!InputCount)
Flags |= MIDIF_INPUT_EMPTY;
}
return ret;
}
INLINE void WriteOutput(uint8 V)
{
if(OutputCount == 4) // May not be correct; test.
return;
OutputFIFO[OutputWP] = V;
OutputWP = (OutputWP + 1) & 0x3;
OutputCount++;
Flags &= ~MIDIF_OUTPUT_EMPTY;
if(OutputCount == 4)
Flags |= MIDIF_OUTPUT_FULL;
}
void Reset(void)
{
memset(InputFIFO, 0, sizeof(InputFIFO));
memset(OutputFIFO, 0, sizeof(OutputFIFO));
InputRP = InputWP = InputCount = 0;
OutputRP = OutputWP = OutputCount = 0;
Flags = MIDIF_INPUT_EMPTY | MIDIF_OUTPUT_EMPTY;
}
} MIDI;
//
//
uint16 SCIEB;
uint16 SCIPD;
uint16 MCIEB;
uint16 MCIPD;
uint8 SCILV[3];
//
//
struct
{
uint8 Control;
uint8 Counter;
bool PrevClockIn;
int32 Reload;
} Timers[3];
//
//
// DMEA, DRGA, and DTLG are apparently not altered by executing DMA.
//
uint32 DMEA;
uint16 DRGA;
uint16 DTLG;
bool DMA_Execute;
bool DMA_Direction;
bool DMA_Gate;
void RunDMA(void);
//
//
uint8 RBP;
uint8 RBL;
void RunDSP(void);
struct DSPS
{
uint64 MPROG[0x80];
uint32 TEMP[0x80]; // 24 bit
uint32 MEMS[0x20]; // 24 bit
uint16 COEF[64]; // 13 bit
uint16 MADRS[32]; // 16 bit
uint32 MIXS[0x10]; // 20 bit
uint16 EFREG[0x10];
uint32 INPUTS; // 24 bit
uint32 Product; // 26 bit
uint32 SFT_REG; // 26 bit
uint16 FRC_REG; // 13 bit
uint32 Y_REG; // 24 bit, latches INPUTS
uint16 ADRS_REG; // 12 bit, latches output of A_SEL(which selects between shifter output and upper 8 bits of INPUTS
uint16 MDEC_CT;
uint32 RWAddr;
bool WritePending;
uint16 WriteValue;
uint8 ReadPending; // = 1 (NOFL=0), =2 (NOFL=1) at time or MRT
uint32 ReadValue;
} DSP;
//
//
uint16 RAM[262144 * 2]; // *2 for dummy so we don't have to have so many conditionals in the playback code.
};

1550
waterbox/ss/scsp.inc Normal file

File diff suppressed because it is too large Load Diff

95
waterbox/ss/scu.h Normal file
View File

@ -0,0 +1,95 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_SCU_H
#define __MDFN_SS_SCU_H
namespace MDFN_IEN_SS
{
enum
{
SCU_INT_VBIN = 0x00,
SCU_INT_VBOUT,
SCU_INT_HBIN,
SCU_INT_TIMER0,
SCU_INT_TIMER1,
SCU_INT_DSP,
SCU_INT_SCSP,
SCU_INT_SMPC,
SCU_INT_PAD,
SCU_INT_L2DMA,
SCU_INT_L1DMA,
SCU_INT_L0DMA,
SCU_INT_DMA_ILL,
SCU_INT_VDP1,
SCU_INT_EXT0 = 0x10,
SCU_INT_EXTF = 0x1F,
};
void SCU_Reset(bool powering_up) MDFN_COLD;
void SCU_SetInt(unsigned which, bool active);
int32 SCU_SetHBVB(int32 pclocks, bool hblank_in, bool vblank_in);
bool SCU_CheckVDP1HaltKludge(void);
sscpu_timestamp_t SCU_UpdateDMA(sscpu_timestamp_t timestamp);
sscpu_timestamp_t SCU_UpdateDSP(sscpu_timestamp_t timestamp);
enum
{
SCU_GSREG_ILEVEL = 0,
SCU_GSREG_IVEC,
SCU_GSREG_ICLEARMASK,
SCU_GSREG_IASSERTED,
SCU_GSREG_IPENDING,
SCU_GSREG_IMASK,
SCU_GSREG_T0CNT,
SCU_GSREG_T0CMP,
SCU_GSREG_T0MET,
SCU_GSREG_T1RLV,
SCU_GSREG_T1CNT,
SCU_GSREG_T1MOD,
SCU_GSREG_T1MET,
SCU_GSREG_TENBL,
//
//
//
SCU_GSREG_DSP_EXEC,
SCU_GSREG_DSP_PAUSE,
SCU_GSREG_DSP_PC,
SCU_GSREG_DSP_END,
};
uint32 SCU_GetRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD;
void SCU_SetRegister(const unsigned id, const uint32 value) MDFN_COLD;
}
#endif

2003
waterbox/ss/scu.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,112 @@
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 2, 0x4, 0x00 }, },
/* 9 */ { { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 2, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 12 */ { { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 13 */ { { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 14 */ { { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 15 */ { { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 16 */ { { 2, 0x4, 0x00 }, },
/* 17 */ { { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 18 */ { { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 19 */ { { 2, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 20 */ { { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 21 */ { { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 22 */ { { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 23 */ { { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 12 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 13 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 14 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 15 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x08 }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 16 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 17 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 18 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 19 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 20 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 21 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 22 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 23 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x08 }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 2, 0x2, 0x00 }, },
/* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x00 }, },
/* 11 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 12 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 13 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 14 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 15 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 16 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 17 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 18 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x00 }, },
/* 19 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 20 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 21 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 22 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 23 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 12 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 13 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 14 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 15 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 16 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 17 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x00 }, },
/* 18 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 19 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 20 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 21 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 22 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 23 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},

479
waterbox/ss/scu_actab.inc Normal file
View File

@ -0,0 +1,479 @@
/*dest_raw_inc=0x00 */
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1 */
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2 */
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 5 */ { { -2, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3 */
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { -3, 0x1, 0x01 }, { 1, 0x1, 0x00 }, },
/* 3 */ { { -3, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { -3, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { -3, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x01 (handled in scu_aciv1tab.inc) */
{
},
/*dest_raw_inc=0x02*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 4, 0x4, 0x00 }, },
/* 9 */ { { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 4, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 2, 0x2, 0x00 }, },
/* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x03*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 8, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 5 */ { { 6, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 6, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 5, 0x1, 0xff }, { 1, 0x1, 0x00 }, },
/* 3 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 5, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x04*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 16, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 5 */ { { 14, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 14, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 13, 0x1, 0xff }, { 1, 0x1, 0x00 }, },
/* 3 */ { { 13, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 13, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 13, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x05*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 32, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 5 */ { { 30, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 30, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 29, 0x1, 0xff }, { 1, 0x1, 0x00 }, },
/* 3 */ { { 29, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 29, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 29, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x06*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 64, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 5 */ { { 62, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 62, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 61, 0x1, 0xff }, { 1, 0x1, 0x00 }, },
/* 3 */ { { 61, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 61, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 61, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x07*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x4, 0x00 }, },
/* 5 */ { { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 9 */ { { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 128, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 5 */ { { 126, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 126, 0x2, 0xff }, { 4, 0x4, 0x00 }, },
/* 7 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 9 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 11 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 125, 0x1, 0xff }, { 1, 0x1, 0x00 }, },
/* 3 */ { { 125, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 125, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 125, 0x1, 0xff }, { 4, 0x4, 0x00 }, },
/* 6 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, },
/* 10 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, },
},
},

542
waterbox/ss/scu_btab.inc Normal file
View File

@ -0,0 +1,542 @@
/*dest_raw_inc=0x00 */
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, },
/* 5 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, },
/* 9 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, },
/* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 4, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 0, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 0, 0x2, 0x00 }, },
/* 5 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 0, 0x2, 0x00 }, },
/* 9 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { -1, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 6 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 8 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x01*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 2, 0x2, 0x00 }, },
/* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 2, 0x2, 0x00 }, },
/* 7 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 2, 0x2, 0x00 }, },
/* 9 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 2, 0x2, 0x00 }, },
/* 11 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 4 */ { { 2, 0x2, 0x00 }, },
/* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 2, 0x2, 0x00 }, },
/* 7 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 8 */ { { 2, 0x2, 0x00 }, },
/* 9 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 2, 0x2, 0x00 }, },
/* 11 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 1, 0x1, 0x00 }, },
/* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x02*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 6, 0x2, 0xff }, { -3, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
/* 8 */ { { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 5, 0x1, 0xff }, { -3, 0x1, 0x00 }, },
/* 3 */ { { 5, 0x1, 0xff }, { -2, 0x2, 0x00 }, },
/* 4 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 6, 0x2, 0xff }, { -3, 0x1, 0x00 }, },
/* 7 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
/* 11 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 4, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
/* 6 */ { { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, },
/* 7 */ { { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
/* 10 */ { { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, },
/* 11 */ { { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 7, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 7, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0xff }, { -3, 0x1, 0x00 }, },
/* 5 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0xff }, { -2, 0x2, 0x00 }, },
/* 6 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, },
/* 9 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, },
/* 10 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x03*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 10, 0x2, 0xff }, { -7, 0x1, 0x00 }, },
/* 4 */ { { 8, 0x2, 0xff }, { -4, 0x2, 0x00 }, },
/* 5 */ { { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
/* 8 */ { { 8, 0x2, 0x02 }, { -4, 0x2, 0x00 }, },
/* 9 */ { { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 9, 0x1, 0xff }, { -7, 0x1, 0x00 }, },
/* 3 */ { { 9, 0x1, 0xff }, { -6, 0x2, 0x00 }, },
/* 4 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 10, 0x2, 0xff }, { -7, 0x1, 0x00 }, },
/* 7 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0xff }, { -4, 0x2, 0x00 }, },
/* 8 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
/* 11 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x02 }, { -4, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 8, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 8, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
/* 6 */ { { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, },
/* 7 */ { { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
/* 10 */ { { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, },
/* 11 */ { { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 15, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 15, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0xff }, { -7, 0x1, 0x00 }, },
/* 5 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0xff }, { -6, 0x2, 0x00 }, },
/* 6 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, },
/* 9 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, },
/* 10 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x04*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 18, 0x2, 0xff }, { -15, 0x1, 0x00 }, },
/* 4 */ { { 16, 0x2, 0xff }, { -12, 0x2, 0x00 }, },
/* 5 */ { { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
/* 8 */ { { 16, 0x2, 0x02 }, { -12, 0x2, 0x00 }, },
/* 9 */ { { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 17, 0x1, 0xff }, { -15, 0x1, 0x00 }, },
/* 3 */ { { 17, 0x1, 0xff }, { -14, 0x2, 0x00 }, },
/* 4 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 18, 0x2, 0xff }, { -15, 0x1, 0x00 }, },
/* 7 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0xff }, { -12, 0x2, 0x00 }, },
/* 8 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
/* 11 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x02 }, { -12, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 16, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 16, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
/* 6 */ { { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, },
/* 7 */ { { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
/* 10 */ { { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, },
/* 11 */ { { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 31, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 31, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0xff }, { -15, 0x1, 0x00 }, },
/* 5 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0xff }, { -14, 0x2, 0x00 }, },
/* 6 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, },
/* 9 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, },
/* 10 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x05*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 34, 0x2, 0xff }, { -31, 0x1, 0x00 }, },
/* 4 */ { { 32, 0x2, 0xff }, { -28, 0x2, 0x00 }, },
/* 5 */ { { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
/* 8 */ { { 32, 0x2, 0x02 }, { -28, 0x2, 0x00 }, },
/* 9 */ { { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 33, 0x1, 0xff }, { -31, 0x1, 0x00 }, },
/* 3 */ { { 33, 0x1, 0xff }, { -30, 0x2, 0x00 }, },
/* 4 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 34, 0x2, 0xff }, { -31, 0x1, 0x00 }, },
/* 7 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0xff }, { -28, 0x2, 0x00 }, },
/* 8 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
/* 11 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x02 }, { -28, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 32, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 32, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
/* 6 */ { { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, },
/* 7 */ { { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
/* 10 */ { { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, },
/* 11 */ { { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 63, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 63, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0xff }, { -31, 0x1, 0x00 }, },
/* 5 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0xff }, { -30, 0x2, 0x00 }, },
/* 6 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, },
/* 9 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, },
/* 10 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x06*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 66, 0x2, 0xff }, { -63, 0x1, 0x00 }, },
/* 4 */ { { 64, 0x2, 0xff }, { -60, 0x2, 0x00 }, },
/* 5 */ { { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
/* 8 */ { { 64, 0x2, 0x02 }, { -60, 0x2, 0x00 }, },
/* 9 */ { { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 65, 0x1, 0xff }, { -63, 0x1, 0x00 }, },
/* 3 */ { { 65, 0x1, 0xff }, { -62, 0x2, 0x00 }, },
/* 4 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 66, 0x2, 0xff }, { -63, 0x1, 0x00 }, },
/* 7 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0xff }, { -60, 0x2, 0x00 }, },
/* 8 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
/* 11 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x02 }, { -60, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 64, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 64, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
/* 6 */ { { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, },
/* 7 */ { { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
/* 10 */ { { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, },
/* 11 */ { { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 127, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 127, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0xff }, { -63, 0x1, 0x00 }, },
/* 5 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0xff }, { -62, 0x2, 0x00 }, },
/* 6 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, },
/* 9 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, },
/* 10 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},
/*dest_raw_inc=0x07*/
{
/*dest_align=0*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 130, 0x2, 0xff }, { -127, 0x1, 0x00 }, },
/* 4 */ { { 128, 0x2, 0xff }, { -124, 0x2, 0x00 }, },
/* 5 */ { { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 6 */ { { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 7 */ { { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
/* 8 */ { { 128, 0x2, 0x02 }, { -124, 0x2, 0x00 }, },
/* 9 */ { { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 10 */ { { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 11 */ { { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
},
/*dest_align=1*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 129, 0x1, 0xff }, { -127, 0x1, 0x00 }, },
/* 3 */ { { 129, 0x1, 0xff }, { -126, 0x2, 0x00 }, },
/* 4 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, },
/* 5 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, },
/* 6 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 130, 0x2, 0xff }, { -127, 0x1, 0x00 }, },
/* 7 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0xff }, { -124, 0x2, 0x00 }, },
/* 8 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, },
/* 9 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, },
/* 10 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
/* 11 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x02 }, { -124, 0x2, 0x00 }, },
},
/*dest_align=2*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 2, 0x2, 0x00 }, },
/* 3 */ { { 128, 0x2, 0xff }, { -1, 0x1, 0x00 }, },
/* 4 */ { { 128, 0x2, 0xff }, { 0, 0x2, 0x00 }, },
/* 5 */ { { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
/* 6 */ { { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, },
/* 7 */ { { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 8 */ { { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 9 */ { { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
/* 10 */ { { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, },
/* 11 */ { { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
},
/*dest_align=3*/
{
/* 0 */ { },
/* 1 */ { { 1, 0x1, 0x00 }, },
/* 2 */ { { 255, 0x1, 0xff }, { -1, 0x1, 0x00 }, },
/* 3 */ { { 255, 0x1, 0xff }, { 0, 0x2, 0x00 }, },
/* 4 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0xff }, { -127, 0x1, 0x00 }, },
/* 5 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0xff }, { -126, 0x2, 0x00 }, },
/* 6 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 7 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
/* 8 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, },
/* 9 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, },
/* 10 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, },
/* 11 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, },
},
},

View File

@ -0,0 +1,235 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu_dsp_common.inc:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// base ptr must match the waterbox base load location!
#if (defined(__x86_64__) && defined(__code_model_small__) && !defined(__PIC__) && !defined(__pic__)) || SIZEOF_VOID_P <= 4
#define DSP_INSTR_BASE_UIPT 0x36d00000000ul
#define DSP_INSTR_RECOVER_TCAST uint32
#else
#define DSP_INSTR_BASE_UIPT ((uintptr_t)DSP_Init)
#define DSP_INSTR_RECOVER_TCAST int32
#endif
// See loop in "SCU_UpdateDSP()" in scu.inc, and END/ENDI handling in scu_dsp_misc.cpp
enum { DSP_EndCCSubVal = 1000000 };
void DSP_Init(void);
struct DSP_ITS;
union DSPR48
{
#ifdef MSB_FIRST
struct
{
uint16 dummy;
uint16 H;
uint32 L;
};
#else
struct
{
uint32 L;
uint16 H;
uint16 dummy;
};
#endif
uint64 T; // Upper 16 bits may be non-zero "garbage", so don't assume they're zero in code that reads from this variable.
};
struct DSPS
{
sscpu_timestamp_t LastTS;
int32 CycleCounter;
int32 T0_Until;
//
enum
{
// No execute = 0x00000000 <= 0
// Paused + No execute = 0x80000000 <= 0
// Paused + Execute = 0x80000001 <= 0
// Execute = 0x00000001 > 0
STATE_MASK_PAUSE = 0x80000000,
STATE_MASK_EXECUTE = 0x00000001,
};
int32 State;
INLINE bool IsRunning(void) // returns true if not stopped and not paused.
{
return State > 0;
}
uint64 NextInstr;
uint8 PC;
uint8 RA;
bool FlagZ;
bool FlagS;
bool FlagV;
bool FlagC;
bool FlagEnd;
uint8 TOP;
uint16 LOP; // 12 bits
DSPR48 AC;
DSPR48 P;
union
{
uint8 CT[4]; // 6 bits(each)
uint32 CT32;
};
uint32 RX;
uint32 RY;
uint32 RAO;
uint32 WAO;
uint32 DataRAM[4][64];
uint64 ProgRAM[256]; // Upper 32 bits = actual raw instruction, lower 32 bits = horrible emulator handler pointer madness
};
// ALU Op: bits 26-29 - *16
// X Op: bits 23-25 - * 8
// Y Op: bits 17-19 - * 8
// D1 Op: bits 12-13 - * 4
extern void (*const DSP_GenFuncTable[2][16][8][8][4])(void);
// Hold/Format/Direction: bits 12-14
// Hold: bit 14
// Format: bit 13
// Direction: bit 12
// RAM: bits 8-10
//
extern void (*const DSP_DMAFuncTable[2][8][8])(void);
//
// Dest: bits 26-29
// Condition: bits 19-25
//
extern void (*const DSP_MVIFuncTable[2][16][128])(void);
//
// Condition: bits 19-25
//
extern void (*const DSP_JMPFuncTable[2][128])(void);
//
// LPS, BTM, END, ENDI(bits 29-31 = 0x7)
// bits 27-28
//
extern void (*const DSP_MiscFuncTable[2][4])(void);
extern DSPS DSP;
template<bool looped = false>
static INLINE uint64 DSP_DecodeInstruction(const uint32 instr)
{
void (*aal)(void);
switch((instr >> 28) & 0xF)
{
default:
aal = DSP_GenFuncTable[looped][0][0][0][0];
break;
case 0x0:
case 0x1:
case 0x2:
case 0x3:
aal = DSP_GenFuncTable[looped][(instr >> 26) & 0xF][(instr >> 23) & 0x7][(instr >> 17) & 0x7][(instr >> 12) & 0x3];
break;
case 0x8:
case 0x9:
case 0xA:
case 0xB:
aal = DSP_MVIFuncTable[looped][(instr >> 26) & 0xF][(instr >> 19) & 0x7F];
break;
case 0xC:
aal = DSP_DMAFuncTable[looped][(instr >> 12) & 0x7][(instr >> 8) & 0x7];
break;
case 0xD:
aal = DSP_JMPFuncTable[looped][(instr >> 19) & 0x7F];
break;
case 0xE:
case 0xF:
aal = DSP_MiscFuncTable[looped][(instr >> 27) & 0x3];
break;
}
return ((uint64)instr << 32) | (uint32)((uintptr_t)aal - DSP_INSTR_BASE_UIPT);
}
template<bool looped>
static INLINE uint32 DSP_InstrPre(void)
{
const uint32 instr = DSP.NextInstr >> 32;
if(!looped || !DSP.LOP)
{
DSP.NextInstr = DSP.ProgRAM[DSP.PC];
DSP.PC++;
}
if(looped)
DSP.LOP -= (bool)DSP.LOP;
return instr;
}
template<unsigned cond>
static INLINE bool DSP_TestCond(void)
{
if(!(cond & 0x40))
return true;
//
//
//
bool ret = false;
if(cond & 0x1)
ret |= DSP.FlagZ;
if(cond & 0x2)
ret |= DSP.FlagS;
if(cond & 0x4)
ret |= DSP.FlagC;
if(cond & 0x8)
ret |= (DSP.T0_Until < DSP.CycleCounter);
//if(cond & 0x10) // ?
return ret == (bool)(cond & 0x20);
}

View File

@ -0,0 +1,52 @@
{ /* looped=0 */
{
DMAInstr<false, 0x0, 0x0, 0x0, 0x00>, DMAInstr<false, 0x0, 0x0, 0x0, 0x01>, DMAInstr<false, 0x0, 0x0, 0x0, 0x02>, DMAInstr<false, 0x0, 0x0, 0x0, 0x03>, DMAInstr<false, 0x0, 0x0, 0x0, 0x04>, DMAInstr<false, 0x0, 0x0, 0x0, 0x05>, DMAInstr<false, 0x0, 0x0, 0x0, 0x06>, DMAInstr<false, 0x0, 0x0, 0x0, 0x07>,
},
{
DMAInstr<false, 0x0, 0x0, 0x1, 0x00>, DMAInstr<false, 0x0, 0x0, 0x1, 0x01>, DMAInstr<false, 0x0, 0x0, 0x1, 0x02>, DMAInstr<false, 0x0, 0x0, 0x1, 0x03>, DMAInstr<false, 0x0, 0x0, 0x1, 0x04>, DMAInstr<false, 0x0, 0x0, 0x1, 0x05>, DMAInstr<false, 0x0, 0x0, 0x1, 0x06>, DMAInstr<false, 0x0, 0x0, 0x1, 0x07>,
},
{
DMAInstr<false, 0x0, 0x1, 0x0, 0x00>, DMAInstr<false, 0x0, 0x1, 0x0, 0x01>, DMAInstr<false, 0x0, 0x1, 0x0, 0x02>, DMAInstr<false, 0x0, 0x1, 0x0, 0x03>, DMAInstr<false, 0x0, 0x1, 0x0, 0x04>, DMAInstr<false, 0x0, 0x1, 0x0, 0x05>, DMAInstr<false, 0x0, 0x1, 0x0, 0x06>, DMAInstr<false, 0x0, 0x1, 0x0, 0x07>,
},
{
DMAInstr<false, 0x0, 0x1, 0x1, 0x00>, DMAInstr<false, 0x0, 0x1, 0x1, 0x01>, DMAInstr<false, 0x0, 0x1, 0x1, 0x02>, DMAInstr<false, 0x0, 0x1, 0x1, 0x03>, DMAInstr<false, 0x0, 0x1, 0x1, 0x04>, DMAInstr<false, 0x0, 0x1, 0x1, 0x05>, DMAInstr<false, 0x0, 0x1, 0x1, 0x06>, DMAInstr<false, 0x0, 0x1, 0x1, 0x07>,
},
{
DMAInstr<false, 0x1, 0x0, 0x0, 0x00>, DMAInstr<false, 0x1, 0x0, 0x0, 0x01>, DMAInstr<false, 0x1, 0x0, 0x0, 0x02>, DMAInstr<false, 0x1, 0x0, 0x0, 0x03>, DMAInstr<false, 0x1, 0x0, 0x0, 0x04>, DMAInstr<false, 0x1, 0x0, 0x0, 0x05>, DMAInstr<false, 0x1, 0x0, 0x0, 0x06>, DMAInstr<false, 0x1, 0x0, 0x0, 0x07>,
},
{
DMAInstr<false, 0x1, 0x0, 0x1, 0x00>, DMAInstr<false, 0x1, 0x0, 0x1, 0x01>, DMAInstr<false, 0x1, 0x0, 0x1, 0x02>, DMAInstr<false, 0x1, 0x0, 0x1, 0x03>, DMAInstr<false, 0x1, 0x0, 0x1, 0x04>, DMAInstr<false, 0x1, 0x0, 0x1, 0x05>, DMAInstr<false, 0x1, 0x0, 0x1, 0x06>, DMAInstr<false, 0x1, 0x0, 0x1, 0x07>,
},
{
DMAInstr<false, 0x1, 0x1, 0x0, 0x00>, DMAInstr<false, 0x1, 0x1, 0x0, 0x01>, DMAInstr<false, 0x1, 0x1, 0x0, 0x02>, DMAInstr<false, 0x1, 0x1, 0x0, 0x03>, DMAInstr<false, 0x1, 0x1, 0x0, 0x04>, DMAInstr<false, 0x1, 0x1, 0x0, 0x05>, DMAInstr<false, 0x1, 0x1, 0x0, 0x06>, DMAInstr<false, 0x1, 0x1, 0x0, 0x07>,
},
{
DMAInstr<false, 0x1, 0x1, 0x1, 0x00>, DMAInstr<false, 0x1, 0x1, 0x1, 0x01>, DMAInstr<false, 0x1, 0x1, 0x1, 0x02>, DMAInstr<false, 0x1, 0x1, 0x1, 0x03>, DMAInstr<false, 0x1, 0x1, 0x1, 0x04>, DMAInstr<false, 0x1, 0x1, 0x1, 0x05>, DMAInstr<false, 0x1, 0x1, 0x1, 0x06>, DMAInstr<false, 0x1, 0x1, 0x1, 0x07>,
},
},
{ /* looped=1 */
{
DMAInstr<true, 0x0, 0x0, 0x0, 0x00>, DMAInstr<true, 0x0, 0x0, 0x0, 0x01>, DMAInstr<true, 0x0, 0x0, 0x0, 0x02>, DMAInstr<true, 0x0, 0x0, 0x0, 0x03>, DMAInstr<true, 0x0, 0x0, 0x0, 0x04>, DMAInstr<true, 0x0, 0x0, 0x0, 0x05>, DMAInstr<true, 0x0, 0x0, 0x0, 0x06>, DMAInstr<true, 0x0, 0x0, 0x0, 0x07>,
},
{
DMAInstr<true, 0x0, 0x0, 0x1, 0x00>, DMAInstr<true, 0x0, 0x0, 0x1, 0x01>, DMAInstr<true, 0x0, 0x0, 0x1, 0x02>, DMAInstr<true, 0x0, 0x0, 0x1, 0x03>, DMAInstr<true, 0x0, 0x0, 0x1, 0x04>, DMAInstr<true, 0x0, 0x0, 0x1, 0x05>, DMAInstr<true, 0x0, 0x0, 0x1, 0x06>, DMAInstr<true, 0x0, 0x0, 0x1, 0x07>,
},
{
DMAInstr<true, 0x0, 0x1, 0x0, 0x00>, DMAInstr<true, 0x0, 0x1, 0x0, 0x01>, DMAInstr<true, 0x0, 0x1, 0x0, 0x02>, DMAInstr<true, 0x0, 0x1, 0x0, 0x03>, DMAInstr<true, 0x0, 0x1, 0x0, 0x04>, DMAInstr<true, 0x0, 0x1, 0x0, 0x05>, DMAInstr<true, 0x0, 0x1, 0x0, 0x06>, DMAInstr<true, 0x0, 0x1, 0x0, 0x07>,
},
{
DMAInstr<true, 0x0, 0x1, 0x1, 0x00>, DMAInstr<true, 0x0, 0x1, 0x1, 0x01>, DMAInstr<true, 0x0, 0x1, 0x1, 0x02>, DMAInstr<true, 0x0, 0x1, 0x1, 0x03>, DMAInstr<true, 0x0, 0x1, 0x1, 0x04>, DMAInstr<true, 0x0, 0x1, 0x1, 0x05>, DMAInstr<true, 0x0, 0x1, 0x1, 0x06>, DMAInstr<true, 0x0, 0x1, 0x1, 0x07>,
},
{
DMAInstr<true, 0x1, 0x0, 0x0, 0x00>, DMAInstr<true, 0x1, 0x0, 0x0, 0x01>, DMAInstr<true, 0x1, 0x0, 0x0, 0x02>, DMAInstr<true, 0x1, 0x0, 0x0, 0x03>, DMAInstr<true, 0x1, 0x0, 0x0, 0x04>, DMAInstr<true, 0x1, 0x0, 0x0, 0x05>, DMAInstr<true, 0x1, 0x0, 0x0, 0x06>, DMAInstr<true, 0x1, 0x0, 0x0, 0x07>,
},
{
DMAInstr<true, 0x1, 0x0, 0x1, 0x00>, DMAInstr<true, 0x1, 0x0, 0x1, 0x01>, DMAInstr<true, 0x1, 0x0, 0x1, 0x02>, DMAInstr<true, 0x1, 0x0, 0x1, 0x03>, DMAInstr<true, 0x1, 0x0, 0x1, 0x04>, DMAInstr<true, 0x1, 0x0, 0x1, 0x05>, DMAInstr<true, 0x1, 0x0, 0x1, 0x06>, DMAInstr<true, 0x1, 0x0, 0x1, 0x07>,
},
{
DMAInstr<true, 0x1, 0x1, 0x0, 0x00>, DMAInstr<true, 0x1, 0x1, 0x0, 0x01>, DMAInstr<true, 0x1, 0x1, 0x0, 0x02>, DMAInstr<true, 0x1, 0x1, 0x0, 0x03>, DMAInstr<true, 0x1, 0x1, 0x0, 0x04>, DMAInstr<true, 0x1, 0x1, 0x0, 0x05>, DMAInstr<true, 0x1, 0x1, 0x0, 0x06>, DMAInstr<true, 0x1, 0x1, 0x0, 0x07>,
},
{
DMAInstr<true, 0x1, 0x1, 0x1, 0x00>, DMAInstr<true, 0x1, 0x1, 0x1, 0x01>, DMAInstr<true, 0x1, 0x1, 0x1, 0x02>, DMAInstr<true, 0x1, 0x1, 0x1, 0x03>, DMAInstr<true, 0x1, 0x1, 0x1, 0x04>, DMAInstr<true, 0x1, 0x1, 0x1, 0x05>, DMAInstr<true, 0x1, 0x1, 0x1, 0x06>, DMAInstr<true, 0x1, 0x1, 0x1, 0x07>,
},
},

343
waterbox/ss/scu_dsp_gen.cpp Normal file
View File

@ -0,0 +1,343 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu_dsp_gen.cpp - SCU DSP General Instructions Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "scu.h"
#include "endian.h"
#pragma GCC optimize("Os")
// Is first DSP instruction cached on PC load, or when execution starts?
// MOV [s],[d] s=0x8 = 0xFFFFFFFF?
// MOV [s],[d] when moving from/to the same data RAM bank seems to be treated like a NOP...
namespace MDFN_IEN_SS
{
#include "scu_dsp_common.inc"
static INLINE void SetC(bool value)
{
DSP.FlagC = value;
}
static INLINE void CalcZS32(uint32 val)
{
DSP.FlagS = (int32)val < 0;
DSP.FlagZ = !val;
}
static INLINE void CalcZS48(uint64 val)
{
val <<= 16;
DSP.FlagS = (int64)val < 0;
DSP.FlagZ = !val;
}
template<const bool looped, const unsigned alu_op, const unsigned x_op, const unsigned y_op, const unsigned d1_op>
static NO_INLINE NO_CLONE void GeneralInstr(void)
{
const uint32 instr = DSP_InstrPre<looped>();
//
DSPR48 ALU = DSP.AC;
unsigned dr_read = 0;
unsigned ct_inc = 0;
switch(alu_op)
{
//
// NOP
//
default:
{
}
break;
//
// AND
//
case 0x01:
{
ALU.L &= DSP.P.L;
SetC(false);
CalcZS32(ALU.L);
}
break;
//
// OR
//
case 0x02:
{
ALU.L |= DSP.P.L;
SetC(false);
CalcZS32(ALU.L);
}
break;
//
// XOR
//
case 0x03:
{
ALU.L ^= DSP.P.L;
SetC(false);
CalcZS32(ALU.L);
}
break;
//
// ADD
//
case 0x04:
{
const uint64 tmp = (uint64)ALU.L + DSP.P.L;
DSP.FlagV |= (((~(ALU.L ^ DSP.P.L)) & (ALU.L ^ tmp)) >> 31) & 1;
SetC((tmp >> 32) & 0x1);
CalcZS32(tmp);
ALU.L = tmp;
}
break;
//
// SUB
//
case 0x05:
{
const uint64 tmp = (uint64)ALU.L - DSP.P.L;
DSP.FlagV |= ((((ALU.L ^ DSP.P.L)) & (ALU.L ^ tmp)) >> 31) & 1;
SetC((tmp >> 32) & 0x1);
CalcZS32(tmp);
ALU.L = tmp;
}
break;
//
// AD2
//
case 0x06:
{
const uint64 tmp = (ALU.T & 0xFFFFFFFFFFFFULL) + (DSP.P.T & 0xFFFFFFFFFFFFULL);
DSP.FlagV |= (((~(ALU.T ^ DSP.P.T)) & (ALU.T ^ tmp)) >> 47) & 1;
SetC((tmp >> 48) & 0x1);
CalcZS48(tmp);
ALU.T = tmp;
}
break;
//
// SR
//
case 0x08:
{
const bool new_C = ALU.L & 0x1;
SetC(new_C);
ALU.L = (int32)ALU.L >> 1;
CalcZS32(ALU.L);
}
break;
//
// RR
//
case 0x09:
{
const bool new_C = ALU.L & 0x1;
SetC(new_C);
ALU.L = (ALU.L >> 1) | (new_C << 31);
CalcZS32(ALU.L);
}
break;
//
// SL
//
case 0x0A:
{
const bool new_C = ALU.L >> 31;
SetC(new_C);
ALU.L <<= 1;
CalcZS32(ALU.L);
}
break;
//
// RL
//
case 0x0B:
{
const bool new_C = ALU.L >> 31;
SetC(new_C);
ALU.L = (ALU.L << 1) | new_C;
CalcZS32(ALU.L);
}
break;
//
// RL8
//
case 0x0F:
{
const bool new_C = (ALU.L >> 24) & 1;
SetC(new_C);
ALU.L = (ALU.L << 8) | (ALU.L >> 24);
CalcZS32(ALU.L);
}
break;
}
//
// X Op
//
if((x_op & 0x3) == 0x2)
DSP.P.T = (int64)(int32)DSP.RX * (int32)DSP.RY;
if(x_op >= 0x3)
{
const unsigned s = (instr >> 20) & 0x7;
const size_t drw = s & 0x3;
uint32 src_data;
src_data = DSP.DataRAM[drw][DSP.CT[drw]];
dr_read |= 1U << drw;
ct_inc |= (bool)(s & 0x4) << (drw << 3);
if((x_op & 0x3) == 0x3)
DSP.P.T = (int32)src_data;
if(x_op & 0x4)
DSP.RX = src_data;
}
//
// Y Op
//
if((y_op & 0x3) == 0x1)
DSP.AC.T = 0;
else if((y_op & 0x3) == 0x2)
DSP.AC.T = ALU.T;
if(y_op >= 0x3)
{
const unsigned s = (instr >> 14) & 0x7;
const size_t drw = s & 0x3;
uint32 src_data;
src_data = DSP.DataRAM[drw][DSP.CT[drw]];
dr_read |= 1U << drw;
ct_inc |= (bool)(s & 0x4) << (drw << 3);
if((y_op & 0x3) == 0x3)
DSP.AC.T = (int32)src_data;
if(y_op & 0x4)
DSP.RY = src_data;
}
//
// D1 Op (TODO: Test illegal bit patterns)
//
if(d1_op & 0x1)
{
const unsigned d = (instr >> 8) & 0xF;
uint32 src_data = (int8)instr;
if(d1_op & 0x2)
{
switch(instr & 0xF)
{
case 0x8:
case 0xB:
case 0xC:
case 0xD:
case 0xE:
case 0xF: src_data = 0xFFFFFFFF; break;
case 0x0: src_data = DSP.DataRAM[0][DSP.CT[0]]; dr_read |= 0x01; break;
case 0x1: src_data = DSP.DataRAM[1][DSP.CT[1]]; dr_read |= 0x02; break;
case 0x2: src_data = DSP.DataRAM[2][DSP.CT[2]]; dr_read |= 0x04; break;
case 0x3: src_data = DSP.DataRAM[3][DSP.CT[3]]; dr_read |= 0x08; break;
case 0x4: src_data = DSP.DataRAM[0][DSP.CT[0]]; if(d != 0) { ct_inc |= 1 << 0; } dr_read |= 0x01; break;
case 0x5: src_data = DSP.DataRAM[1][DSP.CT[1]]; if(d != 1) { ct_inc |= 1 << 8; } dr_read |= 0x02; break;
case 0x6: src_data = DSP.DataRAM[2][DSP.CT[2]]; if(d != 2) { ct_inc |= 1 << 16; } dr_read |= 0x04; break;
case 0x7: src_data = DSP.DataRAM[3][DSP.CT[3]]; if(d != 3) { ct_inc |= 1 << 24; } dr_read |= 0x08; break;
case 0x9: src_data = ALU.T; break;
case 0xA: src_data = ALU.T >> 16; break;
}
}
switch(d)
{
case 0x0: if(!(dr_read & 0x01)) { DSP.DataRAM[0][DSP.CT[0]] = src_data; ct_inc |= 1 << 0; } break;
case 0x1: if(!(dr_read & 0x02)) { DSP.DataRAM[1][DSP.CT[1]] = src_data; ct_inc |= 1 << 8; } break;
case 0x2: if(!(dr_read & 0x04)) { DSP.DataRAM[2][DSP.CT[2]] = src_data; ct_inc |= 1 << 16; } break;
case 0x3: if(!(dr_read & 0x08)) { DSP.DataRAM[3][DSP.CT[3]] = src_data; ct_inc |= 1 << 24; } break;
case 0x4: DSP.RX = src_data; break;
case 0x5: DSP.P.T = (int32)src_data; break;
case 0x6: DSP.RAO = src_data; break;
case 0x7: DSP.WAO = src_data; break;
case 0x8:
case 0x9: break;
case 0xA: DSP.LOP = src_data & 0x0FFF; break;
case 0xB: DSP.TOP = src_data & 0xFF; break;
//
// Don't bother masking with 0x3F here, since the & 0x3F3F3F3F mask down below will cover it(and no chance of overflowing into an adjacent byte
// since we're masking out the corresponding byte in ct_inc, too).
//
case 0xC: DSP.CT[0] = src_data; ct_inc &= ~0x000000FF; break;
case 0xD: DSP.CT[1] = src_data; ct_inc &= ~0x0000FF00; break;
case 0xE: DSP.CT[2] = src_data; ct_inc &= ~0x00FF0000; break;
case 0xF: DSP.CT[3] = src_data; ct_inc &= ~0xFF000000; break;
}
}
//
//
//
#ifdef MSB_FIRST
ct_inc = MDFN_bswap32(ct_inc);
#endif
if(x_op >= 0x3 || y_op >= 0x3 || (d1_op & 0x1))
DSP.CT32 = (DSP.CT32 + ct_inc) & 0x3F3F3F3F;
}
extern void (*const DSP_GenFuncTable[2][16][8][8][4])(void) =
{
#include "scu_dsp_gentab.inc"
};
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu_dsp_jmp.cpp - SCU DSP JMP Instructions Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "scu.h"
#pragma GCC optimize("Os")
namespace MDFN_IEN_SS
{
#include "scu_dsp_common.inc"
template<bool looped, unsigned cond>
static NO_INLINE NO_CLONE void JMPInstr(void)
{
const uint32 instr = DSP_InstrPre<looped>();
if(DSP_TestCond<cond>())
DSP.PC = (uint8)instr;
}
extern void (*const DSP_JMPFuncTable[2][128])(void) =
{
#include "scu_dsp_jmptab.inc"
};
}

View File

@ -0,0 +1,4 @@
{ /* looped=0 */
JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x00>, JMPInstr<false, 0x40>, JMPInstr<false, 0x41>, JMPInstr<false, 0x42>, JMPInstr<false, 0x43>, JMPInstr<false, 0x44>, JMPInstr<false, 0x45>, JMPInstr<false, 0x46>, JMPInstr<false, 0x47>, JMPInstr<false, 0x48>, JMPInstr<false, 0x49>, JMPInstr<false, 0x4a>, JMPInstr<false, 0x4b>, JMPInstr<false, 0x4c>, JMPInstr<false, 0x4d>, JMPInstr<false, 0x4e>, JMPInstr<false, 0x4f>, JMPInstr<false, 0x50>, JMPInstr<false, 0x51>, JMPInstr<false, 0x52>, JMPInstr<false, 0x53>, JMPInstr<false, 0x54>, JMPInstr<false, 0x55>, JMPInstr<false, 0x56>, JMPInstr<false, 0x57>, JMPInstr<false, 0x58>, JMPInstr<false, 0x59>, JMPInstr<false, 0x5a>, JMPInstr<false, 0x5b>, JMPInstr<false, 0x5c>, JMPInstr<false, 0x5d>, JMPInstr<false, 0x5e>, JMPInstr<false, 0x5f>, JMPInstr<false, 0x60>, JMPInstr<false, 0x61>, JMPInstr<false, 0x62>, JMPInstr<false, 0x63>, JMPInstr<false, 0x64>, JMPInstr<false, 0x65>, JMPInstr<false, 0x66>, JMPInstr<false, 0x67>, JMPInstr<false, 0x68>, JMPInstr<false, 0x69>, JMPInstr<false, 0x6a>, JMPInstr<false, 0x6b>, JMPInstr<false, 0x6c>, JMPInstr<false, 0x6d>, JMPInstr<false, 0x6e>, JMPInstr<false, 0x6f>, JMPInstr<false, 0x70>, JMPInstr<false, 0x71>, JMPInstr<false, 0x72>, JMPInstr<false, 0x73>, JMPInstr<false, 0x74>, JMPInstr<false, 0x75>, JMPInstr<false, 0x76>, JMPInstr<false, 0x77>, JMPInstr<false, 0x78>, JMPInstr<false, 0x79>, JMPInstr<false, 0x7a>, JMPInstr<false, 0x7b>, JMPInstr<false, 0x7c>, JMPInstr<false, 0x7d>, JMPInstr<false, 0x7e>, JMPInstr<false, 0x7f>, },
{ /* looped=1 */
JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x00>, JMPInstr<true, 0x40>, JMPInstr<true, 0x41>, JMPInstr<true, 0x42>, JMPInstr<true, 0x43>, JMPInstr<true, 0x44>, JMPInstr<true, 0x45>, JMPInstr<true, 0x46>, JMPInstr<true, 0x47>, JMPInstr<true, 0x48>, JMPInstr<true, 0x49>, JMPInstr<true, 0x4a>, JMPInstr<true, 0x4b>, JMPInstr<true, 0x4c>, JMPInstr<true, 0x4d>, JMPInstr<true, 0x4e>, JMPInstr<true, 0x4f>, JMPInstr<true, 0x50>, JMPInstr<true, 0x51>, JMPInstr<true, 0x52>, JMPInstr<true, 0x53>, JMPInstr<true, 0x54>, JMPInstr<true, 0x55>, JMPInstr<true, 0x56>, JMPInstr<true, 0x57>, JMPInstr<true, 0x58>, JMPInstr<true, 0x59>, JMPInstr<true, 0x5a>, JMPInstr<true, 0x5b>, JMPInstr<true, 0x5c>, JMPInstr<true, 0x5d>, JMPInstr<true, 0x5e>, JMPInstr<true, 0x5f>, JMPInstr<true, 0x60>, JMPInstr<true, 0x61>, JMPInstr<true, 0x62>, JMPInstr<true, 0x63>, JMPInstr<true, 0x64>, JMPInstr<true, 0x65>, JMPInstr<true, 0x66>, JMPInstr<true, 0x67>, JMPInstr<true, 0x68>, JMPInstr<true, 0x69>, JMPInstr<true, 0x6a>, JMPInstr<true, 0x6b>, JMPInstr<true, 0x6c>, JMPInstr<true, 0x6d>, JMPInstr<true, 0x6e>, JMPInstr<true, 0x6f>, JMPInstr<true, 0x70>, JMPInstr<true, 0x71>, JMPInstr<true, 0x72>, JMPInstr<true, 0x73>, JMPInstr<true, 0x74>, JMPInstr<true, 0x75>, JMPInstr<true, 0x76>, JMPInstr<true, 0x77>, JMPInstr<true, 0x78>, JMPInstr<true, 0x79>, JMPInstr<true, 0x7a>, JMPInstr<true, 0x7b>, JMPInstr<true, 0x7c>, JMPInstr<true, 0x7d>, JMPInstr<true, 0x7e>, JMPInstr<true, 0x7f>, },

View File

@ -0,0 +1,69 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu_dsp_misc.cpp - SCU DSP Miscellaneous Instructions Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "scu.h"
#pragma GCC optimize("Os")
namespace MDFN_IEN_SS
{
#include "scu_dsp_common.inc"
template<bool looped, unsigned op>
static NO_INLINE NO_CLONE void MiscInstr(void)
{
DSP_InstrPre<looped>();
//
// END/ENDI
//
if(op == 2 || op == 3)
{
if(op & 0x1)
{
DSP.FlagEnd = true;
SCU_SetInt(SCU_INT_DSP, true);
}
DSP.NextInstr = DSP_DecodeInstruction(0);
DSP.State &= ~DSPS::STATE_MASK_EXECUTE;
DSP.CycleCounter -= DSP_EndCCSubVal; // Break out of execution loop(also remember to handle this case for manual stepping via port writes).
}
else if(op == 0) // BTM
{
if(DSP.LOP)
{
DSP.LOP--;
DSP.PC = DSP.TOP;
}
}
else if(op == 1) // LPS
{
DSP.NextInstr = DSP_DecodeInstruction<true>(DSP.NextInstr >> 32);
}
}
extern void (*const DSP_MiscFuncTable[2][4])(void) =
{
#include "scu_dsp_misctab.inc"
};
}

View File

@ -0,0 +1,2 @@
{ /* looped=0 */ MiscInstr<false, 0>, MiscInstr<false, 1>, MiscInstr<false, 2>, MiscInstr<false, 3>, },
{ /* looped=1 */ MiscInstr<true, 0>, MiscInstr<true, 1>, MiscInstr<true, 2>, MiscInstr<true, 3>, },

View File

@ -0,0 +1,76 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* scu_dsp_mvi.cpp - SCU DSP MVI Instructions Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "scu.h"
#pragma GCC optimize("Os")
namespace MDFN_IEN_SS
{
#include "scu_dsp_common.inc"
template<bool looped, unsigned dest, unsigned cond>
static NO_INLINE NO_CLONE void MVIInstr(void)
{
const uint32 instr = DSP_InstrPre<looped>();
uint32 imm;
if(cond & 0x40)
imm = sign_x_to_s32(19, instr);
else
imm = sign_x_to_s32(25, instr);
if(DSP_TestCond<cond>())
{
switch(dest)
{
default:
SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] MVI unknown dest 0x%01x --- Instr=0x%08x, Next_Instr=0x%08x, PC=0x%02x\n", dest, instr, (unsigned)(DSP.NextInstr >> 32), DSP.PC);
break;
case 0x0:
case 0x1:
case 0x2:
case 0x3:
DSP.DataRAM[dest][DSP.CT[dest]] = imm;
DSP.CT[dest] = (DSP.CT[dest] + 1) & 0x3F;
break;
case 0x4: DSP.RX = imm; break;
case 0x5: DSP.P.T = (int32)imm; break;
case 0x6: DSP.RAO = imm; break;
case 0x7: DSP.WAO = imm; break;
case 0xA: DSP.LOP = imm & 0x0FFF; break;
case 0xC: DSP.TOP = DSP.PC - 1; DSP.PC = imm & 0xFF; break;
}
}
}
extern void (*const DSP_MVIFuncTable[2][16][128])(void) =
{
#include "scu_dsp_mvitab.inc"
};
}

View File

@ -0,0 +1,100 @@
{ /* looped=0 */
{
MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x00>, MVIInstr<false, 0x0, 0x40>, MVIInstr<false, 0x0, 0x41>, MVIInstr<false, 0x0, 0x42>, MVIInstr<false, 0x0, 0x43>, MVIInstr<false, 0x0, 0x44>, MVIInstr<false, 0x0, 0x45>, MVIInstr<false, 0x0, 0x46>, MVIInstr<false, 0x0, 0x47>, MVIInstr<false, 0x0, 0x48>, MVIInstr<false, 0x0, 0x49>, MVIInstr<false, 0x0, 0x4a>, MVIInstr<false, 0x0, 0x4b>, MVIInstr<false, 0x0, 0x4c>, MVIInstr<false, 0x0, 0x4d>, MVIInstr<false, 0x0, 0x4e>, MVIInstr<false, 0x0, 0x4f>, MVIInstr<false, 0x0, 0x50>, MVIInstr<false, 0x0, 0x51>, MVIInstr<false, 0x0, 0x52>, MVIInstr<false, 0x0, 0x53>, MVIInstr<false, 0x0, 0x54>, MVIInstr<false, 0x0, 0x55>, MVIInstr<false, 0x0, 0x56>, MVIInstr<false, 0x0, 0x57>, MVIInstr<false, 0x0, 0x58>, MVIInstr<false, 0x0, 0x59>, MVIInstr<false, 0x0, 0x5a>, MVIInstr<false, 0x0, 0x5b>, MVIInstr<false, 0x0, 0x5c>, MVIInstr<false, 0x0, 0x5d>, MVIInstr<false, 0x0, 0x5e>, MVIInstr<false, 0x0, 0x5f>, MVIInstr<false, 0x0, 0x60>, MVIInstr<false, 0x0, 0x61>, MVIInstr<false, 0x0, 0x62>, MVIInstr<false, 0x0, 0x63>, MVIInstr<false, 0x0, 0x64>, MVIInstr<false, 0x0, 0x65>, MVIInstr<false, 0x0, 0x66>, MVIInstr<false, 0x0, 0x67>, MVIInstr<false, 0x0, 0x68>, MVIInstr<false, 0x0, 0x69>, MVIInstr<false, 0x0, 0x6a>, MVIInstr<false, 0x0, 0x6b>, MVIInstr<false, 0x0, 0x6c>, MVIInstr<false, 0x0, 0x6d>, MVIInstr<false, 0x0, 0x6e>, MVIInstr<false, 0x0, 0x6f>, MVIInstr<false, 0x0, 0x70>, MVIInstr<false, 0x0, 0x71>, MVIInstr<false, 0x0, 0x72>, MVIInstr<false, 0x0, 0x73>, MVIInstr<false, 0x0, 0x74>, MVIInstr<false, 0x0, 0x75>, MVIInstr<false, 0x0, 0x76>, MVIInstr<false, 0x0, 0x77>, MVIInstr<false, 0x0, 0x78>, MVIInstr<false, 0x0, 0x79>, MVIInstr<false, 0x0, 0x7a>, MVIInstr<false, 0x0, 0x7b>, MVIInstr<false, 0x0, 0x7c>, MVIInstr<false, 0x0, 0x7d>, MVIInstr<false, 0x0, 0x7e>, MVIInstr<false, 0x0, 0x7f>,
},
{
MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x00>, MVIInstr<false, 0x1, 0x40>, MVIInstr<false, 0x1, 0x41>, MVIInstr<false, 0x1, 0x42>, MVIInstr<false, 0x1, 0x43>, MVIInstr<false, 0x1, 0x44>, MVIInstr<false, 0x1, 0x45>, MVIInstr<false, 0x1, 0x46>, MVIInstr<false, 0x1, 0x47>, MVIInstr<false, 0x1, 0x48>, MVIInstr<false, 0x1, 0x49>, MVIInstr<false, 0x1, 0x4a>, MVIInstr<false, 0x1, 0x4b>, MVIInstr<false, 0x1, 0x4c>, MVIInstr<false, 0x1, 0x4d>, MVIInstr<false, 0x1, 0x4e>, MVIInstr<false, 0x1, 0x4f>, MVIInstr<false, 0x1, 0x50>, MVIInstr<false, 0x1, 0x51>, MVIInstr<false, 0x1, 0x52>, MVIInstr<false, 0x1, 0x53>, MVIInstr<false, 0x1, 0x54>, MVIInstr<false, 0x1, 0x55>, MVIInstr<false, 0x1, 0x56>, MVIInstr<false, 0x1, 0x57>, MVIInstr<false, 0x1, 0x58>, MVIInstr<false, 0x1, 0x59>, MVIInstr<false, 0x1, 0x5a>, MVIInstr<false, 0x1, 0x5b>, MVIInstr<false, 0x1, 0x5c>, MVIInstr<false, 0x1, 0x5d>, MVIInstr<false, 0x1, 0x5e>, MVIInstr<false, 0x1, 0x5f>, MVIInstr<false, 0x1, 0x60>, MVIInstr<false, 0x1, 0x61>, MVIInstr<false, 0x1, 0x62>, MVIInstr<false, 0x1, 0x63>, MVIInstr<false, 0x1, 0x64>, MVIInstr<false, 0x1, 0x65>, MVIInstr<false, 0x1, 0x66>, MVIInstr<false, 0x1, 0x67>, MVIInstr<false, 0x1, 0x68>, MVIInstr<false, 0x1, 0x69>, MVIInstr<false, 0x1, 0x6a>, MVIInstr<false, 0x1, 0x6b>, MVIInstr<false, 0x1, 0x6c>, MVIInstr<false, 0x1, 0x6d>, MVIInstr<false, 0x1, 0x6e>, MVIInstr<false, 0x1, 0x6f>, MVIInstr<false, 0x1, 0x70>, MVIInstr<false, 0x1, 0x71>, MVIInstr<false, 0x1, 0x72>, MVIInstr<false, 0x1, 0x73>, MVIInstr<false, 0x1, 0x74>, MVIInstr<false, 0x1, 0x75>, MVIInstr<false, 0x1, 0x76>, MVIInstr<false, 0x1, 0x77>, MVIInstr<false, 0x1, 0x78>, MVIInstr<false, 0x1, 0x79>, MVIInstr<false, 0x1, 0x7a>, MVIInstr<false, 0x1, 0x7b>, MVIInstr<false, 0x1, 0x7c>, MVIInstr<false, 0x1, 0x7d>, MVIInstr<false, 0x1, 0x7e>, MVIInstr<false, 0x1, 0x7f>,
},
{
MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x00>, MVIInstr<false, 0x2, 0x40>, MVIInstr<false, 0x2, 0x41>, MVIInstr<false, 0x2, 0x42>, MVIInstr<false, 0x2, 0x43>, MVIInstr<false, 0x2, 0x44>, MVIInstr<false, 0x2, 0x45>, MVIInstr<false, 0x2, 0x46>, MVIInstr<false, 0x2, 0x47>, MVIInstr<false, 0x2, 0x48>, MVIInstr<false, 0x2, 0x49>, MVIInstr<false, 0x2, 0x4a>, MVIInstr<false, 0x2, 0x4b>, MVIInstr<false, 0x2, 0x4c>, MVIInstr<false, 0x2, 0x4d>, MVIInstr<false, 0x2, 0x4e>, MVIInstr<false, 0x2, 0x4f>, MVIInstr<false, 0x2, 0x50>, MVIInstr<false, 0x2, 0x51>, MVIInstr<false, 0x2, 0x52>, MVIInstr<false, 0x2, 0x53>, MVIInstr<false, 0x2, 0x54>, MVIInstr<false, 0x2, 0x55>, MVIInstr<false, 0x2, 0x56>, MVIInstr<false, 0x2, 0x57>, MVIInstr<false, 0x2, 0x58>, MVIInstr<false, 0x2, 0x59>, MVIInstr<false, 0x2, 0x5a>, MVIInstr<false, 0x2, 0x5b>, MVIInstr<false, 0x2, 0x5c>, MVIInstr<false, 0x2, 0x5d>, MVIInstr<false, 0x2, 0x5e>, MVIInstr<false, 0x2, 0x5f>, MVIInstr<false, 0x2, 0x60>, MVIInstr<false, 0x2, 0x61>, MVIInstr<false, 0x2, 0x62>, MVIInstr<false, 0x2, 0x63>, MVIInstr<false, 0x2, 0x64>, MVIInstr<false, 0x2, 0x65>, MVIInstr<false, 0x2, 0x66>, MVIInstr<false, 0x2, 0x67>, MVIInstr<false, 0x2, 0x68>, MVIInstr<false, 0x2, 0x69>, MVIInstr<false, 0x2, 0x6a>, MVIInstr<false, 0x2, 0x6b>, MVIInstr<false, 0x2, 0x6c>, MVIInstr<false, 0x2, 0x6d>, MVIInstr<false, 0x2, 0x6e>, MVIInstr<false, 0x2, 0x6f>, MVIInstr<false, 0x2, 0x70>, MVIInstr<false, 0x2, 0x71>, MVIInstr<false, 0x2, 0x72>, MVIInstr<false, 0x2, 0x73>, MVIInstr<false, 0x2, 0x74>, MVIInstr<false, 0x2, 0x75>, MVIInstr<false, 0x2, 0x76>, MVIInstr<false, 0x2, 0x77>, MVIInstr<false, 0x2, 0x78>, MVIInstr<false, 0x2, 0x79>, MVIInstr<false, 0x2, 0x7a>, MVIInstr<false, 0x2, 0x7b>, MVIInstr<false, 0x2, 0x7c>, MVIInstr<false, 0x2, 0x7d>, MVIInstr<false, 0x2, 0x7e>, MVIInstr<false, 0x2, 0x7f>,
},
{
MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x00>, MVIInstr<false, 0x3, 0x40>, MVIInstr<false, 0x3, 0x41>, MVIInstr<false, 0x3, 0x42>, MVIInstr<false, 0x3, 0x43>, MVIInstr<false, 0x3, 0x44>, MVIInstr<false, 0x3, 0x45>, MVIInstr<false, 0x3, 0x46>, MVIInstr<false, 0x3, 0x47>, MVIInstr<false, 0x3, 0x48>, MVIInstr<false, 0x3, 0x49>, MVIInstr<false, 0x3, 0x4a>, MVIInstr<false, 0x3, 0x4b>, MVIInstr<false, 0x3, 0x4c>, MVIInstr<false, 0x3, 0x4d>, MVIInstr<false, 0x3, 0x4e>, MVIInstr<false, 0x3, 0x4f>, MVIInstr<false, 0x3, 0x50>, MVIInstr<false, 0x3, 0x51>, MVIInstr<false, 0x3, 0x52>, MVIInstr<false, 0x3, 0x53>, MVIInstr<false, 0x3, 0x54>, MVIInstr<false, 0x3, 0x55>, MVIInstr<false, 0x3, 0x56>, MVIInstr<false, 0x3, 0x57>, MVIInstr<false, 0x3, 0x58>, MVIInstr<false, 0x3, 0x59>, MVIInstr<false, 0x3, 0x5a>, MVIInstr<false, 0x3, 0x5b>, MVIInstr<false, 0x3, 0x5c>, MVIInstr<false, 0x3, 0x5d>, MVIInstr<false, 0x3, 0x5e>, MVIInstr<false, 0x3, 0x5f>, MVIInstr<false, 0x3, 0x60>, MVIInstr<false, 0x3, 0x61>, MVIInstr<false, 0x3, 0x62>, MVIInstr<false, 0x3, 0x63>, MVIInstr<false, 0x3, 0x64>, MVIInstr<false, 0x3, 0x65>, MVIInstr<false, 0x3, 0x66>, MVIInstr<false, 0x3, 0x67>, MVIInstr<false, 0x3, 0x68>, MVIInstr<false, 0x3, 0x69>, MVIInstr<false, 0x3, 0x6a>, MVIInstr<false, 0x3, 0x6b>, MVIInstr<false, 0x3, 0x6c>, MVIInstr<false, 0x3, 0x6d>, MVIInstr<false, 0x3, 0x6e>, MVIInstr<false, 0x3, 0x6f>, MVIInstr<false, 0x3, 0x70>, MVIInstr<false, 0x3, 0x71>, MVIInstr<false, 0x3, 0x72>, MVIInstr<false, 0x3, 0x73>, MVIInstr<false, 0x3, 0x74>, MVIInstr<false, 0x3, 0x75>, MVIInstr<false, 0x3, 0x76>, MVIInstr<false, 0x3, 0x77>, MVIInstr<false, 0x3, 0x78>, MVIInstr<false, 0x3, 0x79>, MVIInstr<false, 0x3, 0x7a>, MVIInstr<false, 0x3, 0x7b>, MVIInstr<false, 0x3, 0x7c>, MVIInstr<false, 0x3, 0x7d>, MVIInstr<false, 0x3, 0x7e>, MVIInstr<false, 0x3, 0x7f>,
},
{
MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x00>, MVIInstr<false, 0x4, 0x40>, MVIInstr<false, 0x4, 0x41>, MVIInstr<false, 0x4, 0x42>, MVIInstr<false, 0x4, 0x43>, MVIInstr<false, 0x4, 0x44>, MVIInstr<false, 0x4, 0x45>, MVIInstr<false, 0x4, 0x46>, MVIInstr<false, 0x4, 0x47>, MVIInstr<false, 0x4, 0x48>, MVIInstr<false, 0x4, 0x49>, MVIInstr<false, 0x4, 0x4a>, MVIInstr<false, 0x4, 0x4b>, MVIInstr<false, 0x4, 0x4c>, MVIInstr<false, 0x4, 0x4d>, MVIInstr<false, 0x4, 0x4e>, MVIInstr<false, 0x4, 0x4f>, MVIInstr<false, 0x4, 0x50>, MVIInstr<false, 0x4, 0x51>, MVIInstr<false, 0x4, 0x52>, MVIInstr<false, 0x4, 0x53>, MVIInstr<false, 0x4, 0x54>, MVIInstr<false, 0x4, 0x55>, MVIInstr<false, 0x4, 0x56>, MVIInstr<false, 0x4, 0x57>, MVIInstr<false, 0x4, 0x58>, MVIInstr<false, 0x4, 0x59>, MVIInstr<false, 0x4, 0x5a>, MVIInstr<false, 0x4, 0x5b>, MVIInstr<false, 0x4, 0x5c>, MVIInstr<false, 0x4, 0x5d>, MVIInstr<false, 0x4, 0x5e>, MVIInstr<false, 0x4, 0x5f>, MVIInstr<false, 0x4, 0x60>, MVIInstr<false, 0x4, 0x61>, MVIInstr<false, 0x4, 0x62>, MVIInstr<false, 0x4, 0x63>, MVIInstr<false, 0x4, 0x64>, MVIInstr<false, 0x4, 0x65>, MVIInstr<false, 0x4, 0x66>, MVIInstr<false, 0x4, 0x67>, MVIInstr<false, 0x4, 0x68>, MVIInstr<false, 0x4, 0x69>, MVIInstr<false, 0x4, 0x6a>, MVIInstr<false, 0x4, 0x6b>, MVIInstr<false, 0x4, 0x6c>, MVIInstr<false, 0x4, 0x6d>, MVIInstr<false, 0x4, 0x6e>, MVIInstr<false, 0x4, 0x6f>, MVIInstr<false, 0x4, 0x70>, MVIInstr<false, 0x4, 0x71>, MVIInstr<false, 0x4, 0x72>, MVIInstr<false, 0x4, 0x73>, MVIInstr<false, 0x4, 0x74>, MVIInstr<false, 0x4, 0x75>, MVIInstr<false, 0x4, 0x76>, MVIInstr<false, 0x4, 0x77>, MVIInstr<false, 0x4, 0x78>, MVIInstr<false, 0x4, 0x79>, MVIInstr<false, 0x4, 0x7a>, MVIInstr<false, 0x4, 0x7b>, MVIInstr<false, 0x4, 0x7c>, MVIInstr<false, 0x4, 0x7d>, MVIInstr<false, 0x4, 0x7e>, MVIInstr<false, 0x4, 0x7f>,
},
{
MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x00>, MVIInstr<false, 0x5, 0x40>, MVIInstr<false, 0x5, 0x41>, MVIInstr<false, 0x5, 0x42>, MVIInstr<false, 0x5, 0x43>, MVIInstr<false, 0x5, 0x44>, MVIInstr<false, 0x5, 0x45>, MVIInstr<false, 0x5, 0x46>, MVIInstr<false, 0x5, 0x47>, MVIInstr<false, 0x5, 0x48>, MVIInstr<false, 0x5, 0x49>, MVIInstr<false, 0x5, 0x4a>, MVIInstr<false, 0x5, 0x4b>, MVIInstr<false, 0x5, 0x4c>, MVIInstr<false, 0x5, 0x4d>, MVIInstr<false, 0x5, 0x4e>, MVIInstr<false, 0x5, 0x4f>, MVIInstr<false, 0x5, 0x50>, MVIInstr<false, 0x5, 0x51>, MVIInstr<false, 0x5, 0x52>, MVIInstr<false, 0x5, 0x53>, MVIInstr<false, 0x5, 0x54>, MVIInstr<false, 0x5, 0x55>, MVIInstr<false, 0x5, 0x56>, MVIInstr<false, 0x5, 0x57>, MVIInstr<false, 0x5, 0x58>, MVIInstr<false, 0x5, 0x59>, MVIInstr<false, 0x5, 0x5a>, MVIInstr<false, 0x5, 0x5b>, MVIInstr<false, 0x5, 0x5c>, MVIInstr<false, 0x5, 0x5d>, MVIInstr<false, 0x5, 0x5e>, MVIInstr<false, 0x5, 0x5f>, MVIInstr<false, 0x5, 0x60>, MVIInstr<false, 0x5, 0x61>, MVIInstr<false, 0x5, 0x62>, MVIInstr<false, 0x5, 0x63>, MVIInstr<false, 0x5, 0x64>, MVIInstr<false, 0x5, 0x65>, MVIInstr<false, 0x5, 0x66>, MVIInstr<false, 0x5, 0x67>, MVIInstr<false, 0x5, 0x68>, MVIInstr<false, 0x5, 0x69>, MVIInstr<false, 0x5, 0x6a>, MVIInstr<false, 0x5, 0x6b>, MVIInstr<false, 0x5, 0x6c>, MVIInstr<false, 0x5, 0x6d>, MVIInstr<false, 0x5, 0x6e>, MVIInstr<false, 0x5, 0x6f>, MVIInstr<false, 0x5, 0x70>, MVIInstr<false, 0x5, 0x71>, MVIInstr<false, 0x5, 0x72>, MVIInstr<false, 0x5, 0x73>, MVIInstr<false, 0x5, 0x74>, MVIInstr<false, 0x5, 0x75>, MVIInstr<false, 0x5, 0x76>, MVIInstr<false, 0x5, 0x77>, MVIInstr<false, 0x5, 0x78>, MVIInstr<false, 0x5, 0x79>, MVIInstr<false, 0x5, 0x7a>, MVIInstr<false, 0x5, 0x7b>, MVIInstr<false, 0x5, 0x7c>, MVIInstr<false, 0x5, 0x7d>, MVIInstr<false, 0x5, 0x7e>, MVIInstr<false, 0x5, 0x7f>,
},
{
MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x00>, MVIInstr<false, 0x6, 0x40>, MVIInstr<false, 0x6, 0x41>, MVIInstr<false, 0x6, 0x42>, MVIInstr<false, 0x6, 0x43>, MVIInstr<false, 0x6, 0x44>, MVIInstr<false, 0x6, 0x45>, MVIInstr<false, 0x6, 0x46>, MVIInstr<false, 0x6, 0x47>, MVIInstr<false, 0x6, 0x48>, MVIInstr<false, 0x6, 0x49>, MVIInstr<false, 0x6, 0x4a>, MVIInstr<false, 0x6, 0x4b>, MVIInstr<false, 0x6, 0x4c>, MVIInstr<false, 0x6, 0x4d>, MVIInstr<false, 0x6, 0x4e>, MVIInstr<false, 0x6, 0x4f>, MVIInstr<false, 0x6, 0x50>, MVIInstr<false, 0x6, 0x51>, MVIInstr<false, 0x6, 0x52>, MVIInstr<false, 0x6, 0x53>, MVIInstr<false, 0x6, 0x54>, MVIInstr<false, 0x6, 0x55>, MVIInstr<false, 0x6, 0x56>, MVIInstr<false, 0x6, 0x57>, MVIInstr<false, 0x6, 0x58>, MVIInstr<false, 0x6, 0x59>, MVIInstr<false, 0x6, 0x5a>, MVIInstr<false, 0x6, 0x5b>, MVIInstr<false, 0x6, 0x5c>, MVIInstr<false, 0x6, 0x5d>, MVIInstr<false, 0x6, 0x5e>, MVIInstr<false, 0x6, 0x5f>, MVIInstr<false, 0x6, 0x60>, MVIInstr<false, 0x6, 0x61>, MVIInstr<false, 0x6, 0x62>, MVIInstr<false, 0x6, 0x63>, MVIInstr<false, 0x6, 0x64>, MVIInstr<false, 0x6, 0x65>, MVIInstr<false, 0x6, 0x66>, MVIInstr<false, 0x6, 0x67>, MVIInstr<false, 0x6, 0x68>, MVIInstr<false, 0x6, 0x69>, MVIInstr<false, 0x6, 0x6a>, MVIInstr<false, 0x6, 0x6b>, MVIInstr<false, 0x6, 0x6c>, MVIInstr<false, 0x6, 0x6d>, MVIInstr<false, 0x6, 0x6e>, MVIInstr<false, 0x6, 0x6f>, MVIInstr<false, 0x6, 0x70>, MVIInstr<false, 0x6, 0x71>, MVIInstr<false, 0x6, 0x72>, MVIInstr<false, 0x6, 0x73>, MVIInstr<false, 0x6, 0x74>, MVIInstr<false, 0x6, 0x75>, MVIInstr<false, 0x6, 0x76>, MVIInstr<false, 0x6, 0x77>, MVIInstr<false, 0x6, 0x78>, MVIInstr<false, 0x6, 0x79>, MVIInstr<false, 0x6, 0x7a>, MVIInstr<false, 0x6, 0x7b>, MVIInstr<false, 0x6, 0x7c>, MVIInstr<false, 0x6, 0x7d>, MVIInstr<false, 0x6, 0x7e>, MVIInstr<false, 0x6, 0x7f>,
},
{
MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x00>, MVIInstr<false, 0x7, 0x40>, MVIInstr<false, 0x7, 0x41>, MVIInstr<false, 0x7, 0x42>, MVIInstr<false, 0x7, 0x43>, MVIInstr<false, 0x7, 0x44>, MVIInstr<false, 0x7, 0x45>, MVIInstr<false, 0x7, 0x46>, MVIInstr<false, 0x7, 0x47>, MVIInstr<false, 0x7, 0x48>, MVIInstr<false, 0x7, 0x49>, MVIInstr<false, 0x7, 0x4a>, MVIInstr<false, 0x7, 0x4b>, MVIInstr<false, 0x7, 0x4c>, MVIInstr<false, 0x7, 0x4d>, MVIInstr<false, 0x7, 0x4e>, MVIInstr<false, 0x7, 0x4f>, MVIInstr<false, 0x7, 0x50>, MVIInstr<false, 0x7, 0x51>, MVIInstr<false, 0x7, 0x52>, MVIInstr<false, 0x7, 0x53>, MVIInstr<false, 0x7, 0x54>, MVIInstr<false, 0x7, 0x55>, MVIInstr<false, 0x7, 0x56>, MVIInstr<false, 0x7, 0x57>, MVIInstr<false, 0x7, 0x58>, MVIInstr<false, 0x7, 0x59>, MVIInstr<false, 0x7, 0x5a>, MVIInstr<false, 0x7, 0x5b>, MVIInstr<false, 0x7, 0x5c>, MVIInstr<false, 0x7, 0x5d>, MVIInstr<false, 0x7, 0x5e>, MVIInstr<false, 0x7, 0x5f>, MVIInstr<false, 0x7, 0x60>, MVIInstr<false, 0x7, 0x61>, MVIInstr<false, 0x7, 0x62>, MVIInstr<false, 0x7, 0x63>, MVIInstr<false, 0x7, 0x64>, MVIInstr<false, 0x7, 0x65>, MVIInstr<false, 0x7, 0x66>, MVIInstr<false, 0x7, 0x67>, MVIInstr<false, 0x7, 0x68>, MVIInstr<false, 0x7, 0x69>, MVIInstr<false, 0x7, 0x6a>, MVIInstr<false, 0x7, 0x6b>, MVIInstr<false, 0x7, 0x6c>, MVIInstr<false, 0x7, 0x6d>, MVIInstr<false, 0x7, 0x6e>, MVIInstr<false, 0x7, 0x6f>, MVIInstr<false, 0x7, 0x70>, MVIInstr<false, 0x7, 0x71>, MVIInstr<false, 0x7, 0x72>, MVIInstr<false, 0x7, 0x73>, MVIInstr<false, 0x7, 0x74>, MVIInstr<false, 0x7, 0x75>, MVIInstr<false, 0x7, 0x76>, MVIInstr<false, 0x7, 0x77>, MVIInstr<false, 0x7, 0x78>, MVIInstr<false, 0x7, 0x79>, MVIInstr<false, 0x7, 0x7a>, MVIInstr<false, 0x7, 0x7b>, MVIInstr<false, 0x7, 0x7c>, MVIInstr<false, 0x7, 0x7d>, MVIInstr<false, 0x7, 0x7e>, MVIInstr<false, 0x7, 0x7f>,
},
{
MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x00>, MVIInstr<false, 0x8, 0x40>, MVIInstr<false, 0x8, 0x41>, MVIInstr<false, 0x8, 0x42>, MVIInstr<false, 0x8, 0x43>, MVIInstr<false, 0x8, 0x44>, MVIInstr<false, 0x8, 0x45>, MVIInstr<false, 0x8, 0x46>, MVIInstr<false, 0x8, 0x47>, MVIInstr<false, 0x8, 0x48>, MVIInstr<false, 0x8, 0x49>, MVIInstr<false, 0x8, 0x4a>, MVIInstr<false, 0x8, 0x4b>, MVIInstr<false, 0x8, 0x4c>, MVIInstr<false, 0x8, 0x4d>, MVIInstr<false, 0x8, 0x4e>, MVIInstr<false, 0x8, 0x4f>, MVIInstr<false, 0x8, 0x50>, MVIInstr<false, 0x8, 0x51>, MVIInstr<false, 0x8, 0x52>, MVIInstr<false, 0x8, 0x53>, MVIInstr<false, 0x8, 0x54>, MVIInstr<false, 0x8, 0x55>, MVIInstr<false, 0x8, 0x56>, MVIInstr<false, 0x8, 0x57>, MVIInstr<false, 0x8, 0x58>, MVIInstr<false, 0x8, 0x59>, MVIInstr<false, 0x8, 0x5a>, MVIInstr<false, 0x8, 0x5b>, MVIInstr<false, 0x8, 0x5c>, MVIInstr<false, 0x8, 0x5d>, MVIInstr<false, 0x8, 0x5e>, MVIInstr<false, 0x8, 0x5f>, MVIInstr<false, 0x8, 0x60>, MVIInstr<false, 0x8, 0x61>, MVIInstr<false, 0x8, 0x62>, MVIInstr<false, 0x8, 0x63>, MVIInstr<false, 0x8, 0x64>, MVIInstr<false, 0x8, 0x65>, MVIInstr<false, 0x8, 0x66>, MVIInstr<false, 0x8, 0x67>, MVIInstr<false, 0x8, 0x68>, MVIInstr<false, 0x8, 0x69>, MVIInstr<false, 0x8, 0x6a>, MVIInstr<false, 0x8, 0x6b>, MVIInstr<false, 0x8, 0x6c>, MVIInstr<false, 0x8, 0x6d>, MVIInstr<false, 0x8, 0x6e>, MVIInstr<false, 0x8, 0x6f>, MVIInstr<false, 0x8, 0x70>, MVIInstr<false, 0x8, 0x71>, MVIInstr<false, 0x8, 0x72>, MVIInstr<false, 0x8, 0x73>, MVIInstr<false, 0x8, 0x74>, MVIInstr<false, 0x8, 0x75>, MVIInstr<false, 0x8, 0x76>, MVIInstr<false, 0x8, 0x77>, MVIInstr<false, 0x8, 0x78>, MVIInstr<false, 0x8, 0x79>, MVIInstr<false, 0x8, 0x7a>, MVIInstr<false, 0x8, 0x7b>, MVIInstr<false, 0x8, 0x7c>, MVIInstr<false, 0x8, 0x7d>, MVIInstr<false, 0x8, 0x7e>, MVIInstr<false, 0x8, 0x7f>,
},
{
MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x00>, MVIInstr<false, 0x9, 0x40>, MVIInstr<false, 0x9, 0x41>, MVIInstr<false, 0x9, 0x42>, MVIInstr<false, 0x9, 0x43>, MVIInstr<false, 0x9, 0x44>, MVIInstr<false, 0x9, 0x45>, MVIInstr<false, 0x9, 0x46>, MVIInstr<false, 0x9, 0x47>, MVIInstr<false, 0x9, 0x48>, MVIInstr<false, 0x9, 0x49>, MVIInstr<false, 0x9, 0x4a>, MVIInstr<false, 0x9, 0x4b>, MVIInstr<false, 0x9, 0x4c>, MVIInstr<false, 0x9, 0x4d>, MVIInstr<false, 0x9, 0x4e>, MVIInstr<false, 0x9, 0x4f>, MVIInstr<false, 0x9, 0x50>, MVIInstr<false, 0x9, 0x51>, MVIInstr<false, 0x9, 0x52>, MVIInstr<false, 0x9, 0x53>, MVIInstr<false, 0x9, 0x54>, MVIInstr<false, 0x9, 0x55>, MVIInstr<false, 0x9, 0x56>, MVIInstr<false, 0x9, 0x57>, MVIInstr<false, 0x9, 0x58>, MVIInstr<false, 0x9, 0x59>, MVIInstr<false, 0x9, 0x5a>, MVIInstr<false, 0x9, 0x5b>, MVIInstr<false, 0x9, 0x5c>, MVIInstr<false, 0x9, 0x5d>, MVIInstr<false, 0x9, 0x5e>, MVIInstr<false, 0x9, 0x5f>, MVIInstr<false, 0x9, 0x60>, MVIInstr<false, 0x9, 0x61>, MVIInstr<false, 0x9, 0x62>, MVIInstr<false, 0x9, 0x63>, MVIInstr<false, 0x9, 0x64>, MVIInstr<false, 0x9, 0x65>, MVIInstr<false, 0x9, 0x66>, MVIInstr<false, 0x9, 0x67>, MVIInstr<false, 0x9, 0x68>, MVIInstr<false, 0x9, 0x69>, MVIInstr<false, 0x9, 0x6a>, MVIInstr<false, 0x9, 0x6b>, MVIInstr<false, 0x9, 0x6c>, MVIInstr<false, 0x9, 0x6d>, MVIInstr<false, 0x9, 0x6e>, MVIInstr<false, 0x9, 0x6f>, MVIInstr<false, 0x9, 0x70>, MVIInstr<false, 0x9, 0x71>, MVIInstr<false, 0x9, 0x72>, MVIInstr<false, 0x9, 0x73>, MVIInstr<false, 0x9, 0x74>, MVIInstr<false, 0x9, 0x75>, MVIInstr<false, 0x9, 0x76>, MVIInstr<false, 0x9, 0x77>, MVIInstr<false, 0x9, 0x78>, MVIInstr<false, 0x9, 0x79>, MVIInstr<false, 0x9, 0x7a>, MVIInstr<false, 0x9, 0x7b>, MVIInstr<false, 0x9, 0x7c>, MVIInstr<false, 0x9, 0x7d>, MVIInstr<false, 0x9, 0x7e>, MVIInstr<false, 0x9, 0x7f>,
},
{
MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x00>, MVIInstr<false, 0xa, 0x40>, MVIInstr<false, 0xa, 0x41>, MVIInstr<false, 0xa, 0x42>, MVIInstr<false, 0xa, 0x43>, MVIInstr<false, 0xa, 0x44>, MVIInstr<false, 0xa, 0x45>, MVIInstr<false, 0xa, 0x46>, MVIInstr<false, 0xa, 0x47>, MVIInstr<false, 0xa, 0x48>, MVIInstr<false, 0xa, 0x49>, MVIInstr<false, 0xa, 0x4a>, MVIInstr<false, 0xa, 0x4b>, MVIInstr<false, 0xa, 0x4c>, MVIInstr<false, 0xa, 0x4d>, MVIInstr<false, 0xa, 0x4e>, MVIInstr<false, 0xa, 0x4f>, MVIInstr<false, 0xa, 0x50>, MVIInstr<false, 0xa, 0x51>, MVIInstr<false, 0xa, 0x52>, MVIInstr<false, 0xa, 0x53>, MVIInstr<false, 0xa, 0x54>, MVIInstr<false, 0xa, 0x55>, MVIInstr<false, 0xa, 0x56>, MVIInstr<false, 0xa, 0x57>, MVIInstr<false, 0xa, 0x58>, MVIInstr<false, 0xa, 0x59>, MVIInstr<false, 0xa, 0x5a>, MVIInstr<false, 0xa, 0x5b>, MVIInstr<false, 0xa, 0x5c>, MVIInstr<false, 0xa, 0x5d>, MVIInstr<false, 0xa, 0x5e>, MVIInstr<false, 0xa, 0x5f>, MVIInstr<false, 0xa, 0x60>, MVIInstr<false, 0xa, 0x61>, MVIInstr<false, 0xa, 0x62>, MVIInstr<false, 0xa, 0x63>, MVIInstr<false, 0xa, 0x64>, MVIInstr<false, 0xa, 0x65>, MVIInstr<false, 0xa, 0x66>, MVIInstr<false, 0xa, 0x67>, MVIInstr<false, 0xa, 0x68>, MVIInstr<false, 0xa, 0x69>, MVIInstr<false, 0xa, 0x6a>, MVIInstr<false, 0xa, 0x6b>, MVIInstr<false, 0xa, 0x6c>, MVIInstr<false, 0xa, 0x6d>, MVIInstr<false, 0xa, 0x6e>, MVIInstr<false, 0xa, 0x6f>, MVIInstr<false, 0xa, 0x70>, MVIInstr<false, 0xa, 0x71>, MVIInstr<false, 0xa, 0x72>, MVIInstr<false, 0xa, 0x73>, MVIInstr<false, 0xa, 0x74>, MVIInstr<false, 0xa, 0x75>, MVIInstr<false, 0xa, 0x76>, MVIInstr<false, 0xa, 0x77>, MVIInstr<false, 0xa, 0x78>, MVIInstr<false, 0xa, 0x79>, MVIInstr<false, 0xa, 0x7a>, MVIInstr<false, 0xa, 0x7b>, MVIInstr<false, 0xa, 0x7c>, MVIInstr<false, 0xa, 0x7d>, MVIInstr<false, 0xa, 0x7e>, MVIInstr<false, 0xa, 0x7f>,
},
{
MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x00>, MVIInstr<false, 0xb, 0x40>, MVIInstr<false, 0xb, 0x41>, MVIInstr<false, 0xb, 0x42>, MVIInstr<false, 0xb, 0x43>, MVIInstr<false, 0xb, 0x44>, MVIInstr<false, 0xb, 0x45>, MVIInstr<false, 0xb, 0x46>, MVIInstr<false, 0xb, 0x47>, MVIInstr<false, 0xb, 0x48>, MVIInstr<false, 0xb, 0x49>, MVIInstr<false, 0xb, 0x4a>, MVIInstr<false, 0xb, 0x4b>, MVIInstr<false, 0xb, 0x4c>, MVIInstr<false, 0xb, 0x4d>, MVIInstr<false, 0xb, 0x4e>, MVIInstr<false, 0xb, 0x4f>, MVIInstr<false, 0xb, 0x50>, MVIInstr<false, 0xb, 0x51>, MVIInstr<false, 0xb, 0x52>, MVIInstr<false, 0xb, 0x53>, MVIInstr<false, 0xb, 0x54>, MVIInstr<false, 0xb, 0x55>, MVIInstr<false, 0xb, 0x56>, MVIInstr<false, 0xb, 0x57>, MVIInstr<false, 0xb, 0x58>, MVIInstr<false, 0xb, 0x59>, MVIInstr<false, 0xb, 0x5a>, MVIInstr<false, 0xb, 0x5b>, MVIInstr<false, 0xb, 0x5c>, MVIInstr<false, 0xb, 0x5d>, MVIInstr<false, 0xb, 0x5e>, MVIInstr<false, 0xb, 0x5f>, MVIInstr<false, 0xb, 0x60>, MVIInstr<false, 0xb, 0x61>, MVIInstr<false, 0xb, 0x62>, MVIInstr<false, 0xb, 0x63>, MVIInstr<false, 0xb, 0x64>, MVIInstr<false, 0xb, 0x65>, MVIInstr<false, 0xb, 0x66>, MVIInstr<false, 0xb, 0x67>, MVIInstr<false, 0xb, 0x68>, MVIInstr<false, 0xb, 0x69>, MVIInstr<false, 0xb, 0x6a>, MVIInstr<false, 0xb, 0x6b>, MVIInstr<false, 0xb, 0x6c>, MVIInstr<false, 0xb, 0x6d>, MVIInstr<false, 0xb, 0x6e>, MVIInstr<false, 0xb, 0x6f>, MVIInstr<false, 0xb, 0x70>, MVIInstr<false, 0xb, 0x71>, MVIInstr<false, 0xb, 0x72>, MVIInstr<false, 0xb, 0x73>, MVIInstr<false, 0xb, 0x74>, MVIInstr<false, 0xb, 0x75>, MVIInstr<false, 0xb, 0x76>, MVIInstr<false, 0xb, 0x77>, MVIInstr<false, 0xb, 0x78>, MVIInstr<false, 0xb, 0x79>, MVIInstr<false, 0xb, 0x7a>, MVIInstr<false, 0xb, 0x7b>, MVIInstr<false, 0xb, 0x7c>, MVIInstr<false, 0xb, 0x7d>, MVIInstr<false, 0xb, 0x7e>, MVIInstr<false, 0xb, 0x7f>,
},
{
MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x00>, MVIInstr<false, 0xc, 0x40>, MVIInstr<false, 0xc, 0x41>, MVIInstr<false, 0xc, 0x42>, MVIInstr<false, 0xc, 0x43>, MVIInstr<false, 0xc, 0x44>, MVIInstr<false, 0xc, 0x45>, MVIInstr<false, 0xc, 0x46>, MVIInstr<false, 0xc, 0x47>, MVIInstr<false, 0xc, 0x48>, MVIInstr<false, 0xc, 0x49>, MVIInstr<false, 0xc, 0x4a>, MVIInstr<false, 0xc, 0x4b>, MVIInstr<false, 0xc, 0x4c>, MVIInstr<false, 0xc, 0x4d>, MVIInstr<false, 0xc, 0x4e>, MVIInstr<false, 0xc, 0x4f>, MVIInstr<false, 0xc, 0x50>, MVIInstr<false, 0xc, 0x51>, MVIInstr<false, 0xc, 0x52>, MVIInstr<false, 0xc, 0x53>, MVIInstr<false, 0xc, 0x54>, MVIInstr<false, 0xc, 0x55>, MVIInstr<false, 0xc, 0x56>, MVIInstr<false, 0xc, 0x57>, MVIInstr<false, 0xc, 0x58>, MVIInstr<false, 0xc, 0x59>, MVIInstr<false, 0xc, 0x5a>, MVIInstr<false, 0xc, 0x5b>, MVIInstr<false, 0xc, 0x5c>, MVIInstr<false, 0xc, 0x5d>, MVIInstr<false, 0xc, 0x5e>, MVIInstr<false, 0xc, 0x5f>, MVIInstr<false, 0xc, 0x60>, MVIInstr<false, 0xc, 0x61>, MVIInstr<false, 0xc, 0x62>, MVIInstr<false, 0xc, 0x63>, MVIInstr<false, 0xc, 0x64>, MVIInstr<false, 0xc, 0x65>, MVIInstr<false, 0xc, 0x66>, MVIInstr<false, 0xc, 0x67>, MVIInstr<false, 0xc, 0x68>, MVIInstr<false, 0xc, 0x69>, MVIInstr<false, 0xc, 0x6a>, MVIInstr<false, 0xc, 0x6b>, MVIInstr<false, 0xc, 0x6c>, MVIInstr<false, 0xc, 0x6d>, MVIInstr<false, 0xc, 0x6e>, MVIInstr<false, 0xc, 0x6f>, MVIInstr<false, 0xc, 0x70>, MVIInstr<false, 0xc, 0x71>, MVIInstr<false, 0xc, 0x72>, MVIInstr<false, 0xc, 0x73>, MVIInstr<false, 0xc, 0x74>, MVIInstr<false, 0xc, 0x75>, MVIInstr<false, 0xc, 0x76>, MVIInstr<false, 0xc, 0x77>, MVIInstr<false, 0xc, 0x78>, MVIInstr<false, 0xc, 0x79>, MVIInstr<false, 0xc, 0x7a>, MVIInstr<false, 0xc, 0x7b>, MVIInstr<false, 0xc, 0x7c>, MVIInstr<false, 0xc, 0x7d>, MVIInstr<false, 0xc, 0x7e>, MVIInstr<false, 0xc, 0x7f>,
},
{
MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x00>, MVIInstr<false, 0xd, 0x40>, MVIInstr<false, 0xd, 0x41>, MVIInstr<false, 0xd, 0x42>, MVIInstr<false, 0xd, 0x43>, MVIInstr<false, 0xd, 0x44>, MVIInstr<false, 0xd, 0x45>, MVIInstr<false, 0xd, 0x46>, MVIInstr<false, 0xd, 0x47>, MVIInstr<false, 0xd, 0x48>, MVIInstr<false, 0xd, 0x49>, MVIInstr<false, 0xd, 0x4a>, MVIInstr<false, 0xd, 0x4b>, MVIInstr<false, 0xd, 0x4c>, MVIInstr<false, 0xd, 0x4d>, MVIInstr<false, 0xd, 0x4e>, MVIInstr<false, 0xd, 0x4f>, MVIInstr<false, 0xd, 0x50>, MVIInstr<false, 0xd, 0x51>, MVIInstr<false, 0xd, 0x52>, MVIInstr<false, 0xd, 0x53>, MVIInstr<false, 0xd, 0x54>, MVIInstr<false, 0xd, 0x55>, MVIInstr<false, 0xd, 0x56>, MVIInstr<false, 0xd, 0x57>, MVIInstr<false, 0xd, 0x58>, MVIInstr<false, 0xd, 0x59>, MVIInstr<false, 0xd, 0x5a>, MVIInstr<false, 0xd, 0x5b>, MVIInstr<false, 0xd, 0x5c>, MVIInstr<false, 0xd, 0x5d>, MVIInstr<false, 0xd, 0x5e>, MVIInstr<false, 0xd, 0x5f>, MVIInstr<false, 0xd, 0x60>, MVIInstr<false, 0xd, 0x61>, MVIInstr<false, 0xd, 0x62>, MVIInstr<false, 0xd, 0x63>, MVIInstr<false, 0xd, 0x64>, MVIInstr<false, 0xd, 0x65>, MVIInstr<false, 0xd, 0x66>, MVIInstr<false, 0xd, 0x67>, MVIInstr<false, 0xd, 0x68>, MVIInstr<false, 0xd, 0x69>, MVIInstr<false, 0xd, 0x6a>, MVIInstr<false, 0xd, 0x6b>, MVIInstr<false, 0xd, 0x6c>, MVIInstr<false, 0xd, 0x6d>, MVIInstr<false, 0xd, 0x6e>, MVIInstr<false, 0xd, 0x6f>, MVIInstr<false, 0xd, 0x70>, MVIInstr<false, 0xd, 0x71>, MVIInstr<false, 0xd, 0x72>, MVIInstr<false, 0xd, 0x73>, MVIInstr<false, 0xd, 0x74>, MVIInstr<false, 0xd, 0x75>, MVIInstr<false, 0xd, 0x76>, MVIInstr<false, 0xd, 0x77>, MVIInstr<false, 0xd, 0x78>, MVIInstr<false, 0xd, 0x79>, MVIInstr<false, 0xd, 0x7a>, MVIInstr<false, 0xd, 0x7b>, MVIInstr<false, 0xd, 0x7c>, MVIInstr<false, 0xd, 0x7d>, MVIInstr<false, 0xd, 0x7e>, MVIInstr<false, 0xd, 0x7f>,
},
{
MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x00>, MVIInstr<false, 0xe, 0x40>, MVIInstr<false, 0xe, 0x41>, MVIInstr<false, 0xe, 0x42>, MVIInstr<false, 0xe, 0x43>, MVIInstr<false, 0xe, 0x44>, MVIInstr<false, 0xe, 0x45>, MVIInstr<false, 0xe, 0x46>, MVIInstr<false, 0xe, 0x47>, MVIInstr<false, 0xe, 0x48>, MVIInstr<false, 0xe, 0x49>, MVIInstr<false, 0xe, 0x4a>, MVIInstr<false, 0xe, 0x4b>, MVIInstr<false, 0xe, 0x4c>, MVIInstr<false, 0xe, 0x4d>, MVIInstr<false, 0xe, 0x4e>, MVIInstr<false, 0xe, 0x4f>, MVIInstr<false, 0xe, 0x50>, MVIInstr<false, 0xe, 0x51>, MVIInstr<false, 0xe, 0x52>, MVIInstr<false, 0xe, 0x53>, MVIInstr<false, 0xe, 0x54>, MVIInstr<false, 0xe, 0x55>, MVIInstr<false, 0xe, 0x56>, MVIInstr<false, 0xe, 0x57>, MVIInstr<false, 0xe, 0x58>, MVIInstr<false, 0xe, 0x59>, MVIInstr<false, 0xe, 0x5a>, MVIInstr<false, 0xe, 0x5b>, MVIInstr<false, 0xe, 0x5c>, MVIInstr<false, 0xe, 0x5d>, MVIInstr<false, 0xe, 0x5e>, MVIInstr<false, 0xe, 0x5f>, MVIInstr<false, 0xe, 0x60>, MVIInstr<false, 0xe, 0x61>, MVIInstr<false, 0xe, 0x62>, MVIInstr<false, 0xe, 0x63>, MVIInstr<false, 0xe, 0x64>, MVIInstr<false, 0xe, 0x65>, MVIInstr<false, 0xe, 0x66>, MVIInstr<false, 0xe, 0x67>, MVIInstr<false, 0xe, 0x68>, MVIInstr<false, 0xe, 0x69>, MVIInstr<false, 0xe, 0x6a>, MVIInstr<false, 0xe, 0x6b>, MVIInstr<false, 0xe, 0x6c>, MVIInstr<false, 0xe, 0x6d>, MVIInstr<false, 0xe, 0x6e>, MVIInstr<false, 0xe, 0x6f>, MVIInstr<false, 0xe, 0x70>, MVIInstr<false, 0xe, 0x71>, MVIInstr<false, 0xe, 0x72>, MVIInstr<false, 0xe, 0x73>, MVIInstr<false, 0xe, 0x74>, MVIInstr<false, 0xe, 0x75>, MVIInstr<false, 0xe, 0x76>, MVIInstr<false, 0xe, 0x77>, MVIInstr<false, 0xe, 0x78>, MVIInstr<false, 0xe, 0x79>, MVIInstr<false, 0xe, 0x7a>, MVIInstr<false, 0xe, 0x7b>, MVIInstr<false, 0xe, 0x7c>, MVIInstr<false, 0xe, 0x7d>, MVIInstr<false, 0xe, 0x7e>, MVIInstr<false, 0xe, 0x7f>,
},
{
MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x00>, MVIInstr<false, 0xf, 0x40>, MVIInstr<false, 0xf, 0x41>, MVIInstr<false, 0xf, 0x42>, MVIInstr<false, 0xf, 0x43>, MVIInstr<false, 0xf, 0x44>, MVIInstr<false, 0xf, 0x45>, MVIInstr<false, 0xf, 0x46>, MVIInstr<false, 0xf, 0x47>, MVIInstr<false, 0xf, 0x48>, MVIInstr<false, 0xf, 0x49>, MVIInstr<false, 0xf, 0x4a>, MVIInstr<false, 0xf, 0x4b>, MVIInstr<false, 0xf, 0x4c>, MVIInstr<false, 0xf, 0x4d>, MVIInstr<false, 0xf, 0x4e>, MVIInstr<false, 0xf, 0x4f>, MVIInstr<false, 0xf, 0x50>, MVIInstr<false, 0xf, 0x51>, MVIInstr<false, 0xf, 0x52>, MVIInstr<false, 0xf, 0x53>, MVIInstr<false, 0xf, 0x54>, MVIInstr<false, 0xf, 0x55>, MVIInstr<false, 0xf, 0x56>, MVIInstr<false, 0xf, 0x57>, MVIInstr<false, 0xf, 0x58>, MVIInstr<false, 0xf, 0x59>, MVIInstr<false, 0xf, 0x5a>, MVIInstr<false, 0xf, 0x5b>, MVIInstr<false, 0xf, 0x5c>, MVIInstr<false, 0xf, 0x5d>, MVIInstr<false, 0xf, 0x5e>, MVIInstr<false, 0xf, 0x5f>, MVIInstr<false, 0xf, 0x60>, MVIInstr<false, 0xf, 0x61>, MVIInstr<false, 0xf, 0x62>, MVIInstr<false, 0xf, 0x63>, MVIInstr<false, 0xf, 0x64>, MVIInstr<false, 0xf, 0x65>, MVIInstr<false, 0xf, 0x66>, MVIInstr<false, 0xf, 0x67>, MVIInstr<false, 0xf, 0x68>, MVIInstr<false, 0xf, 0x69>, MVIInstr<false, 0xf, 0x6a>, MVIInstr<false, 0xf, 0x6b>, MVIInstr<false, 0xf, 0x6c>, MVIInstr<false, 0xf, 0x6d>, MVIInstr<false, 0xf, 0x6e>, MVIInstr<false, 0xf, 0x6f>, MVIInstr<false, 0xf, 0x70>, MVIInstr<false, 0xf, 0x71>, MVIInstr<false, 0xf, 0x72>, MVIInstr<false, 0xf, 0x73>, MVIInstr<false, 0xf, 0x74>, MVIInstr<false, 0xf, 0x75>, MVIInstr<false, 0xf, 0x76>, MVIInstr<false, 0xf, 0x77>, MVIInstr<false, 0xf, 0x78>, MVIInstr<false, 0xf, 0x79>, MVIInstr<false, 0xf, 0x7a>, MVIInstr<false, 0xf, 0x7b>, MVIInstr<false, 0xf, 0x7c>, MVIInstr<false, 0xf, 0x7d>, MVIInstr<false, 0xf, 0x7e>, MVIInstr<false, 0xf, 0x7f>,
},
},
{ /* looped=1 */
{
MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x00>, MVIInstr<true, 0x0, 0x40>, MVIInstr<true, 0x0, 0x41>, MVIInstr<true, 0x0, 0x42>, MVIInstr<true, 0x0, 0x43>, MVIInstr<true, 0x0, 0x44>, MVIInstr<true, 0x0, 0x45>, MVIInstr<true, 0x0, 0x46>, MVIInstr<true, 0x0, 0x47>, MVIInstr<true, 0x0, 0x48>, MVIInstr<true, 0x0, 0x49>, MVIInstr<true, 0x0, 0x4a>, MVIInstr<true, 0x0, 0x4b>, MVIInstr<true, 0x0, 0x4c>, MVIInstr<true, 0x0, 0x4d>, MVIInstr<true, 0x0, 0x4e>, MVIInstr<true, 0x0, 0x4f>, MVIInstr<true, 0x0, 0x50>, MVIInstr<true, 0x0, 0x51>, MVIInstr<true, 0x0, 0x52>, MVIInstr<true, 0x0, 0x53>, MVIInstr<true, 0x0, 0x54>, MVIInstr<true, 0x0, 0x55>, MVIInstr<true, 0x0, 0x56>, MVIInstr<true, 0x0, 0x57>, MVIInstr<true, 0x0, 0x58>, MVIInstr<true, 0x0, 0x59>, MVIInstr<true, 0x0, 0x5a>, MVIInstr<true, 0x0, 0x5b>, MVIInstr<true, 0x0, 0x5c>, MVIInstr<true, 0x0, 0x5d>, MVIInstr<true, 0x0, 0x5e>, MVIInstr<true, 0x0, 0x5f>, MVIInstr<true, 0x0, 0x60>, MVIInstr<true, 0x0, 0x61>, MVIInstr<true, 0x0, 0x62>, MVIInstr<true, 0x0, 0x63>, MVIInstr<true, 0x0, 0x64>, MVIInstr<true, 0x0, 0x65>, MVIInstr<true, 0x0, 0x66>, MVIInstr<true, 0x0, 0x67>, MVIInstr<true, 0x0, 0x68>, MVIInstr<true, 0x0, 0x69>, MVIInstr<true, 0x0, 0x6a>, MVIInstr<true, 0x0, 0x6b>, MVIInstr<true, 0x0, 0x6c>, MVIInstr<true, 0x0, 0x6d>, MVIInstr<true, 0x0, 0x6e>, MVIInstr<true, 0x0, 0x6f>, MVIInstr<true, 0x0, 0x70>, MVIInstr<true, 0x0, 0x71>, MVIInstr<true, 0x0, 0x72>, MVIInstr<true, 0x0, 0x73>, MVIInstr<true, 0x0, 0x74>, MVIInstr<true, 0x0, 0x75>, MVIInstr<true, 0x0, 0x76>, MVIInstr<true, 0x0, 0x77>, MVIInstr<true, 0x0, 0x78>, MVIInstr<true, 0x0, 0x79>, MVIInstr<true, 0x0, 0x7a>, MVIInstr<true, 0x0, 0x7b>, MVIInstr<true, 0x0, 0x7c>, MVIInstr<true, 0x0, 0x7d>, MVIInstr<true, 0x0, 0x7e>, MVIInstr<true, 0x0, 0x7f>,
},
{
MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x00>, MVIInstr<true, 0x1, 0x40>, MVIInstr<true, 0x1, 0x41>, MVIInstr<true, 0x1, 0x42>, MVIInstr<true, 0x1, 0x43>, MVIInstr<true, 0x1, 0x44>, MVIInstr<true, 0x1, 0x45>, MVIInstr<true, 0x1, 0x46>, MVIInstr<true, 0x1, 0x47>, MVIInstr<true, 0x1, 0x48>, MVIInstr<true, 0x1, 0x49>, MVIInstr<true, 0x1, 0x4a>, MVIInstr<true, 0x1, 0x4b>, MVIInstr<true, 0x1, 0x4c>, MVIInstr<true, 0x1, 0x4d>, MVIInstr<true, 0x1, 0x4e>, MVIInstr<true, 0x1, 0x4f>, MVIInstr<true, 0x1, 0x50>, MVIInstr<true, 0x1, 0x51>, MVIInstr<true, 0x1, 0x52>, MVIInstr<true, 0x1, 0x53>, MVIInstr<true, 0x1, 0x54>, MVIInstr<true, 0x1, 0x55>, MVIInstr<true, 0x1, 0x56>, MVIInstr<true, 0x1, 0x57>, MVIInstr<true, 0x1, 0x58>, MVIInstr<true, 0x1, 0x59>, MVIInstr<true, 0x1, 0x5a>, MVIInstr<true, 0x1, 0x5b>, MVIInstr<true, 0x1, 0x5c>, MVIInstr<true, 0x1, 0x5d>, MVIInstr<true, 0x1, 0x5e>, MVIInstr<true, 0x1, 0x5f>, MVIInstr<true, 0x1, 0x60>, MVIInstr<true, 0x1, 0x61>, MVIInstr<true, 0x1, 0x62>, MVIInstr<true, 0x1, 0x63>, MVIInstr<true, 0x1, 0x64>, MVIInstr<true, 0x1, 0x65>, MVIInstr<true, 0x1, 0x66>, MVIInstr<true, 0x1, 0x67>, MVIInstr<true, 0x1, 0x68>, MVIInstr<true, 0x1, 0x69>, MVIInstr<true, 0x1, 0x6a>, MVIInstr<true, 0x1, 0x6b>, MVIInstr<true, 0x1, 0x6c>, MVIInstr<true, 0x1, 0x6d>, MVIInstr<true, 0x1, 0x6e>, MVIInstr<true, 0x1, 0x6f>, MVIInstr<true, 0x1, 0x70>, MVIInstr<true, 0x1, 0x71>, MVIInstr<true, 0x1, 0x72>, MVIInstr<true, 0x1, 0x73>, MVIInstr<true, 0x1, 0x74>, MVIInstr<true, 0x1, 0x75>, MVIInstr<true, 0x1, 0x76>, MVIInstr<true, 0x1, 0x77>, MVIInstr<true, 0x1, 0x78>, MVIInstr<true, 0x1, 0x79>, MVIInstr<true, 0x1, 0x7a>, MVIInstr<true, 0x1, 0x7b>, MVIInstr<true, 0x1, 0x7c>, MVIInstr<true, 0x1, 0x7d>, MVIInstr<true, 0x1, 0x7e>, MVIInstr<true, 0x1, 0x7f>,
},
{
MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x00>, MVIInstr<true, 0x2, 0x40>, MVIInstr<true, 0x2, 0x41>, MVIInstr<true, 0x2, 0x42>, MVIInstr<true, 0x2, 0x43>, MVIInstr<true, 0x2, 0x44>, MVIInstr<true, 0x2, 0x45>, MVIInstr<true, 0x2, 0x46>, MVIInstr<true, 0x2, 0x47>, MVIInstr<true, 0x2, 0x48>, MVIInstr<true, 0x2, 0x49>, MVIInstr<true, 0x2, 0x4a>, MVIInstr<true, 0x2, 0x4b>, MVIInstr<true, 0x2, 0x4c>, MVIInstr<true, 0x2, 0x4d>, MVIInstr<true, 0x2, 0x4e>, MVIInstr<true, 0x2, 0x4f>, MVIInstr<true, 0x2, 0x50>, MVIInstr<true, 0x2, 0x51>, MVIInstr<true, 0x2, 0x52>, MVIInstr<true, 0x2, 0x53>, MVIInstr<true, 0x2, 0x54>, MVIInstr<true, 0x2, 0x55>, MVIInstr<true, 0x2, 0x56>, MVIInstr<true, 0x2, 0x57>, MVIInstr<true, 0x2, 0x58>, MVIInstr<true, 0x2, 0x59>, MVIInstr<true, 0x2, 0x5a>, MVIInstr<true, 0x2, 0x5b>, MVIInstr<true, 0x2, 0x5c>, MVIInstr<true, 0x2, 0x5d>, MVIInstr<true, 0x2, 0x5e>, MVIInstr<true, 0x2, 0x5f>, MVIInstr<true, 0x2, 0x60>, MVIInstr<true, 0x2, 0x61>, MVIInstr<true, 0x2, 0x62>, MVIInstr<true, 0x2, 0x63>, MVIInstr<true, 0x2, 0x64>, MVIInstr<true, 0x2, 0x65>, MVIInstr<true, 0x2, 0x66>, MVIInstr<true, 0x2, 0x67>, MVIInstr<true, 0x2, 0x68>, MVIInstr<true, 0x2, 0x69>, MVIInstr<true, 0x2, 0x6a>, MVIInstr<true, 0x2, 0x6b>, MVIInstr<true, 0x2, 0x6c>, MVIInstr<true, 0x2, 0x6d>, MVIInstr<true, 0x2, 0x6e>, MVIInstr<true, 0x2, 0x6f>, MVIInstr<true, 0x2, 0x70>, MVIInstr<true, 0x2, 0x71>, MVIInstr<true, 0x2, 0x72>, MVIInstr<true, 0x2, 0x73>, MVIInstr<true, 0x2, 0x74>, MVIInstr<true, 0x2, 0x75>, MVIInstr<true, 0x2, 0x76>, MVIInstr<true, 0x2, 0x77>, MVIInstr<true, 0x2, 0x78>, MVIInstr<true, 0x2, 0x79>, MVIInstr<true, 0x2, 0x7a>, MVIInstr<true, 0x2, 0x7b>, MVIInstr<true, 0x2, 0x7c>, MVIInstr<true, 0x2, 0x7d>, MVIInstr<true, 0x2, 0x7e>, MVIInstr<true, 0x2, 0x7f>,
},
{
MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x00>, MVIInstr<true, 0x3, 0x40>, MVIInstr<true, 0x3, 0x41>, MVIInstr<true, 0x3, 0x42>, MVIInstr<true, 0x3, 0x43>, MVIInstr<true, 0x3, 0x44>, MVIInstr<true, 0x3, 0x45>, MVIInstr<true, 0x3, 0x46>, MVIInstr<true, 0x3, 0x47>, MVIInstr<true, 0x3, 0x48>, MVIInstr<true, 0x3, 0x49>, MVIInstr<true, 0x3, 0x4a>, MVIInstr<true, 0x3, 0x4b>, MVIInstr<true, 0x3, 0x4c>, MVIInstr<true, 0x3, 0x4d>, MVIInstr<true, 0x3, 0x4e>, MVIInstr<true, 0x3, 0x4f>, MVIInstr<true, 0x3, 0x50>, MVIInstr<true, 0x3, 0x51>, MVIInstr<true, 0x3, 0x52>, MVIInstr<true, 0x3, 0x53>, MVIInstr<true, 0x3, 0x54>, MVIInstr<true, 0x3, 0x55>, MVIInstr<true, 0x3, 0x56>, MVIInstr<true, 0x3, 0x57>, MVIInstr<true, 0x3, 0x58>, MVIInstr<true, 0x3, 0x59>, MVIInstr<true, 0x3, 0x5a>, MVIInstr<true, 0x3, 0x5b>, MVIInstr<true, 0x3, 0x5c>, MVIInstr<true, 0x3, 0x5d>, MVIInstr<true, 0x3, 0x5e>, MVIInstr<true, 0x3, 0x5f>, MVIInstr<true, 0x3, 0x60>, MVIInstr<true, 0x3, 0x61>, MVIInstr<true, 0x3, 0x62>, MVIInstr<true, 0x3, 0x63>, MVIInstr<true, 0x3, 0x64>, MVIInstr<true, 0x3, 0x65>, MVIInstr<true, 0x3, 0x66>, MVIInstr<true, 0x3, 0x67>, MVIInstr<true, 0x3, 0x68>, MVIInstr<true, 0x3, 0x69>, MVIInstr<true, 0x3, 0x6a>, MVIInstr<true, 0x3, 0x6b>, MVIInstr<true, 0x3, 0x6c>, MVIInstr<true, 0x3, 0x6d>, MVIInstr<true, 0x3, 0x6e>, MVIInstr<true, 0x3, 0x6f>, MVIInstr<true, 0x3, 0x70>, MVIInstr<true, 0x3, 0x71>, MVIInstr<true, 0x3, 0x72>, MVIInstr<true, 0x3, 0x73>, MVIInstr<true, 0x3, 0x74>, MVIInstr<true, 0x3, 0x75>, MVIInstr<true, 0x3, 0x76>, MVIInstr<true, 0x3, 0x77>, MVIInstr<true, 0x3, 0x78>, MVIInstr<true, 0x3, 0x79>, MVIInstr<true, 0x3, 0x7a>, MVIInstr<true, 0x3, 0x7b>, MVIInstr<true, 0x3, 0x7c>, MVIInstr<true, 0x3, 0x7d>, MVIInstr<true, 0x3, 0x7e>, MVIInstr<true, 0x3, 0x7f>,
},
{
MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x00>, MVIInstr<true, 0x4, 0x40>, MVIInstr<true, 0x4, 0x41>, MVIInstr<true, 0x4, 0x42>, MVIInstr<true, 0x4, 0x43>, MVIInstr<true, 0x4, 0x44>, MVIInstr<true, 0x4, 0x45>, MVIInstr<true, 0x4, 0x46>, MVIInstr<true, 0x4, 0x47>, MVIInstr<true, 0x4, 0x48>, MVIInstr<true, 0x4, 0x49>, MVIInstr<true, 0x4, 0x4a>, MVIInstr<true, 0x4, 0x4b>, MVIInstr<true, 0x4, 0x4c>, MVIInstr<true, 0x4, 0x4d>, MVIInstr<true, 0x4, 0x4e>, MVIInstr<true, 0x4, 0x4f>, MVIInstr<true, 0x4, 0x50>, MVIInstr<true, 0x4, 0x51>, MVIInstr<true, 0x4, 0x52>, MVIInstr<true, 0x4, 0x53>, MVIInstr<true, 0x4, 0x54>, MVIInstr<true, 0x4, 0x55>, MVIInstr<true, 0x4, 0x56>, MVIInstr<true, 0x4, 0x57>, MVIInstr<true, 0x4, 0x58>, MVIInstr<true, 0x4, 0x59>, MVIInstr<true, 0x4, 0x5a>, MVIInstr<true, 0x4, 0x5b>, MVIInstr<true, 0x4, 0x5c>, MVIInstr<true, 0x4, 0x5d>, MVIInstr<true, 0x4, 0x5e>, MVIInstr<true, 0x4, 0x5f>, MVIInstr<true, 0x4, 0x60>, MVIInstr<true, 0x4, 0x61>, MVIInstr<true, 0x4, 0x62>, MVIInstr<true, 0x4, 0x63>, MVIInstr<true, 0x4, 0x64>, MVIInstr<true, 0x4, 0x65>, MVIInstr<true, 0x4, 0x66>, MVIInstr<true, 0x4, 0x67>, MVIInstr<true, 0x4, 0x68>, MVIInstr<true, 0x4, 0x69>, MVIInstr<true, 0x4, 0x6a>, MVIInstr<true, 0x4, 0x6b>, MVIInstr<true, 0x4, 0x6c>, MVIInstr<true, 0x4, 0x6d>, MVIInstr<true, 0x4, 0x6e>, MVIInstr<true, 0x4, 0x6f>, MVIInstr<true, 0x4, 0x70>, MVIInstr<true, 0x4, 0x71>, MVIInstr<true, 0x4, 0x72>, MVIInstr<true, 0x4, 0x73>, MVIInstr<true, 0x4, 0x74>, MVIInstr<true, 0x4, 0x75>, MVIInstr<true, 0x4, 0x76>, MVIInstr<true, 0x4, 0x77>, MVIInstr<true, 0x4, 0x78>, MVIInstr<true, 0x4, 0x79>, MVIInstr<true, 0x4, 0x7a>, MVIInstr<true, 0x4, 0x7b>, MVIInstr<true, 0x4, 0x7c>, MVIInstr<true, 0x4, 0x7d>, MVIInstr<true, 0x4, 0x7e>, MVIInstr<true, 0x4, 0x7f>,
},
{
MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x00>, MVIInstr<true, 0x5, 0x40>, MVIInstr<true, 0x5, 0x41>, MVIInstr<true, 0x5, 0x42>, MVIInstr<true, 0x5, 0x43>, MVIInstr<true, 0x5, 0x44>, MVIInstr<true, 0x5, 0x45>, MVIInstr<true, 0x5, 0x46>, MVIInstr<true, 0x5, 0x47>, MVIInstr<true, 0x5, 0x48>, MVIInstr<true, 0x5, 0x49>, MVIInstr<true, 0x5, 0x4a>, MVIInstr<true, 0x5, 0x4b>, MVIInstr<true, 0x5, 0x4c>, MVIInstr<true, 0x5, 0x4d>, MVIInstr<true, 0x5, 0x4e>, MVIInstr<true, 0x5, 0x4f>, MVIInstr<true, 0x5, 0x50>, MVIInstr<true, 0x5, 0x51>, MVIInstr<true, 0x5, 0x52>, MVIInstr<true, 0x5, 0x53>, MVIInstr<true, 0x5, 0x54>, MVIInstr<true, 0x5, 0x55>, MVIInstr<true, 0x5, 0x56>, MVIInstr<true, 0x5, 0x57>, MVIInstr<true, 0x5, 0x58>, MVIInstr<true, 0x5, 0x59>, MVIInstr<true, 0x5, 0x5a>, MVIInstr<true, 0x5, 0x5b>, MVIInstr<true, 0x5, 0x5c>, MVIInstr<true, 0x5, 0x5d>, MVIInstr<true, 0x5, 0x5e>, MVIInstr<true, 0x5, 0x5f>, MVIInstr<true, 0x5, 0x60>, MVIInstr<true, 0x5, 0x61>, MVIInstr<true, 0x5, 0x62>, MVIInstr<true, 0x5, 0x63>, MVIInstr<true, 0x5, 0x64>, MVIInstr<true, 0x5, 0x65>, MVIInstr<true, 0x5, 0x66>, MVIInstr<true, 0x5, 0x67>, MVIInstr<true, 0x5, 0x68>, MVIInstr<true, 0x5, 0x69>, MVIInstr<true, 0x5, 0x6a>, MVIInstr<true, 0x5, 0x6b>, MVIInstr<true, 0x5, 0x6c>, MVIInstr<true, 0x5, 0x6d>, MVIInstr<true, 0x5, 0x6e>, MVIInstr<true, 0x5, 0x6f>, MVIInstr<true, 0x5, 0x70>, MVIInstr<true, 0x5, 0x71>, MVIInstr<true, 0x5, 0x72>, MVIInstr<true, 0x5, 0x73>, MVIInstr<true, 0x5, 0x74>, MVIInstr<true, 0x5, 0x75>, MVIInstr<true, 0x5, 0x76>, MVIInstr<true, 0x5, 0x77>, MVIInstr<true, 0x5, 0x78>, MVIInstr<true, 0x5, 0x79>, MVIInstr<true, 0x5, 0x7a>, MVIInstr<true, 0x5, 0x7b>, MVIInstr<true, 0x5, 0x7c>, MVIInstr<true, 0x5, 0x7d>, MVIInstr<true, 0x5, 0x7e>, MVIInstr<true, 0x5, 0x7f>,
},
{
MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x00>, MVIInstr<true, 0x6, 0x40>, MVIInstr<true, 0x6, 0x41>, MVIInstr<true, 0x6, 0x42>, MVIInstr<true, 0x6, 0x43>, MVIInstr<true, 0x6, 0x44>, MVIInstr<true, 0x6, 0x45>, MVIInstr<true, 0x6, 0x46>, MVIInstr<true, 0x6, 0x47>, MVIInstr<true, 0x6, 0x48>, MVIInstr<true, 0x6, 0x49>, MVIInstr<true, 0x6, 0x4a>, MVIInstr<true, 0x6, 0x4b>, MVIInstr<true, 0x6, 0x4c>, MVIInstr<true, 0x6, 0x4d>, MVIInstr<true, 0x6, 0x4e>, MVIInstr<true, 0x6, 0x4f>, MVIInstr<true, 0x6, 0x50>, MVIInstr<true, 0x6, 0x51>, MVIInstr<true, 0x6, 0x52>, MVIInstr<true, 0x6, 0x53>, MVIInstr<true, 0x6, 0x54>, MVIInstr<true, 0x6, 0x55>, MVIInstr<true, 0x6, 0x56>, MVIInstr<true, 0x6, 0x57>, MVIInstr<true, 0x6, 0x58>, MVIInstr<true, 0x6, 0x59>, MVIInstr<true, 0x6, 0x5a>, MVIInstr<true, 0x6, 0x5b>, MVIInstr<true, 0x6, 0x5c>, MVIInstr<true, 0x6, 0x5d>, MVIInstr<true, 0x6, 0x5e>, MVIInstr<true, 0x6, 0x5f>, MVIInstr<true, 0x6, 0x60>, MVIInstr<true, 0x6, 0x61>, MVIInstr<true, 0x6, 0x62>, MVIInstr<true, 0x6, 0x63>, MVIInstr<true, 0x6, 0x64>, MVIInstr<true, 0x6, 0x65>, MVIInstr<true, 0x6, 0x66>, MVIInstr<true, 0x6, 0x67>, MVIInstr<true, 0x6, 0x68>, MVIInstr<true, 0x6, 0x69>, MVIInstr<true, 0x6, 0x6a>, MVIInstr<true, 0x6, 0x6b>, MVIInstr<true, 0x6, 0x6c>, MVIInstr<true, 0x6, 0x6d>, MVIInstr<true, 0x6, 0x6e>, MVIInstr<true, 0x6, 0x6f>, MVIInstr<true, 0x6, 0x70>, MVIInstr<true, 0x6, 0x71>, MVIInstr<true, 0x6, 0x72>, MVIInstr<true, 0x6, 0x73>, MVIInstr<true, 0x6, 0x74>, MVIInstr<true, 0x6, 0x75>, MVIInstr<true, 0x6, 0x76>, MVIInstr<true, 0x6, 0x77>, MVIInstr<true, 0x6, 0x78>, MVIInstr<true, 0x6, 0x79>, MVIInstr<true, 0x6, 0x7a>, MVIInstr<true, 0x6, 0x7b>, MVIInstr<true, 0x6, 0x7c>, MVIInstr<true, 0x6, 0x7d>, MVIInstr<true, 0x6, 0x7e>, MVIInstr<true, 0x6, 0x7f>,
},
{
MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x00>, MVIInstr<true, 0x7, 0x40>, MVIInstr<true, 0x7, 0x41>, MVIInstr<true, 0x7, 0x42>, MVIInstr<true, 0x7, 0x43>, MVIInstr<true, 0x7, 0x44>, MVIInstr<true, 0x7, 0x45>, MVIInstr<true, 0x7, 0x46>, MVIInstr<true, 0x7, 0x47>, MVIInstr<true, 0x7, 0x48>, MVIInstr<true, 0x7, 0x49>, MVIInstr<true, 0x7, 0x4a>, MVIInstr<true, 0x7, 0x4b>, MVIInstr<true, 0x7, 0x4c>, MVIInstr<true, 0x7, 0x4d>, MVIInstr<true, 0x7, 0x4e>, MVIInstr<true, 0x7, 0x4f>, MVIInstr<true, 0x7, 0x50>, MVIInstr<true, 0x7, 0x51>, MVIInstr<true, 0x7, 0x52>, MVIInstr<true, 0x7, 0x53>, MVIInstr<true, 0x7, 0x54>, MVIInstr<true, 0x7, 0x55>, MVIInstr<true, 0x7, 0x56>, MVIInstr<true, 0x7, 0x57>, MVIInstr<true, 0x7, 0x58>, MVIInstr<true, 0x7, 0x59>, MVIInstr<true, 0x7, 0x5a>, MVIInstr<true, 0x7, 0x5b>, MVIInstr<true, 0x7, 0x5c>, MVIInstr<true, 0x7, 0x5d>, MVIInstr<true, 0x7, 0x5e>, MVIInstr<true, 0x7, 0x5f>, MVIInstr<true, 0x7, 0x60>, MVIInstr<true, 0x7, 0x61>, MVIInstr<true, 0x7, 0x62>, MVIInstr<true, 0x7, 0x63>, MVIInstr<true, 0x7, 0x64>, MVIInstr<true, 0x7, 0x65>, MVIInstr<true, 0x7, 0x66>, MVIInstr<true, 0x7, 0x67>, MVIInstr<true, 0x7, 0x68>, MVIInstr<true, 0x7, 0x69>, MVIInstr<true, 0x7, 0x6a>, MVIInstr<true, 0x7, 0x6b>, MVIInstr<true, 0x7, 0x6c>, MVIInstr<true, 0x7, 0x6d>, MVIInstr<true, 0x7, 0x6e>, MVIInstr<true, 0x7, 0x6f>, MVIInstr<true, 0x7, 0x70>, MVIInstr<true, 0x7, 0x71>, MVIInstr<true, 0x7, 0x72>, MVIInstr<true, 0x7, 0x73>, MVIInstr<true, 0x7, 0x74>, MVIInstr<true, 0x7, 0x75>, MVIInstr<true, 0x7, 0x76>, MVIInstr<true, 0x7, 0x77>, MVIInstr<true, 0x7, 0x78>, MVIInstr<true, 0x7, 0x79>, MVIInstr<true, 0x7, 0x7a>, MVIInstr<true, 0x7, 0x7b>, MVIInstr<true, 0x7, 0x7c>, MVIInstr<true, 0x7, 0x7d>, MVIInstr<true, 0x7, 0x7e>, MVIInstr<true, 0x7, 0x7f>,
},
{
MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x00>, MVIInstr<true, 0x8, 0x40>, MVIInstr<true, 0x8, 0x41>, MVIInstr<true, 0x8, 0x42>, MVIInstr<true, 0x8, 0x43>, MVIInstr<true, 0x8, 0x44>, MVIInstr<true, 0x8, 0x45>, MVIInstr<true, 0x8, 0x46>, MVIInstr<true, 0x8, 0x47>, MVIInstr<true, 0x8, 0x48>, MVIInstr<true, 0x8, 0x49>, MVIInstr<true, 0x8, 0x4a>, MVIInstr<true, 0x8, 0x4b>, MVIInstr<true, 0x8, 0x4c>, MVIInstr<true, 0x8, 0x4d>, MVIInstr<true, 0x8, 0x4e>, MVIInstr<true, 0x8, 0x4f>, MVIInstr<true, 0x8, 0x50>, MVIInstr<true, 0x8, 0x51>, MVIInstr<true, 0x8, 0x52>, MVIInstr<true, 0x8, 0x53>, MVIInstr<true, 0x8, 0x54>, MVIInstr<true, 0x8, 0x55>, MVIInstr<true, 0x8, 0x56>, MVIInstr<true, 0x8, 0x57>, MVIInstr<true, 0x8, 0x58>, MVIInstr<true, 0x8, 0x59>, MVIInstr<true, 0x8, 0x5a>, MVIInstr<true, 0x8, 0x5b>, MVIInstr<true, 0x8, 0x5c>, MVIInstr<true, 0x8, 0x5d>, MVIInstr<true, 0x8, 0x5e>, MVIInstr<true, 0x8, 0x5f>, MVIInstr<true, 0x8, 0x60>, MVIInstr<true, 0x8, 0x61>, MVIInstr<true, 0x8, 0x62>, MVIInstr<true, 0x8, 0x63>, MVIInstr<true, 0x8, 0x64>, MVIInstr<true, 0x8, 0x65>, MVIInstr<true, 0x8, 0x66>, MVIInstr<true, 0x8, 0x67>, MVIInstr<true, 0x8, 0x68>, MVIInstr<true, 0x8, 0x69>, MVIInstr<true, 0x8, 0x6a>, MVIInstr<true, 0x8, 0x6b>, MVIInstr<true, 0x8, 0x6c>, MVIInstr<true, 0x8, 0x6d>, MVIInstr<true, 0x8, 0x6e>, MVIInstr<true, 0x8, 0x6f>, MVIInstr<true, 0x8, 0x70>, MVIInstr<true, 0x8, 0x71>, MVIInstr<true, 0x8, 0x72>, MVIInstr<true, 0x8, 0x73>, MVIInstr<true, 0x8, 0x74>, MVIInstr<true, 0x8, 0x75>, MVIInstr<true, 0x8, 0x76>, MVIInstr<true, 0x8, 0x77>, MVIInstr<true, 0x8, 0x78>, MVIInstr<true, 0x8, 0x79>, MVIInstr<true, 0x8, 0x7a>, MVIInstr<true, 0x8, 0x7b>, MVIInstr<true, 0x8, 0x7c>, MVIInstr<true, 0x8, 0x7d>, MVIInstr<true, 0x8, 0x7e>, MVIInstr<true, 0x8, 0x7f>,
},
{
MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x00>, MVIInstr<true, 0x9, 0x40>, MVIInstr<true, 0x9, 0x41>, MVIInstr<true, 0x9, 0x42>, MVIInstr<true, 0x9, 0x43>, MVIInstr<true, 0x9, 0x44>, MVIInstr<true, 0x9, 0x45>, MVIInstr<true, 0x9, 0x46>, MVIInstr<true, 0x9, 0x47>, MVIInstr<true, 0x9, 0x48>, MVIInstr<true, 0x9, 0x49>, MVIInstr<true, 0x9, 0x4a>, MVIInstr<true, 0x9, 0x4b>, MVIInstr<true, 0x9, 0x4c>, MVIInstr<true, 0x9, 0x4d>, MVIInstr<true, 0x9, 0x4e>, MVIInstr<true, 0x9, 0x4f>, MVIInstr<true, 0x9, 0x50>, MVIInstr<true, 0x9, 0x51>, MVIInstr<true, 0x9, 0x52>, MVIInstr<true, 0x9, 0x53>, MVIInstr<true, 0x9, 0x54>, MVIInstr<true, 0x9, 0x55>, MVIInstr<true, 0x9, 0x56>, MVIInstr<true, 0x9, 0x57>, MVIInstr<true, 0x9, 0x58>, MVIInstr<true, 0x9, 0x59>, MVIInstr<true, 0x9, 0x5a>, MVIInstr<true, 0x9, 0x5b>, MVIInstr<true, 0x9, 0x5c>, MVIInstr<true, 0x9, 0x5d>, MVIInstr<true, 0x9, 0x5e>, MVIInstr<true, 0x9, 0x5f>, MVIInstr<true, 0x9, 0x60>, MVIInstr<true, 0x9, 0x61>, MVIInstr<true, 0x9, 0x62>, MVIInstr<true, 0x9, 0x63>, MVIInstr<true, 0x9, 0x64>, MVIInstr<true, 0x9, 0x65>, MVIInstr<true, 0x9, 0x66>, MVIInstr<true, 0x9, 0x67>, MVIInstr<true, 0x9, 0x68>, MVIInstr<true, 0x9, 0x69>, MVIInstr<true, 0x9, 0x6a>, MVIInstr<true, 0x9, 0x6b>, MVIInstr<true, 0x9, 0x6c>, MVIInstr<true, 0x9, 0x6d>, MVIInstr<true, 0x9, 0x6e>, MVIInstr<true, 0x9, 0x6f>, MVIInstr<true, 0x9, 0x70>, MVIInstr<true, 0x9, 0x71>, MVIInstr<true, 0x9, 0x72>, MVIInstr<true, 0x9, 0x73>, MVIInstr<true, 0x9, 0x74>, MVIInstr<true, 0x9, 0x75>, MVIInstr<true, 0x9, 0x76>, MVIInstr<true, 0x9, 0x77>, MVIInstr<true, 0x9, 0x78>, MVIInstr<true, 0x9, 0x79>, MVIInstr<true, 0x9, 0x7a>, MVIInstr<true, 0x9, 0x7b>, MVIInstr<true, 0x9, 0x7c>, MVIInstr<true, 0x9, 0x7d>, MVIInstr<true, 0x9, 0x7e>, MVIInstr<true, 0x9, 0x7f>,
},
{
MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x00>, MVIInstr<true, 0xa, 0x40>, MVIInstr<true, 0xa, 0x41>, MVIInstr<true, 0xa, 0x42>, MVIInstr<true, 0xa, 0x43>, MVIInstr<true, 0xa, 0x44>, MVIInstr<true, 0xa, 0x45>, MVIInstr<true, 0xa, 0x46>, MVIInstr<true, 0xa, 0x47>, MVIInstr<true, 0xa, 0x48>, MVIInstr<true, 0xa, 0x49>, MVIInstr<true, 0xa, 0x4a>, MVIInstr<true, 0xa, 0x4b>, MVIInstr<true, 0xa, 0x4c>, MVIInstr<true, 0xa, 0x4d>, MVIInstr<true, 0xa, 0x4e>, MVIInstr<true, 0xa, 0x4f>, MVIInstr<true, 0xa, 0x50>, MVIInstr<true, 0xa, 0x51>, MVIInstr<true, 0xa, 0x52>, MVIInstr<true, 0xa, 0x53>, MVIInstr<true, 0xa, 0x54>, MVIInstr<true, 0xa, 0x55>, MVIInstr<true, 0xa, 0x56>, MVIInstr<true, 0xa, 0x57>, MVIInstr<true, 0xa, 0x58>, MVIInstr<true, 0xa, 0x59>, MVIInstr<true, 0xa, 0x5a>, MVIInstr<true, 0xa, 0x5b>, MVIInstr<true, 0xa, 0x5c>, MVIInstr<true, 0xa, 0x5d>, MVIInstr<true, 0xa, 0x5e>, MVIInstr<true, 0xa, 0x5f>, MVIInstr<true, 0xa, 0x60>, MVIInstr<true, 0xa, 0x61>, MVIInstr<true, 0xa, 0x62>, MVIInstr<true, 0xa, 0x63>, MVIInstr<true, 0xa, 0x64>, MVIInstr<true, 0xa, 0x65>, MVIInstr<true, 0xa, 0x66>, MVIInstr<true, 0xa, 0x67>, MVIInstr<true, 0xa, 0x68>, MVIInstr<true, 0xa, 0x69>, MVIInstr<true, 0xa, 0x6a>, MVIInstr<true, 0xa, 0x6b>, MVIInstr<true, 0xa, 0x6c>, MVIInstr<true, 0xa, 0x6d>, MVIInstr<true, 0xa, 0x6e>, MVIInstr<true, 0xa, 0x6f>, MVIInstr<true, 0xa, 0x70>, MVIInstr<true, 0xa, 0x71>, MVIInstr<true, 0xa, 0x72>, MVIInstr<true, 0xa, 0x73>, MVIInstr<true, 0xa, 0x74>, MVIInstr<true, 0xa, 0x75>, MVIInstr<true, 0xa, 0x76>, MVIInstr<true, 0xa, 0x77>, MVIInstr<true, 0xa, 0x78>, MVIInstr<true, 0xa, 0x79>, MVIInstr<true, 0xa, 0x7a>, MVIInstr<true, 0xa, 0x7b>, MVIInstr<true, 0xa, 0x7c>, MVIInstr<true, 0xa, 0x7d>, MVIInstr<true, 0xa, 0x7e>, MVIInstr<true, 0xa, 0x7f>,
},
{
MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x00>, MVIInstr<true, 0xb, 0x40>, MVIInstr<true, 0xb, 0x41>, MVIInstr<true, 0xb, 0x42>, MVIInstr<true, 0xb, 0x43>, MVIInstr<true, 0xb, 0x44>, MVIInstr<true, 0xb, 0x45>, MVIInstr<true, 0xb, 0x46>, MVIInstr<true, 0xb, 0x47>, MVIInstr<true, 0xb, 0x48>, MVIInstr<true, 0xb, 0x49>, MVIInstr<true, 0xb, 0x4a>, MVIInstr<true, 0xb, 0x4b>, MVIInstr<true, 0xb, 0x4c>, MVIInstr<true, 0xb, 0x4d>, MVIInstr<true, 0xb, 0x4e>, MVIInstr<true, 0xb, 0x4f>, MVIInstr<true, 0xb, 0x50>, MVIInstr<true, 0xb, 0x51>, MVIInstr<true, 0xb, 0x52>, MVIInstr<true, 0xb, 0x53>, MVIInstr<true, 0xb, 0x54>, MVIInstr<true, 0xb, 0x55>, MVIInstr<true, 0xb, 0x56>, MVIInstr<true, 0xb, 0x57>, MVIInstr<true, 0xb, 0x58>, MVIInstr<true, 0xb, 0x59>, MVIInstr<true, 0xb, 0x5a>, MVIInstr<true, 0xb, 0x5b>, MVIInstr<true, 0xb, 0x5c>, MVIInstr<true, 0xb, 0x5d>, MVIInstr<true, 0xb, 0x5e>, MVIInstr<true, 0xb, 0x5f>, MVIInstr<true, 0xb, 0x60>, MVIInstr<true, 0xb, 0x61>, MVIInstr<true, 0xb, 0x62>, MVIInstr<true, 0xb, 0x63>, MVIInstr<true, 0xb, 0x64>, MVIInstr<true, 0xb, 0x65>, MVIInstr<true, 0xb, 0x66>, MVIInstr<true, 0xb, 0x67>, MVIInstr<true, 0xb, 0x68>, MVIInstr<true, 0xb, 0x69>, MVIInstr<true, 0xb, 0x6a>, MVIInstr<true, 0xb, 0x6b>, MVIInstr<true, 0xb, 0x6c>, MVIInstr<true, 0xb, 0x6d>, MVIInstr<true, 0xb, 0x6e>, MVIInstr<true, 0xb, 0x6f>, MVIInstr<true, 0xb, 0x70>, MVIInstr<true, 0xb, 0x71>, MVIInstr<true, 0xb, 0x72>, MVIInstr<true, 0xb, 0x73>, MVIInstr<true, 0xb, 0x74>, MVIInstr<true, 0xb, 0x75>, MVIInstr<true, 0xb, 0x76>, MVIInstr<true, 0xb, 0x77>, MVIInstr<true, 0xb, 0x78>, MVIInstr<true, 0xb, 0x79>, MVIInstr<true, 0xb, 0x7a>, MVIInstr<true, 0xb, 0x7b>, MVIInstr<true, 0xb, 0x7c>, MVIInstr<true, 0xb, 0x7d>, MVIInstr<true, 0xb, 0x7e>, MVIInstr<true, 0xb, 0x7f>,
},
{
MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x00>, MVIInstr<true, 0xc, 0x40>, MVIInstr<true, 0xc, 0x41>, MVIInstr<true, 0xc, 0x42>, MVIInstr<true, 0xc, 0x43>, MVIInstr<true, 0xc, 0x44>, MVIInstr<true, 0xc, 0x45>, MVIInstr<true, 0xc, 0x46>, MVIInstr<true, 0xc, 0x47>, MVIInstr<true, 0xc, 0x48>, MVIInstr<true, 0xc, 0x49>, MVIInstr<true, 0xc, 0x4a>, MVIInstr<true, 0xc, 0x4b>, MVIInstr<true, 0xc, 0x4c>, MVIInstr<true, 0xc, 0x4d>, MVIInstr<true, 0xc, 0x4e>, MVIInstr<true, 0xc, 0x4f>, MVIInstr<true, 0xc, 0x50>, MVIInstr<true, 0xc, 0x51>, MVIInstr<true, 0xc, 0x52>, MVIInstr<true, 0xc, 0x53>, MVIInstr<true, 0xc, 0x54>, MVIInstr<true, 0xc, 0x55>, MVIInstr<true, 0xc, 0x56>, MVIInstr<true, 0xc, 0x57>, MVIInstr<true, 0xc, 0x58>, MVIInstr<true, 0xc, 0x59>, MVIInstr<true, 0xc, 0x5a>, MVIInstr<true, 0xc, 0x5b>, MVIInstr<true, 0xc, 0x5c>, MVIInstr<true, 0xc, 0x5d>, MVIInstr<true, 0xc, 0x5e>, MVIInstr<true, 0xc, 0x5f>, MVIInstr<true, 0xc, 0x60>, MVIInstr<true, 0xc, 0x61>, MVIInstr<true, 0xc, 0x62>, MVIInstr<true, 0xc, 0x63>, MVIInstr<true, 0xc, 0x64>, MVIInstr<true, 0xc, 0x65>, MVIInstr<true, 0xc, 0x66>, MVIInstr<true, 0xc, 0x67>, MVIInstr<true, 0xc, 0x68>, MVIInstr<true, 0xc, 0x69>, MVIInstr<true, 0xc, 0x6a>, MVIInstr<true, 0xc, 0x6b>, MVIInstr<true, 0xc, 0x6c>, MVIInstr<true, 0xc, 0x6d>, MVIInstr<true, 0xc, 0x6e>, MVIInstr<true, 0xc, 0x6f>, MVIInstr<true, 0xc, 0x70>, MVIInstr<true, 0xc, 0x71>, MVIInstr<true, 0xc, 0x72>, MVIInstr<true, 0xc, 0x73>, MVIInstr<true, 0xc, 0x74>, MVIInstr<true, 0xc, 0x75>, MVIInstr<true, 0xc, 0x76>, MVIInstr<true, 0xc, 0x77>, MVIInstr<true, 0xc, 0x78>, MVIInstr<true, 0xc, 0x79>, MVIInstr<true, 0xc, 0x7a>, MVIInstr<true, 0xc, 0x7b>, MVIInstr<true, 0xc, 0x7c>, MVIInstr<true, 0xc, 0x7d>, MVIInstr<true, 0xc, 0x7e>, MVIInstr<true, 0xc, 0x7f>,
},
{
MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x00>, MVIInstr<true, 0xd, 0x40>, MVIInstr<true, 0xd, 0x41>, MVIInstr<true, 0xd, 0x42>, MVIInstr<true, 0xd, 0x43>, MVIInstr<true, 0xd, 0x44>, MVIInstr<true, 0xd, 0x45>, MVIInstr<true, 0xd, 0x46>, MVIInstr<true, 0xd, 0x47>, MVIInstr<true, 0xd, 0x48>, MVIInstr<true, 0xd, 0x49>, MVIInstr<true, 0xd, 0x4a>, MVIInstr<true, 0xd, 0x4b>, MVIInstr<true, 0xd, 0x4c>, MVIInstr<true, 0xd, 0x4d>, MVIInstr<true, 0xd, 0x4e>, MVIInstr<true, 0xd, 0x4f>, MVIInstr<true, 0xd, 0x50>, MVIInstr<true, 0xd, 0x51>, MVIInstr<true, 0xd, 0x52>, MVIInstr<true, 0xd, 0x53>, MVIInstr<true, 0xd, 0x54>, MVIInstr<true, 0xd, 0x55>, MVIInstr<true, 0xd, 0x56>, MVIInstr<true, 0xd, 0x57>, MVIInstr<true, 0xd, 0x58>, MVIInstr<true, 0xd, 0x59>, MVIInstr<true, 0xd, 0x5a>, MVIInstr<true, 0xd, 0x5b>, MVIInstr<true, 0xd, 0x5c>, MVIInstr<true, 0xd, 0x5d>, MVIInstr<true, 0xd, 0x5e>, MVIInstr<true, 0xd, 0x5f>, MVIInstr<true, 0xd, 0x60>, MVIInstr<true, 0xd, 0x61>, MVIInstr<true, 0xd, 0x62>, MVIInstr<true, 0xd, 0x63>, MVIInstr<true, 0xd, 0x64>, MVIInstr<true, 0xd, 0x65>, MVIInstr<true, 0xd, 0x66>, MVIInstr<true, 0xd, 0x67>, MVIInstr<true, 0xd, 0x68>, MVIInstr<true, 0xd, 0x69>, MVIInstr<true, 0xd, 0x6a>, MVIInstr<true, 0xd, 0x6b>, MVIInstr<true, 0xd, 0x6c>, MVIInstr<true, 0xd, 0x6d>, MVIInstr<true, 0xd, 0x6e>, MVIInstr<true, 0xd, 0x6f>, MVIInstr<true, 0xd, 0x70>, MVIInstr<true, 0xd, 0x71>, MVIInstr<true, 0xd, 0x72>, MVIInstr<true, 0xd, 0x73>, MVIInstr<true, 0xd, 0x74>, MVIInstr<true, 0xd, 0x75>, MVIInstr<true, 0xd, 0x76>, MVIInstr<true, 0xd, 0x77>, MVIInstr<true, 0xd, 0x78>, MVIInstr<true, 0xd, 0x79>, MVIInstr<true, 0xd, 0x7a>, MVIInstr<true, 0xd, 0x7b>, MVIInstr<true, 0xd, 0x7c>, MVIInstr<true, 0xd, 0x7d>, MVIInstr<true, 0xd, 0x7e>, MVIInstr<true, 0xd, 0x7f>,
},
{
MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x00>, MVIInstr<true, 0xe, 0x40>, MVIInstr<true, 0xe, 0x41>, MVIInstr<true, 0xe, 0x42>, MVIInstr<true, 0xe, 0x43>, MVIInstr<true, 0xe, 0x44>, MVIInstr<true, 0xe, 0x45>, MVIInstr<true, 0xe, 0x46>, MVIInstr<true, 0xe, 0x47>, MVIInstr<true, 0xe, 0x48>, MVIInstr<true, 0xe, 0x49>, MVIInstr<true, 0xe, 0x4a>, MVIInstr<true, 0xe, 0x4b>, MVIInstr<true, 0xe, 0x4c>, MVIInstr<true, 0xe, 0x4d>, MVIInstr<true, 0xe, 0x4e>, MVIInstr<true, 0xe, 0x4f>, MVIInstr<true, 0xe, 0x50>, MVIInstr<true, 0xe, 0x51>, MVIInstr<true, 0xe, 0x52>, MVIInstr<true, 0xe, 0x53>, MVIInstr<true, 0xe, 0x54>, MVIInstr<true, 0xe, 0x55>, MVIInstr<true, 0xe, 0x56>, MVIInstr<true, 0xe, 0x57>, MVIInstr<true, 0xe, 0x58>, MVIInstr<true, 0xe, 0x59>, MVIInstr<true, 0xe, 0x5a>, MVIInstr<true, 0xe, 0x5b>, MVIInstr<true, 0xe, 0x5c>, MVIInstr<true, 0xe, 0x5d>, MVIInstr<true, 0xe, 0x5e>, MVIInstr<true, 0xe, 0x5f>, MVIInstr<true, 0xe, 0x60>, MVIInstr<true, 0xe, 0x61>, MVIInstr<true, 0xe, 0x62>, MVIInstr<true, 0xe, 0x63>, MVIInstr<true, 0xe, 0x64>, MVIInstr<true, 0xe, 0x65>, MVIInstr<true, 0xe, 0x66>, MVIInstr<true, 0xe, 0x67>, MVIInstr<true, 0xe, 0x68>, MVIInstr<true, 0xe, 0x69>, MVIInstr<true, 0xe, 0x6a>, MVIInstr<true, 0xe, 0x6b>, MVIInstr<true, 0xe, 0x6c>, MVIInstr<true, 0xe, 0x6d>, MVIInstr<true, 0xe, 0x6e>, MVIInstr<true, 0xe, 0x6f>, MVIInstr<true, 0xe, 0x70>, MVIInstr<true, 0xe, 0x71>, MVIInstr<true, 0xe, 0x72>, MVIInstr<true, 0xe, 0x73>, MVIInstr<true, 0xe, 0x74>, MVIInstr<true, 0xe, 0x75>, MVIInstr<true, 0xe, 0x76>, MVIInstr<true, 0xe, 0x77>, MVIInstr<true, 0xe, 0x78>, MVIInstr<true, 0xe, 0x79>, MVIInstr<true, 0xe, 0x7a>, MVIInstr<true, 0xe, 0x7b>, MVIInstr<true, 0xe, 0x7c>, MVIInstr<true, 0xe, 0x7d>, MVIInstr<true, 0xe, 0x7e>, MVIInstr<true, 0xe, 0x7f>,
},
{
MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x00>, MVIInstr<true, 0xf, 0x40>, MVIInstr<true, 0xf, 0x41>, MVIInstr<true, 0xf, 0x42>, MVIInstr<true, 0xf, 0x43>, MVIInstr<true, 0xf, 0x44>, MVIInstr<true, 0xf, 0x45>, MVIInstr<true, 0xf, 0x46>, MVIInstr<true, 0xf, 0x47>, MVIInstr<true, 0xf, 0x48>, MVIInstr<true, 0xf, 0x49>, MVIInstr<true, 0xf, 0x4a>, MVIInstr<true, 0xf, 0x4b>, MVIInstr<true, 0xf, 0x4c>, MVIInstr<true, 0xf, 0x4d>, MVIInstr<true, 0xf, 0x4e>, MVIInstr<true, 0xf, 0x4f>, MVIInstr<true, 0xf, 0x50>, MVIInstr<true, 0xf, 0x51>, MVIInstr<true, 0xf, 0x52>, MVIInstr<true, 0xf, 0x53>, MVIInstr<true, 0xf, 0x54>, MVIInstr<true, 0xf, 0x55>, MVIInstr<true, 0xf, 0x56>, MVIInstr<true, 0xf, 0x57>, MVIInstr<true, 0xf, 0x58>, MVIInstr<true, 0xf, 0x59>, MVIInstr<true, 0xf, 0x5a>, MVIInstr<true, 0xf, 0x5b>, MVIInstr<true, 0xf, 0x5c>, MVIInstr<true, 0xf, 0x5d>, MVIInstr<true, 0xf, 0x5e>, MVIInstr<true, 0xf, 0x5f>, MVIInstr<true, 0xf, 0x60>, MVIInstr<true, 0xf, 0x61>, MVIInstr<true, 0xf, 0x62>, MVIInstr<true, 0xf, 0x63>, MVIInstr<true, 0xf, 0x64>, MVIInstr<true, 0xf, 0x65>, MVIInstr<true, 0xf, 0x66>, MVIInstr<true, 0xf, 0x67>, MVIInstr<true, 0xf, 0x68>, MVIInstr<true, 0xf, 0x69>, MVIInstr<true, 0xf, 0x6a>, MVIInstr<true, 0xf, 0x6b>, MVIInstr<true, 0xf, 0x6c>, MVIInstr<true, 0xf, 0x6d>, MVIInstr<true, 0xf, 0x6e>, MVIInstr<true, 0xf, 0x6f>, MVIInstr<true, 0xf, 0x70>, MVIInstr<true, 0xf, 0x71>, MVIInstr<true, 0xf, 0x72>, MVIInstr<true, 0xf, 0x73>, MVIInstr<true, 0xf, 0x74>, MVIInstr<true, 0xf, 0x75>, MVIInstr<true, 0xf, 0x76>, MVIInstr<true, 0xf, 0x77>, MVIInstr<true, 0xf, 0x78>, MVIInstr<true, 0xf, 0x79>, MVIInstr<true, 0xf, 0x7a>, MVIInstr<true, 0xf, 0x7b>, MVIInstr<true, 0xf, 0x7c>, MVIInstr<true, 0xf, 0x7d>, MVIInstr<true, 0xf, 0x7e>, MVIInstr<true, 0xf, 0x7f>,
},
},

534
waterbox/ss/sh7095.h Normal file
View File

@ -0,0 +1,534 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* sh7095.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SH7095_H
#define __MDFN_SH7095_H
class SH7095 final
{
public:
SH7095(const char* const name_arg, const unsigned dma_event_id_arg, uint8 (*exivecfn_arg)(void)) MDFN_COLD;
~SH7095() MDFN_COLD;
void Init(void) MDFN_COLD;
void ForceInternalEventUpdates(void);
void AdjustTS(int32 delta, bool force_set = false);
void TruePowerOn(void) MDFN_COLD;
void Reset(bool power_on_reset, bool from_internal_wdt = false) MDFN_COLD;
void SetNMI(bool level);
void SetIRL(unsigned level);
void SetMD5(bool level);
void SetFTI(bool state);
void SetFTCI(bool state);
INLINE void SetExtHalt(bool state)
{
ExtHalt = state;
if(ExtHalt)
SetPEX(PEX_PSEUDO_EXTHALT); // Only SetPEX() here, ClearPEX() is called in the pseudo exception handling code as necessary.
}
template<unsigned which, bool DebugMode>
void Step(void);
//private:
uint32 R[16];
uint32 PC;
// Control registers
union
{
struct
{
uint32 SR;
uint32 GBR;
uint32 VBR;
};
uint32 CtrlRegs[3];
};
sscpu_timestamp_t timestamp;
sscpu_timestamp_t MA_until;
sscpu_timestamp_t MM_until;
sscpu_timestamp_t write_finish_timestamp;
#if 0
sscpu_timestamp_t WB_until[16];
#endif
INLINE void SetT(bool new_value) { SR &= ~1; SR |= new_value; }
INLINE bool GetT(void) { return SR & 1; }
INLINE bool GetS(void) { return (bool)(SR & 0x002); }
INLINE bool GetQ(void) { return (bool)(SR & 0x100); }
INLINE bool GetM(void) { return (bool)(SR & 0x200); }
INLINE void SetQ(bool new_q) { SR = (SR &~ 0x100) | (new_q << 8); }
INLINE void SetM(bool new_m) { SR = (SR &~ 0x200) | (new_m << 9); }
// System registers
union
{
struct
{
uint32 MACH;
uint32 MACL;
uint32 PR;
};
uint32 SysRegs[3];
};
INLINE uint64 GetMAC64(void) { return MACL | ((uint64)MACH << 32); }
INLINE void SetMAC64(uint64 nv) { MACL = nv; MACH = nv >> 32; }
enum // must be in range of 0 ... 7
{
PEX_POWERON = 0,
PEX_RESET = 1,
PEX_CPUADDR = 2,
PEX_DMAADDR = 3,
PEX_INT = 4,
PEX_NMI = 5,
PEX_PSEUDO_DMABURST = 6,
PEX_PSEUDO_EXTHALT = 7
};
enum { EPENDING_PEXBITS_SHIFT = 16 };
enum { EPENDING_OP_OR = 0xFF000000 };
uint32 EPending;
INLINE void SetPEX(const unsigned which)
{
EPending |= (1U << (which + EPENDING_PEXBITS_SHIFT));
EPending |= EPENDING_OP_OR;
}
INLINE void ClearPEX(const unsigned which)
{
EPending &= ~(1U << (which + EPENDING_PEXBITS_SHIFT));
if(!(EPending & (0xFF << EPENDING_PEXBITS_SHIFT)))
EPending = 0;
}
uint32 Pipe_ID;
uint32 Pipe_IF;
enum
{
EXCEPTION_POWERON = 0,// Power-on
EXCEPTION_RESET, // "Manual" reset
EXCEPTION_ILLINSTR, // General illegal instruction
EXCEPTION_ILLSLOT, // Slot illegal instruction
EXCEPTION_CPUADDR, // CPU address error
EXCEPTION_DMAADDR, // DMA Address error
EXCEPTION_NMI, // NMI
EXCEPTION_BREAK, // User break
EXCEPTION_TRAP, // Trap instruction
EXCEPTION_INT, // Interrupt
};
enum
{
VECNUM_POWERON = 0, // Power-on
VECNUM_RESET = 2, // "Manual" reset
VECNUM_ILLINSTR = 4, // General illegal instruction
VECNUM_ILLSLOT = 6, // Slot illegal instruction
VECNUM_CPUADDR = 9, // CPU address error
VECNUM_DMAADDR = 10, // DMA Address error
VECNUM_NMI = 11, // NMI
VECNUM_BREAK = 12, // User break
VECNUM_TRAP_BASE = 32, // Trap instruction
VECNUM_INT_BASE = 64, // Interrupt
};
enum
{
EPENDING_IVECNUM_SHIFT = 8, // 8 bits
EPENDING_E_SHIFT = 16, // 8 bits
EPENDING_IPRIOLEV_SHIFT = 28 // 4 bits
};
template<bool DebugMode>
uint32 Exception(const unsigned exnum, const unsigned vecnum);
//
//
//
uint32 IBuffer;
uint32 (MDFN_FASTCALL *MRFPI[8])(uint32 A);
uint8 (MDFN_FASTCALL *MRFP8[8])(uint32 A);
uint16 (MDFN_FASTCALL *MRFP16[8])(uint32 A);
uint32 (MDFN_FASTCALL *MRFP32[8])(uint32 A);
void (MDFN_FASTCALL *MWFP8[8])(uint32 A, uint8);
void (MDFN_FASTCALL *MWFP16[8])(uint32 A, uint16);
void (MDFN_FASTCALL *MWFP32[8])(uint32 A, uint32);
//
//
// Cache:
//
//
struct
{
// Rather than have separate validity bits, we're putting an INvalidity bit(invalid when =1)
// in the upper bit of the Tag variables.
uint32 Tag[4];
uint8 LRU;
alignas(4) uint8 Data[4][16];
} Cache[64];
uint8 CCR;
void SetCCR(uint8 V);
enum { CCR_CE = 0x01 }; // Cache Enable
enum { CCR_ID = 0x02 }; // Instruction Replacement Disable
enum { CCR_OD = 0x04 }; // Data Replacement Disable
enum { CCR_TW = 0x08 }; // Two-Way Mode
enum { CCR_CP = 0x10 }; // Cache Purge
enum { CCR_W0 = 0x40 }; //
enum { CCR_W1 = 0x80 }; //
void AssocPurge(const uint32 A);
template<typename T>
void Write_UpdateCache(uint32 A, T V);
//
// End cache stuff
//
//
//
// Interrupt controller registers and related state
//
//
void INTC_Reset(void) MDFN_COLD;
bool NMILevel;
uint8 IRL;
uint16 IPRA;
uint16 IPRB;
uint16 VCRWDT;
uint16 VCRA;
uint16 VCRB;
uint16 VCRC;
uint16 VCRD;
uint16 ICR;
//
//
//
uint16 BCR1, BCR1M;
//
//
//
uint8 SBYCR;
bool Standby;
//
//
// Free-running timer registers and related state
//
//
struct
{
sscpu_timestamp_t lastts; // Internal timestamp related.
bool FTI;
bool FTCI;
uint16 FRC;
uint16 OCR[2];
uint16 FICR;
uint8 TIER;
uint8 FTCSR;
uint8 FTCSRM; // Bits set to 1 like FTCSR, but unconditionally reset all bits to 0 on FTCSR read.
uint8 TCR;
uint8 TOCR;
uint8 RW_Temp;
} FRT;
void FRT_Reset(void) MDFN_COLD;
void FRT_CheckOCR(void);
void FRT_ClockFRC(void);
void FRT_WDT_Update(void);
void FRT_WDT_Recalc_NET(void);
uint32 FRT_WDT_ClockDivider;
sscpu_timestamp_t FRT_WDT_NextTS;
//
//
// Watchdog timer registers and related state.
//
//
struct
{
uint8 WTCSR; // We don't let a CPU program set bit3 to 1, but we do set bit3 to 1 as part of the standby NMI recovery process(for internal use).
uint8 WTCSRM;
uint8 WTCNT;
uint8 RSTCSR;
uint8 RSTCSRM;
} WDT;
void WDT_Reset(bool from_internal_wdt) MDFN_COLD; // Reset-reset only, NOT standby reset!
void WDT_StandbyReset(void) MDFN_COLD;
//
// DMA unit registers and related state
//
bool DMA_RunCond(unsigned ch);
bool DMA_InBurst(void);
void DMA_CheckEnterBurstHack(void);
void DMA_DoTransfer(unsigned ch);
sscpu_timestamp_t DMA_Update(sscpu_timestamp_t); // Takes/return external timestamp
void DMA_StartSG(void);
const unsigned event_id_dma;
sscpu_timestamp_t dma_lastts; // External SH7095_mem_timestamp related.
int32 DMA_ClockCounter;
int32 DMA_SGCounter; // When negative, smaller granularity scheduling for DMA_Update()
bool DMA_RoundRobinRockinBoppin;
struct
{
uint32 SAR;
uint32 DAR;
uint32 TCR; // 24-bit, value of 0 = 2^24 tranfers
uint16 CHCR;
uint16 CHCRM;
uint8 VCR;
uint8 DRCR;
} DMACH[2];
uint8 DMAOR;
uint8 DMAORM;
//
//
// Division unit registers and related state
//
//
void DIVU_S32_S32(void);
void DIVU_S64_S32(void);
sscpu_timestamp_t divide_finish_timestamp;
uint32 DVSR;
uint32 DVDNT;
uint32 DVDNTH;
uint32 DVDNTL;
uint32 DVDNTH_Shadow;
uint32 DVDNTL_Shadow;
uint16 VCRDIV;
uint8 DVCR;
#if 0
struct
{
uint8 SMR; // Mode
uint8 BRR; // Bit rate
uint8 SCR; // Control
uint8 TDR; // Transmit data
uint8 SSR; // Status
uint8 RDR; // Receive data
uint8 RSR; // Receive shift register
uint8 TSR; // Transmit shift register
} SCI;
#endif
const char* const cpu_name;
//
//
//
bool ExtHalt;
uint8 (*const ExIVecFetch)(void);
uint8 GetPendingInt(uint8*);
void RecalcPendingIntPEX(void);
template<bool DebugMode>
INLINE void FetchIF(bool ForceIBufferFill);
template<bool DebugMode, bool DelaySlot, bool IntPreventNext, bool SkipFetchIF>
void DoIDIF_Real(void);
template<typename T, bool BurstHax>
T ExtBusRead(uint32 A);
template<typename T>
void ExtBusWrite(uint32 A, T V);
template<typename T>
void OnChipRegWrite(uint32 A, uint32 V);
template<typename T>
T OnChipRegRead(uint32 A);
template<typename T, unsigned region, bool CacheEnabled, bool TwoWayMode, bool IsInstr>
T MemReadRT(uint32 A);
template<typename T>
T MemRead(uint32 A);
template<typename T, unsigned region, bool CacheEnabled>
void MemWriteRT(uint32 A, T V);
template<typename T>
void MemWrite(uint32 A, T V);
template<unsigned which, int DebugMode, bool delayed>
INLINE void Branch(uint32 target);
template<unsigned which, int DebugMode, bool delayed>
INLINE void CondRelBranch(bool cond, uint32 disp);
template<unsigned which, int DebugMode>
INLINE void UCDelayBranch(uint32 target);
template<unsigned which, int DebugMode>
INLINE void UCRelDelayBranch(uint32 disp);
//
//
//
//
//
//
public:
enum
{
// GSREG_PC_ID and GSREG_PC_IF are only valid when Step<true>() was called most recently(but they may be invalid
// for a while after <false>, too...).
GSREG_PC_ID = 0,
GSREG_PC_IF,
GSREG_PID,
GSREG_PIF,
GSREG_EP,
GSREG_RPC,
GSREG_R0, GSREG_R1, GSREG_R2, GSREG_R3, GSREG_R4, GSREG_R5, GSREG_R6, GSREG_R7,
GSREG_R8, GSREG_R9, GSREG_R10, GSREG_R11, GSREG_R12, GSREG_R13, GSREG_R14, GSREG_R15,
GSREG_SR,
GSREG_GBR,
GSREG_VBR,
GSREG_MACH,
GSREG_MACL,
GSREG_PR,
//
//
//
GSREG_NMIL,
GSREG_IRL,
GSREG_IPRA,
GSREG_IPRB,
GSREG_VCRWDT,
GSREG_VCRA,
GSREG_VCRB,
GSREG_VCRC,
GSREG_VCRD,
GSREG_ICR,
//
//
//
GSREG_DVSR,
GSREG_DVDNT,
GSREG_DVDNTH,
GSREG_DVDNTL,
GSREG_DVDNTHS,
GSREG_DVDNTLS,
GSREG_VCRDIV,
GSREG_DVCR,
//
//
//
GSREG_WTCSR,
GSREG_WTCSRM,
GSREG_WTCNT,
GSREG_RSTCSR,
GSREG_RSTCSRM,
//
//
//
GSREG_DMAOR,
GSREG_DMAORM,
GSREG_DMA0_SAR,
GSREG_DMA0_DAR,
GSREG_DMA0_TCR,
GSREG_DMA0_CHCR,
GSREG_DMA0_CHCRM,
GSREG_DMA0_VCR,
GSREG_DMA0_DRCR,
GSREG_DMA1_SAR,
GSREG_DMA1_DAR,
GSREG_DMA1_TCR,
GSREG_DMA1_CHCR,
GSREG_DMA1_CHCRM,
GSREG_DMA1_VCR,
GSREG_DMA1_DRCR,
GSREG_FRC,
GSREG_OCR0,
GSREG_OCR1,
GSREG_FICR,
GSREG_TIER,
GSREG_FTCSR,
GSREG_FTCSRM,
GSREG_TCR,
GSREG_TOCR,
GSREG_RWT,
};
uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len);
void SetRegister(const unsigned id, const uint32 value) MDFN_COLD;
void CheckRWBreakpoints(void (*MRead)(unsigned len, uint32 addr), void (*MWrite)(unsigned len, uint32 addr)) const;
static void Disassemble(const uint16 instr, const uint32 PC, char* buffer, uint16 (*DisPeek16)(uint32), uint32 (*DisPeek32)(uint32));
private:
uint32 PC_IF, PC_ID; // Debug-related variables.
};
#endif

6736
waterbox/ss/sh7095.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,256 @@
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x6f, 0x75, 0x7b, 0x6e, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x77, 0x37, 0x7b, 0x78, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x70, 0x24, 0x7b, 0x76, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23,
0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52,
0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53,
0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b,
0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

View File

@ -0,0 +1,157 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* sh7095_opdefs.inc:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#define OP_ILLEGAL case 0x00: /* (slot illegal) */
#define OP_MOV_IMM_REG case 0x01:case 0x81:
#define OP_MOV_W_PCREL_REG case 0x02:case 0x82:
#define OP_MOV_L_PCREL_REG case 0x03:case 0x83:
#define OP_MOV_REG_REG case 0x04:case 0x84:
#define OP_MOV_B_REG_REGINDIR case 0x05:case 0x85:
#define OP_MOV_W_REG_REGINDIR case 0x06:case 0x86:
#define OP_MOV_L_REG_REGINDIR case 0x07:case 0x87:
#define OP_MOV_B_REGINDIR_REG case 0x08:case 0x88:
#define OP_MOV_W_REGINDIR_REG case 0x09:case 0x89:
#define OP_MOV_L_REGINDIR_REG case 0x0a:case 0x8a:
#define OP_MOV_B_REG_REGINDIRPD case 0x0b:case 0x8b:
#define OP_MOV_W_REG_REGINDIRPD case 0x0c:case 0x8c:
#define OP_MOV_L_REG_REGINDIRPD case 0x0d:case 0x8d:
#define OP_MOV_B_REGINDIRPI_REG case 0x0e:case 0x8e:
#define OP_MOV_W_REGINDIRPI_REG case 0x0f:case 0x8f:
#define OP_MOV_L_REGINDIRPI_REG case 0x10:case 0x90:
#define OP_MOV_B_REG0_REGINDIRDISP case 0x11:case 0x91:
#define OP_MOV_W_REG0_REGINDIRDISP case 0x12:case 0x92:
#define OP_MOV_L_REG_REGINDIRDISP case 0x13:case 0x93:
#define OP_MOV_B_REGINDIRDISP_REG0 case 0x14:case 0x94:
#define OP_MOV_W_REGINDIRDISP_REG0 case 0x15:case 0x95:
#define OP_MOV_L_REGINDIRDISP_REG case 0x16:case 0x96:
#define OP_MOV_B_REG_IDXREGINDIR case 0x17:case 0x97:
#define OP_MOV_W_REG_IDXREGINDIR case 0x18:case 0x98:
#define OP_MOV_L_REG_IDXREGINDIR case 0x19:case 0x99:
#define OP_MOV_B_IDXREGINDIR_REG case 0x1a:case 0x9a:
#define OP_MOV_W_IDXREGINDIR_REG case 0x1b:case 0x9b:
#define OP_MOV_L_IDXREGINDIR_REG case 0x1c:case 0x9c:
#define OP_MOV_B_REG0_GBRINDIRDISP case 0x1d:case 0x9d:
#define OP_MOV_W_REG0_GBRINDIRDISP case 0x1e:case 0x9e:
#define OP_MOV_L_REG0_GBRINDIRDISP case 0x1f:case 0x9f:
#define OP_MOV_B_GBRINDIRDISP_REG0 case 0x20:case 0xa0:
#define OP_MOV_W_GBRINDIRDISP_REG0 case 0x21:case 0xa1:
#define OP_MOV_L_GBRINDIRDISP_REG0 case 0x22:case 0xa2:
#define OP_MOVA_PCREL_REG0 case 0x23:case 0xa3:
#define OP_MOVT_REG case 0x24:case 0xa4:
#define OP_SWAP_B_REG_REG case 0x25:case 0xa5:
#define OP_SWAP_W_REG_REG case 0x26:case 0xa6:
#define OP_XTRCT_REG_REG case 0x27:case 0xa7:
#define OP_ADD_REG_REG case 0x28:case 0xa8:
#define OP_ADD_IMM_REG case 0x29:case 0xa9:
#define OP_ADDC_REG_REG case 0x2a:case 0xaa:
#define OP_ADDV_REG_REG case 0x2b:case 0xab:
#define OP_CMP_EQ_IMM_REG0 case 0x2c:case 0xac:
#define OP_CMP_EQ_REG_REG case 0x2d:case 0xad:
#define OP_CMP_HS_REG_REG case 0x2e:case 0xae:
#define OP_CMP_GE_REG_REG case 0x2f:case 0xaf:
#define OP_CMP_HI_REG_REG case 0x30:case 0xb0:
#define OP_CMP_GT_REG_REG case 0x31:case 0xb1:
#define OP_CMP_PZ_REG case 0x32:case 0xb2:
#define OP_CMP_PL_REG case 0x33:case 0xb3:
#define OP_CMP_STR_REG_REG case 0x34:case 0xb4:
#define OP_DIV1_REG_REG case 0x35:case 0xb5:
#define OP_DIV0S_REG_REG case 0x36:case 0xb6:
#define OP_DIV0U case 0x37:case 0xb7:
#define OP_DMULS_L_REG_REG case 0x38:case 0xb8:
#define OP_DMULU_L_REG_REG case 0x39:case 0xb9:
#define OP_DT case 0x3a:case 0xba:
#define OP_EXTS_B_REG_REG case 0x3b:case 0xbb:
#define OP_EXTS_W_REG_REG case 0x3c:case 0xbc:
#define OP_EXTU_B_REG_REG case 0x3d:case 0xbd:
#define OP_EXTU_W_REG_REG case 0x3e:case 0xbe:
#define OP_MAC_L case 0x3f:case 0xbf:
#define OP_MAC_W case 0x40:case 0xc0:
#define OP_MUL_L_REG_REG case 0x41:case 0xc1:
#define OP_MULS_W_REG_REG case 0x42:case 0xc2:
#define OP_MULU_W_REG_REG case 0x43:case 0xc3:
#define OP_NEG_REG_REG case 0x44:case 0xc4:
#define OP_NEGC_REG_REG case 0x45:case 0xc5:
#define OP_SUB_REG_REG case 0x46:case 0xc6:
#define OP_SUBC_REG_REG case 0x47:case 0xc7:
#define OP_SUBV_REG_REG case 0x48:case 0xc8:
#define OP_AND_REG_REG case 0x49:case 0xc9:
#define OP_AND_IMM_REG0 case 0x4a:case 0xca:
#define OP_AND_B_IMM_IDXGBRINDIR case 0x4b:case 0xcb:
#define OP_NOT_REG_REG case 0x4c:case 0xcc:
#define OP_OR_REG_REG case 0x4d:case 0xcd:
#define OP_OR_IMM_REG0 case 0x4e:case 0xce:
#define OP_OR_B_IMM_IDXGBRINDIR case 0x4f:case 0xcf:
#define OP_TAS_B_REGINDIR case 0x50:case 0xd0:
#define OP_TST_REG_REG case 0x51:case 0xd1:
#define OP_TST_IMM_REG0 case 0x52:case 0xd2:
#define OP_TST_B_IMM_IDXGBRINDIR case 0x53:case 0xd3:
#define OP_XOR_REG_REG case 0x54:case 0xd4:
#define OP_XOR_IMM_REG0 case 0x55:case 0xd5:
#define OP_XOR_B_IMM_IDXGBRINDIR case 0x56:case 0xd6:
#define OP_ROTL_REG case 0x57:case 0xd7:
#define OP_ROTR_REG case 0x58:case 0xd8:
#define OP_ROTCL_REG case 0x59:case 0xd9:
#define OP_ROTCR_REG case 0x5a:case 0xda:
#define OP_SHAR_REG case 0x5b:case 0xdb:
#define OP_SHLL_REG case 0x5c:case 0xdc:
#define OP_SHLR_REG case 0x5d:case 0xdd:
#define OP_SHLL2_REG case 0x5e:case 0xde:
#define OP_SHLR2_REG case 0x5f:case 0xdf:
#define OP_SHLL8_REG case 0x60:case 0xe0:
#define OP_SHLR8_REG case 0x61:case 0xe1:
#define OP_SHLL16_REG case 0x62:case 0xe2:
#define OP_SHLR16_REG case 0x63:case 0xe3:
#define OP_BF case 0x64: /* (slot illegal) */
#define OP_BF_S case 0x65: /* (slot illegal) */
#define OP_BT case 0x66: /* (slot illegal) */
#define OP_BT_S case 0x67: /* (slot illegal) */
#define OP_BRA case 0x68: /* (slot illegal) */
#define OP_BRAF_REG case 0x69: /* (slot illegal) */
#define OP_BSR case 0x6a: /* (slot illegal) */
#define OP_BSRF_REG case 0x6b: /* (slot illegal) */
#define OP_JMP_REGINDIR case 0x6c: /* (slot illegal) */
#define OP_JSR_REGINDIR case 0x6d: /* (slot illegal) */
#define OP_RTS case 0x6e: /* (slot illegal) */
#define OP_CLRT case 0x6f:case 0xef:
#define OP_CLRMAC case 0x70:case 0xf0:
#define OP_LDC case 0x71:case 0xf1:
#define OP_LDC_L case 0x72:case 0xf2:
#define OP_LDS case 0x73:case 0xf3:
#define OP_LDS_L case 0x74:case 0xf4:
#define OP_NOP case 0x75:case 0xf5:
#define OP_RTE case 0x76: /* (slot illegal) */
#define OP_SETT case 0x77:case 0xf7:
#define OP_SLEEP case 0x78:case 0xf8:
#define OP_STC case 0x79:case 0xf9:
#define OP_STC_L case 0x7a:case 0xfa:
#define OP_STS case 0x7b:case 0xfb:
#define OP_STS_L case 0x7c:case 0xfc:
#define OP_TRAPA case 0x7d: /* (slot illegal) */
#define OP_SLOT_ILLEGAL case 0x80:case 0xe4:case 0xe5:case 0xe6:case 0xe7:case 0xe8:case 0xe9:case 0xea:case 0xeb:case 0xec:case 0xed:case 0xee:case 0xf6:case 0xfd:
//
// Pseudo-instructions:
//
#define OP_PSEUDO_STANDBY case 0x7e:
#define OP_PSEUDO_DMABURST case 0xfe:
#define OP_PSEUDO_EPENDING case 0x7f: case 0xff:

1436
waterbox/ss/smpc.cpp Normal file

File diff suppressed because it is too large Load Diff

100
waterbox/ss/smpc.h Normal file
View File

@ -0,0 +1,100 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* smpc.h:
** Copyright (C) 2015-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_SMPC_H
#define __MDFN_SS_SMPC_H
#include <time.h>
namespace MDFN_IEN_SS
{
enum
{
SMPC_AREA_JP = 0x1,
SMPC_AREA_ASIA_NTSC = 0x2,
SMPC_AREA_NA = 0x4,
SMPC_AREA_CSA_NTSC = 0x5,
SMPC_AREA_KR = 0x6,
SMPC_AREA_ASIA_PAL = 0xA,
SMPC_AREA_EU_PAL = 0xC,
SMPC_AREA_CSA_PAL = 0xD,
//
//
//
SMPC_AREA__PAL_MASK = 0x8
};
enum
{
SMPC_RTC_LANG_ENGLISH = 0,
SMPC_RTC_LANG_GERMAN = 1,
SMPC_RTC_LANG_FRENCH = 2,
SMPC_RTC_LANG_SPANISH = 3,
SMPC_RTC_LANG_ITALIAN = 4,
SMPC_RTC_LANG_JAPANESE = 5,
};
void SMPC_Init(const uint8 area_code, const int32 master_clock) MDFN_COLD;
bool SMPC_IsSlaveOn(void);
void SMPC_Reset(bool powering_up) MDFN_COLD;
void SMPC_LoadNV(Stream* s) MDFN_COLD;
void SMPC_SaveNV(Stream* s) MDFN_COLD;
void SMPC_SetRTC(const struct tm* ht, const uint8 lang) MDFN_COLD;
void SMPC_Write(const sscpu_timestamp_t timestamp, uint8 A, uint8 V) MDFN_HOT;
uint8 SMPC_Read(const sscpu_timestamp_t timestamp, uint8 A) MDFN_HOT;
sscpu_timestamp_t SMPC_Update(sscpu_timestamp_t timestamp);
void SMPC_ResetTS(void);
int32 SMPC_StartFrame(EmulateSpecStruct* espec);
void SMPC_UpdateInput(const int32 time_elapsed);
void SMPC_UpdateOutput(void);
void SMPC_SetInput(unsigned port, const char* type, uint8* ptr) MDFN_COLD;
void SMPC_SetMultitap(unsigned sport, bool enabled) MDFN_COLD;
void SMPC_SetVB(sscpu_timestamp_t event_timestamp, bool vb_status);
class IODevice
{
public:
IODevice() MDFN_COLD;
virtual ~IODevice() MDFN_COLD;
virtual void Power(void) MDFN_COLD;
//
// time_elapsed is emulated time elapsed since last call to UpdateInput(), in microseconds;
// it's mostly for keyboard emulation, to keep the implementation from becoming unnecessarily complex.
//
virtual void UpdateInput(const uint8* data, const int32 time_elapsed);
virtual void UpdateOutput(uint8* data);
virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted);
};
//extern const std::vector<InputPortInfoStruct> SMPC_PortInfo;
}
#endif

357
waterbox/ss/sound.cpp Normal file
View File

@ -0,0 +1,357 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* sound.cpp - Sound Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// TODO: Bus between SCU and SCSP looks to be 8-bit, maybe implement that, but
// first test to see how the bus access cycle(s) work with respect to reading from
// registers whose values may change between the individual byte reads.
// (May not be worth emulating if it could possibly trigger problems in games)
#include "ss.h"
#include "sound.h"
#include "scu.h"
#include "cdb.h"
#include "m68k/m68k.h"
namespace MDFN_IEN_SS
{
#include "scsp.h"
static SS_SCSP SCSP;
static M68K SoundCPU(true);
static int64 run_until_time; // 32.32
static int32 next_scsp_time;
static uint32 clock_ratio;
static sscpu_timestamp_t lastts;
static int16 IBuffer[1024][2];
static uint32 IBufferCount;
static int last_rate;
static uint32 last_quality;
static INLINE void SCSP_SoundIntChanged(unsigned level)
{
SoundCPU.SetIPL(level);
}
static INLINE void SCSP_MainIntChanged(bool state)
{
#ifndef MDFN_SSFPLAY_COMPILE
SCU_SetInt(SCU_INT_SCSP, state);
#endif
}
#include "scsp.inc"
//
//
template <typename T>
static MDFN_FASTCALL T SoundCPU_BusRead(uint32 A);
static MDFN_FASTCALL uint16 SoundCPU_BusReadInstr(uint32 A);
template <typename T>
static MDFN_FASTCALL void SoundCPU_BusWrite(uint32 A, T V);
static MDFN_FASTCALL void SoundCPU_BusRMW(uint32 A, uint8(MDFN_FASTCALL *cb)(M68K *, uint8));
static MDFN_FASTCALL unsigned SoundCPU_BusIntAck(uint8 level);
static MDFN_FASTCALL void SoundCPU_BusRESET(bool state);
//
//
void SOUND_Init(void)
{
memset(IBuffer, 0, sizeof(IBuffer));
IBufferCount = 0;
last_rate = -1;
last_quality = ~0U;
run_until_time = 0;
next_scsp_time = 0;
lastts = 0;
SoundCPU.BusRead8 = SoundCPU_BusRead<uint8>;
SoundCPU.BusRead16 = SoundCPU_BusRead<uint16>;
SoundCPU.BusWrite8 = SoundCPU_BusWrite<uint8>;
SoundCPU.BusWrite16 = SoundCPU_BusWrite<uint16>;
SoundCPU.BusReadInstr = SoundCPU_BusReadInstr;
SoundCPU.BusRMW = SoundCPU_BusRMW;
SoundCPU.BusIntAck = SoundCPU_BusIntAck;
SoundCPU.BusRESET = SoundCPU_BusRESET;
#ifndef MDFN_SSFPLAY_COMPILE
SoundCPU.DBG_Warning = SS_DBG_Wrap<SS_DBG_WARNING | SS_DBG_M68K>;
SoundCPU.DBG_Verbose = SS_DBG_Wrap<SS_DBG_M68K>;
#endif
SS_SetPhysMemMap(0x05A00000, 0x05A7FFFF, SCSP.GetRAMPtr(), 0x80000, true);
// TODO: MEM4B: SS_SetPhysMemMap(0x05A00000, 0x05AFFFFF, SCSP.GetRAMPtr(), 0x40000, true);
}
uint8 SOUND_PeekRAM(uint32 A)
{
return ne16_rbo_be<uint8>(SCSP.GetRAMPtr(), A & 0x7FFFF);
}
void SOUND_PokeRAM(uint32 A, uint8 V)
{
ne16_wbo_be<uint8>(SCSP.GetRAMPtr(), A & 0x7FFFF, V);
}
void SOUND_ResetTS(void)
{
next_scsp_time -= SoundCPU.timestamp;
run_until_time -= (int64)SoundCPU.timestamp << 32;
SoundCPU.timestamp = 0;
lastts = 0;
}
void SOUND_Reset(bool powering_up)
{
SCSP.Reset(powering_up);
SoundCPU.Reset(powering_up);
}
void SOUND_Reset68K(void)
{
SoundCPU.Reset(false);
}
void SOUND_Set68KActive(bool active)
{
SoundCPU.SetExtHalted(!active);
}
uint16 SOUND_Read16(uint32 A)
{
uint16 ret;
SCSP.RW<uint16, false>(A, ret);
return ret;
}
void SOUND_Write8(uint32 A, uint8 V)
{
SCSP.RW<uint8, true>(A, V);
}
void SOUND_Write16(uint32 A, uint16 V)
{
SCSP.RW<uint16, true>(A, V);
}
static NO_INLINE void RunSCSP(void)
{
CDB_GetCDDA(SCSP.GetEXTSPtr());
//
//
int16 *const bp = IBuffer[IBufferCount];
SCSP.RunSample(bp);
//bp[0] = rand();
//bp[1] = rand();
bp[0] = (bp[0] * 27 + 16) >> 5;
bp[1] = (bp[1] * 27 + 16) >> 5;
IBufferCount = (IBufferCount + 1) & 1023;
next_scsp_time += 256;
}
// Ratio between SH-2 clock and 68K clock (sound clock / 2)
void SOUND_SetClockRatio(uint32 ratio)
{
clock_ratio = ratio;
}
sscpu_timestamp_t SOUND_Update(sscpu_timestamp_t timestamp)
{
run_until_time += ((uint64)(timestamp - lastts) * clock_ratio);
lastts = timestamp;
//
//
if (MDFN_LIKELY(SoundCPU.timestamp < (run_until_time >> 32)))
{
do
{
int32 next_time = std::min<int32>(next_scsp_time, run_until_time >> 32);
SoundCPU.Run(next_time);
if (SoundCPU.timestamp >= next_scsp_time)
RunSCSP();
} while (MDFN_LIKELY(SoundCPU.timestamp < (run_until_time >> 32)));
}
else
{
while (next_scsp_time < (run_until_time >> 32))
RunSCSP();
}
return timestamp + 128; // FIXME
}
void SOUND_StartFrame(double rate, uint32 quality)
{
if ((int)rate != last_rate || quality != last_quality)
{
int err = 0;
last_rate = (int)rate;
last_quality = quality;
}
}
int32 SOUND_FlushOutput(int16 *SoundBuf, const int32 SoundBufMaxSize, const bool reverse)
{
if (SoundBuf && reverse)
{
for (unsigned lr = 0; lr < 2; lr++)
{
int16 *p0 = &IBuffer[0][lr];
int16 *p1 = &IBuffer[IBufferCount - 1][lr];
unsigned count = IBufferCount >> 1;
while (MDFN_LIKELY(count--))
{
std::swap(*p0, *p1);
p0 += 2;
p1 -= 2;
}
}
}
if (last_rate == 44100)
{
int32 ret = IBufferCount;
memcpy(SoundBuf, IBuffer, IBufferCount * 2 * sizeof(int16));
IBufferCount = 0;
return (ret);
}
else
{
IBufferCount = 0;
return 0;
}
}
//
//
// TODO: test masks.
//
template <typename T>
static MDFN_FASTCALL T SoundCPU_BusRead(uint32 A)
{
T ret;
SoundCPU.timestamp += 4;
if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time))
RunSCSP();
SCSP.RW<T, false>(A & 0x1FFFFF, ret);
SoundCPU.timestamp += 2;
return ret;
}
static MDFN_FASTCALL uint16 SoundCPU_BusReadInstr(uint32 A)
{
uint16 ret;
SoundCPU.timestamp += 4;
//if(MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time))
// RunSCSP();
SCSP.RW<uint16, false>(A & 0x1FFFFF, ret);
SoundCPU.timestamp += 2;
return ret;
}
template <typename T>
static MDFN_FASTCALL void SoundCPU_BusWrite(uint32 A, T V)
{
if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time))
RunSCSP();
SoundCPU.timestamp += 2;
SCSP.RW<T, true>(A & 0x1FFFFF, V);
SoundCPU.timestamp += 2;
}
static MDFN_FASTCALL void SoundCPU_BusRMW(uint32 A, uint8(MDFN_FASTCALL *cb)(M68K *, uint8))
{
uint8 tmp;
SoundCPU.timestamp += 4;
if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time))
RunSCSP();
SCSP.RW<uint8, false>(A & 0x1FFFFF, tmp);
tmp = cb(&SoundCPU, tmp);
SoundCPU.timestamp += 6;
SCSP.RW<uint8, true>(A & 0x1FFFFF, tmp);
SoundCPU.timestamp += 2;
}
static MDFN_FASTCALL unsigned SoundCPU_BusIntAck(uint8 level)
{
return M68K::BUS_INT_ACK_AUTO;
}
static MDFN_FASTCALL void SoundCPU_BusRESET(bool state)
{
//SS_DBG(SS_DBG_WARNING, "[M68K] RESET: %d @ time %d\n", state, SoundCPU.timestamp);
if (state)
{
SoundCPU.Reset(false);
}
}
uint32 SOUND_GetSCSPRegister(const unsigned id, char *const special, const uint32 special_len)
{
return SCSP.GetRegister(id, special, special_len);
}
void SOUND_SetSCSPRegister(const unsigned id, const uint32 value)
{
SCSP.SetRegister(id, value);
}
}

52
waterbox/ss/sound.h Normal file
View File

@ -0,0 +1,52 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* sound.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_SOUND_H
#define __MDFN_SS_SOUND_H
namespace MDFN_IEN_SS
{
void SOUND_Init(void) MDFN_COLD;
void SOUND_Reset(bool powering_up) MDFN_COLD;
void SOUND_Set68KActive(bool active);
void SOUND_Reset68K(void);
void SOUND_SetClockRatio(uint32 ratio); // Ratio between SH-2 clock and 68K clock (sound clock / 2)
sscpu_timestamp_t SOUND_Update(sscpu_timestamp_t timestamp);
void SOUND_ResetTS(void);
void SOUND_StartFrame(double rate, uint32 quality);
int32 SOUND_FlushOutput(int16* SoundBuf, const int32 SoundBufMaxSize, const bool reverse);
uint16 SOUND_Read16(uint32 A);
void SOUND_Write8(uint32 A, uint8 V);
void SOUND_Write16(uint32 A, uint16 V);
uint8 SOUND_PeekRAM(uint32 A);
void SOUND_PokeRAM(uint32 A, uint8 V);
uint32 SOUND_GetSCSPRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD;
void SOUND_SetSCSPRegister(const unsigned id, const uint32 value) MDFN_COLD;
}
#endif

1285
waterbox/ss/ss.cpp Normal file

File diff suppressed because it is too large Load Diff

146
waterbox/ss/ss.h Normal file
View File

@ -0,0 +1,146 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* ss.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_SS_H
#define __MDFN_SS_SS_H
#include "defs.h"
#include <stdint.h>
#include <stdarg.h>
namespace MDFN_IEN_SS
{
enum
{
SS_DBG_ERROR = 0x00001,
SS_DBG_WARNING = 0x00002,
SS_DBG_M68K = 0x00004,
SS_DBG_SH2 = 0x00010,
SS_DBG_SH2_REGW = 0x00020,
SS_DBG_SCU = 0x00040,
SS_DBG_SCU_REGW = 0x00080,
SS_DBG_SMPC = 0x00100,
SS_DBG_SMPC_REGW = 0x00200,
SS_DBG_CDB = 0x00400,
SS_DBG_CDB_REGW = 0x00800,
SS_DBG_VDP1 = 0x01000,
SS_DBG_VDP1_REGW = 0x02000,
SS_DBG_VDP2 = 0x04000,
SS_DBG_VDP2_REGW = 0x08000,
SS_DBG_SCSP = 0x10000,
SS_DBG_SCSP_REGW = 0x20000,
};
#ifdef MDFN_SS_DEV_BUILD
extern uint32 ss_dbg_mask;
#else
enum { ss_dbg_mask = 0 };
#endif
static INLINE void SS_DBG_Dummy(const char* format, ...) { }
#define SS_DBG(which, format, ...) ((MDFN_UNLIKELY(ss_dbg_mask & (which))) ? (void)trio_printf(format, ## __VA_ARGS__) : SS_DBG_Dummy(format, ## __VA_ARGS__))
#define SS_DBGTI(which, format, ...) SS_DBG(which, format " @Line=0x%03x, HPos=0x%03x, memts=%d\n", ## __VA_ARGS__, VDP2::PeekLine(), VDP2::PeekHPos(), SH7095_mem_timestamp)
template<unsigned which>
static void SS_DBG_Wrap(const char* format, ...) noexcept
{
if(ss_dbg_mask & which)
{
va_list ap;
va_start(ap, format);
trio_vprintf(format, ap);
va_end(ap);
}
}
typedef int32 sscpu_timestamp_t;
class SH7095;
extern SH7095 CPU[2]; // for smpc.cpp
extern int32 SH7095_mem_timestamp;
void SS_RequestMLExit(void);
void ForceEventUpdates(const sscpu_timestamp_t timestamp);
enum
{
SS_EVENT__SYNFIRST = 0,
SS_EVENT_SH2_M_DMA,
SS_EVENT_SH2_S_DMA,
SS_EVENT_SCU_DMA,
SS_EVENT_SCU_DSP,
SS_EVENT_SMPC,
SS_EVENT_VDP1,
SS_EVENT_VDP2,
SS_EVENT_CDB,
SS_EVENT_SOUND,
SS_EVENT_CART,
SS_EVENT_MIDSYNC,
SS_EVENT__SYNLAST,
SS_EVENT__COUNT,
};
typedef sscpu_timestamp_t (*ss_event_handler)(const sscpu_timestamp_t timestamp);
struct event_list_entry
{
sscpu_timestamp_t event_time;
event_list_entry *prev;
event_list_entry *next;
ss_event_handler event_handler;
};
extern event_list_entry events[SS_EVENT__COUNT];
#define SS_EVENT_DISABLED_TS 0x40000000
void SS_SetEventNT(event_list_entry* e, const sscpu_timestamp_t next_timestamp);
// Call from init code, or power/reset code, as appropriate.
// (length is in units of bytes, not 16-bit units)
//
// is_writeable is mostly for cheat stuff.
void SS_SetPhysMemMap(uint32 Astart, uint32 Aend, uint16* ptr, uint32 length, bool is_writeable = false);
void SS_Reset(bool powering_up) MDFN_COLD;
}
#endif

View File

@ -0,0 +1,324 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* MemoryStream.cpp:
** Copyright (C) 2012-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "MemoryStream.h"
#include "math_ops.h"
#include <stdlib.h>
/*
TODO: Copy and assignment constructor fixes.
Proper negative position behavior?
*/
MemoryStream::MemoryStream() : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0)
{
data_buffer_size = 0;
data_buffer_alloced = 64;
if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
}
MemoryStream::MemoryStream(uint64 alloc_hint, int alloc_hint_is_size) : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0)
{
if(alloc_hint_is_size != 0)
{
data_buffer_size = alloc_hint;
data_buffer_alloced = alloc_hint;
if(alloc_hint > SIZE_MAX)
abort();//throw MDFN_Error(ErrnoHolder(ENOMEM));
}
else
{
data_buffer_size = 0;
data_buffer_alloced = (alloc_hint > SIZE_MAX) ? SIZE_MAX : alloc_hint;
}
data_buffer_alloced = std::max<uint64>(data_buffer_alloced, 1);
if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
if(alloc_hint_is_size > 0)
memset(data_buffer, 0, data_buffer_size);
}
MemoryStream::MemoryStream(Stream *stream, uint64 size_limit) : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0)
{
if((position = stream->tell()) != 0)
stream->seek(0, SEEK_SET);
void* tp;
data_buffer_size = data_buffer_alloced = stream->alloc_and_read(&tp, size_limit);
data_buffer = (uint8*)tp;
stream->close();
delete stream;
}
MemoryStream::MemoryStream(const MemoryStream &zs)
{
data_buffer_size = zs.data_buffer_size;
data_buffer_alloced = zs.data_buffer_alloced;
if(!(data_buffer = (uint8*)malloc(data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
memcpy(data_buffer, zs.data_buffer, data_buffer_size);
position = zs.position;
}
#if 0
MemoryStream & MemoryStream::operator=(const MemoryStream &zs)
{
if(this != &zs)
{
if(data_buffer)
{
free(data_buffer);
data_buffer = NULL;
}
data_buffer_size = zs.data_buffer_size;
data_buffer_alloced = zs.data_buffer_alloced;
if(!(data_buffer = (uint8*)malloc(data_buffer_alloced)))
throw MDFN_Error(ErrnoHolder(errno));
memcpy(data_buffer, zs.data_buffer, data_buffer_size);
position = zs.position;
}
return(*this);
}
#endif
MemoryStream::~MemoryStream()
{
close();
}
uint64 MemoryStream::attributes(void)
{
return (ATTRIBUTE_READABLE | ATTRIBUTE_WRITEABLE | ATTRIBUTE_SEEKABLE);
}
uint8 *MemoryStream::map(void) noexcept
{
return data_buffer;
}
uint64 MemoryStream::map_size(void) noexcept
{
return data_buffer_size;
}
void MemoryStream::unmap(void) noexcept
{
}
INLINE void MemoryStream::grow_if_necessary(uint64 new_required_size, uint64 hole_end)
{
if(new_required_size > data_buffer_size)
{
const uint64 old_data_buffer_size = data_buffer_size;
if(new_required_size > data_buffer_alloced)
{
uint64 new_required_alloced = round_up_pow2(new_required_size);
uint8 *new_data_buffer;
// first condition will happen at new_required_size > (1ULL << 63) due to round_up_pow2() "wrapping".
// second condition can occur when running on a 32-bit system.
if(new_required_alloced < new_required_size || new_required_alloced > SIZE_MAX)
new_required_alloced = SIZE_MAX;
// If constrained alloc size isn't enough, throw an out-of-memory/address-space type error.
if(new_required_alloced < new_required_size)
abort();//throw MDFN_Error(ErrnoHolder(ENOMEM));
if(!(new_data_buffer = (uint8*)realloc(data_buffer, new_required_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
//
// Assign all in one go after the realloc() so we don't leave our object in an inconsistent state if the realloc() fails.
//
data_buffer = new_data_buffer;
data_buffer_size = new_required_size;
data_buffer_alloced = new_required_alloced;
}
else
data_buffer_size = new_required_size;
if(hole_end > old_data_buffer_size)
memset(data_buffer + old_data_buffer_size, 0, hole_end - old_data_buffer_size);
}
}
void MemoryStream::shrink_to_fit(void) noexcept
{
if(data_buffer_alloced > data_buffer_size)
{
uint8 *new_data_buffer;
const uint64 new_data_buffer_alloced = std::max<uint64>(data_buffer_size, 1);
new_data_buffer = (uint8*)realloc(data_buffer, new_data_buffer_alloced);
if(new_data_buffer != NULL)
{
data_buffer = new_data_buffer;
data_buffer_alloced = new_data_buffer_alloced;
}
}
}
uint64 MemoryStream::read(void *data, uint64 count, bool error_on_eos)
{
//printf("%llu %llu %llu\n", position, count, data_buffer_size);
if(count > data_buffer_size)
{
if(error_on_eos)
abort();//throw MDFN_Error(0, _("Unexpected EOF"));
count = data_buffer_size;
}
if(position > (data_buffer_size - count))
{
if(error_on_eos)
abort();//throw MDFN_Error(0, _("Unexpected EOF"));
if(data_buffer_size > position)
count = data_buffer_size - position;
else
count = 0;
}
memmove(data, &data_buffer[position], count);
position += count;
return count;
}
void MemoryStream::write(const void *data, uint64 count)
{
uint64 nrs = position + count;
if(nrs < position)
abort();//throw MDFN_Error(ErrnoHolder(EFBIG));
grow_if_necessary(nrs, position);
memmove(&data_buffer[position], data, count);
position += count;
}
//
// Don't add code to reduce the amount of memory allocated(when possible) without providing a
// per-stream setting to disable that behavior.
//
void MemoryStream::truncate(uint64 length)
{
grow_if_necessary(length, length);
data_buffer_size = length;
}
void MemoryStream::seek(int64 offset, int whence)
{
uint64 new_position;
switch(whence)
{
default:
abort();//throw MDFN_Error(ErrnoHolder(EINVAL));
break;
case SEEK_SET:
new_position = offset;
break;
case SEEK_CUR:
new_position = position + offset;
break;
case SEEK_END:
new_position = data_buffer_size + offset;
break;
}
if(new_position < 0)
abort();//throw MDFN_Error(ErrnoHolder(EINVAL));
position = new_position;
}
uint64 MemoryStream::tell(void)
{
return position;
}
uint64 MemoryStream::size(void)
{
return data_buffer_size;
}
void MemoryStream::flush(void)
{
}
void MemoryStream::close(void)
{
if(data_buffer)
{
free(data_buffer);
data_buffer = NULL;
}
data_buffer_size = 0;
data_buffer_alloced = 0;
position = 0;
}
int MemoryStream::get_line(std::string &str)
{
str.clear(); // or str.resize(0)??
while((uint64)position < data_buffer_size)
{
uint8 c = data_buffer[position++];
if(c == '\r' || c == '\n' || c == 0)
return(c);
str.push_back(c); // Should be faster than str.append(1, c)
}
return(str.length() ? 256 : -1);
}

View File

@ -0,0 +1,96 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* MemoryStream.h:
** Copyright (C) 2012-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*
Notes:
For performance reasons(like in the state rewinding code), we should try to make sure map()
returns a pointer that is aligned to at least what malloc()/realloc() provides.
(And maybe forcefully align it to at least 16 bytes in the future)
*/
#ifndef __MDFN_MEMORYSTREAM_H
#define __MDFN_MEMORYSTREAM_H
#include "Stream.h"
class MemoryStream : public Stream
{
public:
MemoryStream();
MemoryStream(uint64 alloc_hint, int alloc_hint_is_size = false); // Pass -1 instead of 1 for alloc_hint_is_size to skip initialization of the memory.
MemoryStream(Stream *stream, uint64 size_limit = ~(uint64)0);
// Will create a MemoryStream equivalent of the contents of "stream", and then "delete stream".
// Will only work if stream->tell() == 0, or if "stream" is seekable.
// stream will be deleted even if this constructor throws.
//
// Will throw an exception if the initial size() of the MemoryStream would be greater than size_limit(useful for when passing
// in GZFileStream streams).
MemoryStream(const MemoryStream &zs);
MemoryStream & operator=(const MemoryStream &zs);
virtual ~MemoryStream() override;
virtual uint64 attributes(void) override;
virtual uint8 *map(void) noexcept override;
virtual uint64 map_size(void) noexcept override;
virtual void unmap(void) noexcept override;
virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override;
virtual void write(const void *data, uint64 count) override;
virtual void truncate(uint64 length) override;
virtual void seek(int64 offset, int whence) override;
virtual uint64 tell(void) override;
virtual uint64 size(void) override;
virtual void flush(void) override;
virtual void close(void) override;
virtual int get_line(std::string &str) override;
void shrink_to_fit(void) noexcept; // Minimizes alloced memory.
#if 0
// No methods on the object may be called externally(other than the destructor) after steal_malloced_ptr()
INLINE void* steal_malloced_ptr(void)
{
void* ret = data_buffer;
data_buffer = nullptr;
data_buffer_size = 0;
data_buffer_alloced = 0;
position = 0;
return ret;
}
#endif
private:
uint8 *data_buffer;
uint64 data_buffer_size;
uint64 data_buffer_alloced;
uint64 position;
void grow_if_necessary(uint64 new_required_size, uint64 hole_end);
};
#endif

View File

@ -0,0 +1,223 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* Stream.cpp:
** Copyright (C) 2012-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#define _GNU_SOURCE
#include <stdio.h>
#include "ss.h"
#include "Stream.h"
#include <stdlib.h>
Stream::Stream()
{
}
Stream::~Stream()
{
}
void Stream::require_fast_seekable(void)
{
const auto attr = attributes();
if(!(attr & ATTRIBUTE_SEEKABLE))
abort();//throw MDFN_Error(0, _("Stream is not seekable."));
if(attr & ATTRIBUTE_SLOW_SEEK)
abort();//throw MDFN_Error(0, _("Stream is not capable of fast seeks."));
}
uint64 Stream::read_discard(uint64 count)
{
uint8 buf[1024];
uint64 tmp;
uint64 ret = 0;
do
{
tmp = read(buf, std::min<uint64>(count, sizeof(buf)), false);
count -= tmp;
ret += tmp;
} while(tmp == sizeof(buf));
return ret;
}
uint64 Stream::alloc_and_read(void** data_out, uint64 size_limit)
{
uint8 *data_buffer = NULL;
uint64 data_buffer_size = 0;
uint64 data_buffer_alloced = 0;
//try
//{
if(attributes() & ATTRIBUTE_SLOW_SIZE)
{
uint64 rti;
data_buffer_size = 0;
data_buffer_alloced = 65536;
if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
while((rti = read(data_buffer + data_buffer_size, data_buffer_alloced - data_buffer_size, false)) > 0)
{
uint8* new_data_buffer;
data_buffer_size += rti;
if(data_buffer_size == data_buffer_alloced)
{
data_buffer_alloced <<= 1;
if(data_buffer_alloced >= SIZE_MAX)
abort();//throw MDFN_Error(ErrnoHolder(ENOMEM));
if(data_buffer_alloced > size_limit) // So we can test against our size limit without going far far over it in temporary memory allocations.
data_buffer_alloced = size_limit + 1;
if(data_buffer_size > size_limit)
abort();//throw MDFN_Error(0, _("Size limit of %llu bytes would be exceeded."), (unsigned long long)size_limit);
if(data_buffer_alloced > SIZE_MAX)
abort();//throw MDFN_Error(ErrnoHolder(ENOMEM));
if(!(new_data_buffer = (uint8 *)realloc(data_buffer, data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
data_buffer = new_data_buffer;
}
else // EOS
break;
}
if(data_buffer_alloced > data_buffer_size)
{
uint8 *new_data_buffer;
const uint64 new_data_buffer_alloced = std::max<uint64>(data_buffer_size, 1);
new_data_buffer = (uint8*)realloc(data_buffer, new_data_buffer_alloced);
if(new_data_buffer != NULL)
{
data_buffer = new_data_buffer;
data_buffer_alloced = new_data_buffer_alloced;
}
}
}
else
{
data_buffer_size = size();
data_buffer_size -= std::min<uint64>(data_buffer_size, tell());
data_buffer_alloced = std::max<uint64>(data_buffer_size, 1);
if(data_buffer_size > size_limit)
abort();//throw MDFN_Error(0, _("Size limit of %llu bytes would be exceeded."), (unsigned long long)size_limit);
if(data_buffer_alloced > SIZE_MAX)
abort();//throw MDFN_Error(ErrnoHolder(ENOMEM));
if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced)))
abort();//throw MDFN_Error(ErrnoHolder(errno));
read(data_buffer, data_buffer_size);
}
//}
//catch(...)
//{
// if(data_buffer)
// {
// free(data_buffer);
// data_buffer = NULL;
// }
// throw;
//}
*data_out = data_buffer;
return data_buffer_size;
}
uint8* Stream::map(void) noexcept
{
return(NULL);
}
uint64 Stream::map_size(void) noexcept
{
return 0;
}
void Stream::unmap(void) noexcept
{
}
void Stream::put_line(const std::string& str)
{
char l = '\n';
write(&str[0], str.size());
write(&l, sizeof(l));
}
void Stream::print_format(const char *format, ...)
{
char *str = NULL;
int rc;
va_list ap;
va_start(ap, format);
rc = vasprintf(&str, format, ap);
va_end(ap);
if(rc < 0)
abort();//throw MDFN_Error(0, "Error in trio_vasprintf()");
else
{
write(str, rc);
free(str);
}
}
int Stream::get_line(std::string &str)
{
uint8 c;
str.clear(); // or str.resize(0)??
while(read(&c, sizeof(c), false) > 0)
{
if(c == '\r' || c == '\n' || c == 0)
return(c);
str.push_back(c);
}
return(str.length() ? 256 : -1);
}

256
waterbox/ss/stream/Stream.h Normal file
View File

@ -0,0 +1,256 @@
/******************************************************************************/
/* Mednafen - Multi-system Emulator */
/******************************************************************************/
/* Stream.h:
** Copyright (C) 2012-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_STREAM_H
#define __MDFN_STREAM_H
// TODO?: BufferedStream, no virtual functions, yes inline functions, constructor takes a Stream* argument.
#include <errno.h>
#include <stdio.h> // For SEEK_* defines, which we will use in Stream out of FORCE OF HABIT.
#include <string.h>
#include <string>
/*
The data read into the pointer passed to read*() functions should be considered undefined if the function throws
or propagates an exception.
*/
class Stream
{
public:
Stream();
virtual ~Stream();
enum
{
ATTRIBUTE_READABLE = 1U << 0,
ATTRIBUTE_WRITEABLE = 1U << 1,
ATTRIBUTE_SEEKABLE = 1U << 2, // Indicates that Stream is capable of being seeked, regardless of how performant seeking is.
ATTRIBUTE_SLOW_SEEK = 1U << 3, // Indicates that seeking(particularly backwards) is slow, and should be avoided if at all possible.
ATTRIBUTE_SLOW_SIZE = 1U << 4 // Indicates that size() is slow, and should be avoided if at all possible.
};
virtual uint64 attributes(void) = 0;
//
// Throw an exception if stream is not fast-seekable; exists to allow for class-specific generic but helpful
// error messages(such as perhaps "MeowZip file is missing a seek index.").
//
virtual void require_fast_seekable(void);
virtual uint8 *map(void) noexcept;
// Map the entirety of the stream data into the address space of the process, if possible, and return a pointer.
// (the returned pointer must be cached, and returned on any subsequent calls to map() without an unmap()
// in-between, to facilitate a sort of "feature-testing", to determine if an alternative like "MemoryStream"
// should be used).
//
// If the mapping fails for whatever reason, return NULL rather than throwing an exception.
//
// For code using this functionality, ensure usage of map_size() instead of size(), unless you're only using a specific derived
// class like MemoryStream() where the value returned by size() won't change unexpectedly due to outside factors.
virtual uint64 map_size(void) noexcept;
// The size of the memory mapping area, point to which returned by map().
//
// Returns 0 on supported, or if no mapping currently exists.
virtual void unmap(void) noexcept;
// Unmap the stream data from the address space. (Possibly invalidating the pointer returned from map()).
// (must automatically be called, if necessary, from the destructor).
//
// If the data can't be "unmapped" as such because it was never mmap()'d or similar in the first place(such as with MemoryStream),
// then this will be a nop.
virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) = 0;
virtual void write(const void *data, uint64 count) = 0;
virtual void truncate(uint64 length) = 0; // Should have ftruncate()-like semantics; but avoid using it to extend files.
virtual void seek(int64 offset, int whence = SEEK_SET) = 0;
inline void rewind(void)
{
seek(0, SEEK_SET);
}
virtual uint64 tell(void) = 0;
virtual uint64 size(void) = 0; // May implicitly call flush() if the stream is writeable.
virtual void flush(void) = 0;
virtual void close(void) = 0; // Flushes(in the case of writeable streams) and closes the stream.
// Necessary since this operation can fail(running out of disk space, for instance),
// and throw an exception in the destructor would be a Bad Idea(TM).
//
// Manually calling this function isn't strictly necessary, but recommended when the
// stream is writeable; it will be called automatically from the destructor, with any
// exceptions thrown caught and logged.
//
// Utility functions(TODO):
//
INLINE uint8 get_u8(void)
{
uint8 ret;
read(&ret, sizeof(ret));
return ret;
}
INLINE void put_u8(uint8 c)
{
write(&c, sizeof(c));
}
template<typename T>
INLINE T get_NE(void)
{
T ret;
read(&ret, sizeof(ret));
return ret;
}
template<typename T>
INLINE T get_RE(void)
{
uint8 tmp[sizeof(T)];
union
{
T ret;
uint8 ret_u8[sizeof(T)];
};
read(tmp, sizeof(tmp));
for(unsigned i = 0; i < sizeof(T); i++)
ret_u8[i] = tmp[sizeof(T) - 1 - i];
return ret;
}
template<typename T>
INLINE void put_NE(T c)
{
write(&c, sizeof(c));
}
template<typename T>
INLINE void put_RE(T c)
{
uint8 tmp[sizeof(T)];
for(unsigned i = 0; i < sizeof(T); i++)
tmp[i] = ((uint8 *)&c)[sizeof(T) - 1 - i];
write(tmp, sizeof(tmp));
}
template<typename T>
INLINE T get_LE(void)
{
#ifdef LSB_FIRST
return get_NE<T>();
#else
return get_RE<T>();
#endif
}
template<typename T>
INLINE void put_LE(T c)
{
#ifdef LSB_FIRST
return put_NE<T>(c);
#else
return put_RE<T>(c);
#endif
}
template<typename T>
INLINE T get_BE(void)
{
#ifndef LSB_FIRST
return get_NE<T>();
#else
return get_RE<T>();
#endif
}
template<typename T>
INLINE void put_BE(T c)
{
#ifndef LSB_FIRST
return put_NE<T>(c);
#else
return put_RE<T>(c);
#endif
}
INLINE void put_string(const char* str)
{
write(str, strlen(str));
}
// Reads a line into "str", overwriting its contents; returns the line-end char('\n' or '\r' or '\0'), or 256 on EOF and
// data has been read into "str", and -1 on EOF when no data has been read into "str".
// The line-end char won't be added to "str".
// It's up to the caller to handle extraneous empty lines caused by DOS-format text lines(\r\n).
// ("str" is passed by reference for the possibility of improved performance by reusing alloced memory for the std::string, though part
// of it would be up to the STL implementation).
// Implemented as virtual so that a higher-performance version can be implemented if possible(IE with MemoryStream)
virtual int get_line(std::string &str);
virtual void put_line(const std::string& str);
virtual void print_format(const char *format, ...) MDFN_FORMATSTR(gnu_printf, 2, 3);
#if 0
int scanf(const char *format, ...) MDFN_FORMATSTR(gnu_scanf, 2, 3);
void put_string(const char *str);
void put_string(const std::string &str);
#endif
//
// Read until end-of-stream(or count), discarding any read data, and returns the amount of data "read".
// (Useful for detecting and printing warnings about extra garbage data without needing to call size(),
// which can be problematic for some types of Streams).
uint64 read_discard(uint64 count = ~(uint64)0);
//
// Reads stream starting at the current stream position(as returned by tell()), into memory allocated with malloc() and realloc(), and
// sets *data_out to a pointer to the memory(which the caller will need to free() at some point).
//
// *data_out is only an output.
//
// If size_limit is/will be exceeded, an exception will be thrown, and *data_out will not be written to.
//
// Will return the amount of data read.
//
// If the returned value is 0, *data_out will still be a valid non-NULL pointer.
//
uint64 alloc_and_read(void** data_out, uint64 size_limit = ~(uint64)0);
};
#endif

887
waterbox/ss/vdp1.cpp Normal file
View File

@ -0,0 +1,887 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1.cpp - VDP1 Emulation
** Copyright (C) 2015-2017 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// TODO: Check to see what registers are reset on reset.
// TODO: Fix preclipping when raw system clipping values have bit12==1(sign bit?).
// TODO: SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]));
// (...but goes weird in 8bpp rotated mode...)
// TODO: Test 1x1 line, polyline, sprite, and polygon.
// TODO: Framebuffer swap/auto drawing start happens a bit too early, should happen near
// end of hblank instead of the beginning.
#include "ss.h"
#include "scu.h"
#include "vdp1.h"
#include "vdp2.h"
#include "vdp1_common.h"
enum { VDP1_UpdateTimingGran = 263 };
enum { VDP1_IdleTimingGran = 1019 };
namespace MDFN_IEN_SS
{
namespace VDP1
{
uint8 spr_w_shift_tab[8];
line_data LineSetup;
uint8 gouraud_lut[0x40];
uint16 VRAM[0x40000];
uint16 FB[2][0x20000];
bool FBDrawWhich;
static bool FBManualPending;
static bool FBVBErasePending;
static bool FBVBEraseActive;
static sscpu_timestamp_t FBVBEraseLastTS;
int32 SysClipX, SysClipY;
int32 UserClipX0, UserClipY0, UserClipX1, UserClipY1;
int32 LocalX, LocalY;
static uint32 CurCommandAddr;
static int32 RetCommandAddr;
static bool DrawingActive;
static uint16 LOPR;
static uint16 EWDR; // Erase/Write Data
static uint16 EWLR; // Erase/Write Upper Left Coordinate
static uint16 EWRR; // Erase/Write Lower Right Coordinate
static struct
{
bool rot8;
uint32 fb_x_mask;
uint32 y_start;
uint32 x_start;
uint32 y_end;
uint32 x_bound;
uint16 fill_data;
} EraseParams;
static uint32 EraseYCounter;
uint8 TVMR;
uint8 FBCR;
uint8 PTMR;
static uint8 EDSR;
static bool vb_status, hb_status;
static sscpu_timestamp_t lastts;
static int32 CycleCounter;
static bool vbcdpending;
void Init(void)
{
vbcdpending = false;
for(int i = 0; i < 0x40; i++)
{
gouraud_lut[i] = std::min<int>(31, std::max<int>(0, i - 16));
}
for(int i = 0; i < 8; i++)
{
spr_w_shift_tab[i] = (7 - i) / 3;
}
//
//
SS_SetPhysMemMap(0x05C00000, 0x05C7FFFF, VRAM, sizeof(VRAM), true);
//SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]), true);
vb_status = false;
hb_status = false;
lastts = 0;
FBVBEraseLastTS = 0;
}
void Reset(bool powering_up)
{
if(powering_up)
{
for(unsigned i = 0; i < 0x40000; i++)
{
uint16 val;
if((i & 0xF) == 0)
val = 0x8000;
else if(i & 0x1)
val = 0x5555;
else
val = 0xAAAA;
VRAM[i] = val;
}
for(unsigned fb = 0; fb < 2; fb++)
for(unsigned i = 0; i < 0x20000; i++)
FB[fb][i] = 0xFFFF;
memset(&LineSetup, 0, sizeof(LineSetup));
//
//
//
EWDR = 0;
EWLR = 0;
EWRR = 0;
TVMR = 0;
FBCR = 0;
}
UserClipX0 = 0;
UserClipY0 = 0;
UserClipX1 = 0;
UserClipY1 = 0;
SysClipX = 0;
SysClipY = 0;
LocalX = 0;
LocalY = 0;
FBDrawWhich = 0;
//SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]), true);
FBManualPending = false;
FBVBErasePending = false;
FBVBEraseActive = false;
LOPR = 0;
CurCommandAddr = 0;
RetCommandAddr = -1;
DrawingActive = false;
PTMR = 0;
EDSR = 0;
memset(&EraseParams, 0, sizeof(EraseParams));
EraseYCounter = ~0U;
CycleCounter = 0;
}
static int32 CMD_SetUserClip(const uint16* cmd_data)
{
UserClipX0 = cmd_data[0x6] & 0x3FF;
UserClipY0 = cmd_data[0x7] & 0x1FF;
UserClipX1 = cmd_data[0xA] & 0x3FF;
UserClipY1 = cmd_data[0xB] & 0x1FF;
return 0;
}
int32 CMD_SetSystemClip(const uint16* cmd_data)
{
SysClipX = cmd_data[0xA] & 0x3FF;
SysClipY = cmd_data[0xB] & 0x1FF;
return 0;
}
int32 CMD_SetLocalCoord(const uint16* cmd_data)
{
LocalX = sign_x_to_s32(11, cmd_data[0x6] & 0x7FF);
LocalY = sign_x_to_s32(11, cmd_data[0x7] & 0x7FF);
return 0;
}
template<unsigned ECDSPDMode>
static uint32 MDFN_FASTCALL TexFetch(uint32 x)
{
const uint32 base = LineSetup.tex_base;
const bool ECD = ECDSPDMode & 0x10;
const bool SPD = ECDSPDMode & 0x08;
const unsigned ColorMode = ECDSPDMode & 0x07;
uint32 rtd;
uint32 ret_or = 0;
switch(ColorMode)
{
case 0: // 16 colors, color bank
rtd = (VRAM[(base + (x >> 2)) & 0x3FFFF] >> (((x & 0x3) ^ 0x3) << 2)) & 0xF;
if(!ECD && rtd == 0xF)
{
LineSetup.ec_count--;
return -1;
}
ret_or = LineSetup.cb_or;
if(!SPD) ret_or |= (int32)(rtd - 1) >> 31;
return rtd | ret_or;
case 1: // 16 colors, LUT
rtd = (VRAM[(base + (x >> 2)) & 0x3FFFF] >> (((x & 0x3) ^ 0x3) << 2)) & 0xF;
if(!ECD && rtd == 0xF)
{
LineSetup.ec_count--;
return -1;
}
if(!SPD) ret_or |= (int32)(rtd - 1) >> 31;
return LineSetup.CLUT[rtd] | ret_or;
case 2: // 64 colors, color bank
rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF;
if(!ECD && rtd == 0xFF)
{
LineSetup.ec_count--;
return -1;
}
ret_or = LineSetup.cb_or;
if(!SPD) ret_or |= (int32)(rtd - 1) >> 31;
return (rtd & 0x3F) | ret_or;
case 3: // 128 colors, color bank
rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF;
if(!ECD && rtd == 0xFF)
{
LineSetup.ec_count--;
return -1;
}
ret_or = LineSetup.cb_or;
if(!SPD) ret_or |= (int32)(rtd - 1) >> 31;
return (rtd & 0x7F) | ret_or;
case 4: // 256 colors, color bank
rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF;
if(!ECD && rtd == 0xFF)
{
LineSetup.ec_count--;
return -1;
}
ret_or = LineSetup.cb_or;
if(!SPD) ret_or |= (int32)(rtd - 1) >> 31;
return rtd | ret_or;
case 5: // 32K colors, RGB
case 6:
case 7:
if(ColorMode >= 6)
rtd = VRAM[0];
else
rtd = VRAM[(base + x) & 0x3FFFF];
if(!ECD && (rtd & 0xC000) == 0x4000)
{
LineSetup.ec_count--;
return -1;
}
if(!SPD) ret_or |= (int32)(rtd - 0x4000) >> 31;
return rtd | ret_or;
}
}
extern uint32 (MDFN_FASTCALL *const TexFetchTab[0x20])(uint32 x) =
{
#define TF(a) (TexFetch<a>)
TF(0x00), TF(0x01), TF(0x02), TF(0x03),
TF(0x04), TF(0x05), TF(0x06), TF(0x07),
TF(0x08), TF(0x09), TF(0x0A), TF(0x0B),
TF(0x0C), TF(0x0D), TF(0x0E), TF(0x0F),
TF(0x10), TF(0x11), TF(0x12), TF(0x13),
TF(0x14), TF(0x15), TF(0x16), TF(0x17),
TF(0x18), TF(0x19), TF(0x1A), TF(0x1B),
TF(0x1C), TF(0x1D), TF(0x1E), TF(0x1F),
#undef TF
};
/*
Notes:
When vblank starts: Abort command processing, and if VBE=1, erase framebuffer just displayed according to set values.
When vblank ends: Abort framebuffer erase, swap framebuffer, and if (PTMR&2) start command processing.
See if EDSR and LOPR are modified or not when PTMR=0 and an auto framebuffer swap occurs.
FB erase params are latched at framebuffer swap time probably.
VBE=1 is persistent.
*/
sscpu_timestamp_t Update(sscpu_timestamp_t timestamp)
{
if(MDFN_UNLIKELY(timestamp < lastts))
{
// Don't else { } normal execution, since this bug condition miiight occur in the call from SetHBVB(),
// and we need drawing to start ASAP before silly games overwrite the beginning of the command table.
//
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] [BUG] timestamp(%d) < lastts(%d)", timestamp, lastts);
timestamp = lastts;
}
//
//
//
int32 cycles = timestamp - lastts;
lastts = timestamp;
CycleCounter += cycles;
if(CycleCounter > VDP1_UpdateTimingGran)
CycleCounter = VDP1_UpdateTimingGran;
if(CycleCounter > 0 && SCU_CheckVDP1HaltKludge())
{
//puts("Kludge");
CycleCounter = 0;
}
else if(DrawingActive)
{
while(CycleCounter > 0)
{
uint16 cmd_data[0x10];
// Fetch command data
memcpy(cmd_data, &VRAM[CurCommandAddr], sizeof(cmd_data));
CycleCounter -= 16;
//SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Command @ 0x%06x: 0x%04x\n", CurCommandAddr, cmd_data[0]);
if(MDFN_LIKELY(!(cmd_data[0] & 0xC000)))
{
const unsigned cc = cmd_data[0] & 0xF;
if(MDFN_UNLIKELY(cc >= 0xC))
{
DrawingActive = false;
break;
}
else
{
static int32 (*const command_table[0xC])(const uint16* cmd_data) =
{
/* 0x0 */ /* 0x1 */ /* 0x2 */ /* 0x3 */
CMD_NormalSprite, CMD_ScaledSprite, CMD_DistortedSprite, CMD_DistortedSprite,
/* 0x4 */ /* 0x5 */ /* 0x6 */ /* 0x7 */
CMD_Polygon, CMD_Polyline, CMD_Line, CMD_Polyline,
/* 0x8*/ /* 0x9 */ /* 0xA */ /* 0xB */
CMD_SetUserClip, CMD_SetSystemClip, CMD_SetLocalCoord, CMD_SetUserClip
};
CycleCounter -= command_table[cc](cmd_data);
}
}
else if(MDFN_UNLIKELY(cmd_data[0] & 0x8000))
{
SS_DBGTI(SS_DBG_VDP1, "[VDP1] Drawing finished at 0x%05x", CurCommandAddr);
DrawingActive = false;
EDSR |= 0x2; // TODO: Does EDSR reflect IRQ out status?
SCU_SetInt(SCU_INT_VDP1, true);
SCU_SetInt(SCU_INT_VDP1, false);
break;
}
CurCommandAddr = (CurCommandAddr + 0x10) & 0x3FFFF;
switch((cmd_data[0] >> 12) & 0x3)
{
case 0:
break;
case 1:
CurCommandAddr = (cmd_data[1] << 2) &~ 0xF;
break;
case 2:
if(RetCommandAddr < 0)
RetCommandAddr = CurCommandAddr;
CurCommandAddr = (cmd_data[1] << 2) &~ 0xF;
break;
case 3:
if(RetCommandAddr >= 0)
{
CurCommandAddr = RetCommandAddr;
RetCommandAddr = -1;
}
break;
}
}
}
return timestamp + (DrawingActive ? std::max<int32>(VDP1_UpdateTimingGran, 0 - CycleCounter) : VDP1_IdleTimingGran);
}
// Draw-clear minimum x amount is 2(16-bit units) for normal and 8bpp, and 8 for rotate...actually, seems like
// rotate being enabled forces vblank erase mode somehow.
static void StartDrawing(void)
{
if(DrawingActive)
{
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Drawing interrupted by new drawing start request.");
}
SS_DBGTI(SS_DBG_VDP1, "[VDP1] Started drawing to framebuffer %d.", FBDrawWhich);
// On draw start, clear CEF.
EDSR &= ~0x2;
CurCommandAddr = 0;
RetCommandAddr = -1;
DrawingActive = true;
CycleCounter = VDP1_UpdateTimingGran;
}
void SetHBVB(const sscpu_timestamp_t event_timestamp, const bool new_hb_status, const bool new_vb_status)
{
const bool old_hb_status = hb_status;
const bool old_vb_status = vb_status;
hb_status = new_hb_status;
vb_status = new_vb_status;
if(MDFN_UNLIKELY(vbcdpending & hb_status & (old_hb_status ^ hb_status)))
{
vbcdpending = false;
if(vb_status) // Going into v-blank
{
//
// v-blank erase
//
if((TVMR & TVMR_VBE) || FBVBErasePending)
{
SS_DBGTI(SS_DBG_VDP1, "[VDP1] VB erase start of framebuffer %d.", !FBDrawWhich);
FBVBErasePending = false;
FBVBEraseActive = true;
FBVBEraseLastTS = event_timestamp;
}
}
else // Leaving v-blank
{
// Run vblank erase at end of vblank all at once(not strictly accurate, but should only have visible side effects wrt the debugger and reset).
if(FBVBEraseActive)
{
int32 count = event_timestamp - FBVBEraseLastTS;
//printf("%d %d, %d\n", event_timestamp, FBVBEraseLastTS, count);
//
//
//
uint32 y = EraseParams.y_start;
do
{
uint16* fbyptr;
uint32 x = EraseParams.x_start;
fbyptr = &FB[!FBDrawWhich][(y & 0xFF) << 9];
if(EraseParams.rot8)
fbyptr += (y & 0x100);
count -= 8;
do
{
for(unsigned sub = 0; sub < 8; sub++)
{
//printf("%d %d:%d %04x\n", FBDrawWhich, x, y, fill_data);
//printf("%lld\n", &fbyptr[x & fb_x_mask] - FB[!FBDrawWhich]);
fbyptr[x & EraseParams.fb_x_mask] = EraseParams.fill_data;
x++;
}
count -= 8;
if(MDFN_UNLIKELY(count <= 0))
{
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] VB erase of framebuffer %d ran out of time.", !FBDrawWhich);
goto AbortVBErase;
}
} while(x < EraseParams.x_bound);
} while(++y <= EraseParams.y_end);
AbortVBErase:;
//
FBVBEraseActive = false;
}
//
//
//
//
if(!(FBCR & FBCR_FCM) || (FBManualPending && (FBCR & FBCR_FCT))) // Swap framebuffers
{
if(DrawingActive)
{
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Drawing aborted by framebuffer swap.");
DrawingActive = false;
}
FBDrawWhich = !FBDrawWhich;
SS_DBGTI(SS_DBG_VDP1, "[VDP1] Displayed framebuffer changed to %d.", !FBDrawWhich);
// On fb swap, copy CEF to BEF, clear CEF, and copy COPR to LOPR.
EDSR = EDSR >> 1;
LOPR = CurCommandAddr >> 2;
//
EraseParams.rot8 = (TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE);
EraseParams.fb_x_mask = EraseParams.rot8 ? 0xFF : 0x1FF;
EraseParams.y_start = EWLR & 0x1FF;
EraseParams.x_start = ((EWLR >> 9) & 0x3F) << 3;
EraseParams.y_end = EWRR & 0x1FF;
EraseParams.x_bound = ((EWRR >> 9) & 0x7F) << 3;
EraseParams.fill_data = EWDR;
//
if(PTMR & 0x2) // Start drawing(but only if we swapped the frame)
{
StartDrawing();
SS_SetEventNT(&events[SS_EVENT_VDP1], Update(event_timestamp));
}
}
if(!(FBCR & FBCR_FCM) || (FBManualPending && !(FBCR & FBCR_FCT)))
{
if(TVMR & TVMR_ROTATE)
{
EraseYCounter = ~0U;
FBVBErasePending = true;
}
else
{
EraseYCounter = EraseParams.y_start;
}
}
FBManualPending = false;
}
}
vbcdpending |= old_vb_status ^ vb_status;
}
bool GetLine(const int line, uint16* buf, unsigned w, uint32 rot_x, uint32 rot_y, uint32 rot_xinc, uint32 rot_yinc)
{
bool ret = false;
//
//
//
if(TVMR & TVMR_ROTATE)
{
const uint16* fbptr = FB[!FBDrawWhich];
if(TVMR & TVMR_8BPP)
{
for(unsigned i = 0; MDFN_LIKELY(i < w); i++)
{
const uint32 fb_x = rot_x >> 9;
const uint32 fb_y = rot_y >> 9;
if((fb_x | fb_y) &~ 0x1FF)
buf[i] = 0; // Not 0xFF00
else
{
const uint16* fbyptr = fbptr + ((fb_y & 0xFF) << 9);
uint8 tmp = ne16_rbo_be<uint8>(fbyptr, (fb_x & 0x1FF) | ((fb_y & 0x100) << 1));
buf[i] = 0xFF00 | tmp;
}
rot_x += rot_xinc;
rot_y += rot_yinc;
}
}
else
{
for(unsigned i = 0; MDFN_LIKELY(i < w); i++)
{
const uint32 fb_x = rot_x >> 9;
const uint32 fb_y = rot_y >> 9;
if((fb_x &~ 0x1FF) | (fb_y &~ 0xFF))
buf[i] = 0;
else
buf[i] = fbptr[(fb_y << 9) + fb_x];
rot_x += rot_xinc;
rot_y += rot_yinc;
}
}
}
else
{
const uint16* fbyptr = &FB[!FBDrawWhich][(line & 0xFF) << 9];
if(TVMR & TVMR_8BPP)
ret = true;
for(unsigned i = 0; MDFN_LIKELY(i < w); i++)
buf[i] = fbyptr[i];
}
//
//
//
if(EraseYCounter <= EraseParams.y_end)
{
uint16* fbyptr;
uint32 x = EraseParams.x_start;
fbyptr = &FB[!FBDrawWhich][(EraseYCounter & 0xFF) << 9];
if(EraseParams.rot8)
fbyptr += (EraseYCounter & 0x100);
do
{
for(unsigned sub = 0; sub < 2; sub++)
{
//printf("%d %d:%d %04x\n", FBDrawWhich, x, y, fill_data);
//printf("%lld\n", &fbyptr[x & fb_x_mask] - FB[!FBDrawWhich]);
fbyptr[x & EraseParams.fb_x_mask] = EraseParams.fill_data;
x++;
}
} while(x < EraseParams.x_bound);
EraseYCounter++;
}
return ret;
}
void AdjustTS(const int32 delta)
{
lastts += delta;
if(FBVBEraseActive)
FBVBEraseLastTS += delta;
}
static INLINE void WriteReg(const unsigned which, const uint16 value)
{
SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(SH7095_mem_timestamp));
sscpu_timestamp_t nt = Update(SH7095_mem_timestamp);
SS_DBGTI(SS_DBG_VDP1_REGW, "[VDP1] Register write: 0x%02x: 0x%04x", which << 1, value);
switch(which)
{
default:
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Unknown write of value 0x%04x to register 0x%02x", value, which << 1);
break;
case 0x0: // TVMR
TVMR = value & 0xF;
break;
case 0x1: // FBCR
FBCR = value & 0x1F;
FBManualPending |= value & 0x2;
break;
case 0x2: // PTMR
PTMR = (value & 0x3);
if(value & 0x1)
{
StartDrawing();
nt = SH7095_mem_timestamp + 1;
}
break;
case 0x3: // EWDR
EWDR = value;
break;
case 0x4: // EWLR
EWLR = value & 0x7FFF;
break;
case 0x5: // EWRR
EWRR = value;
break;
case 0x6: // ENDR
if(DrawingActive)
{
DrawingActive = false;
if(CycleCounter < 0)
CycleCounter = 0;
nt = SH7095_mem_timestamp + VDP1_IdleTimingGran;
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Program forced termination of VDP1 drawing.");
}
break;
}
SS_SetEventNT(&events[SS_EVENT_VDP1], nt);
}
static INLINE uint16 ReadReg(const unsigned which)
{
switch(which)
{
default:
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Unknown read from register 0x%02x", which);
return 0;
case 0x8: // EDSR
return EDSR;
case 0x9: // LOPR
return LOPR;
case 0xA: // COPR
return CurCommandAddr >> 2;
case 0xB: // MODR
return (0x1 << 12) | ((PTMR & 0x2) << 7) | ((FBCR & 0x1E) << 3) | (TVMR << 0);
}
}
void Write8_DB(uint32 A, uint16 DB)
{
A &= 0x1FFFFF;
if(A < 0x80000)
{
ne16_wbo_be<uint8>(VRAM, A, DB >> (((A & 1) ^ 1) << 3) );
return;
}
if(A < 0x100000)
{
uint32 FBA = A;
if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE))
FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200);
ne16_wbo_be<uint8>(FB[FBDrawWhich], FBA & 0x3FFFF, DB >> (((A & 1) ^ 1) << 3) );
return;
}
SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] 8-bit write to 0x%08x(DB=0x%04x)", A, DB);
WriteReg((A - 0x100000) >> 1, DB);
}
void Write16_DB(uint32 A, uint16 DB)
{
A &= 0x1FFFFE;
if(A < 0x80000)
{
VRAM[A >> 1] = DB;
return;
}
if(A < 0x100000)
{
uint32 FBA = A;
if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE))
FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200);
FB[FBDrawWhich][(FBA >> 1) & 0x1FFFF] = DB;
return;
}
WriteReg((A - 0x100000) >> 1, DB);
}
uint16 Read16_DB(uint32 A)
{
A &= 0x1FFFFE;
if(A < 0x080000)
return VRAM[A >> 1];
if(A < 0x100000)
{
uint32 FBA = A;
if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE))
FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200);
return FB[FBDrawWhich][(FBA >> 1) & 0x1FFFF];
}
return ReadReg((A - 0x100000) >> 1);
}
uint8 PeekVRAM(const uint32 addr)
{
return ne16_rbo_be<uint8>(VRAM, addr & 0x7FFFF);
}
void PokeVRAM(const uint32 addr, const uint8 val)
{
ne16_wbo_be<uint8>(VRAM, addr & 0x7FFFF, val);
}
/*void MakeDump(const std::string& path)
{
FileStream fp(path, FileStream::MODE_WRITE);
for(unsigned i = 0; i < 0x40000; i++)
fp.print_format("0x%04x, ", VRAM[i]);
fp.close();
}*/
}
}

59
waterbox/ss/vdp1.h Normal file
View File

@ -0,0 +1,59 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_VDP1_H
#define __MDFN_SS_VDP1_H
namespace MDFN_IEN_SS
{
namespace VDP1
{
void Init(void) MDFN_COLD;
void Reset(bool powering_up) MDFN_COLD;
sscpu_timestamp_t Update(sscpu_timestamp_t timestamp);
void AdjustTS(const int32 delta);
void Write8_DB(uint32 A, uint16 DB) MDFN_HOT;
void Write16_DB(uint32 A, uint16 DB) MDFN_HOT;
uint16 Read16_DB(uint32 A) MDFN_HOT;
void SetHBVB(const sscpu_timestamp_t event_timestamp, const bool new_hb_status, const bool new_vb_status);
bool GetLine(const int line, uint16* buf, unsigned w, uint32 rot_x, uint32 rot_y, uint32 rot_xinc, uint32 rot_yinc);
// __restrict__ in vdp2
//const uint16* VPD1_FetchLine(void);
// vb start, vb end, field num...
uint8 PeekVRAM(const uint32 addr);
void PokeVRAM(const uint32 addr, const uint8 val);
void MakeDump(const std::string& path) MDFN_COLD;
}
}
#endif

670
waterbox/ss/vdp1_common.h Normal file
View File

@ -0,0 +1,670 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1_common.h:
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __MDFN_SS_VDP1_COMMON_H
#define __MDFN_SS_VDP1_COMMON_H
#include "endian.h"
namespace MDFN_IEN_SS
{
namespace VDP1
{
int32 CMD_NormalSprite(const uint16*);
int32 CMD_ScaledSprite(const uint16*);
int32 CMD_DistortedSprite(const uint16*);
int32 CMD_Polygon(const uint16*);
int32 CMD_Polyline(const uint16*);
int32 CMD_Line(const uint16*);
extern uint16 VRAM[0x40000];
extern uint16 FB[2][0x20000];
extern bool FBDrawWhich;
extern int32 SysClipX, SysClipY;
extern int32 UserClipX0, UserClipY0, UserClipX1, UserClipY1;
extern int32 LocalX, LocalY;
extern uint32 (MDFN_FASTCALL *const TexFetchTab[0x20])(uint32 x);
enum { TVMR_8BPP = 0x1 };
enum { TVMR_ROTATE = 0x2 };
enum { TVMR_HDTV = 0x4 };
enum { TVMR_VBE = 0x8 };
extern uint8 TVMR;
enum { FBCR_FCT = 0x01 }; // Frame buffer change trigger
enum { FBCR_FCM = 0x02 }; // Frame buffer change mode
enum { FBCR_DIL = 0x04 }; // Double interlace draw line(0=even, 1=odd) (does it affect drawing to FB RAM or reading from FB RAM to VDP2?)
enum { FBCR_DIE = 0x08 }; // Double interlace enable
enum { FBCR_EOS = 0x10 }; // Even/Odd coordinate select(0=even, 1=odd, used with HSS)
extern uint8 FBCR;
extern uint8 spr_w_shift_tab[8];
extern uint8 gouraud_lut[0x40];
struct GourauderTheTerrible
{
void Setup(const unsigned length, const uint16 gstart, const uint16 gend)
{
g = gstart & 0x7FFF;
intinc = 0;
for(unsigned cc = 0; cc < 3; cc++)
{
const int dg = ((gend >> (cc * 5)) & 0x1F) - ((gstart >> (cc * 5)) & 0x1F);
const unsigned abs_dg = abs(dg);
ginc[cc] = (uint32)((dg >= 0) ? 1 : -1) << (cc * 5);
if(length <= abs_dg)
{
error_inc[cc] = (abs_dg + 1) * 2;
error_adj[cc] = (length * 2);
error[cc] = abs_dg + 1 - (length * 2 + ((dg < 0) ? 1 : 0));
while(error[cc] >= 0) { g += ginc[cc]; error[cc] -= error_adj[cc]; }
while(error_inc[cc] >= error_adj[cc]) { intinc += ginc[cc]; error_inc[cc] -= error_adj[cc]; }
}
else
{
error_inc[cc] = abs_dg * 2;
error_adj[cc] = ((length - 1) * 2);
error[cc] = length - (length * 2 - ((dg < 0) ? 1 : 0));
if(error[cc] >= 0) { g += ginc[cc]; error[cc] -= error_adj[cc]; }
if(error_inc[cc] >= error_adj[cc]) { intinc += ginc[cc]; error_inc[cc] -= error_adj[cc]; }
}
error[cc] = ~error[cc];
}
}
inline uint32 Current(void)
{
return g;
}
inline uint16 Apply(uint16 pix) const
{
uint16 ret = pix & 0x8000;
ret |= gouraud_lut[((pix & (0x1F << 0)) + (g & (0x1F << 0))) >> 0] << 0;
ret |= gouraud_lut[((pix & (0x1F << 5)) + (g & (0x1F << 5))) >> 5] << 5;
ret |= gouraud_lut[((pix & (0x1F << 10)) + (g & (0x1F << 10))) >> 10] << 10;
return ret;
}
inline void Step(void)
{
g += intinc;
for(unsigned cc = 0; cc < 3; cc++)
{
error[cc] -= error_inc[cc];
{
const uint32 mask = (int32)error[cc] >> 31;
g += ginc[cc] & mask;
error[cc] += error_adj[cc] & mask;
}
}
}
uint32 g;
uint32 intinc;
int32 ginc[3];
int32 error[3];
int32 error_inc[3];
int32 error_adj[3];
};
struct VileTex
{
INLINE bool Setup(const unsigned length, const int32 tstart, const int32 tend, const int32 sf = 1, const int32 tfudge = 0)
{
int dt = tend - tstart;
unsigned abs_dt = abs(dt);
t = (tstart * sf) | tfudge;
tinc = (dt >= 0) ? sf : -sf;
if(length <= abs_dt)
{
error_inc = (abs_dt + 1) * 2;
error_adj = (length * 2);
error = abs_dt + 1 - (length * 2 + ((dt < 0) ? 1 : 0));
}
else
{
error_inc = abs_dt * 2;
error_adj = ((length - 1) * 2);
error = length - (length * 2 - ((dt < 0) ? 1 : 0));
}
return false;
}
//
//
//
INLINE bool IncPending(void) { return error >= 0; }
INLINE int32 DoPendingInc(void) { t += tinc; error -= error_adj; return t; }
INLINE void AddError(void) { error += error_inc; }
//
//
//
INLINE int32 PreStep(void)
{
while(error >= 0)
{
t += tinc;
error -= error_adj;
}
error += error_inc;
return t;
}
INLINE int32 Current(void)
{
return t;
}
int32 t;
int32 tinc;
int32 error;
int32 error_inc;
int32 error_adj;
};
//
//
//
template<bool die, unsigned bpp8, bool MSBOn, bool UserClipEn, bool UserClipMode, bool MeshEn, bool HalfFGEn, bool HalfBGEn>
static INLINE int32 PlotPixel(int32 x, int32 y, uint16 pix, bool transparent, GourauderTheTerrible* g)
{
static_assert(!MSBOn || (!HalfFGEn && !HalfBGEn), "Table error; sub-optimal template arguments.");
int32 ret = 0;
uint16* fbyptr;
if(die)
{
fbyptr = &FB[FBDrawWhich][((y >> 1) & 0xFF) << 9];
transparent |= ((y & 1) != (bool)(FBCR & FBCR_DIL));
}
else
{
fbyptr = &FB[FBDrawWhich][(y & 0xFF) << 9];
}
if(MeshEn)
transparent |= (x ^ y) & 1;
if(bpp8)
{
if(MSBOn)
{
pix = (fbyptr[((x >> 1) & 0x1FF)] | 0x8000) >> (((x & 1) ^ 1) << 3);
ret += 5;
}
else if(HalfBGEn)
ret += 5;
if(!transparent)
{
if(bpp8 == 2) // BPP8 + rotated
ne16_wbo_be<uint8>(fbyptr, (x & 0x1FF) | ((y & 0x100) << 1), pix);
else
ne16_wbo_be<uint8>(fbyptr, x & 0x3FF, pix);
}
ret++;
}
else
{
uint16* const p = &fbyptr[x & 0x1FF];
if(MSBOn)
{
pix = *p | 0x8000;
ret += 5;
}
else
{
if(HalfBGEn)
{
uint16 bg_pix = *p;
ret += 5;
if(bg_pix & 0x8000)
{
if(HalfFGEn)
{
if(g)
pix = g->Apply(pix);
pix = ((pix + bg_pix) - ((pix ^ bg_pix) & 0x8421)) >> 1;
}
else
{
if(g)
pix = 0;
else
pix = ((bg_pix & 0x7BDE) >> 1) | (bg_pix & 0x8000);
}
}
else
{
if(HalfFGEn)
{
if(g)
pix = g->Apply(pix);
else
pix = pix;
}
else
{
if(g)
pix = 0;
else
pix = bg_pix;
}
}
}
else
{
if(g)
pix = g->Apply(pix);
if(HalfFGEn)
pix = ((pix & 0x7BDE) >> 1) | (pix & 0x8000);
}
}
if(!transparent)
*p = pix;
ret++;
}
return ret;
}
static INLINE void CheckUndefClipping(void)
{
if(SysClipX < UserClipX1 || SysClipY < UserClipY1 || UserClipX0 > UserClipX1 || UserClipY0 > UserClipY1)
{
//SS_DBG(SS_DBG_WARNING, "[VDP1] Illegal clipping windows; Sys=%u:%u -- User=%u:%u - %u:%u\n", SysClipX, SysClipY, UserClipX0, UserClipY0, UserClipX1, UserClipY1);
}
}
//
//
struct line_vertex
{
int32 x, y;
uint16 g;
int32 t;
};
struct line_data
{
line_vertex p[2];
bool PCD;
bool HSS;
uint16 color;
int32 ec_count;
uint32 (MDFN_FASTCALL *tffn)(uint32);
uint16 CLUT[0x10];
uint32 cb_or;
uint32 tex_base;
};
extern line_data LineSetup;
template<bool AA, bool die, unsigned bpp8, bool MSBOn, bool UserClipEn, bool UserClipMode, bool MeshEn, bool ECD, bool SPD, bool Textured, bool GouraudEn, bool HalfFGEn, bool HalfBGEn>
static int32 DrawLine(void)
{
const uint16 color = LineSetup.color;
line_vertex p0 = LineSetup.p[0];
line_vertex p1 = LineSetup.p[1];
int32 ret = 0;
if(!LineSetup.PCD)
{
// TODO:
// Plain clipping treats system clip X as an unsigned 10-bit quantity...
// Pre-clipping treats system clip X as a signed 13-bit quantity...
//
bool clipped = false;
bool swapped = false;
ret += 4;
if(UserClipEn)
{
if(UserClipMode)
{
// not correct: clipped |= (p0.x >= UserClipX0) & (p1.x <= UserClipX1) & (p0.y >= UserClipY0) & (p1.y <= UserClipY1);
clipped |= (p0.x < 0) & (p1.x < 0);
clipped |= (p0.x > SysClipX) & (p1.x > SysClipX);
clipped |= (p0.y < 0) & (p1.y < 0);
clipped |= (p0.y > SysClipY) & (p1.y > SysClipY);
swapped = (p0.y == p1.y) & ((p0.x < 0) | (p0.x > SysClipX));
}
else
{
// Ignore system clipping WRT pre-clip for UserClipEn == 1 && UserClipMode == 0
clipped |= (p0.x < UserClipX0) & (p1.x < UserClipX0);
clipped |= (p0.x > UserClipX1) & (p1.x > UserClipX1);
clipped |= (p0.y < UserClipY0) & (p1.y < UserClipY0);
clipped |= (p0.y > UserClipY1) & (p1.y > UserClipY1);
swapped = (p0.y == p1.y) & ((p0.x < UserClipX0) | (p0.x > UserClipX1));
}
}
else
{
clipped |= (p0.x < 0) & (p1.x < 0);
clipped |= (p0.x > SysClipX) & (p1.x > SysClipX);
clipped |= (p0.y < 0) & (p1.y < 0);
clipped |= (p0.y > SysClipY) & (p1.y > SysClipY);
swapped = (p0.y == p1.y) & ((p0.x < 0) | (p0.x > SysClipX));
}
if(clipped)
return ret;
if(swapped)
std::swap(p0, p1);
}
ret += 8;
//
//
const int32 dx = p1.x - p0.x;
const int32 dy = p1.y - p0.y;
const int32 abs_dx = abs(dx);
const int32 abs_dy = abs(dy);
const int32 max_adx_ady = std::max<int32>(abs_dx, abs_dy);
int32 x_inc = (dx >= 0) ? 1 : -1;
int32 y_inc = (dy >= 0) ? 1 : -1;
int32 x = p0.x;
int32 y = p0.y;
bool drawn_ac = true; // Drawn all-clipped
uint32 texel;
GourauderTheTerrible g;
VileTex t;
if(GouraudEn)
g.Setup(max_adx_ady + 1, p0.g, p1.g);
if(Textured)
{
LineSetup.ec_count = 2; // Call before tffn()
if(MDFN_UNLIKELY(max_adx_ady < abs(p1.t - p0.t) && LineSetup.HSS))
{
LineSetup.ec_count = 0x7FFFFFFF;
t.Setup(max_adx_ady + 1, p0.t >> 1, p1.t >> 1, 2, (bool)(FBCR & FBCR_EOS));
}
else
t.Setup(max_adx_ady + 1, p0.t, p1.t);
texel = LineSetup.tffn(t.Current());
}
#define PSTART \
bool transparent; \
uint16 pix; \
\
if(Textured) \
{ \
/*ret++;*/ \
while(t.IncPending()) \
{ \
int32 tx = t.DoPendingInc(); \
\
/*ret += (bool)t.IncPending();*/ \
\
texel = LineSetup.tffn(tx); \
\
if(!ECD && MDFN_UNLIKELY(LineSetup.ec_count <= 0)) \
return ret; \
} \
t.AddError(); \
\
transparent = (SPD && ECD) ? false : (texel >> 31); \
pix = texel; \
} \
else \
{ \
pix = color; \
transparent = !SPD; \
}
/* hmm, possible problem with AA and drawn_ac...*/
#define PBODY(px, py) \
{ \
bool clipped = ((uint32)px > (uint32)SysClipX) | ((uint32)py > (uint32)SysClipY); \
\
if(UserClipEn && !UserClipMode) \
clipped |= (px < UserClipX0) | (px > UserClipX1) | (py < UserClipY0) | (py > UserClipY1); \
\
if(MDFN_UNLIKELY((clipped ^ drawn_ac) & clipped)) \
return ret; \
\
drawn_ac &= clipped; \
\
if(UserClipEn && UserClipMode) \
clipped |= (px >= UserClipX0) & (px <= UserClipX1) & (py >= UserClipY0) & (py <= UserClipY1); \
\
ret += PlotPixel<die, bpp8, MSBOn, UserClipEn, UserClipMode, MeshEn, HalfFGEn, HalfBGEn>(px, py, pix, transparent | clipped, (GouraudEn ? &g : NULL)); \
}
#define PEND \
{ \
if(GouraudEn) \
g.Step(); \
}
if(abs_dy > abs_dx)
{
int32 error_inc = 2 * abs_dx;
int32 error_adj = -(2 * abs_dy);
int32 error = abs_dy - (2 * abs_dy + (dy >= 0 || AA));
y -= y_inc;
do
{
PSTART;
y += y_inc;
if(error >= 0)
{
if(AA)
{
int32 aa_x = x, aa_y = y;
if(y_inc < 0)
{
aa_x += (x_inc >> 31);
aa_y -= (x_inc >> 31);
}
else
{
aa_x -= (~x_inc >> 31);
aa_y += (~x_inc >> 31);
}
PBODY(aa_x, aa_y);
}
error += error_adj;
x += x_inc;
}
error += error_inc;
PBODY(x, y);
PEND;
} while(MDFN_LIKELY(y != p1.y));
}
else
{
int32 error_inc = 2 * abs_dy;
int32 error_adj = -(2 * abs_dx);
int32 error = abs_dx - (2 * abs_dx + (dx >= 0 || AA));
x -= x_inc;
do
{
PSTART;
x += x_inc;
if(error >= 0)
{
if(AA)
{
int32 aa_x = x, aa_y = y;
if(x_inc < 0)
{
aa_x -= (~y_inc >> 31);
aa_y -= (~y_inc >> 31);
}
else
{
aa_x += (y_inc >> 31);
aa_y += (y_inc >> 31);
}
PBODY(aa_x, aa_y);
}
error += error_adj;
y += y_inc;
}
error += error_inc;
PBODY(x, y);
PEND;
} while(MDFN_LIKELY(x != p1.x));
}
return ret;
}
template<bool gourauden>
struct EdgeStepper
{
INLINE void Setup(const line_vertex& p0, const line_vertex& p1, const int32 dmax)
{
int32 dx = p1.x - p0.x;
int32 dy = p1.y - p0.y;
int32 abs_dx = abs(dx);
int32 abs_dy = abs(dy);
int32 max_adxdy = std::max<int32>(abs_dx, abs_dy);
x = p0.x;
x_inc = (dx >= 0) ? 1 : -1;
x_error = ~(max_adxdy - (2 * max_adxdy + (dy >= 0)));
x_error_inc = 2 * abs_dx;
x_error_adj = 2 * max_adxdy;
y = p0.y;
y_inc = (dy >= 0) ? 1 : -1;
y_error = ~(max_adxdy - (2 * max_adxdy + (dx >= 0)));
y_error_inc = 2 * abs_dy;
y_error_adj = 2 * max_adxdy;
d_error = -dmax;
d_error_inc = 2 *max_adxdy;
d_error_adj = 2 * dmax;
if(gourauden)
g.Setup(max_adxdy + 1, p0.g, p1.g);
}
INLINE void GetVertex(line_vertex* p)
{
p->x = x;
p->y = y;
if(gourauden)
p->g = g.Current();
}
INLINE void Step(void)
{
uint32 mask;
d_error += d_error_inc;
if(d_error >= 0)
{
d_error -= d_error_adj;
x_error -= x_error_inc;
mask = (int32)x_error >> 31;
x += x_inc & mask;
x_error += x_error_adj & mask;
y_error -= y_error_inc;
mask = (int32)y_error >> 31;
y += y_inc & mask;
y_error += y_error_adj & mask;
if(gourauden)
g.Step();
}
}
int32 d_error, d_error_inc, d_error_adj;
int32 x, x_inc;
int32 x_error, x_error_inc, x_error_adj;
int32 y, y_inc;
int32 y_error, y_error_inc, y_error_adj;
GourauderTheTerrible g;
};
//
//
}
}
#endif

130
waterbox/ss/vdp1_line.cpp Normal file
View File

@ -0,0 +1,130 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1_line.cpp - VDP1 Line Drawing Commands Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "vdp1.h"
#include "vdp1_common.h"
namespace MDFN_IEN_SS
{
namespace VDP1
{
static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) =
{
#define LINEFN_BC(die, bpp8, b, c) \
DrawLine<false, die, bpp8, c == 0x8, (bool)(b & 0x10), (b & 0x10) && (b & 0x08), (bool)(b & 0x04), false/*b & 0x02*/, (bool)(b & 0x01), false, (bool)(c & 0x4), (bool)(c & 0x2), (bool)(c & 0x1)>
#define LINEFN_B(die, bpp8, b) \
{ \
LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \
LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \
LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \
}
#define LINEFN_BPP8(die, bpp8) \
{ \
LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \
LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \
LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \
LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \
\
LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \
LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \
LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \
LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \
}
{
LINEFN_BPP8(false, 0),
LINEFN_BPP8(false, 1),
LINEFN_BPP8(false, 2),
},
{
LINEFN_BPP8(true, 0),
LINEFN_BPP8(true, 1),
LINEFN_BPP8(true, 2),
}
#undef LINEFN_BPP8
#undef LINEFN_B
#undef LINEFN_BC
};
template<unsigned num_lines>
static INLINE int32 CMD_Line_Polyline_T(const uint16* cmd_data)
{
const uint16 mode = cmd_data[0x2];
int32 ret = 0;
//
//
bool SPD_Opaque = true; // Abusing the SPD bit passed to the line draw function to denote non-transparency when == 1, transparent when == 0.
LineSetup.tex_base = 0;
LineSetup.color = cmd_data[0x3];
LineSetup.PCD = mode & 0x800;
if(((mode >> 3) & 0x7) < 0x6)
SPD_Opaque = (int32)(TexFetchTab[(mode >> 3) & 0x1F](0xFFFFFFFF)) >= 0;
//
//
//
auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][((mode >> 6) & 0x1E) | SPD_Opaque /*(mode >> 6) & 0x1F*/][(mode & 0x8000) ? 8 : (mode & 0x7)];
CheckUndefClipping();
for(unsigned n = 0; n < num_lines; n++)
{
LineSetup.p[0].x = sign_x_to_s32(13, cmd_data[0x6 + (((n << 1) + 0) & 0x7)] & 0x1FFF) + LocalX;
LineSetup.p[0].y = sign_x_to_s32(13, cmd_data[0x7 + (((n << 1) + 0) & 0x7)] & 0x1FFF) + LocalY;
LineSetup.p[1].x = sign_x_to_s32(13, cmd_data[0x6 + (((n << 1) + 2) & 0x7)] & 0x1FFF) + LocalX;
LineSetup.p[1].y = sign_x_to_s32(13, cmd_data[0x7 + (((n << 1) + 2) & 0x7)] & 0x1FFF) + LocalY;
if(mode & 0x4) // Gouraud
{
const uint16* gtb = &VRAM[cmd_data[0xE] << 2];
ret += 2;
LineSetup.p[0].g = gtb[(n + 0) & 0x3];
LineSetup.p[1].g = gtb[(n + 1) & 0x3];
}
ret += fnptr();
}
return ret;
}
int32 CMD_Polyline(const uint16* cmd_data)
{
return CMD_Line_Polyline_T<4>(cmd_data);
}
int32 CMD_Line(const uint16* cmd_data)
{
return CMD_Line_Polyline_T<1>(cmd_data);
}
}
}

146
waterbox/ss/vdp1_poly.cpp Normal file
View File

@ -0,0 +1,146 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1_poly.cpp - VDP1 Polygon Drawing Commands Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "vdp1.h"
#include "vdp1_common.h"
namespace MDFN_IEN_SS
{
namespace VDP1
{
static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) =
{
#define LINEFN_BC(die, bpp8, b, c) \
DrawLine<true, die, bpp8, c == 0x8, (bool)(b & 0x10), (b & 0x10) && (b & 0x08), (bool)(b & 0x04), false/*b & 0x02*/, (bool)(b & 0x01), false, (bool)(c & 0x4), (bool)(c & 0x2), (bool)(c & 0x1)>
#define LINEFN_B(die, bpp8, b) \
{ \
LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \
LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \
LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \
}
#define LINEFN_BPP8(die, bpp8) \
{ \
LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \
LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \
LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \
LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \
\
LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \
LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \
LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \
LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \
}
{
LINEFN_BPP8(false, 0),
LINEFN_BPP8(false, 1),
LINEFN_BPP8(false, 2),
},
{
LINEFN_BPP8(true, 0),
LINEFN_BPP8(true, 1),
LINEFN_BPP8(true, 2),
}
#undef LINEFN_BPP8
#undef LINEFN_B
#undef LINEFN_BC
};
template<bool gourauden>
static INLINE int32 CMD_PolygonG_T(const uint16* cmd_data)
{
const uint16 mode = cmd_data[0x2];
line_vertex p[4];
int32 ret = 0;
//
//
bool SPD_Opaque = true; // Abusing the SPD bit passed to the line draw function to denote non-transparency when == 1, transparent when == 0.
LineSetup.tex_base = 0;
LineSetup.color = cmd_data[0x3];
LineSetup.PCD = mode & 0x800;
if(((mode >> 3) & 0x7) < 0x6)
SPD_Opaque = (int32)(TexFetchTab[(mode >> 3) & 0x1F](0xFFFFFFFF)) >= 0;
//
//
//
auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][((mode >> 6) & 0x1E) | SPD_Opaque /*(mode >> 6) & 0x1F*/][(mode & 0x8000) ? 8 : (mode & 0x7)];
CheckUndefClipping();
for(unsigned i = 0; i < 4; i++)
{
p[i].x = sign_x_to_s32(13, cmd_data[0x6 + (i << 1)]) + LocalX;
p[i].y = sign_x_to_s32(13, cmd_data[0x7 + (i << 1)]) + LocalY;
}
if(gourauden)
{
const uint16* gtb = &VRAM[cmd_data[0xE] << 2];
ret += 4;
for(unsigned i = 0; i < 4; i++)
p[i].g = gtb[i];
}
//
//
//
const int32 dmax = std::max<int32>(std::max<int32>(abs(p[3].x - p[0].x), abs(p[3].y - p[0].y)),
std::max<int32>(abs(p[2].x - p[1].x), abs(p[2].y - p[1].y)));
EdgeStepper<gourauden> e[2];
e[0].Setup(p[0], p[3], dmax);
e[1].Setup(p[1], p[2], dmax);
for(int32 i = 0; i <= dmax; i++)
{
e[0].GetVertex(&LineSetup.p[0]);
e[1].GetVertex(&LineSetup.p[1]);
//
//printf("%d:%d -> %d:%d\n", lp[0].x, lp[0].y, lp[1].x, lp[1].y);
ret += fnptr();
//
e[0].Step();
e[1].Step();
}
return ret;
}
int32 CMD_Polygon(const uint16* cmd_data)
{
if(cmd_data[0x2] & 0x4) // gouraud
return CMD_PolygonG_T<true>(cmd_data);
else
return CMD_PolygonG_T<false>(cmd_data);
}
}
}

319
waterbox/ss/vdp1_sprite.cpp Normal file
View File

@ -0,0 +1,319 @@
/******************************************************************************/
/* Mednafen Sega Saturn Emulation Module */
/******************************************************************************/
/* vdp1_sprite.cpp - VDP1 Sprite Drawing Commands Emulation
** Copyright (C) 2015-2016 Mednafen 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.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "ss.h"
#include "vdp1.h"
#include "vdp1_common.h"
//#pragma GCC optimize("Os,no-crossjumping")
namespace MDFN_IEN_SS
{
namespace VDP1
{
static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) =
{
#define LINEFN_BC(die, bpp8, b, c) \
DrawLine<true, die, bpp8, c == 0x8, (bool)(b & 0x10), (b & 0x10) && (b & 0x08), (bool)(b & 0x04), (bool)(b & 0x02), (bool)(b & 0x01), true, (bool)(c & 0x4), (!bpp8) && (c & 0x2), (bool)(c & 0x1)>
#define LINEFN_B(die, bpp8, b) \
{ \
LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \
LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \
LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \
}
#define LINEFN_BPP8(die, bpp8) \
{ \
LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \
LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \
LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \
LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \
\
LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \
LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \
LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \
LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \
}
{
LINEFN_BPP8(false, 0),
LINEFN_BPP8(false, 1),
LINEFN_BPP8(false, 2),
},
{
LINEFN_BPP8(true, 0),
LINEFN_BPP8(true, 1),
LINEFN_BPP8(true, 2),
}
#undef LINEFN_BPP8
#undef LINEFN_B
#undef LINEFN_BC
};
/*
Timing notes:
Timing is somewhat complex, and looks like the drawing of the lines of distorted sprites may be terminated
early in some conditions relating to clipping.
Drawing a 256x1 texture with a 255x1 rectangular distorted sprite takes about twice as much time(even with blending enabled, which is weird...) as drawing
it with a 256x1 or 257x1 rectangular distorted sprite.
*/
enum
{
FORMAT_NORMAL,
FORMAT_SCALED,
FORMAT_DISTORTED
};
template<unsigned format, bool gourauden>
static INLINE int32 SpriteBase(const uint16* cmd_data)
{
const unsigned dir = (cmd_data[0] >> 4) & 0x3;
const uint16 mode = cmd_data[0x2];
const unsigned cm = (mode >> 3) & 0x7;
const uint16 color = cmd_data[0x3];
const uint32 w = ((cmd_data[0x5] >> 8) & 0x3F) << 3;
const uint32 h = cmd_data[0x5] & 0xFF;
line_vertex p[4];
int32 ret = 0;
auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][(mode >> 6) & 0x1F][(mode & 0x8000) ? 8 : (mode & 0x7)];
LineSetup.color = cmd_data[0x3];
LineSetup.PCD = mode & 0x0800;
LineSetup.HSS = mode & 0x1000;
CheckUndefClipping();
// FIXME: precision is probably not totally right.
if(format == FORMAT_DISTORTED)
{
for(unsigned i = 0; i < 4; i++)
{
p[i].x = sign_x_to_s32(13, cmd_data[0x6 + (i << 1)]) + LocalX;
p[i].y = sign_x_to_s32(13, cmd_data[0x7 + (i << 1)]) + LocalY;
}
//printf("Hrm: %d:%d %d:%d %d:%d %d:%d\n", p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y, p[3].x, p[3].y);
}
else if(format == FORMAT_NORMAL)
{
p[0].x = sign_x_to_s32(13, cmd_data[0x6]) + LocalX;
p[0].y = sign_x_to_s32(13, cmd_data[0x7]) + LocalY;
p[1].x = p[0].x + (std::max<uint32>(w, 1) - 1);
p[1].y = p[0].y;
p[2].x = p[1].x;
p[2].y = p[0].y + (std::max<uint32>(h, 1) - 1);
p[3].x = p[0].x;
p[3].y = p[2].y;
}
else if(format == FORMAT_SCALED)
{
const unsigned zp = (cmd_data[0] >> 8) & 0xF;
{
int32 zp_x = sign_x_to_s32(13, cmd_data[0x6]);
int32 zp_y = sign_x_to_s32(13, cmd_data[0x7]);
int32 disp_w = sign_x_to_s32(13, cmd_data[0x8]);
int32 disp_h = sign_x_to_s32(13, cmd_data[0x9]);
int32 alt_x = sign_x_to_s32(13, cmd_data[0xA]);
int32 alt_y = sign_x_to_s32(13, cmd_data[0xB]);
for(unsigned i = 0; i < 4; i++)
{
p[i].x = zp_x;
p[i].y = zp_y;
}
switch(zp >> 2)
{
case 0x0:
p[2].y = alt_y;
p[3].y = alt_y;
break;
case 0x1:
p[2].y += disp_h;
p[3].y += disp_h;
break;
case 0x2:
p[0].y -= disp_h >> 1;
p[1].y -= disp_h >> 1;
p[2].y += (disp_h + 1) >> 1;
p[3].y += (disp_h + 1) >> 1;
break;
case 0x3:
p[0].y -= disp_h;
p[1].y -= disp_h;
break;
}
switch(zp & 0x3)
{
case 0x0:
p[1].x = alt_x;
p[2].x = alt_x;
break;
case 0x1:
p[1].x += disp_w;
p[2].x += disp_w;
break;
case 0x2:
p[0].x -= disp_w >> 1;
p[1].x += (disp_w + 1) >> 1;
p[2].x += (disp_w + 1) >> 1;
p[3].x -= disp_w >> 1;
break;
case 0x3:
p[0].x -= disp_w;
p[3].x -= disp_w;
break;
}
for(unsigned i = 0; i < 4; i++)
{
p[i].x += LocalX;
p[i].y += LocalY;
}
}
}
if(gourauden)
{
const uint16* gtb = &VRAM[cmd_data[0xE] << 2];
ret += 4;
for(unsigned i = 0; i < 4; i++)
p[i].g = gtb[i];
}
//
//
//
VileTex big_t;
int32 tex_base;
LineSetup.tffn = TexFetchTab[(mode >> 3) & 0x1F];
{
const bool h_inv = dir & 1;
LineSetup.p[0 ^ h_inv].t = 0;
LineSetup.p[1 ^ h_inv].t = w ? (w - 1) : 0;
}
switch(cm)
{
case 0: LineSetup.cb_or = color &~ 0xF;
break;
case 1:
for(unsigned i = 0; i < 16; i++)
LineSetup.CLUT[i] = VRAM[((color &~ 0x3) << 2) | i];
ret += 16;
break;
case 2: LineSetup.cb_or = color &~ 0x3F; break;
case 3: LineSetup.cb_or = color &~ 0x7F; break;
case 4: LineSetup.cb_or = color &~ 0xFF; break;
case 5: break;
case 6: break;
case 7: break;
}
//
//
//
const int32 dmax = std::max<int32>(std::max<int32>(abs(p[3].x - p[0].x), abs(p[3].y - p[0].y)),
std::max<int32>(abs(p[2].x - p[1].x), abs(p[2].y - p[1].y)));
EdgeStepper<gourauden> e[2];
e[0].Setup(p[0], p[3], dmax);
e[1].Setup(p[1], p[2], dmax);
tex_base = cmd_data[0x4] << 2;
if(cm == 5) // RGB
tex_base &= ~0x7;
{
const bool v_inv = dir & 2;
int32 tv[2];
tv[0 ^ v_inv] = 0;
tv[1 ^ v_inv] = h ? (h - 1) : 0;
big_t.Setup(dmax + 1, tv[0], tv[1], w >> spr_w_shift_tab[cm]);
}
for(int32 i = 0; i <= dmax; i++)
{
e[0].GetVertex(&LineSetup.p[0]);
e[1].GetVertex(&LineSetup.p[1]);
LineSetup.tex_base = tex_base + big_t.PreStep();
//
//printf("%d:%d -> %d:%d\n", lp[0].x, lp[0].y, lp[1].x, lp[1].y);
ret += fnptr();
//
e[0].Step();
e[1].Step();
}
return ret;
}
int32 CMD_DistortedSprite(const uint16* cmd_data)
{
if(cmd_data[0x2] & 0x4) // gouraud
return SpriteBase<FORMAT_DISTORTED, true>(cmd_data);
else
return SpriteBase<FORMAT_DISTORTED, false>(cmd_data);
}
int32 CMD_NormalSprite(const uint16* cmd_data)
{
if(cmd_data[0x2] & 0x4) // gouraud
return SpriteBase<FORMAT_NORMAL, true>(cmd_data);
else
return SpriteBase<FORMAT_NORMAL, false>(cmd_data);
}
int32 CMD_ScaledSprite(const uint16* cmd_data)
{
if(cmd_data[0x2] & 0x4) // gouraud
return SpriteBase<FORMAT_SCALED, true>(cmd_data);
else
return SpriteBase<FORMAT_SCALED, false>(cmd_data);
}
}
}

Some files were not shown because too many files have changed in this diff Show More